diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md
new file mode 100644
index 0000000000..a7371e02a6
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug-report.md
@@ -0,0 +1,43 @@
+---
+name: Bug report
+about: Create a report to help us fix issues.
+title: ''
+labels: 'Type: Bug'
+assignees: ''
+
+---
+
+
+
+**Application version**
+
+
+**Platform**
+
+
+**Printer**
+
+
+**Reproduction steps**
+
+
+**Actual results**
+
+
+**Expected results**
+
+
+**Additional information**
+
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000000..2a0a3e4e7b
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,22 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: 'Type: New Feature'
+assignees: ''
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+
+
+**Describe the solution you'd like**
+
+
+**Describe alternatives you've considered**
+
+
+**Affected users and/or printers**
+
+**Additional context**
+
diff --git a/.gitignore b/.gitignore
index 60b59e6829..eed686fda7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -35,7 +35,7 @@ cura.desktop
.pydevproject
.settings
-#Externally located plug-ins.
+#Externally located plug-ins commonly installed by our devs.
plugins/cura-big-flame-graph
plugins/cura-god-mode-plugin
plugins/cura-siemensnx-plugin
@@ -52,6 +52,7 @@ plugins/FlatProfileExporter
plugins/GodMode
plugins/OctoPrintPlugin
plugins/ProfileFlattener
+plugins/SettingsGuide
plugins/X3GWriter
#Build stuff
@@ -71,3 +72,7 @@ run.sh
.scannerwork/
CuraEngine
+/.coverage
+
+#Prevents import failures when plugin running tests
+plugins/__init__.py
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
new file mode 100644
index 0000000000..6c5bc61cbe
--- /dev/null
+++ b/.gitlab-ci.yml
@@ -0,0 +1,16 @@
+image: registry.gitlab.com/ultimaker/cura/cura-build-environment:centos7
+
+stages:
+ - build
+
+build and test linux:
+ stage: build
+ tags:
+ - cura
+ - docker
+ - linux
+ script:
+ - docker/build.sh
+ artifacts:
+ paths:
+ - build
diff --git a/CMakeLists.txt b/CMakeLists.txt
index be6c9d938e..b516de6b63 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")
@@ -21,13 +20,34 @@ set(CURA_APP_NAME "cura" CACHE STRING "Short name of Cura, used for configuratio
set(CURA_APP_DISPLAY_NAME "Ultimaker Cura" CACHE STRING "Display name of Cura")
set(CURA_VERSION "master" CACHE STRING "Version name of Cura")
set(CURA_BUILDTYPE "" CACHE STRING "Build type of Cura, eg. 'PPA'")
-set(CURA_SDK_VERSION "" CACHE STRING "SDK version of Cura")
set(CURA_CLOUD_API_ROOT "" CACHE STRING "Alternative Cura cloud API root")
set(CURA_CLOUD_API_VERSION "" CACHE STRING "Alternative Cura cloud API version")
+set(CURA_CLOUD_ACCOUNT_API_ROOT "" CACHE STRING "Alternative Cura cloud account 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 +60,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 +73,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 +98,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..b1d3e0ddc4 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 --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/cura.desktop.in b/cura.desktop.in
index b0195015a5..2502327203 100644
--- a/cura.desktop.in
+++ b/cura.desktop.in
@@ -13,6 +13,6 @@ TryExec=@CMAKE_INSTALL_FULL_BINDIR@/cura
Icon=cura-icon
Terminal=false
Type=Application
-MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;image/bmp;image/gif;image/jpeg;image/png;model/x3d+xml;text/x-gcode;
+MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;image/bmp;image/gif;image/jpeg;image/png;text/x-gcode;application/x-amf;application/x-ply;application/x-ctm;model/vnd.collada+xml;model/gltf-binary;model/gltf+json;model/vnd.collada+xml+zip;
Categories=Graphics;
Keywords=3D;Printing;Slicer;
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/ApplicationMetadata.py b/cura/ApplicationMetadata.py
index faa3364e08..eeb283a72b 100644
--- a/cura/ApplicationMetadata.py
+++ b/cura/ApplicationMetadata.py
@@ -9,7 +9,7 @@ DEFAULT_CURA_DISPLAY_NAME = "Ultimaker Cura"
DEFAULT_CURA_VERSION = "master"
DEFAULT_CURA_BUILD_TYPE = ""
DEFAULT_CURA_DEBUG_MODE = False
-DEFAULT_CURA_SDK_VERSION = "6.0.0"
+DEFAULT_CURA_SDK_VERSION = "6.2.0"
try:
from cura.CuraVersion import CuraAppName # type: ignore
@@ -42,9 +42,7 @@ try:
except ImportError:
CuraDebugMode = DEFAULT_CURA_DEBUG_MODE
-try:
- from cura.CuraVersion import CuraSDKVersion # type: ignore
- if CuraSDKVersion == "":
- CuraSDKVersion = DEFAULT_CURA_SDK_VERSION
-except ImportError:
- CuraSDKVersion = DEFAULT_CURA_SDK_VERSION
+# Each release has a fixed SDK version coupled with it. It doesn't make sense to make it configurable because, for
+# example Cura 3.2 with SDK version 6.1 will not work. So the SDK version is hard-coded here and left out of the
+# CuraVersion.py.in template.
+CuraSDKVersion = "6.2.0"
diff --git a/cura/Arranging/ShapeArray.py b/cura/Arranging/ShapeArray.py
index 64b78d6f17..403db5e706 100644
--- a/cura/Arranging/ShapeArray.py
+++ b/cura/Arranging/ShapeArray.py
@@ -1,12 +1,19 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
import numpy
import copy
+from typing import Optional, Tuple, TYPE_CHECKING
from UM.Math.Polygon import Polygon
+if TYPE_CHECKING:
+ from UM.Scene.SceneNode import SceneNode
+
## Polygon representation as an array for use with Arrange
class ShapeArray:
- def __init__(self, arr, offset_x, offset_y, scale = 1):
+ def __init__(self, arr: numpy.array, offset_x: float, offset_y: float, scale: float = 1) -> None:
self.arr = arr
self.offset_x = offset_x
self.offset_y = offset_y
@@ -16,7 +23,7 @@ class ShapeArray:
# \param vertices
# \param scale scale the coordinates
@classmethod
- def fromPolygon(cls, vertices, scale = 1):
+ def fromPolygon(cls, vertices: numpy.array, scale: float = 1) -> "ShapeArray":
# scale
vertices = vertices * scale
# flip y, x -> x, y
@@ -42,7 +49,7 @@ class ShapeArray:
# \param min_offset offset for the offset ShapeArray
# \param scale scale the coordinates
@classmethod
- def fromNode(cls, node, min_offset, scale = 0.5, include_children = False):
+ def fromNode(cls, node: "SceneNode", min_offset: float, scale: float = 0.5, include_children: bool = False) -> Tuple[Optional["ShapeArray"], Optional["ShapeArray"]]:
transform = node._transformation
transform_x = transform._data[0][3]
transform_y = transform._data[2][3]
@@ -88,14 +95,16 @@ class ShapeArray:
# \param shape numpy format shape, [x-size, y-size]
# \param vertices
@classmethod
- def arrayFromPolygon(cls, shape, vertices):
+ def arrayFromPolygon(cls, shape: Tuple[int, int], vertices: numpy.array) -> numpy.array:
base_array = numpy.zeros(shape, dtype = numpy.int32) # Initialize your array of zeros
fill = numpy.ones(base_array.shape) * True # Initialize boolean array defining shape fill
# Create check array for each edge segment, combine into fill array
for k in range(vertices.shape[0]):
- fill = numpy.all([fill, cls._check(vertices[k - 1], vertices[k], base_array)], axis=0)
+ check_array = cls._check(vertices[k - 1], vertices[k], base_array)
+ if check_array is not None:
+ fill = numpy.all([fill, check_array], axis=0)
# Set all values inside polygon to one
base_array[fill] = 1
@@ -111,9 +120,9 @@ class ShapeArray:
# \param p2 2-tuple with x, y for point 2
# \param base_array boolean array to project the line on
@classmethod
- def _check(cls, p1, p2, base_array):
+ def _check(cls, p1: numpy.array, p2: numpy.array, base_array: numpy.array) -> Optional[numpy.array]:
if p1[0] == p2[0] and p1[1] == p2[1]:
- return
+ return None
idxs = numpy.indices(base_array.shape) # Create 3D array of indices
p1 = p1.astype(float)
@@ -131,5 +140,4 @@ class ShapeArray:
max_col_idx = (idxs[0] - p1[0]) / (p2[0] - p1[0]) * (p2[1] - p1[1]) + p1[1]
sign = numpy.sign(p2[0] - p1[0])
- return idxs[1] * sign <= max_col_idx * sign
-
+ return idxs[1] * sign <= max_col_idx * sign
\ No newline at end of file
diff --git a/cura/AutoSave.py b/cura/AutoSave.py
index 1639868d6a..3b42fdafdf 100644
--- a/cura/AutoSave.py
+++ b/cura/AutoSave.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2016 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from PyQt5.QtCore import QTimer
@@ -16,9 +16,10 @@ class AutoSave:
self._application.getPreferences().addPreference("cura/autosave_delay", 1000 * 10)
self._change_timer = QTimer()
- self._change_timer.setInterval(self._application.getPreferences().getValue("cura/autosave_delay"))
+ self._change_timer.setInterval(int(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..9ccdcaf64d 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()
@@ -147,5 +148,9 @@ class Backup:
Logger.log("d", "Removing current data in location: %s", target_path)
Resources.factoryReset()
Logger.log("d", "Extracting backup to location: %s", target_path)
- archive.extractall(target_path)
+ try:
+ archive.extractall(target_path)
+ except PermissionError:
+ Logger.logException("e", "Unable to extract the backup due to permission errors")
+ return False
return True
diff --git a/cura/Backups/BackupsManager.py b/cura/Backups/BackupsManager.py
index a0d3881209..ba6fcab8d7 100644
--- a/cura/Backups/BackupsManager.py
+++ b/cura/Backups/BackupsManager.py
@@ -51,8 +51,18 @@ 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)
+ auto_save = self._application.getAutoSave()
+ # The auto save is only not created if the application has not yet started.
+ if auto_save:
+ auto_save.setEnabled(False)
+ else:
+ Logger.log("e", "Unable to disable the autosave as application init has not been completed")
## Re-enable auto-save after we're done.
def _enableAutoSave(self) -> None:
- self._application.setSaveDataEnabled(True)
+ auto_save = self._application.getAutoSave()
+ # The auto save is only not created if the application has not yet started.
+ if auto_save:
+ auto_save.setEnabled(True)
+ else:
+ Logger.log("e", "Unable to enable the autosave as application init has not been completed")
diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py
index f8f691a850..17b28c12c8 100755
--- a/cura/BuildVolume.py
+++ b/cura/BuildVolume.py
@@ -1,6 +1,6 @@
-# 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.Scene.Camera import Camera
+from UM.Mesh.MeshData import MeshData
from cura.Scene.CuraSceneNode import CuraSceneNode
from cura.Settings.ExtruderManager import ExtruderManager
from UM.Application import Application #To modify the maximum zoom level.
@@ -20,13 +20,20 @@ from UM.Signal import Signal
from PyQt5.QtCore import QTimer
from UM.View.RenderBatch import RenderBatch
from UM.View.GL.OpenGL import OpenGL
+from cura.Settings.GlobalStack import GlobalStack
+
catalog = i18nCatalog("cura")
import numpy
import math
import copy
-from typing import List, Optional
+from typing import List, Optional, TYPE_CHECKING, Any, Set, cast, Iterable, Dict
+
+if TYPE_CHECKING:
+ from cura.CuraApplication import CuraApplication
+ from cura.Settings.ExtruderStack import ExtruderStack
+ from UM.Settings.ContainerStack import ContainerStack
# Radius of disallowed area in mm around prime. I.e. how much distance to keep from prime position.
PRIME_CLEARANCE = 6.5
@@ -36,45 +43,47 @@ PRIME_CLEARANCE = 6.5
class BuildVolume(SceneNode):
raftThicknessChanged = Signal()
- def __init__(self, application, parent = None):
+ def __init__(self, application: "CuraApplication", parent: Optional[SceneNode] = None) -> None:
super().__init__(parent)
self._application = application
self._machine_manager = self._application.getMachineManager()
- self._volume_outline_color = None
- self._x_axis_color = None
- self._y_axis_color = None
- self._z_axis_color = None
- self._disallowed_area_color = None
- self._error_area_color = None
+ self._volume_outline_color = None # type: Optional[Color]
+ self._x_axis_color = None # type: Optional[Color]
+ self._y_axis_color = None # type: Optional[Color]
+ self._z_axis_color = None # type: Optional[Color]
+ self._disallowed_area_color = None # type: Optional[Color]
+ self._error_area_color = None # type: Optional[Color]
- self._width = 0 #type: float
- self._height = 0 #type: float
- self._depth = 0 #type: float
- self._shape = "" #type: str
+ self._width = 0 # type: float
+ self._height = 0 # type: float
+ self._depth = 0 # type: float
+ self._shape = "" # type: str
self._shader = None
- self._origin_mesh = None
+ self._origin_mesh = None # type: Optional[MeshData]
self._origin_line_length = 20
- self._origin_line_width = 0.5
+ self._origin_line_width = 1.5
+ self._enabled = False
- self._grid_mesh = None
+ self._grid_mesh = None # type: Optional[MeshData]
self._grid_shader = None
- self._disallowed_areas = []
- self._disallowed_areas_no_brim = []
- self._disallowed_area_mesh = None
+ self._disallowed_areas = [] # type: List[Polygon]
+ self._disallowed_areas_no_brim = [] # type: List[Polygon]
+ self._disallowed_area_mesh = None # type: Optional[MeshData]
+ self._disallowed_area_size = 0.
- self._error_areas = []
- self._error_mesh = None
+ self._error_areas = [] # type: List[Polygon]
+ self._error_mesh = None # type: Optional[MeshData]
self.setCalculateBoundingBox(False)
- self._volume_aabb = None
+ self._volume_aabb = None # type: Optional[AxisAlignedBox]
self._raft_thickness = 0.0
self._extra_z_clearance = 0.0
- self._adhesion_type = None
+ self._adhesion_type = None # type: Any
self._platform = Platform(self)
self._build_volume_message = Message(catalog.i18nc("@info:status",
@@ -82,7 +91,7 @@ class BuildVolume(SceneNode):
" \"Print Sequence\" setting to prevent the gantry from colliding"
" with printed models."), title = catalog.i18nc("@info:title", "Build Volume"))
- self._global_container_stack = None
+ self._global_container_stack = None # type: Optional[GlobalStack]
self._stack_change_timer = QTimer()
self._stack_change_timer.setInterval(100)
@@ -100,7 +109,7 @@ class BuildVolume(SceneNode):
self._application.getController().getScene().sceneChanged.connect(self._onSceneChanged)
#Objects loaded at the moment. We are connected to the property changed events of these objects.
- self._scene_objects = set()
+ self._scene_objects = set() # type: Set[SceneNode]
self._scene_change_timer = QTimer()
self._scene_change_timer.setInterval(100)
@@ -124,8 +133,8 @@ class BuildVolume(SceneNode):
# Enable and disable extruder
self._machine_manager.extruderChanged.connect(self.updateNodeBoundaryCheck)
- # list of settings which were updated
- self._changed_settings_since_last_rebuild = []
+ # List of settings which were updated
+ self._changed_settings_since_last_rebuild = [] # type: List[str]
def _onSceneChanged(self, source):
if self._global_container_stack:
@@ -165,16 +174,13 @@ class BuildVolume(SceneNode):
active_extruder_changed.connect(self._updateDisallowedAreasAndRebuild)
def setWidth(self, width: float) -> None:
- if width is not None:
- self._width = width
+ self._width = width
def setHeight(self, height: float) -> None:
- if height is not None:
- self._height = height
+ self._height = height
def setDepth(self, depth: float) -> None:
- if depth is not None:
- self._depth = depth
+ self._depth = depth
def setShape(self, shape: str) -> None:
if shape:
@@ -222,13 +228,18 @@ class BuildVolume(SceneNode):
## For every sliceable node, update node._outside_buildarea
#
def updateNodeBoundaryCheck(self):
+ if not self._global_container_stack:
+ return
+
root = self._application.getController().getScene().getRoot()
- nodes = list(BreadthFirstIterator(root))
- group_nodes = []
+ nodes = cast(List[SceneNode], list(cast(Iterable, BreadthFirstIterator(root))))
+ group_nodes = [] # type: List[SceneNode]
build_volume_bounding_box = self.getBoundingBox()
if build_volume_bounding_box:
# It's over 9000!
+ # We set this to a very low number, as we do allow models to intersect the build plate.
+ # This means the model gets cut off at the build plate.
build_volume_bounding_box = build_volume_bounding_box.set(bottom=-9001)
else:
# No bounding box. This is triggered when running Cura from command line with a model for the first time
@@ -241,14 +252,21 @@ class BuildVolume(SceneNode):
group_nodes.append(node) # Keep list of affected group_nodes
if node.callDecoration("isSliceable") or node.callDecoration("isGroup"):
+ if not isinstance(node, CuraSceneNode):
+ continue
+
if node.collidesWithBbox(build_volume_bounding_box):
node.setOutsideBuildArea(True)
continue
- if node.collidesWithArea(self.getDisallowedAreas()):
+ if node.collidesWithAreas(self.getDisallowedAreas()):
+ node.setOutsideBuildArea(True)
+ continue
+ # If the entire node is below the build plate, still mark it as outside.
+ node_bounding_box = node.getBoundingBox()
+ if node_bounding_box and node_bounding_box.top < 0:
node.setOutsideBuildArea(True)
continue
-
# Mark the node as outside build volume if the set extruder is disabled
extruder_position = node.callDecoration("getActiveExtruderPosition")
if extruder_position not in self._global_container_stack.extruders:
@@ -274,8 +292,8 @@ class BuildVolume(SceneNode):
child_node.setOutsideBuildArea(group_node.isOutsideBuildArea())
## Update the outsideBuildArea of a single node, given bounds or current build volume
- def checkBoundsAndUpdate(self, node: CuraSceneNode, bounds: Optional[AxisAlignedBox] = None):
- if not isinstance(node, CuraSceneNode):
+ def checkBoundsAndUpdate(self, node: CuraSceneNode, bounds: Optional[AxisAlignedBox] = None) -> None:
+ if not isinstance(node, CuraSceneNode) or self._global_container_stack is None:
return
if bounds is None:
@@ -295,7 +313,7 @@ class BuildVolume(SceneNode):
node.setOutsideBuildArea(True)
return
- if node.collidesWithArea(self.getDisallowedAreas()):
+ if node.collidesWithAreas(self.getDisallowedAreas()):
node.setOutsideBuildArea(True)
return
@@ -307,32 +325,43 @@ class BuildVolume(SceneNode):
node.setOutsideBuildArea(False)
- ## Recalculates the build volume & disallowed areas.
- def rebuild(self):
- if not self._width or not self._height or not self._depth:
- return
+ def _buildGridMesh(self, min_w: float, max_w: float, min_h: float, max_h: float, min_d: float, max_d:float, z_fight_distance: float) -> MeshData:
+ mb = MeshBuilder()
+ if self._shape != "elliptic":
+ # Build plate grid mesh
+ mb.addQuad(
+ Vector(min_w, min_h - z_fight_distance, min_d),
+ Vector(max_w, min_h - z_fight_distance, min_d),
+ Vector(max_w, min_h - z_fight_distance, max_d),
+ Vector(min_w, min_h - z_fight_distance, max_d)
+ )
- if not self._engine_ready:
- return
+ for n in range(0, 6):
+ v = mb.getVertex(n)
+ mb.setVertexUVCoordinates(n, v[0], v[2])
+ return mb.build()
+ else:
+ aspect = 1.0
+ scale_matrix = Matrix()
+ if self._width != 0:
+ # Scale circular meshes by aspect ratio if width != height
+ aspect = self._depth / self._width
+ scale_matrix.compose(scale=Vector(1, 1, aspect))
+ mb.addVertex(0, min_h - z_fight_distance, 0)
+ mb.addArc(max_w, Vector.Unit_Y, center=Vector(0, min_h - z_fight_distance, 0))
+ sections = mb.getVertexCount() - 1 # Center point is not an arc section
+ indices = []
+ for n in range(0, sections - 1):
+ indices.append([0, n + 2, n + 1])
+ mb.addIndices(numpy.asarray(indices, dtype=numpy.int32))
+ mb.calculateNormals()
- if not self._volume_outline_color:
- theme = self._application.getTheme()
- self._volume_outline_color = Color(*theme.getColor("volume_outline").getRgb())
- self._x_axis_color = Color(*theme.getColor("x_axis").getRgb())
- self._y_axis_color = Color(*theme.getColor("y_axis").getRgb())
- self._z_axis_color = Color(*theme.getColor("z_axis").getRgb())
- self._disallowed_area_color = Color(*theme.getColor("disallowed_area").getRgb())
- self._error_area_color = Color(*theme.getColor("error_area").getRgb())
-
- min_w = -self._width / 2
- max_w = self._width / 2
- min_h = 0.0
- max_h = self._height
- min_d = -self._depth / 2
- max_d = self._depth / 2
-
- z_fight_distance = 0.2 # Distance between buildplate and disallowed area meshes to prevent z-fighting
+ for n in range(0, mb.getVertexCount()):
+ v = mb.getVertex(n)
+ mb.setVertexUVCoordinates(n, v[0], v[2] * aspect)
+ return mb.build().getTransformed(scale_matrix)
+ def _buildMesh(self, min_w: float, max_w: float, min_h: float, max_h: float, min_d: float, max_d:float, z_fight_distance: float) -> MeshData:
if self._shape != "elliptic":
# Outline 'cube' of the build volume
mb = MeshBuilder()
@@ -351,25 +380,10 @@ class BuildVolume(SceneNode):
mb.addLine(Vector(min_w, max_h, min_d), Vector(min_w, max_h, max_d), color = self._volume_outline_color)
mb.addLine(Vector(max_w, max_h, min_d), Vector(max_w, max_h, max_d), color = self._volume_outline_color)
- self.setMeshData(mb.build())
-
- # Build plate grid mesh
- mb = MeshBuilder()
- mb.addQuad(
- Vector(min_w, min_h - z_fight_distance, min_d),
- Vector(max_w, min_h - z_fight_distance, min_d),
- Vector(max_w, min_h - z_fight_distance, max_d),
- Vector(min_w, min_h - z_fight_distance, max_d)
- )
-
- for n in range(0, 6):
- v = mb.getVertex(n)
- mb.setVertexUVCoordinates(n, v[0], v[2])
- self._grid_mesh = mb.build()
+ return mb.build()
else:
# Bottom and top 'ellipse' of the build volume
- aspect = 1.0
scale_matrix = Matrix()
if self._width != 0:
# Scale circular meshes by aspect ratio if width != height
@@ -378,23 +392,119 @@ class BuildVolume(SceneNode):
mb = MeshBuilder()
mb.addArc(max_w, Vector.Unit_Y, center = (0, min_h - z_fight_distance, 0), color = self._volume_outline_color)
mb.addArc(max_w, Vector.Unit_Y, center = (0, max_h, 0), color = self._volume_outline_color)
- self.setMeshData(mb.build().getTransformed(scale_matrix))
+ return mb.build().getTransformed(scale_matrix)
- # Build plate grid mesh
- mb = MeshBuilder()
- mb.addVertex(0, min_h - z_fight_distance, 0)
- mb.addArc(max_w, Vector.Unit_Y, center = Vector(0, min_h - z_fight_distance, 0))
- sections = mb.getVertexCount() - 1 # Center point is not an arc section
- indices = []
- for n in range(0, sections - 1):
- indices.append([0, n + 2, n + 1])
- mb.addIndices(numpy.asarray(indices, dtype = numpy.int32))
- mb.calculateNormals()
+ def _buildOriginMesh(self, origin: Vector) -> MeshData:
+ mb = MeshBuilder()
+ mb.addCube(
+ width=self._origin_line_length,
+ height=self._origin_line_width,
+ depth=self._origin_line_width,
+ center=origin + Vector(self._origin_line_length / 2, 0, 0),
+ color=self._x_axis_color
+ )
+ mb.addCube(
+ width=self._origin_line_width,
+ height=self._origin_line_length,
+ depth=self._origin_line_width,
+ center=origin + Vector(0, self._origin_line_length / 2, 0),
+ color=self._y_axis_color
+ )
+ mb.addCube(
+ width=self._origin_line_width,
+ height=self._origin_line_width,
+ depth=self._origin_line_length,
+ center=origin - Vector(0, 0, self._origin_line_length / 2),
+ color=self._z_axis_color
+ )
+ return mb.build()
- for n in range(0, mb.getVertexCount()):
- v = mb.getVertex(n)
- mb.setVertexUVCoordinates(n, v[0], v[2] * aspect)
- self._grid_mesh = mb.build().getTransformed(scale_matrix)
+ def _updateColors(self):
+ theme = self._application.getTheme()
+ if theme is None:
+ return
+ self._volume_outline_color = Color(*theme.getColor("volume_outline").getRgb())
+ self._x_axis_color = Color(*theme.getColor("x_axis").getRgb())
+ self._y_axis_color = Color(*theme.getColor("y_axis").getRgb())
+ self._z_axis_color = Color(*theme.getColor("z_axis").getRgb())
+ self._disallowed_area_color = Color(*theme.getColor("disallowed_area").getRgb())
+ self._error_area_color = Color(*theme.getColor("error_area").getRgb())
+
+ def _buildErrorMesh(self, min_w: float, max_w: float, min_h: float, max_h: float, min_d: float, max_d: float, disallowed_area_height: float) -> Optional[MeshData]:
+ if not self._error_areas:
+ return None
+ mb = MeshBuilder()
+ for error_area in self._error_areas:
+ color = self._error_area_color
+ points = error_area.getPoints()
+ first = Vector(self._clamp(points[0][0], min_w, max_w), disallowed_area_height,
+ self._clamp(points[0][1], min_d, max_d))
+ previous_point = Vector(self._clamp(points[0][0], min_w, max_w), disallowed_area_height,
+ self._clamp(points[0][1], min_d, max_d))
+ for point in points:
+ new_point = Vector(self._clamp(point[0], min_w, max_w), disallowed_area_height,
+ self._clamp(point[1], min_d, max_d))
+ mb.addFace(first, previous_point, new_point, color=color)
+ previous_point = new_point
+ return mb.build()
+
+ def _buildDisallowedAreaMesh(self, min_w: float, max_w: float, min_h: float, max_h: float, min_d: float, max_d: float, disallowed_area_height: float) -> Optional[MeshData]:
+ if not self._disallowed_areas:
+ return None
+
+ mb = MeshBuilder()
+ color = self._disallowed_area_color
+ for polygon in self._disallowed_areas:
+ points = polygon.getPoints()
+ if len(points) == 0:
+ continue
+
+ first = Vector(self._clamp(points[0][0], min_w, max_w), disallowed_area_height,
+ self._clamp(points[0][1], min_d, max_d))
+ previous_point = Vector(self._clamp(points[0][0], min_w, max_w), disallowed_area_height,
+ self._clamp(points[0][1], min_d, max_d))
+ for point in points:
+ new_point = Vector(self._clamp(point[0], min_w, max_w), disallowed_area_height,
+ self._clamp(point[1], min_d, max_d))
+ mb.addFace(first, previous_point, new_point, color=color)
+ previous_point = new_point
+
+ # Find the largest disallowed area to exclude it from the maximum scale bounds.
+ # This is a very nasty hack. This pretty much only works for UM machines.
+ # This disallowed area_size needs a -lot- of rework at some point in the future: TODO
+ if numpy.min(points[:,
+ 1]) >= 0: # This filters out all areas that have points to the left of the centre. This is done to filter the skirt area.
+ size = abs(numpy.max(points[:, 1]) - numpy.min(points[:, 1]))
+ else:
+ size = 0
+ self._disallowed_area_size = max(size, self._disallowed_area_size)
+ return mb.build()
+
+ ## Recalculates the build volume & disallowed areas.
+ def rebuild(self) -> None:
+ if not self._width or not self._height or not self._depth:
+ return
+
+ if not self._engine_ready:
+ return
+
+ if not self._global_container_stack:
+ return
+
+ if not self._volume_outline_color:
+ self._updateColors()
+
+ min_w = -self._width / 2
+ max_w = self._width / 2
+ min_h = 0.0
+ max_h = self._height
+ min_d = -self._depth / 2
+ max_d = self._depth / 2
+
+ z_fight_distance = 0.2 # Distance between buildplate and disallowed area meshes to prevent z-fighting
+
+ self._grid_mesh = self._buildGridMesh(min_w, max_w, min_h, max_h, min_d, max_d, z_fight_distance)
+ self.setMeshData(self._buildMesh(min_w, max_w, min_h, max_h, min_d, max_d, z_fight_distance))
# Indication of the machine origin
if self._global_container_stack.getProperty("machine_center_is_zero", "value"):
@@ -402,77 +512,13 @@ class BuildVolume(SceneNode):
else:
origin = Vector(min_w, min_h, max_d)
- mb = MeshBuilder()
- mb.addCube(
- width = self._origin_line_length,
- height = self._origin_line_width,
- depth = self._origin_line_width,
- center = origin + Vector(self._origin_line_length / 2, 0, 0),
- color = self._x_axis_color
- )
- mb.addCube(
- width = self._origin_line_width,
- height = self._origin_line_length,
- depth = self._origin_line_width,
- center = origin + Vector(0, self._origin_line_length / 2, 0),
- color = self._y_axis_color
- )
- mb.addCube(
- width = self._origin_line_width,
- height = self._origin_line_width,
- depth = self._origin_line_length,
- center = origin - Vector(0, 0, self._origin_line_length / 2),
- color = self._z_axis_color
- )
- self._origin_mesh = mb.build()
+ self._origin_mesh = self._buildOriginMesh(origin)
disallowed_area_height = 0.1
- disallowed_area_size = 0
- if self._disallowed_areas:
- mb = MeshBuilder()
- color = self._disallowed_area_color
- for polygon in self._disallowed_areas:
- points = polygon.getPoints()
- if len(points) == 0:
- continue
+ self._disallowed_area_size = 0.
+ self._disallowed_area_mesh = self._buildDisallowedAreaMesh(min_w, max_w, min_h, max_h, min_d, max_d, disallowed_area_height)
- first = Vector(self._clamp(points[0][0], min_w, max_w), disallowed_area_height, self._clamp(points[0][1], min_d, max_d))
- previous_point = Vector(self._clamp(points[0][0], min_w, max_w), disallowed_area_height, self._clamp(points[0][1], min_d, max_d))
- for point in points:
- new_point = Vector(self._clamp(point[0], min_w, max_w), disallowed_area_height, self._clamp(point[1], min_d, max_d))
- mb.addFace(first, previous_point, new_point, color = color)
- previous_point = new_point
-
- # Find the largest disallowed area to exclude it from the maximum scale bounds.
- # This is a very nasty hack. This pretty much only works for UM machines.
- # This disallowed area_size needs a -lot- of rework at some point in the future: TODO
- if numpy.min(points[:, 1]) >= 0: # This filters out all areas that have points to the left of the centre. This is done to filter the skirt area.
- size = abs(numpy.max(points[:, 1]) - numpy.min(points[:, 1]))
- else:
- size = 0
- disallowed_area_size = max(size, disallowed_area_size)
-
- self._disallowed_area_mesh = mb.build()
- else:
- self._disallowed_area_mesh = None
-
- if self._error_areas:
- mb = MeshBuilder()
- for error_area in self._error_areas:
- color = self._error_area_color
- points = error_area.getPoints()
- first = Vector(self._clamp(points[0][0], min_w, max_w), disallowed_area_height,
- self._clamp(points[0][1], min_d, max_d))
- previous_point = Vector(self._clamp(points[0][0], min_w, max_w), disallowed_area_height,
- self._clamp(points[0][1], min_d, max_d))
- for point in points:
- new_point = Vector(self._clamp(point[0], min_w, max_w), disallowed_area_height,
- self._clamp(point[1], min_d, max_d))
- mb.addFace(first, previous_point, new_point, color=color)
- previous_point = new_point
- self._error_mesh = mb.build()
- else:
- self._error_mesh = None
+ self._error_mesh = self._buildErrorMesh(min_w, max_w, min_h, max_h, min_d, max_d, disallowed_area_height)
self._volume_aabb = AxisAlignedBox(
minimum = Vector(min_w, min_h - 1.0, min_d),
@@ -484,21 +530,24 @@ class BuildVolume(SceneNode):
# This is probably wrong in all other cases. TODO!
# The +1 and -1 is added as there is always a bit of extra room required to work properly.
scale_to_max_bounds = AxisAlignedBox(
- minimum = Vector(min_w + bed_adhesion_size + 1, min_h, min_d + disallowed_area_size - bed_adhesion_size + 1),
- maximum = Vector(max_w - bed_adhesion_size - 1, max_h - self._raft_thickness - self._extra_z_clearance, max_d - disallowed_area_size + bed_adhesion_size - 1)
+ minimum = Vector(min_w + bed_adhesion_size + 1, min_h, min_d + self._disallowed_area_size - bed_adhesion_size + 1),
+ maximum = Vector(max_w - bed_adhesion_size - 1, max_h - self._raft_thickness - self._extra_z_clearance, max_d - self._disallowed_area_size + bed_adhesion_size - 1)
)
- self._application.getController().getScene()._maximum_bounds = scale_to_max_bounds
+ self._application.getController().getScene()._maximum_bounds = scale_to_max_bounds # type: ignore
self.updateNodeBoundaryCheck()
- def getBoundingBox(self) -> AxisAlignedBox:
+ def getBoundingBox(self):
return self._volume_aabb
def getRaftThickness(self) -> float:
return self._raft_thickness
- def _updateRaftThickness(self):
+ def _updateRaftThickness(self) -> None:
+ if not self._global_container_stack:
+ return
+
old_raft_thickness = self._raft_thickness
if self._global_container_stack.extruders:
# This might be called before the extruder stacks have initialised, in which case getting the adhesion_type fails
@@ -509,7 +558,7 @@ class BuildVolume(SceneNode):
self._global_container_stack.getProperty("raft_base_thickness", "value") +
self._global_container_stack.getProperty("raft_interface_thickness", "value") +
self._global_container_stack.getProperty("raft_surface_layers", "value") *
- self._global_container_stack.getProperty("raft_surface_thickness", "value") +
+ self._global_container_stack.getProperty("raft_surface_thickness", "value") +
self._global_container_stack.getProperty("raft_airgap", "value") -
self._global_container_stack.getProperty("layer_0_z_overlap", "value"))
@@ -518,28 +567,23 @@ class BuildVolume(SceneNode):
self.setPosition(Vector(0, -self._raft_thickness, 0), SceneNode.TransformSpace.World)
self.raftThicknessChanged.emit()
- def _updateExtraZClearance(self) -> None:
+ def _calculateExtraZClearance(self, extruders: List["ContainerStack"]) -> float:
+ if not self._global_container_stack:
+ return 0
+
extra_z = 0.0
- extruders = ExtruderManager.getInstance().getUsedExtruderStacks()
- use_extruders = False
for extruder in extruders:
if extruder.getProperty("retraction_hop_enabled", "value"):
retraction_hop = extruder.getProperty("retraction_hop", "value")
if extra_z is None or retraction_hop > extra_z:
extra_z = retraction_hop
- use_extruders = True
- if not use_extruders:
- # If no extruders, take global value.
- if self._global_container_stack.getProperty("retraction_hop_enabled", "value"):
- extra_z = self._global_container_stack.getProperty("retraction_hop", "value")
- if extra_z != self._extra_z_clearance:
- self._extra_z_clearance = extra_z
+ return extra_z
def _onStackChanged(self):
self._stack_change_timer.start()
## Update the build volume visualization
- def _onStackChangeTimerFinished(self):
+ def _onStackChangeTimerFinished(self) -> None:
if self._global_container_stack:
self._global_container_stack.propertyChanged.disconnect(self._onSettingPropertyChanged)
extruders = ExtruderManager.getInstance().getActiveExtruderStacks()
@@ -570,7 +614,7 @@ class BuildVolume(SceneNode):
self._updateDisallowedAreas()
self._updateRaftThickness()
- self._updateExtraZClearance()
+ self._extra_z_clearance = self._calculateExtraZClearance(ExtruderManager.getInstance().getUsedExtruderStacks())
if self._engine_ready:
self.rebuild()
@@ -579,20 +623,23 @@ class BuildVolume(SceneNode):
if camera:
diagonal = self.getDiagonalSize()
if diagonal > 1:
- camera.setZoomRange(min = 0.1, max = diagonal * 5) #You can zoom out up to 5 times the diagonal. This gives some space around the volume.
+ # You can zoom out up to 5 times the diagonal. This gives some space around the volume.
+ camera.setZoomRange(min = 0.1, max = diagonal * 5) # type: ignore
- def _onEngineCreated(self):
+ def _onEngineCreated(self) -> None:
self._engine_ready = True
self.rebuild()
- def _onSettingChangeTimerFinished(self):
+ def _onSettingChangeTimerFinished(self) -> None:
+ if not self._global_container_stack:
+ return
+
rebuild_me = False
update_disallowed_areas = False
update_raft_thickness = False
update_extra_z_clearance = True
for setting_key in self._changed_settings_since_last_rebuild:
-
if setting_key == "print_sequence":
machine_height = self._global_container_stack.getProperty("machine_height", "value")
if self._application.getGlobalContainerStack().getProperty("print_sequence", "value") == "one_at_a_time" and len(self._scene_objects) > 1:
@@ -605,33 +652,26 @@ class BuildVolume(SceneNode):
self._height = self._global_container_stack.getProperty("machine_height", "value")
self._build_volume_message.hide()
update_disallowed_areas = True
- rebuild_me = True
# sometimes the machine size or shape settings are adjusted on the active machine, we should reflect this
if setting_key in self._machine_settings:
- self._height = self._global_container_stack.getProperty("machine_height", "value")
- self._width = self._global_container_stack.getProperty("machine_width", "value")
- self._depth = self._global_container_stack.getProperty("machine_depth", "value")
- self._shape = self._global_container_stack.getProperty("machine_shape", "value")
+ self._updateMachineSizeProperties()
update_extra_z_clearance = True
update_disallowed_areas = True
- rebuild_me = True
- if setting_key in self._skirt_settings + self._prime_settings + self._tower_settings + self._ooze_shield_settings + self._distance_settings + self._extruder_settings:
+ if setting_key in self._disallowed_area_settings:
update_disallowed_areas = True
- rebuild_me = True
if setting_key in self._raft_settings:
update_raft_thickness = True
- rebuild_me = True
if setting_key in self._extra_z_settings:
update_extra_z_clearance = True
- rebuild_me = True
if setting_key in self._limit_to_extruder_settings:
update_disallowed_areas = True
- rebuild_me = True
+
+ rebuild_me = update_extra_z_clearance or update_disallowed_areas or update_raft_thickness
# We only want to update all of them once.
if update_disallowed_areas:
@@ -641,7 +681,7 @@ class BuildVolume(SceneNode):
self._updateRaftThickness()
if update_extra_z_clearance:
- self._updateExtraZClearance()
+ self._extra_z_clearance = self._calculateExtraZClearance(ExtruderManager.getInstance().getUsedExtruderStacks())
if rebuild_me:
self.rebuild()
@@ -649,7 +689,7 @@ class BuildVolume(SceneNode):
# We just did a rebuild, reset the list.
self._changed_settings_since_last_rebuild = []
- def _onSettingPropertyChanged(self, setting_key: str, property_name: str):
+ def _onSettingPropertyChanged(self, setting_key: str, property_name: str) -> None:
if property_name != "value":
return
@@ -660,6 +700,14 @@ class BuildVolume(SceneNode):
def hasErrors(self) -> bool:
return self._has_errors
+ def _updateMachineSizeProperties(self) -> None:
+ if not self._global_container_stack:
+ return
+ self._height = self._global_container_stack.getProperty("machine_height", "value")
+ self._width = self._global_container_stack.getProperty("machine_width", "value")
+ self._depth = self._global_container_stack.getProperty("machine_depth", "value")
+ self._shape = self._global_container_stack.getProperty("machine_shape", "value")
+
## Calls _updateDisallowedAreas and makes sure the changes appear in the
# scene.
#
@@ -671,57 +719,26 @@ class BuildVolume(SceneNode):
def _updateDisallowedAreasAndRebuild(self):
self._updateDisallowedAreas()
self._updateRaftThickness()
- self._updateExtraZClearance()
+ self._extra_z_clearance = self._calculateExtraZClearance(ExtruderManager.getInstance().getUsedExtruderStacks())
self.rebuild()
- def _updateDisallowedAreas(self):
+ def _updateDisallowedAreas(self) -> None:
if not self._global_container_stack:
return
self._error_areas = []
- extruder_manager = ExtruderManager.getInstance()
- used_extruders = extruder_manager.getUsedExtruderStacks()
+ used_extruders = ExtruderManager.getInstance().getUsedExtruderStacks()
disallowed_border_size = self.getEdgeDisallowedSize()
- if not used_extruders:
- # If no extruder is used, assume that the active extruder is used (else nothing is drawn)
- if extruder_manager.getActiveExtruderStack():
- used_extruders = [extruder_manager.getActiveExtruderStack()]
- else:
- used_extruders = [self._global_container_stack]
-
- result_areas = self._computeDisallowedAreasStatic(disallowed_border_size, used_extruders) #Normal machine disallowed areas can always be added.
+ result_areas = self._computeDisallowedAreasStatic(disallowed_border_size, used_extruders) # Normal machine disallowed areas can always be added.
prime_areas = self._computeDisallowedAreasPrimeBlob(disallowed_border_size, used_extruders)
- result_areas_no_brim = self._computeDisallowedAreasStatic(0, used_extruders) #Where the priming is not allowed to happen. This is not added to the result, just for collision checking.
- prime_disallowed_areas = copy.deepcopy(result_areas_no_brim)
+ result_areas_no_brim = self._computeDisallowedAreasStatic(0, used_extruders) # Where the priming is not allowed to happen. This is not added to the result, just for collision checking.
- #Check if prime positions intersect with disallowed areas.
+ # Check if prime positions intersect with disallowed areas.
for extruder in used_extruders:
extruder_id = extruder.getId()
- collision = False
- for prime_polygon in prime_areas[extruder_id]:
- for disallowed_polygon in prime_disallowed_areas[extruder_id]:
- if prime_polygon.intersectsPolygon(disallowed_polygon) is not None:
- collision = True
- break
- if collision:
- break
-
- #Also check other prime positions (without additional offset).
- for other_extruder_id in prime_areas:
- if extruder_id == other_extruder_id: #It is allowed to collide with itself.
- continue
- for other_prime_polygon in prime_areas[other_extruder_id]:
- if prime_polygon.intersectsPolygon(other_prime_polygon):
- collision = True
- break
- if collision:
- break
- if collision:
- break
-
result_areas[extruder_id].extend(prime_areas[extruder_id])
result_areas_no_brim[extruder_id].extend(prime_areas[extruder_id])
@@ -729,33 +746,28 @@ class BuildVolume(SceneNode):
for area in nozzle_disallowed_areas:
polygon = Polygon(numpy.array(area, numpy.float32))
polygon_disallowed_border = polygon.getMinkowskiHull(Polygon.approximatedCircle(disallowed_border_size))
- result_areas[extruder_id].append(polygon_disallowed_border) #Don't perform the offset on these.
- #polygon_minimal_border = polygon.getMinkowskiHull(5)
- result_areas_no_brim[extruder_id].append(polygon) # no brim
+ result_areas[extruder_id].append(polygon_disallowed_border) # Don't perform the offset on these.
+ result_areas_no_brim[extruder_id].append(polygon) # No brim
# Add prime tower location as disallowed area.
- if len(used_extruders) > 1: #No prime tower in single-extrusion.
-
- if len([x for x in used_extruders if x.isEnabled == True]) > 1: #No prime tower if only one extruder is enabled
- prime_tower_collision = False
- prime_tower_areas = self._computeDisallowedAreasPrinted(used_extruders)
- for extruder_id in prime_tower_areas:
- for i_area, prime_tower_area in enumerate(prime_tower_areas[extruder_id]):
- for area in result_areas[extruder_id]:
- if prime_tower_area.intersectsPolygon(area) is not None:
- prime_tower_collision = True
- break
- if prime_tower_collision: #Already found a collision.
+ if len([x for x in used_extruders if x.isEnabled]) > 1: # No prime tower if only one extruder is enabled
+ prime_tower_collision = False
+ prime_tower_areas = self._computeDisallowedAreasPrinted(used_extruders)
+ for extruder_id in prime_tower_areas:
+ for area_index, prime_tower_area in enumerate(prime_tower_areas[extruder_id]):
+ for area in result_areas[extruder_id]:
+ if prime_tower_area.intersectsPolygon(area) is not None:
+ prime_tower_collision = True
break
- if (ExtruderManager.getInstance().getResolveOrValue("prime_tower_brim_enable") and
- ExtruderManager.getInstance().getResolveOrValue("adhesion_type") != "raft"):
- prime_tower_areas[extruder_id][i_area] = prime_tower_area.getMinkowskiHull(
- Polygon.approximatedCircle(disallowed_border_size))
- if not prime_tower_collision:
- result_areas[extruder_id].extend(prime_tower_areas[extruder_id])
- result_areas_no_brim[extruder_id].extend(prime_tower_areas[extruder_id])
- else:
- self._error_areas.extend(prime_tower_areas[extruder_id])
+ if prime_tower_collision: # Already found a collision.
+ break
+ if self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and self._global_container_stack.getProperty("adhesion_type", "value") != "raft":
+ prime_tower_areas[extruder_id][area_index] = prime_tower_area.getMinkowskiHull(Polygon.approximatedCircle(disallowed_border_size))
+ if not prime_tower_collision:
+ result_areas[extruder_id].extend(prime_tower_areas[extruder_id])
+ result_areas_no_brim[extruder_id].extend(prime_tower_areas[extruder_id])
+ else:
+ self._error_areas.extend(prime_tower_areas[extruder_id])
self._has_errors = len(self._error_areas) > 0
@@ -776,11 +788,14 @@ class BuildVolume(SceneNode):
# where that extruder may not print.
def _computeDisallowedAreasPrinted(self, used_extruders):
result = {}
+ adhesion_extruder = None #type: ExtruderStack
for extruder in used_extruders:
+ if int(extruder.getProperty("extruder_nr", "value")) == int(self._global_container_stack.getProperty("adhesion_extruder_nr", "value")):
+ adhesion_extruder = extruder
result[extruder.getId()] = []
- #Currently, the only normally printed object is the prime tower.
- if ExtruderManager.getInstance().getResolveOrValue("prime_tower_enable"):
+ # Currently, the only normally printed object is the prime tower.
+ if self._global_container_stack.getProperty("prime_tower_enable", "value"):
prime_tower_size = self._global_container_stack.getProperty("prime_tower_size", "value")
machine_width = self._global_container_stack.getProperty("machine_width", "value")
machine_depth = self._global_container_stack.getProperty("machine_depth", "value")
@@ -790,27 +805,19 @@ class BuildVolume(SceneNode):
prime_tower_x = prime_tower_x - machine_width / 2 #Offset by half machine_width and _depth to put the origin in the front-left.
prime_tower_y = prime_tower_y + machine_depth / 2
- if (ExtruderManager.getInstance().getResolveOrValue("prime_tower_brim_enable") and
- ExtruderManager.getInstance().getResolveOrValue("adhesion_type") != "raft"):
+ if adhesion_extruder is not None and self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and self._global_container_stack.getProperty("adhesion_type", "value") != "raft":
brim_size = (
- extruder.getProperty("brim_line_count", "value") *
- extruder.getProperty("skirt_brim_line_width", "value") / 100.0 *
- extruder.getProperty("initial_layer_line_width_factor", "value")
+ adhesion_extruder.getProperty("brim_line_count", "value") *
+ adhesion_extruder.getProperty("skirt_brim_line_width", "value") / 100.0 *
+ adhesion_extruder.getProperty("initial_layer_line_width_factor", "value")
)
prime_tower_x -= brim_size
prime_tower_y += brim_size
- if self._global_container_stack.getProperty("prime_tower_circular", "value"):
- radius = prime_tower_size / 2
- prime_tower_area = Polygon.approximatedCircle(radius)
- prime_tower_area = prime_tower_area.translate(prime_tower_x - radius, prime_tower_y - radius)
- else:
- prime_tower_area = Polygon([
- [prime_tower_x - prime_tower_size, prime_tower_y - prime_tower_size],
- [prime_tower_x, prime_tower_y - prime_tower_size],
- [prime_tower_x, prime_tower_y],
- [prime_tower_x - prime_tower_size, prime_tower_y],
- ])
+ radius = prime_tower_size / 2
+ prime_tower_area = Polygon.approximatedCircle(radius)
+ prime_tower_area = prime_tower_area.translate(prime_tower_x - radius, prime_tower_y - radius)
+
prime_tower_area = prime_tower_area.getMinkowskiHull(Polygon.approximatedCircle(0))
for extruder in used_extruders:
result[extruder.getId()].append(prime_tower_area) #The prime tower location is the same for each extruder, regardless of offset.
@@ -828,9 +835,10 @@ class BuildVolume(SceneNode):
# \param used_extruders The extruder stacks to generate disallowed areas
# for.
# \return A dictionary with for each used extruder ID the prime areas.
- def _computeDisallowedAreasPrimeBlob(self, border_size, used_extruders):
- result = {}
-
+ def _computeDisallowedAreasPrimeBlob(self, border_size: float, used_extruders: List["ExtruderStack"]) -> Dict[str, List[Polygon]]:
+ result = {} # type: Dict[str, List[Polygon]]
+ if not self._global_container_stack:
+ return result
machine_width = self._global_container_stack.getProperty("machine_width", "value")
machine_depth = self._global_container_stack.getProperty("machine_depth", "value")
for extruder in used_extruders:
@@ -838,13 +846,13 @@ class BuildVolume(SceneNode):
prime_x = extruder.getProperty("extruder_prime_pos_x", "value")
prime_y = -extruder.getProperty("extruder_prime_pos_y", "value")
- #Ignore extruder prime position if it is not set or if blob is disabled
+ # Ignore extruder prime position if it is not set or if blob is disabled
if (prime_x == 0 and prime_y == 0) or not prime_blob_enabled:
result[extruder.getId()] = []
continue
if not self._global_container_stack.getProperty("machine_center_is_zero", "value"):
- prime_x = prime_x - machine_width / 2 #Offset by half machine_width and _depth to put the origin in the front-left.
+ prime_x = prime_x - machine_width / 2 # Offset by half machine_width and _depth to put the origin in the front-left.
prime_y = prime_y + machine_depth / 2
prime_polygon = Polygon.approximatedCircle(PRIME_CLEARANCE)
@@ -867,9 +875,12 @@ class BuildVolume(SceneNode):
# for.
# \return A dictionary with for each used extruder ID the disallowed areas
# where that extruder may not print.
- def _computeDisallowedAreasStatic(self, border_size, used_extruders):
- #Convert disallowed areas to polygons and dilate them.
+ def _computeDisallowedAreasStatic(self, border_size:float, used_extruders: List["ExtruderStack"]) -> Dict[str, List[Polygon]]:
+ # Convert disallowed areas to polygons and dilate them.
machine_disallowed_polygons = []
+ if self._global_container_stack is None:
+ return {}
+
for area in self._global_container_stack.getProperty("machine_disallowed_areas", "value"):
polygon = Polygon(numpy.array(area, numpy.float32))
polygon = polygon.getMinkowskiHull(Polygon.approximatedCircle(border_size))
@@ -880,7 +891,7 @@ class BuildVolume(SceneNode):
nozzle_offsetting_for_disallowed_areas = self._global_container_stack.getMetaDataEntry(
"nozzle_offsetting_for_disallowed_areas", True)
- result = {}
+ result = {} # type: Dict[str, List[Polygon]]
for extruder in used_extruders:
extruder_id = extruder.getId()
offset_x = extruder.getProperty("machine_nozzle_offset_x", "value")
@@ -889,13 +900,13 @@ class BuildVolume(SceneNode):
offset_y = extruder.getProperty("machine_nozzle_offset_y", "value")
if offset_y is None:
offset_y = 0
- offset_y = -offset_y #Y direction of g-code is the inverse of Y direction of Cura's scene space.
+ offset_y = -offset_y # Y direction of g-code is the inverse of Y direction of Cura's scene space.
result[extruder_id] = []
for polygon in machine_disallowed_polygons:
- result[extruder_id].append(polygon.translate(offset_x, offset_y)) #Compensate for the nozzle offset of this extruder.
+ result[extruder_id].append(polygon.translate(offset_x, offset_y)) # Compensate for the nozzle offset of this extruder.
- #Add the border around the edge of the build volume.
+ # Add the border around the edge of the build volume.
left_unreachable_border = 0
right_unreachable_border = 0
top_unreachable_border = 0
@@ -903,7 +914,8 @@ class BuildVolume(SceneNode):
# Only do nozzle offsetting if needed
if nozzle_offsetting_for_disallowed_areas:
- #The build volume is defined as the union of the area that all extruders can reach, so we need to know the relative offset to all extruders.
+ # The build volume is defined as the union of the area that all extruders can reach, so we need to know
+ # the relative offset to all extruders.
for other_extruder in ExtruderManager.getInstance().getActiveExtruderStacks():
other_offset_x = other_extruder.getProperty("machine_nozzle_offset_x", "value")
if other_offset_x is None:
@@ -987,8 +999,8 @@ class BuildVolume(SceneNode):
[ half_machine_width - border_size, 0]
], numpy.float32)))
result[extruder_id].append(Polygon(numpy.array([
- [ half_machine_width,-half_machine_depth],
- [-half_machine_width,-half_machine_depth],
+ [ half_machine_width, -half_machine_depth],
+ [-half_machine_width, -half_machine_depth],
[ 0, -half_machine_depth + border_size]
], numpy.float32)))
@@ -1000,14 +1012,86 @@ class BuildVolume(SceneNode):
# stack.
#
# \return A sequence of setting values, one for each extruder.
- def _getSettingFromAllExtruders(self, setting_key):
+ def _getSettingFromAllExtruders(self, setting_key: str) -> List[Any]:
all_values = ExtruderManager.getInstance().getAllExtruderSettings(setting_key, "value")
all_types = ExtruderManager.getInstance().getAllExtruderSettings(setting_key, "type")
- for i in range(len(all_values)):
- if not all_values[i] and (all_types[i] == "int" or all_types[i] == "float"):
+ for i, (setting_value, setting_type) in enumerate(zip(all_values, all_types)):
+ if not setting_value and (setting_type == "int" or setting_type == "float"):
all_values[i] = 0
return all_values
+ def _calculateBedAdhesionSize(self, used_extruders):
+ if self._global_container_stack is None:
+ return
+
+ container_stack = self._global_container_stack
+ adhesion_type = container_stack.getProperty("adhesion_type", "value")
+ skirt_brim_line_width = self._global_container_stack.getProperty("skirt_brim_line_width", "value")
+ initial_layer_line_width_factor = self._global_container_stack.getProperty("initial_layer_line_width_factor", "value")
+ # Use brim width if brim is enabled OR the prime tower has a brim.
+ if adhesion_type == "brim" or (self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and adhesion_type != "raft"):
+ brim_line_count = self._global_container_stack.getProperty("brim_line_count", "value")
+ bed_adhesion_size = skirt_brim_line_width * brim_line_count * initial_layer_line_width_factor / 100.0
+
+ for extruder_stack in used_extruders:
+ bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0
+
+ # We don't create an additional line for the extruder we're printing the brim with.
+ bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0
+ elif adhesion_type == "skirt": # No brim? Also not on prime tower? Then use whatever the adhesion type is saying: Skirt, raft or none.
+ skirt_distance = self._global_container_stack.getProperty("skirt_gap", "value")
+ skirt_line_count = self._global_container_stack.getProperty("skirt_line_count", "value")
+
+ bed_adhesion_size = skirt_distance + (
+ skirt_brim_line_width * skirt_line_count) * initial_layer_line_width_factor / 100.0
+
+ for extruder_stack in used_extruders:
+ bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0
+
+ # We don't create an additional line for the extruder we're printing the skirt with.
+ bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0
+ elif adhesion_type == "raft":
+ bed_adhesion_size = self._global_container_stack.getProperty("raft_margin", "value")
+ elif adhesion_type == "none":
+ bed_adhesion_size = 0
+ else:
+ raise Exception("Unknown bed adhesion type. Did you forget to update the build volume calculations for your new bed adhesion type?")
+
+ max_length_available = 0.5 * min(
+ self._global_container_stack.getProperty("machine_width", "value"),
+ self._global_container_stack.getProperty("machine_depth", "value")
+ )
+ bed_adhesion_size = min(bed_adhesion_size, max_length_available)
+ return bed_adhesion_size
+
+ def _calculateFarthestShieldDistance(self, container_stack):
+ farthest_shield_distance = 0
+ if container_stack.getProperty("draft_shield_enabled", "value"):
+ farthest_shield_distance = max(farthest_shield_distance, container_stack.getProperty("draft_shield_dist", "value"))
+ if container_stack.getProperty("ooze_shield_enabled", "value"):
+ farthest_shield_distance = max(farthest_shield_distance,container_stack.getProperty("ooze_shield_dist", "value"))
+ return farthest_shield_distance
+
+ def _calculateSupportExpansion(self, container_stack):
+ support_expansion = 0
+ support_enabled = self._global_container_stack.getProperty("support_enable", "value")
+ support_offset = self._global_container_stack.getProperty("support_offset", "value")
+ if support_enabled and support_offset:
+ support_expansion += support_offset
+ return support_expansion
+
+ def _calculateMoveFromWallRadius(self, used_extruders):
+ move_from_wall_radius = 0 # Moves that start from outer wall.
+ all_values = [move_from_wall_radius]
+ all_values.extend(self._getSettingFromAllExtruders("infill_wipe_dist"))
+ move_from_wall_radius = max(all_values)
+ avoid_enabled_per_extruder = [stack.getProperty("travel_avoid_other_parts", "value") for stack in used_extruders]
+ travel_avoid_distance_per_extruder = [stack.getProperty("travel_avoid_distance", "value") for stack in used_extruders]
+ for avoid_other_parts_enabled, avoid_distance in zip(avoid_enabled_per_extruder, travel_avoid_distance_per_extruder): # For each extruder (or just global).
+ if avoid_other_parts_enabled:
+ move_from_wall_radius = max(move_from_wall_radius, avoid_distance)
+ return move_from_wall_radius
+
## Calculate the disallowed radius around the edge.
#
# This disallowed radius is to allow for space around the models that is
@@ -1024,67 +1108,10 @@ class BuildVolume(SceneNode):
if container_stack.getProperty("print_sequence", "value") == "one_at_a_time":
return 0.1 # Return a very small value, so we do draw disallowed area's near the edges.
- adhesion_type = container_stack.getProperty("adhesion_type", "value")
- skirt_brim_line_width = self._global_container_stack.getProperty("skirt_brim_line_width", "value")
- initial_layer_line_width_factor = self._global_container_stack.getProperty("initial_layer_line_width_factor", "value")
- if adhesion_type == "skirt":
- skirt_distance = self._global_container_stack.getProperty("skirt_gap", "value")
- skirt_line_count = self._global_container_stack.getProperty("skirt_line_count", "value")
-
- bed_adhesion_size = skirt_distance + (skirt_brim_line_width * skirt_line_count) * initial_layer_line_width_factor / 100.0
-
- for extruder_stack in used_extruders:
- bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0
-
- # We don't create an additional line for the extruder we're printing the skirt with.
- bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0
-
- elif (adhesion_type == "brim" or
- (self._global_container_stack.getProperty("prime_tower_brim_enable", "value") and
- self._global_container_stack.getProperty("adhesion_type", "value") != "raft")):
- brim_line_count = self._global_container_stack.getProperty("brim_line_count", "value")
- bed_adhesion_size = skirt_brim_line_width * brim_line_count * initial_layer_line_width_factor / 100.0
-
- for extruder_stack in used_extruders:
- bed_adhesion_size += extruder_stack.getProperty("skirt_brim_line_width", "value") * extruder_stack.getProperty("initial_layer_line_width_factor", "value") / 100.0
-
- # We don't create an additional line for the extruder we're printing the brim with.
- bed_adhesion_size -= skirt_brim_line_width * initial_layer_line_width_factor / 100.0
-
- elif adhesion_type == "raft":
- bed_adhesion_size = self._global_container_stack.getProperty("raft_margin", "value")
-
- elif adhesion_type == "none":
- bed_adhesion_size = 0
-
- else:
- raise Exception("Unknown bed adhesion type. Did you forget to update the build volume calculations for your new bed adhesion type?")
-
- max_length_available = 0.5 * min(
- self._global_container_stack.getProperty("machine_width", "value"),
- self._global_container_stack.getProperty("machine_depth", "value")
- )
- bed_adhesion_size = min(bed_adhesion_size, max_length_available)
-
- support_expansion = 0
- support_enabled = self._global_container_stack.getProperty("support_enable", "value")
- support_offset = self._global_container_stack.getProperty("support_offset", "value")
- if support_enabled and support_offset:
- support_expansion += support_offset
-
- farthest_shield_distance = 0
- if container_stack.getProperty("draft_shield_enabled", "value"):
- farthest_shield_distance = max(farthest_shield_distance, container_stack.getProperty("draft_shield_dist", "value"))
- if container_stack.getProperty("ooze_shield_enabled", "value"):
- farthest_shield_distance = max(farthest_shield_distance, container_stack.getProperty("ooze_shield_dist", "value"))
-
- move_from_wall_radius = 0 # Moves that start from outer wall.
- move_from_wall_radius = max(move_from_wall_radius, max(self._getSettingFromAllExtruders("infill_wipe_dist")))
- avoid_enabled_per_extruder = [stack.getProperty("travel_avoid_other_parts","value") for stack in used_extruders]
- travel_avoid_distance_per_extruder = [stack.getProperty("travel_avoid_distance", "value") for stack in used_extruders]
- for avoid_other_parts_enabled, avoid_distance in zip(avoid_enabled_per_extruder, travel_avoid_distance_per_extruder): #For each extruder (or just global).
- if avoid_other_parts_enabled:
- move_from_wall_radius = max(move_from_wall_radius, avoid_distance)
+ bed_adhesion_size = self._calculateBedAdhesionSize(used_extruders)
+ support_expansion = self._calculateSupportExpansion(self._global_container_stack)
+ farthest_shield_distance = self._calculateFarthestShieldDistance(self._global_container_stack)
+ move_from_wall_radius = self._calculateMoveFromWallRadius(used_extruders)
# Now combine our different pieces of data to get the final border size.
# Support expansion is added to the bed adhesion, since the bed adhesion goes around support.
@@ -1100,8 +1127,9 @@ class BuildVolume(SceneNode):
_raft_settings = ["adhesion_type", "raft_base_thickness", "raft_interface_thickness", "raft_surface_layers", "raft_surface_thickness", "raft_airgap", "layer_0_z_overlap"]
_extra_z_settings = ["retraction_hop_enabled", "retraction_hop"]
_prime_settings = ["extruder_prime_pos_x", "extruder_prime_pos_y", "extruder_prime_pos_z", "prime_blob_enable"]
- _tower_settings = ["prime_tower_enable", "prime_tower_circular", "prime_tower_size", "prime_tower_position_x", "prime_tower_position_y", "prime_tower_brim_enable"]
+ _tower_settings = ["prime_tower_enable", "prime_tower_size", "prime_tower_position_x", "prime_tower_position_y", "prime_tower_brim_enable"]
_ooze_shield_settings = ["ooze_shield_enabled", "ooze_shield_dist"]
_distance_settings = ["infill_wipe_dist", "travel_avoid_distance", "support_offset", "support_enable", "travel_avoid_other_parts", "travel_avoid_supports"]
_extruder_settings = ["support_enable", "support_bottom_enable", "support_roof_enable", "support_infill_extruder_nr", "support_extruder_nr_layer_0", "support_bottom_extruder_nr", "support_roof_extruder_nr", "brim_line_count", "adhesion_extruder_nr", "adhesion_type"] #Settings that can affect which extruders are used.
_limit_to_extruder_settings = ["wall_extruder_nr", "wall_0_extruder_nr", "wall_x_extruder_nr", "top_bottom_extruder_nr", "infill_extruder_nr", "support_infill_extruder_nr", "support_extruder_nr_layer_0", "support_bottom_extruder_nr", "support_roof_extruder_nr", "adhesion_extruder_nr"]
+ _disallowed_area_settings = _skirt_settings + _prime_settings + _tower_settings + _ooze_shield_settings + _distance_settings + _extruder_settings
diff --git a/cura/CrashHandler.py b/cura/CrashHandler.py
index d43743bc37..1d85a1da54 100644
--- a/cura/CrashHandler.py
+++ b/cura/CrashHandler.py
@@ -12,9 +12,10 @@ import json
import ssl
import urllib.request
import urllib.error
-import shutil
-from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR, Qt, QUrl
+import certifi
+
+from PyQt5.QtCore import QT_VERSION_STR, PYQT_VERSION_STR, QUrl
from PyQt5.QtWidgets import QDialog, QDialogButtonBox, QVBoxLayout, QLabel, QTextEdit, QGroupBox, QCheckBox, QPushButton
from PyQt5.QtGui import QDesktopServices
@@ -22,7 +23,6 @@ from UM.Application import Application
from UM.Logger import Logger
from UM.View.GL.OpenGL import OpenGL
from UM.i18n import i18nCatalog
-from UM.Platform import Platform
from UM.Resources import Resources
catalog = i18nCatalog("cura")
@@ -319,7 +319,8 @@ class CrashHandler:
def _userDescriptionWidget(self):
group = QGroupBox()
- group.setTitle(catalog.i18nc("@title:groupbox", "User description"))
+ group.setTitle(catalog.i18nc("@title:groupbox", "User description" +
+ " (Note: Developers may not speak your language, please use English if possible)"))
layout = QVBoxLayout()
# When sending the report, the user comments will be collected
@@ -351,11 +352,13 @@ class CrashHandler:
# Convert data to bytes
binary_data = json.dumps(self.data).encode("utf-8")
+ # CURA-6698 Create an SSL context and use certifi CA certificates for verification.
+ context = ssl.SSLContext(protocol=ssl.PROTOCOL_TLSv1_2)
+ context.load_verify_locations(cafile = certifi.where())
# Submit data
- kwoptions = {"data": binary_data, "timeout": 5}
-
- if Platform.isOSX():
- kwoptions["context"] = ssl._create_unverified_context()
+ kwoptions = {"data": binary_data,
+ "timeout": 5,
+ "context": context}
Logger.log("i", "Sending crash report info to [%s]...", self.crash_url)
if not self.has_started:
diff --git a/cura/CuraActions.py b/cura/CuraActions.py
index 91e0966fed..3a1b35d987 100644
--- a/cura/CuraActions.py
+++ b/cura/CuraActions.py
@@ -3,15 +3,17 @@
from PyQt5.QtCore import QObject, QUrl
from PyQt5.QtGui import QDesktopServices
-from typing import List, TYPE_CHECKING, cast
+from typing import List, Optional, cast
from UM.Event import CallFunctionEvent
from UM.FlameProfiler import pyqtSlot
+from UM.Math.Quaternion import Quaternion
from UM.Math.Vector import Vector
from UM.Scene.Selection import Selection
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
from UM.Operations.GroupedOperation import GroupedOperation
from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation
+from UM.Operations.RotateOperation import RotateOperation
from UM.Operations.TranslateOperation import TranslateOperation
import cura.CuraApplication
@@ -23,9 +25,8 @@ from cura.Settings.ExtruderManager import ExtruderManager
from cura.Operations.SetBuildPlateNumberOperation import SetBuildPlateNumberOperation
from UM.Logger import Logger
+from UM.Scene.SceneNode import SceneNode
-if TYPE_CHECKING:
- from UM.Scene.SceneNode import SceneNode
class CuraActions(QObject):
def __init__(self, parent: QObject = None) -> None:
@@ -74,6 +75,39 @@ class CuraActions(QObject):
operation.addOperation(center_operation)
operation.push()
+ # Rotate the selection, so that the face that the mouse-pointer is on, faces the build-plate.
+ @pyqtSlot()
+ def bottomFaceSelection(self) -> None:
+ selected_face = Selection.getSelectedFace()
+ if not selected_face:
+ Logger.log("e", "Bottom face operation shouldn't have been called without a selected face.")
+ return
+
+ original_node, face_id = selected_face
+ meshdata = original_node.getMeshDataTransformed()
+ if not meshdata or face_id < 0 or face_id > Selection.getMaxFaceSelectionId():
+ return
+
+ rotation_point, face_normal = meshdata.getFacePlane(face_id)
+ rotation_point_vector = Vector(rotation_point[0], rotation_point[1], rotation_point[2])
+ face_normal_vector = Vector(face_normal[0], face_normal[1], face_normal[2])
+ rotation_quaternion = Quaternion.rotationTo(face_normal_vector.normalized(), Vector(0.0, -1.0, 0.0))
+
+ operation = GroupedOperation()
+ current_node = None # type: Optional[SceneNode]
+ for node in Selection.getAllSelectedObjects():
+ current_node = node
+ parent_node = current_node.getParent()
+ while parent_node and parent_node.callDecoration("isGroup"):
+ current_node = parent_node
+ parent_node = current_node.getParent()
+ if current_node is None:
+ return
+
+ rotate_operation = RotateOperation(current_node, rotation_quaternion, rotation_point_vector)
+ operation.addOperation(rotate_operation)
+ operation.push()
+
## Multiply all objects in the selection
#
# \param count The number of times to multiply the selection.
diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py
index 4d3d2434ff..ef85bf7457 100755
--- a/cura/CuraApplication.py
+++ b/cura/CuraApplication.py
@@ -13,113 +13,124 @@ 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.GCodeListDecorator import GCodeListDecorator
+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.RecommendedMode import RecommendedMode
+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
@@ -134,7 +145,7 @@ class CuraApplication(QtApplication):
# SettingVersion represents the set of settings available in the machine/extruder definitions.
# You need to make sure that this version number needs to be increased if there is any non-backwards-compatible
# changes of the settings.
- SettingVersion = 7
+ SettingVersion = 9
Created = False
@@ -208,6 +219,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 +257,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
+ self._auto_save = None # type: Optional[AutoSave]
from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
self._container_registry_class = CuraContainerRegistry
@@ -405,7 +422,7 @@ class CuraApplication(QtApplication):
# Add empty variant, material and quality containers.
# Since they are empty, they should never be serialized and instead just programmatically created.
# We need them to simplify the switching between materials.
- self.empty_container = cura.Settings.cura_empty_instance_containers.empty_container # type: EmptyInstanceContainer
+ self.empty_container = cura.Settings.cura_empty_instance_containers.empty_container
self._container_registry.addContainer(
cura.Settings.cura_empty_instance_containers.empty_definition_changes_container)
@@ -450,7 +467,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.
@@ -509,8 +525,13 @@ class CuraApplication(QtApplication):
preferences.addPreference("cura/choice_on_profile_override", "always_ask")
preferences.addPreference("cura/choice_on_open_project", "always_ask")
preferences.addPreference("cura/use_multi_build_plate", False)
+ preferences.addPreference("cura/show_list_of_objects", 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", "{}")
@@ -522,7 +543,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
@@ -545,13 +566,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()
@@ -649,13 +677,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()
@@ -745,6 +770,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()
@@ -810,7 +840,6 @@ class CuraApplication(QtApplication):
if diagonal < 1: #No printer added yet. Set a default camera distance for normal-sized printers.
diagonal = 375
camera.setPosition(Vector(-80, 250, 700) * diagonal / 375)
- camera.setPerspective(True)
camera.lookAt(Vector(0, 0, 0))
controller.getScene().setActiveCamera("3d")
@@ -839,10 +868,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)
@@ -874,7 +931,7 @@ class CuraApplication(QtApplication):
def getObjectsModel(self, *args):
if self._object_manager is None:
- self._object_manager = ObjectsModel.createObjectsModel()
+ self._object_manager = ObjectsModel(self)
return self._object_manager
@pyqtSlot(result = QObject)
@@ -933,7 +990,7 @@ class CuraApplication(QtApplication):
return super().event(event)
- def getAutoSave(self):
+ def getAutoSave(self) -> Optional[AutoSave]:
return self._auto_save
## Get print information (duration / material used)
@@ -975,9 +1032,17 @@ 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(RecommendedMode, "Cura", 1, 0, "RecommendedMode")
+
qmlRegisterType(NetworkMJPGImage, "Cura", 1, 0, "NetworkMJPGImage")
- qmlRegisterSingletonType(ObjectsModel, "Cura", 1, 0, "ObjectsModel", self.getObjectsModel)
+ qmlRegisterType(ObjectsModel, "Cura", 1, 0, "ObjectsModel")
qmlRegisterType(BuildPlateModel, "Cura", 1, 0, "BuildPlateModel")
qmlRegisterType(MultiBuildPlateModel, "Cura", 1, 0, "MultiBuildPlateModel")
qmlRegisterType(InstanceContainer, "Cura", 1, 0, "InstanceContainer")
@@ -988,7 +1053,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)
@@ -999,6 +1065,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)
@@ -1055,7 +1122,6 @@ class CuraApplication(QtApplication):
self._camera_animation.setTarget(Selection.getSelectedObject(0).getWorldPosition())
self._camera_animation.start()
- requestAddPrinter = pyqtSignal()
activityChanged = pyqtSignal()
sceneBoundingBoxChanged = pyqtSignal()
@@ -1197,7 +1263,7 @@ class CuraApplication(QtApplication):
@pyqtSlot()
def arrangeObjectsToAllBuildPlates(self) -> None:
nodes_to_arrange = []
- for node in DepthFirstIterator(self.getController().getScene().getRoot()): # type: ignore
+ for node in DepthFirstIterator(self.getController().getScene().getRoot()):
if not isinstance(node, SceneNode):
continue
@@ -1224,7 +1290,7 @@ class CuraApplication(QtApplication):
def arrangeAll(self) -> None:
nodes_to_arrange = []
active_build_plate = self.getMultiBuildPlateModel().activeBuildPlate
- for node in DepthFirstIterator(self.getController().getScene().getRoot()): # type: ignore
+ for node in DepthFirstIterator(self.getController().getScene().getRoot()):
if not isinstance(node, SceneNode):
continue
@@ -1262,7 +1328,13 @@ class CuraApplication(QtApplication):
Logger.log("i", "Reloading all loaded mesh data.")
nodes = []
has_merged_nodes = False
- for node in DepthFirstIterator(self.getController().getScene().getRoot()): # type: ignore
+ gcode_filename = None # type: Optional[str]
+ for node in DepthFirstIterator(self.getController().getScene().getRoot()):
+ # Objects loaded from Gcode should also be included.
+ gcode_filename = node.callDecoration("getGcodeFileName")
+ if gcode_filename is not None:
+ break
+
if not isinstance(node, CuraSceneNode) or not node.getMeshData():
if node.getName() == "MergedMesh":
has_merged_nodes = True
@@ -1270,13 +1342,18 @@ class CuraApplication(QtApplication):
nodes.append(node)
+ # We can open only one gcode file at the same time. If the current view has a gcode file open, just reopen it
+ # for reloading.
+ if gcode_filename:
+ self._openFile(gcode_filename)
+
if not nodes:
return
for node in nodes:
- file_name = node.getMeshData().getFileName()
- if file_name:
- job = ReadMeshJob(file_name)
+ mesh_data = node.getMeshData()
+ if mesh_data and mesh_data.getFileName():
+ job = ReadMeshJob(mesh_data.getFileName())
job._node = node # type: ignore
job.finished.connect(self._reloadMeshFinished)
if has_merged_nodes:
@@ -1715,3 +1792,69 @@ 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
+
+ @pyqtSlot()
+ def deleteAll(self, only_selectable: bool = True) -> None:
+ super().deleteAll(only_selectable = only_selectable)
+
+ # Also remove nodes with LayerData
+ self._removeNodesWithLayerData(only_selectable = only_selectable)
+
+ def _removeNodesWithLayerData(self, only_selectable: bool = True) -> None:
+ Logger.log("i", "Clearing scene")
+ nodes = []
+ for node in DepthFirstIterator(self.getController().getScene().getRoot()):
+ if not isinstance(node, SceneNode):
+ continue
+ if not node.isEnabled():
+ continue
+ if (not node.getMeshData() and not node.callDecoration("getLayerData")) and not node.callDecoration("isGroup"):
+ continue # Node that doesnt have a mesh and is not a group.
+ if only_selectable and not node.isSelectable():
+ continue # Only remove nodes that are selectable.
+ if not node.callDecoration("isSliceable") and not node.callDecoration("getLayerData") and not node.callDecoration("isGroup"):
+ continue # Grouped nodes don't need resetting as their parent (the group) is resetted)
+ nodes.append(node)
+ if nodes:
+ from UM.Operations.GroupedOperation import GroupedOperation
+ op = GroupedOperation()
+
+ for node in nodes:
+ from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation
+ op.addOperation(RemoveSceneNodeOperation(node))
+
+ # Reset the print information
+ self.getController().getScene().sceneChanged.emit(node)
+
+ op.push()
+ from UM.Scene.Selection import Selection
+ Selection.clear()
diff --git a/cura/CuraVersion.py.in b/cura/CuraVersion.py.in
index 1a500df248..4583e76f67 100644
--- a/cura/CuraVersion.py.in
+++ b/cura/CuraVersion.py.in
@@ -6,7 +6,6 @@ CuraAppDisplayName = "@CURA_APP_DISPLAY_NAME@"
CuraVersion = "@CURA_VERSION@"
CuraBuildType = "@CURA_BUILDTYPE@"
CuraDebugMode = True if "@_cura_debugmode@" == "ON" else False
-CuraSDKVersion = "@CURA_SDK_VERSION@"
CuraCloudAPIRoot = "@CURA_CLOUD_API_ROOT@"
CuraCloudAPIVersion = "@CURA_CLOUD_API_VERSION@"
CuraCloudAccountAPIRoot = "@CURA_CLOUD_ACCOUNT_API_ROOT@"
diff --git a/cura/CuraView.py b/cura/CuraView.py
index 978c651b43..b358558dff 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.fromLocalFile(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/Layer.py b/cura/Layer.py
index 9cd45380fc..73fda64a45 100644
--- a/cura/Layer.py
+++ b/cura/Layer.py
@@ -1,14 +1,20 @@
-from UM.Mesh.MeshBuilder import MeshBuilder
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from typing import List
import numpy
+from UM.Mesh.MeshBuilder import MeshBuilder
+from UM.Mesh.MeshData import MeshData
+from cura.LayerPolygon import LayerPolygon
+
class Layer:
- def __init__(self, layer_id):
+ def __init__(self, layer_id: int) -> None:
self._id = layer_id
self._height = 0.0
self._thickness = 0.0
- self._polygons = []
+ self._polygons = [] # type: List[LayerPolygon]
self._element_count = 0
@property
@@ -20,7 +26,7 @@ class Layer:
return self._thickness
@property
- def polygons(self):
+ def polygons(self) -> List[LayerPolygon]:
return self._polygons
@property
@@ -33,14 +39,14 @@ class Layer:
def setThickness(self, thickness):
self._thickness = thickness
- def lineMeshVertexCount(self):
+ def lineMeshVertexCount(self) -> int:
result = 0
for polygon in self._polygons:
result += polygon.lineMeshVertexCount()
return result
- def lineMeshElementCount(self):
+ def lineMeshElementCount(self) -> int:
result = 0
for polygon in self._polygons:
result += polygon.lineMeshElementCount()
@@ -57,18 +63,18 @@ class Layer:
result_index_offset += polygon.lineMeshElementCount()
self._element_count += polygon.elementCount
- return (result_vertex_offset, result_index_offset)
+ return result_vertex_offset, result_index_offset
- def createMesh(self):
+ def createMesh(self) -> MeshData:
return self.createMeshOrJumps(True)
- def createJumps(self):
+ def createJumps(self) -> MeshData:
return self.createMeshOrJumps(False)
# Defines the two triplets of local point indices to use to draw the two faces for each line segment in createMeshOrJump
__index_pattern = numpy.array([[0, 3, 2, 0, 1, 3]], dtype = numpy.int32 )
- def createMeshOrJumps(self, make_mesh):
+ def createMeshOrJumps(self, make_mesh: bool) -> MeshData:
builder = MeshBuilder()
line_count = 0
@@ -79,14 +85,14 @@ class Layer:
for polygon in self._polygons:
line_count += polygon.jumpCount
- # Reserve the neccesary space for the data upfront
+ # Reserve the necessary space for the data upfront
builder.reserveFaceAndVertexCount(2 * line_count, 4 * line_count)
for polygon in self._polygons:
- # Filter out the types of lines we are not interesed in depending on whether we are drawing the mesh or the jumps.
+ # Filter out the types of lines we are not interested in depending on whether we are drawing the mesh or the jumps.
index_mask = numpy.logical_not(polygon.jumpMask) if make_mesh else polygon.jumpMask
- # Create an array with rows [p p+1] and only keep those we whant to draw based on make_mesh
+ # Create an array with rows [p p+1] and only keep those we want to draw based on make_mesh
points = numpy.concatenate((polygon.data[:-1], polygon.data[1:]), 1)[index_mask.ravel()]
# Line types of the points we want to draw
line_types = polygon.types[index_mask]
diff --git a/cura/LayerPolygon.py b/cura/LayerPolygon.py
index 072d5f94f5..a62083945b 100644
--- a/cura/LayerPolygon.py
+++ b/cura/LayerPolygon.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2017 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
@@ -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)
@@ -61,19 +61,19 @@ class LayerPolygon:
# When type is used as index returns true if type == LayerPolygon.InfillType or type == LayerPolygon.SkinType or type == LayerPolygon.SupportInfillType
# Should be generated in better way, not hardcoded.
- self._isInfillOrSkinTypeMap = numpy.array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1], dtype=numpy.bool)
+ self._isInfillOrSkinTypeMap = numpy.array([0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0], dtype = numpy.bool)
self._build_cache_line_mesh_mask = None # type: Optional[numpy.ndarray]
self._build_cache_needed_points = None # type: Optional[numpy.ndarray]
def buildCache(self) -> None:
# For the line mesh we do not draw Infill or Jumps. Therefore those lines are filtered out.
- self._build_cache_line_mesh_mask = numpy.ones(self._jump_mask.shape, dtype=bool)
+ self._build_cache_line_mesh_mask = numpy.ones(self._jump_mask.shape, dtype = bool)
mesh_line_count = numpy.sum(self._build_cache_line_mesh_mask)
self._index_begin = 0
self._index_end = mesh_line_count
- self._build_cache_needed_points = numpy.ones((len(self._types), 2), dtype=numpy.bool)
+ self._build_cache_needed_points = numpy.ones((len(self._types), 2), dtype = numpy.bool)
# Only if the type of line segment changes do we need to add an extra vertex to change colors
self._build_cache_needed_points[1:, 0][:, numpy.newaxis] = self._types[1:] != self._types[:-1]
# Mark points as unneeded if they are of types we don't want in the line mesh according to the calculated mask
@@ -136,9 +136,9 @@ class LayerPolygon:
self._index_begin += index_offset
self._index_end += index_offset
- indices[self._index_begin:self._index_end, :] = numpy.arange(self._index_end-self._index_begin, dtype=numpy.int32).reshape((-1, 1))
+ indices[self._index_begin:self._index_end, :] = numpy.arange(self._index_end-self._index_begin, dtype = numpy.int32).reshape((-1, 1))
# When the line type changes the index needs to be increased by 2.
- indices[self._index_begin:self._index_end, :] += numpy.cumsum(needed_points_list[line_mesh_mask.ravel(), 0], dtype=numpy.int32).reshape((-1, 1))
+ indices[self._index_begin:self._index_end, :] += numpy.cumsum(needed_points_list[line_mesh_mask.ravel(), 0], dtype = numpy.int32).reshape((-1, 1))
# Each line segment goes from it's starting point p to p+1, offset by the vertex index.
# The -1 is to compensate for the neccecarily True value of needed_points_list[0,0] which causes an unwanted +1 in cumsum above.
indices[self._index_begin:self._index_end, :] += numpy.array([self._vertex_begin - 1, self._vertex_begin])
@@ -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/MachineErrorChecker.py b/cura/Machines/MachineErrorChecker.py
index fb11123af6..964331909c 100644
--- a/cura/Machines/MachineErrorChecker.py
+++ b/cura/Machines/MachineErrorChecker.py
@@ -127,7 +127,7 @@ class MachineErrorChecker(QObject):
# Populate the (stack, key) tuples to check
self._stacks_and_keys_to_check = deque()
- for stack in [global_stack] + list(global_stack.extruders.values()):
+ for stack in global_stack.extruders.values():
for key in stack.getAllKeys():
self._stacks_and_keys_to_check.append((stack, key))
@@ -168,7 +168,7 @@ class MachineErrorChecker(QObject):
if validator_type:
validator = validator_type(key)
validation_state = validator(stack)
- if validation_state in (ValidatorState.Exception, ValidatorState.MaximumError, ValidatorState.MinimumError):
+ if validation_state in (ValidatorState.Exception, ValidatorState.MaximumError, ValidatorState.MinimumError, ValidatorState.Invalid):
# Finish
self._setResult(True)
return
diff --git a/cura/Machines/MaterialManager.py b/cura/Machines/MaterialManager.py
index 634f1ba2bd..90012325c8 100644
--- a/cura/Machines/MaterialManager.py
+++ b/cura/Machines/MaterialManager.py
@@ -93,7 +93,7 @@ class MaterialManager(QObject):
self._container_registry.findContainersMetadata(type = "material") if
metadata.get("GUID")} # type: Dict[str, Dict[str, Any]]
- self._material_group_map = dict() # type: Dict[str, MaterialGroup]
+ self._material_group_map = dict()
# Map #1
# root_material_id -> MaterialGroup
@@ -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)
@@ -118,7 +120,7 @@ class MaterialManager(QObject):
# Map #1.5
# GUID -> material group list
- self._guid_material_groups_map = defaultdict(list) # type: Dict[str, List[MaterialGroup]]
+ self._guid_material_groups_map = defaultdict(list)
for root_material_id, material_group in self._material_group_map.items():
guid = material_group.root_material_node.getMetaDataEntry("GUID", "")
self._guid_material_groups_map[guid].append(material_group)
@@ -200,7 +202,7 @@ class MaterialManager(QObject):
# Map #4
# "machine" -> "nozzle name" -> "buildplate name" -> "root material ID" -> specific material InstanceContainer
- self._diameter_machine_nozzle_buildplate_material_map = dict() # type: Dict[str, Dict[str, MaterialNode]]
+ self._diameter_machine_nozzle_buildplate_material_map = dict()
for material_metadata in material_metadatas.values():
self.__addMaterialMetadataIntoLookupTree(material_metadata)
diff --git a/cura/Machines/Models/DiscoveredPrintersModel.py b/cura/Machines/Models/DiscoveredPrintersModel.py
new file mode 100644
index 0000000000..a1b68ee1ae
--- /dev/null
+++ b/cura/Machines/Models/DiscoveredPrintersModel.py
@@ -0,0 +1,264 @@
+# 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()
+
+ # 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:
+ from cura.CuraApplication import CuraApplication
+ results = CuraApplication.getInstance().getContainerRegistry().findDefinitionContainersMetadata(name = machine_type_name)
+ return len(results) > 0
+
+ # Human readable machine type string
+ @pyqtProperty(str, notify = machineTypeChanged)
+ def readableMachineType(self) -> str:
+ from cura.CuraApplication import CuraApplication
+ machine_manager = CuraApplication.getInstance().getMachineManager()
+ # In NetworkOutputDevice, 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 self._hasHumanReadableMachineTypeName(self._machine_type):
+ readable_type = self._machine_type
+ else:
+ readable_type = self._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:
+ if self._hasHumanReadableMachineTypeName(self._machine_type):
+ readable_type = self._machine_type
+ else:
+ readable_type = self._getMachineTypeNameFromId(self._machine_type)
+ return not readable_type
+
+ def _getMachineTypeNameFromId(self, machine_type_id: str) -> str:
+ machine_type_name = ""
+ from cura.CuraApplication import CuraApplication
+ results = CuraApplication.getInstance().getContainerRegistry().findDefinitionContainersMetadata(id = machine_type_id)
+ if results:
+ machine_type_name = results[0]["name"]
+ return machine_type_name
+
+ @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 b849b16169..7da4f4f0d6 100644
--- a/cura/Machines/QualityManager.py
+++ b/cura/Machines/QualityManager.py
@@ -202,9 +202,6 @@ class QualityManager(QObject):
def getQualityGroups(self, machine: "GlobalStack") -> Dict[str, QualityGroup]:
machine_definition_id = getMachineDefinitionIDForQualitySearch(machine.definition)
- # This determines if we should only get the global qualities for the global stack and skip the global qualities for the extruder stacks
- has_machine_specific_qualities = machine.getHasMachineQuality()
-
# To find the quality container for the GlobalStack, check in the following fall-back manner:
# (1) the machine-specific node
# (2) the generic node
@@ -442,7 +439,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/Machines/VariantManager.py b/cura/Machines/VariantManager.py
index eaaa9fc5f0..55c008ff40 100644
--- a/cura/Machines/VariantManager.py
+++ b/cura/Machines/VariantManager.py
@@ -85,7 +85,14 @@ class VariantManager:
if variant_definition not in self._machine_to_buildplate_dict_map:
self._machine_to_buildplate_dict_map[variant_definition] = OrderedDict()
- variant_container = self._container_registry.findContainers(type = "variant", id = variant_metadata["id"])[0]
+ try:
+ variant_container = self._container_registry.findContainers(type = "variant", id = variant_metadata["id"])[0]
+ except IndexError as e:
+ # It still needs to break, but we want to know what variant ID made it break.
+ msg = "Unable to find build plate variant with the id [%s]" % variant_metadata["id"]
+ Logger.logException("e", msg)
+ raise IndexError(msg)
+
buildplate_type = variant_container.getProperty("machine_buildplate_type", "value")
if buildplate_type not in self._machine_to_buildplate_dict_map[variant_definition]:
self._machine_to_variant_dict_map[variant_definition][buildplate_type] = dict()
diff --git a/cura/MultiplyObjectsJob.py b/cura/MultiplyObjectsJob.py
index e71bbf6668..5c25f70336 100644
--- a/cura/MultiplyObjectsJob.py
+++ b/cura/MultiplyObjectsJob.py
@@ -2,10 +2,12 @@
# Cura is released under the terms of the LGPLv3 or higher.
import copy
+from typing import List
from UM.Job import Job
from UM.Operations.GroupedOperation import GroupedOperation
from UM.Message import Message
+from UM.Scene.SceneNode import SceneNode
from UM.i18n import i18nCatalog
i18n_catalog = i18nCatalog("cura")
@@ -23,7 +25,7 @@ class MultiplyObjectsJob(Job):
self._count = count
self._min_offset = min_offset
- def run(self):
+ def run(self) -> None:
status_message = Message(i18n_catalog.i18nc("@info:status", "Multiplying and placing objects"), lifetime=0,
dismissable=False, progress=0, title = i18n_catalog.i18nc("@info:title", "Placing Objects"))
status_message.show()
@@ -33,13 +35,15 @@ class MultiplyObjectsJob(Job):
current_progress = 0
global_container_stack = Application.getInstance().getGlobalContainerStack()
+ if global_container_stack is None:
+ return # We can't do anything in this case.
machine_width = global_container_stack.getProperty("machine_width", "value")
machine_depth = global_container_stack.getProperty("machine_depth", "value")
root = scene.getRoot()
scale = 0.5
arranger = Arrange.create(x = machine_width, y = machine_depth, scene_root = root, scale = scale, min_offset = self._min_offset)
- processed_nodes = []
+ processed_nodes = [] # type: List[SceneNode]
nodes = []
not_fit_count = 0
@@ -67,7 +71,11 @@ class MultiplyObjectsJob(Job):
new_node = copy.deepcopy(node)
solution_found = False
if not node_too_big:
- solution_found = arranger.findNodePlacement(new_node, offset_shape_arr, hull_shape_arr)
+ if offset_shape_arr is not None and hull_shape_arr is not None:
+ solution_found = arranger.findNodePlacement(new_node, offset_shape_arr, hull_shape_arr)
+ else:
+ # The node has no shape, so no need to arrange it. The solution is simple: Do nothing.
+ solution_found = True
if node_too_big or not solution_found:
found_solution_for_all = False
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/AuthorizationRequestHandler.py b/cura/OAuth2/AuthorizationRequestHandler.py
index 66ecfc2787..83b94ed586 100644
--- a/cura/OAuth2/AuthorizationRequestHandler.py
+++ b/cura/OAuth2/AuthorizationRequestHandler.py
@@ -25,6 +25,10 @@ class AuthorizationRequestHandler(BaseHTTPRequestHandler):
self.authorization_callback = None # type: Optional[Callable[[AuthenticationResponse], None]]
self.verification_code = None # type: Optional[str]
+ # CURA-6609: Some browser seems to issue a HEAD instead of GET request as the callback.
+ def do_HEAD(self) -> None:
+ self.do_GET()
+
def do_GET(self) -> None:
# Extract values from the query string.
parsed_url = urlparse(self.path)
diff --git a/cura/OAuth2/AuthorizationService.py b/cura/OAuth2/AuthorizationService.py
index 1f20f2d87f..95ea47112e 100644
--- a/cura/OAuth2/AuthorizationService.py
+++ b/cura/OAuth2/AuthorizationService.py
@@ -2,15 +2,19 @@
# Cura is released under the terms of the LGPLv3 or higher.
import json
-import webbrowser
from datetime import datetime, timedelta
+import os
from typing import Optional, TYPE_CHECKING
from urllib.parse import urlencode
+
import requests.exceptions
+from PyQt5.QtCore import QUrl
+from PyQt5.QtGui import QDesktopServices
from UM.Logger import Logger
from UM.Message import Message
+from UM.Platform import Platform
from UM.Signal import Signal
from cura.OAuth2.LocalAuthorizationServer import LocalAuthorizationServer
@@ -34,6 +38,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 +74,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 +90,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 +98,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,6 +136,7 @@ class AuthorizationService:
self._storeAuthData(response)
self.onAuthStateChanged.emit(logged_in = True)
else:
+ 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)
@@ -154,7 +167,7 @@ class AuthorizationService:
})
# Open the authorization page in a new browser window.
- webbrowser.open_new("{}?{}".format(self._auth_url, query_string))
+ QDesktopServices.openUrl(QUrl("{}?{}".format(self._auth_url, query_string)))
# Start a local web server to receive the callback URL on.
self._server.start(verification_code)
@@ -194,6 +207,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 +220,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/OAuth2/LocalAuthorizationServer.py b/cura/OAuth2/LocalAuthorizationServer.py
index 25b2435012..a80b0deb28 100644
--- a/cura/OAuth2/LocalAuthorizationServer.py
+++ b/cura/OAuth2/LocalAuthorizationServer.py
@@ -63,6 +63,10 @@ class LocalAuthorizationServer:
Logger.log("d", "Stopping local oauth2 web server...")
if self._web_server:
- self._web_server.server_close()
+ try:
+ self._web_server.server_close()
+ except OSError:
+ # OS error can happen if the socket was already closed. We really don't care about that case.
+ pass
self._web_server = None
self._web_server_thread = None
diff --git a/cura/ObjectsModel.py b/cura/ObjectsModel.py
deleted file mode 100644
index f9f923b31d..0000000000
--- a/cura/ObjectsModel.py
+++ /dev/null
@@ -1,100 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-
-from PyQt5.QtCore import QTimer
-
-from UM.Application import Application
-from UM.Qt.ListModel import ListModel
-from UM.Scene.Camera import Camera
-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")
-
-
-## Keep track of all objects in the project
-class ObjectsModel(ListModel):
- def __init__(self):
- super().__init__()
-
- Application.getInstance().getController().getScene().sceneChanged.connect(self._updateSceneDelayed)
- Application.getInstance().getPreferences().preferenceChanged.connect(self._updateDelayed)
-
- self._update_timer = QTimer()
- self._update_timer.setInterval(200)
- self._update_timer.setSingleShot(True)
- self._update_timer.timeout.connect(self._update)
-
- self._build_plate_number = -1
-
- def setActiveBuildPlate(self, nr):
- if self._build_plate_number != nr:
- self._build_plate_number = nr
- self._update()
-
- def _updateSceneDelayed(self, source):
- if not isinstance(source, Camera):
- self._update_timer.start()
-
- def _updateDelayed(self, *args):
- self._update_timer.start()
-
- def _update(self, *args):
- 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)
-
- for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()):
- 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"):
- 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
- node_build_plate_number = node.callDecoration("getBuildPlateNumber")
- if filter_current_build_plate and node_build_plate_number != active_build_plate_number:
- continue
-
- if not node.callDecoration("isGroup"):
- name = node.getName()
-
- else:
- name = catalog.i18nc("@label", "Group #{group_nr}").format(group_nr = str(group_nr))
- group_nr += 1
-
- if hasattr(node, "isOutsideBuildArea"):
- is_outside_build_area = node.isOutsideBuildArea()
- else:
- is_outside_build_area = False
-
- #check if we already have an instance of the object based on name
- name_count_dict[name] += 1
- name_count = name_count_dict[name]
-
- if name_count > 1:
- name = "{0}({1})".format(name, name_count-1)
- node.setName(name)
-
- nodes.append({
- "name": name,
- "isSelected": Selection.isSelected(node),
- "isOutsideBuildArea": is_outside_build_area,
- "buildPlateNumber": node_build_plate_number,
- "node": node
- })
-
- nodes = sorted(nodes, key=lambda n: n["name"])
- self.setItems(nodes)
-
- self.itemsChanged.emit()
-
- @staticmethod
- def createObjectsModel():
- return ObjectsModel()
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/PlatformPhysics.py b/cura/PlatformPhysics.py
index 8fffac4501..d084c0dbf4 100755
--- a/cura/PlatformPhysics.py
+++ b/cura/PlatformPhysics.py
@@ -49,18 +49,20 @@ class PlatformPhysics:
return
root = self._controller.getScene().getRoot()
+ build_volume = Application.getInstance().getBuildVolume()
+ build_volume.updateNodeBoundaryCheck()
# Keep a list of nodes that are moving. We use this so that we don't move two intersecting objects in the
# same direction.
transformed_nodes = []
- # We try to shuffle all the nodes to prevent "locked" situations, where iteration B inverts iteration A.
- # By shuffling the order of the nodes, this might happen a few times, but at some point it will resolve.
nodes = list(BreadthFirstIterator(root))
# Only check nodes inside build area.
nodes = [node for node in nodes if (hasattr(node, "_outside_buildarea") and not node._outside_buildarea)]
+ # We try to shuffle all the nodes to prevent "locked" situations, where iteration B inverts iteration A.
+ # By shuffling the order of the nodes, this might happen a few times, but at some point it will resolve.
random.shuffle(nodes)
for node in nodes:
if node is root or not isinstance(node, SceneNode) or node.getBoundingBox() is None:
@@ -76,7 +78,7 @@ class PlatformPhysics:
move_vector = move_vector.set(y = -bbox.bottom + z_offset)
# If there is no convex hull for the node, start calculating it and continue.
- if not node.getDecorator(ConvexHullDecorator):
+ if not node.getDecorator(ConvexHullDecorator) and not node.callDecoration("isNonPrintingMesh"):
node.addDecorator(ConvexHullDecorator())
# only push away objects if this node is a printing mesh
@@ -160,7 +162,6 @@ class PlatformPhysics:
op.push()
# After moving, we have to evaluate the boundary checks for nodes
- build_volume = Application.getInstance().getBuildVolume()
build_volume.updateNodeBoundaryCheck()
def _onToolOperationStarted(self, tool):
diff --git a/cura/PreviewPass.py b/cura/PreviewPass.py
index befb52ee5e..8465af4b83 100644
--- a/cura/PreviewPass.py
+++ b/cura/PreviewPass.py
@@ -1,7 +1,8 @@
# Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
-from typing import Optional, TYPE_CHECKING
+from typing import Optional, TYPE_CHECKING, cast
+
from UM.Application import Application
from UM.Resources import Resources
@@ -12,6 +13,7 @@ from UM.View.RenderBatch import RenderBatch
from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
+from cura.Scene.CuraSceneNode import CuraSceneNode
if TYPE_CHECKING:
from UM.View.GL.ShaderProgram import ShaderProgram
@@ -44,9 +46,9 @@ class PreviewPass(RenderPass):
self._renderer = Application.getInstance().getRenderer()
- self._shader = None #type: Optional[ShaderProgram]
- self._non_printing_shader = None #type: Optional[ShaderProgram]
- self._support_mesh_shader = None #type: Optional[ShaderProgram]
+ self._shader = None # type: Optional[ShaderProgram]
+ self._non_printing_shader = None # type: Optional[ShaderProgram]
+ self._support_mesh_shader = None # type: Optional[ShaderProgram]
self._scene = Application.getInstance().getController().getScene()
# Set the camera to be used by this render pass
@@ -83,30 +85,31 @@ class PreviewPass(RenderPass):
batch_support_mesh = RenderBatch(self._support_mesh_shader)
# Fill up the batch with objects that can be sliced.
- 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.isVisible():
- per_mesh_stack = node.callDecoration("getStack")
- if node.callDecoration("isNonThumbnailVisibleMesh"):
- # Non printing mesh
- continue
- elif per_mesh_stack is not None and per_mesh_stack.getProperty("support_mesh", "value"):
- # Support mesh
- uniforms = {}
- shade_factor = 0.6
- diffuse_color = node.getDiffuseColor()
- diffuse_color2 = [
- diffuse_color[0] * shade_factor,
- diffuse_color[1] * shade_factor,
- diffuse_color[2] * shade_factor,
- 1.0]
- uniforms["diffuse_color"] = prettier_color(diffuse_color)
- uniforms["diffuse_color_2"] = diffuse_color2
- batch_support_mesh.addItem(node.getWorldTransformation(), node.getMeshData(), uniforms = uniforms)
- else:
- # Normal scene node
- uniforms = {}
- uniforms["diffuse_color"] = prettier_color(node.getDiffuseColor())
- batch.addItem(node.getWorldTransformation(), node.getMeshData(), uniforms = uniforms)
+ for node in DepthFirstIterator(self._scene.getRoot()):
+ if hasattr(node, "_outside_buildarea") and not getattr(node, "_outside_buildarea"):
+ if node.callDecoration("isSliceable") and node.getMeshData() and node.isVisible():
+ per_mesh_stack = node.callDecoration("getStack")
+ if node.callDecoration("isNonThumbnailVisibleMesh"):
+ # Non printing mesh
+ continue
+ elif per_mesh_stack is not None and per_mesh_stack.getProperty("support_mesh", "value"):
+ # Support mesh
+ uniforms = {}
+ shade_factor = 0.6
+ diffuse_color = cast(CuraSceneNode, node).getDiffuseColor()
+ diffuse_color2 = [
+ diffuse_color[0] * shade_factor,
+ diffuse_color[1] * shade_factor,
+ diffuse_color[2] * shade_factor,
+ 1.0]
+ uniforms["diffuse_color"] = prettier_color(diffuse_color)
+ uniforms["diffuse_color_2"] = diffuse_color2
+ batch_support_mesh.addItem(node.getWorldTransformation(), node.getMeshData(), uniforms = uniforms)
+ else:
+ # Normal scene node
+ uniforms = {}
+ uniforms["diffuse_color"] = prettier_color(cast(CuraSceneNode, node).getDiffuseColor())
+ batch.addItem(node.getWorldTransformation(), node.getMeshData(), uniforms = uniforms)
self.bind()
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..c160459776 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):
@@ -54,7 +55,7 @@ class GenericOutputController(PrinterOutputController):
self._preheat_hotends_timer.stop()
for extruder in self._preheat_hotends:
extruder.updateIsPreheating(False)
- self._preheat_hotends = set() # type: Set[ExtruderOutputModel]
+ self._preheat_hotends = set()
def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed) -> None:
self._output_device.sendCommand("G91")
@@ -158,7 +159,7 @@ class GenericOutputController(PrinterOutputController):
def _onPreheatHotendsTimerFinished(self) -> None:
for extruder in self._preheat_hotends:
self.setTargetHotendTemperature(extruder.getPrinter(), extruder.getPosition(), 0)
- self._preheat_hotends = set() #type: Set[ExtruderOutputModel]
+ self._preheat_hotends = set()
# Cancel any ongoing preheating timers, without setting back the temperature to 0
# This can be used eg at the start of a print
@@ -166,7 +167,7 @@ class GenericOutputController(PrinterOutputController):
if self._preheat_hotends_timer.isActive():
for extruder in self._preheat_hotends:
extruder.updateIsPreheating(False)
- self._preheat_hotends = set() #type: Set[ExtruderOutputModel]
+ self._preheat_hotends = set()
self._preheat_hotends_timer.stop()
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 74%
rename from cura/PrinterOutput/ExtruderConfigurationModel.py
rename to cura/PrinterOutput/Models/ExtruderConfigurationModel.py
index da0ad6b0b2..04a3c95afd 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):
@@ -25,7 +25,7 @@ class ExtruderConfigurationModel(QObject):
return self._position
def setMaterial(self, material: Optional[MaterialOutputModel]) -> None:
- if self._hotend_id != material:
+ if self._material != material:
self._material = material
self.extruderConfigurationChanged.emit()
@@ -33,7 +33,7 @@ class ExtruderConfigurationModel(QObject):
def activeMaterial(self) -> Optional[MaterialOutputModel]:
return self._material
- @pyqtProperty(QObject, fset=setMaterial, notify=extruderConfigurationChanged)
+ @pyqtProperty(QObject, fset = setMaterial, notify = extruderConfigurationChanged)
def material(self) -> Optional[MaterialOutputModel]:
return self._material
@@ -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 72%
rename from cura/PrinterOutput/ConfigurationModel.py
rename to cura/PrinterOutput/Models/PrinterConfigurationModel.py
index 312e3cffb0..52c7b6f960 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()
@@ -58,6 +58,14 @@ class ConfigurationModel(QObject):
return False
return self._printer_type != ""
+ def hasAnyMaterialLoaded(self) -> bool:
+ if not self.isValid():
+ return False
+ for configuration in self._extruder_configurations:
+ if configuration.activeMaterial and configuration.activeMaterial.type != "empty":
+ return True
+ return False
+
def __str__(self):
message_chunks = []
message_chunks.append("Printer type: " + self._printer_type)
@@ -71,7 +79,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 +110,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..a1a23201fb
--- /dev/null
+++ b/cura/PrinterOutput/Models/PrinterOutputModel.py
@@ -0,0 +1,340 @@
+# 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, TYPE_CHECKING
+from UM.Math.Vector import Vector
+from cura.PrinterOutput.Peripheral import Peripheral
+from cura.PrinterOutput.Models.PrinterConfigurationModel import PrinterConfigurationModel
+from cura.PrinterOutput.Models.ExtruderOutputModel import ExtruderOutputModel
+from UM.Logger import Logger
+
+if TYPE_CHECKING:
+ 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._active_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._peripherals = [] # type: List[Peripheral]
+
+ self._active_printer_configuration.extruderConfigurations = [extruder.extruderConfiguration for extruder in
+ self._extruders]
+ self._active_printer_configuration.configurationChanged.connect(self.configurationChanged)
+ self._available_printer_configurations = [] # type: List[PrinterConfigurationModel]
+
+ 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._active_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._active_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 active configuration (material, variant and buildplate) of the current printer
+ @pyqtProperty(QObject, notify = configurationChanged)
+ def printerConfiguration(self) -> Optional[PrinterConfigurationModel]:
+ if self._active_printer_configuration.isValid():
+ return self._active_printer_configuration
+ return None
+
+ peripheralsChanged = pyqtSignal()
+
+ @pyqtProperty(str, notify = peripheralsChanged)
+ def peripherals(self) -> str:
+ return ", ".join([peripheral.name for peripheral in self._peripherals])
+
+ def addPeripheral(self, peripheral: Peripheral) -> None:
+ self._peripherals.append(peripheral)
+ self.peripheralsChanged.emit()
+
+ def removePeripheral(self, peripheral: Peripheral) -> None:
+ self._peripherals.remove(peripheral)
+ self.peripheralsChanged.emit()
+
+ availableConfigurationsChanged = pyqtSignal()
+
+ # The availableConfigurations are configuration options that a printer can switch to, but doesn't currently have
+ # active (eg; Automatic tool changes, material loaders, etc).
+ @pyqtProperty("QVariantList", notify = availableConfigurationsChanged)
+ def availableConfigurations(self) -> List[PrinterConfigurationModel]:
+ return self._available_printer_configurations
+
+ def addAvailableConfiguration(self, new_configuration: PrinterConfigurationModel) -> None:
+ if new_configuration not in self._available_printer_configurations:
+ self._available_printer_configurations.append(new_configuration)
+ self.availableConfigurationsChanged.emit()
+
+ def removeAvailableConfiguration(self, config_to_remove: PrinterConfigurationModel) -> None:
+ try:
+ self._available_printer_configurations.remove(config_to_remove)
+ except ValueError:
+ Logger.log("w", "Unable to remove configuration that isn't in the list of available configurations")
+ else:
+ self.availableConfigurationsChanged.emit()
+
+ def setAvailableConfigurations(self, new_configurations: List[PrinterConfigurationModel]) -> None:
+ self._available_printer_configurations = new_configurations
+ self.availableConfigurationsChanged.emit()
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..392df7bded 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
@@ -33,8 +35,6 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
def __init__(self, device_id, address: str, properties: Dict[bytes, bytes], connection_type: ConnectionType = ConnectionType.NetworkConnection, parent: QObject = None) -> None:
super().__init__(device_id = device_id, connection_type = connection_type, parent = parent)
self._manager = None # type: Optional[QNetworkAccessManager]
- self._last_manager_create_time = None # type: Optional[float]
- self._recreate_network_manager_time = 30
self._timeout_time = 10 # After how many seconds of no response should a timeout occur?
self._last_response_time = None # type: Optional[float]
@@ -58,8 +58,8 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
self._gcode = [] # type: List[str]
self._connection_state_before_timeout = None # type: Optional[ConnectionState]
- def requestWrite(self, nodes: List[SceneNode], file_name: Optional[str] = None, limit_mimetypes: bool = False,
- file_handler: Optional[FileHandler] = None, **kwargs: str) -> None:
+ def requestWrite(self, nodes: List["SceneNode"], file_name: Optional[str] = None, limit_mimetypes: bool = False,
+ file_handler: Optional["FileHandler"] = None, filter_by_machine: bool = False, **kwargs) -> None:
raise NotImplementedError("requestWrite needs to be implemented")
def setAuthenticationState(self, authentication_state: AuthState) -> None:
@@ -131,12 +131,6 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
self.setConnectionState(ConnectionState.Closed)
- # We need to check if the manager needs to be re-created. If we don't, we get some issues when OSX goes to
- # sleep.
- if time_since_last_response > self._recreate_network_manager_time:
- if self._last_manager_create_time is None or time() - self._last_manager_create_time > self._recreate_network_manager_time:
- self._createNetworkManager()
- assert(self._manager is not None)
elif self._connection_state == ConnectionState.Closed:
# Go out of timeout.
if self._connection_state_before_timeout is not None: # sanity check, but it should never be None here
@@ -315,16 +309,30 @@ class NetworkedPrinterOutputDevice(PrinterOutputDevice):
self._manager = QNetworkAccessManager()
self._manager.finished.connect(self._handleOnFinished)
- self._last_manager_create_time = time()
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/Peripheral.py b/cura/PrinterOutput/Peripheral.py
new file mode 100644
index 0000000000..2693b82c36
--- /dev/null
+++ b/cura/PrinterOutput/Peripheral.py
@@ -0,0 +1,16 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+
+## Data class that represents a peripheral for a printer.
+#
+# Output device plug-ins may specify that the printer has a certain set of
+# peripherals. This set is then possibly shown in the interface of the monitor
+# stage.
+class Peripheral:
+ ## Constructs the peripheral.
+ # \param type A unique ID for the type of peripheral.
+ # \param name A human-readable name for the peripheral.
+ def __init__(self, peripheral_type: str, name: str) -> None:
+ self.type = peripheral_type
+ self.name = name
diff --git a/cura/PrinterOutput/PrintJobOutputModel.py b/cura/PrinterOutput/PrintJobOutputModel.py
index fb163ef065..df66412df3 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 instead", 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..31daacbccc
--- /dev/null
+++ b/cura/PrinterOutput/PrinterOutputDevice.py
@@ -0,0 +1,266 @@
+# 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, filter_by_machine: bool = False, **kwargs) -> 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:
+ all_configurations = set()
+ for printer in self._printers:
+ if printer.printerConfiguration is not None and printer.printerConfiguration.hasAnyMaterialLoaded():
+ all_configurations.add(printer.printerConfiguration)
+ all_configurations.update(printer.availableConfigurations)
+ new_configurations = sorted(all_configurations, key = lambda config: config.printerType)
+ if new_configurations != self._unique_configurations:
+ self._unique_configurations = new_configurations
+ 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)
+ printer.availableConfigurationsChanged.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..87020ce2d0 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 instead", 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..51e563410c 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 instead", 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..2d8224eecc 100644
--- a/cura/Scene/ConvexHullDecorator.py
+++ b/cura/Scene/ConvexHullDecorator.py
@@ -60,13 +60,15 @@ 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)
+
+ per_object_stack = node.callDecoration("getStack")
+ if per_object_stack:
+ per_object_stack.propertyChanged.connect(self._onSettingValueChanged)
self._onChanged()
@@ -78,7 +80,8 @@ class ConvexHullDecorator(SceneNodeDecorator):
def getConvexHull(self) -> Optional[Polygon]:
if self._node is None:
return None
-
+ if self._node.callDecoration("isNonPrintingMesh"):
+ return None
hull = self._compute2DConvexHull()
if self._global_stack and self._node is not None and hull is not None:
@@ -108,7 +111,8 @@ class ConvexHullDecorator(SceneNodeDecorator):
def getConvexHullHead(self) -> Optional[Polygon]:
if self._node is None:
return None
-
+ if self._node.callDecoration("isNonPrintingMesh"):
+ return None
if self._global_stack:
if self._global_stack.getProperty("print_sequence", "value") == "one_at_a_time" and not self.hasGroupAsParent(self._node):
head_with_fans = self._compute2DConvexHeadMin()
@@ -124,6 +128,9 @@ class ConvexHullDecorator(SceneNodeDecorator):
def getConvexHullBoundary(self) -> Optional[Polygon]:
if self._node is None:
return None
+
+ if self._node.callDecoration("isNonPrintingMesh"):
+ return None
if self._global_stack:
if self._global_stack.getProperty("print_sequence", "value") == "one_at_a_time" and not self.hasGroupAsParent(self._node):
@@ -400,4 +407,4 @@ class ConvexHullDecorator(SceneNodeDecorator):
## Settings that change the convex hull.
#
# If these settings change, the convex hull should be recalculated.
- _influencing_settings = {"xy_offset", "xy_offset_layer_0", "mold_enabled", "mold_width"}
+ _influencing_settings = {"xy_offset", "xy_offset_layer_0", "mold_enabled", "mold_width", "anti_overhang_mesh", "infill_mesh", "cutting_mesh"}
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..4215c8fa84 100644
--- a/cura/Scene/CuraSceneNode.py
+++ b/cura/Scene/CuraSceneNode.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 copy import deepcopy
@@ -6,13 +6,14 @@ from typing import cast, Dict, List, Optional
from UM.Application import Application
from UM.Math.AxisAlignedBox import AxisAlignedBox
-from UM.Math.Polygon import Polygon #For typing.
+from UM.Math.Polygon import Polygon # For typing.
from UM.Scene.SceneNode import SceneNode
-from UM.Scene.SceneNodeDecorator import SceneNodeDecorator #To cast the deepcopy of every decorator back to SceneNodeDecorator.
+from UM.Scene.SceneNodeDecorator import SceneNodeDecorator # To cast the deepcopy of every decorator back to SceneNodeDecorator.
+
+import cura.CuraApplication # To get the build plate.
+from cura.Settings.ExtruderStack import ExtruderStack # For typing.
+from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator # For per-object settings.
-import cura.CuraApplication #To get the build plate.
-from cura.Settings.ExtruderStack import ExtruderStack #For typing.
-from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator #For per-object settings.
## Scene nodes that are models are only seen when selecting the corresponding build plate
# Note that many other nodes can just be UM SceneNode objects.
@@ -20,7 +21,7 @@ class CuraSceneNode(SceneNode):
def __init__(self, parent: Optional["SceneNode"] = None, visible: bool = True, name: str = "", no_setting_override: bool = False) -> None:
super().__init__(parent = parent, visible = visible, name = name)
if not no_setting_override:
- self.addDecorator(SettingOverrideDecorator()) # now we always have a getActiveExtruderPosition, unless explicitly disabled
+ self.addDecorator(SettingOverrideDecorator()) # Now we always have a getActiveExtruderPosition, unless explicitly disabled
self._outside_buildarea = False
def setOutsideBuildArea(self, new_value: bool) -> None:
@@ -58,7 +59,7 @@ class CuraSceneNode(SceneNode):
if extruder_id is not None:
if extruder_id == extruder.getId():
return extruder
- else: # If the id is unknown, then return the extruder in the position 0
+ else: # If the id is unknown, then return the extruder in the position 0
try:
if extruder.getMetaDataEntry("position", default = "0") == "0": # Check if the position is zero
return extruder
@@ -85,24 +86,14 @@ class CuraSceneNode(SceneNode):
1.0
]
- ## Return if the provided bbox collides with the bbox of this scene node
- def collidesWithBbox(self, check_bbox: AxisAlignedBox) -> bool:
- bbox = self.getBoundingBox()
- if bbox is not None:
- # Mark the node as outside the build volume if the bounding box test fails.
- if check_bbox.intersectsBox(bbox) != AxisAlignedBox.IntersectionResult.FullIntersection:
- return True
-
- return False
-
## Return if any area collides with the convex hull of this scene node
- def collidesWithArea(self, areas: List[Polygon]) -> bool:
+ def collidesWithAreas(self, areas: List[Polygon]) -> bool:
convex_hull = self.callDecoration("getConvexHull")
if convex_hull:
if not convex_hull.isValid():
return False
- # Check for collisions between disallowed areas and the object
+ # Check for collisions between provided areas and the object
for area in areas:
overlap = convex_hull.intersectsPolygon(area)
if overlap is None:
@@ -112,21 +103,24 @@ 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())
+ self._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 = AxisAlignedBox(minimum=position, maximum=position)
- 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/Scene/GCodeListDecorator.py b/cura/Scene/GCodeListDecorator.py
index d3dadb3f23..6c52fb89bf 100644
--- a/cura/Scene/GCodeListDecorator.py
+++ b/cura/Scene/GCodeListDecorator.py
@@ -1,11 +1,18 @@
from UM.Scene.SceneNodeDecorator import SceneNodeDecorator
-from typing import List
+from typing import List, Optional
class GCodeListDecorator(SceneNodeDecorator):
def __init__(self) -> None:
super().__init__()
self._gcode_list = [] # type: List[str]
+ self._filename = None # type: Optional[str]
+
+ def getGcodeFileName(self) -> Optional[str]:
+ return self._filename
+
+ def setGcodeFileName(self, filename: str) -> None:
+ self._filename = filename
def getGCodeList(self) -> List[str]:
return self._gcode_list
diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py
index 2422fa3b21..9f20c8ccfa 100644
--- a/cura/Settings/ContainerManager.py
+++ b/cura/Settings/ContainerManager.py
@@ -4,7 +4,7 @@
import os
import urllib.parse
import uuid
-from typing import Dict, Union, Any, TYPE_CHECKING, List
+from typing import Dict, Union, Any, TYPE_CHECKING, List, cast
from PyQt5.QtCore import QObject, QUrl
from PyQt5.QtWidgets import QMessageBox
@@ -438,7 +438,7 @@ class ContainerManager(QObject):
if not path:
return
- container_list = [n.getContainer() for n in quality_changes_group.getAllNodes() if n.getContainer() is not None]
+ container_list = [cast(InstanceContainer, n.getContainer()) for n in quality_changes_group.getAllNodes() if n.getContainer() is not None]
self._container_registry.exportQualityProfile(container_list, path, file_type)
__instance = None # type: ContainerManager
diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py
index dd7ed625d6..c1a9ba9ead 100644
--- a/cura/Settings/CuraContainerRegistry.py
+++ b/cura/Settings/CuraContainerRegistry.py
@@ -5,7 +5,7 @@ import os
import re
import configparser
-from typing import Any, cast, Dict, Optional
+from typing import Any, cast, Dict, Optional, List, Union
from PyQt5.QtWidgets import QMessageBox
from UM.Decorators import override
@@ -20,13 +20,14 @@ from UM.Logger import Logger
from UM.Message import Message
from UM.Platform import Platform
from UM.PluginRegistry import PluginRegistry # For getting the possible profile writers to write with.
-from UM.Util import parseBool
from UM.Resources import Resources
+from cura.ReaderWriters.ProfileWriter import ProfileWriter
from . import ExtruderStack
from . import GlobalStack
import cura.CuraApplication
+from cura.Settings.cura_empty_instance_containers import empty_quality_container
from cura.Machines.QualityManager import getMachineDefinitionIDForQualitySearch
from cura.ReaderWriters.ProfileReader import NoProfileException, ProfileReader
@@ -50,10 +51,10 @@ class CuraContainerRegistry(ContainerRegistry):
# This will also try to convert a ContainerStack to either Extruder or
# Global stack based on metadata information.
@override(ContainerRegistry)
- def addContainer(self, container):
+ def addContainer(self, container: ContainerInterface) -> None:
# Note: Intentional check with type() because we want to ignore subclasses
if type(container) == ContainerStack:
- container = self._convertContainerStack(container)
+ container = self._convertContainerStack(cast(ContainerStack, container))
if isinstance(container, InstanceContainer) and type(container) != type(self.getEmptyInstanceContainer()):
# Check against setting version of the definition.
@@ -61,7 +62,7 @@ class CuraContainerRegistry(ContainerRegistry):
actual_setting_version = int(container.getMetaDataEntry("setting_version", default = 0))
if required_setting_version != actual_setting_version:
Logger.log("w", "Instance container {container_id} is outdated. Its setting version is {actual_setting_version} but it should be {required_setting_version}.".format(container_id = container.getId(), actual_setting_version = actual_setting_version, required_setting_version = required_setting_version))
- return #Don't add.
+ return # Don't add.
super().addContainer(container)
@@ -71,9 +72,9 @@ class CuraContainerRegistry(ContainerRegistry):
# \param new_name \type{string} Base name, which may not be unique
# \param fallback_name \type{string} Name to use when (stripped) new_name is empty
# \return \type{string} Name that is unique for the specified type and name/id
- def createUniqueName(self, container_type, current_name, new_name, fallback_name):
+ def createUniqueName(self, container_type: str, current_name: str, new_name: str, fallback_name: str) -> str:
new_name = new_name.strip()
- num_check = re.compile("(.*?)\s*#\d+$").match(new_name)
+ num_check = re.compile(r"(.*?)\s*#\d+$").match(new_name)
if num_check:
new_name = num_check.group(1)
if new_name == "":
@@ -92,7 +93,7 @@ class CuraContainerRegistry(ContainerRegistry):
# Both the id and the name are checked, because they may not be the same and it is better if they are both unique
# \param container_type \type{string} Type of the container (machine, quality, ...)
# \param container_name \type{string} Name to check
- def _containerExists(self, container_type, container_name):
+ def _containerExists(self, container_type: str, container_name: str):
container_class = ContainerStack if container_type == "machine" else InstanceContainer
return self.findContainersMetadata(container_type = container_class, id = container_name, type = container_type, ignore_case = True) or \
@@ -100,16 +101,17 @@ class CuraContainerRegistry(ContainerRegistry):
## Exports an profile to a file
#
- # \param instance_ids \type{list} the IDs of the profiles to export.
+ # \param container_list \type{list} the containers to export
# \param file_name \type{str} the full path and filename to export to.
# \param file_type \type{str} the file type with the format " (*.)"
- def exportQualityProfile(self, container_list, file_name, file_type):
+ # \return True if the export succeeded, false otherwise.
+ def exportQualityProfile(self, container_list: List[InstanceContainer], file_name: str, file_type: str) -> bool:
# Parse the fileType to deduce what plugin can save the file format.
# fileType has the format " (*.)"
split = file_type.rfind(" (*.") # Find where the description ends and the extension starts.
if split < 0: # Not found. Invalid format.
Logger.log("e", "Invalid file format identifier %s", file_type)
- return
+ return False
description = file_type[:split]
extension = file_type[split + 4:-1] # Leave out the " (*." and ")".
if not file_name.endswith("." + extension): # Auto-fill the extension if the user did not provide any.
@@ -121,10 +123,12 @@ class CuraContainerRegistry(ContainerRegistry):
result = QMessageBox.question(None, catalog.i18nc("@title:window", "File Already Exists"),
catalog.i18nc("@label Don't translate the XML tag !", "The file {0} already exists. Are you sure you want to overwrite it?").format(file_name))
if result == QMessageBox.No:
- return
+ return False
profile_writer = self._findProfileWriter(extension, description)
try:
+ if profile_writer is None:
+ raise Exception("Unable to find a profile writer")
success = profile_writer.write(file_name, container_list)
except Exception as e:
Logger.log("e", "Failed to export profile to %s: %s", file_name, str(e))
@@ -132,23 +136,24 @@ class CuraContainerRegistry(ContainerRegistry):
lifetime = 0,
title = catalog.i18nc("@info:title", "Error"))
m.show()
- return
+ return False
if not success:
Logger.log("w", "Failed to export profile to %s: Writer plugin reported failure.", file_name)
m = Message(catalog.i18nc("@info:status Don't translate the XML tag !", "Failed to export profile to {0}: Writer plugin reported failure.", file_name),
lifetime = 0,
title = catalog.i18nc("@info:title", "Error"))
m.show()
- return
+ return False
m = Message(catalog.i18nc("@info:status Don't translate the XML tag !", "Exported profile to {0}", file_name),
title = catalog.i18nc("@info:title", "Export succeeded"))
m.show()
+ return True
## Gets the plugin object matching the criteria
# \param extension
# \param description
# \return The plugin object matching the given extension and description.
- def _findProfileWriter(self, extension, description):
+ def _findProfileWriter(self, extension: str, description: str) -> Optional[ProfileWriter]:
plugin_registry = PluginRegistry.getInstance()
for plugin_id, meta_data in self._getIOPlugins("profile_writer"):
for supported_type in meta_data["profile_writer"]: # All file types this plugin can supposedly write.
@@ -156,7 +161,7 @@ class CuraContainerRegistry(ContainerRegistry):
if supported_extension == extension: # This plugin supports a file type with the same extension.
supported_description = supported_type.get("description", None)
if supported_description == description: # The description is also identical. Assume it's the same file type.
- return plugin_registry.getPluginObject(plugin_id)
+ return cast(ProfileWriter, plugin_registry.getPluginObject(plugin_id))
return None
## Imports a profile from a file
@@ -169,9 +174,6 @@ class CuraContainerRegistry(ContainerRegistry):
if not file_name:
return { "status": "error", "message": catalog.i18nc("@info:status Don't translate the XML tags !", "Failed to import profile from {0}: {1}", file_name, "Invalid path")}
- plugin_registry = PluginRegistry.getInstance()
- extension = file_name.split(".")[-1]
-
global_stack = Application.getInstance().getGlobalContainerStack()
if not global_stack:
return {"status": "error", "message": catalog.i18nc("@info:status Don't translate the XML tags !", "Can't import profile from {0} before a printer is added.", file_name)}
@@ -180,6 +182,9 @@ class CuraContainerRegistry(ContainerRegistry):
for position in sorted(global_stack.extruders):
machine_extruders.append(global_stack.extruders[position])
+ plugin_registry = PluginRegistry.getInstance()
+ extension = file_name.split(".")[-1]
+
for plugin_id, meta_data in self._getIOPlugins("profile_reader"):
if meta_data["profile_reader"][0]["extension"] != extension:
continue
@@ -236,12 +241,11 @@ class CuraContainerRegistry(ContainerRegistry):
# And check if the profile_definition matches either one (showing error if not):
if profile_definition != expected_machine_definition:
- Logger.log("e", "Profile [%s] is for machine [%s] but the current active machine is [%s]. Will not import the profile", file_name, profile_definition, expected_machine_definition)
- return { "status": "error",
- "message": catalog.i18nc("@info:status Don't translate the XML tags !", "The machine defined in profile {0} ({1}) doesn't match with your current machine ({2}), could not import it.", file_name, profile_definition, expected_machine_definition)}
+ Logger.log("d", "Profile {file_name} is for machine {profile_definition}, but the current active machine is {expected_machine_definition}. Changing profile's definition.".format(file_name = file_name, profile_definition = profile_definition, expected_machine_definition = expected_machine_definition))
+ global_profile.setMetaDataEntry("definition", expected_machine_definition)
+ for extruder_profile in extruder_profiles:
+ extruder_profile.setMetaDataEntry("definition", expected_machine_definition)
- # Fix the global quality profile's definition field in case it's not correct
- global_profile.setMetaDataEntry("definition", expected_machine_definition)
quality_name = global_profile.getName()
quality_type = global_profile.getMetaDataEntry("quality_type")
@@ -281,7 +285,7 @@ class CuraContainerRegistry(ContainerRegistry):
profile.addInstance(new_instance)
profile.setDirty(True)
- global_profile.removeInstance(qc_setting_key, postpone_emit=True)
+ global_profile.removeInstance(qc_setting_key, postpone_emit = True)
extruder_profiles.append(profile)
for profile in extruder_profiles:
@@ -309,9 +313,9 @@ class CuraContainerRegistry(ContainerRegistry):
result = self._configureProfile(profile, profile_id, new_name, expected_machine_definition)
if result is not None:
return {"status": "error", "message": catalog.i18nc(
- "@info:status Don't translate the XML tags or !",
+ "@info:status Don't translate the XML tag !",
"Failed to import profile from {0}:",
- file_name) + " " + result + ""}
+ file_name) + " " + result}
return {"status": "ok", "message": catalog.i18nc("@info:status", "Successfully imported profile {0}", profile_or_list[0].getName())}
@@ -322,7 +326,7 @@ class CuraContainerRegistry(ContainerRegistry):
return {"status": "error", "message": catalog.i18nc("@info:status", "Profile {0} has an unknown file type or is corrupted.", file_name)}
@override(ContainerRegistry)
- def load(self):
+ def load(self) -> None:
super().load()
self._registerSingleExtrusionMachinesExtruderStacks()
self._connectUpgradedExtruderStacksToMachines()
@@ -383,13 +387,33 @@ class CuraContainerRegistry(ContainerRegistry):
# successfully imported but then fail to show up.
quality_manager = cura.CuraApplication.CuraApplication.getInstance()._quality_manager
quality_group_dict = quality_manager.getQualityGroupsForMachineDefinition(global_stack)
- if quality_type not in quality_group_dict:
+ # "not_supported" profiles can be imported.
+ if quality_type != empty_quality_container.getMetaDataEntry("quality_type") and quality_type not in quality_group_dict:
return catalog.i18nc("@info:status", "Could not find a quality type {0} for the current configuration.", quality_type)
ContainerRegistry.getInstance().addContainer(profile)
return None
+ @override(ContainerRegistry)
+ def saveDirtyContainers(self) -> None:
+ # Lock file for "more" atomically loading and saving to/from config dir.
+ with self.lockFile():
+ # Save base files first
+ for instance in self.findDirtyContainers(container_type=InstanceContainer):
+ if instance.getMetaDataEntry("removed"):
+ continue
+ if instance.getId() == instance.getMetaData().get("base_file"):
+ self.saveContainer(instance)
+
+ for instance in self.findDirtyContainers(container_type=InstanceContainer):
+ if instance.getMetaDataEntry("removed"):
+ continue
+ self.saveContainer(instance)
+
+ for stack in self.findContainerStacks():
+ self.saveContainer(stack)
+
## Gets a list of profile writer plugins
# \return List of tuples of (plugin_id, meta_data).
def _getIOPlugins(self, io_type):
@@ -404,7 +428,7 @@ class CuraContainerRegistry(ContainerRegistry):
return result
## Convert an "old-style" pure ContainerStack to either an Extruder or Global stack.
- def _convertContainerStack(self, container):
+ def _convertContainerStack(self, container: ContainerStack) -> Union[ExtruderStack.ExtruderStack, GlobalStack.GlobalStack]:
assert type(container) == ContainerStack
container_type = container.getMetaDataEntry("type")
@@ -428,14 +452,14 @@ class CuraContainerRegistry(ContainerRegistry):
return new_stack
- def _registerSingleExtrusionMachinesExtruderStacks(self):
+ def _registerSingleExtrusionMachinesExtruderStacks(self) -> None:
machines = self.findContainerStacks(type = "machine", machine_extruder_trains = {"0": "fdmextruder"})
for machine in machines:
extruder_stacks = self.findContainerStacks(type = "extruder_train", machine = machine.getId())
if not extruder_stacks:
self.addExtruderStackForSingleExtrusionMachine(machine, "fdmextruder")
- def _onContainerAdded(self, container):
+ def _onContainerAdded(self, container: ContainerInterface) -> None:
# We don't have all the machines loaded in the beginning, so in order to add the missing extruder stack
# for single extrusion machines, we subscribe to the containerAdded signal, and whenever a global stack
# is added, we check to see if an extruder stack needs to be added.
@@ -669,7 +693,7 @@ class CuraContainerRegistry(ContainerRegistry):
return extruder_stack
- def _findQualityChangesContainerInCuraFolder(self, name):
+ def _findQualityChangesContainerInCuraFolder(self, name: str) -> Optional[InstanceContainer]:
quality_changes_dir = Resources.getPath(cura.CuraApplication.CuraApplication.ResourceTypes.QualityChangesInstanceContainer)
instance_container = None
@@ -682,7 +706,7 @@ class CuraContainerRegistry(ContainerRegistry):
parser = configparser.ConfigParser(interpolation = None)
try:
parser.read([file_path])
- except:
+ except Exception:
# Skip, it is not a valid stack file
continue
@@ -714,7 +738,7 @@ class CuraContainerRegistry(ContainerRegistry):
# due to problems with loading order, some stacks may not have the proper next stack
# set after upgrading, because the proper global stack was not yet loaded. This method
# makes sure those extruders also get the right stack set.
- def _connectUpgradedExtruderStacksToMachines(self):
+ def _connectUpgradedExtruderStacksToMachines(self) -> None:
extruder_stacks = self.findContainers(container_type = ExtruderStack.ExtruderStack)
for extruder_stack in extruder_stacks:
if extruder_stack.getNextStack():
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 d20e686279..cef6150043 100644
--- a/cura/Settings/CuraStackBuilder.py
+++ b/cura/Settings/CuraStackBuilder.py
@@ -129,8 +129,9 @@ class CuraStackBuilder:
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
+ msg = "Unable to find extruder definition with the id [%s]" % extruder_definition_id
+ Logger.logException("e", msg)
+ raise IndexError(msg)
# get material container for extruders
material_container = application.empty_material_container
diff --git a/cura/Settings/ExtruderManager.py b/cura/Settings/ExtruderManager.py
index b6b7b31936..2fa90f9636 100755
--- a/cura/Settings/ExtruderManager.py
+++ b/cura/Settings/ExtruderManager.py
@@ -12,7 +12,7 @@ from UM.Scene.SceneNode import SceneNode
from UM.Scene.Selection import Selection
from UM.Scene.Iterator.BreadthFirstIterator import BreadthFirstIterator
from UM.Settings.ContainerRegistry import ContainerRegistry # Finding containers by ID.
-from UM.Settings.ContainerStack import ContainerStack
+from UM.Decorators import deprecated
from typing import Any, cast, Dict, List, Optional, TYPE_CHECKING, Union
@@ -95,6 +95,7 @@ class ExtruderManager(QObject):
#
# \param index The index of the extruder whose name to get.
@pyqtSlot(int, result = str)
+ @deprecated("Use Cura.MachineManager.activeMachine.extruders[index].name instead", "4.3")
def getExtruderName(self, index: int) -> str:
try:
return self.getActiveExtruderStacks()[index].getName()
@@ -114,7 +115,7 @@ class ExtruderManager(QObject):
selected_nodes = [] # type: List["SceneNode"]
for node in Selection.getAllSelectedObjects():
if node.callDecoration("isGroup"):
- for grouped_node in BreadthFirstIterator(node): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+ for grouped_node in BreadthFirstIterator(node):
if grouped_node.callDecoration("isGroup"):
continue
@@ -131,7 +132,7 @@ class ExtruderManager(QObject):
elif current_extruder_trains:
object_extruders.add(current_extruder_trains[0].getId())
- self._selected_object_extruders = list(object_extruders) # type: List[Union[str, "ExtruderStack"]]
+ self._selected_object_extruders = list(object_extruders)
return self._selected_object_extruders
@@ -140,7 +141,7 @@ class ExtruderManager(QObject):
# This will trigger a recalculation of the extruders used for the
# selection.
def resetSelectedObjectExtruders(self) -> None:
- self._selected_object_extruders = [] # type: List[Union[str, "ExtruderStack"]]
+ self._selected_object_extruders = []
self.selectedObjectExtrudersChanged.emit()
@pyqtSlot(result = QObject)
@@ -180,7 +181,7 @@ class ExtruderManager(QObject):
# \param setting_key \type{str} The setting to get the property of.
# \param property \type{str} The property to get.
# \return \type{List} the list of results
- def getAllExtruderSettings(self, setting_key: str, prop: str) -> List:
+ def getAllExtruderSettings(self, setting_key: str, prop: str) -> List[Any]:
result = []
for extruder_stack in self.getActiveExtruderStacks():
@@ -205,7 +206,7 @@ class ExtruderManager(QObject):
# list.
#
# \return A list of extruder stacks.
- def getUsedExtruderStacks(self) -> List["ContainerStack"]:
+ def getUsedExtruderStacks(self) -> List["ExtruderStack"]:
global_stack = self._application.getGlobalContainerStack()
container_registry = ContainerRegistry.getInstance()
@@ -224,7 +225,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
@@ -270,7 +280,8 @@ class ExtruderManager(QObject):
extruder_str_nr = str(global_stack.getProperty("adhesion_extruder_nr", "value"))
if extruder_str_nr == "-1":
extruder_str_nr = self._application.getMachineManager().defaultExtruderPosition
- used_extruder_stack_ids.add(self.extruderIds[extruder_str_nr])
+ if extruder_str_nr in self.extruderIds:
+ used_extruder_stack_ids.add(self.extruderIds[extruder_str_nr])
try:
return [container_registry.findContainerStacks(id = stack_id)[0] for stack_id in used_extruder_stack_ids]
@@ -370,7 +381,13 @@ class ExtruderManager(QObject):
elif extruder_stack_0.definition.getId() != expected_extruder_definition_0_id:
Logger.log("e", "Single extruder printer [{printer}] expected extruder [{expected}], but got [{got}]. I'm making it [{expected}].".format(
printer = global_stack.getId(), expected = expected_extruder_definition_0_id, got = extruder_stack_0.definition.getId()))
- extruder_definition = container_registry.findDefinitionContainers(id = expected_extruder_definition_0_id)[0]
+ try:
+ extruder_definition = container_registry.findDefinitionContainers(id = expected_extruder_definition_0_id)[0]
+ except IndexError as e:
+ # It still needs to break, but we want to know what extruder ID made it break.
+ msg = "Unable to find extruder definition with the id [%s]" % expected_extruder_definition_0_id
+ Logger.logException("e", msg)
+ raise IndexError(msg)
extruder_stack_0.definition = extruder_definition
## Get all extruder values for a certain setting.
diff --git a/cura/Settings/GlobalStack.py b/cura/Settings/GlobalStack.py
index 3940af7ecc..bead31b4e4 100755
--- a/cura/Settings/GlobalStack.py
+++ b/cura/Settings/GlobalStack.py
@@ -1,12 +1,14 @@
-# Copyright (c) 2018 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
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
+from UM.Decorators import deprecated, override
from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase
from UM.Settings.ContainerStack import ContainerStack
from UM.Settings.SettingInstance import InstanceState
@@ -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
@@ -53,17 +61,26 @@ class GlobalStack(CuraContainerStack):
#
# \return The extruders registered with this stack.
@pyqtProperty("QVariantMap", notify = extrudersChanged)
+ @deprecated("Please use extruderList instead.", "4.4")
def extruders(self) -> Dict[str, "ExtruderStack"]:
return self._extruders
@pyqtProperty("QVariantList", notify = extrudersChanged)
def extruderList(self) -> List["ExtruderStack"]:
- result_tuple_list = sorted(list(self.extruders.items()), key=lambda x: int(x[0]))
+ result_tuple_list = sorted(list(self._extruders.items()), key=lambda x: int(x[0]))
result_list = [item[1] for item in result_tuple_list]
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 +98,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:
@@ -94,7 +119,7 @@ class GlobalStack(CuraContainerStack):
## \sa configuredConnectionTypes
def removeConfiguredConnectionType(self, connection_type: int) -> None:
configured_connection_types = self.configuredConnectionTypes
- if connection_type in self.configured_connection_types:
+ if connection_type in configured_connection_types:
# Store the values as a string.
configured_connection_types.remove(connection_type)
self.setMetaDataEntry("connection_type", ",".join([str(c_type) for c_type in configured_connection_types]))
@@ -200,7 +225,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
@@ -240,14 +265,17 @@ class GlobalStack(CuraContainerStack):
def getHeadAndFansCoordinates(self):
return self.getProperty("machine_head_with_fans_polygon", "value")
- def getHasMaterials(self) -> bool:
+ @pyqtProperty(int, constant=True)
+ def hasMaterials(self):
return parseBool(self.getMetaDataEntry("has_materials", False))
- def getHasVariants(self) -> bool:
+ @pyqtProperty(int, constant=True)
+ def hasVariants(self):
return parseBool(self.getMetaDataEntry("has_variants", False))
- def getHasMachineQuality(self) -> bool:
- return parseBool(self.getMetaDataEntry("has_machine_quality", False))
+ @pyqtProperty(int, constant=True)
+ def hasVariantBuildplates(self) -> bool:
+ return parseBool(self.getMetaDataEntry("has_variant_buildplates", False))
## Get default firmware file name if one is specified in the firmware
@pyqtSlot(result = str)
diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py
index fbd52267f5..7ae635baaa 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
@@ -37,11 +38,10 @@ from .CuraStackBuilder import CuraStackBuilder
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
-
+from cura.Settings.GlobalStack import GlobalStack
if TYPE_CHECKING:
from cura.CuraApplication import CuraApplication
from cura.Settings.CuraContainerStack import CuraContainerStack
- from cura.Settings.GlobalStack import GlobalStack
from cura.Machines.MaterialManager import MaterialManager
from cura.Machines.QualityManager import QualityManager
from cura.Machines.VariantManager import VariantManager
@@ -106,7 +106,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 +157,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 +172,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 +205,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)
@@ -362,7 +362,6 @@ class MachineManager(QObject):
# 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 +369,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.
@@ -383,12 +387,21 @@ class MachineManager(QObject):
machines = CuraContainerRegistry.getInstance().findContainerStacks(type = "machine", **metadata_filter)
for machine in machines:
if machine.definition.getId() == definition_id:
- return machine
+ return cast(GlobalStack, 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:
+ Logger.log("i", "Trying to add a machine with the definition id [%s]", definition_id)
+ 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())
@@ -451,6 +464,7 @@ class MachineManager(QObject):
# \param key \type{str} the name of the key to delete
@pyqtSlot(str)
def clearUserSettingAllCurrentStacks(self, key: str) -> None:
+ Logger.log("i", "Clearing the setting [%s] from all stacks", key)
if not self._global_container_stack:
return
@@ -486,18 +500,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()
@@ -520,6 +537,7 @@ class MachineManager(QObject):
return bool(self._printer_output_devices)
@pyqtProperty(bool, notify = printerConnectedStatusChanged)
+ @deprecated("use Cura.MachineManager.activeMachine.configuredConnectionTypes instead", "4.2")
def activeMachineHasRemoteConnection(self) -> bool:
if self._global_container_stack:
has_remote_connection = False
@@ -531,6 +549,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
@@ -579,7 +598,7 @@ class MachineManager(QObject):
def activeStack(self) -> Optional["ExtruderStack"]:
return self._active_container_stack
- @pyqtProperty(str, notify=activeMaterialChanged)
+ @pyqtProperty(str, notify = activeMaterialChanged)
def activeMaterialId(self) -> str:
if self._active_container_stack:
material = self._active_container_stack.material
@@ -675,11 +694,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 +722,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 +732,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 +742,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 +752,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
@@ -770,6 +788,7 @@ class MachineManager(QObject):
@pyqtSlot(str)
def removeMachine(self, machine_id: str) -> None:
+ Logger.log("i", "Attempting to remove a machine with the id [%s]", machine_id)
# If the machine that is being removed is the currently active machine, set another machine as the active machine.
activate_new_machine = (self._global_container_stack and self._global_container_stack.getId() == machine_id)
@@ -781,7 +800,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,29 +807,33 @@ 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
self.removeMachine(hidden_containers[0].getId())
@pyqtProperty(bool, notify = globalContainerChanged)
+ @deprecated("use Cura.MachineManager.activeMachine.hasMaterials instead", "4.2")
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.hasMaterials
return False
@pyqtProperty(bool, notify = globalContainerChanged)
+ @deprecated("use Cura.MachineManager.activeMachine.hasVariants instead", "4.2")
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.hasVariants
return False
@pyqtProperty(bool, notify = globalContainerChanged)
+ @deprecated("use Cura.MachineManager.activeMachine.hasVariantBuildplates instead", "4.2")
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.hasVariantBuildplates
return False
## The selected buildplate is compatible if it is compatible with all the materials in all the extruders
@@ -874,17 +896,12 @@ class MachineManager(QObject):
result = [] # type: List[str]
for setting_instance in container.findInstances():
setting_key = setting_instance.definition.key
- setting_enabled = self._global_container_stack.getProperty(setting_key, "enabled")
- if not setting_enabled:
- # A setting is not visible anymore
- result.append(setting_key)
- Logger.log("d", "Reset setting [%s] from [%s] because the setting is no longer enabled", setting_key, container)
- continue
-
if not self._global_container_stack.getProperty(setting_key, "type") in ("extruder", "optional_extruder"):
continue
old_value = container.getProperty(setting_key, "value")
+ if isinstance(old_value, SettingFunction):
+ old_value = old_value(self._global_container_stack)
if int(old_value) < 0:
continue
if int(old_value) >= extruder_count or not self._global_container_stack.extruders[str(old_value)].isEnabled:
@@ -903,9 +920,8 @@ class MachineManager(QObject):
# Apply quality changes that are incompatible to user changes, so we do not change the quality changes itself.
self._global_container_stack.userChanges.setProperty(setting_key, "value", self._default_extruder_position)
if add_user_changes:
- caution_message = Message(catalog.i18nc(
- "@info:generic",
- "Settings have been changed to match the current availability of extruders: [%s]" % ", ".join(add_user_changes)),
+ caution_message = Message(
+ catalog.i18nc("@info:message Followed by a list of settings.", "Settings have been changed to match the current availability of extruders:") + " [{settings_list}]".format(settings_list = ", ".join(add_user_changes)),
lifetime = 0,
title = catalog.i18nc("@info:title", "Settings updated"))
caution_message.show()
@@ -933,7 +949,7 @@ class MachineManager(QObject):
# Check to see if any objects are set to print with an extruder that will no longer exist
root_node = self._application.getController().getScene().getRoot()
- for node in DepthFirstIterator(root_node): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+ for node in DepthFirstIterator(root_node):
if node.getMeshData():
extruder_nr = node.callDecoration("getActiveExtruderPosition")
@@ -971,6 +987,11 @@ class MachineManager(QObject):
@pyqtSlot(int, result = QObject)
def getExtruder(self, position: int) -> Optional[ExtruderStack]:
+ return self._getExtruder(position)
+
+ # This is a workaround for the deprecated decorator and the pyqtSlot not playing well together.
+ @deprecated("use Cura.MachineManager.activeMachine.extruders instead", "4.2")
+ def _getExtruder(self, position) -> Optional[ExtruderStack]:
if self._global_container_stack:
return self._global_container_stack.extruders.get(str(position))
return None
@@ -1057,9 +1078,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 []
@@ -1086,6 +1104,7 @@ class MachineManager(QObject):
container.removeInstance(setting_name)
@pyqtProperty("QVariantList", notify = globalContainerChanged)
+ @deprecated("use Cura.MachineManager.activeMachine.extruders instead", "4.2")
def currentExtruderPositions(self) -> List[str]:
if self._global_container_stack is None:
return []
@@ -1095,9 +1114,17 @@ class MachineManager(QObject):
def _onRootMaterialChanged(self) -> None:
self._current_root_material_id = {}
+ changed = False
+
if self._global_container_stack:
for position in self._global_container_stack.extruders:
- self._current_root_material_id[position] = self._global_container_stack.extruders[position].material.getMetaDataEntry("base_file")
+ material_id = self._global_container_stack.extruders[position].material.getMetaDataEntry("base_file")
+ if position not in self._current_root_material_id or material_id != self._current_root_material_id[position]:
+ changed = True
+ self._current_root_material_id[position] = material_id
+
+ if changed:
+ self.activeMaterialChanged.emit()
@pyqtProperty("QVariant", notify = rootMaterialChanged)
def currentRootMaterialId(self) -> Dict[str, str]:
@@ -1250,8 +1277,8 @@ class MachineManager(QObject):
if self._global_container_stack is not None:
if Util.parseBool(self._global_container_stack.getMetaDataEntry("has_materials", False)):
for position, extruder in self._global_container_stack.extruders.items():
- if extruder.isEnabled and not extruder.material.getMetaDataEntry("compatible"):
- return False
+ if not extruder.isEnabled:
+ continue
if not extruder.material.getMetaDataEntry("compatible"):
return False
return True
@@ -1260,7 +1287,7 @@ class MachineManager(QObject):
def _updateQualityWithMaterial(self, *args: Any) -> None:
if self._global_container_stack is None:
return
- Logger.log("i", "Updating quality/quality_changes due to material change")
+ Logger.log("d", "Updating quality/quality_changes due to material change")
current_quality_type = None
if self._current_quality_group:
current_quality_type = self._current_quality_group.quality_type
@@ -1341,33 +1368,37 @@ class MachineManager(QObject):
# instance with the same network key.
@pyqtSlot(str)
def switchPrinterType(self, machine_name: str) -> None:
+ Logger.log("i", "Attempting to switch the printer type to [%s]", machine_name)
# Don't switch if the user tries to change to the same type of printer
if self._global_container_stack is None or self.activeMachineDefinitionName == machine_name:
return
# 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()
@@ -1424,6 +1455,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:
@@ -1455,31 +1487,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()
@@ -1650,3 +1657,7 @@ class MachineManager(QObject):
abbr_machine += stripped_word
return abbr_machine
+
+ # 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..a4f1f6ed06 100644
--- a/cura/Settings/PerObjectContainerStack.py
+++ b/cura/Settings/PerObjectContainerStack.py
@@ -12,6 +12,10 @@ from .CuraContainerStack import CuraContainerStack
class PerObjectContainerStack(CuraContainerStack):
+ def isDirty(self):
+ # This stack should never be auto saved, so always return that there is nothing to save.
+ return False
+
@override(CuraContainerStack)
def getProperty(self, key: str, property_name: str, context: Optional[PropertyEvaluationContext] = None) -> Any:
if context is None:
@@ -34,7 +38,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 +46,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..2fa5234ec3 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,21 @@ 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()
-
+ self._is_non_printing_mesh = self._evaluateIsNonPrintingMesh()
+ self._is_non_thumbnail_visible_mesh = self._evaluateIsNonThumbnailVisibleMesh()
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..0eedfc8654 100644
--- a/cura/Settings/cura_empty_instance_containers.py
+++ b/cura/Settings/cura_empty_instance_containers.py
@@ -1,9 +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 copy
from UM.Settings.constant_instance_containers import EMPTY_CONTAINER_ID, empty_container
+from UM.i18n import i18nCatalog
+catalog = i18nCatalog("cura")
# Empty definition changes
@@ -28,7 +30,7 @@ empty_material_container.setMetaDataEntry("type", "material")
EMPTY_QUALITY_CONTAINER_ID = "empty_quality"
empty_quality_container = copy.deepcopy(empty_container)
empty_quality_container.setMetaDataEntry("id", EMPTY_QUALITY_CONTAINER_ID)
-empty_quality_container.setName("Not Supported")
+empty_quality_container.setName(catalog.i18nc("@info:not supported profile", "Not supported"))
empty_quality_container.setMetaDataEntry("quality_type", "not_supported")
empty_quality_container.setMetaDataEntry("type", "quality")
empty_quality_container.setMetaDataEntry("supported", False)
@@ -41,6 +43,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 +70,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/Snapshot.py b/cura/Snapshot.py
index b730c1fdcf..033b453684 100644
--- a/cura/Snapshot.py
+++ b/cura/Snapshot.py
@@ -48,12 +48,12 @@ class Snapshot:
# determine zoom and look at
bbox = None
for node in DepthFirstIterator(root):
- if node.callDecoration("isSliceable") and node.getMeshData() and node.isVisible() and not node.callDecoration("isNonThumbnailVisibleMesh"):
- if bbox is None:
- bbox = node.getBoundingBox()
- else:
- bbox = bbox + node.getBoundingBox()
-
+ if not getattr(node, "_outside_buildarea", False):
+ if node.callDecoration("isSliceable") and node.getMeshData() and node.isVisible() and not node.callDecoration("isNonThumbnailVisibleMesh"):
+ if bbox is None:
+ bbox = node.getBoundingBox()
+ else:
+ bbox = bbox + node.getBoundingBox()
# If there is no bounding box, it means that there is no model in the buildplate
if bbox is None:
return None
@@ -66,7 +66,7 @@ class Snapshot:
looking_from_offset = Vector(-1, 1, 2)
if size > 0:
# determine the watch distance depending on the size
- looking_from_offset = looking_from_offset * size * 1.3
+ looking_from_offset = looking_from_offset * size * 1.75
camera.setPosition(look_at + looking_from_offset)
camera.lookAt(look_at)
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/UI/ObjectsModel.py b/cura/UI/ObjectsModel.py
new file mode 100644
index 0000000000..5526b41098
--- /dev/null
+++ b/cura/UI/ObjectsModel.py
@@ -0,0 +1,184 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from UM.Logger import Logger
+import re
+from typing import Any, Dict, List, Optional, Union
+
+from PyQt5.QtCore import QTimer, Qt
+
+from UM.Application import Application
+from UM.Qt.ListModel import ListModel
+from UM.Scene.Camera import Camera
+from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
+from UM.Scene.SceneNode import SceneNode
+from UM.Scene.Selection import Selection
+from UM.i18n import i18nCatalog
+
+catalog = i18nCatalog("cura")
+
+
+# Simple convenience class to keep stuff together. Since we're still stuck on python 3.5, we can't use the full
+# typed named tuple, so we have to do it like this.
+# Once we are at python 3.6, feel free to change this to a named tuple.
+class _NodeInfo:
+ def __init__(self, index_to_node: Optional[Dict[int, SceneNode]] = None, nodes_to_rename: Optional[List[SceneNode]] = None, is_group: bool = False) -> None:
+ if index_to_node is None:
+ index_to_node = {}
+ if nodes_to_rename is None:
+ nodes_to_rename = []
+ self.index_to_node = index_to_node # type: Dict[int, SceneNode]
+ self.nodes_to_rename = nodes_to_rename # type: List[SceneNode]
+ self.is_group = is_group # type: bool
+
+
+## Keep track of all objects in the project
+class ObjectsModel(ListModel):
+ NameRole = Qt.UserRole + 1
+ SelectedRole = Qt.UserRole + 2
+ OutsideAreaRole = Qt.UserRole + 3
+ BuilplateNumberRole = Qt.UserRole + 4
+ NodeRole = Qt.UserRole + 5
+
+ def __init__(self, parent = None) -> None:
+ super().__init__(parent)
+
+ self.addRoleName(self.NameRole, "name")
+ self.addRoleName(self.SelectedRole, "selected")
+ self.addRoleName(self.OutsideAreaRole, "outside_build_area")
+ self.addRoleName(self.BuilplateNumberRole, "buildplate_number")
+ self.addRoleName(self.NodeRole, "node")
+
+ Application.getInstance().getController().getScene().sceneChanged.connect(self._updateSceneDelayed)
+ Application.getInstance().getPreferences().preferenceChanged.connect(self._updateDelayed)
+ Selection.selectionChanged.connect(self._updateDelayed)
+
+ self._update_timer = QTimer()
+ self._update_timer.setInterval(200)
+ self._update_timer.setSingleShot(True)
+ self._update_timer.timeout.connect(self._update)
+
+ self._build_plate_number = -1
+
+ self._group_name_template = catalog.i18nc("@label", "Group #{group_nr}")
+ self._group_name_prefix = self._group_name_template.split("#")[0]
+
+ self._naming_regex = re.compile("^(.+)\(([0-9]+)\)$")
+
+ def setActiveBuildPlate(self, nr: int) -> None:
+ if self._build_plate_number != nr:
+ self._build_plate_number = nr
+ self._update()
+
+ def _updateSceneDelayed(self, source) -> None:
+ if not isinstance(source, Camera):
+ self._update_timer.start()
+
+ def _updateDelayed(self, *args) -> None:
+ self._update_timer.start()
+
+ def _shouldNodeBeHandled(self, node: SceneNode) -> bool:
+ is_group = bool(node.callDecoration("isGroup"))
+ if not node.callDecoration("isSliceable") and not is_group:
+ return False
+
+ parent = node.getParent()
+ if parent and parent.callDecoration("isGroup"):
+ return False # Grouped nodes don't need resetting as their parent (the group) is resetted)
+
+ node_build_plate_number = node.callDecoration("getBuildPlateNumber")
+ if Application.getInstance().getPreferences().getValue("view/filter_current_build_plate") and node_build_plate_number != self._build_plate_number:
+ return False
+
+ return True
+
+ def _renameNodes(self, node_info_dict: Dict[str, _NodeInfo]) -> List[SceneNode]:
+ # Go through all names and find out the names for all nodes that need to be renamed.
+ all_nodes = [] # type: List[SceneNode]
+ for name, node_info in node_info_dict.items():
+ # First add the ones that do not need to be renamed.
+ for node in node_info.index_to_node.values():
+ all_nodes.append(node)
+
+ # Generate new names for the nodes that need to be renamed
+ current_index = 0
+ for node in node_info.nodes_to_rename:
+ current_index += 1
+ while current_index in node_info.index_to_node:
+ current_index += 1
+
+ if not node_info.is_group:
+ new_group_name = "{0}({1})".format(name, current_index)
+ else:
+ new_group_name = "{0}#{1}".format(name, current_index)
+
+ old_name = node.getName()
+ node.setName(new_group_name)
+ Logger.log("d", "Node [%s] renamed to [%s]", old_name, new_group_name)
+ all_nodes.append(node)
+ return all_nodes
+
+ def _update(self, *args) -> None:
+ nodes = [] # type: List[Dict[str, Union[str, int, bool, SceneNode]]]
+ name_to_node_info_dict = {} # type: Dict[str, _NodeInfo]
+ for node in DepthFirstIterator(Application.getInstance().getController().getScene().getRoot()): # type: ignore
+ if not self._shouldNodeBeHandled(node):
+ continue
+
+ is_group = bool(node.callDecoration("isGroup"))
+
+ force_rename = False
+ if not is_group:
+ # Handle names for individual nodes
+ name = node.getName()
+
+ name_match = self._naming_regex.fullmatch(name)
+ if name_match is None:
+ original_name = name
+ name_index = 0
+ else:
+ original_name = name_match.groups()[0]
+ name_index = int(name_match.groups()[1])
+ else:
+ # Handle names for grouped nodes
+ original_name = self._group_name_prefix
+
+ current_name = node.getName()
+ if current_name.startswith(self._group_name_prefix):
+ name_index = int(current_name.split("#")[-1])
+ else:
+ # Force rename this group because this node has not been named as a group yet, probably because
+ # it's a newly created group.
+ name_index = 0
+ force_rename = True
+
+ if original_name not in name_to_node_info_dict:
+ # Keep track of 2 things:
+ # - known indices for nodes which doesn't need to be renamed
+ # - a list of nodes that need to be renamed. When renaming then, we should avoid using the known indices.
+ name_to_node_info_dict[original_name] = _NodeInfo(is_group = is_group)
+ node_info = name_to_node_info_dict[original_name]
+ if not force_rename and name_index not in node_info.index_to_node:
+ node_info.index_to_node[name_index] = node
+ else:
+ node_info.nodes_to_rename.append(node)
+
+ all_nodes = self._renameNodes(name_to_node_info_dict)
+
+ for node in all_nodes:
+ if hasattr(node, "isOutsideBuildArea"):
+ is_outside_build_area = node.isOutsideBuildArea() # type: ignore
+ else:
+ is_outside_build_area = False
+
+ node_build_plate_number = node.callDecoration("getBuildPlateNumber")
+
+ nodes.append({
+ "name": node.getName(),
+ "selected": Selection.isSelected(node),
+ "outside_build_area": is_outside_build_area,
+ "buildplate_number": node_build_plate_number,
+ "node": node
+ })
+
+ nodes = sorted(nodes, key=lambda n: n["name"])
+ self.setItems(nodes)
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/RecommendedMode.py b/cura/UI/RecommendedMode.py
new file mode 100644
index 0000000000..47b617740a
--- /dev/null
+++ b/cura/UI/RecommendedMode.py
@@ -0,0 +1,49 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from PyQt5.QtCore import QObject, pyqtSlot
+
+from cura import CuraApplication
+
+#
+# This object contains helper/convenience functions for Recommended mode.
+#
+class RecommendedMode(QObject):
+
+ # Sets to use the adhesion or not for the "Adhesion" CheckBox in Recommended mode.
+ @pyqtSlot(bool)
+ def setAdhesion(self, checked: bool) -> None:
+ application = CuraApplication.CuraApplication.getInstance()
+ global_stack = application.getMachineManager().activeMachine
+ if global_stack is None:
+ return
+
+ # Remove the adhesion type value set by the user.
+ adhesion_type_key = "adhesion_type"
+ user_changes_container = global_stack.userChanges
+ if adhesion_type_key in user_changes_container.getAllKeys():
+ user_changes_container.removeInstance(adhesion_type_key)
+
+ # Get the default value of adhesion type after user's value has been removed.
+ # skirt and none are counted as "no adhesion", the others are considered as "with adhesion". The conditions are
+ # as the following:
+ # - if the user checks the adhesion checkbox, get the default value (including the custom quality) for adhesion
+ # type.
+ # (1) If the default value is "skirt" or "none" (no adhesion), set adhesion_type to "brim".
+ # (2) If the default value is "with adhesion", do nothing.
+ # - if the user unchecks the adhesion checkbox, get the default value (including the custom quality) for
+ # adhesion type.
+ # (1) If the default value is "skirt" or "none" (no adhesion), do nothing.
+ # (2) Otherwise, set adhesion_type to "skirt".
+ value = global_stack.getProperty(adhesion_type_key, "value")
+ if checked:
+ if value in ("skirt", "none"):
+ value = "brim"
+ else:
+ if value not in ("skirt", "none"):
+ value = "skirt"
+
+ user_changes_container.setProperty(adhesion_type_key, "value", value)
+
+
+__all__ = ["RecommendedMode"]
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..080479ee92 100755
--- a/cura_app.py
+++ b/cura_app.py
@@ -23,13 +23,17 @@ 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():
return os.path.expanduser("~/Library/Logs/" + CuraAppName)
- if hasattr(sys, "frozen"):
+ # Do not redirect stdout and stderr to files if we are running CLI.
+ if hasattr(sys, "frozen") and "cli" not in os.path.basename(sys.argv[0]).lower():
dirpath = get_cura_dir_path()
os.makedirs(dirpath, exist_ok = True)
sys.stdout = open(os.path.join(dirpath, "stdout.log"), "w", encoding = "utf-8")
@@ -56,6 +60,14 @@ if Platform.isWindows() and hasattr(sys, "frozen"):
except KeyError:
pass
+# GITHUB issue #6194: https://github.com/Ultimaker/Cura/issues/6194
+# With AppImage 2 on Linux, the current working directory will be somewhere in /tmp//usr, which is owned
+# by root. For some reason, QDesktopServices.openUrl() requires to have a usable current working directory,
+# otherwise it doesn't work. This is a workaround on Linux that before we call QDesktopServices.openUrl(), we
+# switch to a directory where the user has the ownership.
+if Platform.isLinux() and hasattr(sys, "frozen"):
+ os.chdir(os.path.expanduser("~"))
+
# WORKAROUND: GITHUB-704 GITHUB-708
# It looks like setuptools creates a .pth file in
# the default /usr/lib which causes the default site-packages
@@ -129,5 +141,37 @@ import Arcus #@UnusedImport
import Savitar #@UnusedImport
from cura.CuraApplication import CuraApplication
+
+# WORKAROUND: CURA-6739
+# The CTM file loading module in Trimesh requires the OpenCTM library to be dynamically loaded. It uses
+# ctypes.util.find_library() to find libopenctm.dylib, but this doesn't seem to look in the ".app" application folder
+# on Mac OS X. Adding the search path to environment variables such as DYLD_LIBRARY_PATH and DYLD_FALLBACK_LIBRARY_PATH
+# makes it work. The workaround here uses DYLD_FALLBACK_LIBRARY_PATH.
+if Platform.isOSX() and getattr(sys, "frozen", False):
+ old_env = os.environ.get("DYLD_FALLBACK_LIBRARY_PATH", "")
+ # This is where libopenctm.so is in the .app folder.
+ search_path = os.path.join(CuraApplication.getInstallPrefix(), "MacOS")
+ path_list = old_env.split(":")
+ if search_path not in path_list:
+ path_list.append(search_path)
+ os.environ["DYLD_FALLBACK_LIBRARY_PATH"] = ":".join(path_list)
+ import trimesh.exchange.load
+ os.environ["DYLD_FALLBACK_LIBRARY_PATH"] = old_env
+
+# WORKAROUND: CURA-6739
+# Similar CTM file loading fix for Linux, but NOTE THAT this doesn't work directly with Python 3.5.7. There's a fix
+# for ctypes.util.find_library() in Python 3.6 and 3.7. That fix makes sure that find_library() will check
+# LD_LIBRARY_PATH. With Python 3.5, that fix needs to be backported to make this workaround work.
+if Platform.isLinux() and getattr(sys, "frozen", False):
+ old_env = os.environ.get("LD_LIBRARY_PATH", "")
+ # This is where libopenctm.so is in the AppImage.
+ search_path = os.path.join(CuraApplication.getInstallPrefix(), "bin")
+ path_list = old_env.split(":")
+ if search_path not in path_list:
+ path_list.append(search_path)
+ os.environ["LD_LIBRARY_PATH"] = ":".join(path_list)
+ import trimesh.exchange.load
+ os.environ["LD_LIBRARY_PATH"] = old_env
+
app = CuraApplication()
app.run()
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 38652361a5..7154a114a9 100755
--- a/plugins/3MFReader/ThreeMFWorkspaceReader.py
+++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py
@@ -33,6 +33,8 @@ from cura.Settings.CuraContainerStack import _ContainerIndexes
from cura.CuraApplication import CuraApplication
from cura.Utils.Threading import call_on_qt_thread
+from PyQt5.QtCore import QCoreApplication
+
from .WorkspaceDialog import WorkspaceDialog
i18n_catalog = i18nCatalog("cura")
@@ -59,6 +61,9 @@ class MachineInfo:
self.container_id = None
self.name = None
self.definition_id = None
+
+ self.metadata_dict = {} # type: Dict[str, str]
+
self.quality_type = None
self.custom_quality_name = None
self.quality_changes_info = None
@@ -227,6 +232,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
else:
Logger.log("w", "Unknown definition container type %s for %s",
definition_container_type, definition_container_file)
+ QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
Job.yieldThread()
if machine_definition_container_count != 1:
@@ -253,13 +259,14 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
containers_found_dict["material"] = True
if not self._container_registry.isReadOnly(container_id): # Only non readonly materials can be in conflict
material_conflict = True
+ QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
Job.yieldThread()
# Check if any quality_changes instance container is in conflict.
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
@@ -297,7 +304,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")
@@ -322,7 +329,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
# Ignore certain instance container types
Logger.log("w", "Ignoring instance container [%s] with type [%s]", container_id, container_type)
continue
-
+ QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
Job.yieldThread()
if self._machine_info.quality_changes_info.global_info is None:
@@ -342,6 +349,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
global_stack_id = self._stripFileToId(global_stack_file)
serialized = archive.open(global_stack_file).read().decode("utf-8")
machine_name = self._getMachineNameFromSerializedStack(serialized)
+ self._machine_info.metadata_dict = self._getMetaDataDictFromSerializedStack(serialized)
+
stacks = self._container_registry.findContainerStacks(name = machine_name, type = "machine")
self._is_same_machine_type = True
existing_global_stack = None
@@ -397,7 +406,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
variant_id = parser["containers"][str(_ContainerIndexes.Variant)]
if variant_id not in ("empty", "empty_variant"):
self._machine_info.variant_info = instance_container_info_dict[variant_id]
-
+ QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
Job.yieldThread()
# if the global stack is found, we check if there are conflicts in the extruder stacks
@@ -419,13 +428,17 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
if parser.has_option("metadata", "enabled"):
extruder_info.enabled = parser["metadata"]["enabled"]
if variant_id not in ("empty", "empty_variant"):
- extruder_info.variant_info = instance_container_info_dict[variant_id]
+ if variant_id in instance_container_info_dict:
+ extruder_info.variant_info = instance_container_info_dict[variant_id]
+
if material_id not in ("empty", "empty_material"):
root_material_id = reverse_material_id_dict[material_id]
extruder_info.root_material_id = root_material_id
+
definition_changes_id = parser["containers"][str(_ContainerIndexes.DefinitionChanges)]
if definition_changes_id not in ("empty", "empty_definition_changes"):
extruder_info.definition_changes_info = instance_container_info_dict[definition_changes_id]
+
user_changes_id = parser["containers"][str(_ContainerIndexes.UserChanges)]
if user_changes_id not in ("empty", "empty_user_changes"):
extruder_info.user_changes_info = instance_container_info_dict[user_changes_id]
@@ -515,7 +528,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)
@@ -648,6 +661,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
definition_container = self._container_registry.findDefinitionContainers(id = "fdmprinter")[0] #Fall back to defaults.
self._container_registry.addContainer(definition_container)
Job.yieldThread()
+ QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
Logger.log("d", "Workspace loading is checking materials...")
# Get all the material files and check if they exist. If not, add them.
@@ -697,6 +711,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
material_container.setDirty(True)
self._container_registry.addContainer(material_container)
Job.yieldThread()
+ QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
# Handle quality changes if any
self._processQualityChanges(global_stack)
@@ -820,13 +835,16 @@ 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)
self._machine_info.quality_changes_info.name = quality_changes_name
- def _clearStack(self, stack):
+ @staticmethod
+ def _clearStack(stack):
application = CuraApplication.getInstance()
stack.definitionChanges.clear()
@@ -903,6 +921,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
continue
extruder_info = self._machine_info.extruder_info_dict[position]
if extruder_info.variant_info is None:
+ # If there is no variant_info, try to use the default variant. Otherwise, leave it be.
+ node = variant_manager.getDefaultVariantNode(global_stack.definition, VariantType.NOZZLE, global_stack)
+ if node is not None and node.getContainer() is not None:
+ extruder_stack.variant = node.getContainer()
continue
parser = extruder_info.variant_info.parser
@@ -971,6 +993,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
extruder_stack.setMetaDataEntry("enabled", "True")
extruder_stack.setMetaDataEntry("enabled", str(extruder_info.enabled))
+ # Set metadata fields that are missing from the global stack
+ for key, value in self._machine_info.metadata_dict.items():
+ if key not in global_stack.getMetaData():
+ global_stack.setMetaDataEntry(key, value)
+
def _updateActiveMachine(self, global_stack):
# Actually change the active machine.
machine_manager = Application.getInstance().getMachineManager()
@@ -983,6 +1010,11 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
machine_manager.setActiveMachine(global_stack.getId())
+ # Set metadata fields that are missing from the global stack
+ for key, value in self._machine_info.metadata_dict.items():
+ if key not in global_stack.getMetaData():
+ global_stack.setMetaDataEntry(key, value)
+
if self._quality_changes_to_apply:
quality_changes_group_dict = quality_manager.getQualityChangesGroups(global_stack)
if self._quality_changes_to_apply not in quality_changes_group_dict:
@@ -1009,7 +1041,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
# Notify everything/one that is to notify about changes.
global_stack.containersChanged.emit(global_stack.getTop())
- def _stripFileToId(self, file):
+ @staticmethod
+ def _stripFileToId(file):
mime_type = MimeTypeDatabase.getMimeTypeForFile(file)
file = mime_type.stripExtension(file)
return file.replace("Cura/", "")
@@ -1018,7 +1051,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
return self._container_registry.getContainerForMimeType(MimeTypeDatabase.getMimeType("application/x-ultimaker-material-profile"))
## Get the list of ID's of all containers in a container stack by partially parsing it's serialized data.
- def _getContainerIdListFromSerialized(self, serialized):
+ @staticmethod
+ def _getContainerIdListFromSerialized(serialized):
parser = ConfigParser(interpolation = None, empty_lines_in_values = False)
parser.read_string(serialized)
@@ -1039,12 +1073,20 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
return container_ids
- def _getMachineNameFromSerializedStack(self, serialized):
+ @staticmethod
+ def _getMachineNameFromSerializedStack(serialized):
parser = ConfigParser(interpolation = None, empty_lines_in_values = False)
parser.read_string(serialized)
return parser["general"].get("name", "")
- def _getMaterialLabelFromSerialized(self, serialized):
+ @staticmethod
+ def _getMetaDataDictFromSerializedStack(serialized: str) -> Dict[str, str]:
+ parser = ConfigParser(interpolation = None, empty_lines_in_values = False)
+ parser.read_string(serialized)
+ return dict(parser["metadata"])
+
+ @staticmethod
+ def _getMaterialLabelFromSerialized(serialized):
data = ET.fromstring(serialized)
metadata = data.iterfind("./um:metadata/um:name/um:label", {"um": "http://www.ultimaker.com/material"})
for entry in metadata:
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..ddf7864bb3 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
@@ -210,7 +207,7 @@ class CuraEngineBackend(QObject, Backend):
self._createSocket()
if self._process_layers_job is not None: # We were processing layers. Stop that, the layers are going to change soon.
- Logger.log("d", "Aborting process layers job...")
+ Logger.log("i", "Aborting process layers job...")
self._process_layers_job.abort()
self._process_layers_job = None
@@ -225,7 +222,7 @@ class CuraEngineBackend(QObject, Backend):
## Perform a slice of the scene.
def slice(self) -> None:
- Logger.log("d", "Starting to slice...")
+ Logger.log("i", "Starting to slice...")
self._slice_start_time = time()
if not self._build_plates_to_be_sliced:
self.processingProgress.emit(1.0)
@@ -372,7 +369,7 @@ class CuraEngineBackend(QObject, Backend):
elif job.getResult() == StartJobResult.ObjectSettingError:
errors = {}
- for node in DepthFirstIterator(self._application.getController().getScene().getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+ for node in DepthFirstIterator(self._application.getController().getScene().getRoot()):
stack = node.callDecoration("getStack")
if not stack:
continue
@@ -441,7 +438,7 @@ class CuraEngineBackend(QObject, Backend):
if not self._application.getPreferences().getValue("general/auto_slice"):
enable_timer = False
- for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+ for node in DepthFirstIterator(self._scene.getRoot()):
if node.callDecoration("isBlockSlicing"):
enable_timer = False
self.setState(BackendState.Disabled)
@@ -463,7 +460,7 @@ class CuraEngineBackend(QObject, Backend):
## Return a dict with number of objects per build plate
def _numObjectsPerBuildPlate(self) -> Dict[int, int]:
num_objects = defaultdict(int) #type: Dict[int, int]
- for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+ for node in DepthFirstIterator(self._scene.getRoot()):
# Only count sliceable objects
if node.callDecoration("isSliceable"):
build_plate_number = node.callDecoration("getBuildPlateNumber")
@@ -520,9 +517,6 @@ class CuraEngineBackend(QObject, Backend):
self._build_plates_to_be_sliced.append(build_plate_number)
self.printDurationMessage.emit(source_build_plate_number, {}, [])
self.processingProgress.emit(0.0)
- self.setState(BackendState.NotStarted)
- # if not self._use_timer:
- # With manually having to slice, we want to clear the old invalid layer data.
self._clearLayerData(build_plate_changed)
self._invokeSlice()
@@ -549,15 +543,25 @@ class CuraEngineBackend(QObject, Backend):
if error.getErrorCode() == Arcus.ErrorCode.BindFailedError and self._start_slice_job is not None:
self._start_slice_job.setIsCancelled(False)
+ # Check if there's any slicable object in the scene.
+ def hasSlicableObject(self) -> bool:
+ has_slicable = False
+ for node in DepthFirstIterator(self._scene.getRoot()):
+ if node.callDecoration("isSliceable"):
+ has_slicable = True
+ break
+ return has_slicable
+
## Remove old layer data (if any)
def _clearLayerData(self, build_plate_numbers: Set = None) -> None:
# Clear out any old gcode
self._scene.gcode_dict = {} # type: ignore
- for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+ for node in DepthFirstIterator(self._scene.getRoot()):
if node.callDecoration("getLayerData"):
if not build_plate_numbers or node.callDecoration("getBuildPlateNumber") in build_plate_numbers:
- node.getParent().removeChild(node)
+ # We can asume that all nodes have a parent as we're looping through the scene (and filter out root)
+ cast(SceneNode, node.getParent()).removeChild(node)
def markSliceAll(self) -> None:
for build_plate_number in range(self._application.getMultiBuildPlateModel().maxBuildPlate + 1):
@@ -566,10 +570,14 @@ class CuraEngineBackend(QObject, Backend):
## Convenient function: mark everything to slice, emit state and clear layer data
def needsSlicing(self) -> None:
+ # CURA-6604: If there's no slicable object, do not (try to) trigger slice, which will clear all the current
+ # gcode. This can break Gcode file loading if it tries to remove it afterwards.
+ if not self.hasSlicableObject():
+ return
+ self.determineAutoSlicing()
self.stopSlicing()
self.markSliceAll()
self.processingProgress.emit(0.0)
- self.setState(BackendState.NotStarted)
if not self._use_timer:
# With manually having to slice, we want to clear the old invalid layer data.
self._clearLayerData()
@@ -637,7 +645,10 @@ class CuraEngineBackend(QObject, Backend):
self.setState(BackendState.Done)
self.processingProgress.emit(1.0)
- gcode_list = self._scene.gcode_dict[self._start_slice_job_build_plate] #type: ignore #Because we generate this attribute dynamically.
+ try:
+ gcode_list = self._scene.gcode_dict[self._start_slice_job_build_plate] #type: ignore #Because we generate this attribute dynamically.
+ except KeyError: # Can occur if the g-code has been cleared while a slice message is still arriving from the other end.
+ gcode_list = []
for index, line in enumerate(gcode_list):
replaced = line.replace("{print_time}", str(self._application.getPrintInformation().currentPrintTime.getDisplayString(DurationFormat.Format.ISO8601)))
replaced = replaced.replace("{filament_amount}", str(self._application.getPrintInformation().materialLengths))
@@ -676,14 +687,20 @@ class CuraEngineBackend(QObject, Backend):
#
# \param message The protobuf message containing g-code, encoded as UTF-8.
def _onGCodeLayerMessage(self, message: Arcus.PythonMessage) -> None:
- self._scene.gcode_dict[self._start_slice_job_build_plate].append(message.data.decode("utf-8", "replace")) #type: ignore #Because we generate this attribute dynamically.
+ try:
+ self._scene.gcode_dict[self._start_slice_job_build_plate].append(message.data.decode("utf-8", "replace")) #type: ignore #Because we generate this attribute dynamically.
+ except KeyError: # Can occur if the g-code has been cleared while a slice message is still arriving from the other end.
+ pass # Throw the message away.
## Called when a g-code prefix message is received from the engine.
#
# \param message The protobuf message containing the g-code prefix,
# encoded as UTF-8.
def _onGCodePrefixMessage(self, message: Arcus.PythonMessage) -> None:
- self._scene.gcode_dict[self._start_slice_job_build_plate].insert(0, message.data.decode("utf-8", "replace")) #type: ignore #Because we generate this attribute dynamically.
+ try:
+ self._scene.gcode_dict[self._start_slice_job_build_plate].insert(0, message.data.decode("utf-8", "replace")) #type: ignore #Because we generate this attribute dynamically.
+ except KeyError: # Can occur if the g-code has been cleared while a slice message is still arriving from the other end.
+ pass # Throw the message away.
## Creates a new socket connection.
def _createSocket(self, protocol_file: str = None) -> None:
@@ -738,6 +755,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..32d60eb68b 100644
--- a/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py
+++ b/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py
@@ -1,4 +1,4 @@
-#Copyright (c) 2017 Ultimaker B.V.
+#Copyright (c) 2019 Ultimaker B.V.
#Cura is released under the terms of the LGPLv3 or higher.
import gc
@@ -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")
@@ -136,23 +136,23 @@ class ProcessSlicedLayersJob(Job):
extruder = polygon.extruder
- line_types = numpy.fromstring(polygon.line_type, dtype="u1") # Convert bytearray to numpy array
+ line_types = numpy.fromstring(polygon.line_type, dtype = "u1") # Convert bytearray to numpy array
line_types = line_types.reshape((-1,1))
- points = numpy.fromstring(polygon.points, dtype="f4") # Convert bytearray to numpy array
+ points = numpy.fromstring(polygon.points, dtype = "f4") # Convert bytearray to numpy array
if polygon.point_type == 0: # Point2D
points = points.reshape((-1,2)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly.
else: # Point3D
points = points.reshape((-1,3))
- line_widths = numpy.fromstring(polygon.line_width, dtype="f4") # Convert bytearray to numpy array
+ line_widths = numpy.fromstring(polygon.line_width, dtype = "f4") # Convert bytearray to numpy array
line_widths = line_widths.reshape((-1,1)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly.
- line_thicknesses = numpy.fromstring(polygon.line_thickness, dtype="f4") # Convert bytearray to numpy array
+ line_thicknesses = numpy.fromstring(polygon.line_thickness, dtype = "f4") # Convert bytearray to numpy array
line_thicknesses = line_thicknesses.reshape((-1,1)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly.
- line_feedrates = numpy.fromstring(polygon.line_feedrate, dtype="f4") # Convert bytearray to numpy array
+ line_feedrates = numpy.fromstring(polygon.line_feedrate, dtype = "f4") # Convert bytearray to numpy array
line_feedrates = line_feedrates.reshape((-1,1)) # We get a linear list of pairs that make up the points, so make numpy interpret them correctly.
# Create a new 3D-array, copy the 2D points over and insert the right height.
@@ -194,7 +194,7 @@ class ProcessSlicedLayersJob(Job):
manager = ExtruderManager.getInstance()
extruders = manager.getActiveExtruderStacks()
if extruders:
- material_color_map = numpy.zeros((len(extruders), 4), dtype=numpy.float32)
+ material_color_map = numpy.zeros((len(extruders), 4), dtype = numpy.float32)
for extruder in extruders:
position = int(extruder.getMetaDataEntry("position", default = "0"))
try:
@@ -206,8 +206,8 @@ class ProcessSlicedLayersJob(Job):
material_color_map[position, :] = color
else:
# Single extruder via global stack.
- material_color_map = numpy.zeros((1, 4), dtype=numpy.float32)
- color_code = global_container_stack.material.getMetaDataEntry("color_code", default="#e0e000")
+ material_color_map = numpy.zeros((1, 4), dtype = numpy.float32)
+ color_code = global_container_stack.material.getMetaDataEntry("color_code", default = "#e0e000")
color = colorCodeToRGBA(color_code)
material_color_map[0, :] = color
diff --git a/plugins/CuraEngineBackend/StartSliceJob.py b/plugins/CuraEngineBackend/StartSliceJob.py
index ef97364118..b973a0775a 100644
--- a/plugins/CuraEngineBackend/StartSliceJob.py
+++ b/plugins/CuraEngineBackend/StartSliceJob.py
@@ -11,6 +11,7 @@ import Arcus #For typing.
from UM.Job import Job
from UM.Logger import Logger
+from UM.Scene.SceneNode import SceneNode
from UM.Settings.ContainerStack import ContainerStack #For typing.
from UM.Settings.SettingRelation import SettingRelation #For typing.
@@ -107,7 +108,7 @@ class StartSliceJob(Job):
for key in stack.getAllKeys():
validation_state = stack.getProperty(key, "validationState")
- if validation_state in (ValidatorState.Exception, ValidatorState.MaximumError, ValidatorState.MinimumError):
+ if validation_state in (ValidatorState.Exception, ValidatorState.MaximumError, ValidatorState.MinimumError, ValidatorState.Invalid):
Logger.log("w", "Setting %s is not valid, but %s. Aborting slicing.", key, validation_state)
return True
Job.yieldThread()
@@ -133,6 +134,14 @@ class StartSliceJob(Job):
self.setResult(StartJobResult.BuildPlateError)
return
+ # Wait for error checker to be done.
+ while CuraApplication.getInstance().getMachineErrorChecker().needToWaitForResult:
+ time.sleep(0.1)
+
+ if CuraApplication.getInstance().getMachineErrorChecker().hasError:
+ self.setResult(StartJobResult.SettingError)
+ return
+
# Don't slice if the buildplate or the nozzle type is incompatible with the materials
if not CuraApplication.getInstance().getMachineManager().variantBuildplateCompatible and \
not CuraApplication.getInstance().getMachineManager().variantBuildplateUsable:
@@ -150,7 +159,7 @@ class StartSliceJob(Job):
# Don't slice if there is a per object setting with an error value.
- for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+ for node in DepthFirstIterator(self._scene.getRoot()):
if not isinstance(node, CuraSceneNode) or not node.isSelectable():
continue
@@ -160,15 +169,16 @@ class StartSliceJob(Job):
with self._scene.getSceneLock():
# Remove old layer data.
- for node in DepthFirstIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+ for node in DepthFirstIterator(self._scene.getRoot()):
if node.callDecoration("getLayerData") and node.callDecoration("getBuildPlateNumber") == self._build_plate_number:
- node.getParent().removeChild(node)
+ # Singe we walk through all nodes in the scene, they always have a parent.
+ cast(SceneNode, node.getParent()).removeChild(node)
break
# Get the objects in their groups to print.
object_groups = []
if stack.getProperty("print_sequence", "value") == "one_at_a_time":
- for node in OneAtATimeIterator(self._scene.getRoot()): #type: ignore #Ignore type error because iter() should get called automatically by Python syntax.
+ for node in OneAtATimeIterator(self._scene.getRoot()):
temp_list = []
# Node can't be printed, so don't bother sending it.
@@ -183,7 +193,8 @@ class StartSliceJob(Job):
children = node.getAllChildren()
children.append(node)
for child_node in children:
- if child_node.getMeshData() and child_node.getMeshData().getVertices() is not None:
+ mesh_data = child_node.getMeshData()
+ if mesh_data and mesh_data.getVertices() is not None:
temp_list.append(child_node)
if temp_list:
@@ -194,12 +205,10 @@ class StartSliceJob(Job):
else:
temp_list = []
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)
+ for node in DepthFirstIterator(self._scene.getRoot()):
+ mesh_data = node.getMeshData()
+ if node.callDecoration("isSliceable") and mesh_data and mesh_data.getVertices() is not None:
+ is_non_printing_mesh = bool(node.callDecoration("isNonPrintingMesh"))
# Find a reason not to add the node
if node.callDecoration("getBuildPlateNumber") != self._build_plate_number:
@@ -213,7 +222,7 @@ class StartSliceJob(Job):
Job.yieldThread()
- #If the list doesn't have any model with suitable settings then clean the list
+ # If the list doesn't have any model with suitable settings then clean the list
# otherwise CuraEngine will crash
if not has_printing_mesh:
temp_list.clear()
@@ -259,18 +268,19 @@ 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:
group_message = self._slice_message.addRepeatedMessage("object_lists")
- if group[0].getParent() is not None and group[0].getParent().callDecoration("isGroup"):
- self._handlePerObjectSettings(group[0].getParent(), group_message)
+ parent = group[0].getParent()
+ if parent is not None and parent.callDecoration("isGroup"):
+ self._handlePerObjectSettings(cast(CuraSceneNode, parent), group_message)
+
for object in group:
mesh_data = object.getMeshData()
+ if mesh_data is None:
+ continue
rot_scale = object.getWorldTransformation().getTransposed().getData()[0:3, 0:3]
translate = object.getWorldTransformation().getData()[:3, 3]
@@ -294,7 +304,7 @@ class StartSliceJob(Job):
obj.vertices = flat_verts
- self._handlePerObjectSettings(object, obj)
+ self._handlePerObjectSettings(cast(CuraSceneNode, object), obj)
Job.yieldThread()
@@ -337,25 +347,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))
@@ -367,8 +381,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", "")
@@ -392,7 +412,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/CuraProfileReader/CuraProfileReader.py b/plugins/CuraProfileReader/CuraProfileReader.py
index 11e58dac6d..5e2a4266c8 100644
--- a/plugins/CuraProfileReader/CuraProfileReader.py
+++ b/plugins/CuraProfileReader/CuraProfileReader.py
@@ -1,11 +1,14 @@
-# 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
-from UM.PluginRegistry import PluginRegistry
+import configparser
+from typing import List, Optional, Tuple
+
from UM.Logger import Logger
from UM.Settings.ContainerFormatError import ContainerFormatError
from UM.Settings.InstanceContainer import InstanceContainer # The new profile to make.
+from cura.CuraApplication import CuraApplication
+from cura.Machines.QualityManager import getMachineDefinitionIDForQualitySearch
from cura.ReaderWriters.ProfileReader import ProfileReader
import zipfile
@@ -17,39 +20,43 @@ import zipfile
class CuraProfileReader(ProfileReader):
## Initialises the cura profile reader.
# This does nothing since the only other function is basically stateless.
- def __init__(self):
+ def __init__(self) -> None:
super().__init__()
## Reads a cura profile from a file and returns it.
#
# \param file_name The file to read the cura profile from.
- # \return The cura profile that was in the file, if any. If the file could
- # not be read or didn't contain a valid profile, \code None \endcode is
+ # \return The cura profiles that were in the file, if any. If the file
+ # could not be read or didn't contain a valid profile, ``None`` is
# returned.
- def read(self, file_name):
+ def read(self, file_name: str) -> List[Optional[InstanceContainer]]:
try:
with zipfile.ZipFile(file_name, "r") as archive:
- results = []
+ results = [] # type: List[Optional[InstanceContainer]]
for profile_id in archive.namelist():
with archive.open(profile_id) as f:
serialized = f.read()
- profile = self._loadProfile(serialized.decode("utf-8"), profile_id)
- if profile is not None:
- results.append(profile)
+ upgraded_profiles = self._upgradeProfile(serialized.decode("utf-8"), profile_id) #After upgrading it may split into multiple profiles.
+ for upgraded_profile in upgraded_profiles:
+ serialization, new_id = upgraded_profile
+ profile = self._loadProfile(serialization, new_id)
+ if profile is not None:
+ results.append(profile)
return results
except zipfile.BadZipFile:
# It must be an older profile from Cura 2.1.
with open(file_name, encoding = "utf-8") as fhandle:
- serialized = fhandle.read()
- return [self._loadProfile(serialized, profile_id) for serialized, profile_id in self._upgradeProfile(serialized, file_name)]
+ serialized_bytes = fhandle.read()
+ return [self._loadProfile(serialized, profile_id) for serialized, profile_id in self._upgradeProfile(serialized_bytes, file_name)]
## Convert a profile from an old Cura to this Cura if needed.
#
- # \param serialized \type{str} The profile data to convert in the serialized on-disk format.
- # \param profile_id \type{str} The name of the profile.
- # \return \type{List[Tuple[str,str]]} List of serialized profile strings and matching profile names.
- def _upgradeProfile(self, serialized, profile_id):
+ # \param serialized The profile data to convert in the serialized on-disk
+ # format.
+ # \param profile_id The name of the profile.
+ # \return List of serialized profile strings and matching profile names.
+ def _upgradeProfile(self, serialized: str, profile_id: str) -> List[Tuple[str, str]]:
parser = configparser.ConfigParser(interpolation = None)
parser.read_string(serialized)
@@ -61,48 +68,67 @@ class CuraProfileReader(ProfileReader):
return []
version = int(parser["general"]["version"])
+ setting_version = int(parser["metadata"].get("setting_version", "0"))
if InstanceContainer.Version != version:
name = parser["general"]["name"]
- return self._upgradeProfileVersion(serialized, name, version)
+ return self._upgradeProfileVersion(serialized, name, version, setting_version)
else:
return [(serialized, profile_id)]
## Load a profile from a serialized string.
#
- # \param serialized \type{str} The profile data to read.
- # \param profile_id \type{str} The name of the profile.
- # \return \type{InstanceContainer|None}
- def _loadProfile(self, serialized, profile_id):
+ # \param serialized The profile data to read.
+ # \param profile_id The name of the profile.
+ # \return The profile that was stored in the string.
+ def _loadProfile(self, serialized: str, profile_id: str) -> Optional[InstanceContainer]:
# Create an empty profile.
profile = InstanceContainer(profile_id)
profile.setMetaDataEntry("type", "quality_changes")
try:
- profile.deserialize(serialized)
+ profile.deserialize(serialized, file_name = profile_id)
except ContainerFormatError as e:
Logger.log("e", "Error in the format of a container: %s", str(e))
return None
except Exception as e:
Logger.log("e", "Error while trying to parse profile: %s", str(e))
return None
+
+ global_stack = CuraApplication.getInstance().getGlobalContainerStack()
+ if global_stack is None:
+ return None
+
+ active_quality_definition = getMachineDefinitionIDForQualitySearch(global_stack.definition)
+ if profile.getMetaDataEntry("definition") != active_quality_definition:
+ profile.setMetaDataEntry("definition", active_quality_definition)
return profile
## Upgrade a serialized profile to the current profile format.
#
- # \param serialized \type{str} The profile data to convert.
- # \param profile_id \type{str} The name of the profile.
- # \param source_version \type{int} The profile version of 'serialized'.
- # \return \type{List[Tuple[str,str]]} List of serialized profile strings and matching profile names.
- def _upgradeProfileVersion(self, serialized, profile_id, source_version):
- converter_plugins = PluginRegistry.getInstance().getAllMetaData(filter={"version_upgrade": {} }, active_only=True)
+ # \param serialized The profile data to convert.
+ # \param profile_id The name of the profile.
+ # \param source_version The profile version of 'serialized'.
+ # \return List of serialized profile strings and matching profile names.
+ def _upgradeProfileVersion(self, serialized: str, profile_id: str, main_version: int, setting_version: int) -> List[Tuple[str, str]]:
+ source_version = main_version * 1000000 + setting_version
- source_format = ("profile", source_version)
- profile_convert_funcs = [plugin["version_upgrade"][source_format][2] for plugin in converter_plugins
- if source_format in plugin["version_upgrade"] and plugin["version_upgrade"][source_format][1] == InstanceContainer.Version]
-
- if not profile_convert_funcs:
+ from UM.VersionUpgradeManager import VersionUpgradeManager
+ results = VersionUpgradeManager.getInstance().updateFilesData("quality_changes", source_version, [serialized], [profile_id])
+ if results is None:
return []
- filenames, outputs = profile_convert_funcs[0](serialized, profile_id)
- if filenames is None and outputs is None:
+ serialized = results.files_data[0]
+
+ parser = configparser.ConfigParser(interpolation = None)
+ parser.read_string(serialized)
+ if "general" not in parser:
+ Logger.log("w", "Missing required section 'general'.")
return []
- return list(zip(outputs, filenames))
+
+ new_source_version = results.version
+ if int(new_source_version / 1000000) != InstanceContainer.Version or new_source_version % 1000000 != CuraApplication.SettingVersion:
+ Logger.log("e", "Failed to upgrade profile [%s]", profile_id)
+
+ if int(parser["general"]["version"]) != InstanceContainer.Version:
+ Logger.log("e", "Failed to upgrade profile [%s]", profile_id)
+ return []
+ return [(serialized, profile_id)]
diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py
index a1460cca3f..f286662bc4 100644
--- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py
+++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py
@@ -10,6 +10,9 @@ from UM.Version import Version
import urllib.request
from urllib.error import URLError
from typing import Dict, Optional
+import ssl
+
+import certifi
from .FirmwareUpdateCheckerLookup import FirmwareUpdateCheckerLookup, getSettingsKeyForMachine
from .FirmwareUpdateCheckerMessage import FirmwareUpdateCheckerMessage
@@ -39,8 +42,12 @@ class FirmwareUpdateCheckerJob(Job):
result = self.STRING_ZERO_VERSION
try:
+ # CURA-6698 Create an SSL context and use certifi CA certificates for verification.
+ context = ssl.SSLContext(protocol = ssl.PROTOCOL_TLSv1_2)
+ context.load_verify_locations(cafile = certifi.where())
+
request = urllib.request.Request(url, headers = self._headers)
- response = urllib.request.urlopen(request)
+ response = urllib.request.urlopen(request, context = context)
result = response.read().decode("utf-8")
except URLError:
Logger.log("w", "Could not reach '{0}', if this URL is old, consider removal.".format(url))
@@ -104,7 +111,7 @@ class FirmwareUpdateCheckerJob(Job):
# because the new version of Cura will be release before the firmware and we don't want to
# notify the user when no new firmware version is available.
if (checked_version != "") and (checked_version != current_version):
- Logger.log("i", "SHOWING FIRMWARE UPDATE MESSAGE")
+ Logger.log("i", "Showing firmware update message for new version: {version}".format(version = current_version))
message = FirmwareUpdateCheckerMessage(machine_id, self._machine_name,
self._lookups.getRedirectUserUrl())
message.actionTriggered.connect(self._callback)
@@ -113,7 +120,7 @@ class FirmwareUpdateCheckerJob(Job):
Logger.log("i", "No machine with name {0} in list of firmware to check.".format(self._machine_name))
except Exception as e:
- Logger.log("w", "Failed to check for new version: %s", e)
+ Logger.logException("w", "Failed to check for new version: %s", e)
if not self.silent:
Message(i18n_catalog.i18nc("@info", "Could not access update information.")).show()
return
diff --git a/plugins/GCodeGzReader/GCodeGzReader.py b/plugins/GCodeGzReader/GCodeGzReader.py
index d075e4e3b0..a528b494e9 100644
--- a/plugins/GCodeGzReader/GCodeGzReader.py
+++ b/plugins/GCodeGzReader/GCodeGzReader.py
@@ -27,6 +27,6 @@ class GCodeGzReader(MeshReader):
file_data = file.read()
uncompressed_gcode = gzip.decompress(file_data).decode("utf-8")
PluginRegistry.getInstance().getPluginObject("GCodeReader").preReadFromStream(uncompressed_gcode)
- result = PluginRegistry.getInstance().getPluginObject("GCodeReader").readFromStream(uncompressed_gcode)
+ result = PluginRegistry.getInstance().getPluginObject("GCodeReader").readFromStream(uncompressed_gcode, file_name)
return result
diff --git a/plugins/GCodeReader/FlavorParser.py b/plugins/GCodeReader/FlavorParser.py
index f8618712a1..d05338ae4d 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, Set
+
+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,9 +35,11 @@ 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
+ # All extruder numbers that have been seen
+ self._extruders_seen = {0} # type: Set[int]
self._clearValues()
self._scene_node = None
# X, Y, Z position, F feedrate and E extruder values are stored
@@ -64,7 +68,7 @@ class FlavorParser:
if n < 0:
return None
n += len(code)
- pattern = re.compile("[;\s]")
+ pattern = re.compile("[;\\s]")
match = pattern.search(line, n)
m = match.start() if match is not None else -1
try:
@@ -290,7 +294,12 @@ class FlavorParser:
extruder.getProperty("machine_nozzle_offset_y", "value")]
return result
- def processGCodeStream(self, stream: str) -> Optional[CuraSceneNode]:
+ #
+ # CURA-6643
+ # This function needs the filename so it can be set to the SceneNode. Otherwise, if you load a GCode file and press
+ # F5, that gcode SceneNode will be removed because it doesn't have a file to be reloaded from.
+ #
+ def processGCodeStream(self, stream: str, filename: str) -> Optional["CuraSceneNode"]:
Logger.log("d", "Preparing to load GCode")
self._cancelled = False
# We obtain the filament diameter from the selected extruder to calculate line widths
@@ -368,6 +377,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)
@@ -414,6 +425,7 @@ class FlavorParser:
if line.startswith("T"):
T = self._getInt(line, "T")
if T is not None:
+ self._extruders_seen.add(T)
self._createPolygon(self._current_layer_thickness, current_path, self._extruder_offsets.get(self._extruder_number, [0, 0]))
current_path.clear()
@@ -425,7 +437,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:
@@ -448,6 +461,7 @@ class FlavorParser:
scene_node.addDecorator(decorator)
gcode_list_decorator = GCodeListDecorator()
+ gcode_list_decorator.setGcodeFileName(filename)
gcode_list_decorator.setGCodeList(gcode_list)
scene_node.addDecorator(gcode_list_decorator)
@@ -462,10 +476,9 @@ class FlavorParser:
if self._layer_number == 0:
Logger.log("w", "File doesn't contain any valid layers")
- settings = CuraApplication.getInstance().getGlobalContainerStack()
- if not settings.getProperty("machine_center_is_zero", "value"):
- machine_width = settings.getProperty("machine_width", "value")
- machine_depth = settings.getProperty("machine_depth", "value")
+ if not global_stack.getProperty("machine_center_is_zero", "value"):
+ machine_width = global_stack.getProperty("machine_width", "value")
+ machine_depth = global_stack.getProperty("machine_depth", "value")
scene_node.setPosition(Vector(-machine_width / 2, 0, machine_depth / 2))
Logger.log("d", "GCode loading finished")
diff --git a/plugins/GCodeReader/GCodeReader.py b/plugins/GCodeReader/GCodeReader.py
index b9e948dfea..21be026cc6 100755
--- a/plugins/GCodeReader/GCodeReader.py
+++ b/plugins/GCodeReader/GCodeReader.py
@@ -2,6 +2,8 @@
# Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
+from typing import Optional, Union, List, TYPE_CHECKING
+
from UM.FileHandler.FileReader import FileReader
from UM.Mesh.MeshReader import MeshReader
from UM.i18n import i18nCatalog
@@ -9,8 +11,14 @@ from UM.Application import Application
from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType
catalog = i18nCatalog("cura")
+
+from .FlavorParser import FlavorParser
from . import MarlinFlavorParser, RepRapFlavorParser
+if TYPE_CHECKING:
+ from UM.Scene.SceneNode import SceneNode
+ from cura.Scene.CuraSceneNode import CuraSceneNode
+
# Class for loading and parsing G-code files
class GCodeReader(MeshReader):
@@ -30,7 +38,7 @@ class GCodeReader(MeshReader):
)
self._supported_extensions = [".gcode", ".g"]
- self._flavor_reader = None
+ self._flavor_reader = None # type: Optional[FlavorParser]
Application.getInstance().getPreferences().addPreference("gcodereader/show_caution", True)
@@ -54,10 +62,16 @@ class GCodeReader(MeshReader):
file_data = file.read()
return self.preReadFromStream(file_data, args, kwargs)
- def readFromStream(self, stream):
- return self._flavor_reader.processGCodeStream(stream)
+ def readFromStream(self, stream: str, filename: str) -> Optional["CuraSceneNode"]:
+ if self._flavor_reader is None:
+ return None
+ return self._flavor_reader.processGCodeStream(stream, filename)
- def _read(self, file_name):
+ def _read(self, file_name: str) -> Union["SceneNode", List["SceneNode"]]:
with open(file_name, "r", encoding = "utf-8") as file:
file_data = file.read()
- return self.readFromStream(file_data)
+ result = [] # type: List[SceneNode]
+ node = self.readFromStream(file_data, file_name)
+ if node is not None:
+ result.append(node)
+ return result
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/LegacyProfileReader/tests/TestLegacyProfileReader.py b/plugins/LegacyProfileReader/tests/TestLegacyProfileReader.py
index 480a61f301..05f49017a3 100644
--- a/plugins/LegacyProfileReader/tests/TestLegacyProfileReader.py
+++ b/plugins/LegacyProfileReader/tests/TestLegacyProfileReader.py
@@ -5,6 +5,9 @@ import configparser # An input for some functions we're testing.
import os.path # To find the integration test .ini files.
import pytest # To register tests with.
import unittest.mock # To mock the application, plug-in and container registry out.
+import os.path
+import sys
+sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
import UM.Application # To mock the application out.
import UM.PluginRegistry # To mock the plug-in registry out.
@@ -12,11 +15,13 @@ import UM.Settings.ContainerRegistry # To mock the container registry out.
import UM.Settings.InstanceContainer # To intercept the serialised data from the read() function.
import LegacyProfileReader as LegacyProfileReaderModule # To get the directory of the module.
-from LegacyProfileReader import LegacyProfileReader # The module we're testing.
@pytest.fixture
def legacy_profile_reader():
- return LegacyProfileReader()
+ try:
+ return LegacyProfileReaderModule.LegacyProfileReader()
+ except TypeError:
+ return LegacyProfileReaderModule.LegacyProfileReader.LegacyProfileReader()
test_prepareDefaultsData = [
{
diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.py b/plugins/MachineSettingsAction/MachineSettingsAction.py
index afd7aac86d..d48475b1e6 100755
--- a/plugins/MachineSettingsAction/MachineSettingsAction.py
+++ b/plugins/MachineSettingsAction/MachineSettingsAction.py
@@ -1,16 +1,22 @@
-# 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 UM.Util import parseBool
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 +24,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()
- if definition.getProperty("machine_gcode_flavor", "value") != "UltiGCode" or definition.getMetaDataEntry("has_materials", False):
+ definition = global_stack.getDefinition()
+ if definition.getProperty("machine_gcode_flavor", "value") != "UltiGCode" or parseBool(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..5ba331de2b
--- /dev/null
+++ b/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml
@@ -0,0 +1,182 @@
+// 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("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 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")
+ allowNegativeValue: true
+ 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")
+ allowNegativeValue: true
+ 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..d817450f41
--- /dev/null
+++ b/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml
@@ -0,0 +1,373 @@
+// 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 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 int labelWidth: (columnWidth * 2 / 3 - UM.Theme.getSize("default_margin").width * 2) | 0
+ property int controlWidth: (columnWidth / 3) | 0
+ property var labelFont: UM.Theme.getFont("default")
+
+ 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
+ width: parent.width
+ elide: Text.ElideRight
+ }
+
+ 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.SimpleCheckBox // "Heated build volume"
+ {
+ id: heatedVolumeCheckBox
+ containerStackId: machineStackId
+ settingKey: "machine_heated_build_volume"
+ settingStoreIndex: propertyStoreIndex
+ labelText: catalog.i18nc("@label", "Heated build volume")
+ 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
+ width: parent.width
+ elide: Text.ElideRight
+ }
+
+ 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"
+ allowNegativeValue: true
+
+ 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"
+ allowNegativeValue: true
+
+ 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"
+ allowNegativeValue: true
+
+ 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"
+ allowNegativeValue: true
+
+ 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..7c0a20ef66 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:
@@ -89,7 +97,7 @@ Rectangle
horizontalCenter: parent.horizontalCenter
}
visible: isNetworkConfigured && !isConnected
- text: catalog.i18nc("@info", "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.")
+ text: catalog.i18nc("@info", "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.\n- Check if you are signed in to discover cloud-connected printers.")
font: UM.Theme.getFont("medium")
color: UM.Theme.getColor("monitor_text_primary")
wrapMode: Text.WordWrap
@@ -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,15 +161,9 @@ 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
}
}
}
-}
\ No newline at end of file
+}
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/PerObjectSettingsTool/PerObjectItem.qml b/plugins/PerObjectSettingsTool/PerObjectItem.qml
index 559ad2bf81..7c6ece12db 100644
--- a/plugins/PerObjectSettingsTool/PerObjectItem.qml
+++ b/plugins/PerObjectSettingsTool/PerObjectItem.qml
@@ -29,6 +29,17 @@ UM.TooltipArea
UM.ActiveTool.forceUpdate();
}
}
+
+ // When the user removes settings from the list addedSettingsModel, we need to recheck if the
+ // setting is visible or not to show a mark in the CheckBox.
+ Connections
+ {
+ target: addedSettingsModel
+ onVisibleCountChanged:
+ {
+ check.checked = addedSettingsModel.getVisible(model.key)
+ }
+ }
}
diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml
index 0e2bd88619..035d2e5299 100644
--- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml
+++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml
@@ -160,7 +160,7 @@ Item {
model: UM.SettingDefinitionsModel
{
id: addedSettingsModel;
- containerId: Cura.MachineManager.activeDefinitionId
+ containerId: Cura.MachineManager.activeMachine != null ? Cura.MachineManager.activeMachine.definition.id: ""
expanded: [ "*" ]
filter:
{
@@ -467,7 +467,7 @@ Item {
model: UM.SettingDefinitionsModel
{
id: definitionsModel;
- containerId: Cura.MachineManager.activeDefinitionId
+ containerId: Cura.MachineManager.activeMachine != null ? Cura.MachineManager.activeMachine.definition.id: ""
visibilityHandler: UM.SettingPreferenceVisibilityHandler {}
expanded: [ "*" ]
exclude:
diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.py b/plugins/PostProcessingPlugin/PostProcessingPlugin.py
index 78f9cc0516..376ab291c4 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)
@@ -219,6 +219,7 @@ class PostProcessingPlugin(QObject, Extension):
self._script_list.clear()
if not new_stack.getMetaDataEntry("post_processing_scripts"): # Missing or empty.
self.scriptListChanged.emit() # Even emit this if it didn't change. We want it to write the empty list to the stack's metadata.
+ self.setSelectedScriptIndex(-1)
return
self._script_list.clear()
diff --git a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py
index be9f93c0f6..ba7b06bb1b 100644
--- a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py
+++ b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py
@@ -100,8 +100,8 @@ class ChangeAtZ(Script):
},
"d_twLayers":
{
- "label": "No. Layers",
- "description": "No. of layers used to change",
+ "label": "Layer Spread",
+ "description": "The change will be gradual over this many layers. Enter 1 to make the change immediate.",
"unit": "",
"type": "int",
"default_value": 1,
@@ -330,7 +330,7 @@ class ChangeAtZ(Script):
"extruderOne": self.getSettingValueByKey("i2_extruderOne"),
"extruderTwo": self.getSettingValueByKey("i4_extruderTwo"),
"fanSpeed": self.getSettingValueByKey("j2_fanSpeed")}
- old = {"speed": -1, "flowrate": -1, "flowrateOne": -1, "flowrateTwo": -1, "platformTemp": -1, "extruderOne": -1,
+ old = {"speed": -1, "flowrate": 100, "flowrateOne": -1, "flowrateTwo": -1, "platformTemp": -1, "extruderOne": -1,
"extruderTwo": -1, "bedTemp": -1, "fanSpeed": -1, "state": -1}
twLayers = self.getSettingValueByKey("d_twLayers")
if self.getSettingValueByKey("c_behavior") == "single_layer":
@@ -410,6 +410,8 @@ class ChangeAtZ(Script):
tmp_extruder = self.getValue(line, "T", None)
if tmp_extruder == None: #check if extruder is specified
old["flowrate"] = self.getValue(line, "S", old["flowrate"])
+ if old["flowrate"] == -1:
+ old["flowrate"] = 100.0
elif tmp_extruder == 0: #first extruder
old["flowrateOne"] = self.getValue(line, "S", old["flowrateOne"])
elif tmp_extruder == 1: #second extruder
@@ -481,9 +483,9 @@ class ChangeAtZ(Script):
state = 2
done_layers = 0
if targetL_i > -100000:
- modified_gcode += ";ChangeAtZ V%s: reset below Layer %d\n" % (self.version,targetL_i)
+ modified_gcode += ";ChangeAtZ V%s: reset below Layer %d\n" % (self.version, targetL_i)
else:
- modified_gcode += ";ChangeAtZ V%s: reset below %1.2f mm\n" % (self.version,targetZ)
+ modified_gcode += ";ChangeAtZ V%s: reset below %1.2f mm\n" % (self.version, targetZ)
if IsUM2 and oldValueUnknown: #executes on UM2 with Ultigcode and machine setting
modified_gcode += "M606 S%d;recalls saved settings\n" % (TWinstances-1)
else: #executes on RepRap, UM2 with Ultigcode and Cura setting
diff --git a/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py b/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py
index 3ab20b8297..001beecd3b 100644
--- a/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py
+++ b/plugins/PostProcessingPlugin/scripts/DisplayFilenameAndLayerOnLCD.py
@@ -1,10 +1,13 @@
# Cura PostProcessingPlugin
# Author: Amanda de Castilho
# Date: August 28, 2018
+# Modified: November 16, 2018 by Joshua Pope-Lewis
-# Description: This plugin inserts a line at the start of each layer,
-# M117 - displays the filename and layer height to the LCD
-# Alternatively, user can override the filename to display alt text + layer height
+# Description: This plugin shows custom messages about your print on the Status bar...
+# Please look at the 3 options
+# - Scolling (SCROLL_LONG_FILENAMES) if enabled in Marlin and you arent printing a small item select this option.
+# - Name: By default it will use the name generated by Cura (EG: TT_Test_Cube) - Type a custom name in here
+# - Max Layer: Enabling this will show how many layers are in the entire print (EG: Layer 1 of 265!)
from ..Script import Script
from UM.Application import Application
@@ -15,35 +18,72 @@ class DisplayFilenameAndLayerOnLCD(Script):
def getSettingDataString(self):
return """{
- "name": "Display filename and layer on LCD",
+ "name": "Display Filename And Layer On LCD",
"key": "DisplayFilenameAndLayerOnLCD",
"metadata": {},
"version": 2,
"settings":
{
+ "scroll":
+ {
+ "label": "Scroll enabled/Small layers?",
+ "description": "If SCROLL_LONG_FILENAMES is enabled select this setting however, if the model is small disable this setting!",
+ "type": "bool",
+ "default_value": false
+ },
"name":
{
- "label": "text to display:",
+ "label": "Text to display:",
"description": "By default the current filename will be displayed on the LCD. Enter text here to override the filename and display something else.",
"type": "str",
"default_value": ""
+ },
+ "startNum":
+ {
+ "label": "Initial layer number:",
+ "description": "Choose which number you prefer for the initial layer, 0 or 1",
+ "type": "int",
+ "default_value": 0,
+ "minimum_value": 0,
+ "maximum_value": 1
+ },
+ "maxlayer":
+ {
+ "label": "Display max layer?:",
+ "description": "Display how many layers are in the entire print on status bar?",
+ "type": "bool",
+ "default_value": true
}
}
}"""
def execute(self, data):
+ max_layer = 0
if self.getSettingValueByKey("name") != "":
name = self.getSettingValueByKey("name")
else:
- name = Application.getInstance().getPrintInformation().jobName
- lcd_text = "M117 " + name + " layer "
- i = 0
+ name = Application.getInstance().getPrintInformation().jobName
+ if not self.getSettingValueByKey("scroll"):
+ if self.getSettingValueByKey("maxlayer"):
+ lcd_text = "M117 Layer "
+ else:
+ lcd_text = "M117 Printing Layer "
+ else:
+ lcd_text = "M117 Printing " + name + " - Layer "
+ i = self.getSettingValueByKey("startNum")
for layer in data:
- display_text = lcd_text + str(i)
+ display_text = lcd_text + str(i) + " " + name
layer_index = data.index(layer)
lines = layer.split("\n")
for line in lines:
+ if line.startswith(";LAYER_COUNT:"):
+ max_layer = line
+ max_layer = max_layer.split(":")[1]
if line.startswith(";LAYER:"):
+ if self.getSettingValueByKey("maxlayer"):
+ display_text = display_text + " of " + max_layer
+ else:
+ display_text = display_text + "!"
line_index = lines.index(line)
lines.insert(line_index + 1, display_text)
i += 1
diff --git a/plugins/PostProcessingPlugin/scripts/FilamentChange.py b/plugins/PostProcessingPlugin/scripts/FilamentChange.py
index febb93be4c..943ca30f2e 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,16 @@ 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())
- 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
+ try:
+ layer_num = int(layer_num.strip()) + 1 #Needs +1 because the 1st layer is reserved for start g-code.
+ except ValueError: #Layer number is not an integer.
+ continue
+ if 0 < layer_num < len(data):
+ 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/PauseAtHeight.py b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py
index 8b50a88b7f..913be4e966 100644
--- a/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py
+++ b/plugins/PostProcessingPlugin/scripts/PauseAtHeight.py
@@ -1,15 +1,16 @@
-# Copyright (c) 2018 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from ..Script import Script
from UM.Application import Application #To get the current printer's settings.
+from typing import List, Tuple
class PauseAtHeight(Script):
- def __init__(self):
+ def __init__(self) -> None:
super().__init__()
- def getSettingDataString(self):
+ def getSettingDataString(self) -> str:
return """{
"name": "Pause at height",
"key": "PauseAtHeight",
@@ -105,19 +106,24 @@ class PauseAtHeight(Script):
"standby_temperature":
{
"label": "Standby Temperature",
- "description": "Change the temperature during the pause",
+ "description": "Change the temperature during the pause.",
"unit": "°C",
"type": "int",
"default_value": 0
+ },
+ "display_text":
+ {
+ "label": "Display Text",
+ "description": "Text that should appear on the display while paused. If left empty, there will not be any message.",
+ "type": "str",
+ "default_value": ""
}
}
}"""
- def getNextXY(self, layer: str):
- """
- Get the X and Y values for a layer (will be used to get X and Y of
- the layer after the pause
- """
+ ## Get the X and Y values for a layer (will be used to get X and Y of the
+ # layer after the pause).
+ def getNextXY(self, layer: str) -> Tuple[float, float]:
lines = layer.split("\n")
for line in lines:
if self.getValue(line, "X") is not None and self.getValue(line, "Y") is not None:
@@ -126,8 +132,10 @@ class PauseAtHeight(Script):
return x, y
return 0, 0
- def execute(self, data: list):
- """data is a list. Each index contains a layer"""
+ ## Inserts the pause commands.
+ # \param data: List of layers.
+ # \return New list of layers.
+ def execute(self, data: List[str]) -> List[str]:
pause_at = self.getSettingValueByKey("pause_at")
pause_height = self.getSettingValueByKey("pause_height")
pause_layer = self.getSettingValueByKey("pause_layer")
@@ -143,6 +151,7 @@ class PauseAtHeight(Script):
firmware_retract = Application.getInstance().getGlobalContainerStack().getProperty("machine_firmware_retract", "value")
control_temperatures = Application.getInstance().getGlobalContainerStack().getProperty("machine_nozzle_temp_enabled", "value")
initial_layer_height = Application.getInstance().getGlobalContainerStack().getProperty("layer_height_0", "value")
+ display_text = self.getSettingValueByKey("display_text")
is_griffin = False
@@ -264,7 +273,7 @@ class PauseAtHeight(Script):
if not is_griffin:
# Retraction
- prepend_gcode += self.putValue(M = 83) + "\n"
+ prepend_gcode += self.putValue(M = 83) + " ; switch to relative E values for any needed retraction\n"
if retraction_amount != 0:
if firmware_retract: #Can't set the distance directly to what the user wants. We have to choose ourselves.
retraction_count = 1 if control_temperatures else 3 #Retract more if we don't control the temperature.
@@ -274,25 +283,28 @@ class PauseAtHeight(Script):
prepend_gcode += self.putValue(G = 1, E = -retraction_amount, F = retraction_speed * 60) + "\n"
# Move the head away
- prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + "\n"
+ prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + " ; move up a millimeter to get out of the way\n"
# This line should be ok
prepend_gcode += self.putValue(G = 1, X = park_x, Y = park_y, F = 9000) + "\n"
if current_z < 15:
- prepend_gcode += self.putValue(G = 1, Z = 15, F = 300) + "\n"
+ prepend_gcode += self.putValue(G = 1, Z = 15, F = 300) + " ; too close to bed--move to at least 15mm\n"
if control_temperatures:
# Set extruder standby temperature
- prepend_gcode += self.putValue(M = 104, S = standby_temperature) + "; standby temperature\n"
+ prepend_gcode += self.putValue(M = 104, S = standby_temperature) + " ; standby temperature\n"
+
+ if display_text:
+ prepend_gcode += "M117 " + display_text + "\n"
# Wait till the user continues printing
- prepend_gcode += self.putValue(M = 0) + ";Do the actual pause\n"
+ prepend_gcode += self.putValue(M = 0) + " ; Do the actual pause\n"
if not is_griffin:
if control_temperatures:
# Set extruder resume temperature
- prepend_gcode += self.putValue(M = 109, S = int(target_temperature.get(current_t, 0))) + "; resume temperature\n"
+ prepend_gcode += self.putValue(M = 109, S = int(target_temperature.get(current_t, 0))) + " ; resume temperature\n"
# Push the filament back,
if retraction_amount != 0:
@@ -308,8 +320,10 @@ class PauseAtHeight(Script):
prepend_gcode += self.putValue(G = 1, E = -retraction_amount, F = retraction_speed * 60) + "\n"
# Move the head back
- prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + "\n"
+ if current_z < 15:
+ prepend_gcode += self.putValue(G = 1, Z = current_z + 1, F = 300) + "\n"
prepend_gcode += self.putValue(G = 1, X = x, Y = y, F = 9000) + "\n"
+ prepend_gcode += self.putValue(G = 1, Z = current_z, F = 300) + " ; move back down to resume height\n"
if retraction_amount != 0:
if firmware_retract: #Can't set the distance directly to what the user wants. We have to choose ourselves.
retraction_count = 1 if control_temperatures else 3 #Retract more if we don't control the temperature.
@@ -318,7 +332,7 @@ class PauseAtHeight(Script):
else:
prepend_gcode += self.putValue(G = 1, E = retraction_amount, F = retraction_speed * 60) + "\n"
prepend_gcode += self.putValue(G = 1, F = 9000) + "\n"
- prepend_gcode += self.putValue(M = 82) + "\n"
+ prepend_gcode += self.putValue(M = 82) + " ; switch back to absolute E values\n"
# reset extrude value to pre pause value
prepend_gcode += self.putValue(G = 92, E = current_e) + "\n"
diff --git a/plugins/PostProcessingPlugin/scripts/RetractContinue.py b/plugins/PostProcessingPlugin/scripts/RetractContinue.py
new file mode 100644
index 0000000000..b0af9cd95e
--- /dev/null
+++ b/plugins/PostProcessingPlugin/scripts/RetractContinue.py
@@ -0,0 +1,75 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher.
+
+import math
+
+from ..Script import Script
+
+## Continues retracting during all travel moves.
+class RetractContinue(Script):
+ def getSettingDataString(self):
+ return """{
+ "name": "Retract Continue",
+ "key": "RetractContinue",
+ "metadata": {},
+ "version": 2,
+ "settings":
+ {
+ "extra_retraction_speed":
+ {
+ "label": "Extra Retraction Ratio",
+ "description": "How much does it retract during the travel move, by ratio of the travel length.",
+ "type": "float",
+ "default_value": 0.05
+ }
+ }
+ }"""
+
+ def execute(self, data):
+ current_e = 0
+ current_x = 0
+ current_y = 0
+ extra_retraction_speed = self.getSettingValueByKey("extra_retraction_speed")
+
+ for layer_number, layer in enumerate(data):
+ lines = layer.split("\n")
+ for line_number, line in enumerate(lines):
+ if self.getValue(line, "G") in {0, 1}: # Track X,Y location.
+ current_x = self.getValue(line, "X", current_x)
+ current_y = self.getValue(line, "Y", current_y)
+ if self.getValue(line, "G") == 1:
+ if self.getValue(line, "E"):
+ new_e = self.getValue(line, "E")
+ if new_e >= current_e: # Not a retraction.
+ continue
+ # A retracted travel move may consist of multiple commands, due to combing.
+ # This continues retracting over all of these moves and only unretracts at the end.
+ delta_line = 1
+ dx = current_x # Track the difference in X for this move only to compute the length of the travel.
+ dy = current_y
+ while line_number + delta_line < len(lines) and self.getValue(lines[line_number + delta_line], "G") != 1:
+ travel_move = lines[line_number + delta_line]
+ if self.getValue(travel_move, "G") != 0:
+ delta_line += 1
+ continue
+ travel_x = self.getValue(travel_move, "X", dx)
+ travel_y = self.getValue(travel_move, "Y", dy)
+ f = self.getValue(travel_move, "F", "no f")
+ length = math.sqrt((travel_x - dx) * (travel_x - dx) + (travel_y - dy) * (travel_y - dy)) # Length of the travel move.
+ new_e -= length * extra_retraction_speed # New retraction is by ratio of this travel move.
+ if f == "no f":
+ new_travel_move = "G1 X{travel_x} Y{travel_y} E{new_e}".format(travel_x = travel_x, travel_y = travel_y, new_e = new_e)
+ else:
+ new_travel_move = "G1 F{f} X{travel_x} Y{travel_y} E{new_e}".format(f = f, travel_x = travel_x, travel_y = travel_y, new_e = new_e)
+ lines[line_number + delta_line] = new_travel_move
+
+ delta_line += 1
+ dx = travel_x
+ dy = travel_y
+
+ current_e = new_e
+
+ new_layer = "\n".join(lines)
+ data[layer_number] = new_layer
+
+ return data
\ No newline at end of file
diff --git a/plugins/PostProcessingPlugin/scripts/Stretch.py b/plugins/PostProcessingPlugin/scripts/Stretch.py
index 9757296041..20eef60ef2 100644
--- a/plugins/PostProcessingPlugin/scripts/Stretch.py
+++ b/plugins/PostProcessingPlugin/scripts/Stretch.py
@@ -128,9 +128,26 @@ class Stretcher():
onestep = GCodeStep(0, in_relative_movement)
onestep.copyPosFrom(current)
elif _getValue(line, "G") == 1:
+ last_x = current.step_x
+ last_y = current.step_y
+ last_z = current.step_z
+ last_e = current.step_e
current.readStep(line)
- onestep = GCodeStep(1, in_relative_movement)
- onestep.copyPosFrom(current)
+ if (current.step_x == last_x and current.step_y == last_y and
+ current.step_z == last_z and current.step_e != last_e
+ ):
+ # It's an extruder only move. Preserve it rather than process it as an
+ # extruded move. Otherwise, the stretched output might contain slight
+ # motion in X and Y in addition to E. This can cause problems with
+ # firmwares that implement pressure advance.
+ onestep = GCodeStep(-1, in_relative_movement)
+ onestep.copyPosFrom(current)
+ # Rather than copy the original line, write a new one with consistent
+ # extruder coordinates
+ onestep.comment = "G1 F{} E{}".format(onestep.step_f, onestep.step_e)
+ else:
+ onestep = GCodeStep(1, in_relative_movement)
+ onestep.copyPosFrom(current)
# end of relative movement
elif _getValue(line, "G") == 90:
@@ -145,6 +162,7 @@ class Stretcher():
current.readStep(line)
onestep = GCodeStep(-1, in_relative_movement)
onestep.copyPosFrom(current)
+ onestep.comment = line
else:
onestep = GCodeStep(-1, in_relative_movement)
onestep.copyPosFrom(current)
diff --git a/plugins/PostProcessingPlugin/scripts/TimeLapse.py b/plugins/PostProcessingPlugin/scripts/TimeLapse.py
index 36d0f6a058..53e55a9454 100644
--- a/plugins/PostProcessingPlugin/scripts/TimeLapse.py
+++ b/plugins/PostProcessingPlugin/scripts/TimeLapse.py
@@ -77,10 +77,10 @@ class TimeLapse(Script):
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 += 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
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/SimulationView.py b/plugins/SimulationView/SimulationView.py
index 3b2db2efac..28d5a74523 100644
--- a/plugins/SimulationView/SimulationView.py
+++ b/plugins/SimulationView/SimulationView.py
@@ -83,9 +83,13 @@ class SimulationView(CuraView):
self._simulationview_composite_shader = None # type: Optional["ShaderProgram"]
self._old_composite_shader = None # type: Optional["ShaderProgram"]
+ self._max_feedrate = sys.float_info.min
+ self._min_feedrate = sys.float_info.max
+ self._max_thickness = sys.float_info.min
+ self._min_thickness = sys.float_info.max
+
self._global_container_stack = None # type: Optional[ContainerStack]
- self._proxy = SimulationViewProxy()
- self._controller.getScene().getRoot().childrenChanged.connect(self._onSceneChanged)
+ self._proxy = None
self._resetSettings()
self._legend_items = None
@@ -104,7 +108,6 @@ class SimulationView(CuraView):
Application.getInstance().getPreferences().addPreference("layerview/show_skin", True)
Application.getInstance().getPreferences().addPreference("layerview/show_infill", True)
- Application.getInstance().getPreferences().preferenceChanged.connect(self._onPreferencesChanged)
self._updateWithPreferences()
self._solid_layers = int(Application.getInstance().getPreferences().getValue("view/top_layer_count"))
@@ -180,8 +183,7 @@ class SimulationView(CuraView):
def _onSceneChanged(self, node: "SceneNode") -> None:
if node.getMeshData() is None:
- self.resetLayerData()
-
+ return
self.setActivity(False)
self.calculateMaxLayers()
self.calculateMaxPathsOnLayer(self._current_layer_num)
@@ -218,10 +220,10 @@ class SimulationView(CuraView):
if theme is not None:
self._ghost_shader.setUniformValue("u_color", Color(*theme.getColor("layerview_ghost").getRgb()))
- for node in DepthFirstIterator(scene.getRoot()): # type: ignore
+ for node in DepthFirstIterator(scene.getRoot()):
# We do not want to render ConvexHullNode as it conflicts with the bottom layers.
# However, it is somewhat relevant when the node is selected, so do render it then.
- if type(node) is ConvexHullNode and not Selection.isSelected(node.getWatchedNode()):
+ if type(node) is ConvexHullNode and not Selection.isSelected(cast(ConvexHullNode, node).getWatchedNode()):
continue
if not node.render(renderer):
@@ -384,7 +386,7 @@ class SimulationView(CuraView):
self._max_thickness = max(float(p.lineThicknesses.max()), self._max_thickness)
try:
self._min_thickness = min(float(p.lineThicknesses[numpy.nonzero(p.lineThicknesses)].min()), self._min_thickness)
- except:
+ except ValueError:
# Sometimes, when importing a GCode the line thicknesses are zero and so the minimum (avoiding
# the zero) can't be calculated
Logger.log("i", "Min thickness can't be calculated because all the values are zero")
@@ -441,6 +443,8 @@ class SimulationView(CuraView):
## Hackish way to ensure the proxy is already created, which ensures that the layerview.qml is already created
# as this caused some issues.
def getProxy(self, engine, script_engine):
+ if self._proxy is None:
+ self._proxy = SimulationViewProxy(self)
return self._proxy
def endRendering(self) -> None:
@@ -460,6 +464,13 @@ class SimulationView(CuraView):
return True
if event.type == Event.ViewActivateEvent:
+ # Start listening to changes.
+ Application.getInstance().getPreferences().preferenceChanged.connect(self._onPreferencesChanged)
+ self._controller.getScene().getRoot().childrenChanged.connect(self._onSceneChanged)
+
+ self.calculateMaxLayers()
+ self.calculateMaxPathsOnLayer(self._current_layer_num)
+
# FIX: on Max OS X, somehow QOpenGLContext.currentContext() can become None during View switching.
# This can happen when you do the following steps:
# 1. Start Cura
@@ -506,6 +517,8 @@ class SimulationView(CuraView):
self._composite_pass.setCompositeShader(self._simulationview_composite_shader)
elif event.type == Event.ViewDeactivateEvent:
+ self._controller.getScene().getRoot().childrenChanged.disconnect(self._onSceneChanged)
+ Application.getInstance().getPreferences().preferenceChanged.disconnect(self._onPreferencesChanged)
self._wireprint_warning_message.hide()
Application.getInstance().globalContainerStackChanged.disconnect(self._onGlobalStackChanged)
if self._global_container_stack:
@@ -572,14 +585,14 @@ class SimulationView(CuraView):
self._current_layer_jumps = job.getResult().get("jumps")
self._controller.getScene().sceneChanged.emit(self._controller.getScene().getRoot())
- self._top_layers_job = None # type: Optional["_CreateTopLayersJob"]
+ self._top_layers_job = None
def _updateWithPreferences(self) -> None:
self._solid_layers = int(Application.getInstance().getPreferences().getValue("view/top_layer_count"))
self._only_show_top_layers = bool(Application.getInstance().getPreferences().getValue("view/only_show_top_layers"))
self._compatibility_mode = self._evaluateCompatibilityMode()
- self.setSimulationViewType(int(float(Application.getInstance().getPreferences().getValue("layerview/layer_view_type"))));
+ self.setSimulationViewType(int(float(Application.getInstance().getPreferences().getValue("layerview/layer_view_type"))))
for extruder_nr, extruder_opacity in enumerate(Application.getInstance().getPreferences().getValue("layerview/extruder_opacities").split("|")):
try:
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/SimulationView/SimulationViewProxy.py b/plugins/SimulationView/SimulationViewProxy.py
index a84b151983..58a004cc31 100644
--- a/plugins/SimulationView/SimulationViewProxy.py
+++ b/plugins/SimulationView/SimulationViewProxy.py
@@ -1,21 +1,24 @@
# Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
+from typing import TYPE_CHECKING
from PyQt5.QtCore import QObject, pyqtSignal, pyqtProperty
from UM.FlameProfiler import pyqtSlot
from UM.Application import Application
-import SimulationView
+if TYPE_CHECKING:
+ from .SimulationView import SimulationView
class SimulationViewProxy(QObject):
- def __init__(self, parent=None):
+ def __init__(self, simulation_view: "SimulationView", parent=None):
super().__init__(parent)
+ self._simulation_view = simulation_view
self._current_layer = 0
self._controller = Application.getInstance().getController()
self._controller.activeViewChanged.connect(self._onActiveViewChanged)
- self._onActiveViewChanged()
self.is_simulationView_selected = False
+ self._onActiveViewChanged()
currentLayerChanged = pyqtSignal()
currentPathChanged = pyqtSignal()
@@ -28,182 +31,112 @@ class SimulationViewProxy(QObject):
@pyqtProperty(bool, notify=activityChanged)
def layerActivity(self):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- return active_view.getActivity()
- return False
+ return self._simulation_view.getActivity()
@pyqtProperty(int, notify=maxLayersChanged)
def numLayers(self):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- return active_view.getMaxLayers()
- return 0
+ return self._simulation_view.getMaxLayers()
@pyqtProperty(int, notify=currentLayerChanged)
def currentLayer(self):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- return active_view.getCurrentLayer()
- return 0
+ return self._simulation_view.getCurrentLayer()
@pyqtProperty(int, notify=currentLayerChanged)
def minimumLayer(self):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- return active_view.getMinimumLayer()
- return 0
+ return self._simulation_view.getMinimumLayer()
@pyqtProperty(int, notify=maxPathsChanged)
def numPaths(self):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- return active_view.getMaxPaths()
- return 0
+ return self._simulation_view.getMaxPaths()
@pyqtProperty(int, notify=currentPathChanged)
def currentPath(self):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- return active_view.getCurrentPath()
- return 0
+ return self._simulation_view.getCurrentPath()
@pyqtProperty(int, notify=currentPathChanged)
def minimumPath(self):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- return active_view.getMinimumPath()
- return 0
+ return self._simulation_view.getMinimumPath()
@pyqtProperty(bool, notify=busyChanged)
def busy(self):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- return active_view.isBusy()
- return False
+ return self._simulation_view.isBusy()
@pyqtProperty(bool, notify=preferencesChanged)
def compatibilityMode(self):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- return active_view.getCompatibilityMode()
- return False
+ return self._simulation_view.getCompatibilityMode()
+
+ @pyqtProperty(int, notify=globalStackChanged)
+ def extruderCount(self):
+ return self._simulation_view.getExtruderCount()
@pyqtSlot(int)
def setCurrentLayer(self, layer_num):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- active_view.setLayer(layer_num)
+ self._simulation_view.setLayer(layer_num)
@pyqtSlot(int)
def setMinimumLayer(self, layer_num):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- active_view.setMinimumLayer(layer_num)
+ self._simulation_view.setMinimumLayer(layer_num)
@pyqtSlot(int)
def setCurrentPath(self, path_num):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- active_view.setPath(path_num)
+ self._simulation_view.setPath(path_num)
@pyqtSlot(int)
def setMinimumPath(self, path_num):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- active_view.setMinimumPath(path_num)
+ self._simulation_view.setMinimumPath(path_num)
@pyqtSlot(int)
def setSimulationViewType(self, layer_view_type):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- active_view.setSimulationViewType(layer_view_type)
+ self._simulation_view.setSimulationViewType(layer_view_type)
@pyqtSlot(result=int)
def getSimulationViewType(self):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- return active_view.getSimulationViewType()
- return 0
+ return self._simulation_view.getSimulationViewType()
@pyqtSlot(bool)
def setSimulationRunning(self, running):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- active_view.setSimulationRunning(running)
+ self._simulation_view.setSimulationRunning(running)
@pyqtSlot(result=bool)
def getSimulationRunning(self):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- return active_view.isSimulationRunning()
- return False
+ return self._simulation_view.isSimulationRunning()
@pyqtSlot(result=float)
def getMinFeedrate(self):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- return active_view.getMinFeedrate()
- return 0
+ return self._simulation_view.getMinFeedrate()
@pyqtSlot(result=float)
def getMaxFeedrate(self):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- return active_view.getMaxFeedrate()
- return 0
+ return self._simulation_view.getMaxFeedrate()
@pyqtSlot(result=float)
def getMinThickness(self):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- return active_view.getMinThickness()
- return 0
+ return self._simulation_view.getMinThickness()
@pyqtSlot(result=float)
def getMaxThickness(self):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- return active_view.getMaxThickness()
- return 0
+ return self._simulation_view.getMaxThickness()
# Opacity 0..1
@pyqtSlot(int, float)
def setExtruderOpacity(self, extruder_nr, opacity):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- active_view.setExtruderOpacity(extruder_nr, opacity)
+ self._simulation_view.setExtruderOpacity(extruder_nr, opacity)
@pyqtSlot(int)
def setShowTravelMoves(self, show):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- active_view.setShowTravelMoves(show)
+ self._simulation_view.setShowTravelMoves(show)
@pyqtSlot(int)
def setShowHelpers(self, show):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- active_view.setShowHelpers(show)
+ self._simulation_view.setShowHelpers(show)
@pyqtSlot(int)
def setShowSkin(self, show):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- active_view.setShowSkin(show)
+ self._simulation_view.setShowSkin(show)
@pyqtSlot(int)
def setShowInfill(self, show):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- active_view.setShowInfill(show)
-
- @pyqtProperty(int, notify=globalStackChanged)
- def extruderCount(self):
- active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- return active_view.getExtruderCount()
- return 0
+ self._simulation_view.setShowInfill(show)
def _layerActivityChanged(self):
self.activityChanged.emit()
@@ -236,24 +169,25 @@ class SimulationViewProxy(QObject):
def _onActiveViewChanged(self):
active_view = self._controller.getActiveView()
- if isinstance(active_view, SimulationView.SimulationView.SimulationView):
- # remove other connection if once the SimulationView was created.
- if self.is_simulationView_selected:
- active_view.currentLayerNumChanged.disconnect(self._onLayerChanged)
- active_view.currentPathNumChanged.disconnect(self._onPathChanged)
- active_view.maxLayersChanged.disconnect(self._onMaxLayersChanged)
- active_view.maxPathsChanged.disconnect(self._onMaxPathsChanged)
- active_view.busyChanged.disconnect(self._onBusyChanged)
- active_view.activityChanged.disconnect(self._onActivityChanged)
- active_view.globalStackChanged.disconnect(self._onGlobalStackChanged)
- active_view.preferencesChanged.disconnect(self._onPreferencesChanged)
-
+ if active_view == self._simulation_view:
+ self._simulation_view.currentLayerNumChanged.connect(self._onLayerChanged)
+ self._simulation_view.currentPathNumChanged.connect(self._onPathChanged)
+ self._simulation_view.maxLayersChanged.connect(self._onMaxLayersChanged)
+ self._simulation_view.maxPathsChanged.connect(self._onMaxPathsChanged)
+ self._simulation_view.busyChanged.connect(self._onBusyChanged)
+ self._simulation_view.activityChanged.connect(self._onActivityChanged)
+ self._simulation_view.globalStackChanged.connect(self._onGlobalStackChanged)
+ self._simulation_view.preferencesChanged.connect(self._onPreferencesChanged)
self.is_simulationView_selected = True
- active_view.currentLayerNumChanged.connect(self._onLayerChanged)
- active_view.currentPathNumChanged.connect(self._onPathChanged)
- active_view.maxLayersChanged.connect(self._onMaxLayersChanged)
- active_view.maxPathsChanged.connect(self._onMaxPathsChanged)
- active_view.busyChanged.connect(self._onBusyChanged)
- active_view.activityChanged.connect(self._onActivityChanged)
- active_view.globalStackChanged.connect(self._onGlobalStackChanged)
- active_view.preferencesChanged.connect(self._onPreferencesChanged)
+ elif self.is_simulationView_selected:
+ # Disconnect all of em again.
+ self.is_simulationView_selected = False
+ self._simulation_view.currentLayerNumChanged.disconnect(self._onLayerChanged)
+ self._simulation_view.currentPathNumChanged.disconnect(self._onPathChanged)
+ self._simulation_view.maxLayersChanged.disconnect(self._onMaxLayersChanged)
+ self._simulation_view.maxPathsChanged.disconnect(self._onMaxPathsChanged)
+ self._simulation_view.busyChanged.disconnect(self._onBusyChanged)
+ self._simulation_view.activityChanged.disconnect(self._onActivityChanged)
+ self._simulation_view.globalStackChanged.disconnect(self._onGlobalStackChanged)
+ self._simulation_view.preferencesChanged.disconnect(self._onPreferencesChanged)
+
diff --git a/plugins/SimulationView/layers.shader b/plugins/SimulationView/layers.shader
index 69c7c61ee5..11b049c9fe 100644
--- a/plugins/SimulationView/layers.shader
+++ b/plugins/SimulationView/layers.shader
@@ -1,6 +1,9 @@
[shaders]
vertex =
- uniform highp mat4 u_modelViewProjectionMatrix;
+ uniform highp mat4 u_modelMatrix;
+ uniform highp mat4 u_viewMatrix;
+ uniform highp mat4 u_projectionMatrix;
+
uniform lowp float u_active_extruder;
uniform lowp float u_shade_factor;
uniform highp int u_layer_view_type;
@@ -16,7 +19,7 @@ vertex =
void main()
{
- gl_Position = u_modelViewProjectionMatrix * a_vertex;
+ gl_Position = u_projectionMatrix * u_viewMatrix * u_modelMatrix * a_vertex;
// shade the color depending on the extruder index
v_color = a_color;
// 8 and 9 are travel moves
@@ -76,7 +79,10 @@ fragment =
vertex41core =
#version 410
- uniform highp mat4 u_modelViewProjectionMatrix;
+ uniform highp mat4 u_modelMatrix;
+ uniform highp mat4 u_viewMatrix;
+ uniform highp mat4 u_projectionMatrix;
+
uniform lowp float u_active_extruder;
uniform lowp float u_shade_factor;
uniform highp int u_layer_view_type;
@@ -92,7 +98,7 @@ vertex41core =
void main()
{
- gl_Position = u_modelViewProjectionMatrix * a_vertex;
+ gl_Position = u_projectionMatrix * u_viewMatrix * u_modelMatrix * a_vertex;
v_color = a_color;
if ((a_line_type != 8) && (a_line_type != 9)) {
v_color = (a_extruder == u_active_extruder) ? v_color : vec4(u_shade_factor * v_color.rgb, v_color.a);
@@ -154,7 +160,9 @@ u_show_skin = 1
u_show_infill = 1
[bindings]
-u_modelViewProjectionMatrix = model_view_projection_matrix
+u_modelMatrix = model_matrix
+u_viewMatrix = view_matrix
+u_projectionMatrix = projection_matrix
[attributes]
a_vertex = vertex
diff --git a/plugins/SimulationView/layers3d.shader b/plugins/SimulationView/layers3d.shader
index a277606509..ecd96c3f68 100644
--- a/plugins/SimulationView/layers3d.shader
+++ b/plugins/SimulationView/layers3d.shader
@@ -1,10 +1,10 @@
[shaders]
vertex41core =
#version 410
- uniform highp mat4 u_modelViewProjectionMatrix;
-
uniform highp mat4 u_modelMatrix;
- uniform highp mat4 u_viewProjectionMatrix;
+ uniform highp mat4 u_viewMatrix;
+ uniform highp mat4 u_projectionMatrix;
+
uniform lowp float u_active_extruder;
uniform lowp float u_max_feedrate;
uniform lowp float u_min_feedrate;
@@ -104,7 +104,10 @@ vertex41core =
geometry41core =
#version 410
- uniform highp mat4 u_viewProjectionMatrix;
+ uniform highp mat4 u_modelMatrix;
+ uniform highp mat4 u_viewMatrix;
+ uniform highp mat4 u_projectionMatrix;
+
uniform int u_show_travel_moves;
uniform int u_show_helpers;
uniform int u_show_skin;
@@ -136,6 +139,8 @@ geometry41core =
void main()
{
+ highp mat4 viewProjectionMatrix = u_projectionMatrix * u_viewMatrix;
+
vec4 g_vertex_delta;
vec3 g_vertex_normal_horz; // horizontal and vertical in respect to layers
vec4 g_vertex_offset_horz; // vec4 to match gl_in[x].gl_Position
@@ -183,65 +188,83 @@ geometry41core =
g_vertex_offset_vert = vec4(g_vertex_normal_vert * size_y, 0.0);
if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) {
+ vec4 va_head = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head + g_vertex_offset_vert);
+ vec4 va_up = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert);
+ vec4 va_down = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert);
+ vec4 vb_head = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head + g_vertex_offset_vert);
+ vec4 vb_down = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert);
+ vec4 vb_up = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert);
+
// Travels: flat plane with pointy ends
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head + g_vertex_offset_vert));
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_up);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_head);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_down);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_up);
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_down);
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_up);
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_head);
//And reverse so that the line is also visible from the back side.
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert));
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_up);
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_down);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_up);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_down);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_head);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_up);
EndPrimitive();
} else {
+ vec4 va_m_horz = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz);
+ vec4 vb_m_horz = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz);
+ vec4 va_p_vert = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert);
+ vec4 vb_p_vert = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert);
+ vec4 va_p_horz = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz);
+ vec4 vb_p_horz = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz);
+ vec4 va_m_vert = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert);
+ vec4 vb_m_vert = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert);
+ vec4 va_head = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head);
+ vec4 vb_head = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head);
+
// All normal lines are rendered as 3d tubes.
- myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz));
- myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert));
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz));
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz));
- myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert));
- myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz));
- myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz));
+ myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, va_m_horz);
+ myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, vb_m_horz);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_p_vert);
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_p_vert);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, va_p_horz);
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, vb_p_horz);
+ myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, va_m_vert);
+ myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, vb_m_vert);
+ myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, va_m_horz);
+ myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, vb_m_horz);
EndPrimitive();
// left side
- myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz));
+ myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, va_m_horz);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_p_vert);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, va_head);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, va_p_horz);
EndPrimitive();
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz));
- myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head));
- myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz));
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, va_p_horz);
+ myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, va_m_vert);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, va_head);
+ myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, va_m_horz);
EndPrimitive();
// right side
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz));
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert));
- myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head));
- myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz));
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, vb_p_horz);
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_p_vert);
+ myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, vb_head);
+ myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, vb_m_horz);
EndPrimitive();
- myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz));
- myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert));
- myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head));
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz));
+ myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, vb_m_horz);
+ myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, vb_m_vert);
+ myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, vb_head);
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, vb_p_horz);
EndPrimitive();
}
@@ -301,9 +324,9 @@ u_min_thickness = 0
u_max_thickness = 1
[bindings]
-u_modelViewProjectionMatrix = model_view_projection_matrix
u_modelMatrix = model_matrix
-u_viewProjectionMatrix = view_projection_matrix
+u_viewMatrix = view_matrix
+u_projectionMatrix = projection_matrix
u_normalMatrix = normal_matrix
u_lightPosition = light_0_position
diff --git a/plugins/SimulationView/layers3d_shadow.shader b/plugins/SimulationView/layers3d_shadow.shader
index 15136fcf3f..b2ed7f8c12 100644
--- a/plugins/SimulationView/layers3d_shadow.shader
+++ b/plugins/SimulationView/layers3d_shadow.shader
@@ -1,10 +1,10 @@
[shaders]
vertex41core =
#version 410
- uniform highp mat4 u_modelViewProjectionMatrix;
-
uniform highp mat4 u_modelMatrix;
- uniform highp mat4 u_viewProjectionMatrix;
+ uniform highp mat4 u_viewMatrix;
+ uniform highp mat4 u_projectionMatrix;
+
uniform lowp float u_active_extruder;
uniform lowp vec4 u_extruder_opacity; // currently only for max 4 extruders, others always visible
@@ -58,7 +58,10 @@ vertex41core =
geometry41core =
#version 410
- uniform highp mat4 u_viewProjectionMatrix;
+ uniform highp mat4 u_modelMatrix;
+ uniform highp mat4 u_viewMatrix;
+ uniform highp mat4 u_projectionMatrix;
+
uniform int u_show_travel_moves;
uniform int u_show_helpers;
uniform int u_show_skin;
@@ -90,6 +93,8 @@ geometry41core =
void main()
{
+ highp mat4 viewProjectionMatrix = u_projectionMatrix * u_viewMatrix;
+
vec4 g_vertex_delta;
vec3 g_vertex_normal_horz; // horizontal and vertical in respect to layers
vec4 g_vertex_offset_horz; // vec4 to match gl_in[x].gl_Position
@@ -137,65 +142,83 @@ geometry41core =
g_vertex_offset_vert = vec4(g_vertex_normal_vert * size_y, 0.0);
if ((v_line_type[0] == 8) || (v_line_type[0] == 9)) {
+ vec4 va_head = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head + g_vertex_offset_vert);
+ vec4 va_up = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert);
+ vec4 va_down = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert);
+ vec4 vb_head = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head + g_vertex_offset_vert);
+ vec4 vb_down = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert);
+ vec4 vb_up = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert);
+
// Travels: flat plane with pointy ends
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head + g_vertex_offset_vert));
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_up);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_head);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_down);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_up);
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_down);
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_up);
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_head);
//And reverse so that the line is also visible from the back side.
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz + g_vertex_offset_vert));
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_up);
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_down);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_up);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_down);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_head);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_up);
EndPrimitive();
} else {
+ vec4 va_m_horz = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz);
+ vec4 vb_m_horz = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz);
+ vec4 va_p_vert = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert);
+ vec4 vb_p_vert = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert);
+ vec4 va_p_horz = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz);
+ vec4 vb_p_horz = viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz);
+ vec4 va_m_vert = viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert);
+ vec4 vb_m_vert = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert);
+ vec4 va_head = viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head);
+ vec4 vb_head = viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head);
+
// All normal lines are rendered as 3d tubes.
- myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz));
- myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert));
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz));
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz));
- myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert));
- myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz));
- myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz));
+ myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, va_m_horz);
+ myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, vb_m_horz);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_p_vert);
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_p_vert);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, va_p_horz);
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, vb_p_horz);
+ myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, va_m_vert);
+ myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, vb_m_vert);
+ myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, va_m_horz);
+ myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, vb_m_horz);
EndPrimitive();
// left side
- myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz));
+ myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, va_m_horz);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_vert, va_p_vert);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, va_head);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, va_p_horz);
EndPrimitive();
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz));
- myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_vert));
- myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[0].gl_Position + g_vertex_offset_horz_head));
- myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[0].gl_Position - g_vertex_offset_horz));
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz, va_p_horz);
+ myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_vert, va_m_vert);
+ myEmitVertex(v_vertex[0], v_color[0], g_vertex_normal_horz_head, va_head);
+ myEmitVertex(v_vertex[0], v_color[0], -g_vertex_normal_horz, va_m_horz);
EndPrimitive();
// right side
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz));
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_vert));
- myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head));
- myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz));
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, vb_p_horz);
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_vert, vb_p_vert);
+ myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, vb_head);
+ myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, vb_m_horz);
EndPrimitive();
- myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz));
- myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_vert));
- myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, u_viewProjectionMatrix * (gl_in[1].gl_Position - g_vertex_offset_horz_head));
- myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, u_viewProjectionMatrix * (gl_in[1].gl_Position + g_vertex_offset_horz));
+ myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz, vb_m_horz);
+ myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_vert, vb_m_vert);
+ myEmitVertex(v_vertex[1], v_color[1], -g_vertex_normal_horz_head, vb_head);
+ myEmitVertex(v_vertex[1], v_color[1], g_vertex_normal_horz, vb_p_horz);
EndPrimitive();
}
@@ -246,9 +269,9 @@ u_show_skin = 1
u_show_infill = 1
[bindings]
-u_modelViewProjectionMatrix = model_view_projection_matrix
u_modelMatrix = model_matrix
-u_viewProjectionMatrix = view_projection_matrix
+u_viewMatrix = view_matrix
+u_projectionMatrix = projection_matrix
u_normalMatrix = normal_matrix
u_lightPosition = light_0_position
diff --git a/plugins/SimulationView/layers_shadow.shader b/plugins/SimulationView/layers_shadow.shader
index 6149cc1703..8f500536a5 100644
--- a/plugins/SimulationView/layers_shadow.shader
+++ b/plugins/SimulationView/layers_shadow.shader
@@ -1,6 +1,9 @@
[shaders]
vertex =
- uniform highp mat4 u_modelViewProjectionMatrix;
+ uniform highp mat4 u_modelMatrix;
+ uniform highp mat4 u_viewMatrix;
+ uniform highp mat4 u_projectionMatrix;
+
uniform lowp float u_active_extruder;
uniform lowp float u_shade_factor;
uniform highp int u_layer_view_type;
@@ -16,7 +19,7 @@ vertex =
void main()
{
- gl_Position = u_modelViewProjectionMatrix * a_vertex;
+ gl_Position = u_projectionMatrix * u_viewMatrix * u_modelMatrix * a_vertex;
// shade the color depending on the extruder index
v_color = vec4(0.4, 0.4, 0.4, 0.9); // default color for not current layer;
// 8 and 9 are travel moves
@@ -80,7 +83,10 @@ fragment =
vertex41core =
#version 410
- uniform highp mat4 u_modelViewProjectionMatrix;
+ uniform highp mat4 u_modelMatrix;
+ uniform highp mat4 u_viewMatrix;
+ uniform highp mat4 u_projectionMatrix;
+
uniform lowp float u_active_extruder;
uniform lowp float u_shade_factor;
uniform highp int u_layer_view_type;
@@ -96,7 +102,7 @@ vertex41core =
void main()
{
- gl_Position = u_modelViewProjectionMatrix * a_vertex;
+ gl_Position = u_projectionMatrix * u_viewMatrix * u_modelMatrix * a_vertex;
v_color = vec4(0.4, 0.4, 0.4, 0.9); // default color for not current layer
// if ((a_line_type != 8) && (a_line_type != 9)) {
// v_color = (a_extruder == u_active_extruder) ? v_color : vec4(u_shade_factor * v_color.rgb, v_color.a);
@@ -159,7 +165,9 @@ u_show_skin = 1
u_show_infill = 1
[bindings]
-u_modelViewProjectionMatrix = model_view_projection_matrix
+u_modelMatrix = model_matrix
+u_viewMatrix = view_matrix
+u_projectionMatrix = projection_matrix
[attributes]
a_vertex = vertex
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..9308719227 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()
@@ -140,6 +126,10 @@ class SliceInfo(QObject, Extension):
else:
data["active_mode"] = "custom"
+ data["camera_view"] = application.getPreferences().getValue("general/camera_perspective_mode")
+ if data["camera_view"] == "orthographic":
+ data["camera_view"] = "orthogonal" #The database still only recognises the old name "orthogonal".
+
definition_changes = global_stack.definitionChanges
machine_settings_changed_by_user = False
if definition_changes.getId() != "empty":
@@ -195,6 +185,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/SliceInfoJob.py b/plugins/SliceInfoPlugin/SliceInfoJob.py
index a5667c1c13..50d6b560f1 100644
--- a/plugins/SliceInfoPlugin/SliceInfoJob.py
+++ b/plugins/SliceInfoPlugin/SliceInfoJob.py
@@ -8,6 +8,8 @@ import ssl
import urllib.request
import urllib.error
+import certifi
+
class SliceInfoJob(Job):
def __init__(self, url, data):
@@ -20,11 +22,14 @@ class SliceInfoJob(Job):
Logger.log("e", "URL or DATA for sending slice info was not set!")
return
- # Submit data
- kwoptions = {"data" : self._data, "timeout" : 5}
+ # CURA-6698 Create an SSL context and use certifi CA certificates for verification.
+ context = ssl.SSLContext(protocol = ssl.PROTOCOL_TLSv1_2)
+ context.load_verify_locations(cafile = certifi.where())
- if Platform.isOSX():
- kwoptions["context"] = ssl._create_unverified_context()
+ # Submit data
+ kwoptions = {"data": self._data,
+ "timeout": 5,
+ "context": context}
Logger.log("i", "Sending anonymous slice info to [%s]...", self._url)
@@ -35,4 +40,4 @@ class SliceInfoJob(Job):
except urllib.error.HTTPError:
Logger.logException("e", "An HTTP error occurred while trying to send slice information")
except Exception: # We don't want any exception to cause problems
- Logger.logException("e", "An exception occurred while trying to send slice information")
\ No newline at end of file
+ Logger.logException("e", "An exception occurred while trying to send slice information")
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..a8cff675d9 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:
@@ -112,6 +139,10 @@ class SolidView(View):
shade_factor * int(material_color[5:7], 16) / 255,
1.0
]
+
+ # Color the currently selected face-id.
+ face = Selection.getSelectedFace()
+ uniforms["selected_face"] = (Selection.getMaxFaceSelectionId() + 1) if not face or node != face[0] else face[1]
except ValueError:
pass
diff --git a/plugins/SupportEraser/SupportEraser.py b/plugins/SupportEraser/SupportEraser.py
index 0683c48635..35f597dcc5 100644
--- a/plugins/SupportEraser/SupportEraser.py
+++ b/plugins/SupportEraser/SupportEraser.py
@@ -98,8 +98,10 @@ class SupportEraser(Tool):
node.setName("Eraser")
node.setSelectable(True)
+ node.setCalculateBoundingBox(True)
mesh = self._createCube(10)
node.setMeshData(mesh.build())
+ node.calculateBoundingBoxMesh()
active_build_plate = CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate
node.addDecorator(BuildPlateDecorator(active_build_plate))
diff --git a/plugins/Toolbox/resources/qml/Toolbox.qml b/plugins/Toolbox/resources/qml/Toolbox.qml
index d15d98eed7..f70dab03d8 100644
--- a/plugins/Toolbox/resources/qml/Toolbox.qml
+++ b/plugins/Toolbox/resources/qml/Toolbox.qml
@@ -48,32 +48,32 @@ Window
ToolboxLoadingPage
{
id: viewLoading
- visible: toolbox.viewCategory != "installed" && toolbox.viewPage == "loading"
+ visible: toolbox.viewCategory !== "installed" && toolbox.viewPage === "loading"
}
ToolboxErrorPage
{
id: viewErrored
- visible: toolbox.viewCategory != "installed" && toolbox.viewPage == "errored"
+ visible: toolbox.viewCategory !== "installed" && toolbox.viewPage === "errored"
}
ToolboxDownloadsPage
{
id: viewDownloads
- visible: toolbox.viewCategory != "installed" && toolbox.viewPage == "overview"
+ visible: toolbox.viewCategory !== "installed" && toolbox.viewPage === "overview"
}
ToolboxDetailPage
{
id: viewDetail
- visible: toolbox.viewCategory != "installed" && toolbox.viewPage == "detail"
+ visible: toolbox.viewCategory !== "installed" && toolbox.viewPage === "detail"
}
ToolboxAuthorPage
{
id: viewAuthor
- visible: toolbox.viewCategory != "installed" && toolbox.viewPage == "author"
+ visible: toolbox.viewCategory !== "installed" && toolbox.viewPage === "author"
}
ToolboxInstalledPage
{
id: installedPluginList
- visible: toolbox.viewCategory == "installed"
+ visible: toolbox.viewCategory === "installed"
}
}
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/ToolboxCompatibilityChart.qml b/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml
index db4e8c628f..1d1344fa9a 100644
--- a/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml
@@ -1,9 +1,9 @@
-// Copyright (c) 2018 Ultimaker B.V.
+// Copyright (c) 2019 Ultimaker B.V.
// Toolbox is released under the terms of the LGPLv3 or higher.
import QtQuick 2.10
import QtQuick.Controls 1.4
-import QtQuick.Controls.Styles 1.4
+
import UM 1.1 as UM
Item
@@ -11,48 +11,17 @@ Item
id: base
property var packageData
- property var technicalDataSheetUrl:
- {
- var link = undefined
- if ("Technical Data Sheet" in packageData.links)
- {
- // HACK: This is the way the old API (used in 3.6-beta) used to do it. For safety it's still here,
- // but it can be removed over time.
- link = packageData.links["Technical Data Sheet"]
- }
- else if ("technicalDataSheet" in packageData.links)
- {
- link = packageData.links["technicalDataSheet"]
- }
- return link
- }
- property var safetyDataSheetUrl:
- {
- var sds_name = "safetyDataSheet"
- return (sds_name in packageData.links) ? packageData.links[sds_name] : undefined
- }
- property var printingGuidelinesUrl:
- {
- var pg_name = "printingGuidelines"
- return (pg_name in packageData.links) ? packageData.links[pg_name] : undefined
- }
+ property var technicalDataSheetUrl: packageData.links.technicalDataSheet
+ property var safetyDataSheetUrl: packageData.links.safetyDataSheet
+ property var printingGuidelinesUrl: packageData.links.printingGuidelines
+ property var materialWebsiteUrl: packageData.links.website
- property var materialWebsiteUrl:
- {
- var pg_name = "website"
- return (pg_name in packageData.links) ? packageData.links[pg_name] : undefined
- }
- anchors.topMargin: UM.Theme.getSize("default_margin").height
- height: visible ? childrenRect.height : 0
+ height: childrenRect.height
+ onVisibleChanged: packageData.type === "material" && (compatibilityItem.visible || dataSheetLinks.visible)
- visible: packageData.type == "material" &&
- (packageData.has_configs || technicalDataSheetUrl !== undefined ||
- safetyDataSheetUrl !== undefined || printingGuidelinesUrl !== undefined ||
- materialWebsiteUrl !== undefined)
-
- Item
+ Column
{
- id: combatibilityItem
+ id: compatibilityItem
visible: packageData.has_configs
width: parent.width
// This is a bit of a hack, but the whole QML is pretty messy right now. This needs a big overhaul.
@@ -61,7 +30,6 @@ Item
Label
{
id: heading
- anchors.topMargin: UM.Theme.getSize("default_margin").height
width: parent.width
text: catalog.i18nc("@label", "Compatibility")
wrapMode: Text.WordWrap
@@ -73,8 +41,6 @@ Item
TableView
{
id: table
- anchors.top: heading.bottom
- anchors.topMargin: UM.Theme.getSize("default_margin").height
width: parent.width
frameVisible: false
@@ -155,32 +121,32 @@ Item
TableViewColumn
{
role: "machine"
- title: "Machine"
+ title: catalog.i18nc("@label:table_header", "Machine")
width: Math.floor(table.width * 0.25)
delegate: columnTextDelegate
}
TableViewColumn
{
role: "print_core"
- title: "Print Core"
+ title: catalog.i18nc("@label:table_header", "Print Core")
width: Math.floor(table.width * 0.2)
}
TableViewColumn
{
role: "build_plate"
- title: "Build Plate"
+ title: catalog.i18nc("@label:table_header", "Build Plate")
width: Math.floor(table.width * 0.225)
}
TableViewColumn
{
role: "support_material"
- title: "Support"
+ title: catalog.i18nc("@label:table_header", "Support")
width: Math.floor(table.width * 0.225)
}
TableViewColumn
{
role: "quality"
- title: "Quality"
+ title: catalog.i18nc("@label:table_header", "Quality")
width: Math.floor(table.width * 0.1)
}
}
@@ -188,13 +154,14 @@ Item
Label
{
- id: data_sheet_links
- anchors.top: combatibilityItem.bottom
- anchors.topMargin: UM.Theme.getSize("default_margin").height / 2
+ id: dataSheetLinks
+ anchors.top: compatibilityItem.bottom
+ anchors.topMargin: UM.Theme.getSize("narrow_margin").height
visible: base.technicalDataSheetUrl !== undefined ||
- base.safetyDataSheetUrl !== undefined || base.printingGuidelinesUrl !== undefined ||
- base.materialWebsiteUrl !== undefined
- height: visible ? contentHeight : 0
+ base.safetyDataSheetUrl !== undefined ||
+ base.printingGuidelinesUrl !== undefined ||
+ base.materialWebsiteUrl !== undefined
+
text:
{
var result = ""
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/ToolboxDetailList.qml b/plugins/Toolbox/resources/qml/ToolboxDetailList.qml
index 4e44ea7d0b..22c6b6045f 100644
--- a/plugins/Toolbox/resources/qml/ToolboxDetailList.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxDetailList.qml
@@ -1,9 +1,8 @@
-// Copyright (c) 2018 Ultimaker B.V.
+// Copyright (c) 2019 Ultimaker B.V.
// Toolbox is released under the terms of the LGPLv3 or higher.
-import QtQuick 2.7
-import QtQuick.Controls 1.4
-import QtQuick.Controls.Styles 1.4
+import QtQuick 2.10
+import QtQuick.Controls 2.3
import UM 1.1 as UM
Item
@@ -11,10 +10,9 @@ Item
id: detailList
ScrollView
{
- frameVisible: false
+ clip: true
anchors.fill: detailList
- style: UM.Theme.styles.scrollview
- flickableItem.flickableDirection: Flickable.VerticalFlick
+
Column
{
anchors
diff --git a/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml b/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml
index fef2732af9..1773ef9053 100644
--- a/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml
@@ -89,6 +89,7 @@ Item
Label
{
text: catalog.i18nc("@label", "Your rating") + ":"
+ visible: details.type == "plugin"
font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text_medium")
renderType: Text.NativeRendering
diff --git a/plugins/Toolbox/resources/qml/ToolboxDetailTile.qml b/plugins/Toolbox/resources/qml/ToolboxDetailTile.qml
index c7bb1f60ac..5badc6b66d 100644
--- a/plugins/Toolbox/resources/qml/ToolboxDetailTile.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxDetailTile.qml
@@ -1,30 +1,30 @@
-// Copyright (c) 2018 Ultimaker B.V.
+// Copyright (c) 2019 Ultimaker B.V.
// Toolbox is released under the terms of the LGPLv3 or higher.
import QtQuick 2.10
-import QtQuick.Controls 1.4
-import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls 2.3
+
import UM 1.1 as UM
Item
{
id: tile
width: detailList.width - UM.Theme.getSize("wide_margin").width
- height: normalData.height + compatibilityChart.height + 4 * UM.Theme.getSize("default_margin").height
- Item
+ height: normalData.height + 2 * UM.Theme.getSize("wide_margin").height
+ Column
{
id: normalData
- height: childrenRect.height
+
anchors
{
+ top: parent.top
left: parent.left
right: controls.left
- rightMargin: UM.Theme.getSize("default_margin").width * 2 + UM.Theme.getSize("toolbox_loader").width
- top: parent.top
+ rightMargin: UM.Theme.getSize("wide_margin").width
}
+
Label
{
- id: packageName
width: parent.width
height: UM.Theme.getSize("toolbox_property_label").height
text: model.name
@@ -33,9 +33,9 @@ Item
font: UM.Theme.getFont("medium_bold")
renderType: Text.NativeRendering
}
+
Label
{
- anchors.top: packageName.bottom
width: parent.width
text: model.description
maximumLineCount: 25
@@ -45,6 +45,12 @@ Item
font: UM.Theme.getFont("default")
renderType: Text.NativeRendering
}
+
+ ToolboxCompatibilityChart
+ {
+ width: parent.width
+ packageData: model
+ }
}
ToolboxDetailTileActions
@@ -57,20 +63,12 @@ Item
packageData: model
}
- ToolboxCompatibilityChart
- {
- id: compatibilityChart
- anchors.top: normalData.bottom
- width: normalData.width
- packageData: model
- }
-
Rectangle
{
color: UM.Theme.getColor("lining")
width: tile.width
height: UM.Theme.getSize("default_lining").height
- anchors.top: compatibilityChart.bottom
+ anchors.top: normalData.bottom
anchors.topMargin: UM.Theme.getSize("default_margin").height + UM.Theme.getSize("wide_margin").height //Normal margin for spacing after chart, wide margin between items.
}
}
diff --git a/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml b/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml
index 60fe095537..dfe91edbf6 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
@@ -35,11 +35,12 @@ Column
// Don't allow installing while another download is running
enabled: installed || (!(toolbox.isDownloading && toolbox.activePackage != model) && !loginRequired)
opacity: enabled ? 1.0 : 0.5
- visible: !updateButton.visible && !installed// Don't show when the update button is visible
+ visible: !updateButton.visible && !installed // Don't show when the update button is visible
}
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/ToolboxDownloadsGrid.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsGrid.qml
index a9fcb39b28..6682281a31 100644
--- a/plugins/Toolbox/resources/qml/ToolboxDownloadsGrid.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsGrid.qml
@@ -2,9 +2,7 @@
// Toolbox is released under the terms of the LGPLv3 or higher.
import QtQuick 2.10
-import QtQuick.Controls 1.4
-import QtQuick.Controls.Styles 1.4
-import QtQuick.Layouts 1.3
+import QtQuick.Controls 2.3
import UM 1.1 as UM
Column
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/ToolboxDownloadsPage.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml
index 3e0dda4f4a..57fb3a9279 100644
--- a/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml
@@ -1,25 +1,22 @@
-// Copyright (c) 2018 Ultimaker B.V.
+// Copyright (c) 2019 Ultimaker B.V.
// Toolbox is released under the terms of the LGPLv3 or higher.
-import QtQuick 2.7
-import QtQuick.Controls 1.4
-import QtQuick.Controls.Styles 1.4
+import QtQuick 2.10
+import QtQuick.Controls 2.3
import UM 1.1 as UM
ScrollView
{
- frameVisible: false
+ clip: true
width: parent.width
height: parent.height
- style: UM.Theme.styles.scrollview
-
- flickableItem.flickableDirection: Flickable.VerticalFlick
+ contentHeight: mainColumn.height
Column
{
+ id: mainColumn
width: base.width
spacing: UM.Theme.getSize("default_margin").height
- height: childrenRect.height
ToolboxDownloadsShowcase
{
@@ -31,14 +28,14 @@ ScrollView
{
id: allPlugins
width: parent.width
- heading: toolbox.viewCategory == "material" ? catalog.i18nc("@label", "Community Contributions") : catalog.i18nc("@label", "Community Plugins")
- model: toolbox.viewCategory == "material" ? toolbox.materialsAvailableModel : toolbox.pluginsAvailableModel
+ heading: toolbox.viewCategory === "material" ? catalog.i18nc("@label", "Community Contributions") : catalog.i18nc("@label", "Community Plugins")
+ model: toolbox.viewCategory === "material" ? toolbox.materialsAvailableModel : toolbox.pluginsAvailableModel
}
ToolboxDownloadsGrid
{
id: genericMaterials
- visible: toolbox.viewCategory == "material"
+ visible: toolbox.viewCategory === "material"
width: parent.width
heading: catalog.i18nc("@label", "Generic Materials")
model: toolbox.materialsGenericModel
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/ToolboxInstalledPage.qml b/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml
index 0c43c67679..f4a9e634c4 100644
--- a/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml
@@ -1,50 +1,50 @@
-// Copyright (c) 2018 Ultimaker B.V.
+// Copyright (c) 2019 Ultimaker B.V.
// Toolbox is released under the terms of the LGPLv3 or higher.
import QtQuick 2.10
-import QtQuick.Dialogs 1.1
-import QtQuick.Window 2.2
-import QtQuick.Controls 1.4
-import QtQuick.Controls.Styles 1.4
+import QtQuick.Controls 2.3
import UM 1.1 as UM
ScrollView
{
id: page
- frameVisible: false
+ clip: true
width: parent.width
height: parent.height
- style: UM.Theme.styles.scrollview
- flickableItem.flickableDirection: Flickable.VerticalFlick
Column
{
+ width: page.width
spacing: UM.Theme.getSize("default_margin").height
+ padding: UM.Theme.getSize("wide_margin").width
visible: toolbox.pluginsInstalledModel.items.length > 0
- height: childrenRect.height + 4 * UM.Theme.getSize("default_margin").height
-
- anchors
- {
- right: parent.right
- left: parent.left
- margins: UM.Theme.getSize("default_margin").width
- top: parent.top
- }
+ height: childrenRect.height + 2 * UM.Theme.getSize("wide_margin").height
Label
{
- width: page.width
+ anchors
+ {
+ left: parent.left
+ right: parent.right
+ margins: parent.padding
+ }
text: catalog.i18nc("@title:tab", "Plugins")
color: UM.Theme.getColor("text_medium")
font: UM.Theme.getFont("large")
renderType: Text.NativeRendering
}
+
Rectangle
{
+ anchors
+ {
+ left: parent.left
+ right: parent.right
+ margins: parent.padding
+ }
id: installedPlugins
color: "transparent"
- width: parent.width
height: childrenRect.height + UM.Theme.getSize("default_margin").width
border.color: UM.Theme.getColor("lining")
border.width: UM.Theme.getSize("default_lining").width
@@ -65,8 +65,15 @@ ScrollView
}
}
}
+
Label
{
+ anchors
+ {
+ left: parent.left
+ right: parent.right
+ margins: parent.padding
+ }
text: catalog.i18nc("@title:tab", "Materials")
color: UM.Theme.getColor("text_medium")
font: UM.Theme.getFont("medium")
@@ -75,9 +82,14 @@ ScrollView
Rectangle
{
+ anchors
+ {
+ left: parent.left
+ right: parent.right
+ margins: parent.padding
+ }
id: installedMaterials
color: "transparent"
- width: parent.width
height: childrenRect.height + UM.Theme.getSize("default_margin").width
border.color: UM.Theme.getColor("lining")
border.width: UM.Theme.getSize("default_lining").width
diff --git a/plugins/Toolbox/resources/qml/ToolboxInstalledTile.qml b/plugins/Toolbox/resources/qml/ToolboxInstalledTile.qml
index f50c3f3ac6..f85a1056b7 100644
--- a/plugins/Toolbox/resources/qml/ToolboxInstalledTile.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxInstalledTile.qml
@@ -41,14 +41,13 @@ Item
Column
{
id: pluginInfo
- topPadding: Math.floor(UM.Theme.getSize("default_margin").height / 2)
+ topPadding: UM.Theme.getSize("narrow_margin").height
property var color: model.type === "plugin" && !isEnabled ? UM.Theme.getColor("lining") : UM.Theme.getColor("text")
width: Math.floor(tileRow.width - (authorInfo.width + pluginActions.width + 2 * tileRow.spacing + ((disableButton.visible) ? disableButton.width + tileRow.spacing : 0)))
Label
{
text: model.name
width: parent.width
- height: Math.floor(UM.Theme.getSize("toolbox_property_label").height)
wrapMode: Text.WordWrap
font: UM.Theme.getFont("large_bold")
color: pluginInfo.color
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/ToolboxProgressButton.qml b/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml
index 4d4ae92e73..40d6c1af47 100644
--- a/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml
+++ b/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml
@@ -1,16 +1,16 @@
-// Copyright (c) 2018 Ultimaker B.V.
+// Copyright (c) 2019 Ultimaker B.V.
// Toolbox is released under the terms of the LGPLv3 or higher.
-import QtQuick 2.2
-import QtQuick.Controls 1.4
-import QtQuick.Controls.Styles 1.4
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
import UM 1.1 as UM
import Cura 1.0 as Cura
-Item
+Cura.PrimaryButton
{
- id: base
+ id: button
property var active: false
property var complete: false
@@ -25,43 +25,36 @@ Item
width: UM.Theme.getSize("toolbox_action_button").width
height: UM.Theme.getSize("toolbox_action_button").height
-
- Cura.PrimaryButton
+ fixedWidthMode: true
+ text:
{
- id: button
- width: UM.Theme.getSize("toolbox_action_button").width
- height: UM.Theme.getSize("toolbox_action_button").height
- fixedWidthMode: true
- text:
+ if (complete)
{
- if (complete)
- {
- return completeLabel
- }
- else if (active)
- {
- return activeLabel
- }
- else
- {
- return readyLabel
- }
+ return completeLabel
}
- onClicked:
+ else if (active)
{
- if (complete)
- {
- completeAction()
- }
- else if (active)
- {
- activeAction()
- }
- else
- {
- readyAction()
- }
+ return activeLabel
+ }
+ else
+ {
+ return readyLabel
}
- busy: active
}
+ onClicked:
+ {
+ if (complete)
+ {
+ completeAction()
+ }
+ else if (active)
+ {
+ activeAction()
+ }
+ else
+ {
+ readyAction()
+ }
+ }
+ busy: active
}
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..4dabba87a0 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")
@@ -272,7 +278,7 @@ class Toolbox(QObject, Extension):
for plugin_id in old_plugin_ids:
# Neither the installed packages nor the packages that are scheduled to remove are old plugins
if plugin_id not in installed_package_ids and plugin_id not in scheduled_to_remove_package_ids:
- Logger.log("i", "Found a plugin that was installed with the old plugin browser: %s", plugin_id)
+ Logger.log("d", "Found a plugin that was installed with the old plugin browser: %s", plugin_id)
old_metadata = self._plugin_registry.getMetaData(plugin_id)
new_metadata = self._convertPluginMetadata(old_metadata)
@@ -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
@@ -550,7 +526,7 @@ class Toolbox(QObject, Extension):
# Make API Calls
# --------------------------------------------------------------------------
def _makeRequestByType(self, request_type: str) -> None:
- Logger.log("i", "Requesting %s metadata from server.", request_type)
+ Logger.log("d", "Requesting %s metadata from server.", request_type)
request = QNetworkRequest(self._request_urls[request_type])
for header_name, header_value in self._request_headers:
request.setRawHeader(header_name, header_value)
@@ -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
@@ -667,8 +655,12 @@ class Toolbox(QObject, Extension):
# Check if the download was sucessfull
if self._download_reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200:
- Logger.log("w", "Failed to download package. The following error was returned: %s", json.loads(bytes(self._download_reply.readAll()).decode("utf-8")))
- return
+ try:
+ Logger.log("w", "Failed to download package. The following error was returned: %s", json.loads(bytes(self._download_reply.readAll()).decode("utf-8")))
+ except json.decoder.JSONDecodeError:
+ Logger.logException("w", "Failed to download package and failed to parse a response from it")
+ finally:
+ return
# Must not delete the temporary file on Windows
self._temp_plugin_file = tempfile.NamedTemporaryFile(mode = "w+b", suffix = ".curapackage", delete = False)
file_path = self._temp_plugin_file.name
diff --git a/plugins/TrimeshReader/TrimeshReader.py b/plugins/TrimeshReader/TrimeshReader.py
new file mode 100644
index 0000000000..91f8423579
--- /dev/null
+++ b/plugins/TrimeshReader/TrimeshReader.py
@@ -0,0 +1,161 @@
+# Copyright (c) 2019 Ultimaker B.V., fieldOfView
+# Cura is released under the terms of the LGPLv3 or higher.
+
+# The _toMeshData function is taken from the AMFReader class which was built by fieldOfView.
+
+from typing import Any, List, Union, TYPE_CHECKING
+import numpy # To create the mesh data.
+import os.path # To create the mesh name for the resulting mesh.
+import trimesh # To load the files into a Trimesh.
+
+from UM.Mesh.MeshData import MeshData, calculateNormalsFromIndexedVertices # To construct meshes from the Trimesh data.
+from UM.Mesh.MeshReader import MeshReader # The plug-in type we're extending.
+from UM.MimeTypeDatabase import MimeTypeDatabase, MimeType # To add file types that we can open.
+from UM.Scene.GroupDecorator import GroupDecorator # Added to the parent node if we load multiple nodes at once.
+
+from cura.CuraApplication import CuraApplication
+from cura.Scene.BuildPlateDecorator import BuildPlateDecorator # Added to the resulting scene node.
+from cura.Scene.ConvexHullDecorator import ConvexHullDecorator # Added to group nodes if we load multiple nodes at once.
+from cura.Scene.CuraSceneNode import CuraSceneNode # To create a node in the scene after reading the file.
+from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator # Added to the resulting scene node.
+
+if TYPE_CHECKING:
+ from UM.Scene.SceneNode import SceneNode
+
+## Class that leverages Trimesh to import files.
+class TrimeshReader(MeshReader):
+ def __init__(self) -> None:
+ super().__init__()
+
+ self._supported_extensions = [".ctm", ".dae", ".gltf", ".glb", ".ply", ".zae"]
+ MimeTypeDatabase.addMimeType(
+ MimeType(
+ name = "application/x-ctm",
+ comment = "Open Compressed Triangle Mesh",
+ suffixes = ["ctm"]
+ )
+ )
+ MimeTypeDatabase.addMimeType(
+ MimeType(
+ name = "model/vnd.collada+xml",
+ comment = "COLLADA Digital Asset Exchange",
+ suffixes = ["dae"]
+ )
+ )
+ MimeTypeDatabase.addMimeType(
+ MimeType(
+ name = "model/gltf-binary",
+ comment = "glTF Binary",
+ suffixes = ["glb"]
+ )
+ )
+ MimeTypeDatabase.addMimeType(
+ MimeType(
+ name = "model/gltf+json",
+ comment = "glTF Embedded JSON",
+ suffixes = ["gltf"]
+ )
+ )
+ # Trimesh seems to have a bug when reading .off files.
+ #MimeTypeDatabase.addMimeType(
+ # MimeType(
+ # name = "application/x-off",
+ # comment = "Geomview Object File Format",
+ # suffixes = ["off"]
+ # )
+ #)
+ MimeTypeDatabase.addMimeType(
+ MimeType(
+ name = "application/x-ply", # Wikipedia lists the MIME type as "text/plain" but that won't do as it's not unique to PLY files.
+ comment = "Stanford Triangle Format",
+ suffixes = ["ply"]
+ )
+ )
+ MimeTypeDatabase.addMimeType(
+ MimeType(
+ name = "model/vnd.collada+xml+zip",
+ comment = "Compressed COLLADA Digital Asset Exchange",
+ suffixes = ["zae"]
+ )
+ )
+
+ ## Reads a file using Trimesh.
+ # \param file_name The file path. This is assumed to be one of the file
+ # types that Trimesh can read. It will not be checked again.
+ # \return A scene node that contains the file's contents.
+ def _read(self, file_name: str) -> Union["SceneNode", List["SceneNode"]]:
+ # CURA-6739
+ # GLTF files are essentially JSON files. If you directly give a file name to trimesh.load(), it will
+ # try to figure out the format, but for GLTF, it loads it as a binary file with flags "rb", and the json.load()
+ # doesn't like it. For some reason, this seems to happen with 3.5.7, but not 3.7.1. Below is a workaround to
+ # pass a file object that has been opened with "r" instead "rb" to load a GLTF file.
+ if file_name.lower().endswith(".gltf"):
+ mesh_or_scene = trimesh.load(open(file_name, "r", encoding = "utf-8"), file_type = "gltf")
+ else:
+ mesh_or_scene = trimesh.load(file_name)
+
+ meshes = [] # type: List[Union[trimesh.Trimesh, trimesh.Scene, Any]]
+ if isinstance(mesh_or_scene, trimesh.Trimesh):
+ meshes = [mesh_or_scene]
+ elif isinstance(mesh_or_scene, trimesh.Scene):
+ meshes = [mesh for mesh in mesh_or_scene.geometry.values()]
+
+ active_build_plate = CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate
+ nodes = [] # type: List[SceneNode]
+ for mesh in meshes:
+ if not isinstance(mesh, trimesh.Trimesh): # Trimesh can also receive point clouds, 2D paths, 3D paths or metadata. Skip those.
+ continue
+ mesh.merge_vertices()
+ mesh.remove_unreferenced_vertices()
+ mesh.fix_normals()
+ mesh_data = self._toMeshData(mesh)
+
+ file_base_name = os.path.basename(file_name)
+ new_node = CuraSceneNode()
+ new_node.setMeshData(mesh_data)
+ new_node.setSelectable(True)
+ new_node.setName(file_base_name if len(meshes) == 1 else "{file_base_name} {counter}".format(file_base_name = file_base_name, counter = str(len(nodes) + 1)))
+ new_node.addDecorator(BuildPlateDecorator(active_build_plate))
+ new_node.addDecorator(SliceableObjectDecorator())
+ nodes.append(new_node)
+
+ if len(nodes) == 1:
+ return nodes[0]
+ # Add all nodes to a group so they stay together.
+ group_node = CuraSceneNode()
+ group_node.addDecorator(GroupDecorator())
+ group_node.addDecorator(ConvexHullDecorator())
+ group_node.addDecorator(BuildPlateDecorator(active_build_plate))
+ for node in nodes:
+ node.setParent(group_node)
+ return group_node
+
+ ## Converts a Trimesh to Uranium's MeshData.
+ # \param tri_node A Trimesh containing the contents of a file that was
+ # just read.
+ # \return Mesh data from the Trimesh in a way that Uranium can understand
+ # it.
+ 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
\ No newline at end of file
diff --git a/plugins/TrimeshReader/__init__.py b/plugins/TrimeshReader/__init__.py
new file mode 100644
index 0000000000..5e2885238f
--- /dev/null
+++ b/plugins/TrimeshReader/__init__.py
@@ -0,0 +1,46 @@
+# Copyright (c) 2019 Ultimaker
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from . import TrimeshReader
+
+from UM.i18n import i18nCatalog
+i18n_catalog = i18nCatalog("uranium")
+
+
+def getMetaData():
+ return {
+ "mesh_reader": [
+ {
+ "extension": "ctm",
+ "description": i18n_catalog.i18nc("@item:inlistbox", "Open Compressed Triangle Mesh")
+ },
+ {
+ "extension": "dae",
+ "description": i18n_catalog.i18nc("@item:inlistbox", "COLLADA Digital Asset Exchange")
+ },
+ {
+ "extension": "glb",
+ "description": i18n_catalog.i18nc("@item:inlistbox", "glTF Binary")
+ },
+ {
+ "extension": "gltf",
+ "description": i18n_catalog.i18nc("@item:inlistbox", "glTF Embedded JSON")
+ },
+ # Trimesh seems to have a bug when reading OFF files.
+ #{
+ # "extension": "off",
+ # "description": i18n_catalog.i18nc("@item:inlistbox", "Geomview Object File Format")
+ #},
+ {
+ "extension": "ply",
+ "description": i18n_catalog.i18nc("@item:inlistbox", "Stanford Triangle Format")
+ },
+ {
+ "extension": "zae",
+ "description": i18n_catalog.i18nc("@item:inlistbox", "Compressed COLLADA Digital Asset Exchange")
+ }
+ ]
+ }
+
+def register(app):
+ return {"mesh_reader": TrimeshReader.TrimeshReader()}
diff --git a/plugins/TrimeshReader/plugin.json b/plugins/TrimeshReader/plugin.json
new file mode 100644
index 0000000000..61c66aa5e8
--- /dev/null
+++ b/plugins/TrimeshReader/plugin.json
@@ -0,0 +1,7 @@
+{
+ "name": "Trimesh Reader",
+ "author": "Ultimaker B.V.",
+ "version": "1.0.0",
+ "description": "Provides support for reading model files.",
+ "api": "6.0.0"
+}
diff --git a/plugins/UFPReader/UFPReader.py b/plugins/UFPReader/UFPReader.py
index cec70ef655..71061f938b 100644
--- a/plugins/UFPReader/UFPReader.py
+++ b/plugins/UFPReader/UFPReader.py
@@ -1,15 +1,16 @@
# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
-from typing import cast
+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
-from cura.Scene.CuraSceneNode import CuraSceneNode
-from plugins.GCodeReader.GCodeReader import GCodeReader
+
+if TYPE_CHECKING:
+ from cura.Scene.CuraSceneNode import CuraSceneNode
class UFPReader(MeshReader):
@@ -26,7 +27,7 @@ class UFPReader(MeshReader):
)
self._supported_extensions = [".ufp"]
- def _read(self, file_name: str) -> CuraSceneNode:
+ def _read(self, file_name: str) -> "CuraSceneNode":
# Open the file
archive = VirtualFile()
archive.open(file_name)
@@ -36,6 +37,6 @@ class UFPReader(MeshReader):
gcode_stream = gcode_data["/3D/model.gcode"].decode("utf-8")
# Open the GCodeReader to parse the data
- gcode_reader = cast(GCodeReader, PluginRegistry.getInstance().getPluginObject("GCodeReader"))
- gcode_reader.preReadFromStream(gcode_stream)
- return gcode_reader.readFromStream(gcode_stream)
+ gcode_reader = PluginRegistry.getInstance().getPluginObject("GCodeReader") # type: ignore
+ gcode_reader.preReadFromStream(gcode_stream) # type: ignore
+ return gcode_reader.readFromStream(gcode_stream, file_name) # type: ignore
diff --git a/plugins/UFPReader/__init__.py b/plugins/UFPReader/__init__.py
index 8f405d4f66..cfea4b9882 100644
--- a/plugins/UFPReader/__init__.py
+++ b/plugins/UFPReader/__init__.py
@@ -1,10 +1,15 @@
#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
-
-from . import UFPReader
-
i18n_catalog = i18nCatalog("cura")
@@ -21,6 +26,9 @@ def getMetaData():
def register(app):
+ if "UFPReader.UFPReader" not in sys.modules:
+ return {}
+
app.addNonSliceableExtension(".ufp")
return {"mesh_reader": UFPReader.UFPReader()}
diff --git a/plugins/UM3NetworkPrinting/__init__.py b/plugins/UM3NetworkPrinting/__init__.py
index 3da7795589..ea0f69639d 100644
--- a/plugins/UM3NetworkPrinting/__init__.py
+++ b/plugins/UM3NetworkPrinting/__init__.py
@@ -1,7 +1,7 @@
-# Copyright (c) 2017 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
-from .src import DiscoverUM3Action
from .src import UM3OutputDevicePlugin
+from .src import UltimakerNetworkedPrinterAction
def getMetaData():
@@ -11,5 +11,5 @@ def getMetaData():
def register(app):
return {
"output_device": UM3OutputDevicePlugin.UM3OutputDevicePlugin(),
- "machine_action": DiscoverUM3Action.DiscoverUM3Action()
+ "machine_action": UltimakerNetworkedPrinterAction.UltimakerNetworkedPrinterAction()
}
diff --git a/plugins/UM3NetworkPrinting/plugin.json b/plugins/UM3NetworkPrinting/plugin.json
index 088b4dae6a..039b412643 100644
--- a/plugins/UM3NetworkPrinting/plugin.json
+++ b/plugins/UM3NetworkPrinting/plugin.json
@@ -1,8 +1,8 @@
{
- "name": "UM3 Network Connection",
+ "name": "Ultimaker Network Connection",
"author": "Ultimaker B.V.",
- "description": "Manages network connections to Ultimaker 3 printers.",
- "version": "1.0.1",
+ "description": "Manages network connections to Ultimaker networked printers.",
+ "version": "2.0.0",
"api": "6.0",
"i18n-catalog": "cura"
}
diff --git a/plugins/UM3NetworkPrinting/resources/png/Ultimaker S3.png b/plugins/UM3NetworkPrinting/resources/png/Ultimaker S3.png
new file mode 100644
index 0000000000..b6ce6e1273
Binary files /dev/null and b/plugins/UM3NetworkPrinting/resources/png/Ultimaker S3.png differ
diff --git a/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml b/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml
index c0369cac0b..2e3d17ceb0 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/CameraButton.qml
@@ -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 QtQuick 2.3
@@ -53,4 +53,4 @@ Rectangle
}
}
}
-}
\ No newline at end of file
+}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml b/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml
index 3883a7e285..b27416e199 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,42 +14,22 @@ 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)
+ if (base.selectedDevice && base.completeProperties)
{
- var printerKey = base.selectedDevice.key
- var printerName = base.selectedDevice.name // TODO To change when the groups have a name
- if (manager.getStoredKey() != printerKey)
- {
- // Check if there is another instance with the same key
- if (!manager.existsKey(printerKey))
- {
- manager.associateActiveMachineWithPrinterDevice(base.selectedDevice)
- manager.setGroupName(printerName) // TODO To change when the groups have a name
- completed()
- }
- else
- {
- existingConnectionDialog.open()
- }
- }
+ manager.associateActiveMachineWithPrinterDevice(base.selectedDevice)
+ completed()
}
}
- MessageDialog
- {
- id: existingConnectionDialog
- title: catalog.i18nc("@window:title", "Existing Connection")
- icon: StandardIcon.Information
- text: catalog.i18nc("@message:text", "This printer/group is already added to Cura. Please select another printer/group.")
- standardButtons: StandardButton.Ok
- modality: Qt.ApplicationModal
- }
-
Column
{
anchors.fill: parent;
@@ -74,7 +54,7 @@ Cura.MachineAction
width: parent.width
wrapMode: Text.WordWrap
renderType: Text.NativeRendering
- text: catalog.i18nc("@label", "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\nSelect your printer from the list below:")
+ text: catalog.i18nc("@label", "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" + catalog.i18nc("@label", "Select your printer from the list below:")
}
Row
@@ -147,21 +127,6 @@ Cura.MachineAction
{
id: listview
model: manager.foundDevices
- onModelChanged:
- {
- var selectedKey = manager.getLastManualEntryKey()
- // If there is no last manual entry key, then we select the stored key (if any)
- if (selectedKey == "")
- selectedKey = manager.getStoredKey()
- for(var i = 0; i < model.length; i++) {
- if(model[i].key == selectedKey)
- {
- currentIndex = i;
- return
- }
- }
- currentIndex = -1;
- }
width: parent.width
currentIndex: -1
onCurrentIndexChanged:
@@ -246,29 +211,13 @@ Cura.MachineAction
renderType: Text.NativeRendering
text:
{
- if(base.selectedDevice)
- {
- if (base.selectedDevice.printerType == "ultimaker3")
- {
- return "Ultimaker 3";
- }
- else if (base.selectedDevice.printerType == "ultimaker3_extended")
- {
- return "Ultimaker 3 Extended";
- }
- else if (base.selectedDevice.printerType == "ultimaker_s5")
- {
- return "Ultimaker S5";
- }
- else
- {
- return catalog.i18nc("@label", "Unknown") // We have no idea what type it is. Should not happen 'in the field'
- }
- }
- else
- {
- return ""
+ if (base.selectedDevice) {
+ // It would be great to use a more readable machine type here,
+ // but the new discoveredPrintersModel is not used yet in the UM networking actions.
+ // TODO: remove actions or replace 'connect via network' button with new flow?
+ return base.selectedDevice.printerType
}
+ return ""
}
}
Label
@@ -342,6 +291,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 +331,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 of your printer on the network.")
width: parent.width
wrapMode: Text.WordWrap
renderType: Text.NativeRendering
@@ -404,6 +364,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/ExpandableCard.qml b/plugins/UM3NetworkPrinting/resources/qml/ExpandableCard.qml
index fae8280488..5257361367 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/ExpandableCard.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/ExpandableCard.qml
@@ -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 QtQuick 2.2
@@ -87,4 +87,4 @@ Item
}
}
}
-}
\ No newline at end of file
+}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/GenericPopUp.qml b/plugins/UM3NetworkPrinting/resources/qml/GenericPopUp.qml
index 74d9377f3e..61981dab2c 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/GenericPopUp.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/GenericPopUp.qml
@@ -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 QtQuick 2.2
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml
index d1a0c207c5..5d08422877 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorBuildplateConfiguration.qml
@@ -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 QtQuick 2.2
@@ -35,7 +35,7 @@ Item
{
height: parent.height
width: 32 * screenScaleFactor // Ensure the icon is centered under the extruder icon (same width)
-
+
Rectangle
{
anchors.centerIn: parent
@@ -56,7 +56,7 @@ Item
visible: buildplate
}
}
-
+
Label
{
id: buildplateLabel
@@ -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/MonitorCarousel.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorCarousel.qml
index 0d7a177dd3..08743ed777 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorCarousel.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorCarousel.qml
@@ -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 QtQuick 2.3
@@ -23,7 +23,7 @@ Item
height: centerSection.height
width: maximumWidth
-
+
// Enable keyboard navigation
Keys.onLeftPressed: navigateTo(currentIndex - 1)
Keys.onRightPressed: navigateTo(currentIndex + 1)
@@ -131,7 +131,7 @@ Item
}
}
spacing: 60 * screenScaleFactor // TODO: Theme!
-
+
Repeater
{
model: printers
@@ -255,4 +255,4 @@ Item
currentIndex = i
}
}
-}
\ No newline at end of file
+}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml
index 1718994d83..1fe766d9f7 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml
@@ -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 QtQuick 2.3
@@ -30,6 +30,26 @@ UM.Dialog
OutputDevice.forceSendJob(printer.activePrintJob.key)
overrideConfirmationDialog.close()
}
+ visible:
+ {
+ // Don't show the button if we're missing a printer or print job
+ if (!printer || !printer.activePrintJob)
+ {
+ return false
+ }
+
+ // Check each required change...
+ for (var i = 0; i < printer.activePrintJob.configurationChanges.length; i++)
+ {
+ var change = printer.activePrintJob.configurationChanges[i]
+ // If that type of change is in the list of blocking changes, hide the button
+ if (!change.canOverride)
+ {
+ return false
+ }
+ }
+ return true
+ }
},
Button
{
@@ -52,6 +72,7 @@ UM.Dialog
bottomMargin: 56 * screenScaleFactor // TODO: Theme!
}
wrapMode: Text.WordWrap
+ renderType: Text.NativeRendering
text:
{
if (!printer || !printer.activePrintJob)
@@ -139,4 +160,4 @@ UM.Dialog
}
return translationText
}
-}
\ No newline at end of file
+}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml
index 771bd4b8cf..34ca3c6df2 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml
@@ -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 QtQuick 2.3
@@ -81,7 +81,7 @@ Item
enabled: visible && !(printJob.state == "pausing" || printJob.state == "resuming");
onClicked: {
if (printJob.state == "paused") {
- printJob.setState("print");
+ printJob.setState("resume");
popUp.close();
return;
}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenuButton.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenuButton.qml
index ba85802809..aa5d6de89b 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenuButton.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenuButton.qml
@@ -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 QtQuick 2.3
@@ -23,9 +23,10 @@ Button
horizontalAlignment: Text.AlignHCenter
text: base.text
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering;
}
height: width
hoverEnabled: enabled
text: "\u22EE" //Unicode Three stacked points.
width: 36 * screenScaleFactor // TODO: Theme!
-}
\ No newline at end of file
+}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml
index 4079f23b0a..63caaab433 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorExtruderConfiguration.qml
@@ -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 QtQuick 2.2
@@ -56,7 +56,7 @@ Item
Label
{
id: materialLabel
-
+
color: UM.Theme.getColor("monitor_text_primary")
elide: Text.ElideRight
font: UM.Theme.getFont("default") // 12pt, regular
@@ -66,6 +66,7 @@ Item
// FIXED-LINE-HEIGHT:
height: parent.height
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
@@ -85,7 +86,7 @@ Item
Label
{
id: printCoreLabel
-
+
color: UM.Theme.getColor("monitor_text_primary")
elide: Text.ElideRight
font: UM.Theme.getFont("default_bold") // 12pt, bold
@@ -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..876215d65d 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorIconExtruder.qml
@@ -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 QtQuick 2.2
@@ -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..32e19c1cdb 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorInfoBlurb.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorInfoBlurb.qml
@@ -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 QtQuick 2.3
@@ -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/MonitorItem.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorItem.qml
index 41b3a93a7b..1ac72b8f8e 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorItem.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorItem.qml
@@ -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 QtQuick 2.2
@@ -42,4 +42,4 @@ Component {
z: 1;
}
}
-}
\ No newline at end of file
+}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml
index a23b8ab0d3..c01f778bba 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml
@@ -1,6 +1,5 @@
-// 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 2.0
import UM 1.3 as UM
@@ -22,10 +21,6 @@ Item
// The print job which all other data is derived from
property var printJob: null
- // If the printer is a cloud printer or not. Other items base their enabled state off of this boolean. In the future
- // they might not need to though.
- property bool cloudConnection: Cura.MachineManager.activeMachineIsUsingCloudConnection
-
width: parent.width
height: childrenRect.height
@@ -51,7 +46,7 @@ Item
{
anchors.verticalCenter: parent.verticalCenter
height: 18 * screenScaleFactor // TODO: Theme!
- width: 216 * screenScaleFactor // TODO: Theme! (Should match column size)
+ width: UM.Theme.getSize("monitor_column").width
Rectangle
{
color: UM.Theme.getColor("monitor_skeleton_loading")
@@ -69,8 +64,10 @@ Item
visible: printJob
// FIXED-LINE-HEIGHT:
+ width: parent.width
height: parent.height
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
@@ -78,7 +75,8 @@ Item
{
anchors.verticalCenter: parent.verticalCenter
height: 18 * screenScaleFactor // TODO: Theme!
- width: 216 * screenScaleFactor // TODO: Theme! (Should match column size)
+ width: UM.Theme.getSize("monitor_column").width
+
Rectangle
{
color: UM.Theme.getColor("monitor_skeleton_loading")
@@ -87,6 +85,7 @@ Item
visible: !printJob
radius: 2 * screenScaleFactor // TODO: Theme!
}
+
Label
{
text: printJob ? OutputDevice.formatDuration(printJob.timeTotal) : ""
@@ -98,6 +97,7 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
@@ -143,6 +143,7 @@ Item
// FIXED-LINE-HEIGHT:
height: parent.height
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
Row
@@ -158,14 +159,9 @@ Item
spacing: 6 // TODO: Theme!
visible: printJob
- Repeater
+ MonitorPrinterPill
{
- id: compatiblePills
- delegate: MonitorPrinterPill
- {
- text: modelData
- }
- model: printJob ? printJob.compatibleMachineFamilies : []
+ text: printJob.configuration.printerType
}
}
}
@@ -185,13 +181,10 @@ Item
id: printerConfiguration
anchors.verticalCenter: parent.verticalCenter
buildplate: catalog.i18nc("@label", "Glass")
- configurations:
- [
- base.printJob.configuration.extruderConfigurations[0],
- base.printJob.configuration.extruderConfigurations[1]
- ]
+ configurations: base.printJob.configuration.extruderConfigurations
height: 72 * screenScaleFactor // TODO: Theme!
}
+
Label {
text: printJob && printJob.owner ? printJob.owner : ""
color: UM.Theme.getColor("monitor_text_primary")
@@ -202,6 +195,7 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
}
@@ -218,7 +212,7 @@ Item
}
width: 32 * screenScaleFactor // TODO: Theme!
height: 32 * screenScaleFactor // TODO: Theme!
- enabled: !cloudConnection
+ enabled: OutputDevice.supportsPrintJobActions
onClicked: enabled ? contextMenu.switchPopupState() : {}
visible:
{
@@ -248,10 +242,10 @@ Item
enabled: !contextMenuButton.enabled
}
- MonitorInfoBlurb
- {
- id: contextMenuDisabledInfo
- text: catalog.i18nc("@info", "These options are not available because you are monitoring a cloud printer.")
- target: contextMenuButton
- }
-}
\ No newline at end of file
+ MonitorInfoBlurb
+ {
+ id: contextMenuDisabledInfo
+ text: catalog.i18nc("@info", "Please update your printer's firmware to manage the queue remotely.")
+ target: contextMenuButton
+ }
+}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobPreview.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobPreview.qml
index a392571757..7492b4e8e4 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobPreview.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobPreview.qml
@@ -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 QtQuick 2.2
@@ -41,7 +41,7 @@ Item
UM.RecolorImage
{
id: ultiBotImage
-
+
anchors.centerIn: printJobPreview
color: UM.Theme.getColor("monitor_placeholder_image")
height: printJobPreview.height
@@ -98,4 +98,4 @@ Item
visible: source != ""
width: 0.5 * printJobPreview.width
}
-}
\ No newline at end of file
+}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml
index 2ba70268b2..48bab48a9f 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml
@@ -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 QtQuick 2.3
@@ -22,31 +22,18 @@ Item
width: childrenRect.width
height: 18 * screenScaleFactor // TODO: Theme!
- ProgressBar
+ UM.ProgressBar
{
id: progressBar
anchors
{
verticalCenter: parent.verticalCenter
+ left: parent.left
}
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!
- }
- }
+ width: UM.Theme.getSize("monitor_column").width
}
+
Label
{
id: percentLabel
@@ -54,6 +41,7 @@ Item
{
left: progressBar.right
leftMargin: 18 * screenScaleFactor // TODO: Theme!
+ verticalCenter: parent.verticalCenter
}
text: printJob ? Math.round(printJob.progress * 100) + "%" : "0%"
color: printJob && printJob.isActive ? UM.Theme.getColor("monitor_text_primary") : UM.Theme.getColor("monitor_text_disabled")
@@ -63,6 +51,7 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
Label
{
@@ -71,6 +60,7 @@ Item
{
left: percentLabel.right
leftMargin: 18 * screenScaleFactor // TODO: Theme!
+ verticalCenter: parent.verticalCenter
}
color: UM.Theme.getColor("monitor_text_primary")
font: UM.Theme.getFont("medium") // 14pt, regular
@@ -115,5 +105,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..9242abacdd 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml
@@ -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 QtQuick 2.3
@@ -81,7 +81,7 @@ Item
mipmap: true
}
}
-
+
Item
{
@@ -90,7 +90,7 @@ Item
verticalCenter: parent.verticalCenter
}
width: 180 * screenScaleFactor // TODO: Theme!
- height: printerNameLabel.height + printerFamilyPill.height + 6 * screenScaleFactor // TODO: Theme!
+ height: childrenRect.height
Rectangle
{
@@ -99,7 +99,7 @@ Item
height: 18 * screenScaleFactor // TODO: Theme!
width: parent.width
radius: 2 * screenScaleFactor // TODO: Theme!
-
+
Label
{
text: printer && printer.name ? printer.name : ""
@@ -112,6 +112,7 @@ Item
// FIXED-LINE-HEIGHT:
height: parent.height
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
@@ -134,13 +135,61 @@ Item
}
text: printer ? printer.type : ""
}
+ Item
+ {
+ id: managePrinterLink
+ anchors {
+ top: printerFamilyPill.bottom
+ topMargin: 6 * screenScaleFactor
+ }
+ height: 18 * screenScaleFactor // TODO: Theme!
+ width: childrenRect.width
+
+ Label
+ {
+ id: managePrinterText
+ anchors.verticalCenter: managePrinterLink.verticalCenter
+ color: UM.Theme.getColor("monitor_text_link")
+ font: UM.Theme.getFont("default")
+ linkColor: UM.Theme.getColor("monitor_text_link")
+ text: catalog.i18nc("@label link to Connect and Cloud interfaces", "Manage printer")
+ renderType: Text.NativeRendering
+ }
+ UM.RecolorImage
+ {
+ id: externalLinkIcon
+ anchors
+ {
+ left: managePrinterText.right
+ leftMargin: 6 * screenScaleFactor
+ verticalCenter: managePrinterText.verticalCenter
+ }
+ color: UM.Theme.getColor("monitor_text_link")
+ source: UM.Theme.getIcon("external_link")
+ width: 12 * screenScaleFactor
+ height: 12 * screenScaleFactor
+ }
+ }
+ MouseArea
+ {
+ anchors.fill: managePrinterLink
+ onClicked: OutputDevice.openPrintJobControlPanel()
+ onEntered:
+ {
+ manageQueueText.font.underline = true
+ }
+ onExited:
+ {
+ manageQueueText.font.underline = false
+ }
+ }
}
MonitorPrinterConfiguration
{
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 = []
@@ -171,8 +220,7 @@ Item
}
width: 36 * screenScaleFactor // TODO: Theme!
height: 36 * screenScaleFactor // TODO: Theme!
- enabled: !cloudConnection
-
+ enabled: OutputDevice.supportsPrintJobActions
onClicked: enabled ? contextMenu.switchPopupState() : {}
visible:
{
@@ -205,7 +253,7 @@ Item
MonitorInfoBlurb
{
id: contextMenuDisabledInfo
- text: catalog.i18nc("@info", "These options are not available because you are monitoring a cloud printer.")
+ text: catalog.i18nc("@info", "Please update your printer's firmware to manage the queue remotely.")
target: contextMenuButton
}
@@ -243,7 +291,6 @@ Item
}
}
-
// Divider
Rectangle
{
@@ -315,6 +362,7 @@ Item
return ""
}
visible: text !== ""
+ renderType: Text.NativeRendering
}
Item
@@ -356,6 +404,7 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
Label
@@ -376,6 +425,7 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
@@ -403,6 +453,7 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
}
}
@@ -437,11 +488,31 @@ 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!
visible: printer && printer.activePrintJob && printer.activePrintJob.configurationChanges.length > 0 && !printerStatus.visible
onClicked: base.enabled ? overrideConfirmationDialog.open() : {}
+ enabled: OutputDevice.supportsPrintJobActions
+ }
+
+ // For cloud printing, add this mouse area over the disabled details button to indicate that it's not available
+ MouseArea
+ {
+ id: detailsButtonDisabledButtonArea
+ anchors.fill: detailsButton
+ hoverEnabled: detailsButton.visible && !detailsButton.enabled
+ onEntered: overrideButtonDisabledInfo.open()
+ onExited: overrideButtonDisabledInfo.close()
+ enabled: !detailsButton.enabled
+ }
+
+ MonitorInfoBlurb
+ {
+ id: overrideButtonDisabledInfo
+ text: catalog.i18nc("@info", "Please update your printer's firmware to manage the queue remotely.")
+ target: detailsButton
}
}
@@ -450,4 +521,4 @@ Item
id: overrideConfirmationDialog
printer: base.printer
}
-}
\ No newline at end of file
+}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterConfiguration.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterConfiguration.qml
index dbe085e18e..21d08a310c 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterConfiguration.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterConfiguration.qml
@@ -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 QtQuick 2.2
@@ -55,4 +55,4 @@ Item
anchors.bottom: parent.bottom
buildplate: null
}
-}
\ No newline at end of file
+}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml
index 2aeecd5a92..44aa1a1f8d 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterPill.qml
@@ -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 QtQuick 2.2
@@ -11,20 +11,8 @@ import UM 1.2 as UM
*/
Item
{
- // The printer name
+ id: monitorPrinterPill
property var text: ""
- property var tagText: {
- switch(text) {
- case "Ultimaker 3":
- return "UM 3"
- case "Ultimaker 3 Extended":
- return "UM 3 EXT"
- case "Ultimaker S5":
- return "UM S5"
- default:
- return text
- }
- }
implicitHeight: 18 * screenScaleFactor // TODO: Theme!
implicitWidth: Math.max(printerNameLabel.contentWidth + 12 * screenScaleFactor, 36 * screenScaleFactor) // TODO: Theme!
@@ -40,8 +28,9 @@ Item
id: printerNameLabel
anchors.centerIn: parent
color: UM.Theme.getColor("monitor_text_primary")
- text: tagText
+ text: monitorPrinterPill.text
font.pointSize: 10 // TODO: Theme!
- visible: text !== ""
+ visible: monitorPrinterPill.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 9bee89c9bc..ce692168c3 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml
@@ -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 QtQuick 2.2
@@ -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
@@ -41,7 +42,6 @@ Item
}
height: 18 * screenScaleFactor // TODO: Theme!
width: childrenRect.width
- visible: !cloudConnection
UM.RecolorImage
{
@@ -64,7 +64,7 @@ Item
color: UM.Theme.getColor("monitor_text_link")
font: UM.Theme.getFont("medium") // 14pt, regular
linkColor: UM.Theme.getColor("monitor_text_link")
- text: catalog.i18nc("@label link to connect manager", "Go to Cura Connect")
+ text: catalog.i18nc("@label link to connect manager", "Manage in browser")
renderType: Text.NativeRendering
}
}
@@ -72,9 +72,7 @@ Item
MouseArea
{
anchors.fill: manageQueueLabel
- enabled: !cloudConnection
- hoverEnabled: !cloudConnection
- onClicked: Cura.MachineManager.printerOutputDevices[0].openPrintJobControlPanel()
+ onClicked: OutputDevice.openPrintJobControlPanel()
onEntered:
{
manageQueueText.font.underline = true
@@ -97,6 +95,21 @@ Item
}
spacing: 18 * screenScaleFactor // TODO: Theme!
+ Label
+ {
+ text: catalog.i18nc("@label", "There are no print jobs in the queue. Slice and send a job to add one.")
+ color: UM.Theme.getColor("monitor_text_primary")
+ elide: Text.ElideRight
+ font: UM.Theme.getFont("medium") // 14pt, regular
+ anchors.verticalCenter: parent.verticalCenter
+
+ // FIXED-LINE-HEIGHT:
+ height: 18 * screenScaleFactor // TODO: Theme!
+ verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
+ visible: printJobList.count === 0
+ }
+
Label
{
text: catalog.i18nc("@label", "Print jobs")
@@ -109,6 +122,8 @@ Item
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
+ visible: printJobList.count > 0
}
Label
@@ -118,11 +133,13 @@ Item
elide: Text.ElideRight
font: UM.Theme.getFont("medium") // 14pt, regular
anchors.verticalCenter: parent.verticalCenter
- width: 216 * screenScaleFactor // TODO: Theme! (Should match column size)
+ width: UM.Theme.getSize("monitor_column").width
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
+ visible: printJobList.count > 0
}
Label
@@ -132,11 +149,13 @@ Item
elide: Text.ElideRight
font: UM.Theme.getFont("medium") // 14pt, regular
anchors.verticalCenter: parent.verticalCenter
- width: 216 * screenScaleFactor // TODO: Theme! (Should match column size)
+ width: UM.Theme.getSize("monitor_column").width
// FIXED-LINE-HEIGHT:
height: 18 * screenScaleFactor // TODO: Theme!
verticalAlignment: Text.AlignVCenter
+ renderType: Text.NativeRendering
+ visible: printJobList.count > 0
}
}
@@ -168,10 +187,7 @@ Item
}
model:
{
- // 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)
+ if (OutputDevice.receivedData)
{
return OutputDevice.queuedPrintJobs
}
@@ -180,88 +196,4 @@ Item
spacing: 6 // TODO: Theme!
}
}
-
- Rectangle
- {
- anchors
- {
- horizontalCenter: parent.horizontalCenter
- top: printJobQueueHeadings.bottom
- topMargin: 12 * screenScaleFactor // TODO: Theme!
- }
- height: 48 * screenScaleFactor // TODO: Theme!
- width: parent.width
- color: UM.Theme.getColor("monitor_card_background")
- border.color: UM.Theme.getColor("monitor_card_border")
- radius: 2 * screenScaleFactor // TODO: Theme!
-
- visible: printJobList.model.length == 0
-
- Row
- {
- anchors
- {
- left: parent.left
- leftMargin: 18 * screenScaleFactor // TODO: Theme!
- verticalCenter: parent.verticalCenter
- }
- spacing: 18 * screenScaleFactor // TODO: Theme!
- height: 18 * screenScaleFactor // TODO: Theme!
-
- Label
- {
- text: i18n.i18nc("@info", "All jobs are printed.")
- color: UM.Theme.getColor("monitor_text_primary")
- font: UM.Theme.getFont("medium") // 14pt, regular
- }
-
- Item
- {
- id: viewPrintHistoryLabel
-
- height: 18 * screenScaleFactor // TODO: Theme!
- width: childrenRect.width
- visible: !cloudConnection
-
- UM.RecolorImage
- {
- id: printHistoryIcon
- anchors.verticalCenter: parent.verticalCenter
- color: UM.Theme.getColor("monitor_text_link")
- source: UM.Theme.getIcon("external_link")
- width: 16 * screenScaleFactor // TODO: Theme! (Y U NO USE 18 LIKE ALL OTHER ICONS?!)
- height: 16 * screenScaleFactor // TODO: Theme! (Y U NO USE 18 LIKE ALL OTHER ICONS?!)
- }
- Label
- {
- id: viewPrintHistoryText
- anchors
- {
- left: printHistoryIcon.right
- leftMargin: 6 * screenScaleFactor // TODO: Theme!
- verticalCenter: printHistoryIcon.verticalCenter
- }
- color: UM.Theme.getColor("monitor_text_link")
- font: UM.Theme.getFont("medium") // 14pt, regular
- linkColor: UM.Theme.getColor("monitor_text_link")
- text: catalog.i18nc("@label link to connect manager", "View print history")
- renderType: Text.NativeRendering
- }
- MouseArea
- {
- anchors.fill: parent
- hoverEnabled: true
- onClicked: Cura.MachineManager.printerOutputDevices[0].openPrintJobControlPanel()
- onEntered:
- {
- viewPrintHistoryText.font.underline = true
- }
- onExited:
- {
- viewPrintHistoryText.font.underline = false
- }
- }
- }
- }
- }
}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/MonitorStage.qml b/plugins/UM3NetworkPrinting/resources/qml/MonitorStage.qml
index e68418c21a..47c45f8b11 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/MonitorStage.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/MonitorStage.qml
@@ -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 QtQuick 2.2
@@ -25,7 +25,7 @@ Component
}
width: maximumWidth
color: UM.Theme.getColor("monitor_stage_background")
-
+
// Enable keyboard navigation. NOTE: This is done here so that we can also potentially
// forward to the queue items in the future. (Deleting selected print job, etc.)
Keys.forwardTo: carousel
@@ -52,10 +52,7 @@ Component
id: carousel
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)
+ if (OutputDevice.receivedData)
{
return OutputDevice.printers
}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenuItem.qml b/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenuItem.qml
index 67c82db320..78b94ce259 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenuItem.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/PrintJobContextMenuItem.qml
@@ -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 QtQuick 2.2
@@ -16,8 +16,9 @@ Button {
text: parent.text
horizontalAlignment: Text.AlignLeft;
verticalAlignment: Text.AlignVCenter;
+ renderType: Text.NativeRendering;
}
height: visible ? 39 * screenScaleFactor : 0; // TODO: Theme!
hoverEnabled: true;
width: parent.width;
-}
\ No newline at end of file
+}
diff --git a/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml b/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml
index c2590e99a8..bcba60352c 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml
@@ -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 QtQuick 2.2
@@ -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/resources/qml/PrinterVideoStream.qml b/plugins/UM3NetworkPrinting/resources/qml/PrinterVideoStream.qml
index 77b481f6d8..cfbb30fdfb 100644
--- a/plugins/UM3NetworkPrinting/resources/qml/PrinterVideoStream.qml
+++ b/plugins/UM3NetworkPrinting/resources/qml/PrinterVideoStream.qml
@@ -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 QtQuick 2.2
diff --git a/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml b/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml
deleted file mode 100644
index c99ed1688e..0000000000
--- a/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml
+++ /dev/null
@@ -1,93 +0,0 @@
-// Copyright (c) 2018 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 UM 1.2 as UM
-import Cura 1.0 as Cura
-
-Item {
- id: base;
- property string activeQualityDefinitionId: Cura.MachineManager.activeQualityDefinitionId;
- property bool isUM3: activeQualityDefinitionId == "ultimaker3" || activeQualityDefinitionId.match("ultimaker_") != null;
- property bool printerConnected: Cura.MachineManager.printerConnected;
- property bool printerAcceptsCommands:
- {
- if (printerConnected && Cura.MachineManager.printerOutputDevices[0])
- {
- return Cura.MachineManager.printerOutputDevices[0].acceptsCommands
- }
- return false
- }
- property bool authenticationRequested:
- {
- if (printerConnected && Cura.MachineManager.printerOutputDevices[0])
- {
- var device = Cura.MachineManager.printerOutputDevices[0]
- // AuthState.AuthenticationRequested or AuthState.AuthenticationReceived
- return device.authenticationState == 2 || device.authenticationState == 5
- }
- return false
- }
- property var materialNames:
- {
- if (printerConnected && Cura.MachineManager.printerOutputDevices[0])
- {
- return Cura.MachineManager.printerOutputDevices[0].materialNames
- }
- return null
- }
- property var hotendIds:
- {
- if (printerConnected && Cura.MachineManager.printerOutputDevices[0])
- {
- return Cura.MachineManager.printerOutputDevices[0].hotendIds
- }
- return null
- }
-
- UM.I18nCatalog {
- id: catalog;
- name: "cura";
- }
-
- Row {
- objectName: "networkPrinterConnectButton";
- spacing: UM.Theme.getSize("default_margin").width;
- visible: isUM3;
-
- Button {
- height: UM.Theme.getSize("save_button_save_to_button").height;
- onClicked: Cura.MachineManager.printerOutputDevices[0].requestAuthentication();
- style: UM.Theme.styles.print_setup_action_button;
- text: catalog.i18nc("@action:button", "Request Access");
- tooltip: catalog.i18nc("@info:tooltip", "Send access request to the printer");
- visible: printerConnected && !printerAcceptsCommands && !authenticationRequested;
- }
-
- Button {
- height: UM.Theme.getSize("save_button_save_to_button").height;
- onClicked: connectActionDialog.show();
- style: UM.Theme.styles.print_setup_action_button;
- text: catalog.i18nc("@action:button", "Connect");
- tooltip: catalog.i18nc("@info:tooltip", "Connect to a printer");
- visible: !printerConnected;
- }
- }
-
- UM.Dialog {
- id: connectActionDialog;
- rightButtons: Button {
- iconName: "dialog-close";
- onClicked: connectActionDialog.reject();
- text: catalog.i18nc("@action:button", "Close");
- }
-
- Loader {
- anchors.fill: parent;
- source: "DiscoverUM3Action.qml";
- }
- }
-}
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py
index adff94bbbc..ed8d22a478 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.py
+++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudApiClient.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 json
from json import JSONDecodeError
@@ -11,18 +11,19 @@ from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply, QNetworkAccessManage
from UM.Logger import Logger
from cura import UltimakerCloudAuthentication
from cura.API import Account
+
from .ToolPathUploader import ToolPathUploader
-from ..Models import BaseModel
-from .Models.CloudClusterResponse import CloudClusterResponse
-from .Models.CloudError import CloudError
-from .Models.CloudClusterStatus import CloudClusterStatus
-from .Models.CloudPrintJobUploadRequest import CloudPrintJobUploadRequest
-from .Models.CloudPrintResponse import CloudPrintResponse
-from .Models.CloudPrintJobResponse import CloudPrintJobResponse
+from ..Models.BaseModel import BaseModel
+from ..Models.Http.CloudClusterResponse import CloudClusterResponse
+from ..Models.Http.CloudError import CloudError
+from ..Models.Http.CloudClusterStatus import CloudClusterStatus
+from ..Models.Http.CloudPrintJobUploadRequest import CloudPrintJobUploadRequest
+from ..Models.Http.CloudPrintResponse import CloudPrintResponse
+from ..Models.Http.CloudPrintJobResponse import CloudPrintJobResponse
## The generic type variable used to document the methods below.
-CloudApiClientModel = TypeVar("CloudApiClientModel", bound = BaseModel)
+CloudApiClientModel = TypeVar("CloudApiClientModel", bound=BaseModel)
## The cloud API client is responsible for handling the requests and responses from the cloud.
@@ -34,6 +35,9 @@ class CloudApiClient:
CLUSTER_API_ROOT = "{}/connect/v1".format(ROOT_PATH)
CURA_API_ROOT = "{}/cura/v1".format(ROOT_PATH)
+ # In order to avoid garbage collection we keep the callbacks in this list.
+ _anti_gc_callbacks = [] # type: List[Callable[[], None]]
+
## Initializes a new cloud API client.
# \param account: The user's account object
# \param on_error: The callback to be called whenever we receive errors from the server.
@@ -43,8 +47,6 @@ class CloudApiClient:
self._account = account
self._on_error = on_error
self._upload = None # type: Optional[ToolPathUploader]
- # In order to avoid garbage collection we keep the callbacks in this list.
- self._anti_gc_callbacks = [] # type: List[Callable[[], None]]
## Gets the account used for the API.
@property
@@ -54,7 +56,7 @@ class CloudApiClient:
## Retrieves all the clusters for the user that is currently logged in.
# \param on_finished: The function to be called after the result is parsed.
def getClusters(self, on_finished: Callable[[List[CloudClusterResponse]], Any]) -> None:
- url = "{}/clusters".format(self.CLUSTER_API_ROOT)
+ url = "{}/clusters?status=active".format(self.CLUSTER_API_ROOT)
reply = self._manager.get(self._createEmptyRequest(url))
self._addCallback(reply, on_finished, CloudClusterResponse)
@@ -69,8 +71,8 @@ class CloudApiClient:
## Requests the cloud to register the upload of a print job mesh.
# \param request: The request object.
# \param on_finished: The function to be called after the result is parsed.
- def requestUpload(self, request: CloudPrintJobUploadRequest, on_finished: Callable[[CloudPrintJobResponse], Any]
- ) -> None:
+ def requestUpload(self, request: CloudPrintJobUploadRequest,
+ on_finished: Callable[[CloudPrintJobResponse], Any]) -> None:
url = "{}/jobs/upload".format(self.CURA_API_ROOT)
body = json.dumps({"data": request.toDict()})
reply = self._manager.put(self._createEmptyRequest(url), body.encode())
@@ -96,6 +98,16 @@ class CloudApiClient:
reply = self._manager.post(self._createEmptyRequest(url), b"")
self._addCallback(reply, on_finished, CloudPrintResponse)
+ ## Send a print job action to the cluster for the given print job.
+ # \param cluster_id: The ID of the cluster.
+ # \param cluster_job_id: The ID of the print job within the cluster.
+ # \param action: The name of the action to execute.
+ def doPrintJobAction(self, cluster_id: str, cluster_job_id: str, action: str,
+ data: Optional[Dict[str, Any]] = None) -> None:
+ body = json.dumps({"data": data}).encode() if data else b""
+ url = "{}/clusters/{}/print_jobs/{}/action/{}".format(self.CLUSTER_API_ROOT, cluster_id, cluster_job_id, action)
+ self._manager.post(self._createEmptyRequest(url), body)
+
## We override _createEmptyRequest in order to add the user credentials.
# \param url: The URL to request
# \param content_type: The type of the body contents.
@@ -156,12 +168,16 @@ class CloudApiClient:
reply: QNetworkReply,
on_finished: Union[Callable[[CloudApiClientModel], Any],
Callable[[List[CloudApiClientModel]], Any]],
- model: Type[CloudApiClientModel],
- ) -> None:
+ model: Type[CloudApiClientModel]) -> None:
def parse() -> None:
- status_code, response = self._parseReply(reply)
self._anti_gc_callbacks.remove(parse)
- return self._parseModels(response, on_finished, model)
+
+ # Don't try to parse the reply if we didn't get one
+ if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) is None:
+ return
+
+ status_code, response = self._parseReply(reply)
+ self._parseModels(response, on_finished, model)
self._anti_gc_callbacks.append(parse)
reply.finished.connect(parse)
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputController.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputController.py
deleted file mode 100644
index bd56ef3185..0000000000
--- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputController.py
+++ /dev/null
@@ -1,22 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
-
-from typing import TYPE_CHECKING
-if TYPE_CHECKING:
- from .CloudOutputDevice import CloudOutputDevice
-
-
-class CloudOutputController(PrinterOutputController):
- def __init__(self, output_device: "CloudOutputDevice") -> None:
- super().__init__(output_device)
-
- # The cloud connection only supports fetching the printer and queue status and adding a job to the queue.
- # To let the UI know this we mark all features below as False.
- self.can_pause = False
- self.can_abort = False
- self.can_pre_heat_bed = False
- self.can_pre_heat_hotends = False
- self.can_send_raw_gcode = False
- self.can_control_manually = False
- self.can_update_firmware = False
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py
index d052d925d2..75e2b30ff1 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py
+++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py
@@ -1,39 +1,34 @@
-# 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 time import time
-from typing import Dict, List, Optional, Set, cast
+from typing import List, Optional, cast
from PyQt5.QtCore import QObject, QUrl, pyqtProperty, pyqtSignal, pyqtSlot
+from PyQt5.QtGui import QDesktopServices
from UM import i18nCatalog
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 UM.Version import Version
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.NetworkedPrinterOutputDevice import AuthState
+from cura.PrinterOutput.PrinterOutputDevice import ConnectionType
-from .CloudOutputController import CloudOutputController
-from ..MeshFormatHandler import MeshFormatHandler
-from ..UM3PrintJobOutputModel import UM3PrintJobOutputModel
-from .CloudProgressMessage import CloudProgressMessage
from .CloudApiClient import CloudApiClient
-from .Models.CloudClusterResponse import CloudClusterResponse
-from .Models.CloudClusterStatus import CloudClusterStatus
-from .Models.CloudPrintJobUploadRequest import CloudPrintJobUploadRequest
-from .Models.CloudPrintResponse import CloudPrintResponse
-from .Models.CloudPrintJobResponse import CloudPrintJobResponse
-from .Models.CloudClusterPrinterStatus import CloudClusterPrinterStatus
-from .Models.CloudClusterPrintJobStatus import CloudClusterPrintJobStatus
-from .Utils import findChanges, formatDateCompleted, formatTimeCompleted
+from ..ExportFileJob import ExportFileJob
+from ..UltimakerNetworkedPrinterOutputDevice import UltimakerNetworkedPrinterOutputDevice
+from ..Messages.PrintJobUploadBlockedMessage import PrintJobUploadBlockedMessage
+from ..Messages.PrintJobUploadErrorMessage import PrintJobUploadErrorMessage
+from ..Messages.PrintJobUploadSuccessMessage import PrintJobUploadSuccessMessage
+from ..Models.Http.CloudClusterResponse import CloudClusterResponse
+from ..Models.Http.CloudClusterStatus import CloudClusterStatus
+from ..Models.Http.CloudPrintJobUploadRequest import CloudPrintJobUploadRequest
+from ..Models.Http.CloudPrintResponse import CloudPrintResponse
+from ..Models.Http.CloudPrintJobResponse import CloudPrintJobResponse
+from ..Models.Http.ClusterPrinterStatus import ClusterPrinterStatus
+from ..Models.Http.ClusterPrintJobStatus import ClusterPrintJobStatus
I18N_CATALOG = i18nCatalog("cura")
@@ -43,20 +38,22 @@ I18N_CATALOG = i18nCatalog("cura")
# Currently it only supports viewing the printer and print job status and adding a new job to the queue.
# As such, those methods have been implemented here.
# Note that this device represents a single remote cluster, not a list of multiple clusters.
-class CloudOutputDevice(NetworkedPrinterOutputDevice):
+class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
- # The interval with which the remote clusters are checked
+ # The interval with which the remote cluster is checked.
+ # We can do this relatively often as this API call is quite fast.
CHECK_CLUSTER_INTERVAL = 10.0 # seconds
- # Signal triggered when the print jobs in the queue were changed.
- printJobsChanged = pyqtSignal()
+ # Override the network response timeout in seconds after which we consider the device offline.
+ # For cloud this needs to be higher because the interval at which we check the status is higher as well.
+ NETWORK_RESPONSE_CONSIDER_OFFLINE = 15.0 # seconds
- # Signal triggered when the selected printer in the UI should be changed.
- activePrinterChanged = pyqtSignal()
+ # The minimum version of firmware that support print job actions over cloud.
+ PRINT_JOB_ACTIONS_MIN_VERSION = Version("5.3.0")
# Notify can only use signals that are defined by the class that they are in, not inherited ones.
# Therefore we create a private signal used to trigger the printersChanged signal.
- _clusterPrintersChanged = pyqtSignal()
+ _cloudClusterPrintersChanged = pyqtSignal()
## Creates a new cloud output device
# \param api_client: The client that will run the API calls
@@ -68,49 +65,36 @@ 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"printer_type": cluster.printer_type.encode() if cluster.printer_type else b"",
+ b"cluster_size": b"1" # cloud devices are always clusters of at least one
}
- super().__init__(device_id = cluster.cluster_id, address = "",
- connection_type = ConnectionType.CloudConnection, properties = properties, parent = parent)
- self._api = api_client
- self._cluster = cluster
+ super().__init__(
+ device_id=cluster.cluster_id,
+ address="",
+ connection_type=ConnectionType.CloudConnection,
+ properties=properties,
+ parent=parent
+ )
+ self._api = api_client
+ self._account = api_client.account
+ self._cluster = cluster
+ self.setAuthenticationState(AuthState.NotAuthenticated)
self._setInterfaceElements()
- self._account = api_client.account
-
- # We use the Cura Connect monitor tab to get most functionality right away.
- if PluginRegistry.getInstance() is not None:
- self._monitor_view_qml_path = os.path.join(
- PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"),
- "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]
-
- # Properties to populate later on with received cloud data.
- self._print_jobs = [] # type: List[UM3PrintJobOutputModel]
- self._number_of_extruders = 2 # All networked printers are dual-extrusion Ultimaker machines.
-
- # We only allow a single upload at a time.
- self._progress = CloudProgressMessage()
+ self.printersChanged.connect(self._cloudClusterPrintersChanged)
# Keep server string of the last generated time to avoid updating models more than once for the same response
- self._received_printers = None # type: Optional[List[CloudClusterPrinterStatus]]
- self._received_print_jobs = None # type: Optional[List[CloudClusterPrintJobStatus]]
-
- # A set of the user's job IDs that have finished
- self._finished_jobs = set() # type: Set[str]
+ self._received_printers = None # type: Optional[List[ClusterPrinterStatus]]
+ self._received_print_jobs = None # type: Optional[List[ClusterPrintJobStatus]]
# Reference to the uploaded print job / mesh
+ # We do this to prevent re-uploading the same file multiple times.
self._tool_path = None # type: Optional[bytes]
self._uploaded_print_job = None # type: Optional[CloudPrintJobResponse]
@@ -121,9 +105,12 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
super().connect()
Logger.log("i", "Connected to cluster %s", self.key)
CuraApplication.getInstance().getBackend().backendStateChange.connect(self._onBackendStateChange)
+ self._update()
## Disconnects the device
def disconnect(self) -> None:
+ if not self.isConnected():
+ return
super().disconnect()
Logger.log("i", "Disconnected from cluster %s", self.key)
CuraApplication.getInstance().getBackend().backendStateChange.disconnect(self._onBackendStateChange)
@@ -133,6 +120,149 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
self._tool_path = None
self._uploaded_print_job = None
+ ## Checks whether the given network key is found in the cloud's host name
+ def matchesNetworkKey(self, network_key: str) -> bool:
+ # Typically, a network key looks like "ultimakersystem-aabbccdd0011._ultimaker._tcp.local."
+ # the host name should then be "ultimakersystem-aabbccdd0011"
+ 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 in self.clusterData.host_internal_ip:
+ return True
+ return False
+
+ ## Set all the interface elements and texts for this output device.
+ def _setInterfaceElements(self) -> None:
+ self.setPriority(2) # Make sure we end up below the local networking and above 'save to file'.
+ self.setShortDescription(I18N_CATALOG.i18nc("@action:button", "Print via Cloud"))
+ self.setDescription(I18N_CATALOG.i18nc("@properties:tooltip", "Print via Cloud"))
+ self.setConnectionText(I18N_CATALOG.i18nc("@info:status", "Connected via Cloud"))
+
+ ## Called when the network data should be updated.
+ def _update(self) -> None:
+ super()._update()
+ if time() - self._time_of_last_request < self.CHECK_CLUSTER_INTERVAL:
+ return # avoid calling the cloud too often
+ self._time_of_last_request = time()
+ if self._account.isLoggedIn:
+ self.setAuthenticationState(AuthState.Authenticated)
+ self._last_request_time = time()
+ self._api.getClusterStatus(self.key, self._onStatusCallFinished)
+ else:
+ self.setAuthenticationState(AuthState.NotAuthenticated)
+
+ ## Method called when HTTP request to status endpoint is finished.
+ # Contains both printers and print jobs statuses in a single response.
+ def _onStatusCallFinished(self, status: CloudClusterStatus) -> None:
+ self._responseReceived()
+ if status.printers != self._received_printers:
+ self._received_printers = status.printers
+ self._updatePrinters(status.printers)
+ if status.print_jobs != self._received_print_jobs:
+ self._received_print_jobs = status.print_jobs
+ self._updatePrintJobs(status.print_jobs)
+
+ ## Called when Cura requests an output device to receive a (G-code) file.
+ def requestWrite(self, nodes: List[SceneNode], file_name: Optional[str] = None, limit_mimetypes: bool = False,
+ file_handler: Optional[FileHandler] = None, filter_by_machine: bool = False, **kwargs) -> None:
+
+ # Show an error message if we're already sending a job.
+ if self._progress.visible:
+ PrintJobUploadBlockedMessage().show()
+ return
+
+ # Indicate we have started sending a job.
+ self.writeStarted.emit(self)
+
+ # The mesh didn't change, let's not upload it to the cloud again.
+ # Note that self.writeFinished is called in _onPrintUploadCompleted as well.
+ if self._uploaded_print_job:
+ self._api.requestPrint(self.key, self._uploaded_print_job.job_id, self._onPrintUploadCompleted)
+ return
+
+ # Export the scene to the correct file type.
+ job = ExportFileJob(file_handler=file_handler, nodes=nodes, firmware_version=self.firmwareVersion)
+ job.finished.connect(self._onPrintJobCreated)
+ job.start()
+
+ ## Handler for when the print job was created locally.
+ # It can now be sent over the cloud.
+ def _onPrintJobCreated(self, job: ExportFileJob) -> None:
+ output = job.getOutput()
+ self._tool_path = output # store the tool path to prevent re-uploading when printing the same file again
+ request = CloudPrintJobUploadRequest(
+ job_name=job.getFileName(),
+ file_size=len(output),
+ content_type=job.getMimeType(),
+ )
+ self._api.requestUpload(request, self._uploadPrintJob)
+
+ ## Uploads the mesh when the print job was registered with the cloud API.
+ # \param job_response: The response received from the cloud API.
+ def _uploadPrintJob(self, job_response: CloudPrintJobResponse) -> None:
+ if not self._tool_path:
+ return self._onUploadError()
+ self._progress.show()
+ self._uploaded_print_job = job_response # store the last uploaded job to prevent re-upload of the same file
+ self._api.uploadToolPath(job_response, self._tool_path, self._onPrintJobUploaded, self._progress.update,
+ self._onUploadError)
+
+ ## Requests the print to be sent to the printer when we finished uploading the mesh.
+ def _onPrintJobUploaded(self) -> None:
+ self._progress.update(100)
+ print_job = cast(CloudPrintJobResponse, self._uploaded_print_job)
+ self._api.requestPrint(self.key, print_job.job_id, self._onPrintUploadCompleted)
+
+ ## Shows a message when the upload has succeeded
+ # \param response: The response from the cloud API.
+ def _onPrintUploadCompleted(self, response: CloudPrintResponse) -> None:
+ self._progress.hide()
+ PrintJobUploadSuccessMessage().show()
+ self.writeFinished.emit()
+
+ ## Displays the given message if uploading the mesh has failed
+ # \param message: The message to display.
+ def _onUploadError(self, message: str = None) -> None:
+ self._progress.hide()
+ self._uploaded_print_job = None
+ PrintJobUploadErrorMessage(message).show()
+ self.writeError.emit()
+
+ ## Whether the printer that this output device represents supports print job actions via the cloud.
+ @pyqtProperty(bool, notify=_cloudClusterPrintersChanged)
+ def supportsPrintJobActions(self) -> bool:
+ if not self._printers:
+ return False
+ version_number = self.printers[0].firmwareVersion.split(".")
+ firmware_version = Version([version_number[0], version_number[1], version_number[2]])
+ return firmware_version >= self.PRINT_JOB_ACTIONS_MIN_VERSION
+
+ ## Set the remote print job state.
+ def setJobState(self, print_job_uuid: str, state: str) -> None:
+ self._api.doPrintJobAction(self._cluster.cluster_id, print_job_uuid, state)
+
+ @pyqtSlot(str, name="sendJobToTop")
+ def sendJobToTop(self, print_job_uuid: str) -> None:
+ self._api.doPrintJobAction(self._cluster.cluster_id, print_job_uuid, "move",
+ {"list": "queued", "to_position": 0})
+
+ @pyqtSlot(str, name="deleteJobFromQueue")
+ def deleteJobFromQueue(self, print_job_uuid: str) -> None:
+ self._api.doPrintJobAction(self._cluster.cluster_id, print_job_uuid, "remove")
+
+ @pyqtSlot(str, name="forceSendJob")
+ def forceSendJob(self, print_job_uuid: str) -> None:
+ self._api.doPrintJobAction(self._cluster.cluster_id, print_job_uuid, "force")
+
+ @pyqtSlot(name="openPrintJobControlPanel")
+ def openPrintJobControlPanel(self) -> None:
+ QDesktopServices.openUrl(QUrl(self.clusterCloudUrl))
+
+ @pyqtSlot(name="openPrinterControlPanel")
+ def openPrinterControlPanel(self) -> None:
+ QDesktopServices.openUrl(QUrl(self.clusterCloudUrl))
+
## Gets the cluster response from which this device was created.
@property
def clusterData(self) -> CloudClusterResponse:
@@ -143,298 +273,8 @@ class CloudOutputDevice(NetworkedPrinterOutputDevice):
def clusterData(self, value: CloudClusterResponse) -> None:
self._cluster = value
- ## 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."
- # the host name should then be "ultimakersystem-aabbccdd0011"
- return network_key.startswith(self.clusterData.host_name)
-
- ## Set all the interface elements and texts for this output device.
- def _setInterfaceElements(self) -> None:
- self.setPriority(2) # Make sure we end up below the local networking and above 'save to file'
- self.setName(self._id)
- self.setShortDescription(I18N_CATALOG.i18nc("@action:button", "Print via Cloud"))
- self.setDescription(I18N_CATALOG.i18nc("@properties:tooltip", "Print via Cloud"))
- self.setConnectionText(I18N_CATALOG.i18nc("@info:status", "Connected via Cloud"))
-
- ## Called when Cura requests an output device to receive a (G-code) file.
- def requestWrite(self, nodes: List[SceneNode], file_name: Optional[str] = None, limit_mimetypes: bool = False,
- file_handler: Optional[FileHandler] = None, **kwargs: str) -> None:
-
- # Show an error message if we're already sending a job.
- if self._progress.visible:
- message = Message(
- text = I18N_CATALOG.i18nc("@info:status", "Sending new jobs (temporarily) blocked, still sending the previous print job."),
- title = I18N_CATALOG.i18nc("@info:title", "Cloud error"),
- lifetime = 10
- )
- message.show()
- return
-
- if self._uploaded_print_job:
- # The mesh didn't change, let's not upload it again
- self._api.requestPrint(self.key, self._uploaded_print_job.job_id, self._onPrintUploadCompleted)
- return
-
- # Indicate we have started sending a job.
- self.writeStarted.emit(self)
-
- mesh_format = MeshFormatHandler(file_handler, self.firmwareVersion)
- if not mesh_format.is_valid:
- Logger.log("e", "Missing file or mesh writer!")
- return self._onUploadError(I18N_CATALOG.i18nc("@info:status", "Could not export print job."))
-
- mesh = mesh_format.getBytes(nodes)
-
- self._tool_path = mesh
- request = CloudPrintJobUploadRequest(
- job_name = file_name or mesh_format.file_extension,
- file_size = len(mesh),
- content_type = mesh_format.mime_type,
- )
- self._api.requestUpload(request, self._onPrintJobCreated)
-
- ## Called when the network data should be updated.
- def _update(self) -> None:
- super()._update()
- if self._last_request_time and time() - self._last_request_time < self.CHECK_CLUSTER_INTERVAL:
- return # Avoid calling the cloud too often
-
- Logger.log("d", "Updating: %s - %s >= %s", time(), self._last_request_time, self.CHECK_CLUSTER_INTERVAL)
- if self._account.isLoggedIn:
- self.setAuthenticationState(AuthState.Authenticated)
- self._last_request_time = time()
- self._api.getClusterStatus(self.key, self._onStatusCallFinished)
- else:
- self.setAuthenticationState(AuthState.NotAuthenticated)
-
- ## Method called when HTTP request to status endpoint is finished.
- # Contains both printers and print jobs statuses in a single response.
- def _onStatusCallFinished(self, status: CloudClusterStatus) -> None:
- # Update all data from the cluster.
- self._last_response_time = time()
- if self._received_printers != status.printers:
- self._received_printers = status.printers
- self._updatePrinters(status.printers)
-
- if status.print_jobs != self._received_print_jobs:
- self._received_print_jobs = status.print_jobs
- self._updatePrintJobs(status.print_jobs)
-
- ## Updates the local list of printers with the list received from the cloud.
- # \param jobs: The printers received from the cloud.
- def _updatePrinters(self, printers: List[CloudClusterPrinterStatus]) -> None:
- 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]
-
- removed_printers, added_printers, updated_printers = findChanges(previous, received)
-
- for removed_printer in removed_printers:
- if self._active_printer == removed_printer:
- self.setActivePrinter(None)
- self._printers.remove(removed_printer)
-
- for added_printer in added_printers:
- self._printers.append(added_printer.createOutputModel(CloudOutputController(self)))
-
- for model, printer in updated_printers:
- printer.updateOutputModel(model)
-
- # Always have an active printer
- if self._printers and not self._active_printer:
- self.setActivePrinter(self._printers[0])
-
- if added_printers or removed_printers:
- self.printersChanged.emit()
-
- ## Updates the local list of print jobs with the list received from the cloud.
- # \param jobs: The print jobs received from the cloud.
- def _updatePrintJobs(self, jobs: List[CloudClusterPrintJobStatus]) -> None:
- received = {j.uuid: j for j in jobs} # type: Dict[str, CloudClusterPrintJobStatus]
- previous = {j.key: j for j in self._print_jobs} # type: Dict[str, UM3PrintJobOutputModel]
-
- removed_jobs, added_jobs, updated_jobs = findChanges(previous, received)
-
- for removed_job in removed_jobs:
- if removed_job.assignedPrinter:
- removed_job.assignedPrinter.updateActivePrintJob(None)
- removed_job.stateChanged.disconnect(self._onPrintJobStateChanged)
- self._print_jobs.remove(removed_job)
-
- for added_job in added_jobs:
- self._addPrintJob(added_job)
-
- for model, job in updated_jobs:
- job.updateOutputModel(model)
- if job.printer_uuid:
- self._updateAssignedPrinter(model, job.printer_uuid)
-
- # We only have to update when jobs are added or removed
- # updated jobs push their changes via their output model
- if added_jobs or removed_jobs:
- self.printJobsChanged.emit()
-
- ## Registers a new print job received via the cloud API.
- # \param job: The print job received.
- def _addPrintJob(self, job: CloudClusterPrintJobStatus) -> None:
- model = job.createOutputModel(CloudOutputController(self))
- model.stateChanged.connect(self._onPrintJobStateChanged)
- if job.printer_uuid:
- self._updateAssignedPrinter(model, job.printer_uuid)
- self._print_jobs.append(model)
-
- ## Handles the event of a change in a print job state
- def _onPrintJobStateChanged(self) -> None:
- user_name = self._getUserName()
- # TODO: confirm that notifications in Cura are still required
- for job in self._print_jobs:
- if job.state == "wait_cleanup" and job.key not in self._finished_jobs and job.owner == user_name:
- self._finished_jobs.add(job.key)
- Message(
- title = I18N_CATALOG.i18nc("@info:status", "Print finished"),
- text = (I18N_CATALOG.i18nc("@info:status", "Printer '{printer_name}' has finished printing '{job_name}'.").format(
- printer_name = job.assignedPrinter.name,
- job_name = job.name
- ) if job.assignedPrinter else
- I18N_CATALOG.i18nc("@info:status", "The print job '{job_name}' was finished.").format(
- job_name = job.name
- )),
- ).show()
-
- ## Updates the printer assignment for the given print job model.
- def _updateAssignedPrinter(self, model: UM3PrintJobOutputModel, printer_uuid: str) -> None:
- printer = next((p for p in self._printers if printer_uuid == p.key), None)
- if not printer:
- Logger.log("w", "Missing printer %s for job %s in %s", model.assignedPrinter, model.key,
- [p.key for p in self._printers])
- return
-
- printer.updateActivePrintJob(model)
- model.updateAssignedPrinter(printer)
-
- ## Uploads the mesh when the print job was registered with the cloud API.
- # \param job_response: The response received from the cloud API.
- def _onPrintJobCreated(self, job_response: CloudPrintJobResponse) -> None:
- self._progress.show()
- self._uploaded_print_job = job_response
- tool_path = cast(bytes, self._tool_path)
- self._api.uploadToolPath(job_response, tool_path, self._onPrintJobUploaded, self._progress.update, self._onUploadError)
-
- ## Requests the print to be sent to the printer when we finished uploading the mesh.
- def _onPrintJobUploaded(self) -> None:
- self._progress.update(100)
- print_job = cast(CloudPrintJobResponse, self._uploaded_print_job)
- self._api.requestPrint(self.key, print_job.job_id, self._onPrintUploadCompleted)
-
- ## Displays the given message if uploading the mesh has failed
- # \param message: The message to display.
- def _onUploadError(self, message: str = None) -> None:
- self._progress.hide()
- self._uploaded_print_job = None
- Message(
- text = message or I18N_CATALOG.i18nc("@info:text", "Could not upload the data to the printer."),
- title = I18N_CATALOG.i18nc("@info:title", "Cloud error"),
- lifetime = 10
- ).show()
- self.writeError.emit()
-
- ## Shows a message when the upload has succeeded
- # \param response: The response from the cloud API.
- def _onPrintUploadCompleted(self, response: CloudPrintResponse) -> None:
- Logger.log("d", "The cluster will be printing this print job with the ID %s", response.cluster_job_id)
- self._progress.hide()
- Message(
- text = I18N_CATALOG.i18nc("@info:status", "Print job was successfully sent to the printer."),
- title = I18N_CATALOG.i18nc("@info:title", "Data Sent"),
- lifetime = 5
- ).show()
- self.writeFinished.emit()
-
- ## Gets the remote printers.
- @pyqtProperty("QVariantList", notify=_clusterPrintersChanged)
- def printers(self) -> List[PrinterOutputModel]:
- return self._printers
-
- ## Get the active printer in the UI (monitor page).
- @pyqtProperty(QObject, notify = activePrinterChanged)
- def activePrinter(self) -> Optional[PrinterOutputModel]:
- return self._active_printer
-
- ## Set the active printer in the UI (monitor page).
- @pyqtSlot(QObject)
- def setActivePrinter(self, printer: Optional[PrinterOutputModel] = None) -> None:
- if printer != self._active_printer:
- 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]:
- return self._print_jobs
-
- ## Get remote print jobs that are still in the print queue.
- @pyqtProperty("QVariantList", notify = printJobsChanged)
- def queuedPrintJobs(self) -> List[UM3PrintJobOutputModel]:
- return [print_job for print_job in self._print_jobs
- if print_job.state == "queued" or print_job.state == "error"]
-
- ## Get remote print jobs that are assigned to a printer.
- @pyqtProperty("QVariantList", notify = printJobsChanged)
- def activePrintJobs(self) -> List[UM3PrintJobOutputModel]:
- return [print_job for print_job in self._print_jobs if
- print_job.assignedPrinter is not None and print_job.state != "queued"]
-
- @pyqtSlot(int, result = str)
- def formatDuration(self, seconds: int) -> str:
- return Duration(seconds).getDisplayString(DurationFormat.Format.Short)
-
- @pyqtSlot(int, result = str)
- def getTimeCompleted(self, time_remaining: int) -> str:
- return formatTimeCompleted(time_remaining)
-
- @pyqtSlot(int, result = str)
- def getDateCompleted(self, time_remaining: int) -> str:
- return formatDateCompleted(time_remaining)
-
- ## TODO: The following methods are required by the monitor page QML, but are not actually available using cloud.
- # TODO: We fake the methods here to not break the monitor page.
-
- @pyqtProperty(QUrl, notify = _clusterPrintersChanged)
- def activeCameraUrl(self) -> "QUrl":
- return QUrl()
-
- @pyqtSlot(QUrl)
- def setActiveCameraUrl(self, camera_url: "QUrl") -> None:
- pass
-
- @pyqtProperty(bool, notify = printJobsChanged)
- def receivedPrintJobs(self) -> bool:
- return bool(self._print_jobs)
-
- @pyqtSlot()
- def openPrintJobControlPanel(self) -> None:
- pass
-
- @pyqtSlot()
- def openPrinterControlPanel(self) -> None:
- pass
-
- @pyqtSlot(str)
- def sendJobToTop(self, print_job_uuid: str) -> None:
- pass
-
- @pyqtSlot(str)
- def deleteJobFromQueue(self, print_job_uuid: str) -> None:
- pass
-
- @pyqtSlot(str)
- def forceSendJob(self, print_job_uuid: str) -> None:
- pass
-
- @pyqtProperty("QVariantList", notify = _clusterPrintersChanged)
- def connectedPrintersTypeCount(self) -> List[Dict[str, str]]:
- return []
+ ## Gets the URL on which to monitor the cluster via the cloud.
+ @property
+ def clusterCloudUrl(self) -> str:
+ root_url_prefix = "-staging" if self._account.is_staging else ""
+ return "https://mycloud{}.ultimaker.com/app/jobs/{}".format(root_url_prefix, self.clusterData.cluster_id)
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py
index e081beb99c..1da099dadc 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py
+++ b/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py
@@ -1,30 +1,27 @@
-# 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 Dict, List
+from typing import Dict, List, Optional
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
+
from .CloudApiClient import CloudApiClient
from .CloudOutputDevice import CloudOutputDevice
-from .Models.CloudClusterResponse import CloudClusterResponse
-from .Models.CloudError import CloudError
-from .Utils import findChanges
+from ..Models.Http.CloudClusterResponse import CloudClusterResponse
-## The cloud output device manager is responsible for using the Ultimaker Cloud APIs to manage remote clusters.
-# Keeping all cloud related logic in this class instead of the UM3OutputDevicePlugin results in more readable code.
-#
-# API spec is available on https://api.ultimaker.com/docs/connect/spec/.
-#
+## The cloud output device manager is responsible for using the Ultimaker Cloud APIs to manage remote clusters.
+# Keeping all cloud related logic in this class instead of the UM3OutputDevicePlugin results in more readable code.
+# API spec is available on https://api.ultimaker.com/docs/connect/spec/.
class CloudOutputDeviceManager:
+
META_CLUSTER_ID = "um_cloud_cluster_id"
+ META_NETWORK_KEY = "um_network_key"
# The interval with which the remote clusters are checked
CHECK_CLUSTER_INTERVAL = 30.0 # seconds
@@ -32,144 +29,153 @@ class CloudOutputDeviceManager:
# The translation catalog for this device.
I18N_CATALOG = i18nCatalog("cura")
- addedCloudCluster = Signal()
- removedCloudCluster = Signal()
+ # Signal emitted when the list of discovered devices changed.
+ discoveredDevicesChanged = Signal()
def __init__(self) -> None:
# Persistent dict containing the remote clusters for the authenticated user.
self._remote_clusters = {} # type: Dict[str, CloudOutputDevice]
-
- self._application = CuraApplication.getInstance()
- self._output_device_manager = self._application.getOutputDeviceManager()
-
- self._account = self._application.getCuraAPI().account # type: Account
- self._api = CloudApiClient(self._account, self._onApiError)
+ self._account = CuraApplication.getInstance().getCuraAPI().account # type: Account
+ self._api = CloudApiClient(self._account, on_error=lambda error: print(error))
+ self._account.loginStateChanged.connect(self._onLoginStateChanged)
# Create a timer to update the remote cluster list
self._update_timer = QTimer()
self._update_timer.setInterval(int(self.CHECK_CLUSTER_INTERVAL * 1000))
self._update_timer.setSingleShot(False)
+ self._update_timer.timeout.connect(self._getRemoteClusters)
+ # Ensure we don't start twice.
self._running = False
- # Called when the uses logs in or out
+ ## Starts running the cloud output device manager, thus periodically requesting cloud data.
+ def start(self):
+ if self._running:
+ return
+ if not self._account.isLoggedIn:
+ return
+ self._running = True
+ if not self._update_timer.isActive():
+ self._update_timer.start()
+ self._getRemoteClusters()
+
+ ## Stops running the cloud output device manager.
+ def stop(self):
+ if not self._running:
+ return
+ self._running = False
+ if self._update_timer.isActive():
+ self._update_timer.stop()
+ self._onGetRemoteClustersFinished([]) # Make sure we remove all cloud output devices.
+
+ ## Force refreshing connections.
+ def refreshConnections(self) -> None:
+ self._connectToActiveMachine()
+
+ ## Called when the uses logs in or out
def _onLoginStateChanged(self, is_logged_in: bool) -> None:
- Logger.log("d", "Log in state changed to %s", is_logged_in)
if is_logged_in:
- if not self._update_timer.isActive():
- self._update_timer.start()
- self._getRemoteClusters()
+ self.start()
else:
- if self._update_timer.isActive():
- self._update_timer.stop()
+ self.stop()
- # Notify that all clusters have disappeared
- self._onGetRemoteClustersFinished([])
-
- ## Gets all remote clusters from the API.
+ ## Gets all remote clusters from the API.
def _getRemoteClusters(self) -> None:
- Logger.log("d", "Retrieving remote clusters")
self._api.getClusters(self._onGetRemoteClustersFinished)
- ## Callback for when the request for getting the clusters. is finished.
+ ## Callback for when the request for getting the clusters is finished.
def _onGetRemoteClustersFinished(self, clusters: List[CloudClusterResponse]) -> None:
online_clusters = {c.cluster_id: c for c in clusters if c.is_online} # type: Dict[str, CloudClusterResponse]
+ for device_id, cluster_data in online_clusters.items():
+ if device_id not in self._remote_clusters:
+ self._onDeviceDiscovered(cluster_data)
+ else:
+ self._onDiscoveredDeviceUpdated(cluster_data)
- removed_devices, added_clusters, updates = findChanges(self._remote_clusters, online_clusters)
-
- Logger.log("d", "Parsed remote clusters to %s", [cluster.toDict() for cluster in online_clusters.values()])
- 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]
-
- # 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 device, cluster in updates:
- device.clusterData = cluster
+ removed_device_keys = set(self._remote_clusters.keys()) - set(online_clusters.keys())
+ for device_id in removed_device_keys:
+ self._onDiscoveredDeviceRemoved(device_id)
+ def _onDeviceDiscovered(self, cluster_data: CloudClusterResponse) -> None:
+ device = CloudOutputDevice(self._api, cluster_data)
+ CuraApplication.getInstance().getDiscoveredPrintersModel().addDiscoveredPrinter(
+ ip_address=device.key,
+ key=device.getId(),
+ name=device.getName(),
+ create_callback=self._createMachineFromDiscoveredDevice,
+ machine_type=device.printerType,
+ device=device
+ )
+ self._remote_clusters[device.getId()] = device
+ self.discoveredDevicesChanged.emit()
self._connectToActiveMachine()
+ def _onDiscoveredDeviceUpdated(self, cluster_data: CloudClusterResponse) -> None:
+ device = self._remote_clusters.get(cluster_data.cluster_id)
+ if not device:
+ return
+ CuraApplication.getInstance().getDiscoveredPrintersModel().updateDiscoveredPrinter(
+ ip_address=device.key,
+ name=cluster_data.friendly_name,
+ machine_type=device.printerType
+ )
+ self.discoveredDevicesChanged.emit()
+
+ def _onDiscoveredDeviceRemoved(self, device_id: str) -> None:
+ device = self._remote_clusters.pop(device_id, None) # type: Optional[CloudOutputDevice]
+ if not device:
+ return
+ device.close()
+ CuraApplication.getInstance().getDiscoveredPrintersModel().removeDiscoveredPrinter(device.key)
+ output_device_manager = CuraApplication.getInstance().getOutputDeviceManager()
+ if device.key in output_device_manager.getOutputDeviceIds():
+ output_device_manager.removeOutputDevice(device.key)
+ self.discoveredDevicesChanged.emit()
+
+ def _createMachineFromDiscoveredDevice(self, key: str) -> None:
+ device = self._remote_clusters[key]
+ if not device:
+ return
+
+ # The newly added machine is automatically activated.
+ machine_manager = CuraApplication.getInstance().getMachineManager()
+ machine_manager.addMachine(device.printerType, device.clusterData.friendly_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:
active_machine = CuraApplication.getInstance().getGlobalContainerStack()
if not active_machine:
return
- # Remove all output devices that we have registered.
- # This is needed because when we switch machines we can only leave
- # output devices that are meant for that machine.
- for stored_cluster_id in self._remote_clusters:
- self._output_device_manager.removeOutputDevice(stored_cluster_id)
-
- # Check if the stored cluster_id for the active machine is in our list of remote clusters.
+ output_device_manager = CuraApplication.getInstance().getOutputDeviceManager()
stored_cluster_id = active_machine.getMetaDataEntry(self.META_CLUSTER_ID)
- if stored_cluster_id in self._remote_clusters:
- device = self._remote_clusters[stored_cluster_id]
- self._connectToOutputDevice(device, active_machine)
- Logger.log("d", "Device connected by metadata cluster ID %s", stored_cluster_id)
- else:
- self._connectByNetworkKey(active_machine)
-
- ## Tries to match the local network key to the cloud cluster host name.
- def _connectByNetworkKey(self, active_machine: GlobalStack) -> None:
- # Check if the active printer has a local network connection and match this key to the remote cluster.
- local_network_key = active_machine.getMetaDataEntry("um_network_key")
- if not local_network_key:
- return
-
- device = next((c for c in self._remote_clusters.values() if c.matchesNetworkKey(local_network_key)), None)
- if not device:
- return
-
- Logger.log("i", "Found cluster %s with network key %s", device, local_network_key)
- active_machine.setMetaDataEntry(self.META_CLUSTER_ID, device.key)
- self._connectToOutputDevice(device, active_machine)
+ local_network_key = active_machine.getMetaDataEntry(self.META_NETWORK_KEY)
+ for device in self._remote_clusters.values():
+ if device.key == stored_cluster_id:
+ # Connect to it if the stored ID matches.
+ self._connectToOutputDevice(device, active_machine)
+ elif local_network_key and device.matchesNetworkKey(local_network_key):
+ # Connect to it if we can match the local network key that was already present.
+ self._connectToOutputDevice(device, active_machine)
+ elif device.key in output_device_manager.getOutputDeviceIds():
+ # Remove device if it is not meant for the active machine.
+ output_device_manager.removeOutputDevice(device.key)
## Connects to an output device and makes sure it is registered in the output device manager.
- def _connectToOutputDevice(self, device: CloudOutputDevice, active_machine: GlobalStack) -> None:
- device.connect()
- self._output_device_manager.addOutputDevice(device)
- active_machine.addConfiguredConnectionType(device.connectionType.value)
+ def _connectToOutputDevice(self, device: CloudOutputDevice, machine: GlobalStack) -> None:
+ machine.setName(device.name)
+ machine.setMetaDataEntry(self.META_CLUSTER_ID, device.key)
+ machine.setMetaDataEntry("group_name", device.name)
+ machine.addConfiguredConnectionType(device.connectionType.value)
- ## Handles an API error received from the cloud.
- # \param errors: The errors received
- def _onApiError(self, errors: List[CloudError] = None) -> None:
- Logger.log("w", str(errors))
- message = Message(
- text = self.I18N_CATALOG.i18nc("@info:description", "There was an error connecting to the cloud."),
- title = self.I18N_CATALOG.i18nc("@info:title", "Error"),
- lifetime = 10
- )
- message.show()
+ if not device.isConnected():
+ device.connect()
- ## Starts running the cloud output device manager, thus periodically requesting cloud data.
- def start(self):
- if self._running:
- return
- self._account.loginStateChanged.connect(self._onLoginStateChanged)
- # When switching machines we check if we have to activate a remote cluster.
- self._application.globalContainerStackChanged.connect(self._connectToActiveMachine)
- self._update_timer.timeout.connect(self._getRemoteClusters)
- self._onLoginStateChanged(is_logged_in = self._account.isLoggedIn)
-
- ## Stops running the cloud output device manager.
- def stop(self):
- if not self._running:
- return
- self._account.loginStateChanged.disconnect(self._onLoginStateChanged)
- # When switching machines we check if we have to activate a remote cluster.
- self._application.globalContainerStackChanged.disconnect(self._connectToActiveMachine)
- self._update_timer.timeout.disconnect(self._getRemoteClusters)
- self._onLoginStateChanged(is_logged_in = False)
+ output_device_manager = CuraApplication.getInstance().getOutputDeviceManager()
+ if device.key not in output_device_manager.getOutputDeviceIds():
+ output_device_manager.addOutputDevice(device)
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterBuildPlate.py b/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterBuildPlate.py
deleted file mode 100644
index 4386bbb435..0000000000
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterBuildPlate.py
+++ /dev/null
@@ -1,13 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-from .BaseCloudModel import BaseCloudModel
-
-
-## Class representing a cluster printer
-# Spec: https://api-staging.ultimaker.com/connect/v1/spec
-class CloudClusterBuildPlate(BaseCloudModel):
- ## Create a new build plate
- # \param type: The type of buildplate glass or aluminium
- def __init__(self, type: str = "glass", **kwargs) -> None:
- self.type = type
- super().__init__(**kwargs)
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrinterStatus.py b/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrinterStatus.py
deleted file mode 100644
index bd3e482bde..0000000000
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrinterStatus.py
+++ /dev/null
@@ -1,73 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-from typing import List, Union, Dict, Optional, Any
-
-from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
-from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
-from .CloudClusterBuildPlate import CloudClusterBuildPlate
-from .CloudClusterPrintCoreConfiguration import CloudClusterPrintCoreConfiguration
-from .BaseCloudModel import BaseCloudModel
-
-
-## Class representing a cluster printer
-# Spec: https://api-staging.ultimaker.com/connect/v1/spec
-class CloudClusterPrinterStatus(BaseCloudModel):
- ## Creates a new cluster printer status
- # \param enabled: A printer can be disabled if it should not receive new jobs. By default every printer is enabled.
- # \param firmware_version: Firmware version installed on the printer. Can differ for each printer in a cluster.
- # \param friendly_name: Human readable name of the printer. Can be used for identification purposes.
- # \param ip_address: The IP address of the printer in the local network.
- # \param machine_variant: The type of printer. Can be 'Ultimaker 3' or 'Ultimaker 3ext'.
- # \param status: The status of the printer.
- # \param unique_name: The unique name of the printer in the network.
- # \param uuid: The unique ID of the printer, also known as GUID.
- # \param configuration: The active print core configurations of this printer.
- # \param reserved_by: A printer can be claimed by a specific print job.
- # \param maintenance_required: Indicates if maintenance is necessary
- # \param firmware_update_status: Whether the printer's firmware is up-to-date, value is one of: "up_to_date",
- # "pending_update", "update_available", "update_in_progress", "update_failed", "update_impossible"
- # \param latest_available_firmware: The version of the latest firmware that is available
- # \param build_plate: The build plate that is on the printer
- def __init__(self, enabled: bool, firmware_version: str, friendly_name: str, ip_address: str, machine_variant: str,
- status: str, unique_name: str, uuid: str,
- configuration: List[Union[Dict[str, Any], CloudClusterPrintCoreConfiguration]],
- reserved_by: Optional[str] = None, maintenance_required: Optional[bool] = None,
- firmware_update_status: Optional[str] = None, latest_available_firmware: Optional[str] = None,
- build_plate: Union[Dict[str, Any], CloudClusterBuildPlate] = None, **kwargs) -> None:
-
- self.configuration = self.parseModels(CloudClusterPrintCoreConfiguration, configuration)
- self.enabled = enabled
- self.firmware_version = firmware_version
- self.friendly_name = friendly_name
- self.ip_address = ip_address
- self.machine_variant = machine_variant
- self.status = status
- self.unique_name = unique_name
- self.uuid = uuid
- self.reserved_by = reserved_by
- self.maintenance_required = maintenance_required
- self.firmware_update_status = firmware_update_status
- self.latest_available_firmware = latest_available_firmware
- self.build_plate = self.parseModel(CloudClusterBuildPlate, build_plate) if build_plate else None
- super().__init__(**kwargs)
-
- ## Creates a new output model.
- # \param controller - The controller of the model.
- def createOutputModel(self, controller: PrinterOutputController) -> PrinterOutputModel:
- model = PrinterOutputModel(controller, len(self.configuration), firmware_version = self.firmware_version)
- self.updateOutputModel(model)
- return model
-
- ## Updates the given output model.
- # \param model - The output model to update.
- def updateOutputModel(self, model: PrinterOutputModel) -> None:
- model.updateKey(self.uuid)
- model.updateName(self.friendly_name)
- model.updateType(self.machine_variant)
- model.updateState(self.status if self.enabled else "disabled")
- model.updateBuildplate(self.build_plate.type if self.build_plate else "glass")
-
- for configuration, extruder_output, extruder_config in \
- zip(self.configuration, model.extruders, model.printerConfiguration.extruderConfigurations):
- configuration.updateOutputModel(extruder_output)
- configuration.updateConfigurationModel(extruder_config)
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/__init__.py b/plugins/UM3NetworkPrinting/src/Cloud/Models/__init__.py
deleted file mode 100644
index f3f6970c54..0000000000
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/ToolPathUploader.py b/plugins/UM3NetworkPrinting/src/Cloud/ToolPathUploader.py
index 176b7e6ab7..d5de7fe10a 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/ToolPathUploader.py
+++ b/plugins/UM3NetworkPrinting/src/Cloud/ToolPathUploader.py
@@ -1,4 +1,4 @@
-# Copyright (c) 2018 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# !/usr/bin/env python
# -*- coding: utf-8 -*-
from PyQt5.QtCore import QUrl
@@ -6,7 +6,8 @@ from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply, QNetworkAccessManage
from typing import Optional, Callable, Any, Tuple, cast
from UM.Logger import Logger
-from .Models.CloudPrintJobResponse import CloudPrintJobResponse
+
+from ..Models.Http.CloudPrintJobResponse import CloudPrintJobResponse
## Class responsible for uploading meshes to the cloud in separate requests.
@@ -53,7 +54,7 @@ class ToolPathUploader:
def _createRequest(self) -> QNetworkRequest:
request = QNetworkRequest(QUrl(self._print_job.upload_url))
request.setHeader(QNetworkRequest.ContentTypeHeader, self._print_job.content_type)
-
+
first_byte, last_byte = self._chunkRange()
content_range = "bytes {}-{}/{}".format(first_byte, last_byte - 1, len(self._data))
request.setRawHeader(b"Content-Range", content_range.encode())
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Utils.py b/plugins/UM3NetworkPrinting/src/Cloud/Utils.py
deleted file mode 100644
index 5136e0e7db..0000000000
--- a/plugins/UM3NetworkPrinting/src/Cloud/Utils.py
+++ /dev/null
@@ -1,54 +0,0 @@
-from datetime import datetime, timedelta
-from typing import TypeVar, Dict, Tuple, List
-
-from UM import i18nCatalog
-
-T = TypeVar("T")
-U = TypeVar("U")
-
-
-## Splits the given dictionaries into three lists (in a tuple):
-# - `removed`: Items that were in the first argument but removed in the second one.
-# - `added`: Items that were not in the first argument but were included in the second one.
-# - `updated`: Items that were in both dictionaries. Both values are given in a tuple.
-# \param previous: The previous items
-# \param received: The received items
-# \return: The tuple (removed, added, updated) as explained above.
-def findChanges(previous: Dict[str, T], received: Dict[str, U]) -> Tuple[List[T], List[U], List[Tuple[T, U]]]:
- previous_ids = set(previous)
- received_ids = set(received)
-
- removed_ids = previous_ids.difference(received_ids)
- new_ids = received_ids.difference(previous_ids)
- updated_ids = received_ids.intersection(previous_ids)
-
- removed = [previous[removed_id] for removed_id in removed_ids]
- added = [received[new_id] for new_id in new_ids]
- updated = [(previous[updated_id], received[updated_id]) for updated_id in updated_ids]
-
- return removed, added, updated
-
-
-def formatTimeCompleted(seconds_remaining: int) -> str:
- completed = datetime.now() + timedelta(seconds=seconds_remaining)
- return "{hour:02d}:{minute:02d}".format(hour = completed.hour, minute = completed.minute)
-
-
-def formatDateCompleted(seconds_remaining: int) -> str:
- now = datetime.now()
- completed = now + timedelta(seconds=seconds_remaining)
- days = (completed.date() - now.date()).days
- i18n = i18nCatalog("cura")
-
- # If finishing date is more than 7 days out, using "Mon Dec 3 at HH:MM" format
- if days >= 7:
- return completed.strftime("%a %b ") + "{day}".format(day = completed.day)
- # If finishing date is within the next week, use "Monday at HH:MM" format
- elif days >= 2:
- return completed.strftime("%a")
- # If finishing tomorrow, use "tomorrow at HH:MM" format
- elif days >= 1:
- return i18n.i18nc("@info:status", "tomorrow")
- # If finishing today, use "today at HH:MM" format
- else:
- return i18n.i18nc("@info:status", "today")
diff --git a/plugins/UM3NetworkPrinting/src/ClusterOutputController.py b/plugins/UM3NetworkPrinting/src/ClusterOutputController.py
new file mode 100644
index 0000000000..02d8d174d1
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/ClusterOutputController.py
@@ -0,0 +1,21 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from cura.PrinterOutput.Models.PrintJobOutputModel import PrintJobOutputModel
+from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
+from cura.PrinterOutput.PrinterOutputDevice import PrinterOutputDevice
+
+
+class ClusterOutputController(PrinterOutputController):
+
+ def __init__(self, output_device: PrinterOutputDevice) -> None:
+ super().__init__(output_device)
+ self.can_pause = True
+ self.can_abort = True
+ self.can_pre_heat_bed = False
+ self.can_pre_heat_hotends = False
+ self.can_send_raw_gcode = False
+ self.can_control_manually = False
+ self.can_update_firmware = False
+
+ def setJobState(self, job: PrintJobOutputModel, state: str):
+ self._output_device.setJobState(job.key, state)
diff --git a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py
deleted file mode 100644
index da63f11158..0000000000
--- a/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py
+++ /dev/null
@@ -1,705 +0,0 @@
-# Copyright (c) 2019 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-
-from typing import Any, cast, Tuple, Union, Optional, Dict, List
-from time import time
-
-import io # To create the correct buffers for sending data to the printer.
-import json
-import os
-
-from UM.FileHandler.FileHandler import FileHandler
-from UM.FileHandler.WriteFileJob import WriteFileJob # To call the file writer asynchronously.
-from UM.i18n import i18nCatalog
-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.NetworkedPrinterOutputDevice import AuthState, NetworkedPrinterOutputDevice
-from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
-from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel
-from cura.PrinterOutputDevice import ConnectionType
-
-from .Cloud.Utils import formatTimeCompleted, formatDateCompleted
-from .ClusterUM3PrinterOutputController import ClusterUM3PrinterOutputController
-from .ConfigurationChangeModel import ConfigurationChangeModel
-from .MeshFormatHandler import MeshFormatHandler
-from .SendMaterialJob import SendMaterialJob
-from .UM3PrintJobOutputModel import UM3PrintJobOutputModel
-
-from PyQt5.QtNetwork import QNetworkRequest, QNetworkReply
-from PyQt5.QtGui import QDesktopServices, QImage
-from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty, QObject
-
-i18n_catalog = i18nCatalog("cura")
-
-
-class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice):
- printJobsChanged = pyqtSignal()
- activePrinterChanged = pyqtSignal()
- activeCameraUrlChanged = pyqtSignal()
- receivedPrintJobsChanged = pyqtSignal()
-
- # Notify can only use signals that are defined by the class that they are in, not inherited ones.
- # Therefore we create a private signal used to trigger the printersChanged signal.
- _clusterPrintersChanged = pyqtSignal()
-
- def __init__(self, device_id, address, properties, parent = None) -> None:
- super().__init__(device_id = device_id, address = address, properties=properties, connection_type = ConnectionType.NetworkConnection, parent = parent)
- self._api_prefix = "/cluster-api/v1/"
-
- self._application = CuraApplication.getInstance()
-
- self._number_of_extruders = 2
-
- self._dummy_lambdas = (
- "", {}, io.BytesIO()
- ) # type: Tuple[Optional[str], Dict[str, Union[str, int, bool]], Union[io.StringIO, io.BytesIO]]
-
- self._print_jobs = [] # type: List[UM3PrintJobOutputModel]
- self._received_print_jobs = False # type: bool
-
- if PluginRegistry.getInstance() is not None:
- self._monitor_view_qml_path = os.path.join(
- PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"),
- "resources", "qml", "MonitorStage.qml"
- )
-
- # Trigger the printersChanged signal when the private signal is triggered
- self.printersChanged.connect(self._clusterPrintersChanged)
-
- self._accepts_commands = True # type: bool
-
- # Cluster does not have authentication, so default to authenticated
- self._authentication_state = AuthState.Authenticated
-
- self._error_message = None # type: Optional[Message]
- self._write_job_progress_message = None # type: Optional[Message]
- self._progress_message = None # type: Optional[Message]
-
- self._active_printer = None # type: Optional[PrinterOutputModel]
-
- self._printer_selection_dialog = None # type: QObject
-
- self.setPriority(3) # Make sure the output device gets selected above local file output
- self.setName(self._id)
- self.setShortDescription(i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network"))
- self.setDescription(i18n_catalog.i18nc("@properties:tooltip", "Print over network"))
-
- self.setConnectionText(i18n_catalog.i18nc("@info:status", "Connected over the network"))
-
- self._printer_uuid_to_unique_name_mapping = {} # type: Dict[str, str]
-
- self._finished_jobs = [] # type: List[UM3PrintJobOutputModel]
-
- self._cluster_size = int(properties.get(b"cluster_size", 0)) # type: int
-
- self._latest_reply_handler = None # type: Optional[QNetworkReply]
- self._sending_job = None
-
- self._active_camera_url = QUrl() # type: QUrl
-
- def requestWrite(self, nodes: List[SceneNode], file_name: Optional[str] = None, limit_mimetypes: bool = False,
- file_handler: Optional[FileHandler] = None, **kwargs: str) -> None:
- self.writeStarted.emit(self)
-
- self.sendMaterialProfiles()
-
- mesh_format = MeshFormatHandler(file_handler, self.firmwareVersion)
-
- # This function pauses with the yield, waiting on instructions on which printer it needs to print with.
- if not mesh_format.is_valid:
- Logger.log("e", "Missing file or mesh writer!")
- return
- self._sending_job = self._sendPrintJob(mesh_format, nodes)
- if self._sending_job is not None:
- self._sending_job.send(None) # Start the generator.
-
- if len(self._printers) > 1: # We need to ask the user.
- self._spawnPrinterSelectionDialog()
- is_job_sent = True
- else: # Just immediately continue.
- self._sending_job.send("") # No specifically selected printer.
- is_job_sent = self._sending_job.send(None)
-
- def _spawnPrinterSelectionDialog(self):
- if self._printer_selection_dialog is None:
- 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()
-
- @pyqtProperty(int, constant=True)
- def clusterSize(self) -> int:
- return self._cluster_size
-
- ## Allows the user to choose a printer to print with from the printer
- # selection dialogue.
- # \param target_printer The name of the printer to target.
- @pyqtSlot(str)
- def selectPrinter(self, target_printer: str = "") -> None:
- if self._sending_job is not None:
- self._sending_job.send(target_printer)
-
- @pyqtSlot()
- def cancelPrintSelection(self) -> None:
- self._sending_gcode = False
-
- ## Greenlet to send a job to the printer over the network.
- #
- # This greenlet gets called asynchronously in requestWrite. It is a
- # greenlet in order to optionally wait for selectPrinter() to select a
- # printer.
- # The greenlet yields exactly three times: First time None,
- # \param mesh_format Object responsible for choosing the right kind of format to write with.
- def _sendPrintJob(self, mesh_format: MeshFormatHandler, nodes: List[SceneNode]):
- Logger.log("i", "Sending print job to printer.")
- if self._sending_gcode:
- self._error_message = Message(
- i18n_catalog.i18nc("@info:status",
- "Sending new jobs (temporarily) blocked, still sending the previous print job."))
- self._error_message.show()
- yield #Wait on the user to select a target printer.
- yield #Wait for the write job to be finished.
- yield False #Return whether this was a success or not.
- yield #Prevent StopIteration.
-
- self._sending_gcode = True
-
- # Potentially wait on the user to select a target printer.
- target_printer = yield # type: Optional[str]
-
- # Using buffering greatly reduces the write time for many lines of gcode
-
- stream = mesh_format.createStream()
-
- job = WriteFileJob(mesh_format.writer, stream, nodes, mesh_format.file_mode)
-
- self._write_job_progress_message = Message(i18n_catalog.i18nc("@info:status", "Sending data to printer"),
- lifetime = 0, dismissable = False, progress = -1,
- title = i18n_catalog.i18nc("@info:title", "Sending Data"),
- use_inactivity_timer = False)
- self._write_job_progress_message.show()
-
- if mesh_format.preferred_format is not None:
- self._dummy_lambdas = (target_printer, mesh_format.preferred_format, stream)
- job.finished.connect(self._sendPrintJobWaitOnWriteJobFinished)
- job.start()
- yield True # Return that we had success!
- yield # To prevent having to catch the StopIteration exception.
-
- def _sendPrintJobWaitOnWriteJobFinished(self, job: WriteFileJob) -> None:
- if self._write_job_progress_message:
- self._write_job_progress_message.hide()
-
- self._progress_message = Message(i18n_catalog.i18nc("@info:status", "Sending data to printer"), lifetime = 0,
- dismissable = False, progress = -1,
- title = i18n_catalog.i18nc("@info:title", "Sending Data"))
- self._progress_message.addAction("Abort", i18n_catalog.i18nc("@action:button", "Cancel"), icon = "",
- description = "")
- self._progress_message.actionTriggered.connect(self._progressMessageActionTriggered)
- self._progress_message.show()
- parts = []
-
- target_printer, preferred_format, stream = self._dummy_lambdas
-
- # If a specific printer was selected, it should be printed with that machine.
- if target_printer:
- target_printer = self._printer_uuid_to_unique_name_mapping[target_printer]
- parts.append(self._createFormPart("name=require_printer_name", bytes(target_printer, "utf-8"), "text/plain"))
-
- # Add user name to the print_job
- parts.append(self._createFormPart("name=owner", bytes(self._getUserName(), "utf-8"), "text/plain"))
-
- file_name = self._application.getPrintInformation().jobName + "." + preferred_format["extension"]
-
- output = stream.getvalue() # Either str or bytes depending on the output mode.
- if isinstance(stream, io.StringIO):
- output = cast(str, output).encode("utf-8")
- output = cast(bytes, output)
-
- parts.append(self._createFormPart("name=\"file\"; filename=\"%s\"" % file_name, output))
-
- self._latest_reply_handler = self.postFormWithParts("print_jobs/", parts,
- on_finished = self._onPostPrintJobFinished,
- on_progress = self._onUploadPrintJobProgress)
-
- @pyqtProperty(QObject, notify = activePrinterChanged)
- def activePrinter(self) -> Optional[PrinterOutputModel]:
- return self._active_printer
-
- @pyqtSlot(QObject)
- def setActivePrinter(self, printer: Optional[PrinterOutputModel]) -> None:
- if self._active_printer != printer:
- self._active_printer = printer
- self.activePrinterChanged.emit()
-
- @pyqtProperty(QUrl, notify = activeCameraUrlChanged)
- def activeCameraUrl(self) -> "QUrl":
- return self._active_camera_url
-
- @pyqtSlot(QUrl)
- def setActiveCameraUrl(self, camera_url: "QUrl") -> None:
- if self._active_camera_url != camera_url:
- self._active_camera_url = camera_url
- self.activeCameraUrlChanged.emit()
-
- def _onPostPrintJobFinished(self, reply: QNetworkReply) -> None:
- if self._progress_message:
- self._progress_message.hide()
- self._compressing_gcode = False
- self._sending_gcode = False
-
- ## The IP address of the printer.
- @pyqtProperty(str, constant = True)
- def address(self) -> str:
- return self._address
-
- def _onUploadPrintJobProgress(self, bytes_sent: int, bytes_total: int) -> None:
- if bytes_total > 0:
- new_progress = bytes_sent / bytes_total * 100
- # Treat upload progress as response. Uploading can take more than 10 seconds, so if we don't, we can get
- # timeout responses if this happens.
- self._last_response_time = time()
- if self._progress_message is not None and new_progress != self._progress_message.getProgress():
- self._progress_message.show() # Ensure that the message is visible.
- self._progress_message.setProgress(bytes_sent / bytes_total * 100)
-
- # If successfully sent:
- if bytes_sent == bytes_total:
- # Show a confirmation to the user so they know the job was sucessful and provide the option to switch to
- # the monitor tab.
- self._success_message = Message(
- i18n_catalog.i18nc("@info:status", "Print job was successfully sent to the printer."),
- lifetime=5, dismissable=True,
- title=i18n_catalog.i18nc("@info:title", "Data Sent"))
- self._success_message.addAction("View", i18n_catalog.i18nc("@action:button", "View in Monitor"), icon = "",
- description="")
- self._success_message.actionTriggered.connect(self._successMessageActionTriggered)
- self._success_message.show()
- else:
- if self._progress_message is not None:
- self._progress_message.setProgress(0)
- self._progress_message.hide()
-
- def _progressMessageActionTriggered(self, message_id: Optional[str] = None, action_id: Optional[str] = None) -> None:
- if action_id == "Abort":
- Logger.log("d", "User aborted sending print to remote.")
- if self._progress_message is not None:
- self._progress_message.hide()
- self._compressing_gcode = False
- self._sending_gcode = False
- self._application.getController().setActiveStage("PrepareStage")
-
- # After compressing the sliced model Cura sends data to printer, to stop receiving updates from the request
- # the "reply" should be disconnected
- if self._latest_reply_handler:
- self._latest_reply_handler.disconnect()
- self._latest_reply_handler = None
-
- def _successMessageActionTriggered(self, message_id: Optional[str] = None, action_id: Optional[str] = None) -> None:
- if action_id == "View":
- self._application.getController().setActiveStage("MonitorStage")
-
- @pyqtSlot()
- def openPrintJobControlPanel(self) -> None:
- Logger.log("d", "Opening print job control panel...")
- QDesktopServices.openUrl(QUrl("http://" + self._address + "/print_jobs"))
-
- @pyqtSlot()
- def openPrinterControlPanel(self) -> None:
- Logger.log("d", "Opening printer control panel...")
- QDesktopServices.openUrl(QUrl("http://" + self._address + "/printers"))
-
- @pyqtProperty("QVariantList", notify = printJobsChanged)
- def printJobs(self)-> List[UM3PrintJobOutputModel]:
- return self._print_jobs
-
- @pyqtProperty(bool, notify = receivedPrintJobsChanged)
- def receivedPrintJobs(self) -> bool:
- return self._received_print_jobs
-
- @pyqtProperty("QVariantList", notify = printJobsChanged)
- def queuedPrintJobs(self) -> List[UM3PrintJobOutputModel]:
- return [print_job for print_job in self._print_jobs if print_job.state == "queued" or print_job.state == "error"]
-
- @pyqtProperty("QVariantList", notify = printJobsChanged)
- def activePrintJobs(self) -> List[UM3PrintJobOutputModel]:
- return [print_job for print_job in self._print_jobs if print_job.assignedPrinter is not None and print_job.state != "queued"]
-
- @pyqtProperty("QVariantList", notify = _clusterPrintersChanged)
- def connectedPrintersTypeCount(self) -> List[Dict[str, str]]:
- printer_count = {} # type: Dict[str, int]
- for printer in self._printers:
- if printer.type in printer_count:
- printer_count[printer.type] += 1
- else:
- printer_count[printer.type] = 1
- result = []
- for machine_type in printer_count:
- result.append({"machine_type": machine_type, "count": str(printer_count[machine_type])})
- return result
-
- @pyqtProperty("QVariantList", notify=_clusterPrintersChanged)
- def printers(self):
- return self._printers
-
- @pyqtSlot(int, result = str)
- def getTimeCompleted(self, time_remaining: int) -> str:
- return formatTimeCompleted(time_remaining)
-
- @pyqtSlot(int, result = str)
- def getDateCompleted(self, time_remaining: int) -> str:
- return formatDateCompleted(time_remaining)
-
- @pyqtSlot(int, result = str)
- def formatDuration(self, seconds: int) -> str:
- return Duration(seconds).getDisplayString(DurationFormat.Format.Short)
-
- @pyqtSlot(str)
- def sendJobToTop(self, print_job_uuid: str) -> None:
- # This function is part of the output device (and not of the printjob output model) as this type of operation
- # is a modification of the cluster queue and not of the actual job.
- data = "{\"to_position\": 0}"
- self.put("print_jobs/{uuid}/move_to_position".format(uuid = print_job_uuid), data, on_finished=None)
-
- @pyqtSlot(str)
- def deleteJobFromQueue(self, print_job_uuid: str) -> None:
- # This function is part of the output device (and not of the printjob output model) as this type of operation
- # is a modification of the cluster queue and not of the actual job.
- self.delete("print_jobs/{uuid}".format(uuid = print_job_uuid), on_finished=None)
-
- @pyqtSlot(str)
- def forceSendJob(self, print_job_uuid: str) -> None:
- data = "{\"force\": true}"
- self.put("print_jobs/{uuid}".format(uuid=print_job_uuid), data, on_finished=None)
-
- def _printJobStateChanged(self) -> None:
- username = self._getUserName()
-
- if username is None:
- return # We only want to show notifications if username is set.
-
- finished_jobs = [job for job in self._print_jobs if job.state == "wait_cleanup"]
-
- 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)
- else:
- 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()
-
- # Ensure UI gets updated
- self.printJobsChanged.emit()
-
- # Keep a list of all completed jobs so we know if something changed next time.
- self._finished_jobs = finished_jobs
-
- ## Called when the connection to the cluster changes.
- def connect(self) -> None:
- super().connect()
- self.sendMaterialProfiles()
-
- def _onGetPreviewImageFinished(self, reply: QNetworkReply) -> None:
- reply_url = reply.url().toString()
-
- uuid = reply_url[reply_url.find("print_jobs/")+len("print_jobs/"):reply_url.rfind("/preview_image")]
-
- print_job = findByKey(self._print_jobs, uuid)
- if print_job:
- image = QImage()
- image.loadFromData(reply.readAll())
- print_job.updatePreviewImage(image)
-
- def _update(self) -> None:
- super()._update()
- self.get("printers/", on_finished = self._onGetPrintersDataFinished)
- self.get("print_jobs/", on_finished = self._onGetPrintJobsFinished)
-
- for print_job in self._print_jobs:
- if print_job.getPreviewImage() is None:
- self.get("print_jobs/{uuid}/preview_image".format(uuid=print_job.key), on_finished=self._onGetPreviewImageFinished)
-
- def _onGetPrintJobsFinished(self, reply: QNetworkReply) -> None:
- self._received_print_jobs = True
- self.receivedPrintJobsChanged.emit()
-
- if not checkValidGetReply(reply):
- return
-
- result = loadJsonFromReply(reply)
- if result is None:
- return
-
- print_jobs_seen = []
- job_list_changed = False
- for idx, print_job_data in enumerate(result):
- print_job = findByKey(self._print_jobs, print_job_data["uuid"])
- if print_job is None:
- print_job = self._createPrintJobModel(print_job_data)
- job_list_changed = True
- elif not job_list_changed:
- # Check if the order of the jobs has changed since the last check
- if self._print_jobs.index(print_job) != idx:
- job_list_changed = True
-
- self._updatePrintJob(print_job, print_job_data)
-
- if print_job.state != "queued" and print_job.state != "error": # Print job should be assigned to a printer.
- if print_job.state in ["failed", "finished", "aborted", "none"]:
- # Print job was already completed, so don't attach it to a printer.
- printer = None
- else:
- printer = self._getPrinterByKey(print_job_data["printer_uuid"])
- else: # The job can "reserve" a printer if some changes are required.
- printer = self._getPrinterByKey(print_job_data["assigned_to"])
-
- if printer:
- printer.updateActivePrintJob(print_job)
-
- print_jobs_seen.append(print_job)
-
- # Check what jobs need to be removed.
- removed_jobs = [print_job for print_job in self._print_jobs if print_job not in print_jobs_seen]
-
- for removed_job in removed_jobs:
- job_list_changed = job_list_changed or self._removeJob(removed_job)
-
- if job_list_changed:
- # Override the old list with the new list (either because jobs were removed / added or order changed)
- self._print_jobs = print_jobs_seen
- self.printJobsChanged.emit() # Do a single emit for all print job changes.
-
- def _onGetPrintersDataFinished(self, reply: QNetworkReply) -> None:
- if not checkValidGetReply(reply):
- return
-
- result = loadJsonFromReply(reply)
- if result is None:
- return
-
- printer_list_changed = False
- printers_seen = []
-
- for printer_data in result:
- printer = findByKey(self._printers, printer_data["uuid"])
-
- if printer is None:
- printer = self._createPrinterModel(printer_data)
- printer_list_changed = True
-
- printers_seen.append(printer)
-
- self._updatePrinter(printer, printer_data)
-
- removed_printers = [printer for printer in self._printers if printer not in printers_seen]
- for printer in removed_printers:
- self._removePrinter(printer)
-
- if removed_printers or printer_list_changed:
- self.printersChanged.emit()
-
- def _createPrinterModel(self, data: Dict[str, Any]) -> PrinterOutputModel:
- printer = PrinterOutputModel(output_controller = ClusterUM3PrinterOutputController(self),
- number_of_extruders = self._number_of_extruders)
- printer.setCameraUrl(QUrl("http://" + data["ip_address"] + ":8080/?action=stream"))
- self._printers.append(printer)
- return printer
-
- def _createPrintJobModel(self, data: Dict[str, Any]) -> UM3PrintJobOutputModel:
- print_job = UM3PrintJobOutputModel(output_controller=ClusterUM3PrinterOutputController(self),
- key=data["uuid"], name= data["name"])
-
- configuration = ConfigurationModel()
- extruders = [ExtruderConfigurationModel(position = idx) for idx in range(0, self._number_of_extruders)]
- for index in range(0, self._number_of_extruders):
- try:
- extruder_data = data["configuration"][index]
- except IndexError:
- continue
- extruder = extruders[int(data["configuration"][index]["extruder_index"])]
- extruder.setHotendID(extruder_data.get("print_core_id", ""))
- extruder.setMaterial(self._createMaterialOutputModel(extruder_data.get("material", {})))
-
- configuration.setExtruderConfigurations(extruders)
- print_job.updateConfiguration(configuration)
- print_job.setCompatibleMachineFamilies(data.get("compatible_machine_families", []))
- print_job.stateChanged.connect(self._printJobStateChanged)
- return print_job
-
- def _updatePrintJob(self, print_job: UM3PrintJobOutputModel, data: Dict[str, Any]) -> None:
- print_job.updateTimeTotal(data["time_total"])
- print_job.updateTimeElapsed(data["time_elapsed"])
- impediments_to_printing = data.get("impediments_to_printing", [])
- print_job.updateOwner(data["owner"])
-
- status_set_by_impediment = False
- for impediment in impediments_to_printing:
- if impediment["severity"] == "UNFIXABLE":
- status_set_by_impediment = True
- print_job.updateState("error")
- break
-
- if not status_set_by_impediment:
- print_job.updateState(data["status"])
-
- print_job.updateConfigurationChanges(self._createConfigurationChanges(data["configuration_changes_required"]))
-
- def _createConfigurationChanges(self, data: List[Dict[str, Any]]) -> List[ConfigurationChangeModel]:
- result = []
- for change in data:
- result.append(ConfigurationChangeModel(type_of_change=change["type_of_change"],
- index=change["index"],
- target_name=change["target_name"],
- origin_name=change["origin_name"]))
- return result
-
- def _createMaterialOutputModel(self, material_data: Dict[str, Any]) -> "MaterialOutputModel":
- material_manager = self._application.getMaterialManager()
- material_group_list = None
-
- # Avoid crashing if there is no "guid" field in the metadata
- material_guid = material_data.get("guid")
- if material_guid:
- material_group_list = material_manager.getMaterialGroupListByGUID(material_guid)
-
- # This can happen if the connected machine has no material in one or more extruders (if GUID is empty), or the
- # material is unknown to Cura, so we should return an "empty" or "unknown" material model.
- if material_group_list is None:
- material_name = i18n_catalog.i18nc("@label:material", "Empty") if len(material_data.get("guid", "")) == 0 \
- else i18n_catalog.i18nc("@label:material", "Unknown")
-
- return MaterialOutputModel(guid = material_data.get("guid", ""),
- type = material_data.get("material", ""),
- color = material_data.get("color", ""),
- brand = material_data.get("brand", ""),
- name = material_data.get("name", material_name)
- )
-
- # Sort the material groups by "is_read_only = True" first, and then the name alphabetically.
- read_only_material_group_list = list(filter(lambda x: x.is_read_only, material_group_list))
- non_read_only_material_group_list = list(filter(lambda x: not x.is_read_only, material_group_list))
- material_group = None
- if read_only_material_group_list:
- read_only_material_group_list = sorted(read_only_material_group_list, key = lambda x: x.name)
- material_group = read_only_material_group_list[0]
- elif non_read_only_material_group_list:
- non_read_only_material_group_list = sorted(non_read_only_material_group_list, key = lambda x: x.name)
- material_group = non_read_only_material_group_list[0]
-
- if material_group:
- container = material_group.root_material_node.getContainer()
- color = container.getMetaDataEntry("color_code")
- brand = container.getMetaDataEntry("brand")
- material_type = container.getMetaDataEntry("material")
- name = container.getName()
- else:
- Logger.log("w",
- "Unable to find material with guid {guid}. Using data as provided by cluster".format(
- guid=material_data["guid"]))
- color = material_data["color"]
- brand = material_data["brand"]
- material_type = material_data["material"]
- name = i18n_catalog.i18nc("@label:material", "Empty") if material_data["material"] == "empty" \
- else i18n_catalog.i18nc("@label:material", "Unknown")
- return MaterialOutputModel(guid = material_data["guid"], type = material_type,
- brand = brand, color = color, name = name)
-
- def _updatePrinter(self, printer: PrinterOutputModel, data: Dict[str, Any]) -> None:
- # For some unknown reason the cluster wants UUID for everything, except for sending a job directly to a printer.
- # Then we suddenly need the unique name. So in order to not have to mess up all the other code, we save a mapping.
- self._printer_uuid_to_unique_name_mapping[data["uuid"]] = data["unique_name"]
-
- definitions = ContainerRegistry.getInstance().findDefinitionContainers(name = data["machine_variant"])
- if not definitions:
- Logger.log("w", "Unable to find definition for machine variant %s", data["machine_variant"])
- return
-
- machine_definition = definitions[0]
-
- printer.updateName(data["friendly_name"])
- printer.updateKey(data["uuid"])
- printer.updateType(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"])
- if not data["enabled"]:
- printer.updateState("disabled")
- else:
- printer.updateState(data["status"])
-
- for index in range(0, self._number_of_extruders):
- extruder = printer.extruders[index]
- try:
- extruder_data = data["configuration"][index]
- except IndexError:
- break
-
- extruder.updateHotendID(extruder_data.get("print_core_id", ""))
-
- material_data = extruder_data["material"]
- if extruder.activeMaterial is None or extruder.activeMaterial.guid != material_data["guid"]:
- material = self._createMaterialOutputModel(material_data)
- extruder.updateActiveMaterial(material)
-
- def _removeJob(self, job: UM3PrintJobOutputModel) -> bool:
- if job not in self._print_jobs:
- return False
-
- if job.assignedPrinter:
- job.assignedPrinter.updateActivePrintJob(None)
- job.stateChanged.disconnect(self._printJobStateChanged)
- self._print_jobs.remove(job)
-
- return True
-
- def _removePrinter(self, printer: PrinterOutputModel) -> None:
- self._printers.remove(printer)
- if self._active_printer == printer:
- self._active_printer = None
- self.activePrinterChanged.emit()
-
- ## Sync the material profiles in Cura with the printer.
- #
- # This gets called when connecting to a printer as well as when sending a
- # print.
- def sendMaterialProfiles(self) -> None:
- job = SendMaterialJob(device = self)
- job.run()
-
-def loadJsonFromReply(reply: QNetworkReply) -> Optional[List[Dict[str, Any]]]:
- try:
- result = json.loads(bytes(reply.readAll()).decode("utf-8"))
- except json.decoder.JSONDecodeError:
- Logger.logException("w", "Unable to decode JSON from reply.")
- return None
- return result
-
-
-def checkValidGetReply(reply: QNetworkReply) -> bool:
- status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
-
- if status_code != 200:
- Logger.log("w", "Got status code {status_code} while trying to get data".format(status_code=status_code))
- return False
- return True
-
-
-def findByKey(lst: List[Union[UM3PrintJobOutputModel, PrinterOutputModel]], key: str) -> Optional[UM3PrintJobOutputModel]:
- for item in lst:
- if item.key == key:
- return item
- return None
diff --git a/plugins/UM3NetworkPrinting/src/ClusterUM3PrinterOutputController.py b/plugins/UM3NetworkPrinting/src/ClusterUM3PrinterOutputController.py
deleted file mode 100644
index fc6798386a..0000000000
--- a/plugins/UM3NetworkPrinting/src/ClusterUM3PrinterOutputController.py
+++ /dev/null
@@ -1,20 +0,0 @@
-# Copyright (c) 2017 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-
-from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
-
-MYPY = False
-if MYPY:
- from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
-
-class ClusterUM3PrinterOutputController(PrinterOutputController):
- def __init__(self, output_device):
- super().__init__(output_device)
- self.can_pre_heat_bed = False
- self.can_pre_heat_hotends = False
- self.can_control_manually = False
- self.can_send_raw_gcode = False
-
- def setJobState(self, job: "PrintJobOutputModel", state: str):
- data = "{\"action\": \"%s\"}" % state
- self._output_device.put("print_jobs/%s/action" % job.key, data, on_finished=None)
diff --git a/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py b/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py
deleted file mode 100644
index ecc89b3948..0000000000
--- a/plugins/UM3NetworkPrinting/src/DiscoverUM3Action.py
+++ /dev/null
@@ -1,209 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-
-import os.path
-import time
-from typing import Optional, TYPE_CHECKING
-
-from PyQt5.QtCore import pyqtSignal, pyqtProperty, pyqtSlot, QObject
-
-from UM.PluginRegistry import PluginRegistry
-from UM.Logger import Logger
-from UM.i18n import i18nCatalog
-
-from cura.CuraApplication import CuraApplication
-from cura.MachineAction import MachineAction
-from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
-
-from .UM3OutputDevicePlugin import UM3OutputDevicePlugin
-
-if TYPE_CHECKING:
- from cura.PrinterOutputDevice import PrinterOutputDevice
-
-catalog = i18nCatalog("cura")
-
-
-class DiscoverUM3Action(MachineAction):
- discoveredDevicesChanged = pyqtSignal()
-
- def __init__(self) -> None:
- super().__init__("DiscoverUM3Action", catalog.i18nc("@action","Connect via Network"))
- self._qml_url = "resources/qml/DiscoverUM3Action.qml"
-
- self._network_plugin = None #type: Optional[UM3OutputDevicePlugin]
-
- self.__additional_components_view = None #type: Optional[QObject]
-
- CuraApplication.getInstance().engineCreatedSignal.connect(self._createAdditionalComponentsView)
-
- self._last_zero_conf_event_time = time.time() #type: float
-
- # Time to wait after a zero-conf service change before allowing a zeroconf reset
- self._zero_conf_change_grace_period = 0.25 #type: float
-
- @pyqtSlot()
- def startDiscovery(self):
- if not self._network_plugin:
- Logger.log("d", "Starting device discovery.")
- self._network_plugin = CuraApplication.getInstance().getOutputDeviceManager().getOutputDevicePlugin("UM3NetworkPrinting")
- self._network_plugin.discoveredDevicesChanged.connect(self._onDeviceDiscoveryChanged)
- self.discoveredDevicesChanged.emit()
-
- ## Re-filters the list of devices.
- @pyqtSlot()
- def reset(self):
- Logger.log("d", "Reset the list of found devices.")
- if self._network_plugin:
- self._network_plugin.resetLastManualDevice()
- self.discoveredDevicesChanged.emit()
-
- @pyqtSlot()
- def restartDiscovery(self):
- # Ensure that there is a bit of time after a printer has been discovered.
- # This is a work around for an issue with Qt 5.5.1 up to Qt 5.7 which can segfault if we do this too often.
- # It's most likely that the QML engine is still creating delegates, where the python side already deleted or
- # garbage collected the data.
- # Whatever the case, waiting a bit ensures that it doesn't crash.
- if time.time() - self._last_zero_conf_event_time > self._zero_conf_change_grace_period:
- if not self._network_plugin:
- self.startDiscovery()
- else:
- self._network_plugin.startDiscovery()
-
- @pyqtSlot(str, str)
- def removeManualDevice(self, key, address):
- if not self._network_plugin:
- return
-
- self._network_plugin.removeManualDevice(key, address)
-
- @pyqtSlot(str, str)
- def setManualDevice(self, key, address):
- if key != "":
- # This manual printer replaces a current manual printer
- self._network_plugin.removeManualDevice(key)
-
- if address != "":
- self._network_plugin.addManualDevice(address)
-
- def _onDeviceDiscoveryChanged(self, *args):
- self._last_zero_conf_event_time = time.time()
- self.discoveredDevicesChanged.emit()
-
- @pyqtProperty("QVariantList", notify = discoveredDevicesChanged)
- def foundDevices(self):
- if self._network_plugin:
-
- printers = list(self._network_plugin.getDiscoveredDevices().values())
- printers.sort(key = lambda k: k.name)
- return printers
- else:
- return []
-
- @pyqtSlot(str)
- def setGroupName(self, group_name: str) -> None:
- 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)
- # 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()
-
- # 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()
-
- @pyqtSlot(result = str)
- def getStoredKey(self) -> str:
- global_container_stack = CuraApplication.getInstance().getGlobalContainerStack()
- if global_container_stack:
- meta_data = global_container_stack.getMetaData()
- if "um_network_key" in meta_data:
- return global_container_stack.getMetaDataEntry("um_network_key")
-
- return ""
-
- @pyqtSlot(result = str)
- def getLastManualEntryKey(self) -> str:
- if self._network_plugin:
- return self._network_plugin.getLastManualDevice()
- return ""
-
- @pyqtSlot(str, result = bool)
- def existsKey(self, key: str) -> bool:
- return CuraApplication.getInstance().getMachineManager().existNetworkInstances(network_key = key)
-
- @pyqtSlot()
- def loadConfigurationFromPrinter(self) -> None:
- machine_manager = CuraApplication.getInstance().getMachineManager()
- hotend_ids = machine_manager.printerOutputDevices[0].hotendIds
- for index in range(len(hotend_ids)):
- machine_manager.printerOutputDevices[0].hotendIdChanged.emit(index, hotend_ids[index])
- material_ids = machine_manager.printerOutputDevices[0].materialIds
- for index in range(len(material_ids)):
- machine_manager.printerOutputDevices[0].materialIdChanged.emit(index, material_ids[index])
-
- def _createAdditionalComponentsView(self) -> None:
- Logger.log("d", "Creating additional ui components for UM3.")
-
- # Create networking dialog
- plugin_path = PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting")
- if not plugin_path:
- return
- path = os.path.join(plugin_path, "resources/qml/UM3InfoComponents.qml")
- self.__additional_components_view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self})
- if not self.__additional_components_view:
- Logger.log("w", "Could not create ui components for UM3.")
- return
-
- # Create extra components
- CuraApplication.getInstance().addAdditionalComponent("monitorButtons", self.__additional_components_view.findChild(QObject, "networkPrinterConnectButton"))
diff --git a/plugins/UM3NetworkPrinting/src/ExportFileJob.py b/plugins/UM3NetworkPrinting/src/ExportFileJob.py
new file mode 100644
index 0000000000..56d15bc835
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/ExportFileJob.py
@@ -0,0 +1,39 @@
+from typing import List, Optional
+
+from UM.FileHandler.FileHandler import FileHandler
+from UM.FileHandler.WriteFileJob import WriteFileJob
+from UM.Logger import Logger
+from UM.Scene.SceneNode import SceneNode
+from cura.CuraApplication import CuraApplication
+
+from .MeshFormatHandler import MeshFormatHandler
+
+
+## Job that exports the build plate to the correct file format for the target cluster.
+class ExportFileJob(WriteFileJob):
+
+ def __init__(self, file_handler: Optional[FileHandler], nodes: List[SceneNode], firmware_version: str) -> None:
+
+ self._mesh_format_handler = MeshFormatHandler(file_handler, firmware_version)
+ if not self._mesh_format_handler.is_valid:
+ Logger.log("e", "Missing file or mesh writer!")
+ return
+
+ super().__init__(self._mesh_format_handler.writer, self._mesh_format_handler.createStream(), nodes,
+ self._mesh_format_handler.file_mode)
+
+ # Determine the filename.
+ job_name = CuraApplication.getInstance().getPrintInformation().jobName
+ extension = self._mesh_format_handler.preferred_format.get("extension", "")
+ self.setFileName("{}.{}".format(job_name, extension))
+
+ ## Get the mime type of the selected export file type.
+ def getMimeType(self) -> str:
+ return self._mesh_format_handler.mime_type
+
+ ## Get the job result as bytes as that is what we need to upload to the cluster.
+ def getOutput(self) -> bytes:
+ output = self.getStream().getvalue()
+ if isinstance(output, str):
+ output = output.encode("utf-8")
+ return output
diff --git a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py b/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py
deleted file mode 100644
index 2c7c33d382..0000000000
--- a/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py
+++ /dev/null
@@ -1,644 +0,0 @@
-from typing import List, Optional
-
-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.Settings.ContainerManager import ContainerManager
-from cura.Settings.ExtruderManager import ExtruderManager
-
-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
-from PyQt5.QtWidgets import QMessageBox
-
-from .LegacyUM3PrinterOutputController import LegacyUM3PrinterOutputController
-
-from time import time
-
-import json
-import os
-
-
-i18n_catalog = i18nCatalog("cura")
-
-
-## This is the output device for the "Legacy" API of the UM3. All firmware before 4.0.1 uses this API.
-# Everything after that firmware uses the ClusterUM3Output.
-# The Legacy output device can only have one printer (whereas the cluster can have 0 to n).
-#
-# Authentication is done in a number of steps;
-# 1. Request an id / key pair by sending the application & user name. (state = authRequested)
-# 2. Machine sends this back and will display an approve / deny message on screen. (state = AuthReceived)
-# 3. OutputDevice will poll if the button was pressed.
-# 4. At this point the machine either has the state Authenticated or AuthenticationDenied.
-# 5. As a final step, we verify the authentication, as this forces the QT manager to setup the authenticator.
-class LegacyUM3OutputDevice(NetworkedPrinterOutputDevice):
- def __init__(self, device_id, address: str, properties, parent = None) -> None:
- super().__init__(device_id = device_id, address = address, properties = properties, connection_type = ConnectionType.NetworkConnection, parent = parent)
- self._api_prefix = "/api/v1/"
- self._number_of_extruders = 2
-
- self._authentication_id = None
- self._authentication_key = None
-
- self._authentication_counter = 0
- self._max_authentication_counter = 5 * 60 # Number of attempts before authentication timed out (5 min)
-
- self._authentication_timer = QTimer()
- self._authentication_timer.setInterval(1000) # TODO; Add preference for update interval
- self._authentication_timer.setSingleShot(False)
-
- self._authentication_timer.timeout.connect(self._onAuthenticationTimer)
-
- # The messages are created when connect is called the first time.
- # This ensures that the messages are only created for devices that actually want to connect.
- self._authentication_requested_message = None
- self._authentication_failed_message = None
- self._authentication_succeeded_message = None
- self._not_authenticated_message = None
-
- self.authenticationStateChanged.connect(self._onAuthenticationStateChanged)
-
- self.setPriority(3) # Make sure the output device gets selected above local file output
- self.setName(self._id)
- self.setShortDescription(i18n_catalog.i18nc("@action:button Preceded by 'Ready to'.", "Print over network"))
- self.setDescription(i18n_catalog.i18nc("@properties:tooltip", "Print over network"))
-
- self.setIconName("print")
-
- if PluginRegistry.getInstance() is not None:
- self._monitor_view_qml_path = os.path.join(
- PluginRegistry.getInstance().getPluginPath("UM3NetworkPrinting"),
- "resources", "qml", "MonitorStage.qml"
- )
-
- self._output_controller = LegacyUM3PrinterOutputController(self)
-
- def _onAuthenticationStateChanged(self):
- # We only accept commands if we are authenticated.
- self._setAcceptsCommands(self._authentication_state == AuthState.Authenticated)
-
- if self._authentication_state == AuthState.Authenticated:
- self.setConnectionText(i18n_catalog.i18nc("@info:status", "Connected over the network."))
- elif self._authentication_state == AuthState.AuthenticationRequested:
- self.setConnectionText(i18n_catalog.i18nc("@info:status",
- "Connected over the network. Please approve the access request on the printer."))
- elif self._authentication_state == AuthState.AuthenticationDenied:
- self.setConnectionText(i18n_catalog.i18nc("@info:status", "Connected over the network. No access to control the printer."))
-
-
- def _setupMessages(self):
- self._authentication_requested_message = Message(i18n_catalog.i18nc("@info:status",
- "Access to the printer requested. Please approve the request on the printer"),
- lifetime=0, dismissable=False, progress=0,
- title=i18n_catalog.i18nc("@info:title",
- "Authentication status"))
-
- self._authentication_failed_message = Message("", title=i18n_catalog.i18nc("@info:title", "Authentication Status"))
- self._authentication_failed_message.addAction("Retry", i18n_catalog.i18nc("@action:button", "Retry"), None,
- i18n_catalog.i18nc("@info:tooltip", "Re-send the access request"))
- self._authentication_failed_message.actionTriggered.connect(self._messageCallback)
- self._authentication_succeeded_message = Message(
- i18n_catalog.i18nc("@info:status", "Access to the printer accepted"),
- title=i18n_catalog.i18nc("@info:title", "Authentication Status"))
-
- self._not_authenticated_message = Message(
- i18n_catalog.i18nc("@info:status", "No access to print with this printer. Unable to send print job."),
- title=i18n_catalog.i18nc("@info:title", "Authentication Status"))
- self._not_authenticated_message.addAction("Request", i18n_catalog.i18nc("@action:button", "Request Access"),
- None, i18n_catalog.i18nc("@info:tooltip",
- "Send access request to the printer"))
- self._not_authenticated_message.actionTriggered.connect(self._messageCallback)
-
- def _messageCallback(self, message_id=None, action_id="Retry"):
- if action_id == "Request" or action_id == "Retry":
- if self._authentication_failed_message:
- self._authentication_failed_message.hide()
- if self._not_authenticated_message:
- self._not_authenticated_message.hide()
-
- self._requestAuthentication()
-
- def connect(self):
- super().connect()
- self._setupMessages()
- global_container = CuraApplication.getInstance().getGlobalContainerStack()
- if global_container:
- self._authentication_id = global_container.getMetaDataEntry("network_authentication_id", None)
- self._authentication_key = global_container.getMetaDataEntry("network_authentication_key", None)
-
- def close(self):
- super().close()
- if self._authentication_requested_message:
- self._authentication_requested_message.hide()
- if self._authentication_failed_message:
- self._authentication_failed_message.hide()
- if self._authentication_succeeded_message:
- self._authentication_succeeded_message.hide()
- self._sending_gcode = False
- self._compressing_gcode = False
- self._authentication_timer.stop()
-
- ## Send all material profiles to the printer.
- def _sendMaterialProfiles(self):
- Logger.log("i", "Sending material profiles to printer")
-
- # TODO: Might want to move this to a job...
- for container in ContainerRegistry.getInstance().findInstanceContainers(type="material"):
- try:
- xml_data = container.serialize()
- if xml_data == "" or xml_data is None:
- continue
-
- names = ContainerManager.getInstance().getLinkedMaterials(container.getId())
- if names:
- # There are other materials that share this GUID.
- if not container.isReadOnly():
- continue # If it's not readonly, it's created by user, so skip it.
-
- file_name = "none.xml"
-
- self.postForm("materials", "form-data; name=\"file\";filename=\"%s\"" % file_name, xml_data.encode(), on_finished=None)
-
- except NotImplementedError:
- # If the material container is not the most "generic" one it can't be serialized an will raise a
- # NotImplementedError. We can simply ignore these.
- pass
-
- def requestWrite(self, nodes: List[SceneNode], file_name: Optional[str] = None, limit_mimetypes: bool = False, file_handler: Optional[FileHandler] = None, **kwargs: str) -> None:
- if not self.activePrinter:
- # No active printer. Unable to write
- return
-
- if self.activePrinter.state not in ["idle", ""]:
- # Printer is not able to accept commands.
- return
-
- if self._authentication_state != AuthState.Authenticated:
- # Not authenticated, so unable to send job.
- return
-
- self.writeStarted.emit(self)
-
- gcode_dict = getattr(CuraApplication.getInstance().getController().getScene(), "gcode_dict", [])
- active_build_plate_id = CuraApplication.getInstance().getMultiBuildPlateModel().activeBuildPlate
- gcode_list = gcode_dict[active_build_plate_id]
-
- if not gcode_list:
- # Unable to find g-code. Nothing to send
- return
-
- self._gcode = gcode_list
-
- errors = self._checkForErrors()
- if errors:
- text = i18n_catalog.i18nc("@label", "Unable to start a new print job.")
- informative_text = i18n_catalog.i18nc("@label",
- "There is an issue with the configuration of your Ultimaker, which makes it impossible to start the print. "
- "Please resolve this issues before continuing.")
- detailed_text = ""
- for error in errors:
- detailed_text += error + "\n"
-
- CuraApplication.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Mismatched configuration"),
- text,
- informative_text,
- detailed_text,
- buttons=QMessageBox.Ok,
- icon=QMessageBox.Critical,
- callback = self._messageBoxCallback
- )
- return # Don't continue; Errors must block sending the job to the printer.
-
- # There might be multiple things wrong with the configuration. Check these before starting.
- warnings = self._checkForWarnings()
-
- if warnings:
- text = i18n_catalog.i18nc("@label", "Are you sure you wish to print with the selected configuration?")
- informative_text = i18n_catalog.i18nc("@label",
- "There is a mismatch between the configuration or calibration of the printer and Cura. "
- "For the best result, always slice for the PrintCores and materials that are inserted in your printer.")
- detailed_text = ""
- for warning in warnings:
- detailed_text += warning + "\n"
-
- CuraApplication.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Mismatched configuration"),
- text,
- informative_text,
- detailed_text,
- buttons=QMessageBox.Yes + QMessageBox.No,
- icon=QMessageBox.Question,
- callback=self._messageBoxCallback
- )
- return
-
- # No warnings or errors, so we're good to go.
- self._startPrint()
-
- # Notify the UI that a switch to the print monitor should happen
- CuraApplication.getInstance().getController().setActiveStage("MonitorStage")
-
- def _startPrint(self):
- Logger.log("i", "Sending print job to printer.")
- if self._sending_gcode:
- self._error_message = Message(
- i18n_catalog.i18nc("@info:status",
- "Sending new jobs (temporarily) blocked, still sending the previous print job."))
- self._error_message.show()
- return
-
- self._sending_gcode = True
-
- self._send_gcode_start = time()
- self._progress_message = Message(i18n_catalog.i18nc("@info:status", "Sending data to printer"), 0, False, -1,
- i18n_catalog.i18nc("@info:title", "Sending Data"))
- self._progress_message.addAction("Abort", i18n_catalog.i18nc("@action:button", "Cancel"), None, "")
- self._progress_message.actionTriggered.connect(self._progressMessageActionTriggered)
- self._progress_message.show()
-
- compressed_gcode = self._compressGCode()
- if compressed_gcode is None:
- # Abort was called.
- return
-
- file_name = "%s.gcode.gz" % CuraApplication.getInstance().getPrintInformation().jobName
- self.postForm("print_job", "form-data; name=\"file\";filename=\"%s\"" % file_name, compressed_gcode,
- on_finished=self._onPostPrintJobFinished)
-
- return
-
- def _progressMessageActionTriggered(self, message_id=None, action_id=None):
- if action_id == "Abort":
- Logger.log("d", "User aborted sending print to remote.")
- self._progress_message.hide()
- self._compressing_gcode = False
- self._sending_gcode = False
- CuraApplication.getInstance().getController().setActiveStage("PrepareStage")
-
- def _onPostPrintJobFinished(self, reply):
- self._progress_message.hide()
- self._sending_gcode = False
-
- def _onUploadPrintJobProgress(self, bytes_sent, bytes_total):
- if bytes_total > 0:
- new_progress = bytes_sent / bytes_total * 100
- # Treat upload progress as response. Uploading can take more than 10 seconds, so if we don't, we can get
- # timeout responses if this happens.
- self._last_response_time = time()
- if new_progress > self._progress_message.getProgress():
- self._progress_message.show() # Ensure that the message is visible.
- self._progress_message.setProgress(bytes_sent / bytes_total * 100)
- else:
- self._progress_message.setProgress(0)
-
- self._progress_message.hide()
-
- def _messageBoxCallback(self, button):
- def delayedCallback():
- if button == QMessageBox.Yes:
- self._startPrint()
- else:
- CuraApplication.getInstance().getController().setActiveStage("PrepareStage")
- # For some unknown reason Cura on OSX will hang if we do the call back code
- # immediately without first returning and leaving QML's event system.
-
- QTimer.singleShot(100, delayedCallback)
-
- def _checkForErrors(self):
- errors = []
- print_information = CuraApplication.getInstance().getPrintInformation()
- if not print_information.materialLengths:
- Logger.log("w", "There is no material length information. Unable to check for errors.")
- return errors
-
- for index, extruder in enumerate(self.activePrinter.extruders):
- # Due to airflow issues, both slots must be loaded, regardless if they are actually used or not.
- if extruder.hotendID == "":
- # No Printcore loaded.
- errors.append(i18n_catalog.i18nc("@info:status", "No Printcore loaded in slot {slot_number}".format(slot_number=index + 1)))
-
- if index < len(print_information.materialLengths) and print_information.materialLengths[index] != 0:
- # The extruder is by this print.
- if extruder.activeMaterial is None:
- # No active material
- errors.append(i18n_catalog.i18nc("@info:status", "No material loaded in slot {slot_number}".format(slot_number=index + 1)))
- return errors
-
- def _checkForWarnings(self):
- warnings = []
- print_information = CuraApplication.getInstance().getPrintInformation()
-
- if not print_information.materialLengths:
- Logger.log("w", "There is no material length information. Unable to check for warnings.")
- return warnings
-
- extruder_manager = ExtruderManager.getInstance()
-
- for index, extruder in enumerate(self.activePrinter.extruders):
- if index < len(print_information.materialLengths) and print_information.materialLengths[index] != 0:
- # The extruder is by this print.
-
- # TODO: material length check
-
- # Check if the right Printcore is active.
- variant = extruder_manager.getExtruderStack(index).findContainer({"type": "variant"})
- if variant:
- if variant.getName() != extruder.hotendID:
- warnings.append(i18n_catalog.i18nc("@label", "Different PrintCore (Cura: {cura_printcore_name}, Printer: {remote_printcore_name}) selected for extruder {extruder_id}".format(cura_printcore_name = variant.getName(), remote_printcore_name = extruder.hotendID, extruder_id = index + 1)))
- else:
- Logger.log("w", "Unable to find variant.")
-
- # Check if the right material is loaded.
- local_material = extruder_manager.getExtruderStack(index).findContainer({"type": "material"})
- if local_material:
- if extruder.activeMaterial.guid != local_material.getMetaDataEntry("GUID"):
- Logger.log("w", "Extruder %s has a different material (%s) as Cura (%s)", index + 1, extruder.activeMaterial.guid, local_material.getMetaDataEntry("GUID"))
- warnings.append(i18n_catalog.i18nc("@label", "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}").format(local_material.getName(), extruder.activeMaterial.name, index + 1))
- else:
- Logger.log("w", "Unable to find material.")
-
- return warnings
-
- def _update(self):
- if not super()._update():
- return
- if self._authentication_state == AuthState.NotAuthenticated:
- if self._authentication_id is None and self._authentication_key is None:
- # This machine doesn't have any authentication, so request it.
- self._requestAuthentication()
- elif self._authentication_id is not None and self._authentication_key is not None:
- # We have authentication info, but we haven't checked it out yet. Do so now.
- self._verifyAuthentication()
- elif self._authentication_state == AuthState.AuthenticationReceived:
- # We have an authentication, but it's not confirmed yet.
- self._checkAuthentication()
-
- # We don't need authentication for requesting info, so we can go right ahead with requesting this.
- self.get("printer", on_finished=self._onGetPrinterDataFinished)
- self.get("print_job", on_finished=self._onGetPrintJobFinished)
-
- def _resetAuthenticationRequestedMessage(self):
- if self._authentication_requested_message:
- self._authentication_requested_message.hide()
- self._authentication_timer.stop()
- self._authentication_counter = 0
-
- def _onAuthenticationTimer(self):
- self._authentication_counter += 1
- self._authentication_requested_message.setProgress(
- self._authentication_counter / self._max_authentication_counter * 100)
- if self._authentication_counter > self._max_authentication_counter:
- self._authentication_timer.stop()
- Logger.log("i", "Authentication timer ended. Setting authentication to denied for printer: %s" % self._id)
- self.setAuthenticationState(AuthState.AuthenticationDenied)
- self._resetAuthenticationRequestedMessage()
- self._authentication_failed_message.show()
-
- def _verifyAuthentication(self):
- Logger.log("d", "Attempting to verify authentication")
- # This will ensure that the "_onAuthenticationRequired" is triggered, which will setup the authenticator.
- self.get("auth/verify", on_finished=self._onVerifyAuthenticationCompleted)
-
- def _onVerifyAuthenticationCompleted(self, reply):
- status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
- if status_code == 401:
- # Something went wrong; We somehow tried to verify authentication without having one.
- Logger.log("d", "Attempted to verify auth without having one.")
- self._authentication_id = None
- self._authentication_key = None
- self.setAuthenticationState(AuthState.NotAuthenticated)
- elif status_code == 403 and self._authentication_state != AuthState.Authenticated:
- # If we were already authenticated, we probably got an older message back all of the sudden. Drop that.
- Logger.log("d",
- "While trying to verify the authentication state, we got a forbidden response. Our own auth state was %s. ",
- self._authentication_state)
- self.setAuthenticationState(AuthState.AuthenticationDenied)
- self._authentication_failed_message.show()
- elif status_code == 200:
- self.setAuthenticationState(AuthState.Authenticated)
-
- def _checkAuthentication(self):
- Logger.log("d", "Checking if authentication is correct for id %s and key %s", self._authentication_id, self._getSafeAuthKey())
- self.get("auth/check/" + str(self._authentication_id), on_finished=self._onCheckAuthenticationFinished)
-
- def _onCheckAuthenticationFinished(self, reply):
- if str(self._authentication_id) not in reply.url().toString():
- Logger.log("w", "Got an old id response.")
- # Got response for old authentication ID.
- return
- try:
- data = json.loads(bytes(reply.readAll()).decode("utf-8"))
- except json.decoder.JSONDecodeError:
- Logger.log("w", "Received an invalid authentication check from printer: Not valid JSON.")
- return
-
- if data.get("message", "") == "authorized":
- Logger.log("i", "Authentication was approved")
- self.setAuthenticationState(AuthState.Authenticated)
- self._saveAuthentication()
-
- # Double check that everything went well.
- self._verifyAuthentication()
-
- # Notify the user.
- self._resetAuthenticationRequestedMessage()
- self._authentication_succeeded_message.show()
- elif data.get("message", "") == "unauthorized":
- Logger.log("i", "Authentication was denied.")
- self.setAuthenticationState(AuthState.AuthenticationDenied)
- self._authentication_failed_message.show()
-
- def _saveAuthentication(self) -> None:
- global_container_stack = CuraApplication.getInstance().getGlobalContainerStack()
- if self._authentication_key is None:
- Logger.log("e", "Authentication key is None, nothing to save.")
- return
- if self._authentication_id is None:
- Logger.log("e", "Authentication id is None, nothing to save.")
- return
- if global_container_stack:
- global_container_stack.setMetaDataEntry("network_authentication_key", self._authentication_key)
-
- global_container_stack.setMetaDataEntry("network_authentication_id", self._authentication_id)
-
- # Force save so we are sure the data is not lost.
- CuraApplication.getInstance().saveStack(global_container_stack)
- Logger.log("i", "Authentication succeeded for id %s and key %s", self._authentication_id,
- self._getSafeAuthKey())
- else:
- Logger.log("e", "Unable to save authentication for id %s and key %s", self._authentication_id,
- self._getSafeAuthKey())
-
- def _onRequestAuthenticationFinished(self, reply):
- try:
- data = json.loads(bytes(reply.readAll()).decode("utf-8"))
- except json.decoder.JSONDecodeError:
- Logger.log("w", "Received an invalid authentication request reply from printer: Not valid JSON.")
- self.setAuthenticationState(AuthState.NotAuthenticated)
- return
-
- self.setAuthenticationState(AuthState.AuthenticationReceived)
- self._authentication_id = data["id"]
- self._authentication_key = data["key"]
- Logger.log("i", "Got a new authentication ID (%s) and KEY (%s). Waiting for authorization.",
- self._authentication_id, self._getSafeAuthKey())
-
- def _requestAuthentication(self):
- self._authentication_requested_message.show()
- self._authentication_timer.start()
-
- # Reset any previous authentication info. If this isn't done, the "Retry" action on the failed message might
- # give issues.
- self._authentication_key = None
- self._authentication_id = None
-
- self.post("auth/request",
- json.dumps({"application": "Cura-" + CuraApplication.getInstance().getVersion(),
- "user": self._getUserName()}),
- on_finished=self._onRequestAuthenticationFinished)
-
- self.setAuthenticationState(AuthState.AuthenticationRequested)
-
- def _onAuthenticationRequired(self, reply, authenticator):
- if self._authentication_id is not None and self._authentication_key is not None:
- Logger.log("d",
- "Authentication was required for printer: %s. Setting up authenticator with ID %s and key %s",
- self._id, self._authentication_id, self._getSafeAuthKey())
- authenticator.setUser(self._authentication_id)
- authenticator.setPassword(self._authentication_key)
- else:
- Logger.log("d", "No authentication is available to use for %s, but we did got a request for it.", self._id)
-
- def _onGetPrintJobFinished(self, reply):
- status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
-
- if not self._printers:
- return # Ignore the data for now, we don't have info about a printer yet.
- printer = self._printers[0]
-
- if status_code == 200:
- try:
- result = json.loads(bytes(reply.readAll()).decode("utf-8"))
- except json.decoder.JSONDecodeError:
- Logger.log("w", "Received an invalid print job state message: Not valid JSON.")
- return
- if printer.activePrintJob is None:
- print_job = PrintJobOutputModel(output_controller=self._output_controller)
- printer.updateActivePrintJob(print_job)
- else:
- print_job = printer.activePrintJob
- print_job.updateState(result["state"])
- print_job.updateTimeElapsed(result["time_elapsed"])
- print_job.updateTimeTotal(result["time_total"])
- print_job.updateName(result["name"])
- elif status_code == 404:
- # No job found, so delete the active print job (if any!)
- printer.updateActivePrintJob(None)
- else:
- Logger.log("w",
- "Got status code {status_code} while trying to get printer data".format(status_code=status_code))
-
- def materialHotendChangedMessage(self, callback):
- CuraApplication.getInstance().messageBox(i18n_catalog.i18nc("@window:title", "Sync with your printer"),
- i18n_catalog.i18nc("@label",
- "Would you like to use your current printer configuration in Cura?"),
- i18n_catalog.i18nc("@label",
- "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer."),
- buttons=QMessageBox.Yes + QMessageBox.No,
- icon=QMessageBox.Question,
- callback=callback
- )
-
- def _onGetPrinterDataFinished(self, reply):
- status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
- if status_code == 200:
- try:
- result = json.loads(bytes(reply.readAll()).decode("utf-8"))
- except json.decoder.JSONDecodeError:
- Logger.log("w", "Received an invalid printer state message: Not valid JSON.")
- return
-
- if not self._printers:
- # Quickest way to get the firmware version is to grab it from the zeroconf.
- firmware_version = self._properties.get(b"firmware_version", b"").decode("utf-8")
- self._printers = [PrinterOutputModel(output_controller=self._output_controller, number_of_extruders=self._number_of_extruders, firmware_version=firmware_version)]
- self._printers[0].setCameraUrl(QUrl("http://" + self._address + ":8080/?action=stream"))
- for extruder in self._printers[0].extruders:
- extruder.activeMaterialChanged.connect(self.materialIdChanged)
- extruder.hotendIDChanged.connect(self.hotendIdChanged)
- self.printersChanged.emit()
-
- # LegacyUM3 always has a single printer.
- printer = self._printers[0]
- printer.updateBedTemperature(result["bed"]["temperature"]["current"])
- printer.updateTargetBedTemperature(result["bed"]["temperature"]["target"])
- printer.updateState(result["status"])
-
- try:
- # If we're still handling the request, we should ignore remote for a bit.
- if not printer.getController().isPreheatRequestInProgress():
- printer.updateIsPreheating(result["bed"]["pre_heat"]["active"])
- except KeyError:
- # Older firmwares don't support preheating, so we need to fake it.
- pass
-
- head_position = result["heads"][0]["position"]
- printer.updateHeadPosition(head_position["x"], head_position["y"], head_position["z"])
-
- for index in range(0, self._number_of_extruders):
- temperatures = result["heads"][0]["extruders"][index]["hotend"]["temperature"]
- extruder = printer.extruders[index]
- extruder.updateTargetHotendTemperature(temperatures["target"])
- extruder.updateHotendTemperature(temperatures["current"])
-
- material_guid = result["heads"][0]["extruders"][index]["active_material"]["guid"]
-
- if extruder.activeMaterial is None or extruder.activeMaterial.guid != material_guid:
- # Find matching material (as we need to set brand, type & color)
- containers = ContainerRegistry.getInstance().findInstanceContainers(type="material",
- GUID=material_guid)
- if containers:
- color = containers[0].getMetaDataEntry("color_code")
- brand = containers[0].getMetaDataEntry("brand")
- material_type = containers[0].getMetaDataEntry("material")
- name = containers[0].getName()
- else:
- # Unknown material.
- color = "#00000000"
- brand = "Unknown"
- material_type = "Unknown"
- name = "Unknown"
- material = MaterialOutputModel(guid=material_guid, type=material_type,
- brand=brand, color=color, name = name)
- extruder.updateActiveMaterial(material)
-
- try:
- hotend_id = result["heads"][0]["extruders"][index]["hotend"]["id"]
- except KeyError:
- hotend_id = ""
- printer.extruders[index].updateHotendID(hotend_id)
-
- else:
- Logger.log("w",
- "Got status code {status_code} while trying to get printer data".format(status_code = status_code))
-
- ## Convenience function to "blur" out all but the last 5 characters of the auth key.
- # This can be used to debug print the key, without it compromising the security.
- def _getSafeAuthKey(self):
- if self._authentication_key is not None:
- result = self._authentication_key[-5:]
- result = "********" + result
- return result
-
- return self._authentication_key
diff --git a/plugins/UM3NetworkPrinting/src/LegacyUM3PrinterOutputController.py b/plugins/UM3NetworkPrinting/src/LegacyUM3PrinterOutputController.py
deleted file mode 100644
index 63167b4ffb..0000000000
--- a/plugins/UM3NetworkPrinting/src/LegacyUM3PrinterOutputController.py
+++ /dev/null
@@ -1,96 +0,0 @@
-# Copyright (c) 2019 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-
-from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
-from PyQt5.QtCore import QTimer
-from UM.Version import Version
-
-MYPY = False
-if MYPY:
- from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
- from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
-
-
-class LegacyUM3PrinterOutputController(PrinterOutputController):
- def __init__(self, output_device):
- super().__init__(output_device)
- self._preheat_bed_timer = QTimer()
- self._preheat_bed_timer.setSingleShot(True)
- self._preheat_bed_timer.timeout.connect(self._onPreheatBedTimerFinished)
- self._preheat_printer = None
-
- self.can_control_manually = False
- self.can_send_raw_gcode = False
-
- # Are we still waiting for a response about preheat?
- # We need this so we can already update buttons, so it feels more snappy.
- self._preheat_request_in_progress = False
-
- def isPreheatRequestInProgress(self):
- return self._preheat_request_in_progress
-
- def setJobState(self, job: "PrintJobOutputModel", state: str):
- data = "{\"target\": \"%s\"}" % state
- self._output_device.put("print_job/state", data, on_finished=None)
-
- def setTargetBedTemperature(self, printer: "PrinterOutputModel", temperature: float):
- data = str(temperature)
- self._output_device.put("printer/bed/temperature/target", data, on_finished = self._onPutBedTemperatureCompleted)
-
- def _onPutBedTemperatureCompleted(self, reply):
- if Version(self._preheat_printer.firmwareVersion) < Version("3.5.92"):
- # If it was handling a preheat, it isn't anymore.
- self._preheat_request_in_progress = False
-
- def _onPutPreheatBedCompleted(self, reply):
- self._preheat_request_in_progress = False
-
- def moveHead(self, printer: "PrinterOutputModel", x, y, z, speed):
- head_pos = printer._head_position
- new_x = head_pos.x + x
- new_y = head_pos.y + y
- new_z = head_pos.z + z
- data = "{\n\"x\":%s,\n\"y\":%s,\n\"z\":%s\n}" %(new_x, new_y, new_z)
- self._output_device.put("printer/heads/0/position", data, on_finished=None)
-
- def homeBed(self, printer):
- self._output_device.put("printer/heads/0/position/z", "0", on_finished=None)
-
- def _onPreheatBedTimerFinished(self):
- self.setTargetBedTemperature(self._preheat_printer, 0)
- self._preheat_printer.updateIsPreheating(False)
- self._preheat_request_in_progress = True
-
- def cancelPreheatBed(self, printer: "PrinterOutputModel"):
- self.preheatBed(printer, temperature=0, duration=0)
- self._preheat_bed_timer.stop()
- printer.updateIsPreheating(False)
-
- def preheatBed(self, printer: "PrinterOutputModel", temperature, duration):
- try:
- temperature = round(temperature) # The API doesn't allow floating point.
- duration = round(duration)
- except ValueError:
- return # Got invalid values, can't pre-heat.
-
- if duration > 0:
- data = """{"temperature": "%i", "timeout": "%i"}""" % (temperature, duration)
- else:
- data = """{"temperature": "%i"}""" % temperature
-
- # Real bed pre-heating support is implemented from 3.5.92 and up.
-
- if Version(printer.firmwareVersion) < Version("3.5.92"):
- # No firmware-side duration support then, so just set target bed temp and set a timer.
- self.setTargetBedTemperature(printer, temperature=temperature)
- self._preheat_bed_timer.setInterval(duration * 1000)
- self._preheat_bed_timer.start()
- self._preheat_printer = printer
- printer.updateIsPreheating(True)
- return
-
- self._output_device.put("printer/bed/pre_heat", data, on_finished = self._onPutPreheatBedCompleted)
- printer.updateIsPreheating(True)
- self._preheat_request_in_progress = True
-
-
diff --git a/plugins/UM3NetworkPrinting/src/MeshFormatHandler.py b/plugins/UM3NetworkPrinting/src/MeshFormatHandler.py
index c3cd82a86d..9927bf744e 100644
--- a/plugins/UM3NetworkPrinting/src/MeshFormatHandler.py
+++ b/plugins/UM3NetworkPrinting/src/MeshFormatHandler.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 io
from typing import Optional, Dict, Union, List, cast
@@ -32,7 +32,7 @@ class MeshFormatHandler:
# \return A dict with the file format details, with the following keys:
# {id: str, extension: str, description: str, mime_type: str, mode: int, hide_in_file_dialog: bool}
@property
- def preferred_format(self) -> Optional[Dict[str, Union[str, int, bool]]]:
+ def preferred_format(self) -> Dict[str, Union[str, int, bool]]:
return self._preferred_format
## Gets the file writer for the given file handler and mime type.
@@ -90,6 +90,7 @@ class MeshFormatHandler:
machine_file_formats = global_stack.getMetaDataEntry("file_formats").split(";")
machine_file_formats = [file_type.strip() for file_type in machine_file_formats]
+
# Exception for UM3 firmware version >=4.4: UFP is now supported and should be the preferred file format.
if "application/x-ufp" not in machine_file_formats and Version(firmware_version) >= Version("4.4"):
machine_file_formats = ["application/x-ufp"] + machine_file_formats
diff --git a/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py b/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py
new file mode 100644
index 0000000000..4f2f7a71a2
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py
@@ -0,0 +1,41 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+import os
+
+from PyQt5.QtCore import QUrl
+from PyQt5.QtGui import QDesktopServices
+
+from UM import i18nCatalog
+from UM.Message import Message
+from cura.CuraApplication import CuraApplication
+
+
+I18N_CATALOG = i18nCatalog("cura")
+
+
+class CloudFlowMessage(Message):
+
+ def __init__(self, address: str) -> None:
+
+ image_path = os.path.join(
+ CuraApplication.getInstance().getPluginRegistry().getPluginPath("UM3NetworkPrinting") or "",
+ "resources", "svg", "cloud-flow-start.svg"
+ )
+
+ super().__init__(
+ text=I18N_CATALOG.i18nc("@info:status",
+ "Send and monitor print jobs from anywhere using your Ultimaker account."),
+ lifetime=0,
+ dismissable=True,
+ option_state=False,
+ image_source=image_path,
+ image_caption=I18N_CATALOG.i18nc("@info:status Ultimaker Cloud should not be translated.",
+ "Connect to Ultimaker Cloud"),
+ )
+ self._address = address
+ self.addAction("", I18N_CATALOG.i18nc("@action", "Get started"), "", "")
+ self.actionTriggered.connect(self._onCloudFlowStarted)
+
+ def _onCloudFlowStarted(self, messageId: str, actionId: str) -> None:
+ QDesktopServices.openUrl(QUrl("http://{}/cloud_connect".format(self._address)))
+ self.hide()
diff --git a/plugins/UM3NetworkPrinting/src/Messages/LegacyDeviceNoLongerSupportedMessage.py b/plugins/UM3NetworkPrinting/src/Messages/LegacyDeviceNoLongerSupportedMessage.py
new file mode 100644
index 0000000000..f4132dbcbc
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Messages/LegacyDeviceNoLongerSupportedMessage.py
@@ -0,0 +1,33 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from UM import i18nCatalog
+from UM.Message import Message
+
+
+I18N_CATALOG = i18nCatalog("cura")
+
+
+## Message shown when trying to connect to a legacy printer device.
+class LegacyDeviceNoLongerSupportedMessage(Message):
+
+ # Singleton used to prevent duplicate messages of this type at the same time.
+ __is_visible = False
+
+ def __init__(self) -> None:
+ super().__init__(
+ text = I18N_CATALOG.i18nc("@info:status", "You are attempting to connect to a printer that is not "
+ "running Ultimaker Connect. Please update the printer to the "
+ "latest firmware."),
+ title = I18N_CATALOG.i18nc("@info:title", "Update your printer"),
+ lifetime = 10
+ )
+
+ def show(self) -> None:
+ if LegacyDeviceNoLongerSupportedMessage.__is_visible:
+ return
+ super().show()
+ LegacyDeviceNoLongerSupportedMessage.__is_visible = True
+
+ def hide(self, send_signal = True) -> None:
+ super().hide(send_signal)
+ LegacyDeviceNoLongerSupportedMessage.__is_visible = False
diff --git a/plugins/UM3NetworkPrinting/src/Messages/MaterialSyncMessage.py b/plugins/UM3NetworkPrinting/src/Messages/MaterialSyncMessage.py
new file mode 100644
index 0000000000..e021b2ae99
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Messages/MaterialSyncMessage.py
@@ -0,0 +1,39 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from typing import TYPE_CHECKING
+
+from UM import i18nCatalog
+from UM.Message import Message
+
+
+if TYPE_CHECKING:
+ from ..UltimakerNetworkedPrinterOutputDevice import UltimakerNetworkedPrinterOutputDevice
+
+
+I18N_CATALOG = i18nCatalog("cura")
+
+
+## Message shown when sending material files to cluster host.
+class MaterialSyncMessage(Message):
+
+ # Singleton used to prevent duplicate messages of this type at the same time.
+ __is_visible = False
+
+ def __init__(self, device: "UltimakerNetworkedPrinterOutputDevice") -> None:
+ super().__init__(
+ text = I18N_CATALOG.i18nc("@info:status", "Cura has detected material profiles that were not yet installed "
+ "on the host printer of group {0}.", device.name),
+ title = I18N_CATALOG.i18nc("@info:title", "Sending materials to printer"),
+ lifetime = 10,
+ dismissable = True
+ )
+
+ def show(self) -> None:
+ if MaterialSyncMessage.__is_visible:
+ return
+ super().show()
+ MaterialSyncMessage.__is_visible = True
+
+ def hide(self, send_signal = True) -> None:
+ super().hide(send_signal)
+ MaterialSyncMessage.__is_visible = False
diff --git a/plugins/UM3NetworkPrinting/src/Messages/NotClusterHostMessage.py b/plugins/UM3NetworkPrinting/src/Messages/NotClusterHostMessage.py
new file mode 100644
index 0000000000..77d7995fc7
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Messages/NotClusterHostMessage.py
@@ -0,0 +1,50 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from typing import TYPE_CHECKING
+
+from PyQt5.QtCore import QUrl
+from PyQt5.QtGui import QDesktopServices
+
+from UM import i18nCatalog
+from UM.Message import Message
+
+
+if TYPE_CHECKING:
+ from ..UltimakerNetworkedPrinterOutputDevice import UltimakerNetworkedPrinterOutputDevice
+
+
+I18N_CATALOG = i18nCatalog("cura")
+
+
+## Message shown when trying to connect to a printer that is not a host.
+class NotClusterHostMessage(Message):
+
+ # Singleton used to prevent duplicate messages of this type at the same time.
+ __is_visible = False
+
+ def __init__(self, device: "UltimakerNetworkedPrinterOutputDevice") -> None:
+ super().__init__(
+ text = I18N_CATALOG.i18nc("@info:status", "You are attempting to connect to {0} but it is not "
+ "the host of a group. You can visit the web page to configure "
+ "it as a group host.", device.name),
+ title = I18N_CATALOG.i18nc("@info:title", "Not a group host"),
+ lifetime = 0,
+ dismissable = True
+ )
+ self._address = device.address
+ self.addAction("", I18N_CATALOG.i18nc("@action", "Configure group"), "", "")
+ self.actionTriggered.connect(self._onConfigureClicked)
+
+ def show(self) -> None:
+ if NotClusterHostMessage.__is_visible:
+ return
+ super().show()
+ NotClusterHostMessage.__is_visible = True
+
+ def hide(self, send_signal = True) -> None:
+ super().hide(send_signal)
+ NotClusterHostMessage.__is_visible = False
+
+ def _onConfigureClicked(self, messageId: str, actionId: str) -> None:
+ QDesktopServices.openUrl(QUrl("http://{}/print_jobs".format(self._address)))
+ self.hide()
diff --git a/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadBlockedMessage.py b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadBlockedMessage.py
new file mode 100644
index 0000000000..be00292559
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadBlockedMessage.py
@@ -0,0 +1,18 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from UM import i18nCatalog
+from UM.Message import Message
+
+
+I18N_CATALOG = i18nCatalog("cura")
+
+
+## Message shown when uploading a print job to a cluster is blocked because another upload is already in progress.
+class PrintJobUploadBlockedMessage(Message):
+
+ def __init__(self) -> None:
+ super().__init__(
+ text = I18N_CATALOG.i18nc("@info:status", "Please wait until the current job has been sent."),
+ title = I18N_CATALOG.i18nc("@info:title", "Print error"),
+ lifetime = 10
+ )
diff --git a/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadErrorMessage.py b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadErrorMessage.py
new file mode 100644
index 0000000000..bb26a84953
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadErrorMessage.py
@@ -0,0 +1,18 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from UM import i18nCatalog
+from UM.Message import Message
+
+
+I18N_CATALOG = i18nCatalog("cura")
+
+
+## Message shown when uploading a print job to a cluster failed.
+class PrintJobUploadErrorMessage(Message):
+
+ def __init__(self, message: str = None) -> None:
+ super().__init__(
+ text = message or I18N_CATALOG.i18nc("@info:text", "Could not upload the data to the printer."),
+ title = I18N_CATALOG.i18nc("@info:title", "Network error"),
+ lifetime = 10
+ )
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadProgressMessage.py
similarity index 82%
rename from plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py
rename to plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadProgressMessage.py
index d85f49c1a0..bdbab008e3 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py
+++ b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadProgressMessage.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 import i18nCatalog
from UM.Message import Message
@@ -8,11 +8,11 @@ I18N_CATALOG = i18nCatalog("cura")
## Class responsible for showing a progress message while a mesh is being uploaded to the cloud.
-class CloudProgressMessage(Message):
+class PrintJobUploadProgressMessage(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 print job to printer."),
progress = -1,
lifetime = 0,
dismissable = False,
diff --git a/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadSuccessMessage.py b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadSuccessMessage.py
new file mode 100644
index 0000000000..c9be28d57f
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Messages/PrintJobUploadSuccessMessage.py
@@ -0,0 +1,18 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from UM import i18nCatalog
+from UM.Message import Message
+
+
+I18N_CATALOG = i18nCatalog("cura")
+
+
+## Message shown when uploading a print job to a cluster succeeded.
+class PrintJobUploadSuccessMessage(Message):
+
+ def __init__(self) -> None:
+ super().__init__(
+ text = I18N_CATALOG.i18nc("@info:status", "Print job was successfully sent to the printer."),
+ title = I18N_CATALOG.i18nc("@info:title", "Data Sent"),
+ lifetime = 5
+ )
diff --git a/plugins/UM3NetworkPrinting/src/Messages/__init__.py b/plugins/UM3NetworkPrinting/src/Messages/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/plugins/UM3NetworkPrinting/src/Models.py b/plugins/UM3NetworkPrinting/src/Models.py
deleted file mode 100644
index c5b9b16665..0000000000
--- a/plugins/UM3NetworkPrinting/src/Models.py
+++ /dev/null
@@ -1,46 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-
-
-## Base model that maps kwargs to instance attributes.
-class BaseModel:
- def __init__(self, **kwargs) -> None:
- self.__dict__.update(kwargs)
- self.validate()
-
- # Validates the model, raising an exception if the model is invalid.
- def validate(self) -> None:
- pass
-
-
-## Class representing a material that was fetched from the cluster API.
-class ClusterMaterial(BaseModel):
- def __init__(self, guid: str, version: int, **kwargs) -> None:
- self.guid = guid # type: str
- self.version = version # type: int
- super().__init__(**kwargs)
-
- def validate(self) -> None:
- if not self.guid:
- raise ValueError("guid is required on ClusterMaterial")
- if not self.version:
- raise ValueError("version is required on ClusterMaterial")
-
-
-## Class representing a local material that was fetched from the container registry.
-class LocalMaterial(BaseModel):
- def __init__(self, GUID: str, id: str, version: int, **kwargs) -> None:
- self.GUID = GUID # type: str
- self.id = id # type: str
- self.version = version # type: int
- super().__init__(**kwargs)
-
- #
- def validate(self) -> None:
- super().validate()
- if not self.GUID:
- raise ValueError("guid is required on LocalMaterial")
- if not self.version:
- raise ValueError("version is required on LocalMaterial")
- if not self.id:
- raise ValueError("id is required on LocalMaterial")
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/BaseCloudModel.py b/plugins/UM3NetworkPrinting/src/Models/BaseModel.py
similarity index 81%
rename from plugins/UM3NetworkPrinting/src/Cloud/Models/BaseCloudModel.py
rename to plugins/UM3NetworkPrinting/src/Models/BaseModel.py
index 18a8cb5cba..3d38a4b116 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/BaseCloudModel.py
+++ b/plugins/UM3NetworkPrinting/src/Models/BaseModel.py
@@ -1,13 +1,23 @@
-# Copyright (c) 2018 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from datetime import datetime, timezone
-from typing import Dict, Union, TypeVar, Type, List, Any
-
-from ...Models import BaseModel
+from typing import TypeVar, Dict, List, Any, Type, Union
-## Base class for the models used in the interface with the Ultimaker cloud APIs.
-class BaseCloudModel(BaseModel):
+# Type variable used in the parse methods below, which should be a subclass of BaseModel.
+T = TypeVar("T", bound="BaseModel")
+
+
+class BaseModel:
+
+ def __init__(self, **kwargs) -> None:
+ self.__dict__.update(kwargs)
+ self.validate()
+
+ # Validates the model, raising an exception if the model is invalid.
+ def validate(self) -> None:
+ pass
+
## Checks whether the two models are equal.
# \param other: The other model.
# \return True if they are equal, False if they are different.
@@ -24,9 +34,6 @@ class BaseCloudModel(BaseModel):
def toDict(self) -> Dict[str, Any]:
return self.__dict__
- # Type variable used in the parse methods below, which should be a subclass of BaseModel.
- T = TypeVar("T", bound=BaseModel)
-
## Parses a single model.
# \param model_class: The model class.
# \param values: The value of the model, which is usually a dictionary, but may also be already parsed.
diff --git a/plugins/UM3NetworkPrinting/src/ConfigurationChangeModel.py b/plugins/UM3NetworkPrinting/src/Models/ConfigurationChangeModel.py
similarity index 63%
rename from plugins/UM3NetworkPrinting/src/ConfigurationChangeModel.py
rename to plugins/UM3NetworkPrinting/src/Models/ConfigurationChangeModel.py
index ef8a212b76..58fae03679 100644
--- a/plugins/UM3NetworkPrinting/src/ConfigurationChangeModel.py
+++ b/plugins/UM3NetworkPrinting/src/Models/ConfigurationChangeModel.py
@@ -1,13 +1,18 @@
-# Copyright (c) 2018 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, QObject
+
+
+BLOCKING_CHANGE_TYPES = [
+ "material_insert", "buildplate_change"
+]
-from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, pyqtSlot
class ConfigurationChangeModel(QObject):
def __init__(self, type_of_change: str, index: int, target_name: str, origin_name: str) -> None:
super().__init__()
- self._type_of_change = type_of_change
- # enum = ["material", "print_core_change"]
+ self._type_of_change = type_of_change # enum = ["material", "print_core_change"]
+ self._can_override = self._type_of_change not in BLOCKING_CHANGE_TYPES
self._index = index
self._target_name = target_name
self._origin_name = origin_name
@@ -27,3 +32,7 @@ class ConfigurationChangeModel(QObject):
@pyqtProperty(str, constant = True)
def originName(self) -> str:
return self._origin_name
+
+ @pyqtProperty(bool, constant = True)
+ def canOverride(self) -> bool:
+ return self._can_override
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterResponse.py b/plugins/UM3NetworkPrinting/src/Models/Http/CloudClusterResponse.py
similarity index 67%
rename from plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterResponse.py
rename to plugins/UM3NetworkPrinting/src/Models/Http/CloudClusterResponse.py
index 9c0853e7c9..7ecfe8b0a3 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterResponse.py
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/CloudClusterResponse.py
@@ -1,13 +1,13 @@
-# 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 .BaseCloudModel import BaseCloudModel
+from ..BaseModel import BaseModel
## Class representing a cloud connected cluster.
-# Spec: https://api-staging.ultimaker.com/connect/v1/spec
-class CloudClusterResponse(BaseCloudModel):
+class CloudClusterResponse(BaseModel):
+
## Creates a new cluster response object.
# \param cluster_id: The secret unique ID, e.g. 'kBEeZWEifXbrXviO8mRYLx45P8k5lHVGs43XKvRniPg='.
# \param host_guid: The unique identifier of the print cluster host, e.g. 'e90ae0ac-1257-4403-91ee-a44c9b7e8050'.
@@ -15,14 +15,21 @@ class CloudClusterResponse(BaseCloudModel):
# \param is_online: Whether this cluster is currently connected to the cloud.
# \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.
+ # \param host_internal_ip: The internal IP address of the host printer.
+ # \param friendly_name: The human readable name of the host printer.
+ # \param printer_type: The machine type of the host printer.
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, printer_type: str = "ultimaker3", **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
+ self.printer_type = printer_type
super().__init__(**kwargs)
# Validates the model, raising an exception if the model is invalid.
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterStatus.py b/plugins/UM3NetworkPrinting/src/Models/Http/CloudClusterStatus.py
similarity index 52%
rename from plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterStatus.py
rename to plugins/UM3NetworkPrinting/src/Models/Http/CloudClusterStatus.py
index b0250c2ebb..330e61d343 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterStatus.py
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/CloudClusterStatus.py
@@ -1,26 +1,26 @@
-# Copyright (c) 2018 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from datetime import datetime
from typing import List, Dict, Union, Any
-from .CloudClusterPrinterStatus import CloudClusterPrinterStatus
-from .CloudClusterPrintJobStatus import CloudClusterPrintJobStatus
-from .BaseCloudModel import BaseCloudModel
+from ..BaseModel import BaseModel
+from .ClusterPrinterStatus import ClusterPrinterStatus
+from .ClusterPrintJobStatus import ClusterPrintJobStatus
# Model that represents the status of the cluster for the cloud
-# Spec: https://api-staging.ultimaker.com/connect/v1/spec
-class CloudClusterStatus(BaseCloudModel):
+class CloudClusterStatus(BaseModel):
+
## Creates a new cluster status model object.
# \param printers: The latest status of each printer in the cluster.
# \param print_jobs: The latest status of each print job in the cluster.
# \param generated_time: The datetime when the object was generated on the server-side.
def __init__(self,
- printers: List[Union[CloudClusterPrinterStatus, Dict[str, Any]]],
- print_jobs: List[Union[CloudClusterPrintJobStatus, Dict[str, Any]]],
+ printers: List[Union[ClusterPrinterStatus, Dict[str, Any]]],
+ print_jobs: List[Union[ClusterPrintJobStatus, Dict[str, Any]]],
generated_time: Union[str, datetime],
**kwargs) -> None:
self.generated_time = self.parseDate(generated_time)
- self.printers = self.parseModels(CloudClusterPrinterStatus, printers)
- self.print_jobs = self.parseModels(CloudClusterPrintJobStatus, print_jobs)
+ self.printers = self.parseModels(ClusterPrinterStatus, printers)
+ self.print_jobs = self.parseModels(ClusterPrintJobStatus, print_jobs)
super().__init__(**kwargs)
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudError.py b/plugins/UM3NetworkPrinting/src/Models/Http/CloudError.py
similarity index 88%
rename from plugins/UM3NetworkPrinting/src/Cloud/Models/CloudError.py
rename to plugins/UM3NetworkPrinting/src/Models/Http/CloudError.py
index b53361022e..9381e4b8cf 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudError.py
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/CloudError.py
@@ -1,13 +1,13 @@
-# 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 Dict, Optional, Any
-from .BaseCloudModel import BaseCloudModel
+from ..BaseModel import BaseModel
## Class representing errors generated by the cloud servers, according to the JSON-API standard.
-# Spec: https://api-staging.ultimaker.com/connect/v1/spec
-class CloudError(BaseCloudModel):
+class CloudError(BaseModel):
+
## Creates a new error object.
# \param id: Unique identifier for this particular occurrence of the problem.
# \param title: A short, human-readable summary of the problem that SHOULD NOT change from occurrence to occurrence
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudPrintJobResponse.py b/plugins/UM3NetworkPrinting/src/Models/Http/CloudPrintJobResponse.py
similarity index 88%
rename from plugins/UM3NetworkPrinting/src/Cloud/Models/CloudPrintJobResponse.py
rename to plugins/UM3NetworkPrinting/src/Models/Http/CloudPrintJobResponse.py
index 79196ee38c..a1880e8751 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudPrintJobResponse.py
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/CloudPrintJobResponse.py
@@ -1,13 +1,13 @@
-# 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 .BaseCloudModel import BaseCloudModel
+from ..BaseModel import BaseModel
# Model that represents the response received from the cloud after requesting to upload a print job
-# Spec: https://api-staging.ultimaker.com/cura/v1/spec
-class CloudPrintJobResponse(BaseCloudModel):
+class CloudPrintJobResponse(BaseModel):
+
## Creates a new print job response model.
# \param job_id: The job unique ID, e.g. 'kBEeZWEifXbrXviO8mRYLx45P8k5lHVGs43XKvRniPg='.
# \param status: The status of the print job.
@@ -28,6 +28,5 @@ class CloudPrintJobResponse(BaseCloudModel):
self.upload_url = upload_url
self.content_type = content_type
self.status_description = status_description
- # TODO: Implement slicing details
self.slicing_details = slicing_details
super().__init__(**kwargs)
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudPrintJobUploadRequest.py b/plugins/UM3NetworkPrinting/src/Models/Http/CloudPrintJobUploadRequest.py
similarity index 77%
rename from plugins/UM3NetworkPrinting/src/Cloud/Models/CloudPrintJobUploadRequest.py
rename to plugins/UM3NetworkPrinting/src/Models/Http/CloudPrintJobUploadRequest.py
index e59c571558..ff705ae495 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudPrintJobUploadRequest.py
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/CloudPrintJobUploadRequest.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.
-from .BaseCloudModel import BaseCloudModel
+from ..BaseModel import BaseModel
# Model that represents the request to upload a print job to the cloud
-# Spec: https://api-staging.ultimaker.com/cura/v1/spec
-class CloudPrintJobUploadRequest(BaseCloudModel):
+class CloudPrintJobUploadRequest(BaseModel):
+
## Creates a new print job upload request.
# \param job_name: The name of the print job.
# \param file_size: The size of the file in bytes.
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudPrintResponse.py b/plugins/UM3NetworkPrinting/src/Models/Http/CloudPrintResponse.py
similarity index 85%
rename from plugins/UM3NetworkPrinting/src/Cloud/Models/CloudPrintResponse.py
rename to plugins/UM3NetworkPrinting/src/Models/Http/CloudPrintResponse.py
index 919d1b3c3a..b108f40e27 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudPrintResponse.py
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/CloudPrintResponse.py
@@ -1,14 +1,14 @@
-# Copyright (c) 2018 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from datetime import datetime
from typing import Optional, Union
-from .BaseCloudModel import BaseCloudModel
+from ..BaseModel import BaseModel
# Model that represents the responses received from the cloud after requesting a job to be printed.
-# Spec: https://api-staging.ultimaker.com/connect/v1/spec
-class CloudPrintResponse(BaseCloudModel):
+class CloudPrintResponse(BaseModel):
+
## Creates a new print response object.
# \param job_id: The unique ID of a print job inside of the cluster. This ID is generated by Cura Connect.
# \param status: The status of the print request (queued or failed).
diff --git a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterBuildPlate.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterBuildPlate.py
new file mode 100644
index 0000000000..a5a392488d
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterBuildPlate.py
@@ -0,0 +1,13 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from ..BaseModel import BaseModel
+
+
+## Class representing a cluster printer
+class ClusterBuildPlate(BaseModel):
+
+ ## Create a new build plate
+ # \param type: The type of build plate glass or aluminium
+ def __init__(self, type: str = "glass", **kwargs) -> None:
+ self.type = type
+ super().__init__(**kwargs)
diff --git a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterMaterial.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterMaterial.py
new file mode 100644
index 0000000000..afc0851211
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterMaterial.py
@@ -0,0 +1,16 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from ..BaseModel import BaseModel
+
+
+class ClusterMaterial(BaseModel):
+ def __init__(self, guid: str, version: int, **kwargs) -> None:
+ self.guid = guid # type: str
+ self.version = version # type: int
+ super().__init__(**kwargs)
+
+ def validate(self) -> None:
+ if not self.guid:
+ raise ValueError("guid is required on ClusterMaterial")
+ if not self.version:
+ raise ValueError("version is required on ClusterMaterial")
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintCoreConfiguration.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintCoreConfiguration.py
similarity index 72%
rename from plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintCoreConfiguration.py
rename to plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintCoreConfiguration.py
index 7454401d09..e11d2be2d2 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintCoreConfiguration.py
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintCoreConfiguration.py
@@ -1,26 +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.
from typing import Union, Dict, Optional, Any
-from cura.PrinterOutput.ExtruderConfigurationModel import ExtruderConfigurationModel
-from cura.PrinterOutput.ExtruderOutputModel import ExtruderOutputModel
-from .CloudClusterPrinterConfigurationMaterial import CloudClusterPrinterConfigurationMaterial
-from .BaseCloudModel import BaseCloudModel
+from cura.PrinterOutput.Models.ExtruderConfigurationModel import ExtruderConfigurationModel
+from cura.PrinterOutput.Models.ExtruderOutputModel import ExtruderOutputModel
+
+from .ClusterPrinterConfigurationMaterial import ClusterPrinterConfigurationMaterial
+from ..BaseModel import BaseModel
-## Class representing a cloud cluster printer configuration
-# Spec: https://api-staging.ultimaker.com/connect/v1/spec
-class CloudClusterPrintCoreConfiguration(BaseCloudModel):
+## Class representing a cloud cluster printer configuration
+# Also used for representing slots in a Material Station (as from Cura's perspective these are the same).
+class ClusterPrintCoreConfiguration(BaseModel):
+
## Creates a new cloud cluster printer configuration object
# \param extruder_index: The position of the extruder on the machine as list index. Numbered from left to right.
# \param material: The material of a configuration object in a cluster printer. May be in a dict or an object.
# \param nozzle_diameter: The diameter of the print core at this position in millimeters, e.g. '0.4'.
# \param print_core_id: The type of print core inserted at this position, e.g. 'AA 0.4'.
def __init__(self, extruder_index: int,
- material: Union[None, Dict[str, Any], CloudClusterPrinterConfigurationMaterial],
+ material: Union[None, Dict[str, Any], ClusterPrinterConfigurationMaterial] = None,
print_core_id: Optional[str] = None, **kwargs) -> None:
self.extruder_index = extruder_index
- self.material = self.parseModel(CloudClusterPrinterConfigurationMaterial, material) if material else None
+ self.material = self.parseModel(ClusterPrinterConfigurationMaterial, material) if material else None
self.print_core_id = print_core_id
super().__init__(**kwargs)
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobConfigurationChange.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintJobConfigurationChange.py
similarity index 84%
rename from plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobConfigurationChange.py
rename to plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintJobConfigurationChange.py
index 9ff4154666..88251bbf53 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobConfigurationChange.py
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintJobConfigurationChange.py
@@ -1,13 +1,13 @@
-# 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 .BaseCloudModel import BaseCloudModel
+from ..BaseModel import BaseModel
## Model for the types of changes that are needed before a print job can start
-# Spec: https://api-staging.ultimaker.com/connect/v1/spec
-class CloudClusterPrintJobConfigurationChange(BaseCloudModel):
+class ClusterPrintJobConfigurationChange(BaseModel):
+
## Creates a new print job constraint.
# \param type_of_change: The type of configuration change, one of: "material", "print_core_change"
# \param index: The hotend slot or extruder index to change
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobConstraint.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintJobConstraint.py
similarity index 75%
rename from plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobConstraint.py
rename to plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintJobConstraint.py
index 8236ec06b9..9239004b18 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobConstraint.py
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintJobConstraint.py
@@ -1,13 +1,13 @@
-# 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 .BaseCloudModel import BaseCloudModel
+from ..BaseModel import BaseModel
## Class representing a cloud cluster print job constraint
-# Spec: https://api-staging.ultimaker.com/connect/v1/spec
-class CloudClusterPrintJobConstraints(BaseCloudModel):
+class ClusterPrintJobConstraints(BaseModel):
+
## Creates a new print job constraint.
# \param require_printer_name: Unique name of the printer that this job should be printed on.
# Should be one of the unique_name field values in the cluster, e.g. 'ultimakersystem-ccbdd30044ec'
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobImpediment.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintJobImpediment.py
similarity index 68%
rename from plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobImpediment.py
rename to plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintJobImpediment.py
index 12b67996c1..5a8f0aa46d 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobImpediment.py
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintJobImpediment.py
@@ -1,13 +1,14 @@
-# Copyright (c) 2018 Ultimaker B.V.
+# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
-from .BaseCloudModel import BaseCloudModel
+from ..BaseModel import BaseModel
## Class representing the reasons that prevent this job from being printed on the associated printer
-# Spec: https://api-staging.ultimaker.com/connect/v1/spec
-class CloudClusterPrintJobImpediment(BaseCloudModel):
+class ClusterPrintJobImpediment(BaseModel):
+
## Creates a new print job constraint.
- # \param translation_key: A string indicating a reason the print cannot be printed, such as 'does_not_fit_in_build_volume'
+ # \param translation_key: A string indicating a reason the print cannot be printed,
+ # such as 'does_not_fit_in_build_volume'
# \param severity: A number indicating the severity of the problem, with higher being more severe
def __init__(self, translation_key: str, severity: int, **kwargs) -> None:
self.translation_key = translation_key
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobStatus.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintJobStatus.py
similarity index 76%
rename from plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobStatus.py
rename to plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintJobStatus.py
index 45b7d838a5..e54d99f1e6 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrintJobStatus.py
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrintJobStatus.py
@@ -1,22 +1,25 @@
-# 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 List, Optional, Union, Dict, Any
-from cura.PrinterOutput.ConfigurationModel import ConfigurationModel
-from ...UM3PrintJobOutputModel import UM3PrintJobOutputModel
-from ...ConfigurationChangeModel import ConfigurationChangeModel
-from ..CloudOutputController import CloudOutputController
-from .BaseCloudModel import BaseCloudModel
-from .CloudClusterBuildPlate import CloudClusterBuildPlate
-from .CloudClusterPrintJobConfigurationChange import CloudClusterPrintJobConfigurationChange
-from .CloudClusterPrintJobImpediment import CloudClusterPrintJobImpediment
-from .CloudClusterPrintCoreConfiguration import CloudClusterPrintCoreConfiguration
-from .CloudClusterPrintJobConstraint import CloudClusterPrintJobConstraints
+from PyQt5.QtCore import QUrl
+
+from cura.PrinterOutput.Models.PrinterConfigurationModel import PrinterConfigurationModel
+
+from .ClusterBuildPlate import ClusterBuildPlate
+from .ClusterPrintJobConfigurationChange import ClusterPrintJobConfigurationChange
+from .ClusterPrintJobImpediment import ClusterPrintJobImpediment
+from .ClusterPrintCoreConfiguration import ClusterPrintCoreConfiguration
+from .ClusterPrintJobConstraint import ClusterPrintJobConstraints
+from ..UM3PrintJobOutputModel import UM3PrintJobOutputModel
+from ..ConfigurationChangeModel import ConfigurationChangeModel
+from ..BaseModel import BaseModel
+from ...ClusterOutputController import ClusterOutputController
## Model for the status of a single print job in a cluster.
-# Spec: https://api-staging.ultimaker.com/connect/v1/spec
-class CloudClusterPrintJobStatus(BaseCloudModel):
+class ClusterPrintJobStatus(BaseModel):
+
## Creates a new cloud print job status model.
# \param assigned_to: The name of the printer this job is assigned to while being queued.
# \param configuration: The required print core configurations of this print job.
@@ -45,21 +48,21 @@ class CloudClusterPrintJobStatus(BaseCloudModel):
# printer
def __init__(self, created_at: str, force: bool, machine_variant: str, name: str, started: bool, status: str,
time_total: int, uuid: str,
- configuration: List[Union[Dict[str, Any], CloudClusterPrintCoreConfiguration]],
- constraints: List[Union[Dict[str, Any], CloudClusterPrintJobConstraints]],
+ configuration: List[Union[Dict[str, Any], ClusterPrintCoreConfiguration]],
+ constraints: List[Union[Dict[str, Any], ClusterPrintJobConstraints]],
last_seen: Optional[float] = None, network_error_count: Optional[int] = None,
owner: Optional[str] = None, printer_uuid: Optional[str] = None, time_elapsed: Optional[int] = None,
assigned_to: Optional[str] = None, deleted_at: Optional[str] = None,
printed_on_uuid: Optional[str] = None,
configuration_changes_required: List[
- Union[Dict[str, Any], CloudClusterPrintJobConfigurationChange]] = None,
- build_plate: Union[Dict[str, Any], CloudClusterBuildPlate] = None,
+ Union[Dict[str, Any], ClusterPrintJobConfigurationChange]] = None,
+ build_plate: Union[Dict[str, Any], ClusterBuildPlate] = None,
compatible_machine_families: List[str] = None,
- impediments_to_printing: List[Union[Dict[str, Any], CloudClusterPrintJobImpediment]] = None,
+ impediments_to_printing: List[Union[Dict[str, Any], ClusterPrintJobImpediment]] = None,
**kwargs) -> None:
self.assigned_to = assigned_to
- self.configuration = self.parseModels(CloudClusterPrintCoreConfiguration, configuration)
- self.constraints = self.parseModels(CloudClusterPrintJobConstraints, constraints)
+ self.configuration = self.parseModels(ClusterPrintCoreConfiguration, configuration)
+ self.constraints = self.parseModels(ClusterPrintJobConstraints, constraints)
self.created_at = created_at
self.force = force
self.last_seen = last_seen
@@ -76,29 +79,29 @@ class CloudClusterPrintJobStatus(BaseCloudModel):
self.deleted_at = deleted_at
self.printed_on_uuid = printed_on_uuid
- self.configuration_changes_required = self.parseModels(CloudClusterPrintJobConfigurationChange,
+ self.configuration_changes_required = self.parseModels(ClusterPrintJobConfigurationChange,
configuration_changes_required) \
if configuration_changes_required else []
- self.build_plate = self.parseModel(CloudClusterBuildPlate, build_plate) if build_plate else None
+ self.build_plate = self.parseModel(ClusterBuildPlate, build_plate) if build_plate else None
self.compatible_machine_families = compatible_machine_families if compatible_machine_families else []
- self.impediments_to_printing = self.parseModels(CloudClusterPrintJobImpediment, impediments_to_printing) \
+ self.impediments_to_printing = self.parseModels(ClusterPrintJobImpediment, impediments_to_printing) \
if impediments_to_printing else []
super().__init__(**kwargs)
## Creates an UM3 print job output model based on this cloud cluster print job.
# \param printer: The output model of the printer
- def createOutputModel(self, controller: CloudOutputController) -> UM3PrintJobOutputModel:
+ def createOutputModel(self, controller: ClusterOutputController) -> UM3PrintJobOutputModel:
model = UM3PrintJobOutputModel(controller, self.uuid, self.name)
self.updateOutputModel(model)
-
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)
+ configuration.setPrinterType(self.machine_variant)
return configuration
## Updates an UM3 print job output model based on this cloud cluster print job.
diff --git a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrinterConfigurationMaterial.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterConfigurationMaterial.py
similarity index 79%
rename from plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrinterConfigurationMaterial.py
rename to plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterConfigurationMaterial.py
index 652cbdabda..378a885a3b 100644
--- a/plugins/UM3NetworkPrinting/src/Cloud/Models/CloudClusterPrinterConfigurationMaterial.py
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterConfigurationMaterial.py
@@ -1,14 +1,16 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
from typing import Optional
-from UM.Logger import Logger
from cura.CuraApplication import CuraApplication
-from cura.PrinterOutput.MaterialOutputModel import MaterialOutputModel
-from .BaseCloudModel import BaseCloudModel
+from cura.PrinterOutput.Models.MaterialOutputModel import MaterialOutputModel
+
+from ..BaseModel import BaseModel
-## Class representing a cloud cluster printer configuration
-# Spec: https://api-staging.ultimaker.com/connect/v1/spec
-class CloudClusterPrinterConfigurationMaterial(BaseCloudModel):
+## Class representing a cloud cluster printer configuration
+class ClusterPrinterConfigurationMaterial(BaseModel):
+
## Creates a new material configuration model.
# \param brand: The brand of material in this print core, e.g. 'Ultimaker'.
# \param color: The color of material in this print core, e.g. 'Blue'.
@@ -45,11 +47,9 @@ class CloudClusterPrinterConfigurationMaterial(BaseCloudModel):
material_type = container.getMetaDataEntry("material")
name = container.getName()
else:
- Logger.log("w", "Unable to find material with guid {guid}. Using data as provided by cluster"
- .format(guid = self.guid))
color = self.color
brand = self.brand
material_type = self.material
name = "Empty" if self.material == "empty" else "Unknown"
- return MaterialOutputModel(guid = self.guid, type = material_type, brand = brand, color = color, name = name)
+ return MaterialOutputModel(guid=self.guid, type=material_type, brand=brand, color=color, name=name)
diff --git a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterMaterialStation.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterMaterialStation.py
new file mode 100644
index 0000000000..c51e07bcfc
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterMaterialStation.py
@@ -0,0 +1,23 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from typing import Union, Dict, Any, List
+
+from ..BaseModel import BaseModel
+from .ClusterPrinterMaterialStationSlot import ClusterPrinterMaterialStationSlot
+
+
+## Class representing the data of a Material Station in the cluster.
+class ClusterPrinterMaterialStation(BaseModel):
+
+ ## Creates a new Material Station status.
+ # \param status: The status of the material station.
+ # \param: supported: Whether the material station is supported on this machine or not.
+ # \param material_slots: The active slots configurations of this material station.
+ def __init__(self, status: str, supported: bool = False,
+ material_slots: List[Union[ClusterPrinterMaterialStationSlot, Dict[str, Any]]] = None,
+ **kwargs) -> None:
+ self.status = status
+ self.supported = supported
+ self.material_slots = self.parseModels(ClusterPrinterMaterialStationSlot, material_slots)\
+ if material_slots else [] # type: List[ClusterPrinterMaterialStationSlot]
+ super().__init__(**kwargs)
diff --git a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterMaterialStationSlot.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterMaterialStationSlot.py
new file mode 100644
index 0000000000..80deb1c9a8
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterMaterialStationSlot.py
@@ -0,0 +1,22 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from typing import Optional
+
+from .ClusterPrintCoreConfiguration import ClusterPrintCoreConfiguration
+
+
+## Class representing the data of a single slot in the material station.
+class ClusterPrinterMaterialStationSlot(ClusterPrintCoreConfiguration):
+
+ ## Create a new material station slot object.
+ # \param slot_index: The index of the slot in the material station (ranging 0 to 5).
+ # \param compatible: Whether the configuration is compatible with the print core.
+ # \param material_remaining: How much material is remaining on the spool (between 0 and 1, or -1 for missing data).
+ # \param material_empty: Whether the material spool is too empty to be used.
+ def __init__(self, slot_index: int, compatible: bool, material_remaining: float,
+ material_empty: Optional[bool] = False, **kwargs):
+ self.slot_index = slot_index
+ self.compatible = compatible
+ self.material_remaining = material_remaining
+ self.material_empty = material_empty
+ super().__init__(**kwargs)
diff --git a/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py
new file mode 100644
index 0000000000..69daa1f08b
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/ClusterPrinterStatus.py
@@ -0,0 +1,146 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from itertools import product
+from typing import List, Union, Dict, Optional, Any
+
+from PyQt5.QtCore import QUrl
+
+from cura.PrinterOutput.Models.PrinterConfigurationModel import PrinterConfigurationModel
+from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
+from cura.PrinterOutput.Models.PrinterOutputModel import PrinterOutputModel
+
+from .ClusterBuildPlate import ClusterBuildPlate
+from .ClusterPrintCoreConfiguration import ClusterPrintCoreConfiguration
+from .ClusterPrinterMaterialStation import ClusterPrinterMaterialStation
+from .ClusterPrinterMaterialStationSlot import ClusterPrinterMaterialStationSlot
+from .ClusterPrinterConfigurationMaterial import ClusterPrinterConfigurationMaterial
+from ..BaseModel import BaseModel
+
+
+## Class representing a cluster printer
+class ClusterPrinterStatus(BaseModel):
+
+ ## Creates a new cluster printer status
+ # \param enabled: A printer can be disabled if it should not receive new jobs. By default every printer is enabled.
+ # \param firmware_version: Firmware version installed on the printer. Can differ for each printer in a cluster.
+ # \param friendly_name: Human readable name of the printer. Can be used for identification purposes.
+ # \param ip_address: The IP address of the printer in the local network.
+ # \param machine_variant: The type of printer. Can be 'Ultimaker 3' or 'Ultimaker 3ext'.
+ # \param status: The status of the printer.
+ # \param unique_name: The unique name of the printer in the network.
+ # \param uuid: The unique ID of the printer, also known as GUID.
+ # \param configuration: The active print core configurations of this printer.
+ # \param reserved_by: A printer can be claimed by a specific print job.
+ # \param maintenance_required: Indicates if maintenance is necessary.
+ # \param firmware_update_status: Whether the printer's firmware is up-to-date, value is one of: "up_to_date",
+ # "pending_update", "update_available", "update_in_progress", "update_failed", "update_impossible".
+ # \param latest_available_firmware: The version of the latest firmware that is available.
+ # \param build_plate: The build plate that is on the printer.
+ # \param material_station: The material station that is on the printer.
+ def __init__(self, enabled: bool, firmware_version: str, friendly_name: str, ip_address: str, machine_variant: str,
+ status: str, unique_name: str, uuid: str,
+ configuration: List[Union[Dict[str, Any], ClusterPrintCoreConfiguration]],
+ reserved_by: Optional[str] = None, maintenance_required: Optional[bool] = None,
+ firmware_update_status: Optional[str] = None, latest_available_firmware: Optional[str] = None,
+ build_plate: Union[Dict[str, Any], ClusterBuildPlate] = None,
+ material_station: Union[Dict[str, Any], ClusterPrinterMaterialStation] = None, **kwargs) -> None:
+
+ self.configuration = self.parseModels(ClusterPrintCoreConfiguration, configuration)
+ self.enabled = enabled
+ self.firmware_version = firmware_version
+ self.friendly_name = friendly_name
+ self.ip_address = ip_address
+ self.machine_variant = machine_variant
+ self.status = status
+ self.unique_name = unique_name
+ self.uuid = uuid
+ self.reserved_by = reserved_by
+ self.maintenance_required = maintenance_required
+ self.firmware_update_status = firmware_update_status
+ self.latest_available_firmware = latest_available_firmware
+ self.build_plate = self.parseModel(ClusterBuildPlate, build_plate) if build_plate else None
+ self.material_station = self.parseModel(ClusterPrinterMaterialStation,
+ material_station) if material_station else None
+ super().__init__(**kwargs)
+
+ ## Creates a new output model.
+ # \param controller - The controller of the model.
+ def createOutputModel(self, controller: PrinterOutputController) -> PrinterOutputModel:
+ # FIXME
+ # Note that we're using '2' here as extruder count. We have hardcoded this for now to prevent issues where the
+ # amount of extruders coming back from the API is actually lower (which it can be if a printer was just added
+ # to a cluster). This should be fixed in the future, probably also on the cluster API side.
+ model = PrinterOutputModel(controller, 2, firmware_version = self.firmware_version)
+ self.updateOutputModel(model)
+ return model
+
+ ## Updates the given output model.
+ # \param model - The output model to update.
+ def updateOutputModel(self, model: PrinterOutputModel) -> None:
+ model.updateKey(self.uuid)
+ model.updateName(self.friendly_name)
+ model.updateType(self.machine_variant)
+ model.updateState(self.status if self.enabled else "disabled")
+ model.updateBuildplate(self.build_plate.type if self.build_plate else "glass")
+ model.setCameraUrl(QUrl("http://{}:8080/?action=stream".format(self.ip_address)))
+
+ if not model.printerConfiguration:
+ # Prevent accessing printer configuration when not available.
+ # This sometimes happens when a printer was just added to a group and Cura is connected to that group.
+ return
+
+ # Set the possible configurations based on whether a Material Station is present or not.
+ if self.material_station and self.material_station.material_slots:
+ self._updateAvailableConfigurations(model)
+ if self.configuration:
+ self._updateActiveConfiguration(model)
+
+ def _updateActiveConfiguration(self, model: PrinterOutputModel) -> None:
+ configurations = zip(self.configuration, model.extruders, model.printerConfiguration.extruderConfigurations)
+ for configuration, extruder_output, extruder_config in configurations:
+ configuration.updateOutputModel(extruder_output)
+ configuration.updateConfigurationModel(extruder_config)
+
+ def _updateAvailableConfigurations(self, model: PrinterOutputModel) -> None:
+ available_configurations = [self._createAvailableConfigurationFromPrinterConfiguration(
+ left_slot = left_slot,
+ right_slot = right_slot,
+ printer_configuration = model.printerConfiguration
+ ) for left_slot, right_slot in product(self._getSlotsForExtruder(0), self._getSlotsForExtruder(1))]
+ model.setAvailableConfigurations(available_configurations)
+
+ ## Create a list of Material Station slots for the given extruder index.
+ # Returns a list with a single empty material slot if none are found to ensure we don't miss configurations.
+ def _getSlotsForExtruder(self, extruder_index: int) -> List[ClusterPrinterMaterialStationSlot]:
+ if not self.material_station: # typing guard
+ return []
+ slots = [slot for slot in self.material_station.material_slots if self._isSupportedConfiguration(
+ slot = slot,
+ extruder_index = extruder_index
+ )]
+ return slots or [self._createEmptyMaterialSlot(extruder_index)]
+
+ ## Check if a configuration is supported in order to make it selectable by the user.
+ # We filter out any slot that is not supported by the extruder index, print core type or if the material is empty.
+ @staticmethod
+ def _isSupportedConfiguration(slot: ClusterPrinterMaterialStationSlot, extruder_index: int) -> bool:
+ return slot.extruder_index == extruder_index and slot.compatible and not slot.material_empty
+
+ ## Create an empty material slot with a fake empty material.
+ @staticmethod
+ def _createEmptyMaterialSlot(extruder_index: int) -> ClusterPrinterMaterialStationSlot:
+ empty_material = ClusterPrinterConfigurationMaterial(guid = "", material = "empty", brand = "", color = "")
+ return ClusterPrinterMaterialStationSlot(slot_index = 0, extruder_index = extruder_index,
+ compatible = True, material_remaining = 0, material = empty_material)
+
+ @staticmethod
+ def _createAvailableConfigurationFromPrinterConfiguration(left_slot: ClusterPrinterMaterialStationSlot,
+ right_slot: ClusterPrinterMaterialStationSlot,
+ printer_configuration: PrinterConfigurationModel
+ ) -> PrinterConfigurationModel:
+ available_configuration = PrinterConfigurationModel()
+ available_configuration.setExtruderConfigurations([left_slot.createConfigurationModel(),
+ right_slot.createConfigurationModel()])
+ available_configuration.setPrinterType(printer_configuration.printerType)
+ available_configuration.setBuildplateConfiguration(printer_configuration.buildplateConfiguration)
+ return available_configuration
diff --git a/plugins/UM3NetworkPrinting/src/Models/Http/PrinterSystemStatus.py b/plugins/UM3NetworkPrinting/src/Models/Http/PrinterSystemStatus.py
new file mode 100644
index 0000000000..ad7b9c8698
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Models/Http/PrinterSystemStatus.py
@@ -0,0 +1,21 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from typing import Dict, Any
+
+from ..BaseModel import BaseModel
+
+
+## Class representing the system status of a printer.
+class PrinterSystemStatus(BaseModel):
+
+ def __init__(self, guid: str, firmware: str, hostname: str, name: str, platform: str, variant: str,
+ hardware: Dict[str, Any], **kwargs
+ ) -> None:
+ self.guid = guid
+ self.firmware = firmware
+ self.hostname = hostname
+ self.name = name
+ self.platform = platform
+ self.variant = variant
+ self.hardware = hardware
+ super().__init__(**kwargs)
diff --git a/plugins/UM3NetworkPrinting/src/Models/Http/__init__.py b/plugins/UM3NetworkPrinting/src/Models/Http/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/plugins/UM3NetworkPrinting/src/Models/LocalMaterial.py b/plugins/UM3NetworkPrinting/src/Models/LocalMaterial.py
new file mode 100644
index 0000000000..b45289e1c4
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Models/LocalMaterial.py
@@ -0,0 +1,21 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from .BaseModel import BaseModel
+
+
+class LocalMaterial(BaseModel):
+
+ def __init__(self, GUID: str, id: str, version: int, **kwargs) -> None:
+ self.GUID = GUID # type: str
+ self.id = id # type: str
+ self.version = version # type: int
+ super().__init__(**kwargs)
+
+ def validate(self) -> None:
+ super().validate()
+ if not self.GUID:
+ raise ValueError("guid is required on LocalMaterial")
+ if not self.version:
+ raise ValueError("version is required on LocalMaterial")
+ if not self.id:
+ raise ValueError("id is required on LocalMaterial")
diff --git a/plugins/UM3NetworkPrinting/src/UM3PrintJobOutputModel.py b/plugins/UM3NetworkPrinting/src/Models/UM3PrintJobOutputModel.py
similarity index 64%
rename from plugins/UM3NetworkPrinting/src/UM3PrintJobOutputModel.py
rename to plugins/UM3NetworkPrinting/src/Models/UM3PrintJobOutputModel.py
index 4f44ca4af8..bfde233a35 100644
--- a/plugins/UM3NetworkPrinting/src/UM3PrintJobOutputModel.py
+++ b/plugins/UM3NetworkPrinting/src/Models/UM3PrintJobOutputModel.py
@@ -1,21 +1,22 @@
-# 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 List
from PyQt5.QtCore import pyqtProperty, pyqtSignal
+from PyQt5.QtGui import QImage
-from cura.PrinterOutput.PrintJobOutputModel import PrintJobOutputModel
+from cura.PrinterOutput.Models.PrintJobOutputModel import PrintJobOutputModel
from cura.PrinterOutput.PrinterOutputController import PrinterOutputController
+
from .ConfigurationChangeModel import ConfigurationChangeModel
class UM3PrintJobOutputModel(PrintJobOutputModel):
configurationChangesChanged = pyqtSignal()
- def __init__(self, output_controller: "PrinterOutputController", key: str = "", name: str = "", parent=None) -> None:
+ def __init__(self, output_controller: PrinterOutputController, key: str = "", name: str = "", parent=None) -> None:
super().__init__(output_controller, key, name, parent)
- self._configuration_changes = [] # type: List[ConfigurationChangeModel]
+ self._configuration_changes = [] # type: List[ConfigurationChangeModel]
@pyqtProperty("QVariantList", notify=configurationChangesChanged)
def configurationChanges(self) -> List[ConfigurationChangeModel]:
@@ -26,3 +27,8 @@ class UM3PrintJobOutputModel(PrintJobOutputModel):
return
self._configuration_changes = changes
self.configurationChangesChanged.emit()
+
+ def updatePreviewImageData(self, data: bytes) -> None:
+ image = QImage()
+ image.loadFromData(data)
+ self.updatePreviewImage(image)
diff --git a/plugins/UM3NetworkPrinting/src/Models/__init__.py b/plugins/UM3NetworkPrinting/src/Models/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/plugins/UM3NetworkPrinting/src/Network/ClusterApiClient.py b/plugins/UM3NetworkPrinting/src/Network/ClusterApiClient.py
new file mode 100644
index 0000000000..f61982b9a8
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Network/ClusterApiClient.py
@@ -0,0 +1,173 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+import json
+from json import JSONDecodeError
+from typing import Callable, List, Optional, Dict, Union, Any, Type, cast, TypeVar, Tuple
+
+from PyQt5.QtCore import QUrl
+from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest, QNetworkReply
+
+from UM.Logger import Logger
+
+from ..Models.BaseModel import BaseModel
+from ..Models.Http.ClusterPrintJobStatus import ClusterPrintJobStatus
+from ..Models.Http.ClusterPrinterStatus import ClusterPrinterStatus
+from ..Models.Http.PrinterSystemStatus import PrinterSystemStatus
+from ..Models.Http.ClusterMaterial import ClusterMaterial
+
+
+## The generic type variable used to document the methods below.
+ClusterApiClientModel = TypeVar("ClusterApiClientModel", bound=BaseModel)
+
+
+## The ClusterApiClient is responsible for all network calls to local network clusters.
+class ClusterApiClient:
+
+ PRINTER_API_PREFIX = "/api/v1"
+ CLUSTER_API_PREFIX = "/cluster-api/v1"
+
+ # In order to avoid garbage collection we keep the callbacks in this list.
+ _anti_gc_callbacks = [] # type: List[Callable[[], None]]
+
+ ## Initializes a new cluster API client.
+ # \param address: The network address of the cluster to call.
+ # \param on_error: The callback to be called whenever we receive errors from the server.
+ def __init__(self, address: str, on_error: Callable) -> None:
+ super().__init__()
+ self._manager = QNetworkAccessManager()
+ self._address = address
+ self._on_error = on_error
+
+ ## Get printer system information.
+ # \param on_finished: The callback in case the response is successful.
+ def getSystem(self, on_finished: Callable) -> None:
+ url = "{}/system".format(self.PRINTER_API_PREFIX)
+ reply = self._manager.get(self._createEmptyRequest(url))
+ self._addCallback(reply, on_finished, PrinterSystemStatus)
+
+ ## Get the installed materials on the printer.
+ # \param on_finished: The callback in case the response is successful.
+ def getMaterials(self, on_finished: Callable[[List[ClusterMaterial]], Any]) -> None:
+ url = "{}/materials".format(self.CLUSTER_API_PREFIX)
+ reply = self._manager.get(self._createEmptyRequest(url))
+ self._addCallback(reply, on_finished, ClusterMaterial)
+
+ ## Get the printers in the cluster.
+ # \param on_finished: The callback in case the response is successful.
+ def getPrinters(self, on_finished: Callable[[List[ClusterPrinterStatus]], Any]) -> None:
+ url = "{}/printers".format(self.CLUSTER_API_PREFIX)
+ reply = self._manager.get(self._createEmptyRequest(url))
+ self._addCallback(reply, on_finished, ClusterPrinterStatus)
+
+ ## Get the print jobs in the cluster.
+ # \param on_finished: The callback in case the response is successful.
+ def getPrintJobs(self, on_finished: Callable[[List[ClusterPrintJobStatus]], Any]) -> None:
+ url = "{}/print_jobs".format(self.CLUSTER_API_PREFIX)
+ reply = self._manager.get(self._createEmptyRequest(url))
+ self._addCallback(reply, on_finished, ClusterPrintJobStatus)
+
+ ## Move a print job to the top of the queue.
+ def movePrintJobToTop(self, print_job_uuid: str) -> None:
+ url = "{}/print_jobs/{}/action/move".format(self.CLUSTER_API_PREFIX, print_job_uuid)
+ self._manager.post(self._createEmptyRequest(url), json.dumps({"to_position": 0, "list": "queued"}).encode())
+
+ ## Override print job configuration and force it to be printed.
+ def forcePrintJob(self, print_job_uuid: str) -> None:
+ url = "{}/print_jobs/{}".format(self.CLUSTER_API_PREFIX, print_job_uuid)
+ self._manager.put(self._createEmptyRequest(url), json.dumps({"force": True}).encode())
+
+ ## Delete a print job from the queue.
+ def deletePrintJob(self, print_job_uuid: str) -> None:
+ url = "{}/print_jobs/{}".format(self.CLUSTER_API_PREFIX, print_job_uuid)
+ self._manager.deleteResource(self._createEmptyRequest(url))
+
+ ## Set the state of a print job.
+ def setPrintJobState(self, print_job_uuid: str, state: str) -> None:
+ url = "{}/print_jobs/{}/action".format(self.CLUSTER_API_PREFIX, print_job_uuid)
+ # We rewrite 'resume' to 'print' here because we are using the old print job action endpoints.
+ action = "print" if state == "resume" else state
+ self._manager.put(self._createEmptyRequest(url), json.dumps({"action": action}).encode())
+
+ ## Get the preview image data of a print job.
+ def getPrintJobPreviewImage(self, print_job_uuid: str, on_finished: Callable) -> None:
+ url = "{}/print_jobs/{}/preview_image".format(self.CLUSTER_API_PREFIX, print_job_uuid)
+ reply = self._manager.get(self._createEmptyRequest(url))
+ self._addCallback(reply, on_finished)
+
+ ## We override _createEmptyRequest in order to add the user credentials.
+ # \param url: The URL to request
+ # \param content_type: The type of the body contents.
+ def _createEmptyRequest(self, path: str, content_type: Optional[str] = "application/json") -> QNetworkRequest:
+ url = QUrl("http://" + self._address + path)
+ request = QNetworkRequest(url)
+ request.setAttribute(QNetworkRequest.FollowRedirectsAttribute, True)
+ if content_type:
+ request.setHeader(QNetworkRequest.ContentTypeHeader, content_type)
+ return request
+
+ ## Parses the given JSON network reply into a status code and a dictionary, handling unexpected errors as well.
+ # \param reply: The reply from the server.
+ # \return A tuple with a status code and a dictionary.
+ @staticmethod
+ def _parseReply(reply: QNetworkReply) -> Tuple[int, Dict[str, Any]]:
+ status_code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute)
+ try:
+ response = bytes(reply.readAll()).decode()
+ return status_code, json.loads(response)
+ except (UnicodeDecodeError, JSONDecodeError, ValueError) as err:
+ Logger.logException("e", "Could not parse the cluster response: %s", err)
+ return status_code, {"errors": [err]}
+
+ ## Parses the given models and calls the correct callback depending on the result.
+ # \param response: The response from the server, after being converted to a dict.
+ # \param on_finished: The callback in case the response is successful.
+ # \param model_class: The type of the model to convert the response to. It may either be a single record or a list.
+ def _parseModels(self, response: Dict[str, Any],
+ on_finished: Union[Callable[[ClusterApiClientModel], Any],
+ Callable[[List[ClusterApiClientModel]], Any]],
+ model_class: Type[ClusterApiClientModel]) -> None:
+ try:
+ if isinstance(response, list):
+ results = [model_class(**c) for c in response] # type: List[ClusterApiClientModel]
+ on_finished_list = cast(Callable[[List[ClusterApiClientModel]], Any], on_finished)
+ on_finished_list(results)
+ else:
+ result = model_class(**response) # type: ClusterApiClientModel
+ on_finished_item = cast(Callable[[ClusterApiClientModel], Any], on_finished)
+ on_finished_item(result)
+ except (JSONDecodeError, TypeError):
+ Logger.log("e", "Could not parse response from network: %s", str(response))
+
+ ## Creates a callback function so that it includes the parsing of the response into the correct model.
+ # The callback is added to the 'finished' signal of the reply.
+ # \param reply: The reply that should be listened to.
+ # \param on_finished: The callback in case the response is successful.
+ def _addCallback(self,
+ reply: QNetworkReply,
+ on_finished: Union[Callable[[ClusterApiClientModel], Any],
+ Callable[[List[ClusterApiClientModel]], Any]],
+ model: Type[ClusterApiClientModel] = None,
+ ) -> None:
+
+ def parse() -> None:
+ self._anti_gc_callbacks.remove(parse)
+
+ # Don't try to parse the reply if we didn't get one
+ if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) is None:
+ return
+
+ if reply.error() > 0:
+ self._on_error(reply.errorString())
+ return
+
+ # If no parse model is given, simply return the raw data in the callback.
+ if not model:
+ on_finished(reply.readAll())
+ return
+
+ # Otherwise parse the result and return the formatted data in the callback.
+ status_code, response = self._parseReply(reply)
+ self._parseModels(response, on_finished, model)
+
+ self._anti_gc_callbacks.append(parse)
+ reply.finished.connect(parse)
diff --git a/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py
new file mode 100644
index 0000000000..fd9a9e2f60
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py
@@ -0,0 +1,171 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from typing import Optional, Dict, List, Callable, Any
+
+from PyQt5.QtGui import QDesktopServices
+from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty
+from PyQt5.QtNetwork import QNetworkReply
+
+from UM.FileHandler.FileHandler import FileHandler
+from UM.i18n import i18nCatalog
+from UM.Scene.SceneNode import SceneNode
+from cura.PrinterOutput.NetworkedPrinterOutputDevice import AuthState
+from cura.PrinterOutput.PrinterOutputDevice import ConnectionType
+
+from .ClusterApiClient import ClusterApiClient
+from .SendMaterialJob import SendMaterialJob
+from ..ExportFileJob import ExportFileJob
+from ..UltimakerNetworkedPrinterOutputDevice import UltimakerNetworkedPrinterOutputDevice
+from ..Messages.PrintJobUploadBlockedMessage import PrintJobUploadBlockedMessage
+from ..Messages.PrintJobUploadErrorMessage import PrintJobUploadErrorMessage
+from ..Messages.PrintJobUploadSuccessMessage import PrintJobUploadSuccessMessage
+from ..Models.Http.ClusterMaterial import ClusterMaterial
+
+
+I18N_CATALOG = i18nCatalog("cura")
+
+
+class LocalClusterOutputDevice(UltimakerNetworkedPrinterOutputDevice):
+
+ activeCameraUrlChanged = pyqtSignal()
+
+ def __init__(self, device_id: str, address: str, properties: Dict[bytes, bytes], parent=None) -> None:
+
+ super().__init__(
+ device_id=device_id,
+ address=address,
+ properties=properties,
+ connection_type=ConnectionType.NetworkConnection,
+ parent=parent
+ )
+
+ self._cluster_api = None # type: Optional[ClusterApiClient]
+
+ # We don't have authentication over local networking, so we're always authenticated.
+ self.setAuthenticationState(AuthState.Authenticated)
+ self._setInterfaceElements()
+ self._active_camera_url = QUrl() # type: QUrl
+
+ ## Set all the interface elements and texts for this output device.
+ def _setInterfaceElements(self) -> None:
+ self.setPriority(3) # Make sure the output device gets selected above local file output
+ self.setShortDescription(I18N_CATALOG.i18nc("@action:button Preceded by 'Ready to'.", "Print over network"))
+ self.setDescription(I18N_CATALOG.i18nc("@properties:tooltip", "Print over network"))
+ self.setConnectionText(I18N_CATALOG.i18nc("@info:status", "Connected over the network"))
+
+ ## Called when the connection to the cluster changes.
+ def connect(self) -> None:
+ super().connect()
+ self._update()
+ self.sendMaterialProfiles()
+
+ @pyqtProperty(QUrl, notify=activeCameraUrlChanged)
+ def activeCameraUrl(self) -> QUrl:
+ return self._active_camera_url
+
+ @pyqtSlot(QUrl, name="setActiveCameraUrl")
+ def setActiveCameraUrl(self, camera_url: QUrl) -> None:
+ if self._active_camera_url != camera_url:
+ self._active_camera_url = camera_url
+ self.activeCameraUrlChanged.emit()
+
+ @pyqtSlot(name="openPrintJobControlPanel")
+ def openPrintJobControlPanel(self) -> None:
+ QDesktopServices.openUrl(QUrl("http://" + self._address + "/print_jobs"))
+
+ @pyqtSlot(name="openPrinterControlPanel")
+ def openPrinterControlPanel(self) -> None:
+ QDesktopServices.openUrl(QUrl("http://" + self._address + "/printers"))
+
+ @pyqtSlot(str, name="sendJobToTop")
+ def sendJobToTop(self, print_job_uuid: str) -> None:
+ self._getApiClient().movePrintJobToTop(print_job_uuid)
+
+ @pyqtSlot(str, name="deleteJobFromQueue")
+ def deleteJobFromQueue(self, print_job_uuid: str) -> None:
+ self._getApiClient().deletePrintJob(print_job_uuid)
+
+ @pyqtSlot(str, name="forceSendJob")
+ def forceSendJob(self, print_job_uuid: str) -> None:
+ self._getApiClient().forcePrintJob(print_job_uuid)
+
+ ## Set the remote print job state.
+ # \param print_job_uuid: The UUID of the print job to set the state for.
+ # \param action: The action to undertake ('pause', 'resume', 'abort').
+ def setJobState(self, print_job_uuid: str, action: str) -> None:
+ self._getApiClient().setPrintJobState(print_job_uuid, action)
+
+ def _update(self) -> None:
+ super()._update()
+ self._getApiClient().getPrinters(self._updatePrinters)
+ self._getApiClient().getPrintJobs(self._updatePrintJobs)
+ self._updatePrintJobPreviewImages()
+
+ ## Get a list of materials that are installed on the cluster host.
+ def getMaterials(self, on_finished: Callable[[List[ClusterMaterial]], Any]) -> None:
+ self._getApiClient().getMaterials(on_finished = on_finished)
+
+ ## Sync the material profiles in Cura with the printer.
+ # This gets called when connecting to a printer as well as when sending a print.
+ def sendMaterialProfiles(self) -> None:
+ job = SendMaterialJob(device = self)
+ job.run()
+
+ ## Send a print job to the cluster.
+ def requestWrite(self, nodes: List[SceneNode], file_name: Optional[str] = None, limit_mimetypes: bool = False,
+ file_handler: Optional[FileHandler] = None, filter_by_machine: bool = False, **kwargs) -> None:
+
+ # Show an error message if we're already sending a job.
+ if self._progress.visible:
+ PrintJobUploadBlockedMessage().show()
+ return
+
+ self.writeStarted.emit(self)
+
+ # Export the scene to the correct file type.
+ job = ExportFileJob(file_handler=file_handler, nodes=nodes, firmware_version=self.firmwareVersion)
+ job.finished.connect(self._onPrintJobCreated)
+ job.start()
+
+ ## Handler for when the print job was created locally.
+ # It can now be sent over the network.
+ def _onPrintJobCreated(self, job: ExportFileJob) -> None:
+ self._progress.show()
+ parts = [
+ self._createFormPart("name=owner", bytes(self._getUserName(), "utf-8"), "text/plain"),
+ self._createFormPart("name=\"file\"; filename=\"%s\"" % job.getFileName(), job.getOutput())
+ ]
+ # FIXME: move form posting to API client
+ self.postFormWithParts("/cluster-api/v1/print_jobs/", parts, on_finished=self._onPrintUploadCompleted,
+ on_progress=self._onPrintJobUploadProgress)
+
+ ## Handler for print job upload progress.
+ def _onPrintJobUploadProgress(self, bytes_sent: int, bytes_total: int) -> None:
+ percentage = (bytes_sent / bytes_total) if bytes_total else 0
+ self._progress.setProgress(percentage * 100)
+ self.writeProgress.emit()
+
+ ## Handler for when the print job was fully uploaded to the cluster.
+ def _onPrintUploadCompleted(self, _: QNetworkReply) -> None:
+ self._progress.hide()
+ PrintJobUploadSuccessMessage().show()
+ self.writeFinished.emit()
+
+ ## Displays the given message if uploading the mesh has failed
+ # \param message: The message to display.
+ def _onUploadError(self, message: str = None) -> None:
+ self._progress.hide()
+ PrintJobUploadErrorMessage(message).show()
+ self.writeError.emit()
+
+ ## Download all the images from the cluster and load their data in the print job models.
+ def _updatePrintJobPreviewImages(self):
+ for print_job in self._print_jobs:
+ if print_job.getPreviewImage() is None:
+ self._getApiClient().getPrintJobPreviewImage(print_job.key, print_job.updatePreviewImageData)
+
+ ## Get the API client instance.
+ def _getApiClient(self) -> ClusterApiClient:
+ if not self._cluster_api:
+ self._cluster_api = ClusterApiClient(self.address, on_error=lambda error: print(error))
+ return self._cluster_api
diff --git a/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py
new file mode 100644
index 0000000000..89fd71d03c
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDeviceManager.py
@@ -0,0 +1,249 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from typing import Dict, Optional, Callable, List
+
+from UM import i18nCatalog
+from UM.Logger import Logger
+from UM.Signal import Signal
+from UM.Version import Version
+
+from cura.CuraApplication import CuraApplication
+from cura.Settings.GlobalStack import GlobalStack
+
+from .ZeroConfClient import ZeroConfClient
+from .ClusterApiClient import ClusterApiClient
+from .LocalClusterOutputDevice import LocalClusterOutputDevice
+from ..UltimakerNetworkedPrinterOutputDevice import UltimakerNetworkedPrinterOutputDevice
+from ..Messages.CloudFlowMessage import CloudFlowMessage
+from ..Messages.LegacyDeviceNoLongerSupportedMessage import LegacyDeviceNoLongerSupportedMessage
+from ..Models.Http.PrinterSystemStatus import PrinterSystemStatus
+
+
+I18N_CATALOG = i18nCatalog("cura")
+
+
+## The LocalClusterOutputDeviceManager is responsible for discovering and managing local networked clusters.
+class LocalClusterOutputDeviceManager:
+
+ META_NETWORK_KEY = "um_network_key"
+
+ MANUAL_DEVICES_PREFERENCE_KEY = "um3networkprinting/manual_instances"
+ MIN_SUPPORTED_CLUSTER_VERSION = Version("4.0.0")
+
+ # The translation catalog for this device.
+ I18N_CATALOG = i18nCatalog("cura")
+
+ # Signal emitted when the list of discovered devices changed.
+ discoveredDevicesChanged = Signal()
+
+ def __init__(self) -> None:
+
+ # Persistent dict containing the networked clusters.
+ self._discovered_devices = {} # type: Dict[str, LocalClusterOutputDevice]
+ self._output_device_manager = CuraApplication.getInstance().getOutputDeviceManager()
+
+ # Hook up ZeroConf client.
+ self._zero_conf_client = ZeroConfClient()
+ self._zero_conf_client.addedNetworkCluster.connect(self._onDeviceDiscovered)
+ self._zero_conf_client.removedNetworkCluster.connect(self._onDiscoveredDeviceRemoved)
+
+ ## Start the network discovery.
+ def start(self) -> None:
+ self._zero_conf_client.start()
+ for address in self._getStoredManualAddresses():
+ self.addManualDevice(address)
+
+ ## Stop network discovery and clean up discovered devices.
+ def stop(self) -> None:
+ self._zero_conf_client.stop()
+ for instance_name in list(self._discovered_devices):
+ self._onDiscoveredDeviceRemoved(instance_name)
+
+ ## Restart discovery on the local network.
+ def startDiscovery(self):
+ self.stop()
+ self.start()
+
+ ## Add a networked printer manually by address.
+ def addManualDevice(self, address: str, callback: Optional[Callable[[bool, str], None]] = None) -> None:
+ api_client = ClusterApiClient(address, lambda error: print(error))
+ api_client.getSystem(lambda status: self._onCheckManualDeviceResponse(address, status, callback))
+
+ ## Remove a manually added networked printer.
+ def removeManualDevice(self, device_id: str, address: Optional[str] = None) -> None:
+ if device_id not in self._discovered_devices and address is not None:
+ device_id = "manual:{}".format(address)
+
+ if device_id in self._discovered_devices:
+ address = address or self._discovered_devices[device_id].ipAddress
+ self._onDiscoveredDeviceRemoved(device_id)
+
+ if address in self._getStoredManualAddresses():
+ self._removeStoredManualAddress(address)
+
+ ## Force reset all network device connections.
+ def refreshConnections(self) -> None:
+ self._connectToActiveMachine()
+
+ ## Get the discovered devices.
+ def getDiscoveredDevices(self) -> Dict[str, LocalClusterOutputDevice]:
+ return self._discovered_devices
+
+ ## Connect the active machine to a given device.
+ def associateActiveMachineWithPrinterDevice(self, device: LocalClusterOutputDevice) -> None:
+ active_machine = CuraApplication.getInstance().getGlobalContainerStack()
+ if not active_machine:
+ return
+ 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:
+ active_machine = CuraApplication.getInstance().getGlobalContainerStack()
+ if not active_machine:
+ return
+
+ output_device_manager = CuraApplication.getInstance().getOutputDeviceManager()
+ stored_device_id = active_machine.getMetaDataEntry(self.META_NETWORK_KEY)
+ for device in self._discovered_devices.values():
+ if device.key == stored_device_id:
+ # Connect to it if the stored key matches.
+ self._connectToOutputDevice(device, active_machine)
+ elif device.key in output_device_manager.getOutputDeviceIds():
+ # Remove device if it is not meant for the active machine.
+ CuraApplication.getInstance().getOutputDeviceManager().removeOutputDevice(device.key)
+
+ ## Callback for when a manual device check request was responded to.
+ def _onCheckManualDeviceResponse(self, address: str, status: PrinterSystemStatus,
+ callback: Optional[Callable[[bool, str], None]] = None) -> None:
+ self._onDeviceDiscovered("manual:{}".format(address), address, {
+ b"name": status.name.encode("utf-8"),
+ b"address": address.encode("utf-8"),
+ b"machine": str(status.hardware.get("typeid", "")).encode("utf-8"),
+ b"manual": b"true",
+ b"firmware_version": status.firmware.encode("utf-8"),
+ b"cluster_size": b"1"
+ })
+ self._storeManualAddress(address)
+ if callback is not None:
+ CuraApplication.getInstance().callLater(callback, True, address)
+
+ ## Returns a dict of printer BOM numbers to machine types.
+ # These numbers are available in the machine definition already so we just search for them here.
+ @staticmethod
+ def _getPrinterTypeIdentifiers() -> Dict[str, str]:
+ container_registry = CuraApplication.getInstance().getContainerRegistry()
+ ultimaker_machines = container_registry.findContainersMetadata(type="machine", manufacturer="Ultimaker B.V.")
+ found_machine_type_identifiers = {} # type: Dict[str, str]
+ for machine in ultimaker_machines:
+ machine_type = machine.get("id", None)
+ machine_bom_numbers = machine.get("bom_numbers", [])
+ if machine_type and machine_bom_numbers:
+ for bom_number in machine_bom_numbers:
+ # This produces a n:1 mapping of bom numbers to machine types
+ # allowing the S5R1 and S5R2 hardware to use a single S5 definition.
+ found_machine_type_identifiers[str(bom_number)] = machine_type
+ return found_machine_type_identifiers
+
+ ## Add a new device.
+ def _onDeviceDiscovered(self, key: str, address: str, properties: Dict[bytes, bytes]) -> None:
+ machine_identifier = properties.get(b"machine", b"").decode("utf-8")
+ printer_type_identifiers = self._getPrinterTypeIdentifiers()
+
+ # Detect the machine type based on the BOM number that is sent over the network.
+ properties[b"printer_type"] = b"Unknown"
+ for bom, p_type in printer_type_identifiers.items():
+ if machine_identifier.startswith(bom):
+ properties[b"printer_type"] = bytes(p_type, encoding="utf8")
+ break
+
+ device = LocalClusterOutputDevice(key, address, properties)
+ discovered_printers_model = CuraApplication.getInstance().getDiscoveredPrintersModel()
+ if address in list(discovered_printers_model.discoveredPrintersByAddress.keys()):
+ # The printer was already added, we just update the available data.
+ discovered_printers_model.updateDiscoveredPrinter(
+ ip_address=address,
+ name=device.getName(),
+ machine_type=device.printerType
+ )
+ else:
+ # The printer was not added yet so let's do that.
+ discovered_printers_model.addDiscoveredPrinter(
+ ip_address=address,
+ key=device.getId(),
+ name=device.getName(),
+ create_callback=self._createMachineFromDiscoveredDevice,
+ machine_type=device.printerType,
+ device=device
+ )
+ self._discovered_devices[device.getId()] = device
+ self.discoveredDevicesChanged.emit()
+ self._connectToActiveMachine()
+
+ ## Remove a device.
+ def _onDiscoveredDeviceRemoved(self, device_id: str) -> None:
+ device = self._discovered_devices.pop(device_id, None) # type: Optional[LocalClusterOutputDevice]
+ if not device:
+ return
+ device.close()
+ CuraApplication.getInstance().getDiscoveredPrintersModel().removeDiscoveredPrinter(device.address)
+ self.discoveredDevicesChanged.emit()
+
+ ## Create a machine instance based on the discovered network printer.
+ def _createMachineFromDiscoveredDevice(self, device_id: str) -> None:
+ device = self._discovered_devices.get(device_id)
+ if device is None:
+ return
+
+ # The newly added machine is automatically activated.
+ CuraApplication.getInstance().getMachineManager().addMachine(device.printerType, device.name)
+ active_machine = CuraApplication.getInstance().getGlobalContainerStack()
+ if not active_machine:
+ return
+ self._connectToOutputDevice(device, active_machine)
+ CloudFlowMessage(device.ipAddress).show() # Nudge the user to start using Ultimaker Cloud.
+
+ ## Add an address to the stored preferences.
+ def _storeManualAddress(self, address: str) -> None:
+ stored_addresses = self._getStoredManualAddresses()
+ if address in stored_addresses:
+ return # Prevent duplicates.
+ stored_addresses.append(address)
+ new_value = ",".join(stored_addresses)
+ CuraApplication.getInstance().getPreferences().setValue(self.MANUAL_DEVICES_PREFERENCE_KEY, new_value)
+
+ ## Remove an address from the stored preferences.
+ def _removeStoredManualAddress(self, address: str) -> None:
+ stored_addresses = self._getStoredManualAddresses()
+ try:
+ stored_addresses.remove(address) # Can throw a ValueError
+ new_value = ",".join(stored_addresses)
+ CuraApplication.getInstance().getPreferences().setValue(self.MANUAL_DEVICES_PREFERENCE_KEY, new_value)
+ except ValueError:
+ Logger.log("w", "Could not remove address from stored_addresses, it was not there")
+
+ ## Load the user-configured manual devices from Cura preferences.
+ def _getStoredManualAddresses(self) -> List[str]:
+ preferences = CuraApplication.getInstance().getPreferences()
+ preferences.addPreference(self.MANUAL_DEVICES_PREFERENCE_KEY, "")
+ manual_instances = preferences.getValue(self.MANUAL_DEVICES_PREFERENCE_KEY).split(",")
+ return manual_instances
+
+ ## Add a device to the current active machine.
+ def _connectToOutputDevice(self, device: UltimakerNetworkedPrinterOutputDevice, machine: GlobalStack) -> None:
+
+ # Make sure users know that we no longer support legacy devices.
+ if Version(device.firmwareVersion) < self.MIN_SUPPORTED_CLUSTER_VERSION:
+ LegacyDeviceNoLongerSupportedMessage().show()
+ return
+
+ machine.setName(device.name)
+ machine.setMetaDataEntry(self.META_NETWORK_KEY, device.key)
+ machine.setMetaDataEntry("group_name", device.name)
+ machine.addConfiguredConnectionType(device.connectionType.value)
+
+ if not device.isConnected():
+ device.connect()
+
+ output_device_manager = CuraApplication.getInstance().getOutputDeviceManager()
+ if device.key not in output_device_manager.getOutputDeviceIds():
+ output_device_manager.addOutputDevice(device)
diff --git a/plugins/UM3NetworkPrinting/src/SendMaterialJob.py b/plugins/UM3NetworkPrinting/src/Network/SendMaterialJob.py
similarity index 65%
rename from plugins/UM3NetworkPrinting/src/SendMaterialJob.py
rename to plugins/UM3NetworkPrinting/src/Network/SendMaterialJob.py
index f0fde818c4..2ad21d2f29 100644
--- a/plugins/UM3NetworkPrinting/src/SendMaterialJob.py
+++ b/plugins/UM3NetworkPrinting/src/Network/SendMaterialJob.py
@@ -1,20 +1,19 @@
# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
-
-import json
import os
-from typing import Dict, TYPE_CHECKING, Set, Optional
+from typing import Dict, TYPE_CHECKING, Set, List
from PyQt5.QtNetwork import QNetworkReply, QNetworkRequest
from UM.Job import Job
from UM.Logger import Logger
from cura.CuraApplication import CuraApplication
-# Absolute imports don't work in plugins
-from .Models import ClusterMaterial, LocalMaterial
+from ..Models.Http.ClusterMaterial import ClusterMaterial
+from ..Models.LocalMaterial import LocalMaterial
+from ..Messages.MaterialSyncMessage import MaterialSyncMessage
if TYPE_CHECKING:
- from .ClusterUM3OutputDevice import ClusterUM3OutputDevice
+ from .LocalClusterOutputDevice import LocalClusterOutputDevice
## Asynchronous job to send material profiles to the printer.
@@ -22,68 +21,49 @@ if TYPE_CHECKING:
# This way it won't freeze up the interface while sending those materials.
class SendMaterialJob(Job):
- def __init__(self, device: "ClusterUM3OutputDevice") -> None:
+ def __init__(self, device: "LocalClusterOutputDevice") -> None:
super().__init__()
- self.device = device # type: ClusterUM3OutputDevice
+ self.device = device # type: LocalClusterOutputDevice
## Send the request to the printer and register a callback
def run(self) -> None:
- self.device.get("materials/", on_finished = self._onGetRemoteMaterials)
+ self.device.getMaterials(on_finished = self._onGetMaterials)
- ## Process the materials reply from the printer.
- #
- # \param reply The reply from the printer, a json file.
- def _onGetRemoteMaterials(self, reply: QNetworkReply) -> None:
- # Got an error from the HTTP request. If we did not receive a 200 something happened.
- if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200:
- Logger.log("e", "Error fetching materials from printer: %s", reply.errorString())
- return
-
- # Collect materials from the printer's reply and send the missing ones if needed.
- remote_materials_by_guid = self._parseReply(reply)
- if remote_materials_by_guid:
- self._sendMissingMaterials(remote_materials_by_guid)
+ ## Callback for when the remote materials were returned.
+ def _onGetMaterials(self, materials: List[ClusterMaterial]) -> None:
+ remote_materials_by_guid = {material.guid: material for material in materials}
+ self._sendMissingMaterials(remote_materials_by_guid)
## Determine which materials should be updated and send them to the printer.
- #
# \param remote_materials_by_guid The remote materials by GUID.
def _sendMissingMaterials(self, remote_materials_by_guid: Dict[str, ClusterMaterial]) -> None:
- # Collect local materials
local_materials_by_guid = self._getLocalMaterials()
if len(local_materials_by_guid) == 0:
Logger.log("d", "There are no local materials to synchronize with the printer.")
return
-
- # Find out what materials are new or updated and must be sent to the printer
material_ids_to_send = self._determineMaterialsToSend(local_materials_by_guid, remote_materials_by_guid)
if len(material_ids_to_send) == 0:
Logger.log("d", "There are no remote materials to update.")
return
-
- # Send materials to the printer
self._sendMaterials(material_ids_to_send)
## From the local and remote materials, determine which ones should be synchronized.
- #
# Makes a Set of id's containing only the id's of the materials that are not on the printer yet or the ones that
# are newer in Cura.
- #
# \param local_materials The local materials by GUID.
# \param remote_materials The remote materials by GUID.
@staticmethod
def _determineMaterialsToSend(local_materials: Dict[str, LocalMaterial],
remote_materials: Dict[str, ClusterMaterial]) -> Set[str]:
return {
- material.id
- for guid, material in local_materials.items()
- if guid not in remote_materials or material.version > remote_materials[guid].version
+ local_material.id
+ for guid, local_material in local_materials.items()
+ if guid not in remote_materials.keys() or local_material.version > remote_materials[guid].version
}
## Send the materials to the printer.
- #
# The given materials will be loaded from disk en sent to to printer.
# The given id's will be matched with filenames of the locally stored materials.
- #
# \param materials_to_send A set with id's of materials that must be sent.
def _sendMaterials(self, materials_to_send: Set[str]) -> None:
container_registry = CuraApplication.getInstance().getContainerRegistry()
@@ -104,9 +84,7 @@ class SendMaterialJob(Job):
self._sendMaterialFile(file_path, file_name, root_material_id)
## Send a single material file to the printer.
- #
# Also add the material signature file if that is available.
- #
# \param file_path The path of the material file.
# \param file_name The name of the material file.
# \param material_id The ID of the material in the file.
@@ -126,48 +104,30 @@ class SendMaterialJob(Job):
parts.append(self.device.createFormPart("name=\"signature_file\"; filename=\"{file_name}\""
.format(file_name = signature_file_name), f.read()))
- Logger.log("d", "Syncing material {material_id} with cluster.".format(material_id = material_id))
- self.device.postFormWithParts(target = "materials/", parts = parts, on_finished = self.sendingFinished)
+ # FIXME: move form posting to API client
+ self.device.postFormWithParts(target = "/cluster-api/v1/materials/", parts = parts,
+ on_finished = self._sendingFinished)
## Check a reply from an upload to the printer and log an error when the call failed
- @staticmethod
- def sendingFinished(reply: QNetworkReply) -> None:
+ def _sendingFinished(self, reply: QNetworkReply) -> None:
if reply.attribute(QNetworkRequest.HttpStatusCodeAttribute) != 200:
- Logger.log("e", "Received error code from printer when syncing material: {code}, {text}".format(
- code = reply.attribute(QNetworkRequest.HttpStatusCodeAttribute),
- text = reply.errorString()
- ))
-
- ## Parse the reply from the printer
- #
- # Parses the reply to a "/materials" request to the printer
- #
- # \return a dictionary of ClusterMaterial objects by GUID
- # \throw KeyError Raised when on of the materials does not include a valid guid
- @classmethod
- def _parseReply(cls, reply: QNetworkReply) -> Optional[Dict[str, ClusterMaterial]]:
- try:
- remote_materials = json.loads(reply.readAll().data().decode("utf-8"))
- return {material["guid"]: ClusterMaterial(**material) for material in remote_materials}
- except UnicodeDecodeError:
- Logger.log("e", "Request material storage on printer: I didn't understand the printer's answer.")
- except json.JSONDecodeError:
- Logger.log("e", "Request material storage on printer: I didn't understand the printer's answer.")
- except ValueError:
- Logger.log("e", "Request material storage on printer: Printer's answer had an incorrect value.")
- except TypeError:
- Logger.log("e", "Request material storage on printer: Printer's answer was missing a required value.")
- return None
+ Logger.log("w", "Error while syncing material: %s", reply.errorString())
+ return
+ body = reply.readAll().data().decode('utf8')
+ if "not added" in body:
+ # For some reason the cluster returns a 200 sometimes even when syncing failed.
+ return
+ # Inform the user that materials have been synced. This message only shows itself when not already visible.
+ # Because of the guards above it is not shown when syncing failed (which is not always an actual problem).
+ MaterialSyncMessage(self.device).show()
## Retrieves a list of local materials
- #
# Only the new newest version of the local materials is returned
- #
# \return a dictionary of LocalMaterial objects by GUID
- def _getLocalMaterials(self) -> Dict[str, LocalMaterial]:
+ @staticmethod
+ def _getLocalMaterials() -> Dict[str, LocalMaterial]:
result = {} # type: Dict[str, LocalMaterial]
material_manager = CuraApplication.getInstance().getMaterialManager()
-
material_group_dict = material_manager.getAllMaterialGroups()
# Find the latest version of all material containers in the registry.
diff --git a/plugins/UM3NetworkPrinting/src/Network/ZeroConfClient.py b/plugins/UM3NetworkPrinting/src/Network/ZeroConfClient.py
new file mode 100644
index 0000000000..b6416b2bd0
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Network/ZeroConfClient.py
@@ -0,0 +1,140 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from queue import Queue
+from threading import Thread, Event
+from time import time
+from typing import Optional
+
+from zeroconf import Zeroconf, ServiceBrowser, ServiceStateChange, ServiceInfo
+
+from UM.Logger import Logger
+from UM.Signal import Signal
+from cura.CuraApplication import CuraApplication
+
+
+## The ZeroConfClient handles all network discovery logic.
+# It emits signals when new network services were found or disappeared.
+class ZeroConfClient:
+
+ # The discovery protocol name for Ultimaker printers.
+ ZERO_CONF_NAME = u"_ultimaker._tcp.local."
+
+ # Signals emitted when new services were discovered or removed on the network.
+ addedNetworkCluster = Signal()
+ removedNetworkCluster = Signal()
+
+ def __init__(self) -> None:
+ self._zero_conf = None # type: Optional[Zeroconf]
+ self._zero_conf_browser = None # type: Optional[ServiceBrowser]
+ self._service_changed_request_queue = None # type: Optional[Queue]
+ self._service_changed_request_event = None # type: Optional[Event]
+ self._service_changed_request_thread = None # type: Optional[Thread]
+
+ ## The ZeroConf service changed requests are handled in a separate thread so we don't block the UI.
+ # We can also re-schedule the requests when they fail to get detailed service info.
+ # Any new or re-reschedule requests will be appended to the request queue and the thread will process them.
+ def start(self) -> None:
+ self._service_changed_request_queue = Queue()
+ self._service_changed_request_event = Event()
+ self._service_changed_request_thread = Thread(target=self._handleOnServiceChangedRequests, daemon=True)
+ self._service_changed_request_thread.start()
+ self._zero_conf = Zeroconf()
+ self._zero_conf_browser = ServiceBrowser(self._zero_conf, self.ZERO_CONF_NAME, [self._queueService])
+
+ # Cleanup ZeroConf resources.
+ def stop(self) -> None:
+ if self._zero_conf is not None:
+ self._zero_conf.close()
+ self._zero_conf = None
+ if self._zero_conf_browser is not None:
+ self._zero_conf_browser.cancel()
+ self._zero_conf_browser = None
+
+ ## Handles a change is discovered network services.
+ def _queueService(self, zeroconf: Zeroconf, service_type, name: str, state_change: ServiceStateChange) -> None:
+ item = (zeroconf, service_type, name, state_change)
+ if not self._service_changed_request_queue or not self._service_changed_request_event:
+ return
+ self._service_changed_request_queue.put(item)
+ self._service_changed_request_event.set()
+
+ ## Callback for when a ZeroConf service has changes.
+ def _handleOnServiceChangedRequests(self) -> None:
+ if not self._service_changed_request_queue or not self._service_changed_request_event:
+ return
+
+ while True:
+ # Wait for the event to be set
+ self._service_changed_request_event.wait(timeout=5.0)
+
+ # Stop if the application is shutting down
+ if CuraApplication.getInstance().isShuttingDown():
+ return
+
+ self._service_changed_request_event.clear()
+
+ # Handle all pending requests
+ reschedule_requests = [] # A list of requests that have failed so later they will get re-scheduled
+ while not self._service_changed_request_queue.empty():
+ request = self._service_changed_request_queue.get()
+ zeroconf, service_type, name, state_change = request
+ try:
+ result = self._onServiceChanged(zeroconf, service_type, name, state_change)
+ if not result:
+ reschedule_requests.append(request)
+ except Exception:
+ Logger.logException("e", "Failed to get service info for [%s] [%s], the request will be rescheduled",
+ service_type, name)
+ reschedule_requests.append(request)
+
+ # Re-schedule the failed requests if any
+ if reschedule_requests:
+ for request in reschedule_requests:
+ self._service_changed_request_queue.put(request)
+
+ ## Handler for zeroConf detection.
+ # Return True or False indicating if the process succeeded.
+ # Note that this function can take over 3 seconds to complete. Be careful calling it from the main thread.
+ def _onServiceChanged(self, zero_conf: Zeroconf, service_type: str, name: str, state_change: ServiceStateChange
+ ) -> bool:
+ if state_change == ServiceStateChange.Added:
+ return self._onServiceAdded(zero_conf, service_type, name)
+ elif state_change == ServiceStateChange.Removed:
+ return self._onServiceRemoved(name)
+ return True
+
+ ## Handler for when a ZeroConf service was added.
+ def _onServiceAdded(self, zero_conf: Zeroconf, service_type: str, name: str) -> bool:
+ # First try getting info from zero-conf cache
+ info = ServiceInfo(service_type, name, properties={})
+ for record in zero_conf.cache.entries_with_name(name.lower()):
+ info.update_record(zero_conf, time(), record)
+
+ for record in zero_conf.cache.entries_with_name(info.server):
+ info.update_record(zero_conf, time(), record)
+ if info.address:
+ break
+
+ # Request more data if info is not complete
+ if not info.address:
+ info = zero_conf.get_service_info(service_type, name)
+
+ if info:
+ type_of_device = info.properties.get(b"type", None)
+ if type_of_device:
+ if type_of_device == b"printer":
+ address = '.'.join(map(lambda n: str(n), info.address))
+ self.addedNetworkCluster.emit(str(name), address, info.properties)
+ else:
+ Logger.log("w", "The type of the found device is '%s', not 'printer'." % type_of_device)
+ else:
+ Logger.log("w", "Could not get information about %s" % name)
+ return False
+
+ return True
+
+ ## Handler for when a ZeroConf service was removed.
+ def _onServiceRemoved(self, name: str) -> bool:
+ Logger.log("d", "ZeroConf service removed: %s" % name)
+ self.removedNetworkCluster.emit(str(name))
+ return True
diff --git a/plugins/UM3NetworkPrinting/src/Network/__init__.py b/plugins/UM3NetworkPrinting/src/Network/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py
index a32193849e..3ab37297b5 100644
--- a/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py
+++ b/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py
@@ -1,539 +1,73 @@
# Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
-import json
-from queue import Queue
-from threading import Event, Thread
-from time import time
-import os
-
-from zeroconf import Zeroconf, ServiceBrowser, ServiceStateChange, ServiceInfo
-from PyQt5.QtNetwork import QNetworkRequest, QNetworkAccessManager
-from PyQt5.QtCore import pyqtSlot, QUrl, pyqtSignal, pyqtProperty, QObject
-from PyQt5.QtGui import QDesktopServices
+from typing import Optional, Callable, Dict
+from UM.Signal import Signal
from cura.CuraApplication import CuraApplication
-from cura.PrinterOutputDevice import ConnectionType
-from cura.Settings.GlobalStack import GlobalStack # typing
-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 . import ClusterUM3OutputDevice, LegacyUM3OutputDevice
+from .Network.LocalClusterOutputDevice import LocalClusterOutputDevice
+from .Network.LocalClusterOutputDeviceManager import LocalClusterOutputDeviceManager
from .Cloud.CloudOutputDeviceManager import CloudOutputDeviceManager
-from typing import Optional
-i18n_catalog = i18nCatalog("cura")
-
-## 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
+## This plugin handles the discovery and networking for Ultimaker 3D printers that support network and cloud printing.
class UM3OutputDevicePlugin(OutputDevicePlugin):
- addDeviceSignal = Signal()
- removeDeviceSignal = Signal()
+
+ # Signal emitted when the list of discovered devices changed. Used by printer action in this plugin.
discoveredDevicesChanged = Signal()
- cloudFlowIsPossible = Signal()
- def __init__(self):
+ def __init__(self) -> None:
super().__init__()
-
- self._zero_conf = None
- self._zero_conf_browser = None
- self._application = CuraApplication.getInstance()
+ # Create a network output device manager that abstracts all network connection logic away.
+ self._network_output_device_manager = LocalClusterOutputDeviceManager()
+ self._network_output_device_manager.discoveredDevicesChanged.connect(self.discoveredDevicesChanged)
# Create a cloud output device manager that abstracts all cloud connection logic away.
self._cloud_output_device_manager = CloudOutputDeviceManager()
- # Because the model needs to be created in the same thread as the QMLEngine, we use a signal.
- self.addDeviceSignal.connect(self._onAddDevice)
- self.removeDeviceSignal.connect(self._onRemoveDevice)
+ # Refresh network connections when another machine was selected in Cura.
+ # This ensures no output devices are still connected that do not belong to the new active machine.
+ CuraApplication.getInstance().globalContainerStackChanged.connect(self.refreshConnections)
- self._application.globalContainerStackChanged.connect(self.reCheckConnections)
-
- self._discovered_devices = {}
-
- self._network_manager = QNetworkAccessManager()
- self._network_manager.finished.connect(self._onNetworkRequestFinished)
-
- self._min_cluster_version = Version("4.0.0")
- self._min_cloud_version = Version("5.2.0")
-
- self._api_version = "1"
- self._api_prefix = "/api/v" + self._api_version + "/"
- self._cluster_api_version = "1"
- self._cluster_api_prefix = "/cluster-api/v" + self._cluster_api_version + "/"
-
- # Get list of manual instances from preferences
- self._preferences = CuraApplication.getInstance().getPreferences()
- 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(",")
-
- # Store the last manual entry key
- 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.
- # Any new or re-scheduled requests will be appended to the request queue, and the handling thread will pick
- # them up and process them.
- self._service_changed_request_queue = Queue()
- self._service_changed_request_event = Event()
- self._service_changed_request_thread = Thread(target=self._handleOnServiceChangedRequests, daemon=True)
- self._service_changed_request_thread.start()
-
- self._account = self._application.getCuraAPI().account
-
- # Check if cloud flow is possible when user logs in
- self._account.loginStateChanged.connect(self.checkCloudFlowIsPossible)
-
- # Check if cloud flow is possible when user switches machines
- self._application.globalContainerStackChanged.connect(self._onMachineSwitched)
-
- # Listen for when cloud flow is possible
- self.cloudFlowIsPossible.connect(self._onCloudFlowPossible)
-
- # Listen if cloud cluster was added
- self._cloud_output_device_manager.addedCloudCluster.connect(self._onCloudPrintingConfigured)
-
- # Listen if cloud cluster was removed
- self._cloud_output_device_manager.removedCloudCluster.connect(self.checkCloudFlowIsPossible)
-
- self._start_cloud_flow_message = None # type: Optional[Message]
- self._cloud_flow_complete_message = None # type: Optional[Message]
-
- def getDiscoveredDevices(self):
- return self._discovered_devices
-
- def getLastManualDevice(self) -> str:
- return self._last_manual_entry_key
-
- def resetLastManualDevice(self) -> None:
- self._last_manual_entry_key = ""
-
- ## Start looking for devices on network.
+ ## Start looking for devices in the network and cloud.
def start(self):
- self.startDiscovery()
+ self._network_output_device_manager.start()
self._cloud_output_device_manager.start()
- def startDiscovery(self):
- self.stop()
- if self._zero_conf_browser:
- self._zero_conf_browser.cancel()
- self._zero_conf_browser = None # Force the old ServiceBrowser to be destroyed.
-
- for instance_name in list(self._discovered_devices):
- self._onRemoveDevice(instance_name)
-
- self._zero_conf = Zeroconf()
- self._zero_conf_browser = ServiceBrowser(self._zero_conf, u'_ultimaker._tcp.local.',
- [self._appendServiceChangedRequest])
-
- # Look for manual instances from preference
- for address in self._manual_instances:
- if address:
- self.addManualDevice(address)
- self.resetLastManualDevice()
-
- def reCheckConnections(self):
- active_machine = CuraApplication.getInstance().getGlobalContainerStack()
- if not active_machine:
- return
-
- um_network_key = active_machine.getMetaDataEntry("um_network_key")
-
- for key in self._discovered_devices:
- if key == um_network_key:
- if not self._discovered_devices[key].isConnected():
- Logger.log("d", "Attempting to connect with [%s]" % key)
- # It should already be set, but if it actually connects we know for sure it's supported!
- active_machine.addConfiguredConnectionType(self._discovered_devices[key].connectionType.value)
- self._discovered_devices[key].connect()
- self._discovered_devices[key].connectionStateChanged.connect(self._onDeviceConnectionStateChanged)
- else:
- self._onDeviceConnectionStateChanged(key)
- else:
- if self._discovered_devices[key].isConnected():
- Logger.log("d", "Attempting to close connection with [%s]" % key)
- self._discovered_devices[key].close()
- self._discovered_devices[key].connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged)
-
- def _onDeviceConnectionStateChanged(self, key):
- if key not in self._discovered_devices:
- return
- if self._discovered_devices[key].isConnected():
- # Sometimes the status changes after changing the global container and maybe the device doesn't belong to this machine
- um_network_key = CuraApplication.getInstance().getGlobalContainerStack().getMetaDataEntry("um_network_key")
- if key == um_network_key:
- self.getOutputDeviceManager().addOutputDevice(self._discovered_devices[key])
- self.checkCloudFlowIsPossible()
- else:
- self.getOutputDeviceManager().removeOutputDevice(key)
-
- def stop(self):
- if self._zero_conf is not None:
- Logger.log("d", "zeroconf close...")
- self._zero_conf.close()
+ # Stop network and cloud discovery.
+ def stop(self) -> None:
+ self._network_output_device_manager.stop()
self._cloud_output_device_manager.stop()
- def removeManualDevice(self, key, address = None):
- if key in self._discovered_devices:
- if not address:
- address = self._discovered_devices[key].ipAddress
- self._onRemoveDevice(key)
- self.resetLastManualDevice()
+ ## Restart network discovery.
+ def startDiscovery(self) -> None:
+ self._network_output_device_manager.startDiscovery()
- if address in self._manual_instances:
- self._manual_instances.remove(address)
- self._preferences.setValue("um3networkprinting/manual_instances", ",".join(self._manual_instances))
+ ## Force refreshing the network connections.
+ def refreshConnections(self) -> None:
+ self._network_output_device_manager.refreshConnections()
+ self._cloud_output_device_manager.refreshConnections()
- 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))
+ ## Indicate that this plugin supports adding networked printers manually.
+ def canAddManualDevice(self, address: str = "") -> ManualDeviceAdditionAttempt:
+ return ManualDeviceAdditionAttempt.PRIORITY
- instance_name = "manual:%s" % address
- properties = {
- b"name": address.encode("utf-8"),
- b"address": address.encode("utf-8"),
- b"manual": b"true",
- b"incomplete": b"true",
- b"temporary": b"true" # Still a temporary device until all the info is retrieved in _onNetworkRequestFinished
- }
+ ## Add a networked printer manually based on its network address.
+ def addManualDevice(self, address: str, callback: Optional[Callable[[bool, str], None]] = None) -> None:
+ self._network_output_device_manager.addManualDevice(address, callback)
- if instance_name not in self._discovered_devices:
- # Add a preliminary printer instance
- self._onAddDevice(instance_name, address, properties)
- self._last_manual_entry_key = instance_name
-
- self._checkManualDevice(address)
-
- def _checkManualDevice(self, address):
- # 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)
-
- def _onNetworkRequestFinished(self, reply):
- 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
-
- 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()
- has_cluster_capable_firmware = Version(system_info["firmware"]) > self._min_cluster_version
- instance_name = "manual:%s" % address
- properties = {
- b"name": (system_info["name"] + " (manual)").encode("utf-8"),
- b"address": address.encode("utf-8"),
- b"firmware_version": system_info["firmware"].encode("utf-8"),
- b"manual": b"true",
- b"machine": str(system_info['hardware']["typeid"]).encode("utf-8")
- }
-
- if has_cluster_capable_firmware:
- # Cluster needs an additional request, before it's completed.
- properties[b"incomplete"] = b"true"
-
- # Check if the device is still in the list & re-add it with the updated
- # information.
- if instance_name in self._discovered_devices:
- self._onRemoveDevice(instance_name)
- self._onAddDevice(instance_name, address, properties)
-
- if has_cluster_capable_firmware:
- # We need to request more info in order to figure out the size of the cluster.
- cluster_url = QUrl("http://" + address + self._cluster_api_prefix + "printers/")
- cluster_request = QNetworkRequest(cluster_url)
- 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)
- self._onRemoveDevice(instance_name)
- self._onAddDevice(instance_name, address, properties)
-
- def _onRemoveDevice(self, device_id):
- device = self._discovered_devices.pop(device_id, None)
- if device:
- if device.isConnected():
- device.disconnect()
- try:
- device.connectionStateChanged.disconnect(self._onDeviceConnectionStateChanged)
- except TypeError:
- # Disconnect already happened.
- pass
-
- self.discoveredDevicesChanged.emit()
-
- def _onAddDevice(self, name, address, properties):
- # Check what kind of device we need to add; Depending on the firmware we either add a "Connect"/"Cluster"
- # or "Legacy" UM3 device.
- cluster_size = int(properties.get(b"cluster_size", -1))
-
- printer_type = properties.get(b"machine", b"").decode("utf-8")
- printer_type_identifiers = {
- "9066": "ultimaker3",
- "9511": "ultimaker3_extended",
- "9051": "ultimaker_s5"
- }
-
- for key, value in printer_type_identifiers.items():
- if printer_type.startswith(key):
- properties[b"printer_type"] = bytes(value, encoding="utf8")
- break
- else:
- properties[b"printer_type"] = b"Unknown"
- if cluster_size >= 0:
- device = ClusterUM3OutputDevice.ClusterUM3OutputDevice(name, address, properties)
- else:
- device = LegacyUM3OutputDevice.LegacyUM3OutputDevice(name, address, properties)
-
- self._discovered_devices[device.getId()] = device
- self.discoveredDevicesChanged.emit()
-
- global_container_stack = CuraApplication.getInstance().getGlobalContainerStack()
- if global_container_stack and device.getId() == global_container_stack.getMetaDataEntry("um_network_key"):
- # Ensure that the configured connection type is set.
- global_container_stack.addConfiguredConnectionType(device.connectionType.value)
- device.connect()
- device.connectionStateChanged.connect(self._onDeviceConnectionStateChanged)
-
- ## Appends a service changed request so later the handling thread will pick it up and processes it.
- def _appendServiceChangedRequest(self, zeroconf, service_type, name, state_change):
- # append the request and set the event so the event handling thread can pick it up
- item = (zeroconf, service_type, name, state_change)
- self._service_changed_request_queue.put(item)
- self._service_changed_request_event.set()
-
- def _handleOnServiceChangedRequests(self):
- while True:
- # Wait for the event to be set
- self._service_changed_request_event.wait(timeout = 5.0)
-
- # Stop if the application is shutting down
- if CuraApplication.getInstance().isShuttingDown():
- return
-
- self._service_changed_request_event.clear()
-
- # Handle all pending requests
- reschedule_requests = [] # A list of requests that have failed so later they will get re-scheduled
- while not self._service_changed_request_queue.empty():
- request = self._service_changed_request_queue.get()
- zeroconf, service_type, name, state_change = request
- try:
- result = self._onServiceChanged(zeroconf, service_type, name, state_change)
- if not result:
- reschedule_requests.append(request)
- except Exception:
- Logger.logException("e", "Failed to get service info for [%s] [%s], the request will be rescheduled",
- service_type, name)
- reschedule_requests.append(request)
-
- # Re-schedule the failed requests if any
- if reschedule_requests:
- for request in reschedule_requests:
- self._service_changed_request_queue.put(request)
-
- ## Handler for zeroConf detection.
- # Return True or False indicating if the process succeeded.
- # Note that this function can take over 3 seconds to complete. Be careful
- # calling it from the main thread.
- def _onServiceChanged(self, zero_conf, service_type, name, state_change):
- if state_change == ServiceStateChange.Added:
- # First try getting info from zero-conf cache
- info = ServiceInfo(service_type, name, properties = {})
- for record in zero_conf.cache.entries_with_name(name.lower()):
- info.update_record(zero_conf, time(), record)
-
- for record in zero_conf.cache.entries_with_name(info.server):
- info.update_record(zero_conf, time(), record)
- if info.address:
- break
-
- # Request more data if info is not complete
- if not info.address:
- info = zero_conf.get_service_info(service_type, name)
-
- if info:
- type_of_device = info.properties.get(b"type", None)
- if type_of_device:
- if type_of_device == b"printer":
- address = '.'.join(map(lambda n: str(n), info.address))
- self.addDeviceSignal.emit(str(name), address, info.properties)
- else:
- Logger.log("w",
- "The type of the found device is '%s', not 'printer'! Ignoring.." % type_of_device)
- else:
- Logger.log("w", "Could not get information about %s" % name)
- return False
-
- elif state_change == ServiceStateChange.Removed:
- Logger.log("d", "Bonjour service removed: %s" % name)
- self.removeDeviceSignal.emit(str(name))
-
- return True
-
- ## Check if the prerequsites are in place to start the cloud flow
- def checkCloudFlowIsPossible(self) -> 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"]
- 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.")
- return
-
- # Check 1B: Printer isn't already configured for cloud
- if active_machine.getMetaDataEntry("cloud_flow_complete", False):
- Logger.log("d", "Active machine was already configured for cloud.")
- return
-
- # Check 2: User did not already say "Don't ask me again"
- if active_machine.getMetaDataEntry("do_not_show_cloud_message", False):
- Logger.log("d", "Active machine shouldn't ask about cloud anymore.")
- return
+ ## Remove a manually connected networked printer.
+ def removeManualDevice(self, key: str, address: Optional[str] = None) -> None:
+ self._network_output_device_manager.removeManualDevice(key, address)
- # Check 3: User is logged in with an Ultimaker account
- if not self._account.isLoggedIn:
- Logger.log("d", "Cloud Flow not possible: User not logged in!")
- return
+ ## Get the discovered devices from the local network.
+ def getDiscoveredDevices(self) -> Dict[str, LocalClusterOutputDevice]:
+ return self._network_output_device_manager.getDiscoveredDevices()
- # Check 4: Machine is configured for network connectivity
- if not self._application.getMachineManager().activeMachineHasNetworkConnection:
- Logger.log("d", "Cloud Flow not possible: Machine is not connected!")
- return
-
- # Check 5: Machine has correct firmware version
- firmware_version = self._application.getMachineManager().activeMachineFirmwareVersion # type: str
- if not Version(firmware_version) > self._min_cloud_version:
- Logger.log("d", "Cloud Flow not possible: Machine firmware (%s) is too low! (Requires version %s)",
- firmware_version,
- self._min_cloud_version)
- return
-
- Logger.log("d", "Cloud flow is possible!")
- self.cloudFlowIsPossible.emit()
-
- def _onCloudFlowPossible(self) -> None:
- # Cloud flow is possible, so show the message
- if not self._start_cloud_flow_message:
- 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:
- # 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()
-
- # 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:
- active_machine.setMetaDataEntry("do_not_show_cloud_message", True)
- return
-
- def _onDontAskMeAgain(self, checked: bool) -> None:
- active_machine = self._application.getMachineManager().activeMachine # type: Optional["GlobalStack"]
- if active_machine:
- active_machine.setMetaDataEntry("do_not_show_cloud_message", checked)
- if checked:
- Logger.log("d", "Will not ask the user again to cloud connect for current printer.")
- return
-
- def _onCloudFlowStarted(self, messageId: str, actionId: str) -> None:
- address = self._application.getMachineManager().activeMachineAddress # type: str
- if address:
- QDesktopServices.openUrl(QUrl("http://" + address + "/cloud_connect"))
- if self._start_cloud_flow_message:
- self._start_cloud_flow_message.hide()
- self._start_cloud_flow_message = None
- return
-
- def _onReviewCloudConnection(self, messageId: str, actionId: str) -> None:
- address = self._application.getMachineManager().activeMachineAddress # type: str
- if address:
- QDesktopServices.openUrl(QUrl("http://" + address + "/settings"))
- return
-
- def _onMachineSwitched(self) -> 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()
- if self._cloud_flow_complete_message is not None and self._cloud_flow_complete_message.visible:
- self._cloud_flow_complete_message.hide()
-
- # Check for cloud flow again with newly selected machine
- self.checkCloudFlowIsPossible()
-
- 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
+ ## Connect the active machine to a device.
+ def associateActiveMachineWithPrinterDevice(self, device: LocalClusterOutputDevice) -> None:
+ self._network_output_device_manager.associateActiveMachineWithPrinterDevice(device)
diff --git a/plugins/UM3NetworkPrinting/src/UltimakerNetworkedPrinterAction.py b/plugins/UM3NetworkPrinting/src/UltimakerNetworkedPrinterAction.py
new file mode 100644
index 0000000000..8c5f5c12ea
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/UltimakerNetworkedPrinterAction.py
@@ -0,0 +1,87 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from typing import Optional, cast
+
+from PyQt5.QtCore import pyqtSlot, pyqtSignal, pyqtProperty, QObject
+
+from UM import i18nCatalog
+from cura.CuraApplication import CuraApplication
+from cura.MachineAction import MachineAction
+
+from .UM3OutputDevicePlugin import UM3OutputDevicePlugin
+from .Network.LocalClusterOutputDevice import LocalClusterOutputDevice
+
+
+I18N_CATALOG = i18nCatalog("cura")
+
+
+## Machine action that allows to connect the active machine to a networked devices.
+# TODO: in the future this should be part of the new discovery workflow baked into Cura.
+class UltimakerNetworkedPrinterAction(MachineAction):
+
+ # Signal emitted when discovered devices have changed.
+ discoveredDevicesChanged = pyqtSignal()
+
+ def __init__(self) -> None:
+ super().__init__("DiscoverUM3Action", I18N_CATALOG.i18nc("@action", "Connect via Network"))
+ self._qml_url = "resources/qml/DiscoverUM3Action.qml"
+ self._network_plugin = None # type: Optional[UM3OutputDevicePlugin]
+
+ ## Override the default value.
+ def needsUserInteraction(self) -> bool:
+ return False
+
+ ## Start listening to network discovery events via the plugin.
+ @pyqtSlot(name = "startDiscovery")
+ def startDiscovery(self) -> None:
+ self._networkPlugin.discoveredDevicesChanged.connect(self._onDeviceDiscoveryChanged)
+ self.discoveredDevicesChanged.emit() # trigger at least once to populate the list
+
+ ## Reset the discovered devices.
+ @pyqtSlot(name = "reset")
+ def reset(self) -> None:
+ self.discoveredDevicesChanged.emit() # trigger to reset the list
+
+ ## Reset the discovered devices.
+ @pyqtSlot(name = "restartDiscovery")
+ def restartDiscovery(self) -> None:
+ self._networkPlugin.startDiscovery()
+ self.discoveredDevicesChanged.emit() # trigger to reset the list
+
+ ## Remove a manually added device.
+ @pyqtSlot(str, str, name = "removeManualDevice")
+ def removeManualDevice(self, key: str, address: str) -> None:
+ self._networkPlugin.removeManualDevice(key, address)
+
+ ## Add a new manual device. Can replace an existing one by key.
+ @pyqtSlot(str, str, name = "setManualDevice")
+ def setManualDevice(self, key: str, address: str) -> None:
+ if key != "":
+ self._networkPlugin.removeManualDevice(key)
+ if address != "":
+ self._networkPlugin.addManualDevice(address)
+
+ ## Get the devices discovered in the local network sorted by name.
+ @pyqtProperty("QVariantList", notify = discoveredDevicesChanged)
+ def foundDevices(self):
+ discovered_devices = list(self._networkPlugin.getDiscoveredDevices().values())
+ discovered_devices.sort(key = lambda d: d.name)
+ return discovered_devices
+
+ ## Connect a device selected in the list with the active machine.
+ @pyqtSlot(QObject, name = "associateActiveMachineWithPrinterDevice")
+ def associateActiveMachineWithPrinterDevice(self, device: LocalClusterOutputDevice) -> None:
+ self._networkPlugin.associateActiveMachineWithPrinterDevice(device)
+
+ ## Callback for when the list of discovered devices in the plugin was changed.
+ def _onDeviceDiscoveryChanged(self) -> None:
+ self.discoveredDevicesChanged.emit()
+
+ ## Get the network manager from the plugin.
+ @property
+ def _networkPlugin(self) -> UM3OutputDevicePlugin:
+ if not self._network_plugin:
+ output_device_manager = CuraApplication.getInstance().getOutputDeviceManager()
+ network_plugin = output_device_manager.getOutputDevicePlugin("UM3NetworkPrinting")
+ self._network_plugin = cast(UM3OutputDevicePlugin, network_plugin)
+ return self._network_plugin
diff --git a/plugins/UM3NetworkPrinting/src/UltimakerNetworkedPrinterOutputDevice.py b/plugins/UM3NetworkPrinting/src/UltimakerNetworkedPrinterOutputDevice.py
new file mode 100644
index 0000000000..02ce91800d
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/UltimakerNetworkedPrinterOutputDevice.py
@@ -0,0 +1,344 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+import os
+from time import time
+from typing import List, Optional, Dict
+
+from PyQt5.QtCore import pyqtProperty, pyqtSignal, QObject, pyqtSlot, QUrl
+
+from UM.Logger import Logger
+from UM.Qt.Duration import Duration, DurationFormat
+from cura.CuraApplication import CuraApplication
+from cura.PrinterOutput.Models.PrinterOutputModel import PrinterOutputModel
+from cura.PrinterOutput.NetworkedPrinterOutputDevice import NetworkedPrinterOutputDevice, AuthState
+from cura.PrinterOutput.PrinterOutputDevice import ConnectionType, ConnectionState
+
+from .Utils import formatTimeCompleted, formatDateCompleted
+from .ClusterOutputController import ClusterOutputController
+from .Messages.PrintJobUploadProgressMessage import PrintJobUploadProgressMessage
+from .Messages.NotClusterHostMessage import NotClusterHostMessage
+from .Models.UM3PrintJobOutputModel import UM3PrintJobOutputModel
+from .Models.Http.ClusterPrinterStatus import ClusterPrinterStatus
+from .Models.Http.ClusterPrintJobStatus import ClusterPrintJobStatus
+
+
+## Output device class that forms the basis of Ultimaker networked printer output devices.
+# Currently used for local networking and cloud printing using Ultimaker Connect.
+# This base class primarily contains all the Qt properties and slots needed for the monitor page to work.
+class UltimakerNetworkedPrinterOutputDevice(NetworkedPrinterOutputDevice):
+
+ META_NETWORK_KEY = "um_network_key"
+ META_CLUSTER_ID = "um_cloud_cluster_id"
+
+ # Signal emitted when the status of the print jobs for this cluster were changed over the network.
+ printJobsChanged = pyqtSignal()
+
+ # Signal emitted when the currently visible printer card in the UI was changed by the user.
+ activePrinterChanged = pyqtSignal()
+
+ # Notify can only use signals that are defined by the class that they are in, not inherited ones.
+ # Therefore we create a private signal used to trigger the printersChanged signal.
+ _clusterPrintersChanged = pyqtSignal()
+
+ # States indicating if a print job is queued.
+ QUEUED_PRINT_JOBS_STATES = {"queued", "error"}
+
+ # Time in seconds since last network response after which we consider this device offline.
+ # We set this a bit higher than some of the other intervals to make sure they don't overlap.
+ NETWORK_RESPONSE_CONSIDER_OFFLINE = 10.0 # seconds
+
+ def __init__(self, device_id: str, address: str, properties: Dict[bytes, bytes], connection_type: ConnectionType,
+ parent=None) -> None:
+
+ super().__init__(device_id=device_id, address=address, properties=properties, connection_type=connection_type,
+ parent=parent)
+
+ # Trigger the printersChanged signal when the private signal is triggered.
+ self.printersChanged.connect(self._clusterPrintersChanged)
+
+ # Keeps track the last network response to determine if we are still connected.
+ self._time_of_last_response = time()
+ self._time_of_last_request = time()
+
+ # Set the display name from the properties
+ self.setName(self.getProperty("name"))
+
+ # Keeps track of all printers in the cluster.
+ self._printers = [] # type: List[PrinterOutputModel]
+ self._has_received_printers = False
+
+ # Keeps track of all print jobs in the cluster.
+ self._print_jobs = [] # type: List[UM3PrintJobOutputModel]
+
+ # Keep track of the printer currently selected in the UI.
+ self._active_printer = None # type: Optional[PrinterOutputModel]
+
+ # By default we are not authenticated. This state will be changed later.
+ self._authentication_state = AuthState.NotAuthenticated
+
+ # Load the Monitor UI elements.
+ self._loadMonitorTab()
+
+ # The job upload progress message modal.
+ self._progress = PrintJobUploadProgressMessage()
+
+ ## The IP address of the printer.
+ @pyqtProperty(str, constant=True)
+ def address(self) -> str:
+ return self._address
+
+ # Get all print jobs for this cluster.
+ @pyqtProperty("QVariantList", notify=printJobsChanged)
+ def printJobs(self) -> List[UM3PrintJobOutputModel]:
+ return self._print_jobs
+
+ # Get all print jobs for this cluster that are queued.
+ @pyqtProperty("QVariantList", notify=printJobsChanged)
+ def queuedPrintJobs(self) -> List[UM3PrintJobOutputModel]:
+ return [print_job for print_job in self._print_jobs if print_job.state in self.QUEUED_PRINT_JOBS_STATES]
+
+ # Get all print jobs for this cluster that are currently printing.
+ @pyqtProperty("QVariantList", notify=printJobsChanged)
+ def activePrintJobs(self) -> List[UM3PrintJobOutputModel]:
+ return [print_job for print_job in self._print_jobs if
+ print_job.assignedPrinter is not None and print_job.state not in self.QUEUED_PRINT_JOBS_STATES]
+
+ @pyqtProperty(bool, notify=_clusterPrintersChanged)
+ def receivedData(self) -> bool:
+ return self._has_received_printers
+
+ # Get the amount of printers in the cluster.
+ @pyqtProperty(int, notify=_clusterPrintersChanged)
+ def clusterSize(self) -> int:
+ if not self._has_received_printers:
+ discovered_size = self.getProperty("cluster_size")
+ if discovered_size == "":
+ return 1 # prevent false positives for new devices
+ return int(discovered_size)
+ return len(self._printers)
+
+ # Get the amount of printer in the cluster per type.
+ @pyqtProperty("QVariantList", notify=_clusterPrintersChanged)
+ def connectedPrintersTypeCount(self) -> List[Dict[str, str]]:
+ printer_count = {} # type: Dict[str, int]
+ for printer in self._printers:
+ if printer.type in printer_count:
+ printer_count[printer.type] += 1
+ else:
+ printer_count[printer.type] = 1
+ result = []
+ for machine_type in printer_count:
+ result.append({"machine_type": machine_type, "count": str(printer_count[machine_type])})
+ return result
+
+ # Get a list of all printers.
+ @pyqtProperty("QVariantList", notify=_clusterPrintersChanged)
+ def printers(self) -> List[PrinterOutputModel]:
+ return self._printers
+
+ # Get the currently active printer in the UI.
+ @pyqtProperty(QObject, notify=activePrinterChanged)
+ def activePrinter(self) -> Optional[PrinterOutputModel]:
+ return self._active_printer
+
+ # Set the currently active printer from the UI.
+ @pyqtSlot(QObject, name="setActivePrinter")
+ def setActivePrinter(self, printer: Optional[PrinterOutputModel]) -> None:
+ if self.activePrinter == printer:
+ return
+ self._active_printer = printer
+ self.activePrinterChanged.emit()
+
+ ## Whether the printer that this output device represents supports print job actions via the local network.
+ @pyqtProperty(bool, constant=True)
+ def supportsPrintJobActions(self) -> bool:
+ return True
+
+ ## Set the remote print job state.
+ def setJobState(self, print_job_uuid: str, state: str) -> None:
+ raise NotImplementedError("setJobState must be implemented")
+
+ @pyqtSlot(str, name="sendJobToTop")
+ def sendJobToTop(self, print_job_uuid: str) -> None:
+ raise NotImplementedError("sendJobToTop must be implemented")
+
+ @pyqtSlot(str, name="deleteJobFromQueue")
+ def deleteJobFromQueue(self, print_job_uuid: str) -> None:
+ raise NotImplementedError("deleteJobFromQueue must be implemented")
+
+ @pyqtSlot(str, name="forceSendJob")
+ def forceSendJob(self, print_job_uuid: str) -> None:
+ raise NotImplementedError("forceSendJob must be implemented")
+
+ @pyqtSlot(name="openPrintJobControlPanel")
+ def openPrintJobControlPanel(self) -> None:
+ raise NotImplementedError("openPrintJobControlPanel must be implemented")
+
+ @pyqtSlot(name="openPrinterControlPanel")
+ def openPrinterControlPanel(self) -> None:
+ raise NotImplementedError("openPrinterControlPanel must be implemented")
+
+ @pyqtProperty(QUrl, notify=_clusterPrintersChanged)
+ def activeCameraUrl(self) -> QUrl:
+ return QUrl()
+
+ @pyqtSlot(QUrl, name="setActiveCameraUrl")
+ def setActiveCameraUrl(self, camera_url: QUrl) -> None:
+ pass
+
+ @pyqtSlot(int, result=str, name="getTimeCompleted")
+ def getTimeCompleted(self, time_remaining: int) -> str:
+ return formatTimeCompleted(time_remaining)
+
+ @pyqtSlot(int, result=str, name="getDateCompleted")
+ def getDateCompleted(self, time_remaining: int) -> str:
+ return formatDateCompleted(time_remaining)
+
+ @pyqtSlot(int, result=str, name="formatDuration")
+ def formatDuration(self, seconds: int) -> str:
+ return Duration(seconds).getDisplayString(DurationFormat.Format.Short)
+
+ def _update(self) -> None:
+ self._checkStillConnected()
+ super()._update()
+
+ ## Check if we're still connected by comparing the last timestamps for network response and the current time.
+ # This implementation is similar to the base NetworkedPrinterOutputDevice, but is tweaked slightly.
+ # Re-connecting is handled automatically by the output device managers in this plugin.
+ # TODO: it would be nice to have this logic in the managers, but connecting those with signals causes crashes.
+ def _checkStillConnected(self) -> None:
+ time_since_last_response = time() - self._time_of_last_response
+ if time_since_last_response > self.NETWORK_RESPONSE_CONSIDER_OFFLINE:
+ self.setConnectionState(ConnectionState.Closed)
+ if self.key in CuraApplication.getInstance().getOutputDeviceManager().getOutputDeviceIds():
+ CuraApplication.getInstance().getOutputDeviceManager().removeOutputDevice(self.key)
+ elif self.connectionState == ConnectionState.Closed:
+ self._reconnectForActiveMachine()
+
+ ## Reconnect for the active output device.
+ # Does nothing if the device is not meant for the active machine.
+ def _reconnectForActiveMachine(self) -> None:
+ active_machine = CuraApplication.getInstance().getGlobalContainerStack()
+ if not active_machine:
+ return
+
+ # Indicate this device is now connected again.
+ self.setConnectionState(ConnectionState.Connected)
+
+ # If the device was already registered we don't need to register it again.
+ if self.key in CuraApplication.getInstance().getOutputDeviceManager().getOutputDeviceIds():
+ return
+
+ # Try for local network device.
+ stored_device_id = active_machine.getMetaDataEntry(self.META_NETWORK_KEY)
+ if self.key == stored_device_id:
+ CuraApplication.getInstance().getOutputDeviceManager().addOutputDevice(self)
+
+ # Try for cloud device.
+ stored_cluster_id = active_machine.getMetaDataEntry(self.META_CLUSTER_ID)
+ if self.key == stored_cluster_id:
+ CuraApplication.getInstance().getOutputDeviceManager().addOutputDevice(self)
+
+ def _responseReceived(self) -> None:
+ self._time_of_last_response = time()
+
+ def _updatePrinters(self, remote_printers: List[ClusterPrinterStatus]) -> None:
+ self._responseReceived()
+
+ # Keep track of the new printers to show.
+ # We create a new list instead of changing the existing one to get the correct order.
+ new_printers = [] # type: List[PrinterOutputModel]
+
+ # Check which printers need to be created or updated.
+ for index, printer_data in enumerate(remote_printers):
+ printer = next(iter(printer for printer in self._printers if printer.key == printer_data.uuid), None)
+ if printer is None:
+ printer = printer_data.createOutputModel(ClusterOutputController(self))
+ else:
+ printer_data.updateOutputModel(printer)
+ new_printers.append(printer)
+
+ # Check which printers need to be removed (de-referenced).
+ remote_printers_keys = [printer_data.uuid for printer_data in remote_printers]
+ removed_printers = [printer for printer in self._printers if printer.key not in remote_printers_keys]
+ for removed_printer in removed_printers:
+ if self._active_printer and self._active_printer.key == removed_printer.key:
+ self.setActivePrinter(None)
+
+ self._printers = new_printers
+ self._has_received_printers = True
+ if self._printers and not self.activePrinter:
+ self.setActivePrinter(self._printers[0])
+
+ self.printersChanged.emit()
+ self._checkIfClusterHost()
+
+ ## Check is this device is a cluster host and takes the needed actions when it is not.
+ def _checkIfClusterHost(self):
+ if len(self._printers) < 1 and self.isConnected():
+ NotClusterHostMessage(self).show()
+ self.close()
+ CuraApplication.getInstance().getOutputDeviceManager().removeOutputDevice(self.key)
+
+ ## Updates the local list of print jobs with the list received from the cluster.
+ # \param remote_jobs: The print jobs received from the cluster.
+ def _updatePrintJobs(self, remote_jobs: List[ClusterPrintJobStatus]) -> None:
+ self._responseReceived()
+
+ # Keep track of the new print jobs to show.
+ # We create a new list instead of changing the existing one to get the correct order.
+ new_print_jobs = []
+
+ # Check which print jobs need to be created or updated.
+ for index, print_job_data in enumerate(remote_jobs):
+ print_job = next(
+ iter(print_job for print_job in self._print_jobs if print_job.key == print_job_data.uuid), None)
+ if not print_job:
+ new_print_jobs.append(self._createPrintJobModel(print_job_data))
+ else:
+ print_job_data.updateOutputModel(print_job)
+ if print_job_data.printer_uuid:
+ self._updateAssignedPrinter(print_job, print_job_data.printer_uuid)
+ if print_job_data.assigned_to:
+ self._updateAssignedPrinter(print_job, print_job_data.assigned_to)
+ new_print_jobs.append(print_job)
+
+ # Check which print job need to be removed (de-referenced).
+ remote_job_keys = [print_job_data.uuid for print_job_data in remote_jobs]
+ removed_jobs = [print_job for print_job in self._print_jobs if print_job.key not in remote_job_keys]
+ for removed_job in removed_jobs:
+ if removed_job.assignedPrinter:
+ removed_job.assignedPrinter.updateActivePrintJob(None)
+
+ self._print_jobs = new_print_jobs
+ self.printJobsChanged.emit()
+
+ ## Create a new print job model based on the remote status of the job.
+ # \param remote_job: The remote print job data.
+ def _createPrintJobModel(self, remote_job: ClusterPrintJobStatus) -> UM3PrintJobOutputModel:
+ model = remote_job.createOutputModel(ClusterOutputController(self))
+ if remote_job.printer_uuid:
+ self._updateAssignedPrinter(model, remote_job.printer_uuid)
+ if remote_job.assigned_to:
+ self._updateAssignedPrinter(model, remote_job.assigned_to)
+ return model
+
+ ## Updates the printer assignment for the given print job model.
+ def _updateAssignedPrinter(self, model: UM3PrintJobOutputModel, printer_uuid: str) -> None:
+ printer = next((p for p in self._printers if printer_uuid == p.key), None)
+ if not printer:
+ return
+ printer.updateActivePrintJob(model)
+ model.updateAssignedPrinter(printer)
+
+ ## Load Monitor tab QML.
+ def _loadMonitorTab(self) -> None:
+ plugin_registry = CuraApplication.getInstance().getPluginRegistry()
+ if not plugin_registry:
+ Logger.log("e", "Could not get plugin registry")
+ return
+ plugin_path = plugin_registry.getPluginPath("UM3NetworkPrinting")
+ if not plugin_path:
+ Logger.log("e", "Could not get plugin path")
+ return
+ self._monitor_view_qml_path = os.path.join(plugin_path, "resources", "qml", "MonitorStage.qml")
diff --git a/plugins/UM3NetworkPrinting/src/Utils.py b/plugins/UM3NetworkPrinting/src/Utils.py
new file mode 100644
index 0000000000..a628130416
--- /dev/null
+++ b/plugins/UM3NetworkPrinting/src/Utils.py
@@ -0,0 +1,30 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+from datetime import datetime, timedelta
+
+from UM import i18nCatalog
+
+
+def formatTimeCompleted(seconds_remaining: int) -> str:
+ completed = datetime.now() + timedelta(seconds=seconds_remaining)
+ return "{hour:02d}:{minute:02d}".format(hour = completed.hour, minute = completed.minute)
+
+
+def formatDateCompleted(seconds_remaining: int) -> str:
+ now = datetime.now()
+ completed = now + timedelta(seconds=seconds_remaining)
+ days = (completed.date() - now.date()).days
+ i18n = i18nCatalog("cura")
+
+ # If finishing date is more than 7 days out, using "Mon Dec 3 at HH:MM" format
+ if days >= 7:
+ return completed.strftime("%a %b ") + "{day}".format(day = completed.day)
+ # If finishing date is within the next week, use "Monday at HH:MM" format
+ elif days >= 2:
+ return completed.strftime("%a")
+ # If finishing tomorrow, use "tomorrow at HH:MM" format
+ elif days >= 1:
+ return i18n.i18nc("@info:status", "tomorrow")
+ # If finishing today, use "today at HH:MM" format
+ else:
+ return i18n.i18nc("@info:status", "today")
diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/Fixtures/__init__.py b/plugins/UM3NetworkPrinting/tests/Cloud/Fixtures/__init__.py
deleted file mode 100644
index 777afc92c2..0000000000
--- a/plugins/UM3NetworkPrinting/tests/Cloud/Fixtures/__init__.py
+++ /dev/null
@@ -1,12 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-import json
-import os
-
-
-def readFixture(fixture_name: str) -> bytes:
- with open("{}/{}.json".format(os.path.dirname(__file__), fixture_name), "rb") as f:
- return f.read()
-
-def parseFixture(fixture_name: str) -> dict:
- return json.loads(readFixture(fixture_name).decode())
diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/Fixtures/getClusterStatusResponse.json b/plugins/UM3NetworkPrinting/tests/Cloud/Fixtures/getClusterStatusResponse.json
deleted file mode 100644
index 4f9f47fc75..0000000000
--- a/plugins/UM3NetworkPrinting/tests/Cloud/Fixtures/getClusterStatusResponse.json
+++ /dev/null
@@ -1,95 +0,0 @@
-{
- "data": {
- "generated_time": "2018-12-10T08:23:55.110Z",
- "printers": [
- {
- "configuration": [
- {
- "extruder_index": 0,
- "material": {
- "material": "empty"
- },
- "print_core_id": "AA 0.4"
- },
- {
- "extruder_index": 1,
- "material": {
- "material": "empty"
- },
- "print_core_id": "AA 0.4"
- }
- ],
- "enabled": true,
- "firmware_version": "5.1.2.20180807",
- "friendly_name": "Master-Luke",
- "ip_address": "10.183.1.140",
- "machine_variant": "Ultimaker 3",
- "status": "maintenance",
- "unique_name": "ultimakersystem-ccbdd30044ec",
- "uuid": "b3a47ea3-1eeb-4323-9626-6f9c3c888f9e"
- },
- {
- "configuration": [
- {
- "extruder_index": 0,
- "material": {
- "brand": "Generic",
- "color": "Generic",
- "guid": "506c9f0d-e3aa-4bd4-b2d2-23e2425b1aa9",
- "material": "PLA"
- },
- "print_core_id": "AA 0.4"
- },
- {
- "extruder_index": 1,
- "material": {
- "brand": "Ultimaker",
- "color": "Red",
- "guid": "9cfe5bf1-bdc5-4beb-871a-52c70777842d",
- "material": "PLA"
- },
- "print_core_id": "AA 0.4"
- }
- ],
- "enabled": true,
- "firmware_version": "4.3.3.20180529",
- "friendly_name": "UM-Marijn",
- "ip_address": "10.183.1.166",
- "machine_variant": "Ultimaker 3",
- "status": "idle",
- "unique_name": "ultimakersystem-ccbdd30058ab",
- "uuid": "6e62c40a-4601-4b0e-9fec-c7c02c59c30a"
- }
- ],
- "print_jobs": [
- {
- "assigned_to": "6e62c40a-4601-4b0e-9fec-c7c02c59c30a",
- "configuration": [
- {
- "extruder_index": 0,
- "material": {
- "brand": "Ultimaker",
- "color": "Black",
- "guid": "3ee70a86-77d8-4b87-8005-e4a1bc57d2ce",
- "material": "PLA"
- },
- "print_core_id": "AA 0.4"
- }
- ],
- "constraints": {},
- "created_at": "2018-12-10T08:28:04.108Z",
- "force": false,
- "last_seen": 500165.109491861,
- "machine_variant": "Ultimaker 3",
- "name": "UM3_dragon",
- "network_error_count": 0,
- "owner": "Daniel Testing",
- "started": false,
- "status": "queued",
- "time_elapsed": 0,
- "time_total": 14145,
- "uuid": "d1c8bd52-5e9f-486a-8c25-a123cc8c7702"
- }
- ]
- }
-}
diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/Fixtures/getClusters.json b/plugins/UM3NetworkPrinting/tests/Cloud/Fixtures/getClusters.json
deleted file mode 100644
index 5200e3b971..0000000000
--- a/plugins/UM3NetworkPrinting/tests/Cloud/Fixtures/getClusters.json
+++ /dev/null
@@ -1,17 +0,0 @@
-{
- "data": [{
- "cluster_id": "RIZ6cZbWA_Ua7RZVJhrdVfVpf0z-MqaSHQE4v8aRTtYq",
- "host_guid": "e90ae0ac-1257-4403-91ee-a44c9b7e8050",
- "host_name": "ultimakersystem-ccbdd30044ec",
- "host_version": "5.0.0.20170101",
- "is_online": true,
- "status": "active"
- }, {
- "cluster_id": "NWKV6vJP_LdYsXgXqAcaNCR0YcLJwar1ugh0ikEZsZs8",
- "host_guid": "e0ace90a-91ee-1257-4403-e8050a44c9b7",
- "host_name": "ultimakersystem-30044ecccbdd",
- "host_version": "5.1.2.20180807",
- "is_online": true,
- "status": "active"
- }]
-}
diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/Fixtures/postJobPrintResponse.json b/plugins/UM3NetworkPrinting/tests/Cloud/Fixtures/postJobPrintResponse.json
deleted file mode 100644
index caedcd8732..0000000000
--- a/plugins/UM3NetworkPrinting/tests/Cloud/Fixtures/postJobPrintResponse.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "data": {
- "cluster_job_id": "9a59d8e9-91d3-4ff6-b4cb-9db91c4094dd",
- "job_id": "ABCDefGHIjKlMNOpQrSTUvYxWZ0-1234567890abcDE=",
- "status": "queued",
- "generated_time": "2018-12-10T08:23:55.110Z"
- }
-}
diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/Fixtures/putJobUploadResponse.json b/plugins/UM3NetworkPrinting/tests/Cloud/Fixtures/putJobUploadResponse.json
deleted file mode 100644
index 1304f3a9f6..0000000000
--- a/plugins/UM3NetworkPrinting/tests/Cloud/Fixtures/putJobUploadResponse.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
- "data": {
- "content_type": "text/plain",
- "job_id": "ABCDefGHIjKlMNOpQrSTUvYxWZ0-1234567890abcDE=",
- "job_name": "Ultimaker Robot v3.0",
- "status": "uploading",
- "upload_url": "https://api.ultimaker.com/print-job-upload"
- }
-}
diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/Models/__init__.py b/plugins/UM3NetworkPrinting/tests/Cloud/Models/__init__.py
deleted file mode 100644
index f3f6970c54..0000000000
--- a/plugins/UM3NetworkPrinting/tests/Cloud/Models/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/NetworkManagerMock.py b/plugins/UM3NetworkPrinting/tests/Cloud/NetworkManagerMock.py
deleted file mode 100644
index e504509d67..0000000000
--- a/plugins/UM3NetworkPrinting/tests/Cloud/NetworkManagerMock.py
+++ /dev/null
@@ -1,105 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-import json
-from typing import Dict, Tuple, Union, Optional, Any
-from unittest.mock import MagicMock
-
-from PyQt5.QtNetwork import QNetworkAccessManager, QNetworkRequest
-
-from UM.Logger import Logger
-from UM.Signal import Signal
-
-
-class FakeSignal:
- def __init__(self):
- self._callbacks = []
-
- def connect(self, callback):
- self._callbacks.append(callback)
-
- def disconnect(self, callback):
- self._callbacks.remove(callback)
-
- def emit(self, *args, **kwargs):
- for callback in self._callbacks:
- callback(*args, **kwargs)
-
-
-## This class can be used to mock the QNetworkManager class and test the code using it.
-# After patching the QNetworkManager class, requests are prepared before they can be executed.
-# Any requests not prepared beforehand will cause KeyErrors.
-class NetworkManagerMock:
-
- # An enumeration of the supported operations and their code for the network access manager.
- _OPERATIONS = {
- "GET": QNetworkAccessManager.GetOperation,
- "POST": QNetworkAccessManager.PostOperation,
- "PUT": QNetworkAccessManager.PutOperation,
- "DELETE": QNetworkAccessManager.DeleteOperation,
- "HEAD": QNetworkAccessManager.HeadOperation,
- } # type: Dict[str, int]
-
- ## Initializes the network manager mock.
- def __init__(self) -> None:
- # A dict with the prepared replies, using the format {(http_method, url): reply}
- self.replies = {} # type: Dict[Tuple[str, str], MagicMock]
- self.request_bodies = {} # type: Dict[Tuple[str, str], bytes]
-
- # Signals used in the network manager.
- self.finished = Signal()
- self.authenticationRequired = Signal()
-
- ## Mock implementation of the get, post, put, delete and head methods from the network manager.
- # Since the methods are very simple and the same it didn't make sense to repeat the code.
- # \param method: The method being called.
- # \return The mocked function, if the method name is known. Defaults to the standard getattr function.
- def __getattr__(self, method: str) -> Any:
- ## This mock implementation will simply return the reply from the prepared ones.
- # it raises a KeyError if requests are done without being prepared.
- def doRequest(request: QNetworkRequest, body: Optional[bytes] = None, *_):
- key = method.upper(), request.url().toString()
- if body:
- self.request_bodies[key] = body
- return self.replies[key]
-
- operation = self._OPERATIONS.get(method.upper())
- if operation:
- return doRequest
-
- # the attribute is not one of the implemented methods, default to the standard implementation.
- return getattr(super(), method)
-
- ## Prepares a server reply for the given parameters.
- # \param method: The HTTP method.
- # \param url: The URL being requested.
- # \param status_code: The HTTP status code for the response.
- # \param response: The response body from the server (generally json-encoded).
- def prepareReply(self, method: str, url: str, status_code: int, response: Union[bytes, dict]) -> None:
- reply_mock = MagicMock()
- reply_mock.url().toString.return_value = url
- reply_mock.operation.return_value = self._OPERATIONS[method]
- reply_mock.attribute.return_value = status_code
- reply_mock.finished = FakeSignal()
- reply_mock.isFinished.return_value = False
- reply_mock.readAll.return_value = response if isinstance(response, bytes) else json.dumps(response).encode()
- self.replies[method, url] = reply_mock
- Logger.log("i", "Prepared mock {}-response to {} {}", status_code, method, url)
-
- ## Gets the request that was sent to the network manager for the given method and URL.
- # \param method: The HTTP method.
- # \param url: The URL.
- def getRequestBody(self, method: str, url: str) -> Optional[bytes]:
- return self.request_bodies.get((method.upper(), url))
-
- ## Emits the signal that the reply is ready to all prepared replies.
- def flushReplies(self) -> None:
- for key, reply in self.replies.items():
- Logger.log("i", "Flushing reply to {} {}", *key)
- reply.isFinished.return_value = True
- reply.finished.emit()
- self.finished.emit(reply)
- self.reset()
-
- ## Deletes all prepared replies
- def reset(self) -> None:
- self.replies.clear()
diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudApiClient.py b/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudApiClient.py
deleted file mode 100644
index b79d009c31..0000000000
--- a/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudApiClient.py
+++ /dev/null
@@ -1,117 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-from typing import List
-from unittest import TestCase
-from unittest.mock import patch, MagicMock
-
-from cura.UltimakerCloudAuthentication import CuraCloudAPIRoot
-from ...src.Cloud import CloudApiClient
-from ...src.Cloud.Models.CloudClusterResponse import CloudClusterResponse
-from ...src.Cloud.Models.CloudClusterStatus import CloudClusterStatus
-from ...src.Cloud.Models.CloudPrintJobResponse import CloudPrintJobResponse
-from ...src.Cloud.Models.CloudPrintJobUploadRequest import CloudPrintJobUploadRequest
-from ...src.Cloud.Models.CloudError import CloudError
-from .Fixtures import readFixture, parseFixture
-from .NetworkManagerMock import NetworkManagerMock
-
-
-class TestCloudApiClient(TestCase):
- maxDiff = None
-
- def _errorHandler(self, errors: List[CloudError]):
- raise Exception("Received unexpected error: {}".format(errors))
-
- def setUp(self):
- super().setUp()
- self.account = MagicMock()
- self.account.isLoggedIn.return_value = True
-
- self.network = NetworkManagerMock()
- with patch.object(CloudApiClient, 'QNetworkAccessManager', return_value = self.network):
- self.api = CloudApiClient.CloudApiClient(self.account, self._errorHandler)
-
- def test_getClusters(self):
- result = []
-
- response = readFixture("getClusters")
- data = parseFixture("getClusters")["data"]
-
- self.network.prepareReply("GET", CuraCloudAPIRoot + "/connect/v1/clusters", 200, response)
- # The callback is a function that adds the result of the call to getClusters to the result list
- self.api.getClusters(lambda clusters: result.extend(clusters))
-
- self.network.flushReplies()
-
- self.assertEqual([CloudClusterResponse(**data[0]), CloudClusterResponse(**data[1])], result)
-
- def test_getClusterStatus(self):
- result = []
-
- response = readFixture("getClusterStatusResponse")
- data = parseFixture("getClusterStatusResponse")["data"]
-
- url = CuraCloudAPIRoot + "/connect/v1/clusters/R0YcLJwar1ugh0ikEZsZs8NWKV6vJP_LdYsXgXqAcaNC/status"
- self.network.prepareReply("GET", url, 200, response)
- self.api.getClusterStatus("R0YcLJwar1ugh0ikEZsZs8NWKV6vJP_LdYsXgXqAcaNC", lambda s: result.append(s))
-
- self.network.flushReplies()
-
- self.assertEqual([CloudClusterStatus(**data)], result)
-
- def test_requestUpload(self):
-
- results = []
-
- response = readFixture("putJobUploadResponse")
-
- self.network.prepareReply("PUT", CuraCloudAPIRoot + "/cura/v1/jobs/upload", 200, response)
- request = CloudPrintJobUploadRequest(job_name = "job name", file_size = 143234, content_type = "text/plain")
- self.api.requestUpload(request, lambda r: results.append(r))
- self.network.flushReplies()
-
- self.assertEqual(["text/plain"], [r.content_type for r in results])
- self.assertEqual(["uploading"], [r.status for r in results])
-
- def test_uploadToolPath(self):
-
- results = []
- progress = MagicMock()
-
- data = parseFixture("putJobUploadResponse")["data"]
- upload_response = CloudPrintJobResponse(**data)
-
- # Network client doesn't look into the reply
- self.network.prepareReply("PUT", upload_response.upload_url, 200, b'{}')
-
- mesh = ("1234" * 100000).encode()
- self.api.uploadToolPath(upload_response, mesh, lambda: results.append("sent"), progress.advance, progress.error)
-
- for _ in range(10):
- self.network.flushReplies()
- self.network.prepareReply("PUT", upload_response.upload_url, 200, b'{}')
-
- self.assertEqual(["sent"], results)
-
- def test_requestPrint(self):
-
- results = []
-
- response = readFixture("postJobPrintResponse")
-
- cluster_id = "NWKV6vJP_LdYsXgXqAcaNCR0YcLJwar1ugh0ikEZsZs8"
- cluster_job_id = "9a59d8e9-91d3-4ff6-b4cb-9db91c4094dd"
- job_id = "ABCDefGHIjKlMNOpQrSTUvYxWZ0-1234567890abcDE="
-
- self.network.prepareReply("POST",
- CuraCloudAPIRoot + "/connect/v1/clusters/{}/print/{}"
- .format(cluster_id, job_id),
- 200, response)
-
- self.api.requestPrint(cluster_id, job_id, lambda r: results.append(r))
-
- self.network.flushReplies()
-
- self.assertEqual([job_id], [r.job_id for r in results])
- self.assertEqual([cluster_job_id], [r.cluster_job_id for r in results])
- self.assertEqual(["queued"], [r.status for r in results])
diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py b/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py
deleted file mode 100644
index c4d891302e..0000000000
--- a/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDevice.py
+++ /dev/null
@@ -1,155 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-import json
-from unittest import TestCase
-from unittest.mock import patch, MagicMock
-
-from UM.Scene.SceneNode import SceneNode
-from cura.UltimakerCloudAuthentication import CuraCloudAPIRoot
-from cura.PrinterOutput.PrinterOutputModel import PrinterOutputModel
-from ...src.Cloud import CloudApiClient
-from ...src.Cloud.CloudOutputDevice import CloudOutputDevice
-from ...src.Cloud.Models.CloudClusterResponse import CloudClusterResponse
-from .Fixtures import readFixture, parseFixture
-from .NetworkManagerMock import NetworkManagerMock
-
-
-class TestCloudOutputDevice(TestCase):
- maxDiff = None
-
- CLUSTER_ID = "RIZ6cZbWA_Ua7RZVJhrdVfVpf0z-MqaSHQE4v8aRTtYq"
- JOB_ID = "ABCDefGHIjKlMNOpQrSTUvYxWZ0-1234567890abcDE="
- HOST_NAME = "ultimakersystem-ccbdd30044ec"
- HOST_GUID = "e90ae0ac-1257-4403-91ee-a44c9b7e8050"
- HOST_VERSION = "5.2.0"
-
- STATUS_URL = "{}/connect/v1/clusters/{}/status".format(CuraCloudAPIRoot, CLUSTER_ID)
- PRINT_URL = "{}/connect/v1/clusters/{}/print/{}".format(CuraCloudAPIRoot, CLUSTER_ID, JOB_ID)
- REQUEST_UPLOAD_URL = "{}/cura/v1/jobs/upload".format(CuraCloudAPIRoot)
-
- def setUp(self):
- super().setUp()
- self.app = MagicMock()
-
- self.patches = [patch("UM.Qt.QtApplication.QtApplication.getInstance", return_value=self.app),
- patch("UM.Application.Application.getInstance", return_value=self.app)]
- for patched_method in self.patches:
- 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)
-
- self.network = NetworkManagerMock()
- self.account = MagicMock(isLoggedIn=True, accessToken="TestAccessToken")
- self.onError = MagicMock()
- with patch.object(CloudApiClient, "QNetworkAccessManager", return_value = self.network):
- self._api = CloudApiClient.CloudApiClient(self.account, self.onError)
-
- self.device = CloudOutputDevice(self._api, self.cluster)
- self.cluster_status = parseFixture("getClusterStatusResponse")
- self.network.prepareReply("GET", self.STATUS_URL, 200, readFixture("getClusterStatusResponse"))
-
- def tearDown(self):
- try:
- super().tearDown()
- self.network.flushReplies()
- finally:
- for patched_method in self.patches:
- patched_method.stop()
-
- # 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)
-
- def test_status(self):
- self.device._update()
- self.network.flushReplies()
-
- self.assertEqual([PrinterOutputModel, PrinterOutputModel], [type(printer) for printer in self.device.printers])
-
- controller_fields = {
- "_output_device": self.device,
- "can_abort": False,
- "can_control_manually": False,
- "can_pause": False,
- "can_pre_heat_bed": False,
- "can_pre_heat_hotends": False,
- "can_send_raw_gcode": False,
- "can_update_firmware": False,
- }
-
- self.assertEqual({printer["uuid"] for printer in self.cluster_status["data"]["printers"]},
- {printer.key for printer in self.device.printers})
- self.assertEqual([controller_fields, controller_fields],
- [printer.getController().__dict__ for printer in self.device.printers])
-
- self.assertEqual(["UM3PrintJobOutputModel"], [type(printer).__name__ for printer in self.device.printJobs])
- self.assertEqual({job["uuid"] for job in self.cluster_status["data"]["print_jobs"]},
- {job.key for job in self.device.printJobs})
- self.assertEqual({job["owner"] for job in self.cluster_status["data"]["print_jobs"]},
- {job.owner for job in self.device.printJobs})
- self.assertEqual({job["name"] for job in self.cluster_status["data"]["print_jobs"]},
- {job.name for job in self.device.printJobs})
-
- def test_remove_print_job(self):
- self.device._update()
- self.network.flushReplies()
- self.assertEqual(1, len(self.device.printJobs))
-
- self.cluster_status["data"]["print_jobs"].clear()
- self.network.prepareReply("GET", self.STATUS_URL, 200, self.cluster_status)
-
- self.device._last_request_time = None
- self.device._update()
- self.network.flushReplies()
- self.assertEqual([], self.device.printJobs)
-
- def test_remove_printers(self):
- self.device._update()
- self.network.flushReplies()
- self.assertEqual(2, len(self.device.printers))
-
- self.cluster_status["data"]["printers"].clear()
- self.network.prepareReply("GET", self.STATUS_URL, 200, self.cluster_status)
-
- self.device._last_request_time = None
- self.device._update()
- self.network.flushReplies()
- self.assertEqual([], self.device.printers)
-
- def test_print_to_cloud(self):
- active_machine_mock = self.app.getGlobalContainerStack.return_value
- active_machine_mock.getMetaDataEntry.side_effect = {"file_formats": "application/x-ufp"}.get
-
- request_upload_response = parseFixture("putJobUploadResponse")
- request_print_response = parseFixture("postJobPrintResponse")
- self.network.prepareReply("PUT", self.REQUEST_UPLOAD_URL, 201, request_upload_response)
- self.network.prepareReply("PUT", request_upload_response["data"]["upload_url"], 201, b"{}")
- self.network.prepareReply("POST", self.PRINT_URL, 200, request_print_response)
-
- file_handler = MagicMock()
- file_handler.getSupportedFileTypesWrite.return_value = [{
- "extension": "ufp",
- "mime_type": "application/x-ufp",
- "mode": 2
- }, {
- "extension": "gcode.gz",
- "mime_type": "application/gzip",
- "mode": 2,
- }]
- file_handler.getWriterByMimeType.return_value.write.side_effect = \
- lambda stream, nodes: stream.write(str(nodes).encode())
-
- scene_nodes = [SceneNode()]
- expected_mesh = str(scene_nodes).encode()
- self.device.requestWrite(scene_nodes, file_handler=file_handler, file_name="FileName")
-
- self.network.flushReplies()
- self.assertEqual(
- {"data": {"content_type": "application/x-ufp", "file_size": len(expected_mesh), "job_name": "FileName"}},
- json.loads(self.network.getRequestBody("PUT", self.REQUEST_UPLOAD_URL).decode())
- )
- self.assertEqual(expected_mesh,
- self.network.getRequestBody("PUT", request_upload_response["data"]["upload_url"]))
- self.assertIsNone(self.network.getRequestBody("POST", self.PRINT_URL))
diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDeviceManager.py b/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDeviceManager.py
deleted file mode 100644
index e24ca1694e..0000000000
--- a/plugins/UM3NetworkPrinting/tests/Cloud/TestCloudOutputDeviceManager.py
+++ /dev/null
@@ -1,123 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-from unittest import TestCase
-from unittest.mock import patch, MagicMock
-
-from UM.OutputDevice.OutputDeviceManager import OutputDeviceManager
-from cura.UltimakerCloudAuthentication import CuraCloudAPIRoot
-from ...src.Cloud import CloudApiClient
-from ...src.Cloud import CloudOutputDeviceManager
-from .Fixtures import parseFixture, readFixture
-from .NetworkManagerMock import NetworkManagerMock, FakeSignal
-
-
-class TestCloudOutputDeviceManager(TestCase):
- maxDiff = None
-
- URL = CuraCloudAPIRoot + "/connect/v1/clusters"
-
- def setUp(self):
- super().setUp()
- self.app = MagicMock()
- self.device_manager = OutputDeviceManager()
- self.app.getOutputDeviceManager.return_value = self.device_manager
-
- self.patches = [patch("UM.Qt.QtApplication.QtApplication.getInstance", return_value=self.app),
- patch("UM.Application.Application.getInstance", return_value=self.app)]
- for patched_method in self.patches:
- patched_method.start()
-
- self.network = NetworkManagerMock()
- self.timer = MagicMock(timeout = FakeSignal())
- with patch.object(CloudApiClient, "QNetworkAccessManager", return_value = self.network), \
- patch.object(CloudOutputDeviceManager, "QTimer", return_value = self.timer):
- self.manager = CloudOutputDeviceManager.CloudOutputDeviceManager()
- self.clusters_response = parseFixture("getClusters")
- self.network.prepareReply("GET", self.URL, 200, readFixture("getClusters"))
-
- def tearDown(self):
- try:
- self._beforeTearDown()
-
- self.network.flushReplies()
- self.manager.stop()
- for patched_method in self.patches:
- patched_method.stop()
- finally:
- super().tearDown()
-
- ## Before tear down method we check whether the state of the output device manager is what we expect based on the
- # mocked API response.
- def _beforeTearDown(self):
- # let the network send replies
- self.network.flushReplies()
- # get the created devices
- devices = self.device_manager.getOutputDevices()
- # TODO: Check active device
-
- response_clusters = self.clusters_response.get("data", [])
- 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)
-
- ## Runs the initial request to retrieve the clusters.
- def _loadData(self):
- self.manager.start()
- self.network.flushReplies()
-
- def test_device_is_created(self):
- # just create the cluster, it is checked at tearDown
- self._loadData()
-
- def test_device_is_updated(self):
- self._loadData()
-
- # update the cluster from member variable, which is checked at tearDown
- self.clusters_response["data"][0]["host_name"] = "New host name"
- self.network.prepareReply("GET", self.URL, 200, self.clusters_response)
-
- self.manager._update_timer.timeout.emit()
-
- def test_device_is_removed(self):
- self._loadData()
-
- # delete the cluster from member variable, which is checked at tearDown
- del self.clusters_response["data"][1]
- self.network.prepareReply("GET", self.URL, 200, self.clusters_response)
-
- self.manager._update_timer.timeout.emit()
-
- def test_device_connects_by_cluster_id(self):
- active_machine_mock = self.app.getGlobalContainerStack.return_value
- cluster1, cluster2 = self.clusters_response["data"]
- cluster_id = cluster1["cluster_id"]
- active_machine_mock.getMetaDataEntry.side_effect = {"um_cloud_cluster_id": cluster_id}.get
-
- self._loadData()
-
- 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)
-
- def test_device_connects_by_network_key(self):
- active_machine_mock = self.app.getGlobalContainerStack.return_value
-
- cluster1, cluster2 = self.clusters_response["data"]
- network_key = cluster2["host_name"] + ".ultimaker.local"
- active_machine_mock.getMetaDataEntry.side_effect = {"um_network_key": network_key}.get
-
- self._loadData()
-
- self.assertIsNone(self.device_manager.getOutputDevice(cluster1["cluster_id"]))
- self.assertTrue(self.device_manager.getOutputDevice(cluster2["cluster_id"]).isConnected())
-
- active_machine_mock.setMetaDataEntry.assert_called_with("um_cloud_cluster_id", cluster2["cluster_id"])
-
- @patch.object(CloudOutputDeviceManager, "Message")
- def test_api_error(self, message_mock):
- self.clusters_response = {
- "errors": [{"id": "notFound", "title": "Not found!", "http_status": "404", "code": "notFound"}]
- }
- self.network.prepareReply("GET", self.URL, 200, self.clusters_response)
- self._loadData()
- message_mock.return_value.show.assert_called_once_with()
diff --git a/plugins/UM3NetworkPrinting/tests/Cloud/__init__.py b/plugins/UM3NetworkPrinting/tests/Cloud/__init__.py
deleted file mode 100644
index f3f6970c54..0000000000
--- a/plugins/UM3NetworkPrinting/tests/Cloud/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
diff --git a/plugins/UM3NetworkPrinting/tests/TestSendMaterialJob.py b/plugins/UM3NetworkPrinting/tests/TestSendMaterialJob.py
deleted file mode 100644
index 952d38dcf4..0000000000
--- a/plugins/UM3NetworkPrinting/tests/TestSendMaterialJob.py
+++ /dev/null
@@ -1,244 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
-import io
-import json
-from unittest import TestCase, mock
-from unittest.mock import patch, call, MagicMock
-
-from PyQt5.QtCore import QByteArray
-
-from UM.Application import Application
-
-from cura.Machines.MaterialGroup import MaterialGroup
-from cura.Machines.MaterialNode import MaterialNode
-
-from ..src.SendMaterialJob import SendMaterialJob
-
-_FILES_MAP = {"generic_pla_white": "/materials/generic_pla_white.xml.fdm_material",
- "generic_pla_black": "/materials/generic_pla_black.xml.fdm_material",
- }
-
-
-@patch("builtins.open", lambda _, __: io.StringIO(""))
-class TestSendMaterialJob(TestCase):
- # version 1
- _LOCAL_MATERIAL_WHITE = {"type": "material", "status": "unknown", "id": "generic_pla_white",
- "base_file": "generic_pla_white", "setting_version": "5", "name": "White PLA",
- "brand": "Generic", "material": "PLA", "color_name": "White",
- "GUID": "badb0ee7-87c8-4f3f-9398-938587b67dce", "version": "1", "color_code": "#ffffff",
- "description": "Test PLA White", "adhesion_info": "Use glue.", "approximate_diameter": "3",
- "properties": {"density": "1.00", "diameter": "2.85", "weight": "750"},
- "definition": "fdmprinter", "compatible": True}
-
- # version 2
- _LOCAL_MATERIAL_WHITE_NEWER = {"type": "material", "status": "unknown", "id": "generic_pla_white",
- "base_file": "generic_pla_white", "setting_version": "5", "name": "White PLA",
- "brand": "Generic", "material": "PLA", "color_name": "White",
- "GUID": "badb0ee7-87c8-4f3f-9398-938587b67dce", "version": "2",
- "color_code": "#ffffff",
- "description": "Test PLA White", "adhesion_info": "Use glue.",
- "approximate_diameter": "3",
- "properties": {"density": "1.00", "diameter": "2.85", "weight": "750"},
- "definition": "fdmprinter", "compatible": True}
-
- # invalid version: "one"
- _LOCAL_MATERIAL_WHITE_INVALID_VERSION = {"type": "material", "status": "unknown", "id": "generic_pla_white",
- "base_file": "generic_pla_white", "setting_version": "5", "name": "White PLA",
- "brand": "Generic", "material": "PLA", "color_name": "White",
- "GUID": "badb0ee7-87c8-4f3f-9398-938587b67dce", "version": "one",
- "color_code": "#ffffff",
- "description": "Test PLA White", "adhesion_info": "Use glue.",
- "approximate_diameter": "3",
- "properties": {"density": "1.00", "diameter": "2.85", "weight": "750"},
- "definition": "fdmprinter", "compatible": True}
-
- _LOCAL_MATERIAL_WHITE_ALL_RESULT = {"generic_pla_white": MaterialGroup("generic_pla_white",
- MaterialNode(_LOCAL_MATERIAL_WHITE))}
-
- _LOCAL_MATERIAL_WHITE_NEWER_ALL_RESULT = {"generic_pla_white": MaterialGroup("generic_pla_white",
- MaterialNode(_LOCAL_MATERIAL_WHITE_NEWER))}
-
- _LOCAL_MATERIAL_WHITE_INVALID_VERSION_ALL_RESULT = {"generic_pla_white": MaterialGroup("generic_pla_white",
- MaterialNode(_LOCAL_MATERIAL_WHITE_INVALID_VERSION))}
-
- _LOCAL_MATERIAL_BLACK = {"type": "material", "status": "unknown", "id": "generic_pla_black",
- "base_file": "generic_pla_black", "setting_version": "5", "name": "Yellow CPE",
- "brand": "Ultimaker", "material": "CPE", "color_name": "Black",
- "GUID": "5fbb362a-41f9-4818-bb43-15ea6df34aa4", "version": "1", "color_code": "#000000",
- "description": "Test PLA Black", "adhesion_info": "Use glue.", "approximate_diameter": "3",
- "properties": {"density": "1.01", "diameter": "2.85", "weight": "750"},
- "definition": "fdmprinter", "compatible": True}
-
- _LOCAL_MATERIAL_BLACK_ALL_RESULT = {"generic_pla_black": MaterialGroup("generic_pla_black",
- MaterialNode(_LOCAL_MATERIAL_BLACK))}
-
- _REMOTE_MATERIAL_WHITE = {
- "guid": "badb0ee7-87c8-4f3f-9398-938587b67dce",
- "material": "PLA",
- "brand": "Generic",
- "version": 1,
- "color": "White",
- "density": 1.00
- }
-
- _REMOTE_MATERIAL_BLACK = {
- "guid": "5fbb362a-41f9-4818-bb43-15ea6df34aa4",
- "material": "PLA",
- "brand": "Generic",
- "version": 2,
- "color": "Black",
- "density": 1.00
- }
-
- def test_run(self):
- device_mock = MagicMock()
- job = SendMaterialJob(device_mock)
- job.run()
-
- # We expect the materials endpoint to be called when the job runs.
- device_mock.get.assert_called_with("materials/", on_finished = job._onGetRemoteMaterials)
-
- def test__onGetRemoteMaterials_withFailedRequest(self):
- reply_mock = MagicMock()
- device_mock = MagicMock()
- reply_mock.attribute.return_value = 404
- job = SendMaterialJob(device_mock)
- job._onGetRemoteMaterials(reply_mock)
-
- # We expect the device not to be called for any follow up.
- self.assertEqual(0, device_mock.createFormPart.call_count)
-
- def test__onGetRemoteMaterials_withWrongEncoding(self):
- reply_mock = MagicMock()
- device_mock = MagicMock()
- reply_mock.attribute.return_value = 200
- reply_mock.readAll.return_value = QByteArray(json.dumps([self._REMOTE_MATERIAL_WHITE]).encode("cp500"))
- job = SendMaterialJob(device_mock)
- job._onGetRemoteMaterials(reply_mock)
-
- # Given that the parsing fails we do no expect the device to be called for any follow up.
- self.assertEqual(0, device_mock.createFormPart.call_count)
-
- def test__onGetRemoteMaterials_withBadJsonAnswer(self):
- reply_mock = MagicMock()
- device_mock = MagicMock()
- reply_mock.attribute.return_value = 200
- reply_mock.readAll.return_value = QByteArray(b"Six sick hicks nick six slick bricks with picks and sticks.")
- job = SendMaterialJob(device_mock)
- job._onGetRemoteMaterials(reply_mock)
-
- # Given that the parsing fails we do no expect the device to be called for any follow up.
- self.assertEqual(0, device_mock.createFormPart.call_count)
-
- def test__onGetRemoteMaterials_withMissingGuidInRemoteMaterial(self):
- reply_mock = MagicMock()
- device_mock = MagicMock()
- reply_mock.attribute.return_value = 200
- remote_material_without_guid = self._REMOTE_MATERIAL_WHITE.copy()
- del remote_material_without_guid["guid"]
- reply_mock.readAll.return_value = QByteArray(json.dumps([remote_material_without_guid]).encode("ascii"))
- job = SendMaterialJob(device_mock)
- job._onGetRemoteMaterials(reply_mock)
-
- # Given that parsing fails we do not expect the device to be called for any follow up.
- self.assertEqual(0, device_mock.createFormPart.call_count)
-
- @patch("cura.Machines.MaterialManager.MaterialManager")
- @patch("cura.Settings.CuraContainerRegistry")
- @patch("UM.Application")
- def test__onGetRemoteMaterials_withInvalidVersionInLocalMaterial(self, application_mock, container_registry_mock,
- material_manager_mock):
- reply_mock = MagicMock()
- device_mock = MagicMock()
- application_mock.getContainerRegistry.return_value = container_registry_mock
- application_mock.getMaterialManager.return_value = material_manager_mock
-
- reply_mock.attribute.return_value = 200
- reply_mock.readAll.return_value = QByteArray(json.dumps([self._REMOTE_MATERIAL_WHITE]).encode("ascii"))
-
- material_manager_mock.getAllMaterialGroups.return_value = self._LOCAL_MATERIAL_WHITE_INVALID_VERSION_ALL_RESULT.copy()
-
- with mock.patch.object(Application, "getInstance", new = lambda: application_mock):
- job = SendMaterialJob(device_mock)
- job._onGetRemoteMaterials(reply_mock)
-
- self.assertEqual(0, device_mock.createFormPart.call_count)
-
- @patch("UM.Application.Application.getInstance")
- def test__onGetRemoteMaterials_withNoUpdate(self, application_mock):
- reply_mock = MagicMock()
- device_mock = MagicMock()
- container_registry_mock = application_mock.getContainerRegistry.return_value
- material_manager_mock = application_mock.getMaterialManager.return_value
-
- device_mock.createFormPart.return_value = "_xXx_"
-
- material_manager_mock.getAllMaterialGroups.return_value = self._LOCAL_MATERIAL_WHITE_ALL_RESULT.copy()
-
- reply_mock.attribute.return_value = 200
- reply_mock.readAll.return_value = QByteArray(json.dumps([self._REMOTE_MATERIAL_WHITE]).encode("ascii"))
-
- with mock.patch.object(Application, "getInstance", new = lambda: application_mock):
- job = SendMaterialJob(device_mock)
- job._onGetRemoteMaterials(reply_mock)
-
- self.assertEqual(0, device_mock.createFormPart.call_count)
- self.assertEqual(0, device_mock.postFormWithParts.call_count)
-
- @patch("UM.Application.Application.getInstance")
- def test__onGetRemoteMaterials_withUpdatedMaterial(self, get_instance_mock):
- reply_mock = MagicMock()
- device_mock = MagicMock()
- application_mock = get_instance_mock.return_value
- container_registry_mock = application_mock.getContainerRegistry.return_value
- material_manager_mock = application_mock.getMaterialManager.return_value
-
- container_registry_mock.getContainerFilePathById = lambda x: _FILES_MAP.get(x)
-
- device_mock.createFormPart.return_value = "_xXx_"
-
- material_manager_mock.getAllMaterialGroups.return_value = self._LOCAL_MATERIAL_WHITE_NEWER_ALL_RESULT.copy()
-
- reply_mock.attribute.return_value = 200
- reply_mock.readAll.return_value = QByteArray(json.dumps([self._REMOTE_MATERIAL_WHITE]).encode("ascii"))
-
- job = SendMaterialJob(device_mock)
- job._onGetRemoteMaterials(reply_mock)
-
- self.assertEqual(1, device_mock.createFormPart.call_count)
- self.assertEqual(1, device_mock.postFormWithParts.call_count)
- self.assertEquals(
- [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)
-
- @patch("UM.Application.Application.getInstance")
- def test__onGetRemoteMaterials_withNewMaterial(self, application_mock):
- reply_mock = MagicMock()
- device_mock = MagicMock()
- container_registry_mock = application_mock.getContainerRegistry.return_value
- material_manager_mock = application_mock.getMaterialManager.return_value
-
- container_registry_mock.getContainerFilePathById = lambda x: _FILES_MAP.get(x)
-
- device_mock.createFormPart.return_value = "_xXx_"
-
- all_results = self._LOCAL_MATERIAL_WHITE_ALL_RESULT.copy()
- for key, value in self._LOCAL_MATERIAL_BLACK_ALL_RESULT.items():
- all_results[key] = value
- material_manager_mock.getAllMaterialGroups.return_value = all_results
-
- reply_mock.attribute.return_value = 200
- reply_mock.readAll.return_value = QByteArray(json.dumps([self._REMOTE_MATERIAL_BLACK]).encode("ascii"))
-
- with mock.patch.object(Application, "getInstance", new = lambda: application_mock):
- job = SendMaterialJob(device_mock)
- job._onGetRemoteMaterials(reply_mock)
-
- self.assertEqual(1, device_mock.createFormPart.call_count)
- self.assertEqual(1, device_mock.postFormWithParts.call_count)
- self.assertEquals(
- [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/UM3NetworkPrinting/tests/__init__.py b/plugins/UM3NetworkPrinting/tests/__init__.py
deleted file mode 100644
index f3f6970c54..0000000000
--- a/plugins/UM3NetworkPrinting/tests/__init__.py
+++ /dev/null
@@ -1,2 +0,0 @@
-# Copyright (c) 2018 Ultimaker B.V.
-# Cura is released under the terms of the LGPLv3 or higher.
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 ff59589923..e32e4c8745 100644
--- a/plugins/USBPrinting/USBPrinterOutputDevice.py
+++ b/plugins/USBPrinting/USBPrinterOutputDevice.py
@@ -6,13 +6,14 @@ import os
from UM.i18n import i18nCatalog
from UM.Logger import Logger
from UM.Mesh.MeshWriter import MeshWriter #To get the g-code output.
+from UM.Message import Message #Show an error when already printing.
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
@@ -23,11 +24,15 @@ from queue import Queue
from serial import Serial, SerialException, SerialTimeoutException
from threading import Thread, Event
from time import time
-from typing import Union, Optional, List, cast
+from typing import Union, Optional, List, cast, TYPE_CHECKING
import re
import functools # Used for reduce
+if TYPE_CHECKING:
+ from UM.FileHandler.FileHandler import FileHandler
+ from UM.Scene.SceneNode import SceneNode
+
catalog = i18nCatalog("cura")
@@ -112,16 +117,20 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
## Request the current scene to be sent to a USB-connected printer.
#
# \param nodes A collection of scene nodes to send. This is ignored.
- # \param file_name \type{string} A suggestion for a file name to write.
+ # \param file_name A suggestion for a file name to write.
# \param filter_by_machine Whether to filter MIME types by machine. This
# is ignored.
# \param kwargs Keyword arguments.
- def requestWrite(self, nodes, file_name = None, filter_by_machine = False, file_handler = None, **kwargs):
+ def requestWrite(self, nodes: List["SceneNode"], file_name: Optional[str] = None, limit_mimetypes: bool = False,
+ file_handler: Optional["FileHandler"] = None, filter_by_machine: bool = False, **kwargs) -> None:
if self._is_printing:
+ message = Message(text = catalog.i18nc("@message", "A print is still in progress. Cura cannot start another print via USB until the previous print has completed."), title = catalog.i18nc("@message", "Print in Progress"))
+ message.show()
return # Already printing
self.writeStarted.emit(self)
# cancel any ongoing preheat timer before starting a print
- self._printers[0].getController().stopPreheatTimers()
+ controller = cast(GenericOutputController, self._printers[0].getController())
+ controller.stopPreheatTimers()
CuraApplication.getInstance().getController().setActiveStage("MonitorStage")
@@ -181,7 +190,7 @@ class USBPrinterOutputDevice(PrinterOutputDevice):
try:
self._serial = Serial(str(self._serial_port), self._baud_rate, timeout=self._timeout, writeTimeout=self._timeout)
except SerialException:
- Logger.log("w", "An exception occured while trying to create serial connection")
+ Logger.log("w", "An exception occurred while trying to create serial connection")
return
CuraApplication.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged)
self._onGlobalContainerStackChanged()
@@ -226,6 +235,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:
@@ -371,10 +383,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..56f53145b0 100644
--- a/plugins/USBPrinting/USBPrinterOutputDeviceManager.py
+++ b/plugins/USBPrinting/USBPrinterOutputDeviceManager.py
@@ -4,16 +4,16 @@
import threading
import time
import serial.tools.list_ports
+from os import environ
+from re import search
-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
@@ -114,6 +114,27 @@ class USBPrinterOutputDeviceManager(QObject, OutputDevicePlugin):
port = (port.device, port.description, port.hwid)
if only_list_usb and not port[2].startswith("USB"):
continue
+
+ # To prevent cura from messing with serial ports of other devices,
+ # filter by regular expressions passed in as environment variables.
+ # Get possible patterns with python3 -m serial.tools.list_ports -v
+
+ # set CURA_DEVICENAMES=USB[1-9] -> e.g. not matching /dev/ttyUSB0
+ pattern = environ.get('CURA_DEVICENAMES')
+ if pattern and not search(pattern, port[0]):
+ continue
+
+ # set CURA_DEVICETYPES=CP2102 -> match a type of serial converter
+ pattern = environ.get('CURA_DEVICETYPES')
+ if pattern and not search(pattern, port[1]):
+ continue
+
+ # set CURA_DEVICEINFOS=LOCATION=2-1.4 -> match a physical port
+ # set CURA_DEVICEINFOS=VID:PID=10C4:EA60 -> match a vendor:product
+ pattern = environ.get('CURA_DEVICEINFOS')
+ if pattern and not search(pattern, port[2]):
+ continue
+
base_list += [port[0]]
return list(base_list)
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/VersionUpgrade25to26/tests/TestVersionUpgrade25to26.py b/plugins/VersionUpgrade/VersionUpgrade25to26/tests/TestVersionUpgrade25to26.py
index 9d7c7646cc..45cdaebe87 100644
--- a/plugins/VersionUpgrade/VersionUpgrade25to26/tests/TestVersionUpgrade25to26.py
+++ b/plugins/VersionUpgrade/VersionUpgrade25to26/tests/TestVersionUpgrade25to26.py
@@ -1,5 +1,8 @@
# Copyright (c) 2017 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
+import os.path
+import sys
+sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
import configparser #To check whether the appropriate exceptions are raised.
import pytest #To register tests with.
diff --git a/plugins/VersionUpgrade/VersionUpgrade26to27/tests/TestVersionUpgrade26to27.py b/plugins/VersionUpgrade/VersionUpgrade26to27/tests/TestVersionUpgrade26to27.py
index eebaca23c6..6235578238 100644
--- a/plugins/VersionUpgrade/VersionUpgrade26to27/tests/TestVersionUpgrade26to27.py
+++ b/plugins/VersionUpgrade/VersionUpgrade26to27/tests/TestVersionUpgrade26to27.py
@@ -3,7 +3,9 @@
import configparser #To check whether the appropriate exceptions are raised.
import pytest #To register tests with.
-
+import os.path
+import sys
+sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
import VersionUpgrade26to27 #The module we're testing.
## Creates an instance of the upgrader to test with.
diff --git a/plugins/VersionUpgrade/VersionUpgrade27to30/tests/TestVersionUpgrade27to30.py b/plugins/VersionUpgrade/VersionUpgrade27to30/tests/TestVersionUpgrade27to30.py
index cae08ebcfd..8ac6616511 100644
--- a/plugins/VersionUpgrade/VersionUpgrade27to30/tests/TestVersionUpgrade27to30.py
+++ b/plugins/VersionUpgrade/VersionUpgrade27to30/tests/TestVersionUpgrade27to30.py
@@ -1,6 +1,8 @@
# Copyright (c) 2017 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
-
+import os.path
+import sys
+sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
import configparser #To parse the resulting config files.
import pytest #To register tests with.
diff --git a/plugins/VersionUpgrade/VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py b/plugins/VersionUpgrade/VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py
index b74e6f35ac..9f306e74fa 100644
--- a/plugins/VersionUpgrade/VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py
+++ b/plugins/VersionUpgrade/VersionUpgrade34to35/tests/TestVersionUpgrade34to35.py
@@ -1,6 +1,8 @@
# Copyright (c) 2018 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
-
+import os.path
+import sys
+sys.path.append(os.path.join(os.path.dirname(os.path.abspath(__file__)), ".."))
import configparser #To parse the resulting config files.
import pytest #To register tests with.
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..b63d1842b7 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 "values" in parser and "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/VersionUpgrade/VersionUpgrade40to41/__init__.py b/plugins/VersionUpgrade/VersionUpgrade40to41/__init__.py
index 7f39bb9d39..09be805147 100644
--- a/plugins/VersionUpgrade/VersionUpgrade40to41/__init__.py
+++ b/plugins/VersionUpgrade/VersionUpgrade40to41/__init__.py
@@ -14,7 +14,7 @@ def getMetaData() -> Dict[str, Any]:
return {
"version_upgrade": {
# From To Upgrade function
- ("preferences", 6000006): ("preferences", 6000007, upgrade.upgradePreferences),
+ ("preferences", 6000006): ("preferences", 6000007, upgrade.upgradePreferences),
("machine_stack", 4000006): ("machine_stack", 4000007, upgrade.upgradeStack),
("extruder_train", 4000006): ("extruder_train", 4000007, upgrade.upgradeStack),
("definition_changes", 4000006): ("definition_changes", 4000007, upgrade.upgradeInstanceContainer),
diff --git a/plugins/VersionUpgrade/VersionUpgrade41to42/VersionUpgrade41to42.py b/plugins/VersionUpgrade/VersionUpgrade41to42/VersionUpgrade41to42.py
new file mode 100644
index 0000000000..a5a77a91e0
--- /dev/null
+++ b/plugins/VersionUpgrade/VersionUpgrade41to42/VersionUpgrade41to42.py
@@ -0,0 +1,338 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+import configparser
+import io
+import os.path # To get the file ID.
+from typing import Dict, List, Tuple
+
+from UM.VersionUpgrade import VersionUpgrade
+
+_renamed_settings = {
+ "support_minimal_diameter": "support_tower_maximum_supported_diameter"
+} # type: Dict[str, str]
+_removed_settings = ["prime_tower_circular", "max_feedrate_z_override"] # type: List[str]
+_renamed_profiles = {
+ # Include CreawsomeMod profiles here as well for the people who installed that.
+ # Definitions.
+ "creawsome_base": "creality_base",
+ "creawsome_cr10": "creality_cr10",
+ "creawsome_cr10mini": "creality_cr10mini",
+ "creawsome_cr10s": "creality_cr10s",
+ "creawsome_cr10s4": "creality_cr10s4",
+ "creawsome_cr10s5": "creality_cr10s5",
+ "creawsome_cr10spro": "creality_cr10spro",
+ "creawsome_cr20": "creality_cr20",
+ "creawsome_cr20pro": "creality_cr20pro",
+ "creawsome_ender2": "creality_ender2",
+ "creawsome_ender3": "creality_ender3",
+ "creawsome_ender4": "creality_ender4",
+ "creawsome_ender5": "creality_ender5",
+
+ # Extruder definitions.
+ "creawsome_base_extruder_0": "creality_base_extruder_0",
+
+ # Variants.
+ "creawsome_base_0.2": "creality_base_0.2",
+ "creawsome_base_0.3": "creality_base_0.3",
+ "creawsome_base_0.4": "creality_base_0.4",
+ "creawsome_base_0.5": "creality_base_0.5",
+ "creawsome_base_0.6": "creality_base_0.6",
+ "creawsome_base_0.8": "creality_base_0.8",
+ "creawsome_base_1.0": "creality_base_1.0",
+ "creawsome_cr10_0.2": "creality_cr10_0.2",
+ "creawsome_cr10_0.3": "creality_cr10_0.3",
+ "creawsome_cr10_0.4": "creality_cr10_0.4",
+ "creawsome_cr10_0.5": "creality_cr10_0.5",
+ "creawsome_cr10_0.6": "creality_cr10_0.6",
+ "creawsome_cr10_0.8": "creality_cr10_0.8",
+ "creawsome_cr10_1.0": "creality_cr10_1.0",
+ "creawsome_cr10mini_0.2": "creality_cr10mini_0.2",
+ "creawsome_cr10mini_0.3": "creality_cr10mini_0.3",
+ "creawsome_cr10mini_0.4": "creality_cr10mini_0.4",
+ "creawsome_cr10mini_0.5": "creality_cr10mini_0.5",
+ "creawsome_cr10mini_0.6": "creality_cr10mini_0.6",
+ "creawsome_cr10mini_0.8": "creality_cr10mini_0.8",
+ "creawsome_cr10mini_1.0": "creality_cr10mini_1.0",
+ "creawsome_cr10s4_0.2": "creality_cr10s4_0.2",
+ "creawsome_cr10s4_0.3": "creality_cr10s4_0.3",
+ "creawsome_cr10s4_0.4": "creality_cr10s4_0.4",
+ "creawsome_cr10s4_0.5": "creality_cr10s4_0.5",
+ "creawsome_cr10s4_0.6": "creality_cr10s4_0.6",
+ "creawsome_cr10s4_0.8": "creality_cr10s4_0.8",
+ "creawsome_cr10s4_1.0": "creality_cr10s4_1.0",
+ "creawsome_cr10s5_0.2": "creality_cr10s5_0.2",
+ "creawsome_cr10s5_0.3": "creality_cr10s5_0.3",
+ "creawsome_cr10s5_0.4": "creality_cr10s5_0.4",
+ "creawsome_cr10s5_0.5": "creality_cr10s5_0.5",
+ "creawsome_cr10s5_0.6": "creality_cr10s5_0.6",
+ "creawsome_cr10s5_0.8": "creality_cr10s5_0.8",
+ "creawsome_cr10s5_1.0": "creality_cr10s5_1.0",
+ "creawsome_cr10s_0.2": "creality_cr10s_0.2",
+ "creawsome_cr10s_0.3": "creality_cr10s_0.3",
+ "creawsome_cr10s_0.4": "creality_cr10s_0.4",
+ "creawsome_cr10s_0.5": "creality_cr10s_0.5",
+ "creawsome_cr10s_0.6": "creality_cr10s_0.6",
+ "creawsome_cr10s_0.8": "creality_cr10s_0.8",
+ "creawsome_cr10s_1.0": "creality_cr10s_1.0",
+ "creawsome_cr10spro_0.2": "creality_cr10spro_0.2",
+ "creawsome_cr10spro_0.3": "creality_cr10spro_0.3",
+ "creawsome_cr10spro_0.4": "creality_cr10spro_0.4",
+ "creawsome_cr10spro_0.5": "creality_cr10spro_0.5",
+ "creawsome_cr10spro_0.6": "creality_cr10spro_0.6",
+ "creawsome_cr10spro_0.8": "creality_cr10spro_0.8",
+ "creawsome_cr10spro_1.0": "creality_cr10spro_1.0",
+ "creawsome_cr20_0.2": "creality_cr20_0.2",
+ "creawsome_cr20_0.3": "creality_cr20_0.3",
+ "creawsome_cr20_0.4": "creality_cr20_0.4",
+ "creawsome_cr20_0.5": "creality_cr20_0.5",
+ "creawsome_cr20_0.6": "creality_cr20_0.6",
+ "creawsome_cr20_0.8": "creality_cr20_0.8",
+ "creawsome_cr20_1.0": "creality_cr20_1.0",
+ "creawsome_cr20pro_0.2": "creality_cr20pro_0.2",
+ "creawsome_cr20pro_0.3": "creality_cr20pro_0.3",
+ "creawsome_cr20pro_0.4": "creality_cr20pro_0.4",
+ "creawsome_cr20pro_0.5": "creality_cr20pro_0.5",
+ "creawsome_cr20pro_0.6": "creality_cr20pro_0.6",
+ "creawsome_cr20pro_0.8": "creality_cr20pro_0.8",
+ "creawsome_cr20pro_1.0": "creality_cr20pro_1.0",
+ "creawsome_ender2_0.2": "creality_ender2_0.2",
+ "creawsome_ender2_0.3": "creality_ender2_0.3",
+ "creawsome_ender2_0.4": "creality_ender2_0.4",
+ "creawsome_ender2_0.5": "creality_ender2_0.5",
+ "creawsome_ender2_0.6": "creality_ender2_0.6",
+ "creawsome_ender2_0.8": "creality_ender2_0.8",
+ "creawsome_ender2_1.0": "creality_ender2_1.0",
+ "creawsome_ender3_0.2": "creality_ender3_0.2",
+ "creawsome_ender3_0.3": "creality_ender3_0.3",
+ "creawsome_ender3_0.4": "creality_ender3_0.4",
+ "creawsome_ender3_0.5": "creality_ender3_0.5",
+ "creawsome_ender3_0.6": "creality_ender3_0.6",
+ "creawsome_ender3_0.8": "creality_ender3_0.8",
+ "creawsome_ender3_1.0": "creality_ender3_1.0",
+ "creawsome_ender4_0.2": "creality_ender4_0.2",
+ "creawsome_ender4_0.3": "creality_ender4_0.3",
+ "creawsome_ender4_0.4": "creality_ender4_0.4",
+ "creawsome_ender4_0.5": "creality_ender4_0.5",
+ "creawsome_ender4_0.6": "creality_ender4_0.6",
+ "creawsome_ender4_0.8": "creality_ender4_0.8",
+ "creawsome_ender4_1.0": "creality_ender4_1.0",
+ "creawsome_ender5_0.2": "creality_ender5_0.2",
+ "creawsome_ender5_0.3": "creality_ender5_0.3",
+ "creawsome_ender5_0.4": "creality_ender5_0.4",
+ "creawsome_ender5_0.5": "creality_ender5_0.5",
+ "creawsome_ender5_0.6": "creality_ender5_0.6",
+ "creawsome_ender5_0.8": "creality_ender5_0.8",
+ "creawsome_ender5_1.0": "creality_ender5_1.0",
+
+ # Upgrade for people who had the original Creality profiles from 4.1 and earlier.
+ "creality_cr10_extruder_0": "creality_base_extruder_0",
+ "creality_cr10s4_extruder_0": "creality_base_extruder_0",
+ "creality_cr10s5_extruder_0": "creality_base_extruder_0",
+ "creality_ender3_extruder_0": "creality_base_extruder_0"
+}
+
+# For legacy Creality printers, select the correct quality profile depending on the material.
+_creality_quality_per_material = {
+ # Since legacy Creality printers didn't have different variants, we always pick the 0.4mm variant.
+ "generic_abs_175": {
+ "high": "base_0.4_ABS_super",
+ "normal": "base_0.4_ABS_super",
+ "fast": "base_0.4_ABS_super",
+ "draft": "base_0.4_ABS_standard",
+ "extra_fast": "base_0.4_ABS_low",
+ "coarse": "base_0.4_ABS_low",
+ "extra_coarse": "base_0.4_ABS_low"
+ },
+ "generic_petg_175": {
+ "high": "base_0.4_PETG_super",
+ "normal": "base_0.4_PETG_super",
+ "fast": "base_0.4_PETG_super",
+ "draft": "base_0.4_PETG_standard",
+ "extra_fast": "base_0.4_PETG_low",
+ "coarse": "base_0.4_PETG_low",
+ "extra_coarse": "base_0.4_PETG_low"
+ },
+ "generic_pla_175": {
+ "high": "base_0.4_PLA_super",
+ "normal": "base_0.4_PLA_super",
+ "fast": "base_0.4_PLA_super",
+ "draft": "base_0.4_PLA_standard",
+ "extra_fast": "base_0.4_PLA_low",
+ "coarse": "base_0.4_PLA_low",
+ "extra_coarse": "base_0.4_PLA_low"
+ },
+ "generic_tpu_175": {
+ "high": "base_0.4_TPU_super",
+ "normal": "base_0.4_TPU_super",
+ "fast": "base_0.4_TPU_super",
+ "draft": "base_0.4_TPU_standard",
+ "extra_fast": "base_0.4_TPU_standard",
+ "coarse": "base_0.4_TPU_standard",
+ "extra_coarse": "base_0.4_TPU_standard"
+ },
+ "empty_material": { # For the global stack.
+ "high": "base_global_super",
+ "normal": "base_global_super",
+ "fast": "base_global_super",
+ "draft": "base_global_standard",
+ "extra_fast": "base_global_low",
+ "coarse": "base_global_low",
+ "extra_coarse": "base_global_low"
+ }
+}
+
+# Default variant to select for legacy Creality printers, now that we have variants.
+_default_variants = {
+ "creality_cr10_extruder_0": "creality_cr10_0.4",
+ "creality_cr10s4_extruder_0": "creality_cr10s4_0.4",
+ "creality_cr10s5_extruder_0": "creality_cr10s5_0.4",
+ "creality_ender3_extruder_0": "creality_ender3_0.4"
+}
+
+# Whether the quality changes profile belongs to one of the upgraded printers can only be recognised by how they start.
+# If they are, they must use the creality base definition so that they still belong to those printers.
+_quality_changes_to_creality_base = {
+ "creality_cr10_extruder_0",
+ "creality_cr10s4_extruder_0",
+ "creality_cr10s5_extruder_0",
+ "creality_ender3_extruder_0",
+ "creality_cr10",
+ "creality_cr10s",
+ "creality_cr10s4",
+ "creality_cr10s5",
+ "creality_ender3",
+}
+_creality_limited_quality_type = {
+ "high": "super",
+ "normal": "super",
+ "fast": "super",
+ "draft": "draft",
+ "extra_fast": "draft",
+ "coarse": "draft",
+ "extra_coarse": "draft"
+}
+
+## Upgrades configurations from the state they were in at version 4.1 to the
+# state they should be in at version 4.2.
+class VersionUpgrade41to42(VersionUpgrade):
+ ## Gets the version number from a CFG file in Uranium's 4.1 format.
+ #
+ # Since the format may change, this is implemented for the 4.1 format only
+ # and needs to be included in the version upgrade system rather than
+ # globally in Uranium.
+ #
+ # \param serialised The serialised form of a CFG file.
+ # \return The version number stored in the CFG file.
+ # \raises ValueError The format of the version number in the file is
+ # incorrect.
+ # \raises KeyError The format of the file is incorrect.
+ def getCfgVersion(self, serialised: str) -> int:
+ parser = configparser.ConfigParser(interpolation = None)
+ parser.read_string(serialised)
+ format_version = int(parser.get("general", "version")) # Explicitly give an exception when this fails. That means that the file format is not recognised.
+ setting_version = int(parser.get("metadata", "setting_version", fallback = "0"))
+ return format_version * 1000000 + setting_version
+
+ ## Upgrades instance containers to have the new version
+ # number.
+ #
+ # This renames the renamed settings in the containers.
+ def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
+ parser = configparser.ConfigParser(interpolation = None)
+ parser.read_string(serialized)
+
+ # Update version number.
+ parser["metadata"]["setting_version"] = "8"
+
+ # Certain instance containers (such as definition changes) reference to a certain definition container
+ # Since a number of those changed name, we also need to update those.
+ old_definition = parser["general"]["definition"]
+ if old_definition in _renamed_profiles:
+ parser["general"]["definition"] = _renamed_profiles[old_definition]
+
+ # Rename settings.
+ if "values" in parser:
+ for old_name, new_name in _renamed_settings.items():
+ if old_name in parser["values"]:
+ parser["values"][new_name] = parser["values"][old_name]
+ del parser["values"][old_name]
+ # Remove settings.
+ for key in _removed_settings:
+ if key in parser["values"]:
+ del parser["values"][key]
+
+ # For quality-changes profiles made for Creality printers, change the definition to the creality_base and make sure that the quality is something we have a profile for.
+ if parser["metadata"].get("type", "") == "quality_changes":
+ for possible_printer in _quality_changes_to_creality_base:
+ if os.path.basename(filename).startswith(possible_printer + "_"):
+ parser["general"]["definition"] = "creality_base"
+ parser["metadata"]["quality_type"] = _creality_limited_quality_type.get(parser["metadata"]["quality_type"], "draft")
+ break
+
+ result = io.StringIO()
+ parser.write(result)
+ return [filename], [result.getvalue()]
+
+ ## Upgrades Preferences to have the new version number.
+ #
+ # This renames the renamed settings in the list of visible settings.
+ def upgradePreferences(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
+ parser = configparser.ConfigParser(interpolation = None)
+ parser.read_string(serialized)
+
+ # Update version number.
+ parser["metadata"]["setting_version"] = "8"
+
+ # Renamed settings.
+ if "visible_settings" in parser["general"]:
+ visible_settings = parser["general"]["visible_settings"]
+ visible_setting_set = set(visible_settings.split(";"))
+ for old_name, new_name in _renamed_settings.items():
+ if old_name in visible_setting_set:
+ visible_setting_set.remove(old_name)
+ visible_setting_set.add(new_name)
+ for removed_key in _removed_settings:
+ if removed_key in visible_setting_set:
+ visible_setting_set.remove(removed_key)
+ parser["general"]["visible_settings"] = ";".join(visible_setting_set)
+
+ result = io.StringIO()
+ parser.write(result)
+ return [filename], [result.getvalue()]
+
+ ## Upgrades stacks to have the new version number.
+ def upgradeStack(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
+ parser = configparser.ConfigParser(interpolation = None)
+ parser.read_string(serialized)
+
+ # Update version number.
+ parser["metadata"]["setting_version"] = "8"
+
+ # Change renamed profiles.
+ if "containers" in parser:
+ # For legacy Creality printers, change the variant to 0.4.
+ definition_id = parser["containers"]["6"]
+ if parser["metadata"].get("type", "machine") == "extruder_train":
+ if parser["containers"]["4"] == "empty_variant": # Necessary for people entering from CreawsomeMod who already had a variant.
+ if definition_id in _default_variants:
+ parser["containers"]["4"] = _default_variants[definition_id]
+ if definition_id == "creality_cr10_extruder_0": # We can't disambiguate between Creality CR-10 and Creality-CR10S since they share the same extruder definition. Have to go by the name.
+ if "cr-10s" in parser["metadata"].get("machine", "Creality CR-10").lower(): # Not perfect, since the user can change this name :(
+ parser["containers"]["4"] = "creality_cr10s_0.4"
+
+ # Also change the quality to go along with it.
+ material_id = parser["containers"]["3"]
+ old_quality_id = parser["containers"]["2"]
+ if material_id in _creality_quality_per_material and old_quality_id in _creality_quality_per_material[material_id]:
+ parser["containers"]["2"] = _creality_quality_per_material[material_id][old_quality_id]
+
+ stack_copy = {} # type: Dict[str, str] # Make a copy so that we don't modify the dict we're iterating over.
+ stack_copy.update(parser["containers"])
+ for position, profile_id in stack_copy.items():
+ if profile_id in _renamed_profiles:
+ parser["containers"][position] = _renamed_profiles[profile_id]
+
+ result = io.StringIO()
+ parser.write(result)
+ return [filename], [result.getvalue()]
diff --git a/plugins/VersionUpgrade/VersionUpgrade41to42/__init__.py b/plugins/VersionUpgrade/VersionUpgrade41to42/__init__.py
new file mode 100644
index 0000000000..6fd1309747
--- /dev/null
+++ b/plugins/VersionUpgrade/VersionUpgrade41to42/__init__.py
@@ -0,0 +1,59 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from typing import Any, Dict, TYPE_CHECKING
+
+from . import VersionUpgrade41to42
+
+if TYPE_CHECKING:
+ from UM.Application import Application
+
+upgrade = VersionUpgrade41to42.VersionUpgrade41to42()
+
+def getMetaData() -> Dict[str, Any]:
+ return {
+ "version_upgrade": {
+ # From To Upgrade function
+ ("preferences", 6000007): ("preferences", 6000008, upgrade.upgradePreferences),
+ ("machine_stack", 4000007): ("machine_stack", 4000008, upgrade.upgradeStack),
+ ("extruder_train", 4000007): ("extruder_train", 4000008, upgrade.upgradeStack),
+ ("definition_changes", 4000007): ("definition_changes", 4000008, upgrade.upgradeInstanceContainer),
+ ("quality_changes", 4000007): ("quality_changes", 4000008, upgrade.upgradeInstanceContainer),
+ ("quality", 4000007): ("quality", 4000008, upgrade.upgradeInstanceContainer),
+ ("user", 4000007): ("user", 4000008, upgrade.upgradeInstanceContainer),
+ },
+ "sources": {
+ "preferences": {
+ "get_version": upgrade.getCfgVersion,
+ "location": {"."}
+ },
+ "machine_stack": {
+ "get_version": upgrade.getCfgVersion,
+ "location": {"./machine_instances"}
+ },
+ "extruder_train": {
+ "get_version": upgrade.getCfgVersion,
+ "location": {"./extruders"}
+ },
+ "definition_changes": {
+ "get_version": upgrade.getCfgVersion,
+ "location": {"./definition_changes"}
+ },
+ "quality_changes": {
+ "get_version": upgrade.getCfgVersion,
+ "location": {"./quality_changes"}
+ },
+ "quality": {
+ "get_version": upgrade.getCfgVersion,
+ "location": {"./quality"}
+ },
+ "user": {
+ "get_version": upgrade.getCfgVersion,
+ "location": {"./user"}
+ }
+ }
+ }
+
+
+def register(app: "Application") -> Dict[str, Any]:
+ return { "version_upgrade": upgrade }
\ No newline at end of file
diff --git a/plugins/VersionUpgrade/VersionUpgrade41to42/plugin.json b/plugins/VersionUpgrade/VersionUpgrade41to42/plugin.json
new file mode 100644
index 0000000000..9f8edea286
--- /dev/null
+++ b/plugins/VersionUpgrade/VersionUpgrade41to42/plugin.json
@@ -0,0 +1,8 @@
+{
+ "name": "Version Upgrade 4.1 to 4.2",
+ "author": "Ultimaker B.V.",
+ "version": "1.0.0",
+ "description": "Upgrades configurations from Cura 4.1 to Cura 4.2.",
+ "api": "6.0",
+ "i18n-catalog": "cura"
+}
diff --git a/plugins/VersionUpgrade/VersionUpgrade42to43/VersionUpgrade42to43.py b/plugins/VersionUpgrade/VersionUpgrade42to43/VersionUpgrade42to43.py
new file mode 100644
index 0000000000..6bcf43dc71
--- /dev/null
+++ b/plugins/VersionUpgrade/VersionUpgrade42to43/VersionUpgrade42to43.py
@@ -0,0 +1,160 @@
+import configparser
+import io
+from typing import Dict, Tuple, List
+
+from UM.VersionUpgrade import VersionUpgrade
+
+_renamed_profiles = {"generic_pla_0.4_coarse": "jbo_generic_pla_0.4_coarse",
+ "generic_pla_0.4_fine": "jbo_generic_pla_fine",
+ "generic_pla_0.4_medium": "jbo_generic_pla_medium",
+ "generic_pla_0.4_ultrafine": "jbo_generic_pla_ultrafine",
+
+ "generic_petg_0.4_coarse": "jbo_generic_petg_0.4_coarse",
+ "generic_petg_0.4_fine": "jbo_generic_petg_fine",
+ "generic_petg_0.4_medium": "jbo_generic_petg_medium",
+ }
+
+# - The variant "imade3d jellybox 0.4 mm 2-fans" for machine definition "imade3d_jellybox"
+# is now "0.4 mm" for machine definition "imade3d jellybox_2".
+# - Materials "imade3d_petg_green" and "imade3d_petg_pink" are now "imade3d_petg_175".
+# - Materials "imade3d_pla_green" and "imade3d_pla_pink" are now "imade3d_petg_175".
+#
+# Note: Theoretically, the old material profiles with "_2-fans" at the end should be updated to:
+# - machine definition: imade3d_jellybox_2
+# - variant: 0.4 mm (for jellybox 2)
+# - material: (as an example) imade3d_petg_175_imade3d_jellybox_2_0.4_mm
+#
+# But this involves changing the definition of the global stack and the extruder stacks, which can cause more trouble
+# than what we can fix. So, here, we update all material variants, regardless of having "_2-fans" at the end or not, to
+# jellybox_0.4_mm.
+#
+_renamed_material_profiles = { # PETG
+ "imade3d_petg_green": "imade3d_petg_175",
+ "imade3d_petg_green_imade3d_jellybox": "imade3d_petg_175_imade3d_jellybox",
+ "imade3d_petg_green_imade3d_jellybox_0.4_mm": "imade3d_petg_175_imade3d_jellybox_0.4_mm",
+ "imade3d_petg_green_imade3d_jellybox_0.4_mm_2-fans": "imade3d_petg_175_imade3d_jellybox_0.4_mm",
+ "imade3d_petg_pink": "imade3d_petg_175",
+ "imade3d_petg_pink_imade3d_jellybox": "imade3d_petg_175_imade3d_jellybox",
+ "imade3d_petg_pink_imade3d_jellybox_0.4_mm": "imade3d_petg_175_imade3d_jellybox_0.4_mm",
+ "imade3d_petg_pink_imade3d_jellybox_0.4_mm_2-fans": "imade3d_petg_175_imade3d_jellybox_0.4_mm",
+ # PLA
+ "imade3d_pla_green": "imade3d_pla_175",
+ "imade3d_pla_green_imade3d_jellybox": "imade3d_pla_175_imade3d_jellybox",
+ "imade3d_pla_green_imade3d_jellybox_0.4_mm": "imade3d_pla_175_imade3d_jellybox_0.4_mm",
+ "imade3d_pla_green_imade3d_jellybox_0.4_mm_2-fans": "imade3d_pla_175_imade3d_jellybox_0.4_mm",
+ "imade3d_pla_pink": "imade3d_pla_175",
+ "imade3d_pla_pink_imade3d_jellybox": "imade3d_pla_175_imade3d_jellybox",
+ "imade3d_pla_pink_imade3d_jellybox_0.4_mm": "imade3d_pla_175_imade3d_jellybox_0.4_mm",
+ "imade3d_pla_pink_imade3d_jellybox_0.4_mm_2-fans": "imade3d_pla_175_imade3d_jellybox_0.4_mm",
+ }
+
+_removed_settings = {
+ "start_layers_at_same_position"
+}
+
+_renamed_settings = {
+ "support_infill_angle": "support_infill_angles"
+} # type: Dict[str, str]
+
+## Upgrades configurations from the state they were in at version 4.2 to the
+# state they should be in at version 4.3.
+class VersionUpgrade42to43(VersionUpgrade):
+ ## Gets the version number from a CFG file in Uranium's 4.2 format.
+ #
+ # Since the format may change, this is implemented for the 4.2 format only
+ # and needs to be included in the version upgrade system rather than
+ # globally in Uranium.
+ #
+ # \param serialised The serialised form of a CFG file.
+ # \return The version number stored in the CFG file.
+ # \raises ValueError The format of the version number in the file is
+ # incorrect.
+ # \raises KeyError The format of the file is incorrect.
+ def getCfgVersion(self, serialised: str) -> int:
+ parser = configparser.ConfigParser(interpolation = None)
+ parser.read_string(serialised)
+ format_version = int(parser.get("general", "version")) # Explicitly give an exception when this fails. That means that the file format is not recognised.
+ setting_version = int(parser.get("metadata", "setting_version", fallback = "0"))
+ return format_version * 1000000 + setting_version
+
+ def upgradePreferences(self, serialized: str, filename: str):
+ parser = configparser.ConfigParser(interpolation = None)
+ parser.read_string(serialized)
+
+ if "camera_perspective_mode" in parser["general"] and parser["general"]["camera_perspective_mode"] == "orthogonal":
+ parser["general"]["camera_perspective_mode"] = "orthographic"
+
+ # Fix renamed settings for visibility
+ if "visible_settings" in parser["general"]:
+ all_setting_keys = parser["general"]["visible_settings"].strip().split(";")
+ if all_setting_keys:
+ for idx, key in enumerate(all_setting_keys):
+ if key in _renamed_settings:
+ all_setting_keys[idx] = _renamed_settings[key]
+ parser["general"]["visible_settings"] = ";".join(all_setting_keys)
+
+ parser["metadata"]["setting_version"] = "9"
+
+ result = io.StringIO()
+ parser.write(result)
+ return [filename], [result.getvalue()]
+
+ ## Upgrades instance containers to have the new version
+ # number.
+ #
+ # This renames the renamed settings in the containers.
+ def upgradeInstanceContainer(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
+ parser = configparser.ConfigParser(interpolation = None)
+ parser.read_string(serialized)
+
+ # Update version number.
+ parser["metadata"]["setting_version"] = "9"
+
+ if "values" in parser:
+ for old_name, new_name in _renamed_settings.items():
+ if old_name in parser["values"]:
+ parser["values"][new_name] = parser["values"][old_name]
+ del parser["values"][old_name]
+ for key in _removed_settings:
+ if key in parser["values"]:
+ del parser["values"][key]
+
+ if "support_infill_angles" in parser["values"]:
+ old_value = float(parser["values"]["support_infill_angles"])
+ new_value = [int(round(old_value))]
+ parser["values"]["support_infill_angles"] = str(new_value)
+
+ result = io.StringIO()
+ parser.write(result)
+ return [filename], [result.getvalue()]
+
+ ## Upgrades stacks to have the new version number.
+ def upgradeStack(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
+ parser = configparser.ConfigParser(interpolation = None)
+ parser.read_string(serialized)
+
+ # Update version number.
+ parser["metadata"]["setting_version"] = "9"
+ # Handle changes for the imade3d jellybox. The machine was split up into parts (eg; a 2 fan version and a single
+ # fan version. Perviously it used variants for this. The only upgrade we can do here is strip that variant.
+ # This is because we only upgrade per stack (and to fully do these changes, we'd need to switch out something
+ # in the global container based on changes made to the extruder stack)
+ if parser["containers"]["6"] == "imade3d_jellybox_extruder_0":
+ quality_id = parser["containers"]["2"]
+ if quality_id.endswith("_2-fans"):
+ parser["containers"]["2"] = quality_id.replace("_2-fans", "")
+
+ if parser["containers"]["2"] in _renamed_profiles:
+ parser["containers"]["2"] = _renamed_profiles[parser["containers"]["2"]]
+
+ material_id = parser["containers"]["3"]
+ if material_id in _renamed_material_profiles:
+ parser["containers"]["3"] = _renamed_material_profiles[material_id]
+ variant_id = parser["containers"]["4"]
+
+ if variant_id.endswith("_2-fans"):
+ parser["containers"]["4"] = variant_id.replace("_2-fans", "")
+
+ result = io.StringIO()
+ parser.write(result)
+ return [filename], [result.getvalue()]
diff --git a/plugins/VersionUpgrade/VersionUpgrade42to43/__init__.py b/plugins/VersionUpgrade/VersionUpgrade42to43/__init__.py
new file mode 100644
index 0000000000..7400bbb989
--- /dev/null
+++ b/plugins/VersionUpgrade/VersionUpgrade42to43/__init__.py
@@ -0,0 +1,59 @@
+# Copyright (c) 2019 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from typing import Any, Dict, TYPE_CHECKING
+
+from . import VersionUpgrade42to43
+
+if TYPE_CHECKING:
+ from UM.Application import Application
+
+upgrade = VersionUpgrade42to43.VersionUpgrade42to43()
+
+def getMetaData() -> Dict[str, Any]:
+ return {
+ "version_upgrade": {
+ # From To Upgrade function
+ ("preferences", 6000008): ("preferences", 6000009, upgrade.upgradePreferences),
+ ("machine_stack", 4000008): ("machine_stack", 4000009, upgrade.upgradeStack),
+ ("extruder_train", 4000008): ("extruder_train", 4000009, upgrade.upgradeStack),
+ ("definition_changes", 4000008): ("definition_changes", 4000009, upgrade.upgradeInstanceContainer),
+ ("quality_changes", 4000008): ("quality_changes", 4000009, upgrade.upgradeInstanceContainer),
+ ("quality", 4000008): ("quality", 4000009, upgrade.upgradeInstanceContainer),
+ ("user", 4000008): ("user", 4000009, upgrade.upgradeInstanceContainer),
+ },
+ "sources": {
+ "preferences": {
+ "get_version": upgrade.getCfgVersion,
+ "location": {"."}
+ },
+ "machine_stack": {
+ "get_version": upgrade.getCfgVersion,
+ "location": {"./machine_instances"}
+ },
+ "extruder_train": {
+ "get_version": upgrade.getCfgVersion,
+ "location": {"./extruders"}
+ },
+ "definition_changes": {
+ "get_version": upgrade.getCfgVersion,
+ "location": {"./definition_changes"}
+ },
+ "quality_changes": {
+ "get_version": upgrade.getCfgVersion,
+ "location": {"./quality_changes"}
+ },
+ "quality": {
+ "get_version": upgrade.getCfgVersion,
+ "location": {"./quality"}
+ },
+ "user": {
+ "get_version": upgrade.getCfgVersion,
+ "location": {"./user"}
+ }
+ }
+ }
+
+
+def register(app: "Application") -> Dict[str, Any]:
+ return { "version_upgrade": upgrade }
\ No newline at end of file
diff --git a/plugins/VersionUpgrade/VersionUpgrade42to43/plugin.json b/plugins/VersionUpgrade/VersionUpgrade42to43/plugin.json
new file mode 100644
index 0000000000..339ec67ee7
--- /dev/null
+++ b/plugins/VersionUpgrade/VersionUpgrade42to43/plugin.json
@@ -0,0 +1,8 @@
+{
+ "name": "Version Upgrade 4.2 to 4.3",
+ "author": "Ultimaker B.V.",
+ "version": "1.0.0",
+ "description": "Upgrades configurations from Cura 4.2 to Cura 4.3.",
+ "api": "6.0",
+ "i18n-catalog": "cura"
+}
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/XRayView/xray.shader b/plugins/XRayView/xray.shader
index 41b00154ea..45cb16c44c 100644
--- a/plugins/XRayView/xray.shader
+++ b/plugins/XRayView/xray.shader
@@ -1,12 +1,14 @@
[shaders]
vertex =
- uniform highp mat4 u_modelViewProjectionMatrix;
+ uniform highp mat4 u_modelMatrix;
+ uniform highp mat4 u_viewMatrix;
+ uniform highp mat4 u_projectionMatrix;
attribute highp vec4 a_vertex;
void main()
{
- gl_Position = u_modelViewProjectionMatrix * a_vertex;
+ gl_Position = u_projectionMatrix * u_viewMatrix * u_modelMatrix * a_vertex;
}
fragment =
@@ -19,13 +21,15 @@ fragment =
vertex41core =
#version 410
- uniform highp mat4 u_modelViewProjectionMatrix;
+ uniform highp mat4 u_modelMatrix;
+ uniform highp mat4 u_viewMatrix;
+ uniform highp mat4 u_projectionMatrix;
in highp vec4 a_vertex;
void main()
{
- gl_Position = u_modelViewProjectionMatrix * a_vertex;
+ gl_Position = u_projectionMatrix * u_viewMatrix * u_modelMatrix * a_vertex;
}
fragment41core =
@@ -43,7 +47,9 @@ fragment41core =
u_color = [0.02, 0.02, 0.02, 1.0]
[bindings]
-u_modelViewProjectionMatrix = model_view_projection_matrix
+u_modelMatrix = model_matrix
+u_viewMatrix = view_matrix
+u_projectionMatrix = projection_matrix
[attributes]
a_vertex = vertex
diff --git a/plugins/XmlMaterialProfile/XmlMaterialProfile.py b/plugins/XmlMaterialProfile/XmlMaterialProfile.py
index 27c401fcd4..04ed112aa1 100644
--- a/plugins/XmlMaterialProfile/XmlMaterialProfile.py
+++ b/plugins/XmlMaterialProfile/XmlMaterialProfile.py
@@ -6,7 +6,7 @@ import io
import json #To parse the product-to-id mapping file.
import os.path #To find the product-to-id mapping.
import sys
-from typing import Any, Dict, List, Optional, Tuple, cast, Set
+from typing import Any, Dict, List, Optional, Tuple, cast, Set, Union
import xml.etree.ElementTree as ET
from UM.Resources import Resources
@@ -19,7 +19,10 @@ from UM.ConfigurationErrorMessage import ConfigurationErrorMessage
from cura.CuraApplication import CuraApplication
from cura.Machines.VariantType import VariantType
-from .XmlMaterialValidator import XmlMaterialValidator
+try:
+ from .XmlMaterialValidator import XmlMaterialValidator
+except (ImportError, SystemError):
+ import XmlMaterialValidator # type: ignore # This fixes the tests not being able to import.
## Handles serializing and deserializing material containers from an XML file
@@ -40,11 +43,11 @@ class XmlMaterialProfile(InstanceContainer):
#
# \param xml_version: The version number found in an XML file.
# \return The corresponding setting_version.
- @classmethod
- def xmlVersionToSettingVersion(cls, xml_version: str) -> int:
+ @staticmethod
+ def xmlVersionToSettingVersion(xml_version: str) -> int:
if xml_version == "1.3":
return CuraApplication.SettingVersion
- return 0 #Older than 1.3.
+ return 0 # Older than 1.3.
def getInheritedFiles(self):
return self._inherited_files
@@ -63,9 +66,19 @@ class XmlMaterialProfile(InstanceContainer):
Logger.log("w", "Can't change metadata {key} of material {material_id} because it's read-only.".format(key = key, material_id = self.getId()))
return
+ # Some metadata such as diameter should also be instantiated to be a setting. Go though all values for the
+ # "properties" field and apply the new values to SettingInstances as well.
+ new_setting_values_dict = {}
+ if key == "properties":
+ for k, v in value.items():
+ if k in self.__material_properties_setting_map:
+ new_setting_values_dict[self.__material_properties_setting_map[k]] = v
+
# Prevent recursion
if not apply_to_all:
super().setMetaDataEntry(key, value)
+ for k, v in new_setting_values_dict.items():
+ self.setProperty(k, "value", v)
return
# Get the MaterialGroup
@@ -74,17 +87,23 @@ class XmlMaterialProfile(InstanceContainer):
material_group = material_manager.getMaterialGroup(root_material_id)
if not material_group: #If the profile is not registered in the registry but loose/temporary, it will not have a base file tree.
super().setMetaDataEntry(key, value)
+ for k, v in new_setting_values_dict.items():
+ self.setProperty(k, "value", v)
return
# Update the root material container
root_material_container = material_group.root_material_node.getContainer()
if root_material_container is not None:
root_material_container.setMetaDataEntry(key, value, apply_to_all = False)
+ for k, v in new_setting_values_dict.items():
+ root_material_container.setProperty(k, "value", v)
# Update all containers derived from it
for node in material_group.derived_material_node_list:
container = node.getContainer()
if container is not None:
container.setMetaDataEntry(key, value, apply_to_all = False)
+ for k, v in new_setting_values_dict.items():
+ container.setProperty(k, "value", v)
## Overridden from InstanceContainer, similar to setMetaDataEntry.
# without this function the setName would only set the name of the specific nozzle / material / machine combination container
@@ -144,7 +163,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:
@@ -174,13 +193,16 @@ class XmlMaterialProfile(InstanceContainer):
## End Name Block
for key, value in metadata.items():
- builder.start(key) # type: ignore
+ key_to_use = key
+ if key in self._metadata_tags_that_have_cura_namespace:
+ key_to_use = "cura:" + key_to_use
+ builder.start(key_to_use) # type: ignore
if value is not None: #Nones get handled well by the builder.
#Otherwise the builder always expects a string.
#Deserialize expects the stringified version.
value = str(value)
builder.data(value)
- builder.end(key)
+ builder.end(key_to_use)
builder.end("metadata")
## End Metadata Block
@@ -390,7 +412,8 @@ class XmlMaterialProfile(InstanceContainer):
self._combineElement(self._expandMachinesXML(result), self._expandMachinesXML(second))
return result
- def _createKey(self, element):
+ @staticmethod
+ def _createKey(element):
key = element.tag.split("}")[-1]
if "key" in element.attrib:
key += " key:" + element.attrib["key"]
@@ -406,15 +429,15 @@ class XmlMaterialProfile(InstanceContainer):
# Recursively merges XML elements. Updates either the text or children if another element is found in first.
# If it does not exist, copies it from second.
- def _combineElement(self, first, second):
+ @staticmethod
+ def _combineElement(first, second):
# Create a mapping from tag name to element.
-
mapping = {}
for element in first:
- key = self._createKey(element)
+ key = XmlMaterialProfile._createKey(element)
mapping[key] = element
for element in second:
- key = self._createKey(element)
+ key = XmlMaterialProfile._createKey(element)
if len(element): # Check if element has children.
try:
if "setting" in element.tag and not "settings" in element.tag:
@@ -424,7 +447,7 @@ class XmlMaterialProfile(InstanceContainer):
for child in element:
mapping[key].append(child)
else:
- self._combineElement(mapping[key], element) # Multiple elements, handle those.
+ XmlMaterialProfile._combineElement(mapping[key], element) # Multiple elements, handle those.
except KeyError:
mapping[key] = element
first.append(element)
@@ -814,9 +837,9 @@ class XmlMaterialProfile(InstanceContainer):
ContainerRegistry.getInstance().addContainer(container_to_add)
@classmethod
- def _getSettingsDictForNode(cls, node) -> Tuple[dict, dict]:
- node_mapped_settings_dict = dict()
- node_unmapped_settings_dict = dict()
+ def _getSettingsDictForNode(cls, node) -> Tuple[Dict[str, Any], Dict[str, Any]]:
+ node_mapped_settings_dict = dict() # type: Dict[str, Any]
+ node_unmapped_settings_dict = dict() # type: Dict[str, Any]
# Fetch settings in the "um" namespace
um_settings = node.iterfind("./um:setting", cls.__namespaces)
@@ -950,7 +973,7 @@ class XmlMaterialProfile(InstanceContainer):
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"), [])
+ machine_id_list = product_id_map.get(identifier.get("product", ""), [])
if not machine_id_list:
machine_id_list = cls.getPossibleDefinitionIDsFromName(identifier.get("product"))
@@ -982,7 +1005,7 @@ class XmlMaterialProfile(InstanceContainer):
result_metadata.append(new_material_metadata)
buildplates = machine.iterfind("./um:buildplate", cls.__namespaces)
- buildplate_map = {} # type: Dict[str, Dict[str, bool]]
+ buildplate_map = {} # type: Dict[str, Dict[str, bool]]
buildplate_map["buildplate_compatible"] = {}
buildplate_map["buildplate_recommended"] = {}
for buildplate in buildplates:
@@ -1111,8 +1134,8 @@ class XmlMaterialProfile(InstanceContainer):
builder.data(data)
builder.end(tag_name)
- @classmethod
- def _profile_name(cls, material_name, color_name):
+ @staticmethod
+ def _profile_name(material_name, color_name):
if material_name is None:
return "Unknown Material"
if color_name != "Generic":
@@ -1120,8 +1143,8 @@ class XmlMaterialProfile(InstanceContainer):
else:
return material_name
- @classmethod
- def getPossibleDefinitionIDsFromName(cls, name):
+ @staticmethod
+ def getPossibleDefinitionIDsFromName(name):
name_parts = name.lower().split(" ")
merged_name_parts = []
for part in name_parts:
@@ -1159,14 +1182,16 @@ class XmlMaterialProfile(InstanceContainer):
return product_to_id_map
## Parse the value of the "material compatible" property.
- @classmethod
- def _parseCompatibleValue(cls, value: str):
+ @staticmethod
+ def _parseCompatibleValue(value: str):
return value in {"yes", "unknown"}
## Small string representation for debugging.
def __str__(self):
return "".format(my_id = self.getId(), name = self.getName(), base_file = self.getMetaDataEntry("base_file"))
+ _metadata_tags_that_have_cura_namespace = {"pva_compatible", "breakaway_compatible"}
+
# Map XML file setting names to internal names
__material_settings_setting_map = {
"print temperature": "default_material_print_temperature",
@@ -1179,7 +1204,15 @@ class XmlMaterialProfile(InstanceContainer):
"adhesion tendency": "material_adhesion_tendency",
"surface energy": "material_surface_energy",
"shrinkage percentage": "material_shrinkage_percentage",
- }
+ "build volume temperature": "build_volume_temperature",
+ "anti ooze retract position": "material_anti_ooze_retracted_position",
+ "anti ooze retract speed": "material_anti_ooze_retraction_speed",
+ "break preparation position": "material_break_preparation_retracted_position",
+ "break preparation speed": "material_break_preparation_speed",
+ "break position": "material_break_retracted_position",
+ "break speed": "material_break_speed",
+ "break temperature": "material_break_temperature"
+ } # type: Dict[str, str]
__unmapped_settings = [
"hardware compatible",
"hardware recommended"
diff --git a/plugins/XmlMaterialProfile/product_to_id.json b/plugins/XmlMaterialProfile/product_to_id.json
index 6b78d3fe64..a48eb20a18 100644
--- a/plugins/XmlMaterialProfile/product_to_id.json
+++ b/plugins/XmlMaterialProfile/product_to_id.json
@@ -6,6 +6,7 @@
"Ultimaker 2+": "ultimaker2_plus",
"Ultimaker 3": "ultimaker3",
"Ultimaker 3 Extended": "ultimaker3_extended",
+ "Ultimaker S3": "ultimaker_s3",
"Ultimaker S5": "ultimaker_s5",
"Ultimaker Original": "ultimaker_original",
"Ultimaker Original+": "ultimaker_original_plus",
diff --git a/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py b/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py
new file mode 100644
index 0000000000..1bc19f773a
--- /dev/null
+++ b/plugins/XmlMaterialProfile/tests/TestXmlMaterialProfile.py
@@ -0,0 +1,79 @@
+from unittest.mock import patch, MagicMock
+import sys
+import os
+
+# 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.
+
+import pytest
+import XmlMaterialProfile
+
+def createXmlMaterialProfile(material_id):
+ try:
+ return XmlMaterialProfile.XmlMaterialProfile.XmlMaterialProfile(material_id)
+ except AttributeError:
+ return XmlMaterialProfile.XmlMaterialProfile(material_id)
+
+
+def test_setName():
+ material_1 = createXmlMaterialProfile("herpderp")
+ material_2 = createXmlMaterialProfile("OMGZOMG")
+
+ material_1.getMetaData()["base_file"] = "herpderp"
+ material_2.getMetaData()["base_file"] = "herpderp"
+
+ container_registry = MagicMock()
+ container_registry.isReadOnly = MagicMock(return_value = False)
+ container_registry.findInstanceContainers = MagicMock(return_value = [material_1, material_2])
+
+ with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value = container_registry)):
+ material_1.setName("beep!")
+
+ assert material_1.getName() == "beep!"
+ assert material_2.getName() == "beep!"
+
+
+def test_setDirty():
+ material_1 = createXmlMaterialProfile("herpderp")
+ material_2 = createXmlMaterialProfile("OMGZOMG")
+
+ material_1.getMetaData()["base_file"] = "herpderp"
+ material_2.getMetaData()["base_file"] = "herpderp"
+
+ container_registry = MagicMock()
+ container_registry.isReadOnly = MagicMock(return_value=False)
+ container_registry.findContainers = MagicMock(return_value=[material_1, material_2])
+
+ # Sanity check. Since we did a hacky thing to set the metadata, the container should not be dirty.
+ # But this test assumes that it works like that, so we need to validate that.
+ assert not material_1.isDirty()
+ assert not material_2.isDirty()
+
+ with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
+ material_2.setDirty(True)
+
+ assert material_1.isDirty()
+ assert material_2.isDirty()
+
+ # Setting the base material dirty does not set it's child as dirty.
+ with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
+ material_1.setDirty(False)
+
+ assert not material_1.isDirty()
+ assert material_2.isDirty()
+
+
+def test_serializeNonBaseMaterial():
+ material_1 = createXmlMaterialProfile("herpderp")
+ material_1.getMetaData()["base_file"] = "omgzomg"
+
+ container_registry = MagicMock()
+ container_registry.isReadOnly = MagicMock(return_value=False)
+ container_registry.findContainers = MagicMock(return_value=[material_1])
+
+ with patch("UM.Settings.ContainerRegistry.ContainerRegistry.getInstance", MagicMock(return_value=container_registry)):
+ with pytest.raises(NotImplementedError):
+ # This material is not a base material, so it can't be serialized!
+ material_1.serialize()
diff --git a/resources/bundled_packages/cura.json b/resources/bundled_packages/cura.json
index d359daea24..4d23d56e5c 100644
--- a/resources/bundled_packages/cura.json
+++ b/resources/bundled_packages/cura.json
@@ -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",
+ "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"
}
@@ -577,23 +577,6 @@
}
}
},
- "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.0",
- "website": "https://ultimaker.com",
- "author": {
- "author_id": "UltimakerPackages",
- "display_name": "Ultimaker B.V.",
- "email": "plugins@ultimaker.com",
- "website": "https://ultimaker.com"
- }
- }
- },
"VersionUpgrade21to22": {
"package_info": {
"package_id": "VersionUpgrade21to22",
@@ -781,6 +764,40 @@
}
}
},
+ "VersionUpgrade41to42": {
+ "package_info": {
+ "package_id": "VersionUpgrade41to42",
+ "package_type": "plugin",
+ "display_name": "Version Upgrade 4.1 to 4.2",
+ "description": "Upgrades configurations from Cura 4.1 to Cura 4.2.",
+ "package_version": "1.0.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"
+ }
+ }
+ },
+ "VersionUpgrade42to43": {
+ "package_info": {
+ "package_id": "VersionUpgrade42to43",
+ "package_type": "plugin",
+ "display_name": "Version Upgrade 4.2 to 4.3",
+ "description": "Upgrades configurations from Cura 4.2 to Cura 4.3.",
+ "package_version": "1.0.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"
+ }
+ }
+ },
"X3DReader": {
"package_info": {
"package_id": "X3DReader",
@@ -1653,4 +1670,4 @@
}
}
}
-}
\ No newline at end of file
+}
diff --git a/resources/definitions/101Hero.def.json b/resources/definitions/101Hero.def.json
index d77f01fd82..a77ea5ed97 100644
--- a/resources/definitions/101Hero.def.json
+++ b/resources/definitions/101Hero.def.json
@@ -38,7 +38,7 @@
"speed_wall": { "value": "speed_print * 0.7" },
"speed_topbottom": { "value": "speed_print * 0.7" },
"speed_layer_0": { "value": "speed_print * 0.7" },
- "gantry_height": { "default_value": 0 },
+ "gantry_height": { "value": "0" },
"retraction_speed": { "default_value" : 10 },
"retraction_amount": { "default_value" : 2.5 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
diff --git a/resources/definitions/3dator.def.json b/resources/definitions/3dator.def.json
index e91c46920b..901ea87510 100644
--- a/resources/definitions/3dator.def.json
+++ b/resources/definitions/3dator.def.json
@@ -45,7 +45,7 @@
]
},
"gantry_height": {
- "default_value": 30
+ "value": "30"
},
"machine_start_gcode": {
"default_value": ";Sliced at: {day} {date} {time}\nM104 S{material_print_temperature} ;set temperatures\nM140 S{material_bed_temperature}\nM109 S{material_print_temperature} ;wait for temperatures\nM190 S{material_bed_temperature}\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nG28 Z0 ;move Z to min endstops\nG28 X0 Y0 ;move X/Y to min endstops\nG29 ;Auto Level\nG1 Z0.6 F{speed_travel} ;move the Nozzle near the Bed\nG92 E0\nG1 Y0 ;zero the extruded length\nG1 X10 E30 F500 ;printing a Line from right to left\nG92 E0 ;zero the extruded length again\nG1 Z2\nG1 F{speed_travel}\nM117 Printing...;Put printing message on LCD screen\nM150 R255 U255 B255 P4 ;Change LED Color to white" },
diff --git a/resources/definitions/Mark2_for_Ultimaker2.def.json b/resources/definitions/Mark2_for_Ultimaker2.def.json
new file mode 100644
index 0000000000..6a385c4b8b
--- /dev/null
+++ b/resources/definitions/Mark2_for_Ultimaker2.def.json
@@ -0,0 +1,227 @@
+{
+ "id": "Mark2_for_Ultimaker2",
+ "version": 2,
+ "name": "Mark2 for Ultimaker2",
+ "inherits": "ultimaker2_plus",
+ "metadata": {
+ "visible": true,
+ "author": "TheUltimakerCommunity",
+ "manufacturer": "Foehnsturm",
+ "category": "Other",
+ "weight": 0,
+ "has_variants": true,
+ "has_materials": true,
+ "has_machine_quality": false,
+ "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": {
+ "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 },
+ "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_u20.def.json b/resources/definitions/alfawise_u20.def.json
index 8a6badeca6..748bf8797a 100644
--- a/resources/definitions/alfawise_u20.def.json
+++ b/resources/definitions/alfawise_u20.def.json
@@ -39,7 +39,7 @@
"default_value": false
},
"gantry_height": {
- "default_value": 10
+ "value": "10"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/alfawise_u30.def.json b/resources/definitions/alfawise_u30.def.json
index bba1c056af..44caf61d1a 100644
--- a/resources/definitions/alfawise_u30.def.json
+++ b/resources/definitions/alfawise_u30.def.json
@@ -36,7 +36,7 @@
"retraction_enable": { "default_value": true },
"retraction_amount": { "default_value": 5 },
"retraction_speed": { "default_value": 45 },
- "gantry_height": { "default_value": 25 },
+ "gantry_height": { "value": "25" },
"machine_width": { "default_value": 220 },
"machine_height": { "default_value": 250 },
"machine_depth": { "default_value": 220 },
diff --git a/resources/definitions/alya3dp.def.json b/resources/definitions/alya3dp.def.json
index f449a89970..8de7c79641 100644
--- a/resources/definitions/alya3dp.def.json
+++ b/resources/definitions/alya3dp.def.json
@@ -30,7 +30,7 @@
"machine_height": { "default_value": 133 },
"machine_depth": { "default_value": 100 },
"machine_center_is_zero": { "default_value": false },
- "gantry_height": { "default_value": 55 },
+ "gantry_height": { "value": "55"},
"retraction_amount": { "default_value": 1.5 },
"support_enable": { "default_value": true},
"machine_head_with_fans_polygon": {
@@ -44,7 +44,7 @@
},
"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{travel_speed} ;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}"
+ "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
index efc97c09d1..07e0a090a9 100644
--- a/resources/definitions/alyanx3dp.def.json
+++ b/resources/definitions/alyanx3dp.def.json
@@ -30,7 +30,7 @@
"machine_height": { "default_value": 170 },
"machine_depth": { "default_value": 160 },
"machine_center_is_zero": { "default_value": false },
- "gantry_height": { "default_value": 55 },
+ "gantry_height": { "value": "55"},
"retraction_amount": { "default_value": 1.5 },
"support_enable": { "default_value": true},
"machine_head_with_fans_polygon": {
@@ -44,7 +44,7 @@
},
"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{travel_speed} ;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}"
+ "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..0f5384451e
--- /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": {
+ "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..05fffcb206 100644
--- a/resources/definitions/anycubic_4max.def.json
+++ b/resources/definitions/anycubic_4max.def.json
@@ -50,7 +50,7 @@
"jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" },
"jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" },
- "gantry_height": { "default_value": 25.0 },
+ "gantry_height": { "value": "25.0" },
"skin_overlap": { "value": "10" },
"acceleration_enabled": { "value": "True" },
@@ -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
index 83c2056d76..1b18a936a7 100644
--- a/resources/definitions/anycubic_chiron.def.json
+++ b/resources/definitions/anycubic_chiron.def.json
@@ -52,7 +52,7 @@
},
"gantry_height":
{
- "default_value": 35
+ "value": "35"
},
"machine_head_with_fans_polygon":
{
diff --git a/resources/definitions/anycubic_i3_mega.def.json b/resources/definitions/anycubic_i3_mega.def.json
index 8a96d98023..cc9832cf09 100644
--- a/resources/definitions/anycubic_i3_mega.def.json
+++ b/resources/definitions/anycubic_i3_mega.def.json
@@ -46,7 +46,7 @@
},
"gantry_height":
{
- "default_value": 0
+ "value": "0"
},
"machine_gcode_flavor":
{
@@ -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/bibo2_dual.def.json b/resources/definitions/bibo2_dual.def.json
index 1ae16a49b1..e86c979260 100644
--- a/resources/definitions/bibo2_dual.def.json
+++ b/resources/definitions/bibo2_dual.def.json
@@ -5,7 +5,7 @@
"inherits": "fdmprinter",
"metadata": {
"visible": true,
- "author": "na",
+ "author": "unknown",
"manufacturer": "BIBO",
"category": "Other",
"file_formats": "text/x-gcode",
@@ -64,7 +64,7 @@
]
},
"gantry_height": {
- "default_value": 12
+ "value": "12"
},
"machine_use_extruder_offset_to_offset_coords": {
"default_value": true
diff --git a/resources/definitions/builder_premium_large.def.json b/resources/definitions/builder_premium_large.def.json
index 2e0cd4f839..3ceae8d63f 100644
--- a/resources/definitions/builder_premium_large.def.json
+++ b/resources/definitions/builder_premium_large.def.json
@@ -93,7 +93,7 @@
"machine_nozzle_heat_up_speed": { "default_value": 2 },
"machine_nozzle_cool_down_speed": { "default_value": 2 },
"machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] },
- "gantry_height": { "default_value": 55 },
+ "gantry_height": { "value": "55" },
"machine_max_feedrate_x": { "default_value": 300 },
"machine_max_feedrate_y": { "default_value": 300 },
"machine_max_feedrate_z": { "default_value": 40 },
diff --git a/resources/definitions/builder_premium_medium.def.json b/resources/definitions/builder_premium_medium.def.json
index 58e7c18ed8..5f608ba2a8 100644
--- a/resources/definitions/builder_premium_medium.def.json
+++ b/resources/definitions/builder_premium_medium.def.json
@@ -93,7 +93,7 @@
"machine_nozzle_heat_up_speed": { "default_value": 2 },
"machine_nozzle_cool_down_speed": { "default_value": 2 },
"machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] },
- "gantry_height": { "default_value": 55 },
+ "gantry_height": { "value": "55" },
"machine_max_feedrate_x": { "default_value": 300 },
"machine_max_feedrate_y": { "default_value": 300 },
"machine_max_feedrate_z": { "default_value": 40 },
diff --git a/resources/definitions/builder_premium_small.def.json b/resources/definitions/builder_premium_small.def.json
index 89e172592c..a19773ec05 100644
--- a/resources/definitions/builder_premium_small.def.json
+++ b/resources/definitions/builder_premium_small.def.json
@@ -92,7 +92,7 @@
"machine_nozzle_heat_up_speed": { "default_value": 2 },
"machine_nozzle_cool_down_speed": { "default_value": 2 },
"machine_head_polygon": { "default_value": [[-75, -18],[-75, 35],[18, 35],[18, -18]] },
- "gantry_height": { "default_value": 55 },
+ "gantry_height": { "value": "55" },
"machine_max_feedrate_x": { "default_value": 300 },
"machine_max_feedrate_y": { "default_value": 300 },
"machine_max_feedrate_z": { "default_value": 40 },
diff --git a/resources/definitions/cartesio.def.json b/resources/definitions/cartesio.def.json
index 9c7a95cceb..4ed1a9f2d9 100644
--- a/resources/definitions/cartesio.def.json
+++ b/resources/definitions/cartesio.def.json
@@ -10,7 +10,6 @@
"has_machine_quality": true,
"has_materials": true,
- "has_machine_materials": true,
"has_variants": true,
"variants_name": "Tool",
@@ -35,7 +34,7 @@
"machine_extruder_count": { "default_value": 2 },
"machine_heated_bed": { "default_value": true },
"machine_center_is_zero": { "default_value": false },
- "gantry_height": { "default_value": 35 },
+ "gantry_height": { "value": "35" },
"machine_height": { "default_value": 400 },
"machine_depth": { "default_value": 270 },
"machine_width": { "default_value": 430 },
diff --git a/resources/definitions/cocoon_create_modelmaker.def.json b/resources/definitions/cocoon_create_modelmaker.def.json
index 22aa75d09e..83d1f41a99 100644
--- a/resources/definitions/cocoon_create_modelmaker.def.json
+++ b/resources/definitions/cocoon_create_modelmaker.def.json
@@ -39,7 +39,7 @@
"default_value": false
},
"gantry_height": {
- "default_value": 10
+ "value": "10"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/creality_base.def.json b/resources/definitions/creality_base.def.json
new file mode 100644
index 0000000000..d7e028f31a
--- /dev/null
+++ b/resources/definitions/creality_base.def.json
@@ -0,0 +1,267 @@
+{
+ "name": "Creawsome Base Printer",
+ "version": 2,
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": false,
+ "author": "trouch.com",
+ "manufacturer": "Creality3D",
+ "file_formats": "text/x-gcode",
+ "first_start_actions": ["MachineSettingsAction"],
+
+ "machine_extruder_trains": {
+ "0": "creality_base_extruder_0"
+ },
+
+ "has_materials": true,
+ "has_variants": true,
+ "has_machine_quality": true,
+ "variants_name": "Nozzle Size",
+
+ "preferred_variant_name": "0.4mm Nozzle",
+ "preferred_quality_type": "standard",
+ "preferred_material": "generic_pla",
+ "exclude_materials": [
+ "Vertex_Delta_ABS",
+ "Vertex_Delta_PET",
+ "Vertex_Delta_PLA",
+ "Vertex_Delta_TPU",
+ "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_bam",
+ "generic_cffcpe",
+ "generic_cffpa",
+ "generic_cpe",
+ "generic_cpe_plus",
+ "generic_gffcpe",
+ "generic_gffpa",
+ "generic_hips",
+ "generic_nylon",
+ "generic_pc",
+ "generic_petg",
+ "generic_pla",
+ "generic_pp",
+ "generic_pva",
+ "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",
+ "structur3d_dap100silicone",
+ "tizyx_abs",
+ "tizyx_pla",
+ "tizyx_pla_bois",
+ "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",
+ "zyyx_pro_flex",
+ "zyyx_pro_pla"
+ ]
+ },
+ "overrides": {
+ "machine_name": { "default_value": "Creawsome Base Printer" },
+ "machine_start_gcode": { "default_value": "M201 X500.00 Y500.00 Z100.00 E5000.00 ;Setup machine max acceleration\nM203 X500.00 Y500.00 Z10.00 E50.00 ;Setup machine max feedrate\nM204 P500.00 R1000.00 T500.00 ;Setup Print/Retract/Travel acceleration\nM205 X8.00 Y8.00 Z0.40 E5.00 ;Setup Jerk\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\n\nG28 ;Home\n\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\nG1 X10.1 Y20 Z0.28 F5000.0 ;Move to start position\nG1 X10.1 Y200.0 Z0.28 F1500.0 E15 ;Draw the first line\nG1 X10.4 Y200.0 Z0.28 F5000.0 ;Move to side a little\nG1 X10.4 Y20 Z0.28 F1500.0 E30 ;Draw the second line\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\n" },
+ "machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positionning\n\nG1 X0 Y{machine_depth} ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\n\nM84 X Y E ;Disable all steppers but Z\n" },
+
+ "machine_max_feedrate_x": { "value": 500 },
+ "machine_max_feedrate_y": { "value": 500 },
+ "machine_max_feedrate_z": { "value": 10 },
+ "machine_max_feedrate_e": { "value": 50 },
+
+ "machine_max_acceleration_x": { "value": 500 },
+ "machine_max_acceleration_y": { "value": 500 },
+ "machine_max_acceleration_z": { "value": 100 },
+ "machine_max_acceleration_e": { "value": 5000 },
+ "machine_acceleration": { "value": 500 },
+
+ "machine_max_jerk_xy": { "value": 10 },
+ "machine_max_jerk_z": { "value": 0.4 },
+ "machine_max_jerk_e": { "value": 5 },
+
+ "machine_heated_bed": { "default_value": true },
+
+ "material_diameter": { "default_value": 1.75 },
+
+ "acceleration_print": { "value": 500 },
+ "acceleration_travel": { "value": 500 },
+ "acceleration_travel_layer_0": { "value": "acceleration_travel" },
+ "acceleration_roofing": { "enabled": "acceleration_enabled and roofing_layer_count > 0 and top_layers > 0" },
+
+ "jerk_print": { "value": 8 },
+ "jerk_travel": { "value": "jerk_print" },
+ "jerk_travel_layer_0": { "value": "jerk_travel" },
+
+ "acceleration_enabled": { "value": false },
+ "jerk_enabled": { "value": false },
+
+ "speed_print": { "value": 50.0 } ,
+ "speed_infill": { "value": "speed_print" },
+ "speed_wall": { "value": "speed_print / 2" },
+ "speed_wall_0": { "value": "speed_wall" },
+ "speed_wall_x": { "value": "speed_wall" },
+ "speed_topbottom": { "value": "speed_print / 2" },
+ "speed_roofing": { "value": "speed_topbottom" },
+ "speed_travel": { "value": "150.0 if speed_print < 60 else 250.0 if speed_print > 100 else speed_print * 2.5" },
+ "speed_layer_0": { "value": 20.0 },
+ "speed_print_layer_0": { "value": "speed_layer_0" },
+ "speed_travel_layer_0": { "value": "100 if speed_layer_0 < 20 else 150 if speed_layer_0 > 30 else speed_layer_0 * 5" },
+ "speed_prime_tower": { "value": "speed_topbottom" },
+ "speed_support": { "value": "speed_wall_0" },
+ "speed_support_interface": { "value": "speed_topbottom" },
+ "speed_z_hop": { "value": 5 },
+
+ "skirt_brim_speed": { "value": "speed_layer_0" },
+
+ "line_width": { "value": "machine_nozzle_size" },
+
+ "optimize_wall_printing_order": { "value": "True" },
+
+ "material_initial_print_temperature": { "value": "material_print_temperature" },
+ "material_final_print_temperature": { "value": "material_print_temperature" },
+ "material_flow": { "value": 100 },
+ "travel_compensate_overlapping_walls_0_enabled": { "value": "False" },
+
+ "z_seam_type": { "value": "'back'" },
+ "z_seam_corner": { "value": "'z_seam_corner_weighted'" },
+
+ "infill_sparse_density": { "value": "20" },
+ "infill_pattern": { "value": "'lines' if infill_sparse_density > 50 else 'cubic'" },
+ "infill_before_walls": { "value": false },
+ "infill_overlap": { "value": 30.0 },
+ "skin_overlap": { "value": 10.0 },
+ "infill_wipe_dist": { "value": 0.0 },
+ "wall_0_wipe_dist": { "value": 0.0 },
+
+ "fill_perimeter_gaps": { "value": "'everywhere'" },
+ "fill_outline_gaps": { "value": false },
+ "filter_out_tiny_gaps": { "value": false },
+
+ "retraction_speed": {
+ "maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')",
+ "maximum_value": 200
+ },
+ "retraction_retract_speed": {
+ "maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')",
+ "maximum_value": 200
+ },
+ "retraction_prime_speed": {
+ "maximum_value_warning": "machine_max_feedrate_e if retraction_enable else float('inf')",
+ "maximum_value": 200
+ },
+
+ "retraction_hop_enabled": { "value": "False" },
+ "retraction_hop": { "value": 0.2 },
+ "retraction_combing": { "value": "'off' if retraction_hop_enabled else 'noskin'" },
+ "retraction_combing_max_distance": { "value": 30 },
+ "travel_avoid_other_parts": { "value": true },
+ "travel_avoid_supports": { "value": true },
+ "travel_retract_before_outer_wall": { "value": true },
+
+ "retraction_enable": { "value": true },
+ "retraction_count_max": { "value": 100 },
+ "retraction_extrusion_window": { "value": 10 },
+ "retraction_min_travel": { "value": 1.5 },
+
+ "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" },
+ "cool_fan_enabled": { "value": true },
+ "cool_min_layer_time": { "value": 10 },
+
+ "adhesion_type": { "value": "'skirt'" },
+ "brim_replaces_support": { "value": false },
+ "skirt_gap": { "value": 10.0 },
+ "skirt_line_count": { "value": 3 },
+
+ "adaptive_layer_height_variation": { "value": 0.04 },
+ "adaptive_layer_height_variation_step": { "value": 0.04 },
+
+ "meshfix_maximum_resolution": { "value": "0.05" },
+ "meshfix_maximum_travel_resolution": { "value": "meshfix_maximum_resolution" },
+
+ "support_angle": { "value": "math.floor(math.degrees(math.atan(line_width/2.0/layer_height)))" },
+ "support_pattern": { "value": "'zigzag'" },
+ "support_infill_rate": { "value": "0 if support_tree_enable else 20" },
+ "support_use_towers": { "value": false },
+ "support_xy_distance": { "value": "wall_line_width_0 * 2" },
+ "support_xy_distance_overhang": { "value": "wall_line_width_0" },
+ "support_z_distance": { "value": "layer_height if layer_height >= 0.16 else layer_height*2" },
+ "support_xy_overrides_z": { "value": "'xy_overrides_z'" },
+ "support_wall_count": { "value": 1 },
+ "support_brim_enable": { "value": true },
+ "support_brim_width": { "value": 4 },
+
+ "support_interface_enable": { "value": true },
+ "support_interface_height": { "value": "layer_height * 4" },
+ "support_interface_density": { "value": 33.333 },
+ "support_interface_pattern": { "value": "'grid'" },
+ "support_interface_skip_height": { "value": 0.2 },
+ "minimum_support_area": { "value": 5 },
+ "minimum_interface_area": { "value": 10 },
+ "top_bottom_thickness": {"value": "layer_height_0 + layer_height * 3" },
+ "wall_thickness": {"value": "line_width * 2" }
+
+ }
+}
\ No newline at end of file
diff --git a/resources/definitions/creality_cr-x.def.json b/resources/definitions/creality_cr-x.def.json
index 94ac20cbb5..0117c4fffe 100644
--- a/resources/definitions/creality_cr-x.def.json
+++ b/resources/definitions/creality_cr-x.def.json
@@ -30,7 +30,7 @@
"retraction_amount": { "default_value": 3 },
"retraction_speed": { "default_value": 70},
"adhesion_type": { "default_value": "skirt" },
- "gantry_height": { "default_value": 30 },
+ "gantry_height": { "value": "30" },
"speed_print": { "default_value": 60 },
"speed_travel": { "default_value": 120 },
"machine_max_acceleration_x": { "default_value": 500 },
diff --git a/resources/definitions/creality_cr10.def.json b/resources/definitions/creality_cr10.def.json
index fb63867163..0a08c56cc6 100644
--- a/resources/definitions/creality_cr10.def.json
+++ b/resources/definitions/creality_cr10.def.json
@@ -1,95 +1,32 @@
{
"name": "Creality CR-10",
"version": 2,
- "inherits": "fdmprinter",
- "metadata": {
- "visible": true,
- "author": "Michael Wildermuth",
- "manufacturer": "Creality3D",
- "file_formats": "text/x-gcode",
- "preferred_quality_type": "draft",
- "machine_extruder_trains":
- {
- "0": "creality_cr10_extruder_0"
- }
- },
+ "inherits": "creality_base",
"overrides": {
- "machine_width": {
- "default_value": 300
- },
- "machine_height": {
- "default_value": 400
- },
- "machine_depth": {
- "default_value": 300
- },
- "machine_head_polygon": {
- "default_value": [
- [-30, 34],
- [-30, -32],
- [30, -32],
- [30, 34]
+ "machine_name": { "default_value": "Creality CR-10" },
+ "machine_width": { "default_value": 300 },
+ "machine_depth": { "default_value": 300 },
+ "machine_height": { "default_value": 400 },
+ "machine_head_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [22, -32],
+ [22, 34]
]
},
- "layer_height_0": {
- "default_value": 0.2
+ "machine_head_with_fans_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [32, -32],
+ [32, 34]
+ ]
},
- "top_bottom_thickness": {
- "default_value": 0.6
- },
- "top_bottom_pattern_0": {
- "default_value": "concentric"
- },
- "infill_pattern": {
- "value": "'triangles'"
- },
- "retraction_enable": {
- "default_value": true
- },
- "retraction_amount": {
- "default_value": 5
- },
- "retraction_speed": {
- "default_value": 40
- },
- "cool_min_layer_time": {
- "default_value": 10
- },
- "adhesion_type": {
- "default_value": "skirt"
- },
- "skirt_line_count": {
- "default_value": 4
- },
- "skirt_gap": {
- "default_value": 5
- },
- "machine_end_gcode": {
- "default_value": "G91\nG1 F1800 E-3\nG1 F3000 Z10\nG90\nG28 X0 Y0 ; home x and y axis\nM106 S0 ; turn off cooling fan\nM104 S0 ; turn off extruder\nM140 S0 ; turn off bed\nM84 ; disable motors"
- },
- "machine_heated_bed": {
- "default_value": true
- },
- "gantry_height": {
- "default_value": 30
- },
- "acceleration_enabled": {
- "default_value": true
- },
- "acceleration_print": {
- "default_value": 500
- },
- "acceleration_travel": {
- "default_value": 500
- },
- "jerk_enabled": {
- "default_value": true
- },
- "jerk_print": {
- "default_value": 20
- },
- "jerk_travel": {
- "default_value": 20
- }
+
+ "gantry_height": { "value": 25 }
+
+ },
+ "metadata": {
+ "quality_definition": "creality_base",
+ "visible": true
}
}
\ No newline at end of file
diff --git a/resources/definitions/creality_cr10mini.def.json b/resources/definitions/creality_cr10mini.def.json
new file mode 100644
index 0000000000..bdc0d4406e
--- /dev/null
+++ b/resources/definitions/creality_cr10mini.def.json
@@ -0,0 +1,32 @@
+{
+ "name": "Creality CR-10 Mini",
+ "version": 2,
+ "inherits": "creality_base",
+ "overrides": {
+ "machine_name": { "default_value": "Creality CR-10 Mini" },
+ "machine_width": { "default_value": 300 },
+ "machine_depth": { "default_value": 220 },
+ "machine_height": { "default_value": 300 },
+ "machine_head_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [22, -32],
+ [22, 34]
+ ]
+ },
+ "machine_head_with_fans_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [32, -32],
+ [32, 34]
+ ]
+ },
+
+ "gantry_height": { "value": 25 }
+
+ },
+ "metadata": {
+ "quality_definition": "creality_base",
+ "visible": true
+ }
+}
\ No newline at end of file
diff --git a/resources/definitions/creality_cr10s.def.json b/resources/definitions/creality_cr10s.def.json
index c368269a46..9884b95cb4 100644
--- a/resources/definitions/creality_cr10s.def.json
+++ b/resources/definitions/creality_cr10s.def.json
@@ -1,5 +1,11 @@
{
"name": "Creality CR-10S",
"version": 2,
- "inherits": "creality_cr10"
+ "inherits": "creality_cr10",
+ "overrides": {
+ "machine_name": { "default_value": "Creality CR-10S" }
+ },
+ "metadata": {
+ "quality_definition": "creality_base"
+ }
}
\ No newline at end of file
diff --git a/resources/definitions/creality_cr10s4.def.json b/resources/definitions/creality_cr10s4.def.json
index 7145083674..593a526fc3 100644
--- a/resources/definitions/creality_cr10s4.def.json
+++ b/resources/definitions/creality_cr10s4.def.json
@@ -1,26 +1,32 @@
{
- "name": "Creality CR-10 S4",
+ "name": "Creality CR-10S4",
"version": 2,
- "inherits": "creality_cr10",
- "metadata": {
- "visible": true,
- "author": "Michael Wildermuth",
- "manufacturer": "Creality3D",
- "file_formats": "text/x-gcode",
- "machine_extruder_trains":
- {
- "0": "creality_cr10s4_extruder_0"
- }
- },
+ "inherits": "creality_base",
"overrides": {
- "machine_width": {
- "default_value": 400
+ "machine_name": { "default_value": "Creality CR-10S4" },
+ "machine_width": { "default_value": 400 },
+ "machine_depth": { "default_value": 400 },
+ "machine_height": { "default_value": 400 },
+ "machine_head_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [22, -32],
+ [22, 34]
+ ]
},
- "machine_height": {
- "default_value": 400
+ "machine_head_with_fans_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [32, -32],
+ [32, 34]
+ ]
},
- "machine_depth": {
- "default_value": 400
- }
+
+ "gantry_height": { "value": 25 }
+
+ },
+ "metadata": {
+ "quality_definition": "creality_base",
+ "visible": true
}
}
\ No newline at end of file
diff --git a/resources/definitions/creality_cr10s5.def.json b/resources/definitions/creality_cr10s5.def.json
index b082894a16..91469deb7f 100644
--- a/resources/definitions/creality_cr10s5.def.json
+++ b/resources/definitions/creality_cr10s5.def.json
@@ -1,26 +1,32 @@
{
- "name": "Creality CR-10 S5",
+ "name": "Creality CR-10S5",
"version": 2,
- "inherits": "creality_cr10",
- "metadata": {
- "visible": true,
- "author": "Michael Wildermuth",
- "manufacturer": "Creality3D",
- "file_formats": "text/x-gcode",
- "machine_extruder_trains":
- {
- "0": "creality_cr10s5_extruder_0"
- }
- },
+ "inherits": "creality_base",
"overrides": {
- "machine_width": {
- "default_value": 500
+ "machine_name": { "default_value": "Creality CR-10S5" },
+ "machine_width": { "default_value": 500 },
+ "machine_depth": { "default_value": 500 },
+ "machine_height": { "default_value": 500 },
+ "machine_head_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [22, -32],
+ [22, 34]
+ ]
},
- "machine_height": {
- "default_value": 500
+ "machine_head_with_fans_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [32, -32],
+ [32, 34]
+ ]
},
- "machine_depth": {
- "default_value": 500
- }
+
+ "gantry_height": { "value": 25 }
+
+ },
+ "metadata": {
+ "quality_definition": "creality_base",
+ "visible": true
}
}
\ No newline at end of file
diff --git a/resources/definitions/creality_cr10spro.def.json b/resources/definitions/creality_cr10spro.def.json
new file mode 100644
index 0000000000..86897e711a
--- /dev/null
+++ b/resources/definitions/creality_cr10spro.def.json
@@ -0,0 +1,31 @@
+{
+ "name": "Creality CR-10S Pro",
+ "version": 2,
+ "inherits": "creality_cr10",
+ "overrides": {
+ "machine_name": { "default_value": "Creality CR-10S Pro" },
+ "machine_start_gcode": { "default_value": "M201 X500.00 Y500.00 Z100.00 E5000.00 ;Setup machine max acceleration\nM203 X500.00 Y500.00 Z10.00 E50.00 ;Setup machine max feedrate\nM204 P500.00 R1000.00 T500.00 ;Setup Print/Retract/Travel acceleration\nM205 X8.00 Y8.00 Z0.40 E5.00 ;Setup Jerk\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\n\nG28 ;Home\nM420 S1 Z2 ;Enable ABL using saved Mesh and Fade Height\n\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\nG1 X10.1 Y20 Z0.28 F5000.0 ;Move to start position\nG1 X10.1 Y200.0 Z0.28 F1500.0 E15 ;Draw the first line\nG1 X10.4 Y200.0 Z0.28 F5000.0 ;Move to side a little\nG1 X10.4 Y20 Z0.28 F1500.0 E30 ;Draw the second line\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\n"},
+ "machine_head_polygon": { "default_value": [
+ [-44, 34],
+ [-44, -34],
+ [18, -34],
+ [18, 34]
+ ]
+ },
+ "machine_head_with_fans_polygon": { "default_value": [
+ [-44, 34],
+ [-44, -34],
+ [38, -34],
+ [38, 34]
+ ]
+ },
+
+ "gantry_height": { "value": 30 }
+
+ },
+ "metadata": {
+ "quality_definition": "creality_base",
+ "platform": "creality_cr10spro.stl",
+ "platform_offset": [ -150, 0, 150]
+ }
+}
\ No newline at end of file
diff --git a/resources/definitions/creality_cr20.def.json b/resources/definitions/creality_cr20.def.json
new file mode 100644
index 0000000000..af027f2452
--- /dev/null
+++ b/resources/definitions/creality_cr20.def.json
@@ -0,0 +1,32 @@
+{
+ "name": "Creality CR-20",
+ "version": 2,
+ "inherits": "creality_base",
+ "overrides": {
+ "machine_name": { "default_value": "Creality CR-20" },
+ "machine_width": { "default_value": 220 },
+ "machine_depth": { "default_value": 220 },
+ "machine_height": { "default_value": 250 },
+ "machine_head_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [22, -32],
+ [22, 34]
+ ]
+ },
+ "machine_head_with_fans_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [32, -32],
+ [32, 34]
+ ]
+ },
+
+ "gantry_height": { "value": 25 }
+
+ },
+ "metadata": {
+ "quality_definition": "creality_base",
+ "visible": true
+ }
+}
\ No newline at end of file
diff --git a/resources/definitions/creality_cr20pro.def.json b/resources/definitions/creality_cr20pro.def.json
new file mode 100644
index 0000000000..4e676bcb74
--- /dev/null
+++ b/resources/definitions/creality_cr20pro.def.json
@@ -0,0 +1,13 @@
+{
+ "name": "Creality CR-20 Pro",
+ "version": 2,
+ "inherits": "creality_cr20",
+ "overrides": {
+ "machine_name": { "default_value": "Creality CR-20 Pro" },
+ "machine_start_gcode": { "default_value": "M201 X500.00 Y500.00 Z100.00 E5000.00 ;Setup machine max acceleration\nM203 X500.00 Y500.00 Z10.00 E50.00 ;Setup machine max feedrate\nM204 P500.00 R1000.00 T500.00 ;Setup Print/Retract/Travel acceleration\nM205 X8.00 Y8.00 Z0.40 E5.00 ;Setup Jerk\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\n\nG28 ;Home\nM420 S1 Z2 ;Enable ABL using saved Mesh and Fade Height\n\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\nG1 X10.1 Y20 Z0.28 F5000.0 ;Move to start position\nG1 X10.1 Y200.0 Z0.28 F1500.0 E15 ;Draw the first line\nG1 X10.4 Y200.0 Z0.28 F5000.0 ;Move to side a little\nG1 X10.4 Y20 Z0.28 F1500.0 E30 ;Draw the second line\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\n"}
+
+ },
+ "metadata": {
+ "quality_definition": "creality_base"
+ }
+}
\ No newline at end of file
diff --git a/resources/definitions/creality_ender2.def.json b/resources/definitions/creality_ender2.def.json
new file mode 100644
index 0000000000..55b2e88478
--- /dev/null
+++ b/resources/definitions/creality_ender2.def.json
@@ -0,0 +1,33 @@
+{
+ "name": "Creality Ender-2",
+ "version": 2,
+ "inherits": "creality_base",
+ "overrides": {
+ "machine_name": { "default_value": "Creality Ender-2" },
+ "machine_start_gcode": { "default_value": "M201 X500.00 Y500.00 Z100.00 E5000.00 ;Setup machine max acceleration\nM203 X500.00 Y500.00 Z10.00 E50.00 ;Setup machine max feedrate\nM204 P500.00 R1000.00 T500.00 ;Setup Print/Retract/Travel acceleration\nM205 X8.00 Y8.00 Z0.40 E5.00 ;Setup Jerk\nM220 S100 ;Reset Feedrate\nM221 S100 ;Reset Flowrate\n\nG28 ;Home\n\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\nG1 X10.1 Y20 Z0.28 F5000.0 ;Move to start position\nG1 X10.1 Y100.0 Z0.28 F1500.0 E8 ;Draw the first line\nG1 X10.4 Y100.0 Z0.28 F5000.0 ;Move to side a little\nG1 X10.4 Y20 Z0.28 F1500.0 E15 ;Draw the second line\nG92 E0 ;Reset Extruder\nG1 Z2.0 F3000 ;Move Z Axis up\n"},
+ "machine_width": { "default_value": 150 },
+ "machine_depth": { "default_value": 150 },
+ "machine_height": { "default_value": 200 },
+ "machine_head_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [22, -32],
+ [22, 34]
+ ]
+ },
+ "machine_head_with_fans_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [32, -32],
+ [32, 34]
+ ]
+ },
+
+ "gantry_height": { "value": 25 }
+
+ },
+ "metadata": {
+ "quality_definition": "creality_base",
+ "visible": true
+ }
+}
\ No newline at end of file
diff --git a/resources/definitions/creality_ender3.def.json b/resources/definitions/creality_ender3.def.json
old mode 100755
new mode 100644
index 1af70fab63..645be52bc8
--- a/resources/definitions/creality_ender3.def.json
+++ b/resources/definitions/creality_ender3.def.json
@@ -1,93 +1,32 @@
{
"name": "Creality Ender-3",
"version": 2,
- "inherits": "fdmprinter",
+ "inherits": "creality_base",
"metadata": {
+ "quality_definition": "creality_base",
"visible": true,
- "author": "Sacha Telgenhof",
- "manufacturer": "Creality3D",
- "file_formats": "text/x-gcode",
- "platform": "creality_ender3_platform.stl",
- "preferred_quality_type": "draft",
- "machine_extruder_trains":
- {
- "0": "creality_ender3_extruder_0"
- }
+ "platform": "creality_ender3.stl"
},
"overrides": {
- "machine_name": {
- "default_value": "Creality Ender-3"
- },
- "machine_width": {
- "default_value": 235
- },
- "machine_height": {
- "default_value": 250
- },
- "machine_depth": {
- "default_value": 235
- },
- "machine_heated_bed": {
- "default_value": true
- },
- "gantry_height": {
- "default_value": 30
- },
- "machine_head_polygon": {
- "default_value": [
- [-30, 34],
- [-30, -32],
- [30, -32],
- [30, 34]
+ "machine_name": { "default_value": "Creality Ender-3" },
+ "machine_width": { "default_value": 220 },
+ "machine_depth": { "default_value": 220 },
+ "machine_height": { "default_value": 250 },
+ "machine_head_polygon": { "default_value": [
+ [-1, 1],
+ [-1, -1],
+ [1, -1],
+ [1, 1]
]
},
- "material_diameter": {
- "default_value": 1.75
+ "machine_head_with_fans_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [32, -32],
+ [32, 34]
+ ]
},
- "acceleration_enabled": {
- "default_value": true
- },
- "acceleration_print": {
- "default_value": 500
- },
- "acceleration_travel": {
- "value": "acceleration_print"
- },
- "jerk_enabled": {
- "default_value": true
- },
- "jerk_travel": {
- "value": "jerk_print"
- },
- "layer_height_0": {
- "default_value": 0.2
- },
- "adhesion_type": {
- "default_value": "skirt"
- },
- "top_bottom_thickness": {
- "default_value": 0.6
- },
- "retraction_amount": {
- "default_value": 5
- },
- "retraction_speed": {
- "default_value": 40
- },
- "cool_min_layer_time": {
- "default_value": 10
- },
- "skirt_line_count": {
- "default_value": 4
- },
- "skirt_gap": {
- "default_value": 5
- },
- "machine_start_gcode": {
- "default_value": "; Ender 3 Custom Start G-code\nG28 ; Home all axes\nG92 E0 ; Reset Extruder\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\nG1 X0.1 Y20 Z0.3 F5000.0 ; Move to start position\nG1 X0.1 Y200.0 Z0.3 F1500.0 E15 ; Draw the first line\nG1 X0.4 Y200.0 Z0.3 F5000.0 ; Move to side a little\nG1 X0.4 Y20 Z0.3 F1500.0 E30 ; Draw the second line\nG92 E0 ; Reset Extruder\nG1 Z2.0 F3000 ; Move Z Axis up little to prevent scratching of Heat Bed\n; End of custom start GCode"
- },
- "machine_end_gcode": {
- "default_value": "; Ender 3 Custom End G-code\nG4 ; Wait\nM220 S100 ; Reset Speed factor override percentage to default (100%)\nM221 S100 ; Reset Extrude factor override percentage to default (100%)\nG91 ; Set coordinates to relative\nG1 F1800 E-3 ; Retract filament 3 mm to prevent oozing\nG1 F3000 Z20 ; Move Z Axis up 20 mm to allow filament ooze freely\nG90 ; Set coordinates to absolute\nG1 X0 Y{machine_depth} F1000 ; Move Heat Bed to the front for easy print removal\nM84 ; Disable stepper motors\n; End of custom end GCode"
- }
+
+ "gantry_height": { "value": 25 }
}
-}
+}
\ No newline at end of file
diff --git a/resources/definitions/creality_ender4.def.json b/resources/definitions/creality_ender4.def.json
new file mode 100644
index 0000000000..6962be558e
--- /dev/null
+++ b/resources/definitions/creality_ender4.def.json
@@ -0,0 +1,34 @@
+{
+ "name": "Creality Ender-4",
+ "version": 2,
+ "inherits": "creality_base",
+ "overrides": {
+ "machine_name": { "default_value": "Creality Ender-4" },
+ "machine_width": { "default_value": 452 },
+ "machine_depth": { "default_value": 468 },
+ "machine_height": { "default_value": 482 },
+ "machine_head_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [22, -32],
+ [22, 34]
+ ]
+ },
+ "machine_head_with_fans_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [32, -32],
+ [32, 34]
+ ]
+ },
+
+ "gantry_height": { "value": 25 },
+
+ "speed_print": { "value": 80.0 }
+
+ },
+ "metadata": {
+ "quality_definition": "creality_base",
+ "visible": true
+ }
+}
\ No newline at end of file
diff --git a/resources/definitions/creality_ender5.def.json b/resources/definitions/creality_ender5.def.json
new file mode 100644
index 0000000000..d95f4a1467
--- /dev/null
+++ b/resources/definitions/creality_ender5.def.json
@@ -0,0 +1,35 @@
+{
+ "name": "Creality Ender-5",
+ "version": 2,
+ "inherits": "creality_base",
+ "overrides": {
+ "machine_name": { "default_value": "Creality Ender-5" },
+ "machine_end_gcode": { "default_value": "G91 ;Relative positionning\nG1 E-2 F2700 ;Retract a bit\nG1 E-2 Z0.2 F2400 ;Retract and raise Z\nG1 X5 Y5 F3000 ;Wipe out\nG1 Z10 ;Raise Z more\nG90 ;Absolute positionning\n\nG1 X0 Y0 ;Present print\nM106 S0 ;Turn-off fan\nM104 S0 ;Turn-off hotend\nM140 S0 ;Turn-off bed\n\nM84 X Y E ;Disable all steppers but Z\n" },
+ "machine_width": { "default_value": 220 },
+ "machine_depth": { "default_value": 220 },
+ "machine_height": { "default_value": 300 },
+ "machine_head_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [22, -32],
+ [22, 34]
+ ]
+ },
+ "machine_head_with_fans_polygon": { "default_value": [
+ [-26, 34],
+ [-26, -32],
+ [32, -32],
+ [32, 34]
+ ]
+ },
+
+ "gantry_height": { "value": 25 },
+
+ "speed_print": { "value": 80.0 }
+
+ },
+ "metadata": {
+ "quality_definition": "creality_base",
+ "visible": true
+ }
+}
\ No newline at end of file
diff --git a/resources/definitions/creatable_d3.def.json b/resources/definitions/creatable_d3.def.json
index 3fb1205ead..1491089e24 100644
--- a/resources/definitions/creatable_d3.def.json
+++ b/resources/definitions/creatable_d3.def.json
@@ -24,8 +24,8 @@
"machine_depth": { "default_value": 250 },
"machine_heated_bed": { "default_value": true },
"machine_shape": { "default_value": "elliptic" },
- "machine_max_feedrate_z": { "default_value": 300 },
- "gantry_height": {"default_value": 43},
+ "machine_max_feedrate_z": { "default_value": 300 },
+ "gantry_height": {"value": "43"},
"layer_height": { "default_value": 0.1 },
"relative_extrusion": { "default_value": false },
"retraction_combing": { "default_value": "off" },
diff --git a/resources/definitions/dagoma_discoeasy200.def.json b/resources/definitions/dagoma_discoeasy200.def.json
index 89d94ff6b7..17e285a422 100644
--- a/resources/definitions/dagoma_discoeasy200.def.json
+++ b/resources/definitions/dagoma_discoeasy200.def.json
@@ -38,7 +38,7 @@
]
},
"gantry_height": {
- "default_value": 10
+ "value": "10"
},
"machine_start_gcode": {
"default_value": ";Gcode by Cura\nG90\nM106 S255\nG28 X Y\nG1 X50\nM109 R90\nG28\nM104 S{material_print_temperature_layer_0}\nG29\nM107\nG1 X100 Y20 F3000\nG1 Z0.5\nM109 S{material_print_temperature_layer_0}\nM82\nG92 E0\nG1 F200 E10\nG92 E0\nG1 Z3\nG1 F6000\n"
diff --git a/resources/definitions/dagoma_magis.def.json b/resources/definitions/dagoma_magis.def.json
index 75e6e449cd..9d2f7170c6 100644
--- a/resources/definitions/dagoma_magis.def.json
+++ b/resources/definitions/dagoma_magis.def.json
@@ -38,7 +38,7 @@
]
},
"gantry_height": {
- "default_value": 0
+ "value": "0"
},
"machine_shape": {
"default_value": "elliptic"
diff --git a/resources/definitions/dagoma_neva.def.json b/resources/definitions/dagoma_neva.def.json
index 67c8795678..ea6046b613 100644
--- a/resources/definitions/dagoma_neva.def.json
+++ b/resources/definitions/dagoma_neva.def.json
@@ -38,7 +38,7 @@
]
},
"gantry_height": {
- "default_value": 0
+ "value": "0"
},
"machine_shape": {
"default_value": "elliptic"
diff --git a/resources/definitions/deltabot.def.json b/resources/definitions/deltabot.def.json
index 95435f659d..613b61d32c 100644
--- a/resources/definitions/deltabot.def.json
+++ b/resources/definitions/deltabot.def.json
@@ -5,7 +5,7 @@
"metadata": {
"visible": true,
"author": "Ultimaker",
- "manufacturer": "Danny Lu",
+ "manufacturer": "Custom",
"file_formats": "text/x-gcode",
"platform_offset": [ 0, 0, 0],
"machine_extruder_trains":
diff --git a/resources/definitions/deltacomb.def.json b/resources/definitions/deltacomb.def.json
index 026dfca9ed..c46beeec2d 100755
--- a/resources/definitions/deltacomb.def.json
+++ b/resources/definitions/deltacomb.def.json
@@ -13,7 +13,6 @@
"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",
diff --git a/resources/definitions/easyarts_ares.def.json b/resources/definitions/easyarts_ares.def.json
index 5655d0a795..0e2742f484 100644
--- a/resources/definitions/easyarts_ares.def.json
+++ b/resources/definitions/easyarts_ares.def.json
@@ -5,7 +5,7 @@
"metadata": {
"visible": true,
"author": "nliaudat",
- "manufacturer": "EasyArts (discontinued)",
+ "manufacturer": "EasyArts",
"file_formats": "text/x-gcode",
"machine_extruder_trains":
{
diff --git a/resources/definitions/erzay3d.def.json b/resources/definitions/erzay3d.def.json
new file mode 100644
index 0000000000..0a6d676bea
--- /dev/null
+++ b/resources/definitions/erzay3d.def.json
@@ -0,0 +1,121 @@
+{
+ "name": "Erzay3D",
+ "version": 2,
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": true,
+ "author": "Alexander Kirsanov",
+ "manufacturer": "Robokinetika",
+ "category": "Other",
+ "file_formats": "text/x-gcode",
+ "machine_extruder_trains":
+ {
+ "0": "erzay3d_extruder_0"
+ }
+ },
+
+ "overrides": {
+ "machine_start_gcode" : { "default_value": "G28\nG1 Z15.0 F6000\nG92 E0" },
+ "machine_shape": { "default_value": "elliptic"},
+ "machine_name": { "default_value": "Erzay3D" },
+ "machine_depth": { "default_value": 210 },
+ "machine_width": { "default_value": 210 },
+ "machine_height": { "default_value": 230 },
+ "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
+ "machine_center_is_zero": { "default_value": true },
+ "machine_extruder_count": { "default_value": 1 },
+ "machine_nozzle_size": { "default_value": 0.4 },
+ "material_diameter": { "default_value": 1.75 },
+ "machine_heated_bed": { "default_value": true },
+ "material_bed_temp_wait": { "default_value": true },
+ "material_print_temp_wait": { "default_value": true },
+ "material_print_temp_prepend": { "default_value": true },
+ "machine_buildplate_type": { "default_value": "glass" },
+ "machine_nozzle_head_distance": { "default_value": 2.5 },
+ "machine_heat_zone_length": { "default_value": 12.5 },
+ "machine_max_feedrate_x": { "default_value": 200 },
+ "machine_max_feedrate_y": { "default_value": 200 },
+ "machine_max_feedrate_z": { "default_value": 200 },
+ "machine_max_feedrate_e": { "default_value": 50 },
+ "machine_max_acceleration_x": { "default_value": 3000 },
+ "machine_max_acceleration_y": { "default_value": 3000 },
+ "machine_max_acceleration_z": { "default_value": 3000 },
+ "machine_max_acceleration_e": { "default_value": 3000 },
+ "machine_acceleration": { "default_value": 1000 },
+ "machine_max_jerk_xy": { "default_value": 10 },
+ "machine_max_jerk_z": { "default_value": 10 },
+ "machine_max_jerk_e": { "default_value": 10 },
+ "machine_steps_per_mm_x": { "default_value": 1600 },
+ "machine_steps_per_mm_y": { "default_value": 1600 },
+ "machine_steps_per_mm_z": { "default_value": 1600 },
+ "machine_steps_per_mm_e": { "default_value": 174 },
+ "machine_feeder_wheel_diameter": { "default_value": 12 },
+
+ "layer_height": { "default_value": 0.2 },
+ "layer_height_0": { "default_value": 0.2 },
+
+ "ironing_pattern": { "default_value": "concentric" },
+ "ironing_flow": { "default_value": 7.0 },
+ "roofing_pattern": { "default_value": "concentric" },
+
+ "infill_sparse_density": { "default_value": 20 },
+ "infill_line_distance": { "default_value": 4 },
+
+ "default_material_print_temperature": { "default_value": 220 },
+ "material_print_temperature": { "default_value": 220 },
+ "material_print_temperature_layer_0": { "default_value": 220 },
+ "material_initial_print_temperature": { "default_value": 220 },
+ "material_final_print_temperature": { "default_value": 220 },
+ "retraction_amount": { "default_value": 6.5 },
+
+ "speed_print": { "default_value": 40 },
+ "speed_infill": { "default_value": 60 },
+ "speed_wall": { "default_value": 20 },
+ "speed_wall_0": { "default_value": 20 },
+ "speed_wall_x": { "default_value": 40 },
+ "speed_roofing": { "default_value": 20 },
+ "speed_topbottom": { "default_value": 20 },
+ "speed_support": { "default_value": 40 },
+ "speed_support_infill": { "default_value": 40 },
+ "speed_support_interface": { "default_value": 25 },
+ "speed_support_roof": { "default_value": 25 },
+ "speed_support_bottom": { "default_value": 25 },
+ "speed_prime_tower": { "default_value": 40 },
+ "speed_travel": { "default_value": 100 },
+ "speed_layer_0": { "default_value": 20 },
+ "speed_print_layer_0": { "default_value": 20 },
+ "speed_travel_layer_0": { "default_value": 80 },
+ "skirt_brim_speed": { "default_value": 20 },
+ "speed_equalize_flow_enabled": { "default_value": true },
+ "speed_equalize_flow_max": { "default_value": 100 },
+
+ "acceleration_print": { "default_value": 1000 },
+ "acceleration_infill": { "default_value": 3000 },
+ "acceleration_wall": { "default_value": 1000 },
+ "acceleration_wall_0": { "default_value": 1000 },
+ "acceleration_wall_x": { "default_value": 1000 },
+ "acceleration_roofing": { "default_value": 1000 },
+ "acceleration_topbottom": { "default_value": 1000 },
+ "acceleration_support": { "default_value": 1000 },
+ "acceleration_support_infill": { "default_value": 1000 },
+ "acceleration_support_interface": { "default_value": 1000 },
+ "acceleration_support_roof": { "default_value": 1000 },
+ "acceleration_support_bottom": { "default_value": 1000 },
+ "acceleration_prime_tower": { "default_value": 1000 },
+ "acceleration_travel": { "default_value": 1500 },
+ "acceleration_layer_0": { "default_value": 1000 },
+ "acceleration_print_layer_0": { "default_value": 1000 },
+ "acceleration_travel_layer_0": { "default_value": 1000 },
+ "acceleration_skirt_brim": { "default_value": 1000 },
+
+ "jerk_print": { "default_value": 10 },
+
+ "support_angle": { "default_value": 65 },
+ "support_brim_enable": { "default_value": true },
+
+ "adhesion_type": { "default_value": "skirt" },
+ "brim_outside_only": { "default_value": false },
+
+ "meshfix_maximum_resolution": { "default_value": 0.05 }
+ }
+}
diff --git a/resources/definitions/fabtotum.def.json b/resources/definitions/fabtotum.def.json
index 10c8f68844..959a5bdaec 100644
--- a/resources/definitions/fabtotum.def.json
+++ b/resources/definitions/fabtotum.def.json
@@ -28,7 +28,7 @@
"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+0.5 E-3 X+5 Y+5 F5000 ;move Z up a bit and retract filament even more\n;end of the print\nM84 ;steppers off\nG90 ;absolute positioning\nM300 S2 ;FAB bep bep (end print)"
},
- "gantry_height": { "default_value": 55 },
+ "gantry_height": { "value": "55" },
"machine_width": { "default_value": 214 },
"machine_height": { "default_value": 241.5 },
"machine_depth": { "default_value": 234 },
diff --git a/resources/definitions/fdmextruder.def.json b/resources/definitions/fdmextruder.def.json
index ac50884888..6554b2aa0f 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": 7,
+ "setting_version": 9,
"visible": false,
"position": "0"
},
diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json
index 1e39576391..9ad2964e0d 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": 7,
+ "setting_version": 9,
"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":
{
@@ -203,6 +204,16 @@
"settable_per_extruder": false,
"settable_per_meshgroup": false
},
+ "machine_heated_build_volume":
+ {
+ "label": "Has Build Volume Temperature Stabilization",
+ "description": "Whether the machine is able to stabilize the build volume temperature.",
+ "default_value": false,
+ "type": "bool",
+ "settable_per_mesh": false,
+ "settable_per_extruder": false,
+ "settable_per_meshgroup": false
+ },
"machine_center_is_zero":
{
"label": "Is Center Origin",
@@ -227,7 +238,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 +251,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 +263,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 +274,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 +287,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 +321,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 +332,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 +354,7 @@
},
"machine_gcode_flavor":
{
- "label": "G-code flavour",
+ "label": "G-code Flavor",
"description": "The type of g-code to be generated.",
"type": "enum",
"options":
@@ -376,7 +387,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 +411,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 +439,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 +467,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 +499,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 +534,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 +545,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 +556,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
@@ -890,7 +902,7 @@
"maximum_value_warning": "3 * machine_nozzle_size",
"default_value": 0.4,
"type": "float",
- "enabled": "support_enable",
+ "enabled": "(support_enable or support_tree_enable)",
"value": "line_width",
"limit_to_extruder": "support_infill_extruder_nr",
"settable_per_mesh": false,
@@ -906,7 +918,7 @@
"minimum_value_warning": "0.1 + 0.4 * machine_nozzle_size",
"maximum_value_warning": "2 * machine_nozzle_size",
"type": "float",
- "enabled": "support_enable and support_interface_enable",
+ "enabled": "(support_enable or support_tree_enable) and support_interface_enable",
"limit_to_extruder": "support_interface_extruder_nr",
"value": "line_width",
"settable_per_mesh": false,
@@ -923,7 +935,7 @@
"minimum_value_warning": "0.4 * machine_nozzle_size",
"maximum_value_warning": "2 * machine_nozzle_size",
"type": "float",
- "enabled": "support_enable and support_roof_enable",
+ "enabled": "(support_enable or support_tree_enable) and support_roof_enable",
"limit_to_extruder": "support_roof_extruder_nr",
"value": "extruderValue(support_roof_extruder_nr, 'support_interface_line_width')",
"settable_per_mesh": false,
@@ -939,7 +951,7 @@
"minimum_value_warning": "0.4 * machine_nozzle_size",
"maximum_value_warning": "2 * machine_nozzle_size",
"type": "float",
- "enabled": "support_enable and support_bottom_enable",
+ "enabled": "(support_enable or support_tree_enable) and support_bottom_enable",
"limit_to_extruder": "support_bottom_extruder_nr",
"value": "extruderValue(support_bottom_extruder_nr, 'support_interface_line_width')",
"settable_per_mesh": false,
@@ -961,20 +973,20 @@
"maximum_value_warning": "2 * machine_nozzle_size",
"settable_per_mesh": false,
"settable_per_extruder": true
- },
- "initial_layer_line_width_factor":
- {
- "label": "Initial Layer Line Width",
- "description": "Multiplier of the line width on the first layer. Increasing this could improve bed adhesion.",
- "type": "float",
- "unit": "%",
- "default_value": 100.0,
- "minimum_value": "0.001",
- "maximum_value_warning": "150",
- "settable_per_mesh": false,
- "settable_per_extruder": true
}
}
+ },
+ "initial_layer_line_width_factor":
+ {
+ "label": "Initial Layer Line Width",
+ "description": "Multiplier of the line width on the first layer. Increasing this could improve bed adhesion.",
+ "type": "float",
+ "unit": "%",
+ "default_value": 100.0,
+ "minimum_value": "0.001",
+ "maximum_value_warning": "150",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
}
}
},
@@ -1315,8 +1327,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 +1336,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":
{
@@ -1399,41 +1409,66 @@
"limit_to_extruder": "wall_0_extruder_nr",
"settable_per_mesh": true
},
- "z_seam_x":
+ "z_seam_position":
{
- "label": "Z Seam X",
- "description": "The X coordinate of the position near where to start printing each part in a layer.",
- "unit": "mm",
- "type": "float",
- "default_value": 100.0,
- "value": "machine_width / 2",
+ "label": "Z Seam Position",
+ "description": "The position near where to start printing each part in a layer.",
+ "type": "enum",
+ "options":
+ {
+ "backleft": "Back Left",
+ "back": "Back",
+ "backright": "Back Right",
+ "right": "Right",
+ "frontright": "Front Right",
+ "front": "Front",
+ "frontleft": "Front Left",
+ "left": "Left"
+ },
"enabled": "z_seam_type == 'back'",
+ "default_value": "back",
"limit_to_extruder": "wall_0_extruder_nr",
- "settable_per_mesh": true
- },
- "z_seam_y":
- {
- "label": "Z Seam Y",
- "description": "The Y coordinate of the position near where to start printing each part in a layer.",
- "unit": "mm",
- "type": "float",
- "default_value": 100.0,
- "value": "machine_depth * 3",
- "enabled": "z_seam_type == 'back'",
- "limit_to_extruder": "wall_0_extruder_nr",
- "settable_per_mesh": true
+ "settable_per_mesh": true,
+ "children":
+ {
+ "z_seam_x":
+ {
+ "label": "Z Seam X",
+ "description": "The X coordinate of the position near where to start printing each part in a layer.",
+ "unit": "mm",
+ "type": "float",
+ "default_value": 100.0,
+ "value": "0 if (z_seam_position == 'frontleft' or z_seam_position == 'left' or z_seam_position == 'backleft') else machine_width/2 if (z_seam_position == 'front' or z_seam_position == 'back') else machine_width",
+ "enabled": "z_seam_type == 'back'",
+ "limit_to_extruder": "wall_0_extruder_nr",
+ "settable_per_mesh": true
+ },
+ "z_seam_y":
+ {
+ "label": "Z Seam Y",
+ "description": "The Y coordinate of the position near where to start printing each part in a layer.",
+ "unit": "mm",
+ "type": "float",
+ "default_value": 100.0,
+ "value": "0 if (z_seam_position == 'frontleft' or z_seam_position == 'front' or z_seam_position == 'frontright') else machine_depth/2 if (z_seam_position == 'left' or z_seam_position == 'right') else machine_depth",
+ "enabled": "z_seam_type == 'back'",
+ "limit_to_extruder": "wall_0_extruder_nr",
+ "settable_per_mesh": true
+ }
+ }
},
"z_seam_corner":
{
"label": "Seam Corner Preference",
- "description": "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner.",
+ "description": "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner. Smart Hiding allows both inside and outside corners, but chooses inside corners more frequently, if appropriate.",
"type": "enum",
"options":
{
- "z_seam_corner_none": "None",
- "z_seam_corner_inner": "Hide Seam",
- "z_seam_corner_outer": "Expose Seam",
- "z_seam_corner_any": "Hide or Expose Seam"
+ "z_seam_corner_none": "None",
+ "z_seam_corner_inner": "Hide Seam",
+ "z_seam_corner_outer": "Expose Seam",
+ "z_seam_corner_any": "Hide or Expose Seam",
+ "z_seam_corner_weighted": "Smart Hiding"
},
"default_value": "z_seam_corner_inner",
"enabled": "z_seam_type != 'random'",
@@ -1453,8 +1488,8 @@
},
"skin_no_small_gaps_heuristic":
{
- "label": "Ignore Small Z Gaps",
- "description": "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting.",
+ "label": "No Skin in Z Gaps",
+ "description": "When the model has small vertical gaps of only a few layers, there should normally be skin around those layers in the narrow space. Enable this setting to not generate skin if the vertical gap is very small. This improves printing time and slicing time, but technically leaves infill exposed to the air.",
"type": "bool",
"default_value": false,
"enabled": "top_layers > 0 or bottom_layers > 0",
@@ -1476,7 +1511,7 @@
"ironing_enabled":
{
"label": "Enable Ironing",
- "description": "Go over the top surface one additional time, but without extruding material. This is meant to melt the plastic on top further, creating a smoother surface.",
+ "description": "Go over the top surface one additional time, but this time extruding very little material. This is meant to melt the plastic on top further, creating a smoother surface. The pressure in the nozzle chamber is kept high so that the creases in the surface are filled with material.",
"type": "bool",
"default_value": false,
"limit_to_extruder": "top_bottom_extruder_nr",
@@ -1590,6 +1625,36 @@
"enabled": "resolveOrValue('jerk_enabled') and ironing_enabled",
"limit_to_extruder": "top_bottom_extruder_nr",
"settable_per_mesh": true
+ },
+ "skin_overlap":
+ {
+ "label": "Skin Overlap Percentage",
+ "description": "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.",
+ "unit": "%",
+ "type": "float",
+ "default_value": 5,
+ "minimum_value_warning": "-50",
+ "maximum_value_warning": "100",
+ "value": "5 if top_bottom_pattern != 'concentric' else 0",
+ "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern != 'concentric'",
+ "limit_to_extruder": "top_bottom_extruder_nr",
+ "settable_per_mesh": true,
+ "children":
+ {
+ "skin_overlap_mm":
+ {
+ "label": "Skin Overlap",
+ "description": "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.",
+ "unit": "mm",
+ "type": "float",
+ "default_value": 0.02,
+ "minimum_value_warning": "-0.5 * machine_nozzle_size",
+ "maximum_value_warning": "machine_nozzle_size",
+ "value": "0.5 * (skin_line_width + (wall_line_width_x if wall_line_count > 1 else wall_line_width_0)) * skin_overlap / 100 if top_bottom_pattern != 'concentric' else 0",
+ "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern != 'concentric'",
+ "settable_per_mesh": true
+ }
+ }
}
}
},
@@ -1722,6 +1787,17 @@
"limit_to_extruder": "infill_extruder_nr",
"settable_per_mesh": true
},
+ "infill_randomize_start_location":
+ {
+ "label": "Randomize Infill Start",
+ "description": "Randomize which infill line is printed first. This prevents one segment becoming the strongest, but it does so at the cost of an additional travel move.",
+ "type": "bool",
+ "default_value": false,
+ "warning_value": "True if infill_pattern not in ('grid', 'triangles', 'trihexagon', 'cubic', 'cubicsubdiv', 'tetrahedral', 'quarter_cubic') else None",
+ "enabled": "not ((infill_pattern == 'cross' and connect_infill_polygons) or infill_pattern == 'concentric')",
+ "limit_to_extruder": "infill_extruder_nr",
+ "settable_per_mesh": true
+ },
"infill_multiplier":
{
"label": "Infill Line Multiplier",
@@ -1789,36 +1865,6 @@
}
}
},
- "skin_overlap":
- {
- "label": "Skin Overlap Percentage",
- "description": "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.",
- "unit": "%",
- "type": "float",
- "default_value": 5,
- "minimum_value_warning": "-50",
- "maximum_value_warning": "100",
- "value": "5 if top_bottom_pattern != 'concentric' else 0",
- "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern != 'concentric'",
- "limit_to_extruder": "top_bottom_extruder_nr",
- "settable_per_mesh": true,
- "children":
- {
- "skin_overlap_mm":
- {
- "label": "Skin Overlap",
- "description": "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.",
- "unit": "mm",
- "type": "float",
- "default_value": 0.02,
- "minimum_value_warning": "-0.5 * machine_nozzle_size",
- "maximum_value_warning": "machine_nozzle_size",
- "value": "0.5 * (skin_line_width + (wall_line_width_x if wall_line_count > 1 else wall_line_width_0)) * skin_overlap / 100 if top_bottom_pattern != 'concentric' else 0",
- "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern != 'concentric'",
- "settable_per_mesh": true
- }
- }
- },
"infill_wipe_dist":
{
"label": "Infill Wipe Distance",
@@ -1924,7 +1970,7 @@
"description": "The largest width of skin areas which are to be removed. Every skin area smaller than this value will disappear. This can help in limiting the amount of time and material spent on printing top/bottom skin at slanted surfaces in the model.",
"unit": "mm",
"type": "float",
- "default_value": 0,
+ "default_value": 1,
"value": "wall_line_width_0 + (wall_line_count - 1) * wall_line_width_x",
"minimum_value": "0",
"enabled": "top_layers > 0 or bottom_layers > 0",
@@ -1938,7 +1984,7 @@
"description": "The largest width of top skin areas which are to be removed. Every skin area smaller than this value will disappear. This can help in limiting the amount of time and material spent on printing top skin at slanted surfaces in the model.",
"unit": "mm",
"type": "float",
- "default_value": 0,
+ "default_value": 1,
"value": "skin_preshrink",
"minimum_value": "0",
"enabled": "top_layers > 0 or bottom_layers > 0",
@@ -1951,7 +1997,7 @@
"description": "The largest width of bottom skin areas which are to be removed. Every skin area smaller than this value will disappear. This can help in limiting the amount of time and material spent on printing bottom skin at slanted surfaces in the model.",
"unit": "mm",
"type": "float",
- "default_value": 0,
+ "default_value": 1,
"value": "skin_preshrink",
"minimum_value": "0",
"enabled": "top_layers > 0 or bottom_layers > 0",
@@ -1966,7 +2012,7 @@
"description": "The distance the skins are expanded into the infill. Higher values makes the skin attach better to the infill pattern and makes the walls on neighboring layers adhere better to the skin. Lower values save amount of material used.",
"unit": "mm",
"type": "float",
- "default_value": 2.8,
+ "default_value": 1,
"value": "wall_line_width_0 + (wall_line_count - 1) * wall_line_width_x",
"minimum_value": "-skin_preshrink",
"limit_to_extruder": "top_bottom_extruder_nr",
@@ -1980,7 +2026,7 @@
"description": "The distance the top skins are expanded into the infill. Higher values makes the skin attach better to the infill pattern and makes the walls on the layer above adhere better to the skin. Lower values save amount of material used.",
"unit": "mm",
"type": "float",
- "default_value": 2.8,
+ "default_value": 1,
"value": "expand_skins_expand_distance",
"minimum_value": "-top_skin_preshrink",
"enabled": "top_layers > 0 or bottom_layers > 0",
@@ -1993,7 +2039,7 @@
"description": "The distance the bottom skins are expanded into the infill. Higher values makes the skin attach better to the infill pattern and makes the skin adhere better to the walls on the layer below. Lower values save amount of material used.",
"unit": "mm",
"type": "float",
- "default_value": 2.8,
+ "default_value": 1,
"value": "expand_skins_expand_distance",
"minimum_value": "-bottom_skin_preshrink",
"enabled": "top_layers > 0 or bottom_layers > 0",
@@ -2051,11 +2097,26 @@
"default_value": 210,
"minimum_value_warning": "0",
"maximum_value_warning": "285",
- "enabled": "machine_nozzle_temp_enabled",
+ "enabled": false,
"settable_per_extruder": true,
"settable_per_mesh": false,
"minimum_value": "-273.15"
},
+ "build_volume_temperature":
+ {
+ "label": "Build Volume Temperature",
+ "description": "The temperature of the environment to print in. If this is 0, the build volume temperature will not be adjusted.",
+ "unit": "°C",
+ "type": "float",
+ "default_value": 0,
+ "resolve": "min(extruderValues('build_volume_temperature'))",
+ "minimum_value": "-273.15",
+ "minimum_value_warning": "0",
+ "maximum_value_warning": "285",
+ "enabled": "machine_heated_build_volume",
+ "settable_per_mesh": false,
+ "settable_per_extruder": false
+ },
"material_print_temperature":
{
"label": "Printing Temperature",
@@ -2139,9 +2200,9 @@
"resolve": "max(extruderValues('default_material_bed_temperature'))",
"default_value": 60,
"minimum_value": "-273.15",
- "minimum_value_warning": "0",
+ "minimum_value_warning": "build_volume_temperature",
"maximum_value_warning": "130",
- "enabled": "machine_heated_bed and machine_gcode_flavor != \"UltiGCode\"",
+ "enabled": false,
"settable_per_mesh": false,
"settable_per_extruder": false,
"settable_per_meshgroup": false
@@ -2156,7 +2217,7 @@
"value": "default_material_bed_temperature",
"resolve": "max(extruderValues('material_bed_temperature'))",
"minimum_value": "-273.15",
- "minimum_value_warning": "0",
+ "minimum_value_warning": "build_volume_temperature",
"maximum_value_warning": "130",
"enabled": "machine_heated_bed and machine_gcode_flavor != \"UltiGCode\"",
"settable_per_mesh": false,
@@ -2173,7 +2234,7 @@
"default_value": 60,
"value": "resolveOrValue('material_bed_temperature')",
"minimum_value": "-273.15",
- "minimum_value_warning": "max(extruderValues('material_bed_temperature'))",
+ "minimum_value_warning": "max(build_volume_temperature, max(extruderValues('material_bed_temperature')))",
"maximum_value_warning": "130",
"enabled": "machine_heated_bed and machine_gcode_flavor != \"UltiGCode\"",
"settable_per_mesh": false,
@@ -2218,6 +2279,107 @@
"settable_per_mesh": false,
"settable_per_extruder": true
},
+ "material_crystallinity":
+ {
+ "label": "Crystalline Material",
+ "description": "Is this material the type that breaks off cleanly when heated (crystalline), or is it the type that produces long intertwined polymer chains (non-crystalline)?",
+ "type": "bool",
+ "default_value": false,
+ "enabled": false,
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ },
+ "material_anti_ooze_retracted_position":
+ {
+ "label": "Anti-ooze Retracted Position",
+ "description": "How far the material needs to be retracted before it stops oozing.",
+ "type": "float",
+ "unit": "mm",
+ "default_value": -4,
+ "enabled": false,
+ "minimum_value_warning": "-retraction_amount",
+ "maximum_value_warning": "0",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ },
+ "material_anti_ooze_retraction_speed":
+ {
+ "label": "Anti-ooze Retraction Speed",
+ "description": "How fast the material needs to be retracted during a filament switch to prevent oozing.",
+ "type": "float",
+ "unit": "mm/s",
+ "default_value": 5,
+ "enabled": false,
+ "minimum_value": "0",
+ "maximum_value": "machine_max_feedrate_e",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ },
+ "material_break_preparation_retracted_position":
+ {
+ "label": "Break Preparation Retracted Position",
+ "description": "How far the filament can be stretched before it breaks, while heated.",
+ "type": "float",
+ "unit": "mm",
+ "default_value": -16,
+ "enabled": false,
+ "minimum_value_warning": "-retraction_amount * 4",
+ "maximum_value_warning": "0",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ },
+ "material_break_preparation_speed":
+ {
+ "label": "Break Preparation Retraction Speed",
+ "description": "How fast the filament needs to be retracted just before breaking it off in a retraction.",
+ "type": "float",
+ "unit": "mm/s",
+ "default_value": 2,
+ "enabled": false,
+ "minimum_value": "0",
+ "maximum_value": "machine_max_feedrate_e",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ },
+ "material_break_retracted_position":
+ {
+ "label": "Break Retracted Position",
+ "description": "How far to retract the filament in order to break it cleanly.",
+ "type": "float",
+ "unit": "mm",
+ "default_value": -50,
+ "enabled": false,
+ "minimum_value_warning": "-100",
+ "maximum_value_warning": "0",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ },
+ "material_break_speed":
+ {
+ "label": "Break Retraction Speed",
+ "description": "The speed at which to retract the filament in order to break it cleanly.",
+ "type": "float",
+ "unit": "mm/s",
+ "default_value": 25,
+ "enabled": false,
+ "minimum_value": "0",
+ "maximum_value": "machine_max_feedrate_e",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ },
+ "material_break_temperature":
+ {
+ "label": "Break Temperature",
+ "description": "The temperature at which the filament is broken for a clean break.",
+ "type": "float",
+ "unit": "°C",
+ "default_value": 50,
+ "enabled": false,
+ "minimum_value": "-273.15",
+ "maximum_value_warning": "300",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ },
"material_flow":
{
"label": "Flow",
@@ -2229,7 +2391,196 @@
"minimum_value_warning": "50",
"maximum_value_warning": "150",
"enabled": "machine_gcode_flavor != \"UltiGCode\"",
- "settable_per_mesh": true
+ "settable_per_mesh": true,
+ "children":
+ {
+ "wall_material_flow":
+ {
+ "label": "Wall Flow",
+ "description": "Flow compensation on wall lines.",
+ "unit": "%",
+ "type": "float",
+ "default_value": 100,
+ "value": "material_flow",
+ "minimum_value": "5",
+ "minimum_value_warning": "50",
+ "maximum_value_warning": "150",
+ "limit_to_extruder": "wall_0_extruder_nr if wall_x_extruder_nr == wall_0_extruder_nr else -1",
+ "settable_per_mesh": true,
+ "children":
+ {
+ "wall_0_material_flow":
+ {
+ "label": "Outer Wall Flow",
+ "description": "Flow compensation on the outermost wall line.",
+ "unit": "%",
+ "type": "float",
+ "default_value": 100,
+ "value": "wall_material_flow",
+ "minimum_value": "5",
+ "minimum_value_warning": "50",
+ "maximum_value_warning": "150",
+ "limit_to_extruder": "wall_0_extruder_nr",
+ "settable_per_mesh": true
+ },
+ "wall_x_material_flow":
+ {
+ "label": "Inner Wall(s) Flow",
+ "description": "Flow compensation on wall lines for all wall lines except the outermost one.",
+ "unit": "%",
+ "type": "float",
+ "default_value": 100,
+ "value": "wall_material_flow",
+ "minimum_value": "5",
+ "minimum_value_warning": "50",
+ "maximum_value_warning": "150",
+ "limit_to_extruder": "wall_x_extruder_nr",
+ "settable_per_mesh": true
+ }
+ }
+ },
+ "skin_material_flow":
+ {
+ "label": "Top/Bottom Flow",
+ "description": "Flow compensation on top/bottom lines.",
+ "unit": "%",
+ "type": "float",
+ "default_value": 100,
+ "value": "material_flow",
+ "minimum_value": "5",
+ "minimum_value_warning": "50",
+ "maximum_value_warning": "150",
+ "enabled": "top_layers > 0 or bottom_layers > 0",
+ "limit_to_extruder": "top_bottom_extruder_nr",
+ "settable_per_mesh": true
+ },
+ "roofing_material_flow":
+ {
+ "label": "Top Surface Skin Flow",
+ "description": "Flow compensation on lines of the areas at the top of the print.",
+ "unit": "%",
+ "type": "float",
+ "default_value": 100,
+ "value": "skin_material_flow",
+ "minimum_value": "5",
+ "minimum_value_warning": "50",
+ "maximum_value_warning": "150",
+ "limit_to_extruder": "roofing_extruder_nr",
+ "settable_per_mesh": true,
+ "enabled": "roofing_layer_count > 0 and top_layers > 0"
+ },
+ "infill_material_flow":
+ {
+ "label": "Infill Flow",
+ "description": "Flow compensation on infill lines.",
+ "unit": "%",
+ "type": "float",
+ "default_value": 100,
+ "value": "material_flow",
+ "minimum_value": "5",
+ "minimum_value_warning": "50",
+ "maximum_value_warning": "150",
+ "enabled": "infill_sparse_density > 0",
+ "limit_to_extruder": "infill_extruder_nr",
+ "settable_per_mesh": true
+ },
+ "skirt_brim_material_flow":
+ {
+ "label": "Skirt/Brim Flow",
+ "description": "Flow compensation on skirt or brim lines.",
+ "unit": "%",
+ "type": "float",
+ "default_value": 100,
+ "value": "material_flow",
+ "minimum_value": "5",
+ "minimum_value_warning": "50",
+ "maximum_value_warning": "150",
+ "enabled": "resolveOrValue('adhesion_type') == 'skirt' or resolveOrValue('adhesion_type') == 'brim'",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ },
+ "support_material_flow":
+ {
+ "label": "Support Flow",
+ "description": "Flow compensation on support structure lines.",
+ "unit": "%",
+ "type": "float",
+ "default_value": 100,
+ "value": "material_flow",
+ "minimum_value": "5",
+ "minimum_value_warning": "50",
+ "maximum_value_warning": "150",
+ "enabled": "support_enable",
+ "limit_to_extruder": "support_infill_extruder_nr",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ },
+ "support_interface_material_flow":
+ {
+ "label": "Support Interface Flow",
+ "description": "Flow compensation on lines of support roof or floor.",
+ "unit": "%",
+ "type": "float",
+ "default_value": 100,
+ "value": "material_flow",
+ "minimum_value": "5",
+ "minimum_value_warning": "50",
+ "maximum_value_warning": "150",
+ "enabled": "support_enable and support_interface_enable",
+ "limit_to_extruder": "support_interface_extruder_nr",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true,
+ "children":
+ {
+ "support_roof_material_flow":
+ {
+ "label": "Support Roof Flow",
+ "description": "Flow compensation on support roof lines.",
+ "unit": "%",
+ "type": "float",
+ "default_value": 100,
+ "value": "extruderValue(support_roof_extruder_nr, 'support_interface_material_flow')",
+ "minimum_value": "5",
+ "minimum_value_warning": "50",
+ "maximum_value_warning": "150",
+ "enabled": "support_enable and support_roof_enable",
+ "limit_to_extruder": "support_roof_extruder_nr",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ },
+ "support_bottom_material_flow":
+ {
+ "label": "Support Floor Flow",
+ "description": "Flow compensation on support floor lines.",
+ "unit": "%",
+ "type": "float",
+ "default_value": 100,
+ "value": "extruderValue(support_bottom_extruder_nr, 'support_interface_material_flow')",
+ "minimum_value": "5",
+ "minimum_value_warning": "50",
+ "maximum_value_warning": "150",
+ "enabled": "support_enable and support_bottom_enable",
+ "limit_to_extruder": "support_bottom_extruder_nr",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ }
+ }
+ },
+ "prime_tower_flow":
+ {
+ "label": "Prime Tower Flow",
+ "description": "Flow compensation on prime tower lines.",
+ "unit": "%",
+ "type": "float",
+ "default_value": 100,
+ "value": "material_flow",
+ "minimum_value": "5",
+ "minimum_value_warning": "50",
+ "maximum_value_warning": "150",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ }
+ }
},
"material_flow_layer_0":
{
@@ -2237,7 +2588,6 @@
"description": "Flow compensation for the first layer: the amount of material extruded on the initial layer is multiplied by this value.",
"unit": "%",
"default_value": 100,
- "value": "material_flow",
"type": "float",
"minimum_value": "0.0001",
"minimum_value_warning": "50",
@@ -2382,10 +2732,10 @@
"limit_support_retractions":
{
"label": "Limit Support Retractions",
- "description": "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excesive stringing within the support structure.",
+ "description": "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excessive stringing within the support structure.",
"type": "bool",
"default_value": true,
- "enabled": "retraction_enable and support_enable",
+ "enabled": "retraction_enable and (support_enable or support_tree_enable)",
"settable_per_mesh": false,
"settable_per_extruder": true
},
@@ -2466,6 +2816,19 @@
"settable_per_extruder": true
}
}
+ },
+ "switch_extruder_extra_prime_amount":
+ {
+ "label": "Nozzle Switch Extra Prime Amount",
+ "description": "Extra material to prime after nozzle switching.",
+ "type": "float",
+ "unit": "mm³",
+ "default_value": 0,
+ "minimum_value_warning": "0",
+ "maximum_value_warning": "100",
+ "enabled": "retraction_enable",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
}
}
},
@@ -2590,7 +2953,7 @@
"maximum_value_warning": "150",
"default_value": 60,
"value": "speed_print",
- "enabled": "support_enable",
+ "enabled": "support_enable or support_tree_enable",
"settable_per_mesh": false,
"limit_to_extruder": "support_extruder_nr",
"settable_per_extruder": true,
@@ -2607,7 +2970,7 @@
"maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)",
"maximum_value_warning": "150",
"value": "speed_support",
- "enabled": "support_enable",
+ "enabled": "support_enable or support_tree_enable",
"limit_to_extruder": "support_infill_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@@ -2622,7 +2985,7 @@
"minimum_value": "0.1",
"maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)",
"maximum_value_warning": "150",
- "enabled": "support_interface_enable and support_enable",
+ "enabled": "support_interface_enable and (support_enable or support_tree_enable)",
"limit_to_extruder": "support_interface_extruder_nr",
"value": "speed_support / 1.5",
"settable_per_mesh": false,
@@ -2639,7 +3002,7 @@
"minimum_value": "0.1",
"maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)",
"maximum_value_warning": "150",
- "enabled": "support_roof_enable and support_enable",
+ "enabled": "support_roof_enable and (support_enable or support_tree_enable)",
"limit_to_extruder": "support_roof_extruder_nr",
"value": "extruderValue(support_roof_extruder_nr, 'speed_support_interface')",
"settable_per_mesh": false,
@@ -2655,7 +3018,7 @@
"minimum_value": "0.1",
"maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2)",
"maximum_value_warning": "150",
- "enabled": "support_bottom_enable and support_enable",
+ "enabled": "support_bottom_enable and (support_enable or support_tree_enable)",
"limit_to_extruder": "support_bottom_extruder_nr",
"value": "extruderValue(support_bottom_extruder_nr, 'speed_support_interface')",
"settable_per_mesh": false,
@@ -2755,16 +3118,16 @@
"settable_per_extruder": true,
"limit_to_extruder": "adhesion_extruder_nr"
},
- "max_feedrate_z_override":
+ "speed_z_hop":
{
- "label": "Maximum Z Speed",
- "description": "The maximum speed with which the build plate is moved. Setting this to zero causes the print to use the firmware defaults for the maximum z speed.",
+ "label": "Z Hop Speed",
+ "description": "The speed at which the vertical Z movement is made for Z Hops. This is typically lower than the print speed since the build plate or machine's gantry is harder to move.",
"unit": "mm/s",
"type": "float",
- "default_value": 0,
+ "default_value": 10,
"minimum_value": "0",
- "maximum_value": "299792458000",
- "maximum_value_warning": "machine_max_feedrate_z",
+ "maximum_value": "machine_max_feedrate_z",
+ "enabled": "retraction_enable and retraction_hop_enabled",
"settable_per_mesh": false,
"settable_per_extruder": true
},
@@ -2930,7 +3293,7 @@
"maximum_value_warning": "10000",
"default_value": 3000,
"value": "acceleration_print",
- "enabled": "resolveOrValue('acceleration_enabled') and support_enable",
+ "enabled": "resolveOrValue('acceleration_enabled') and (support_enable or support_tree_enable)",
"settable_per_mesh": false,
"limit_to_extruder": "support_extruder_nr",
"settable_per_extruder": true,
@@ -2947,7 +3310,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
- "enabled": "resolveOrValue('acceleration_enabled') and support_enable",
+ "enabled": "resolveOrValue('acceleration_enabled') and (support_enable or support_tree_enable)",
"limit_to_extruder": "support_infill_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@@ -2963,7 +3326,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
- "enabled": "resolveOrValue('acceleration_enabled') and support_interface_enable and support_enable",
+ "enabled": "resolveOrValue('acceleration_enabled') and support_interface_enable and (support_enable or support_tree_enable)",
"limit_to_extruder": "support_interface_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true,
@@ -2980,7 +3343,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
- "enabled": "acceleration_enabled and support_roof_enable and support_enable",
+ "enabled": "acceleration_enabled and support_roof_enable and (support_enable or support_tree_enable)",
"limit_to_extruder": "support_roof_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@@ -2996,7 +3359,7 @@
"minimum_value": "0.1",
"minimum_value_warning": "100",
"maximum_value_warning": "10000",
- "enabled": "acceleration_enabled and support_bottom_enable and support_enable",
+ "enabled": "acceleration_enabled and support_bottom_enable and (support_enable or support_tree_enable)",
"limit_to_extruder": "support_bottom_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@@ -3215,7 +3578,7 @@
"maximum_value_warning": "50",
"default_value": 20,
"value": "jerk_print",
- "enabled": "resolveOrValue('jerk_enabled') and support_enable",
+ "enabled": "resolveOrValue('jerk_enabled') and (support_enable or support_tree_enable)",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "support_extruder_nr",
@@ -3231,7 +3594,7 @@
"value": "jerk_support",
"minimum_value": "0",
"maximum_value_warning": "50",
- "enabled": "resolveOrValue('jerk_enabled') and support_enable",
+ "enabled": "resolveOrValue('jerk_enabled') and (support_enable or support_tree_enable)",
"limit_to_extruder": "support_infill_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@@ -3246,7 +3609,7 @@
"value": "jerk_support",
"minimum_value": "0",
"maximum_value_warning": "50",
- "enabled": "resolveOrValue('jerk_enabled') and support_interface_enable and support_enable",
+ "enabled": "resolveOrValue('jerk_enabled') and support_interface_enable and (support_enable or support_tree_enable)",
"limit_to_extruder": "support_interface_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true,
@@ -3262,7 +3625,7 @@
"value": "extruderValue(support_roof_extruder_nr, 'jerk_support_interface')",
"minimum_value": "0",
"maximum_value_warning": "50",
- "enabled": "resolveOrValue('jerk_enabled') and support_roof_enable and support_enable",
+ "enabled": "resolveOrValue('jerk_enabled') and support_roof_enable and (support_enable or support_tree_enable)",
"limit_to_extruder": "support_roof_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@@ -3277,7 +3640,7 @@
"value": "extruderValue(support_roof_extruder_nr, 'jerk_support_interface')",
"minimum_value": "0",
"maximum_value_warning": "50",
- "enabled": "resolveOrValue('jerk_enabled') and support_bottom_enable and support_enable",
+ "enabled": "resolveOrValue('jerk_enabled') and support_bottom_enable and (support_enable or support_tree_enable)",
"limit_to_extruder": "support_bottom_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@@ -3455,17 +3818,6 @@
"settable_per_mesh": false,
"settable_per_extruder": true
},
- "start_layers_at_same_position":
- {
- "label": "Start Layers with the Same Part",
- "description": "In each layer start with printing the object near the same point, so that we don't start a new layer with printing the piece which the previous layer ended with. This makes for better overhangs and small parts, but increases printing time.",
- "type": "bool",
- "default_value": false,
- "enabled": false,
- "settable_per_mesh": false,
- "settable_per_extruder": false,
- "settable_per_meshgroup": true
- },
"layer_start_x":
{
"label": "Layer Start X",
@@ -3528,6 +3880,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 and extruders_enabled_count > 1",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
}
}
},
@@ -3841,7 +4207,7 @@
"type": "bool",
"default_value": false,
"value": "support_pattern == 'cross' or support_pattern == 'gyroid'",
- "enabled": "support_pattern == 'grid' or support_pattern == 'triangles' or support_pattern == 'cross' or support_pattern == 'gyroid'",
+ "enabled": "(support_enable or support_tree_enable) and (support_pattern == 'grid' or support_pattern == 'triangles' or support_pattern == 'cross' or support_pattern == 'gyroid')",
"limit_to_extruder": "support_infill_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@@ -3905,16 +4271,14 @@
}
}
},
- "support_infill_angle":
+ "support_infill_angles":
{
- "label": "Support Infill Line Direction",
- "description": "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane.",
- "unit": "°",
- "type": "float",
- "minimum_value": "-180",
- "maximum_value": "180",
- "default_value": 0,
- "enabled": "support_enable and support_pattern != 'concentric' and support_infill_rate > 0",
+ "label": "Support Infill Line Directions",
+ "description": "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the default angle 0 degrees.",
+ "type": "[int]",
+ "default_value": "[ ]",
+ "enabled": "(support_enable or support_tree_enable) and support_pattern != 'concentric' and support_infill_rate > 0",
+ "limit_to_extruder": "support_infill_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
},
@@ -3938,7 +4302,7 @@
"default_value": 8.0,
"minimum_value": "0.0",
"maximum_value_warning": "50.0",
- "enabled": "support_enable",
+ "enabled": "support_enable or support_tree_enable",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "support_infill_extruder_nr",
@@ -3953,7 +4317,7 @@
"minimum_value": "0",
"maximum_value_warning": "50 / skirt_brim_line_width",
"value": "math.ceil(support_brim_width / (skirt_brim_line_width * initial_layer_line_width_factor / 100.0))",
- "enabled": "support_enable",
+ "enabled": "support_enable or support_tree_enable",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "support_infill_extruder_nr"
@@ -4075,7 +4439,7 @@
"support_join_distance":
{
"label": "Support Join Distance",
- "description": "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one.",
+ "description": "The maximum distance between support structures in the X/Y directions. When separate structures are closer together than this value, the structures merge into one.",
"unit": "mm",
"type": "float",
"default_value": 2.0,
@@ -4091,7 +4455,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",
@@ -4242,7 +4606,7 @@
"minimum_value": "0",
"maximum_value_warning": "support_interface_height",
"limit_to_extruder": "support_interface_extruder_nr",
- "enabled": "support_interface_enable and support_enable",
+ "enabled": "support_interface_enable and (support_enable or support_tree_enable)",
"settable_per_mesh": true
},
"support_interface_density":
@@ -4400,7 +4764,7 @@
"minimum_value": "0",
"minimum_value_warning": "minimum_support_area",
"limit_to_extruder": "support_interface_extruder_nr",
- "enabled": "support_interface_enable and support_enable",
+ "enabled": "support_interface_enable and (support_enable or support_tree_enable)",
"settable_per_mesh": true,
"children":
{
@@ -4415,7 +4779,7 @@
"minimum_value": "0",
"minimum_value_warning": "minimum_support_area",
"limit_to_extruder": "support_roof_extruder_nr",
- "enabled": "support_roof_enable and support_enable",
+ "enabled": "support_roof_enable and (support_enable or support_tree_enable)",
"settable_per_mesh": true
},
"minimum_bottom_area":
@@ -4429,7 +4793,7 @@
"minimum_value": "0",
"minimum_value_warning": "minimum_support_area",
"limit_to_extruder": "support_bottom_extruder_nr",
- "enabled": "support_bottom_enable and support_enable",
+ "enabled": "support_bottom_enable and (support_enable or support_tree_enable)",
"settable_per_mesh": true
}
}
@@ -4478,13 +4842,49 @@
}
}
},
+ "support_interface_angles":
+ {
+ "label": "Support Interface Line Directions",
+ "description": "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the default angles (alternates between 45 and 135 degrees if interfaces are quite thick or 90 degrees).",
+ "type": "[int]",
+ "default_value": "[ ]",
+ "limit_to_extruder": "support_interface_extruder_nr",
+ "enabled": "support_interface_enable and support_interface_pattern != 'concentric'",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true,
+ "children":
+ {
+ "support_roof_angles":
+ {
+ "label": "Support Roof Line Directions",
+ "description": "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the default angles (alternates between 45 and 135 degrees if interfaces are quite thick or 90 degrees).",
+ "type": "[int]",
+ "default_value": "[ ]",
+ "limit_to_extruder": "support_roof_extruder_nr",
+ "enabled": "support_roof_enable and support_roof_pattern != 'concentric'",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ },
+ "support_bottom_angles":
+ {
+ "label": "Support Floor Line Directions",
+ "description": "A list of integer line directions to use. Elements from the list are used sequentially as the layers progress and when the end of the list is reached, it starts at the beginning again. The list items are separated by commas and the whole list is contained in square brackets. Default is an empty list which means use the default angles (alternates between 45 and 135 degrees if interfaces are quite thick or 90 degrees).",
+ "type": "[int]",
+ "default_value": "[ ]",
+ "limit_to_extruder": "support_bottom_extruder_nr",
+ "enabled": "support_bottom_enable and support_bottom_pattern != 'concentric'",
+ "settable_per_mesh": false,
+ "settable_per_extruder": true
+ }
+ }
+ },
"support_fan_enable":
{
"label": "Fan Speed Override",
"description": "When enabled, the print cooling fan speed is altered for the skin regions immediately above the support.",
"type": "bool",
"default_value": false,
- "enabled": "support_enable",
+ "enabled": "support_enable or support_tree_enable",
"settable_per_mesh": false
},
"support_supported_skin_fan_speed":
@@ -4496,7 +4896,7 @@
"maximum_value": "100",
"default_value": 100,
"type": "float",
- "enabled": "support_enable and support_fan_enable",
+ "enabled": "(support_enable or support_tree_enable) and support_fan_enable",
"settable_per_mesh": false
},
"support_use_towers":
@@ -4523,10 +4923,10 @@
"enabled": "support_enable and support_use_towers",
"settable_per_mesh": true
},
- "support_minimal_diameter":
+ "support_tower_maximum_supported_diameter":
{
- "label": "Minimum Diameter",
- "description": "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower.",
+ "label": "Maximum Tower-Supported Diameter",
+ "description": "Maximum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower.",
"unit": "mm",
"type": "float",
"default_value": 3.0,
@@ -4578,11 +4978,11 @@
"label": "Enable Prime Blob",
"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": false,
"settable_per_mesh": false,
"settable_per_extruder": true,
- "enabled": false
+ "enabled": false,
+ "warning_value": "True if resolveOrValue('print_sequence') == 'one_at_a_time' else None"
},
"extruder_prime_pos_x":
{
@@ -4718,7 +5118,7 @@
"description": "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.",
"type": "bool",
"default_value": true,
- "enabled": "resolveOrValue('adhesion_type') == 'brim' and support_enable",
+ "enabled": "resolveOrValue('adhesion_type') == 'brim' and (support_enable or support_tree_enable)",
"settable_per_mesh": false,
"settable_per_extruder": true,
"limit_to_extruder": "support_infill_extruder_nr"
@@ -5220,18 +5620,7 @@
"type": "bool",
"enabled": "extruders_enabled_count > 1",
"default_value": false,
- "resolve": "any(extruderValues('prime_tower_enable'))",
- "settable_per_mesh": false,
- "settable_per_extruder": false
- },
- "prime_tower_circular":
- {
- "label": "Circular Prime Tower",
- "description": "Make the prime tower as a circular shape.",
- "type": "bool",
- "enabled": "resolveOrValue('prime_tower_enable')",
- "default_value": true,
- "resolve": "any(extruderValues('prime_tower_circular'))",
+ "resolve": "(extruders_enabled_count > 1) and any(extruderValues('prime_tower_enable'))",
"settable_per_mesh": false,
"settable_per_extruder": false
},
@@ -5259,7 +5648,7 @@
"type": "float",
"default_value": 6,
"minimum_value": "0",
- "maximum_value_warning": "((resolveOrValue('prime_tower_size') * 0.5) ** 2 * 3.14159 * resolveOrValue('layer_height') if prime_tower_circular else resolveOrValue('prime_tower_size') ** 2 * resolveOrValue('layer_height')) - sum(extruderValues('prime_tower_min_volume')) + prime_tower_min_volume",
+ "maximum_value_warning": "(resolveOrValue('prime_tower_size') * 0.5) ** 2 * 3.14159 * resolveOrValue('layer_height')",
"enabled": "resolveOrValue('prime_tower_enable')",
"settable_per_mesh": false,
"settable_per_extruder": true
@@ -5272,7 +5661,7 @@
"unit": "mm",
"enabled": "resolveOrValue('prime_tower_enable')",
"default_value": 200,
- "value": "machine_width - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' or (prime_tower_brim_enable and adhesion_type != 'raft') 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')) * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enable') else 0) - 1",
+ "value": "machine_width - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' or (prime_tower_brim_enable and adhesion_type != 'raft') 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')) * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0) - 1",
"maximum_value": "machine_width / 2 if machine_center_is_zero else machine_width",
"minimum_value": "resolveOrValue('prime_tower_size') - machine_width / 2 if machine_center_is_zero else resolveOrValue('prime_tower_size')",
"settable_per_mesh": false,
@@ -5286,27 +5675,12 @@
"unit": "mm",
"enabled": "resolveOrValue('prime_tower_enable')",
"default_value": 200,
- "value": "machine_depth - prime_tower_size - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' or (prime_tower_brim_enable and adhesion_type != 'raft') 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')) * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enable') else 0) - 1",
+ "value": "machine_depth - prime_tower_size - max(extruderValue(adhesion_extruder_nr, 'brim_width') * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 if adhesion_type == 'brim' or (prime_tower_brim_enable and adhesion_type != 'raft') 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')) * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0) - 1",
"maximum_value": "machine_depth / 2 - resolveOrValue('prime_tower_size') if machine_center_is_zero else machine_depth - resolveOrValue('prime_tower_size')",
"minimum_value": "machine_depth / -2 if machine_center_is_zero else 0",
"settable_per_mesh": false,
"settable_per_extruder": false
},
- "prime_tower_flow":
- {
- "label": "Prime Tower Flow",
- "description": "Flow compensation: the amount of material extruded is multiplied by this value.",
- "type": "float",
- "unit": "%",
- "enabled": "resolveOrValue('prime_tower_enable')",
- "default_value": 100,
- "value": "material_flow",
- "minimum_value": "0.0001",
- "minimum_value_warning": "50",
- "maximum_value_warning": "150",
- "settable_per_mesh": false,
- "settable_per_extruder": true
- },
"prime_tower_wipe_enabled":
{
"label": "Wipe Inactive Nozzle on Prime Tower",
@@ -5323,6 +5697,7 @@
"description": "Prime-towers might need the extra adhesion afforded by a brim even if the model doesn't. Presently can't be used with the 'Raft' adhesion-type.",
"type": "bool",
"enabled": "resolveOrValue('prime_tower_enable') and (resolveOrValue('adhesion_type') != 'raft')",
+ "resolve": "resolveOrValue('prime_tower_enable') and (resolveOrValue('adhesion_type') in ('none', 'skirt'))",
"default_value": false,
"settable_per_mesh": false,
"settable_per_extruder": false
@@ -5449,7 +5824,7 @@
"description": "Remove empty layers beneath the first printed layer if they are present. Disabling this setting can cause empty first layers if the Slicing Tolerance setting is set to Exclusive or Middle.",
"type": "bool",
"default_value": true,
- "enabled": "not support_enable",
+ "enabled": "not (support_enable or support_tree_enable)",
"settable_per_mesh": false,
"settable_per_extruder": false
}
@@ -5609,7 +5984,7 @@
"smooth_spiralized_contours":
{
"label": "Smooth Spiralized Contours",
- "description": "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details.",
+ "description": "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details.",
"type": "bool",
"default_value": true,
"enabled": "magic_spiralize",
@@ -5854,10 +6229,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 +6241,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. Maximum Deviation is a limit for Maximum Resolution, so if the two conflict the Maximum Deviation will always be held true.",
+ "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",
@@ -6170,7 +6557,7 @@
"support_conical_enabled":
{
"label": "Enable Conical Support",
- "description": "Experimental feature: Make support areas smaller at the bottom than at the overhang.",
+ "description": "Make support areas smaller at the bottom than at the overhang.",
"type": "bool",
"default_value": false,
"enabled": "support_enable",
@@ -6340,7 +6727,7 @@
"type": "float",
"default_value": 5,
"minimum_value": "0.1",
- "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2 + max(max_feedrate_z_override, machine_max_feedrate_z) ** 2)",
+ "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2 + machine_max_feedrate_z ** 2)",
"maximum_value_warning": "50",
"enabled": "wireframe_enabled",
"settable_per_mesh": false,
@@ -6372,7 +6759,7 @@
"type": "float",
"default_value": 5,
"minimum_value": "0.1",
- "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2 + max(max_feedrate_z_override, machine_max_feedrate_z) ** 2)",
+ "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2 + machine_max_feedrate_z ** 2)",
"maximum_value_warning": "50",
"enabled": "wireframe_enabled",
"value": "wireframe_printspeed",
@@ -6388,7 +6775,7 @@
"type": "float",
"default_value": 5,
"minimum_value": "0.1",
- "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2 + max(max_feedrate_z_override, machine_max_feedrate_z) ** 2)",
+ "maximum_value": "math.sqrt(machine_max_feedrate_x ** 2 + machine_max_feedrate_y ** 2 + machine_max_feedrate_z ** 2)",
"maximum_value_warning": "50",
"enabled": "wireframe_enabled",
"value": "wireframe_printspeed",
@@ -6648,7 +7035,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 +7045,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 +7057,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 +7341,293 @@
"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
+ },
+ "small_hole_max_size":
+ {
+ "label": "Small Hole Max Size",
+ "description": "Holes and part outlines with a diameter smaller than this will be printed using Small Feature Speed.",
+ "unit": "mm",
+ "type": "float",
+ "minimum_value": "0",
+ "default_value": 0,
+ "settable_per_mesh": true
+ },
+ "small_feature_max_length":
+ {
+ "label": "Small Feature Max Length",
+ "description": "Feature outlines that are shorter than this length will be printed using Small Feature Speed.",
+ "unit": "mm",
+ "type": "float",
+ "minimum_value": "0",
+ "default_value": 0,
+ "value": "small_hole_max_size * math.pi",
+ "settable_per_mesh": true
+ },
+ "small_feature_speed_factor":
+ {
+ "label": "Small Feature Speed",
+ "description": "Small features will be printed at this percentage of their normal print speed. Slower printing can help with adhestion and accuracy.",
+ "unit": "%",
+ "type": "float",
+ "default_value": 50,
+ "minimum_value": "1",
+ "minimum_value_warning": "25",
+ "maximum_value": "100",
+ "settable_per_mesh": true
+ },
+ "small_feature_speed_factor_0":
+ {
+ "label": "First Layer Speed",
+ "description": "Small features on the first layer will be printed at this percentage of their normal print speed. Slower printing can help with adhestion and accuracy.",
+ "unit": "%",
+ "type": "float",
+ "default_value": 50,
+ "value": "small_feature_speed_factor",
+ "minimum_value": "1",
+ "minimum_value_warning": "25",
+ "maximum_value": "100",
+ "settable_per_mesh": true
}
}
},
- "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/felixpro2dual.def.json b/resources/definitions/felixpro2dual.def.json
new file mode 100644
index 0000000000..0c978cdb71
--- /dev/null
+++ b/resources/definitions/felixpro2dual.def.json
@@ -0,0 +1,73 @@
+{
+ "version": 2,
+ "name": "Felix Pro 2 Dual",
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": true,
+ "author": "pnks",
+ "manufacturer": "Felix",
+ "platform": "FelixPro2_platform.obj",
+ "platform_offset": [-135, -0.5, 130],
+ "machine_extruder_trains":
+ {
+ "0": "felixpro2_dual_extruder_0",
+ "1": "felixpro2_dual_extruder_1"
+ },
+ "file_formats": "text/x-gcode",
+ "has_variants": true,
+ "has_materials": true,
+ "preferred_variant_name": "0.35 mm",
+ "variants_name": "Nozzle diameter"
+ },
+ "overrides": {
+ "machine_name": { "default_value": "FelixPro2Dual" },
+
+ "layer_height": { "default_value": 0.15 },
+ "layer_height_0": { "default_value": 0.2 },
+ "speed_layer_0": { "default_value": 20},
+
+ "infill_sparse_density": { "default_value": 20 },
+ "wall_thickness": { "default_value": 1 },
+ "top_bottom_thickness": { "default_value": 1 },
+
+ "machine_width": { "default_value": 240 },
+ "machine_depth": { "default_value": 225 },
+ "machine_height": { "default_value": 245 },
+
+ "machine_head_with_fans_polygon":
+ {
+ "default_value": [
+ [ -60, 50 ],
+ [ -60, -50 ],
+ [ 70, 50 ],
+ [ 70, -50 ]
+ ]
+ },
+ "gantry_height": { "value": "0" },
+ "machine_extruder_count": { "default_value": 2 },
+ "prime_tower_position_x": { "value": "250" },
+ "prime_tower_position_y": { "value": "200" },
+
+ "machine_heated_bed": { "default_value": true },
+ "machine_gcode_flavor": { "default_value": "Repetier" },
+ "machine_center_is_zero": { "default_value": false },
+
+ "speed_print": { "default_value": 80 },
+ "speed_travel": { "default_value": 200 },
+
+ "retraction_amount": { "default_value": 1 },
+ "retraction_speed": { "default_value": 50},
+ "material_flow": { "default_value": 100 },
+ "material_flow_layer_0": { "default_value" : 110, "value": "material_flow * 1.1" },
+ "adhesion_type": { "default_value": "skirt" },
+ "skirt_brim_minimal_length": { "default_value": 130 },
+ "skirt_line_count": { "default_value": 3 },
+
+ "machine_start_gcode": {
+ "default_value": "G90 ;absolute positioning\r\nM82 ;set extruder to absolute mode\r\nM107 ;start with the fan off\r\nG28 X0 Y0 ;move X\/Y to min endstops\r\nG28 Z0 ;move Z to min endstops\r\nG1 Z15.0 F9000 ;move the platform down 15mm\r\n\r\nT0 ;Switch to the 1st extruder\r\nG92 E0 ;zero the extruded length\r\nG1 F200 E6 ;extrude 6 mm of feed stock\r\nG92 E0 ;zero the extruded length again\r\n;G1 F9000\r\nM117 FPro2 printing...\r\n"
+ },
+ "machine_end_gcode": {
+ "default_value": "; Endcode FELIXprinters Pro series\r\n; =================================\t; Move extruder to park position\r\nG91 \t\t\t\t\t; Make coordinates relative\r\nG1 Z2 F5000 \t\t\t\t; Move z 2mm up\r\nG90 \t\t\t\t\t; Use absolute coordinates again\t\t\r\nG1 X220 Y243 F7800 \t\t\t; Move bed and printhead to ergonomic position\r\n\r\n; =================================\t; Turn off heaters\r\nT0\t\t\t\t\t; Select left extruder\r\nM104 T0 S0\t\t\t\t; Turn off heater and continue\t\t\t\t\r\nG92 E0\t\t\t\t\t; Reset extruder position\r\nG1 E-8\t\t\t\t\t; Retract filament 8mm\r\nG1 E-5\t\t\t\t\t; Push back filament 3mm\r\nG92 E0\t\t\t\t\t; Reset extruder position\r\n\r\nT1\t\t\t\t\t; Select right extruder\r\nM104 T1 S0\t\t\t\t; Turn off heater and continu\r\nG92 E0\t\t\t\t\t; Reset extruder position\r\nG1 E-8\t\t\t\t\t; Retract filament 8mm\r\nG1 E-5\t\t\t\t\t; Push back filament 3mm\r\nG92 E0\t\t\t\t\t; Reset extruder position\r\nT0\t\t\t\t\t; Select left extruder\r\nM140 S0\t\t\t\t\t; Turn off bed heater\r\n\r\n; =================================\t; Turn the rest off\r\nM107 \t\t\t\t; Turn off fan\r\nM84\t\t\t\t\t; Disable steppers\r\nM117 Print Complete"
+ }
+ }
+}
diff --git a/resources/definitions/flsun_qq_s.def.json b/resources/definitions/flsun_qq_s.def.json
new file mode 100644
index 0000000000..5a739e9ae1
--- /dev/null
+++ b/resources/definitions/flsun_qq_s.def.json
@@ -0,0 +1,78 @@
+{
+ "id": "flsun_qq_s",
+ "version": 2,
+ "name": "FLSUN QQ-S",
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": true,
+ "author": "Cataldo URSO",
+ "manufacturer": "FLSUN",
+ "file_formats": "text/x-gcode",
+ "has_materials": true,
+ "preferred_quality_type": "draft",
+ "machine_extruder_trains": {
+ "0": "flsun_qq_s_extruder_0"
+ }
+ },
+ "overrides": {
+ "machine_center_is_zero": {
+ "default_value": true
+ },
+ "machine_shape": {
+ "default_value": "elliptic"
+ },
+ "machine_width": {
+ "default_value": 260
+ },
+ "machine_depth": {
+ "default_value": 260
+ },
+ "machine_height": {
+ "default_value": 370
+ },
+ "z_seam_type": {
+ "default_value": "back"
+ },
+ "top_thickness": {
+ "default_value": 5
+ },
+ "bottom_layers": {
+ "default_value": 4
+ },
+ "gantry_height": {
+ "default_value": 0
+ },
+ "machine_nozzle_size": {
+ "default_value": 0.4
+ },
+ "material_diameter": {
+ "default_value": 1.75
+ },
+ "machine_start_gcode": {
+ "default_value": "G21\nG90\nM82\nM107 T0\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG28\nG92 E0\nG0 E3 F200\nG92 E0\n"
+ },
+ "machine_end_gcode": {
+ "default_value": "M107 T0\nM104 S0\nM104 S0 T1\nM140 S0\nG92 E0\nG91\nG1 E-1 F300 \nG1 Z+0.5 E-5 X-20 Y-20 F9000\nG28 X0 Y0\nM84 ;steppers off\nG90 ;absolute positioning\n"
+ },
+ "infill_sparse_density": {
+ "default_value": 10
+ },
+ "machine_head_with_fans_polygon": {
+ "default_value": [
+ [0, 0],
+ [0, 0],
+ [0, 0],
+ [0, 0]
+ ]
+ },
+ "retraction_enable": {
+ "default_value": true
+ },
+ "machine_heated_bed": {
+ "default_value": true
+ },
+ "machine_gcode_flavor": {
+ "default_value": "Repetier"
+ }
+ }
+}
diff --git a/resources/definitions/folgertech_FT-5.def.json b/resources/definitions/folgertech_FT-5.def.json
index d3d00a9b25..7ede40a025 100644
--- a/resources/definitions/folgertech_FT-5.def.json
+++ b/resources/definitions/folgertech_FT-5.def.json
@@ -18,7 +18,7 @@
"machine_width": { "default_value": 300 },
"machine_height": { "default_value": 400 },
"machine_depth": { "default_value": 300 },
- "gantry_height": { "default_value": 55 },
+ "gantry_height": { "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\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..."
diff --git a/resources/definitions/geeetech_a30.def.json b/resources/definitions/geeetech_a30.def.json
new file mode 100644
index 0000000000..3d8823f438
--- /dev/null
+++ b/resources/definitions/geeetech_a30.def.json
@@ -0,0 +1,131 @@
+{
+ "id": "geeetech_a30",
+ "version": 2,
+ "name": "Geeetech A30",
+ "inherits": "fdmprinter",
+ "metadata": {
+ "author": "William & Cataldo URSO",
+ "manufacturer": "Shenzhen Geeetech Technology",
+ "file_formats": "text/x-gcode",
+ "visible": true,
+ "has_materials": true,
+ "preferred_quality_type": "draft",
+ "machine_extruder_trains": {
+ "0": "geeetech_a30_extruder_0"
+ }
+ },
+ "overrides": {
+ "machine_name": {
+ "default_value": "Geeetech A30"
+ },
+ "machine_start_gcode": {
+ "default_value": "G28 ;Home\nM190 S{material_bed_temperature}\nM109 S{material_print_temperature} T0\nG1 Z15.0 F6000 ;Move the platform down 15mm\nG92 E0\nG1 F200 E3\nG92 E0"
+ },
+ "machine_end_gcode": {
+ "default_value": "M104 S0;Cooling the heat end\nM140 S0;Cooling the heat bed\nG92 E1\nG1 E-1 F300\nG28 X0 Y0;Home X axis and Y axis\nM84"
+ },
+ "machine_width": {
+ "default_value": 320
+ },
+ "machine_height": {
+ "default_value": 420
+ },
+ "machine_depth": {
+ "default_value": 320
+ },
+ "machine_heated_bed": {
+ "default_value": true
+ },
+ "machine_center_is_zero": {
+ "default_value": false
+ },
+ "material_diameter": {
+ "default_value": 1.75
+ },
+ "material_bed_temperature": {
+ "default_value": 60
+ },
+ "machine_nozzle_size": {
+ "default_value": 0.4
+ },
+ "layer_height": {
+ "default_value": 0.1
+ },
+ "layer_height_0": {
+ "default_value": 0.3
+ },
+ "retraction_amount": {
+ "default_value": 2
+ },
+ "retraction_speed": {
+ "default_value": 25
+ },
+ "retraction_retract_speed": {
+ "default_value": 25
+ },
+ "retraction_prime_speed": {
+ "default_value": 25
+ },
+ "adhesion_type": {
+ "default_value": "skirt"
+ },
+ "machine_head_polygon": {
+ "default_value": [
+ [-75, 35],
+ [18, 35],
+ [18, -18],
+ [-75, -18]
+ ]
+ },
+ "machine_head_with_fans_polygon": {
+ "default_value": [
+ [-75, 35],
+ [18, 35],
+ [18, -18],
+ [-75, -18]
+ ]
+ },
+ "gantry_height": {
+ "default_value": 55
+ },
+ "machine_max_feedrate_x": {
+ "default_value": 300
+ },
+ "machine_max_feedrate_y": {
+ "default_value": 300
+ },
+ "machine_max_feedrate_z": {
+ "default_value": 7
+ },
+ "machine_max_feedrate_e": {
+ "default_value": 50
+ },
+ "machine_max_acceleration_x": {
+ "default_value": 2000
+ },
+ "machine_max_acceleration_y": {
+ "default_value": 2000
+ },
+ "machine_max_acceleration_z": {
+ "default_value": 100
+ },
+ "machine_max_acceleration_e": {
+ "default_value": 10000
+ },
+ "machine_acceleration": {
+ "default_value": 2000
+ },
+ "machine_max_jerk_xy": {
+ "default_value": 10
+ },
+ "machine_max_jerk_z": {
+ "default_value": 1
+ },
+ "machine_max_jerk_e": {
+ "default_value": 5
+ },
+ "machine_gcode_flavor": {
+ "default_value": "Repetier"
+ }
+ }
+}
diff --git a/resources/definitions/gmax15plus.def.json b/resources/definitions/gmax15plus.def.json
index 069b8be999..eb576f0e19 100644
--- a/resources/definitions/gmax15plus.def.json
+++ b/resources/definitions/gmax15plus.def.json
@@ -37,7 +37,7 @@
"retraction_amount": { "default_value": 1 },
"retraction_speed": { "default_value": 70},
"adhesion_type": { "default_value": "skirt" },
- "gantry_height": { "default_value": 50 },
+ "gantry_height": { "value": "50" },
"speed_print": { "default_value": 50 },
"speed_travel": { "default_value": 70 },
"machine_max_acceleration_x": { "default_value": 600 },
diff --git a/resources/definitions/gmax15plus_dual.def.json b/resources/definitions/gmax15plus_dual.def.json
index 0264ef5977..40a3dde303 100644
--- a/resources/definitions/gmax15plus_dual.def.json
+++ b/resources/definitions/gmax15plus_dual.def.json
@@ -35,7 +35,7 @@
"retraction_amount": { "default_value": 1 },
"retraction_speed": { "default_value": 70},
"adhesion_type": { "default_value": "skirt" },
- "gantry_height": { "default_value": 50 },
+ "gantry_height": { "value": "50" },
"speed_print": { "default_value": 50 },
"speed_travel": { "default_value": 70 },
"machine_max_acceleration_x": { "default_value": 600 },
diff --git a/resources/definitions/grr_neo.def.json b/resources/definitions/grr_neo.def.json
index 67d6a92023..b3a558825a 100644
--- a/resources/definitions/grr_neo.def.json
+++ b/resources/definitions/grr_neo.def.json
@@ -37,7 +37,7 @@
]
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/hms434.def.json b/resources/definitions/hms434.def.json
index e41ca71c97..9956462071 100644
--- a/resources/definitions/hms434.def.json
+++ b/resources/definitions/hms434.def.json
@@ -9,7 +9,6 @@
"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" ],
@@ -43,18 +42,13 @@
"material_diameter": {"default_value": 1.75 },
"machine_heated_bed": {"default_value": true },
"machine_center_is_zero": {"default_value": false },
- "gantry_height": {"value": 35 },
+ "gantry_height": {"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 MaukCC nor any of MaukCC representatives has any liabilities or gives any warranties on this .gcode file, or on any or all objects made with this .gcode file.\n\nM117 Homing Y ......\nG28 Y\nM117 Homing X ......\nG28 X\nM117 Homing Z ......\nG28 Z F100\n\nG1 X-44 Y-100 F9000;go to wipe point\nG1 Z0 F900\nG1 Z0.2 F900\nM117 HMS434 Printing ...\n\n" },
"machine_end_gcode": {"default_value": "" },
@@ -65,7 +59,6 @@
"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)" },
@@ -91,7 +84,8 @@
"infill_before_walls": {"value": false},
"material_print_temperature_layer_0": {"value": "material_print_temperature + 5"},
- "material_initial_print_temperature": {"value": "material_print_temperature"},
+ "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": "100"},
@@ -112,7 +106,6 @@
"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},
@@ -121,7 +114,7 @@
"retraction_hop_enabled": {"value": false},
"retraction_hop": {"value": 1},
- "retraction_combing": {"value": "off"},
+ "retraction_combing": {"value": "'off'"},
"cool_fan_speed": {"value": 0},
"cool_fan_enabled": {"value": true},
@@ -142,7 +135,6 @@
"skirt_brim_minimal_length": {"value": 50},
"prime_tower_enable": {"value": false },
- "prime_tower_wall_thickness": {"resolve": 0.7 },
"prime_tower_size": {"value": 20.6 },
"prime_tower_position_x": {"value": 125 },
"prime_tower_position_y": {"value": 70 },
diff --git a/resources/definitions/imade3d_jellybox.def.json b/resources/definitions/imade3d_jellybox.def.json
index ae9ca176f5..635cb1fdd0 100644
--- a/resources/definitions/imade3d_jellybox.def.json
+++ b/resources/definitions/imade3d_jellybox.def.json
@@ -1,19 +1,16 @@
{
"version": 2,
- "name": "IMADE3D JellyBOX",
- "inherits": "fdmprinter",
+ "name": "IMADE3D JellyBOX Original",
+ "inherits": "imade3d_jellybox_root",
"metadata": {
"visible": true,
"author": "IMADE3D",
- "manufacturer": "IMADE3D",
"platform": "imade3d_jellybox_platform.stl",
"platform_offset": [ 0, -0.3, 0],
- "file_formats": "text/x-gcode",
"preferred_variant_name": "0.4 mm",
"preferred_quality_type": "fast",
"has_materials": true,
"has_variants": true,
- "has_machine_materials": true,
"has_machine_quality": true,
"machine_extruder_trains": {
"0": "imade3d_jellybox_extruder_0"
@@ -22,18 +19,15 @@
"overrides": {
"machine_head_with_fans_polygon": { "default_value": [[ 0, 0 ],[ 0, 0 ],[ 0, 0 ],[ 0, 0 ]]},
- "machine_name": { "default_value": "IMADE3D JellyBOX" },
+ "machine_name": { "default_value": "IMADE3D JellyBOX Original" },
"machine_width": { "default_value": 170 },
"machine_height": { "default_value": 145 },
"machine_depth": { "default_value": 160 },
- "machine_heated_bed": { "default_value": true },
- "machine_center_is_zero": { "default_value": false },
- "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
- "default_value": ";---------------------------------------\n; ; ; Jellybox Start Script Begin ; ; ;\n;_______________________________________\n; M92 E140 ;optionally adjust steps per mm for your filament\n\n; Print Settings Summary\n; (leave these alone: this is only a list of the slicing settings)\n; (overwriting these values will NOT change your printer's behavior)\n; sliced for : {machine_name}\n; nozzle diameter : {machine_nozzle_size}\n; filament diameter : {material_diameter}\n; layer height : {layer_height}\n; 1st layer height : {layer_height_0}\n; line width : {line_width}\n; outer wall wipe dist. : {wall_0_wipe_dist}\n; infill line width : {infill_line_width}\n; wall thickness : {wall_thickness}\n; top thickness : {top_thickness}\n; bottom thickness : {bottom_thickness}\n; infill density : {infill_sparse_density}\n; infill pattern : {infill_pattern}\n; print temperature : {material_print_temperature}\n; 1st layer print temp. : {material_print_temperature_layer_0}\n; heated bed temperature : {material_bed_temperature}\n; 1st layer bed temp. : {material_bed_temperature_layer_0}\n; regular fan speed : {cool_fan_speed_min}\n; max fan speed : {cool_fan_speed_max}\n; retraction amount : {retraction_amount}\n; retr. retract speed : {retraction_retract_speed}\n; retr. prime speed : {retraction_prime_speed}\n; build plate adhesion : {adhesion_type}\n; support ? {support_enable}\n; spiralized ? {magic_spiralize}\n\nM117 Preparing ;write Preparing\nM140 S{material_bed_temperature_layer_0} ;set bed temperature and move on\nM109 S{material_print_temperature} ; wait for the extruder to reach desired temperature\nM206 X10.0 Y0.0 ;set x homing offset for default bed leveling\nG21 ;metric values\nG90 ;absolute positioning\nM107 ;start with the fan off\nM82 ;set extruder to absolute mode\nG28 ;home all axes\nM203 Z4 ;slow Z speed down for greater accuracy when probing\nG29 ;auto bed leveling procedure\nM203 Z7 ;pick up z speed again for printing\nM190 S{material_bed_temperature_layer_0} ;wait for the bed to reach desired temperature\nM109 S{material_print_temperature_layer_0} ;wait for the extruder to reach desired temperature\nG92 E0 ;reset the extruder position\nG1 F1500 E15 ;extrude 15mm of feed stock\nG92 E0 ;reset the extruder position again\nM117 Print starting ;write Print starting\n;---------------------------------------------\n; ; ; Jellybox Printer Start Script End ; ; ;\n;_____________________________________________\n"
+ "default_value": ";---------------------------------------\n; ; ; Jellybox Start Script Begin ; ; ;\n;_______________________________________\n; for slicer: CURA 3\n; start gcode last modified Jun 1, 2019\n\n; Print Settings Summary\n; (leave these alone: this is only a list of the slicing settings)\n; (overwriting these values will NOT change your printer's behavior)\n; sliced for : {machine_name}\n; jobname : {jobname}\n; gcode generated : {day}, {date}, {time}\n; est. print time : {print_time}\n; nozzle diameter : {machine_nozzle_size}\n; filament diameter : {material_diameter}\n; layer height : {layer_height}\n; 1st layer height : {layer_height_0}\n; line width : {line_width} \n; outer wall wipe dist. : {wall_0_wipe_dist}\n; infill line width : {infill_line_width}\n; wall thickness : {wall_thickness}\n; top thickness : {top_thickness}\n; bottom thickness : {bottom_thickness}\n; infill density : {infill_sparse_density}\n; infill pattern : {infill_pattern}\n; print temperature : {material_print_temperature}\n; 1st layer print temp. : {material_print_temperature_layer_0}\n; heated bed temperature : {material_bed_temperature}\n; 1st layer bed temp. : {material_bed_temperature_layer_0}\n; regular fan speed : {cool_fan_speed_min}\n; max fan speed : {cool_fan_speed_max}\n; retraction amount : {retraction_amount}\n; retr. retract speed : {retraction_retract_speed}\n; retr. prime speed : {retraction_prime_speed}\n; build plate adhesion : {adhesion_type}\n; support ? {support_enable}\n; spiralized ? {magic_spiralize}\n\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nM117 Preparing ;write Preparing\nM190 S{material_bed_temperature_layer_0} ;wait for the bed to reach desired temperature\nM109 S180 ;wait for the extruder to reach 180C\nG28 ;home all axes\nM203 Z4 ;slow Z speed down for greater accuracy when probing\nG29 O ;run auto bed leveling procedure IF leveling not active already\n; M500 ;optionally save the mesh\nM203 Z7 ;pick up z speed again for printing\nG28 X ;home x to get as far from the plate as possible\nM420 S1 ;(re) enable bed leveling if turned off by the G28\nG0 Y0 F5000 ;position Y in front\nG0 Z15 F3000 ;position Z\nM109 S{material_print_temperature_layer_0} ;wait for the extruder to reach desired temperature\nM300 S440 P300 ;play a tone\n; M0 Ready! Click to start ; optionally, stop and wait for user to continue\nM420 S1 ;(re) enable bed leveling to make iron-sure\nM117 Print starting ;write Print starting\n;================ ;PRINT:LINE start\nG90 ;absolute positioning\nG92 E0 ;reset the extruder position\nM420 S1 ;(re) enable bed leveling to make iron-sure\nG0 Z0 ;get Z down\nM83 ;relative extrusion mode\nM420 S1 ;(re) enable bed leveling to make iron-sure\nG1 E20 F300 ;extrude __mm of feed stock\nG1 E18 F250 ;extrude __mm of feed stock\nG1 E10 F250 ;extrude __mm of feed stock\nG4 S2 ;pause for ooze\nM400 ;make sure all is finished\nM420 S1 ;(re) enable bed leveling to make iron-sure\nG0 F500 X3 Y0 Z0.3;get to the start of the LINE\nG1 E2 F300 ;extrude __mm of feed stock\nG1 F1000 X152 E7 ;print a thick LINE extruding __mm along the way\nG92 E0 ;reset the extruder position\n;---------------------------------------------\n; ; ; Jellybox Printer Start Script End ; ; ;\n;_____________________________________________\n"
},
"machine_end_gcode": {
- "default_value": "\n;---------------------------------\n;;; Jellybox End Script Begin ;;;\n;_________________________________\nM117 Finishing Up ;write Finishing Up\n\nM104 S0 ;extruder heater off\nM140 S0 ;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 F9000 ;move Z up a bit and retract filament even more\nG90 ;absolute positioning\nG28 X ;home x, so the head is out of the way\nG1 Y100 ;move Y forward, so the print is more accessible\nM84 ;steppers off\n\nM117 Print finished ;write Print finished\n;---------------------------------------\n;;; Jellybox End Script End ;;;\n;_______________________________________"
+ "default_value": "\n;---------------------------------\n;;; Jellybox End Script Begin ;;;\n;_________________________________\n; end gcode last modified Nov 30, 2018\nM117 Finishing Up ;write Finishing Up\n\nM107 ;turn the fan off\nM104 S0 ;extruder heater off\nM140 S0 ;bed heater off (if you have it)\nG91 ;relative positioning (includes extruder)\nG1 E-1 F2500 ;retract the filament a bit before lifting the nozzle to release some of the pressure\nG1 Z0.5 E-4 X-10 F9000 ;get out and retract filament even more\nG1 E-25 F2500 ;retract even more\nG90 ;absolute positioning (includes extruder)\nG28 X ;home X so the head is out of the way\nG1 Y140 ;move Y forward, so the print is more accessible\nM84 ;steppers off\n\nM117 Print finished ;write Print finished\n;---------------------------------------\n;;; Jellybox End Script End ;;;\n;_______________________________________"
}
}
}
diff --git a/resources/definitions/imade3d_jellybox_2.def.json b/resources/definitions/imade3d_jellybox_2.def.json
new file mode 100644
index 0000000000..7d7b82e194
--- /dev/null
+++ b/resources/definitions/imade3d_jellybox_2.def.json
@@ -0,0 +1,36 @@
+{
+ "version": 2,
+ "name": "IMADE3D JellyBOX 2",
+ "inherits": "imade3d_jellybox_root",
+ "metadata": {
+ "visible": true,
+ "author": "IMADE3D",
+ "platform": "imade3d_jellybox_2_platform.stl",
+ "platform_offset": [ 0, -10, 0],
+ "preferred_variant_name": "0.4 mm",
+ "preferred_quality_type": "fast",
+ "has_materials": true,
+ "has_variants": true,
+ "has_machine_quality": true,
+ "machine_extruder_trains": {
+ "0": "imade3d_jellybox_2_extruder_0"
+ }
+ },
+
+ "overrides": {
+ "gradual_infill_steps":{"default_value": 0},
+ "gradual_infill_step_height": {"default_value": 3},
+ "machine_head_with_fans_polygon": { "default_value": [[ 0, 0 ],[ 0, 0 ],[ 0, 0 ],[ 0, 0 ]]},
+ "machine_name": { "default_value": "IMADE3D JellyBOX 2" },
+ "machine_width": { "default_value": 180 },
+ "machine_height": { "default_value": 145 },
+ "machine_depth": { "default_value": 165 },
+ "machine_nozzle_size": { "default_value": 0.4 },
+ "machine_start_gcode": {
+ "default_value": ";---------------------------------------\n; ; ; Jellybox Start Script Begin ; ; ;\n;_______________________________________\n; for slicer: CURA 3\n; start gcode last modified Jun 1, 2019\n\n; Print Settings Summary\n; (leave these alone: this is only a list of the slicing settings)\n; (overwriting these values will NOT change your printer's behavior)\n; sliced for : {machine_name}\n; jobname : {jobname}\n; gcode generated : {day}, {date}, {time}\n; est. print time : {print_time}\n; nozzle diameter : {machine_nozzle_size}\n; filament diameter : {material_diameter}\n; layer height : {layer_height}\n; 1st layer height : {layer_height_0}\n; line width : {line_width} \n; outer wall wipe dist. : {wall_0_wipe_dist}\n; infill line width : {infill_line_width}\n; wall thickness : {wall_thickness}\n; top thickness : {top_thickness}\n; bottom thickness : {bottom_thickness}\n; infill density : {infill_sparse_density}\n; infill pattern : {infill_pattern}\n; print temperature : {material_print_temperature}\n; 1st layer print temp. : {material_print_temperature_layer_0}\n; heated bed temperature : {material_bed_temperature}\n; 1st layer bed temp. : {material_bed_temperature_layer_0}\n; regular fan speed : {cool_fan_speed_min}\n; max fan speed : {cool_fan_speed_max}\n; retraction amount : {retraction_amount}\n; retr. retract speed : {retraction_retract_speed}\n; retr. prime speed : {retraction_prime_speed}\n; build plate adhesion : {adhesion_type}\n; support ? {support_enable}\n; spiralized ? {magic_spiralize}\n\nG21 ;metric values\nG90 ;absolute positioning\nM82 ;set extruder to absolute mode\nM107 ;start with the fan off\nM117 Preparing ;write Preparing\nM190 S{material_bed_temperature_layer_0} ;wait for the bed to reach desired temperature\nM109 S180 ;wait for the extruder to reach 180C\nG28 ;home all axes\nM203 Z4 ;slow Z speed down for greater accuracy when probing\nG29 O ;run auto bed leveling procedure IF leveling not active already\n; M500 ;optionally save the mesh\nM203 Z7 ;pick up z speed again for printing\nG28 X ;home x to get as far from the plate as possible\nM420 S1 ;(re) enable bed leveling if turned off by the G28\nG0 Y0 F5000 ;position Y in front\nG0 Z15 F3000 ;position Z\nM109 S{material_print_temperature_layer_0} ;wait for the extruder to reach desired temperature\nM300 S440 P300 ;play a tone\n; M0 Ready! Click to start ; optionally, stop and wait for user to continue\nM420 S1 ;(re) enable bed leveling to make iron-sure\nM117 Print starting ;write Print starting\n;================ ;PRINT:LINE start\nG90 ;absolute positioning\nG92 E0 ;reset the extruder position\nM420 S1 ;(re) enable bed leveling to make iron-sure\nG0 Z0 ;get Z down\nM83 ;relative extrusion mode\nM420 S1 ;(re) enable bed leveling to make iron-sure\nG1 E20 F300 ;extrude __mm of feed stock\nG1 E18 F250 ;extrude __mm of feed stock\nG1 E10 F250 ;extrude __mm of feed stock\nG4 S2 ;pause for ooze\nM400 ;make sure all is finished\nM420 S1 ;(re) enable bed leveling to make iron-sure\nG0 F500 X3 Y0 Z0.3;get to the start of the LINE\nG1 E2 F300 ;extrude __mm of feed stock\nG1 F1000 X152 E7 ;print a thick LINE extruding __mm along the way\nG92 E0 ;reset the extruder position\n;---------------------------------------------\n; ; ; Jellybox Printer Start Script End ; ; ;\n;_____________________________________________\n"
+ },
+ "machine_end_gcode": {
+ "default_value": "\n;---------------------------------\n;;; Jellybox End Script Begin ;;;\n;_________________________________\n; end gcode last modified Nov 30, 2018\nM117 Finishing Up ;write Finishing Up\n\nM107 ;turn the fan off\nM104 S0 ;extruder heater off\nM140 S0 ;bed heater off (if you have it)\nG91 ;relative positioning (includes extruder)\nG1 E-1 F2500 ;retract the filament a bit before lifting the nozzle to release some of the pressure\nG1 Z0.5 E-4 X-10 F9000 ;get out and retract filament even more\nG1 E-25 F2500 ;retract even more\nG90 ;absolute positioning (includes extruder)\nG28 X ;home X so the head is out of the way\nG1 Y140 ;move Y forward, so the print is more accessible\nM84 ;steppers off\n\nM117 Print finished ;write Print finished\n;---------------------------------------\n;;; Jellybox End Script End ;;;\n;_______________________________________"
+ }
+ }
+}
diff --git a/resources/definitions/imade3d_jellybox_root.def.json b/resources/definitions/imade3d_jellybox_root.def.json
new file mode 100644
index 0000000000..52f541f1d4
--- /dev/null
+++ b/resources/definitions/imade3d_jellybox_root.def.json
@@ -0,0 +1,143 @@
+{
+ "version": 2,
+ "name": "imade3d_jellybox_root",
+ "inherits": "fdmprinter",
+ "metadata": {
+ "author": "IMADE3D",
+ "manufacturer": "IMADE3D",
+ "category": "Ultimaker",
+ "visible": false,
+ "file_formats": "text/x-gcode",
+ "exclude_materials": [
+ "chromatik_pla",
+ "dsm_arnitel2045_175",
+ "dsm_novamid1070_175",
+ "fabtotum_abs",
+ "fabtotum_nylon",
+ "fabtotum_pla",
+ "fabtotum_tpu",
+ "fiberlogy_hd_pla",
+ "filo3d_pla_green",
+ "filo3d_pla_red",
+ "filo3d_pla",
+ "generic_abs_175",
+ "generic_abs",
+ "generic_bam",
+ "generic_cpe_175",
+ "generic_cpe_plus",
+ "generic_cpe",
+ "generic_hips_175",
+ "generic_hips",
+ "generic_nylon_175",
+ "generic_nylon",
+ "generic_pc_175",
+ "generic_pc",
+ "generic_petg",
+ "generic_petg_175",
+ "generic_pla",
+ "generic_pla_175",
+ "generic_pp",
+ "generic_pva_175",
+ "generic_pva",
+ "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",
+ "tizyx_abs",
+ "tizyx_pla_bois",
+ "tizyx_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"
+ ]
+ },
+ "overrides": {
+ "machine_gcode_flavor": {
+ "default_value": "RepRap (Marlin/Sprinter)"
+ },
+ "material_diameter": {
+ "default_value": 1.75
+ },
+ "material_print_temperature": {
+ "minimum_value": "0"
+ },
+ "machine_center_is_zero": {
+ "default_value": false
+ },
+ "machine_heated_bed": {
+ "default_value": true
+ },
+ "material_bed_temperature": {
+ "minimum_value": "0"
+ },
+ "material_standby_temperature": {
+ "minimum_value": "0"
+ },
+ "relative_extrusion":
+ {
+ "value": true,
+ "enabled": true
+ }
+ }
+}
diff --git a/resources/definitions/innovo_inventor.def.json b/resources/definitions/innovo_inventor.def.json
index 91a6d8365b..72a9ec3edb 100644
--- a/resources/definitions/innovo_inventor.def.json
+++ b/resources/definitions/innovo_inventor.def.json
@@ -41,7 +41,7 @@
]
},
"gantry_height": {
- "default_value": 82.3
+ "value": "82.3"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/jgaurora_a1.def.json b/resources/definitions/jgaurora_a1.def.json
index b9a921c311..3c9f9c61e9 100644
--- a/resources/definitions/jgaurora_a1.def.json
+++ b/resources/definitions/jgaurora_a1.def.json
@@ -39,7 +39,7 @@
"default_value": false
},
"gantry_height": {
- "default_value": 10
+ "value": "10"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/jgaurora_a3s.def.json b/resources/definitions/jgaurora_a3s.def.json
new file mode 100644
index 0000000000..bd8d0bd0e3
--- /dev/null
+++ b/resources/definitions/jgaurora_a3s.def.json
@@ -0,0 +1,93 @@
+{
+ "name": "JGAurora A3S",
+ "version": 2,
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": true,
+ "author": "Samuel Pinches",
+ "manufacturer": "JGAurora",
+ "file_formats": "text/x-gcode",
+ "preferred_quality_type": "normal",
+ "machine_extruder_trains":
+ {
+ "0": "jgaurora_a3s_extruder_0"
+ }
+ },
+ "overrides": {
+ "machine_name": {
+ "default_value": "JGAurora A3S"
+ },
+ "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\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 Y200 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": 205
+ },
+ "machine_height": {
+ "default_value": 205
+ },
+ "machine_depth": {
+ "default_value": 205
+ },
+ "machine_heated_bed": {
+ "default_value": true
+ },
+ "machine_center_is_zero": {
+ "default_value": false
+ },
+ "gantry_height": {
+ "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": 65
+ },
+ "layer_height_0": {
+ "default_value": 0.12
+ },
+ "wall_thickness": {
+ "default_value": 1.2
+ },
+ "speed_print": {
+ "default_value": 35
+ },
+ "speed_infill": {
+ "default_value": 40
+ },
+ "speed_wall": {
+ "default_value": 30
+ },
+ "speed_topbottom": {
+ "default_value": 20
+ },
+ "speed_travel": {
+ "default_value": 100
+ },
+ "speed_layer_0": {
+ "default_value": 12
+ },
+ "support_enable": {
+ "default_value": true
+ },
+ "retraction_enable": {
+ "default_value": true
+ },
+ "retraction_amount": {
+ "default_value": 8
+ },
+ "retraction_speed": {
+ "default_value": 45
+ }
+ }
+}
diff --git a/resources/definitions/jgaurora_a5.def.json b/resources/definitions/jgaurora_a5.def.json
index d84a8440e6..e02fca881b 100644
--- a/resources/definitions/jgaurora_a5.def.json
+++ b/resources/definitions/jgaurora_a5.def.json
@@ -41,7 +41,7 @@
"default_value": false
},
"gantry_height": {
- "default_value": 10
+ "value": "10"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/jgaurora_jgmaker_magic.def.json b/resources/definitions/jgaurora_jgmaker_magic.def.json
index 4036ec51bf..703305151a 100644
--- a/resources/definitions/jgaurora_jgmaker_magic.def.json
+++ b/resources/definitions/jgaurora_jgmaker_magic.def.json
@@ -39,7 +39,7 @@
"default_value": false
},
"gantry_height": {
- "default_value": 10
+ "value": "10"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/jgaurora_z_603s.def.json b/resources/definitions/jgaurora_z_603s.def.json
index 3a78585240..cf92f2fc71 100644
--- a/resources/definitions/jgaurora_z_603s.def.json
+++ b/resources/definitions/jgaurora_z_603s.def.json
@@ -39,7 +39,7 @@
"default_value": false
},
"gantry_height": {
- "default_value": 10
+ "value": "10"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/kemiq_q2_beta.def.json b/resources/definitions/kemiq_q2_beta.def.json
index 387818565e..f0ae009419 100644
--- a/resources/definitions/kemiq_q2_beta.def.json
+++ b/resources/definitions/kemiq_q2_beta.def.json
@@ -41,7 +41,7 @@
"default_value": 2
},
"gantry_height": {
- "default_value": 0
+ "value": "0"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/kemiq_q2_gama.def.json b/resources/definitions/kemiq_q2_gama.def.json
index fd6f2d54aa..07ff6dcbf7 100644
--- a/resources/definitions/kemiq_q2_gama.def.json
+++ b/resources/definitions/kemiq_q2_gama.def.json
@@ -42,7 +42,7 @@
"default_value": 2
},
"gantry_height": {
- "default_value": 0
+ "value": "0"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/kossel_mini.def.json b/resources/definitions/kossel_mini.def.json
index 91f374fb6d..d9c3b3d37f 100644
--- a/resources/definitions/kossel_mini.def.json
+++ b/resources/definitions/kossel_mini.def.json
@@ -5,7 +5,7 @@
"metadata": {
"visible": true,
"author": "Claudio Sampaio (Patola)",
- "manufacturer": "Other",
+ "manufacturer": "Johann",
"file_formats": "text/x-gcode",
"platform": "kossel_platform.stl",
"platform_offset": [0, -0.25, 0],
diff --git a/resources/definitions/kossel_pro.def.json b/resources/definitions/kossel_pro.def.json
index e104538b2c..f26c6ed068 100644
--- a/resources/definitions/kossel_pro.def.json
+++ b/resources/definitions/kossel_pro.def.json
@@ -5,7 +5,7 @@
"metadata": {
"visible": true,
"author": "Chris Petersen",
- "manufacturer": "OpenBeam",
+ "manufacturer": "Johann",
"file_formats": "text/x-gcode",
"platform": "kossel_pro_build_platform.stl",
"platform_offset": [0, -0.25, 0],
diff --git a/resources/definitions/kupido.def.json b/resources/definitions/kupido.def.json
index 577a63581e..a81a40542b 100644
--- a/resources/definitions/kupido.def.json
+++ b/resources/definitions/kupido.def.json
@@ -29,7 +29,7 @@
"machine_height": { "default_value": 190 },
"machine_depth": { "default_value": 195 },
"machine_center_is_zero": { "default_value": false },
- "gantry_height": { "default_value": 55 },
+ "gantry_height": { "value": "55" },
"retraction_amount": { "default_value": 1 },
"support_enable": { "default_value": true},
"machine_head_with_fans_polygon": {
@@ -43,7 +43,7 @@
},
"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{travel_speed} ;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}"
+ "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_pegasus.def.json b/resources/definitions/makeR_pegasus.def.json
index ac09aa01ac..6b19544612 100644
--- a/resources/definitions/makeR_pegasus.def.json
+++ b/resources/definitions/makeR_pegasus.def.json
@@ -41,7 +41,7 @@
]
},
"gantry_height": {
- "default_value": -25
+ "value": "25"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/makeR_prusa_tairona_i3.def.json b/resources/definitions/makeR_prusa_tairona_i3.def.json
index 0e59874978..c7e7f4079d 100644
--- a/resources/definitions/makeR_prusa_tairona_i3.def.json
+++ b/resources/definitions/makeR_prusa_tairona_i3.def.json
@@ -41,7 +41,7 @@
]
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/makeit_pro_l.def.json b/resources/definitions/makeit_pro_l.def.json
index d40d63f97b..5d09189de8 100644
--- a/resources/definitions/makeit_pro_l.def.json
+++ b/resources/definitions/makeit_pro_l.def.json
@@ -4,8 +4,8 @@
"inherits": "fdmprinter",
"metadata": {
"visible": true,
- "author": "NA",
- "manufacturer": "NA",
+ "author": "unknown",
+ "manufacturer": "MAKEiT 3D",
"file_formats": "text/x-gcode",
"has_materials": false,
"machine_extruder_trains":
@@ -39,7 +39,7 @@
]
},
"gantry_height": {
- "default_value": 330
+ "value": "330"
},
"machine_use_extruder_offset_to_offset_coords": {
"default_value": true
diff --git a/resources/definitions/makeit_pro_m.def.json b/resources/definitions/makeit_pro_m.def.json
index 1f0381df86..57e2a7dbd4 100644
--- a/resources/definitions/makeit_pro_m.def.json
+++ b/resources/definitions/makeit_pro_m.def.json
@@ -4,8 +4,8 @@
"inherits": "fdmprinter",
"metadata": {
"visible": true,
- "author": "NA",
- "manufacturer": "NA",
+ "author": "unknown",
+ "manufacturer": "MAKEiT 3D",
"file_formats": "text/x-gcode",
"has_materials": false,
"machine_extruder_trains":
@@ -39,7 +39,7 @@
]
},
"gantry_height": {
- "default_value": 200
+ "value": "200"
},
"machine_use_extruder_offset_to_offset_coords": {
"default_value": true
diff --git a/resources/definitions/maker_starter.def.json b/resources/definitions/maker_starter.def.json
index be85e54967..560e53ccb9 100644
--- a/resources/definitions/maker_starter.def.json
+++ b/resources/definitions/maker_starter.def.json
@@ -33,7 +33,7 @@
"default_value": false
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
@@ -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/malyan_m180.def.json b/resources/definitions/malyan_m180.def.json
index 53864dabae..cd3a068134 100644
--- a/resources/definitions/malyan_m180.def.json
+++ b/resources/definitions/malyan_m180.def.json
@@ -53,7 +53,7 @@
"default_value": 92
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/malyan_m200.def.json b/resources/definitions/malyan_m200.def.json
index f2c01b3831..71c94184b2 100644
--- a/resources/definitions/malyan_m200.def.json
+++ b/resources/definitions/malyan_m200.def.json
@@ -80,7 +80,6 @@
"raft_surface_layers": { "default_value": 1 },
"skirt_line_count": { "default_value": 2},
"brim_width" : { "default_value": 5},
- "start_layers_at_same_position": { "default_value": true},
"retraction_combing": { "default_value": "noskin" },
"retraction_amount" : { "default_value": 4.5},
"retraction_speed" : { "default_value": 40},
diff --git a/resources/definitions/mankati_fullscale_xt_plus.def.json b/resources/definitions/mankati_fullscale_xt_plus.def.json
index 507e5209b2..104be7091b 100644
--- a/resources/definitions/mankati_fullscale_xt_plus.def.json
+++ b/resources/definitions/mankati_fullscale_xt_plus.def.json
@@ -28,7 +28,7 @@
[ 3, 3 ]
]
},
- "gantry_height": { "default_value": 0 },
+ "gantry_height": { "value": "0" },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
diff --git a/resources/definitions/mendel90.def.json b/resources/definitions/mendel90.def.json
index 85d82ae176..39cb4de8d3 100644
--- a/resources/definitions/mendel90.def.json
+++ b/resources/definitions/mendel90.def.json
@@ -68,7 +68,7 @@
"default_value": "RepRap (Marlin/Sprinter)"
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_head_with_fans_polygon":
{
diff --git a/resources/definitions/monoprice_ultimate.def.json b/resources/definitions/monoprice_ultimate.def.json
index 48290f0941..445347b54e 100644
--- a/resources/definitions/monoprice_ultimate.def.json
+++ b/resources/definitions/monoprice_ultimate.def.json
@@ -1,52 +1,48 @@
{
- "version": 2,
- "name": "Monoprice Ultimate",
- "inherits": "wanhao_d6",
- "metadata": {
- "visible": true,
- "author": "Danny Tuppeny",
- "manufacturer": "monoprice",
- "file_formats": "text/x-gcode",
- "icon": "wanhao-icon.png",
- "has_materials": true,
- "platform": "wanhao_200_200_platform.obj",
- "platform_texture": "Wanhaobackplate.png",
- "machine_extruder_trains": {
- "0": "wanhao_d6_extruder_0"
+ "version": 2,
+ "name": "Monoprice Ultimate",
+ "inherits": "wanhao_d6",
+ "metadata": {
+ "visible": true,
+ "author": "Danny Tuppeny",
+ "manufacturer": "Monoprice",
+ "file_formats": "text/x-gcode",
+ "icon": "wanhao-icon.png",
+ "has_materials": true,
+ "platform": "wanhao_200_200_platform.obj",
+ "platform_texture": "Wanhaobackplate.png",
+ "machine_extruder_trains": {
+ "0": "wanhao_d6_extruder_0"
+ },
+ "platform_offset": [0, -28, 0]
},
- "platform_offset": [
- 0,
- -28,
- 0
- ]
- },
- "overrides": {
- "machine_name": {
- "default_value": "Monoprice Ultimate"
- },
- "machine_max_acceleration_x": {
- "default_value": 3000
- },
- "machine_max_acceleration_y": {
- "default_value": 3000
- },
- "machine_max_acceleration_z": {
- "default_value": 100
- },
- "machine_max_acceleration_e": {
- "default_value": 500
- },
- "machine_acceleration": {
- "default_value": 800
- },
- "machine_max_jerk_xy": {
- "default_value": 10.0
- },
- "machine_max_jerk_z": {
- "default_value": 0.4
- },
- "machine_max_jerk_e": {
- "default_value": 1.0
+ "overrides": {
+ "machine_name": {
+ "default_value": "Monoprice Ultimate"
+ },
+ "machine_max_acceleration_x": {
+ "default_value": 3000
+ },
+ "machine_max_acceleration_y": {
+ "default_value": 3000
+ },
+ "machine_max_acceleration_z": {
+ "default_value": 100
+ },
+ "machine_max_acceleration_e": {
+ "default_value": 500
+ },
+ "machine_acceleration": {
+ "default_value": 800
+ },
+ "machine_max_jerk_xy": {
+ "default_value": 10.0
+ },
+ "machine_max_jerk_z": {
+ "default_value": 0.4
+ },
+ "machine_max_jerk_e": {
+ "default_value": 1.0
+ }
}
- }
}
diff --git a/resources/definitions/nwa3d_a31.def.json b/resources/definitions/nwa3d_a31.def.json
new file mode 100644
index 0000000000..6463ac2ca4
--- /dev/null
+++ b/resources/definitions/nwa3d_a31.def.json
@@ -0,0 +1,64 @@
+{
+ "name": "NWA3D A31",
+ "version": 2,
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": true,
+ "author": "DragonJe",
+ "manufacturer": "NWA 3D LLC",
+ "file_formats": "text/x-gcode",
+ "platform_offset": [0, 0, 0],
+ "has_materials": true,
+ "has_variants": true,
+ "variants_name": "Nozzle Size",
+ "preferred_variant_name": "Standard 0.4mm",
+ "preferred_quality_type": "normal",
+ "has_machine_quality": true,
+ "preferred_material": "generic_pla",
+ "machine_extruder_trains":
+ {
+ "0": "nwa3d_a31_extruder_0"
+ }
+ },
+
+ "overrides": {
+ "machine_name": {
+ "default_value": "NWA3D A31"
+ },
+ "machine_width": {
+ "default_value": 300
+ },
+ "machine_height": {
+ "default_value": 400
+ },
+ "machine_depth": {
+ "default_value": 300
+ },
+ "machine_head_polygon": {
+ "default_value": [
+ [-30, 34],
+ [-30, -32],
+ [30, -32],
+ [30, 34]
+ ]
+ },
+ "gantry_height": {
+ "value": "30"
+ },
+ "machine_heated_bed": {
+ "default_value": true
+ },
+ "material_diameter": {
+ "default_value": 1.75
+ },
+ "machine_gcode_flavor": {
+ "default_value": "RepRap (Marlin/Sprinter)"
+ },
+ "machine_start_gcode": {
+ "default_value": "G28 ; Home\nG1 Z15.0 F6000 ; Move Z axis up 15mm\n ; Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0"
+ },
+ "machine_end_gcode": {
+ "default_value": "M104 S0\nM140 S0\n ; Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84"
+ }
+ }
+}
diff --git a/resources/definitions/nwa3d_a5.def.json b/resources/definitions/nwa3d_a5.def.json
index 3deb0027fd..4309e07184 100644
--- a/resources/definitions/nwa3d_a5.def.json
+++ b/resources/definitions/nwa3d_a5.def.json
@@ -10,55 +10,53 @@
"platform_offset": [0, 0, 0],
"has_materials": true,
"has_variants": false,
- "has_machine_materials": true,
- "has_variant_materials": false,
"preferred_quality_type": "normal",
"has_machine_quality": true,
"preferred_material": "generic_pla",
- "machine_extruder_trains":
+ "machine_extruder_trains":
{
"0": "nwa3d_a5_extruder_0"
}
},
-
+
"overrides": {
- "machine_name": {
- "default_value": "NWA3D A5"
+ "machine_name": {
+ "default_value": "NWA3D A5"
},
- "machine_width": {
- "default_value": 125
+ "machine_width": {
+ "default_value": 125
},
- "machine_height": {
- "default_value": 100
+ "machine_height": {
+ "default_value": 100
},
- "machine_depth": {
- "default_value": 150
+ "machine_depth": {
+ "default_value": 150
},
- "machine_head_polygon": {
+ "machine_head_polygon": {
"default_value": [
- [-30, 34],
- [-30, -32],
- [30, -32],
+ [-30, 34],
+ [-30, -32],
+ [30, -32],
[30, 34]
- ]
+ ]
},
- "gantry_height": {
- "default_value": 30
+ "gantry_height": {
+ "value": "30"
},
- "machine_heated_bed": {
- "default_value": false
+ "machine_heated_bed": {
+ "default_value": false
},
"material_diameter": {
"default_value": 1.75
},
- "machine_gcode_flavor": {
- "default_value": "RepRap (RepRap)"
+ "machine_gcode_flavor": {
+ "default_value": "RepRap (RepRap)"
},
- "machine_start_gcode": {
- "default_value": "G28 ; Home\nG1 Z15.0 F6000 ; Move Z axis up 15mm\n ; Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0"
+ "machine_start_gcode": {
+ "default_value": "G28 ; Home\nG1 Z15.0 F6000 ; Move Z axis up 15mm\n ; Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0"
},
- "machine_end_gcode": {
- "default_value": "M104 S0\nM140 S0\n ; Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84"
+ "machine_end_gcode": {
+ "default_value": "M104 S0\nM140 S0\n ; Retract the filament\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\nM84"
}
}
}
diff --git a/resources/definitions/peopoly_moai.def.json b/resources/definitions/peopoly_moai.def.json
index a578cc4240..8d7754a9ef 100644
--- a/resources/definitions/peopoly_moai.def.json
+++ b/resources/definitions/peopoly_moai.def.json
@@ -126,9 +126,6 @@
"adhesion_type": {
"value": "'none'"
},
- "acceleration_enabled": {
- "value": "False"
- },
"print_sequence": {
"enabled": false
},
@@ -173,8 +170,8 @@
"minimum_polygon_circumference": {
"value": "0.1"
},
- "meshfix_maximum_resolution": {
- "value": "0.005"
+ "meshfix_maximum_deviation": {
+ "value": "0.003"
},
"skin_outline_count": {
"value": 0
@@ -251,10 +248,6 @@
"expand_skins_expand_distance": {
"value": "( wall_line_width_0 + (wall_line_count - 1) * wall_line_width_x ) / 2"
},
- "max_feedrate_z_override": {
- "value": 0,
- "enabled": false
- },
"flow_rate_max_extrusion_offset": {
"enabled": false
},
diff --git a/resources/definitions/printrbot_play.def.json b/resources/definitions/printrbot_play.def.json
index e3a18a4eee..b8879e825c 100644
--- a/resources/definitions/printrbot_play.def.json
+++ b/resources/definitions/printrbot_play.def.json
@@ -27,7 +27,7 @@
"retraction_speed": { "default_value": 45},
"adhesion_type": { "default_value": "skirt" },
"machine_head_with_fans_polygon": { "default_value": [[-32,999],[37,999],[37,-32],[-32,-32]] },
- "gantry_height": { "default_value": 55 },
+ "gantry_height": { "value": "55" },
"speed_print": { "default_value": 50 },
"speed_travel": { "default_value": 55 },
"machine_max_feedrate_x": {"default_value": 125},
diff --git a/resources/definitions/printrbot_simple.def.json b/resources/definitions/printrbot_simple.def.json
index fb65b77fa5..760ff383d1 100644
--- a/resources/definitions/printrbot_simple.def.json
+++ b/resources/definitions/printrbot_simple.def.json
@@ -5,7 +5,7 @@
"metadata": {
"visible": true,
"author": "Calvindog717",
- "manufacturer": "PrintrBot",
+ "manufacturer": "Printrbot",
"platform": "printrbot_simple_metal_platform.stl",
"platform_offset": [0, -3.45, 0],
"file_formats": "text/x-gcode",
@@ -30,7 +30,6 @@
[55, -99999]
]
},
- "gantry_height": { "default_value": 99999 },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
diff --git a/resources/definitions/printrbot_simple_extended.def.json b/resources/definitions/printrbot_simple_extended.def.json
index 1e004a8ca3..06c639f024 100644
--- a/resources/definitions/printrbot_simple_extended.def.json
+++ b/resources/definitions/printrbot_simple_extended.def.json
@@ -5,7 +5,7 @@
"metadata": {
"visible": true,
"author": "samsector",
- "manufacturer": "PrintrBot",
+ "manufacturer": "Printrbot",
"platform": "printrbot_simple_metal_upgrade.stl",
"platform_offset": [0, -0.3, 0],
"file_formats": "text/x-gcode",
@@ -30,7 +30,7 @@
[ -49, -20 ]
]
},
- "gantry_height": { "default_value": 99999 },
+ "gantry_height": { "value": "99999" },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
diff --git a/resources/definitions/printrbot_simple_makers_kit.def.json b/resources/definitions/printrbot_simple_makers_kit.def.json
index ad6ecee21e..1223f2a4d9 100644
--- a/resources/definitions/printrbot_simple_makers_kit.def.json
+++ b/resources/definitions/printrbot_simple_makers_kit.def.json
@@ -27,7 +27,7 @@
[60, -10]
]
},
- "gantry_height": { "default_value": 1000 },
+ "gantry_height": { "value": "1000" },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_start_gcode": {
diff --git a/resources/definitions/prusa_i3.def.json b/resources/definitions/prusa_i3.def.json
index 1f0eb37aec..581de6fd98 100644
--- a/resources/definitions/prusa_i3.def.json
+++ b/resources/definitions/prusa_i3.def.json
@@ -5,7 +5,7 @@
"metadata": {
"visible": true,
"author": "Quillford",
- "manufacturer": "Prusajr",
+ "manufacturer": "Prusa3D",
"file_formats": "text/x-gcode",
"platform": "prusai3_platform.stl",
"machine_extruder_trains":
@@ -48,7 +48,7 @@
]
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/prusa_i3_mk2.def.json b/resources/definitions/prusa_i3_mk2.def.json
index 5c5583b56f..ff6f4469e7 100644
--- a/resources/definitions/prusa_i3_mk2.def.json
+++ b/resources/definitions/prusa_i3_mk2.def.json
@@ -5,7 +5,7 @@
"metadata": {
"visible": true,
"author": "Apsu, Nounours2099",
- "manufacturer": "Prusa Research",
+ "manufacturer": "Prusa3D",
"file_formats": "text/x-gcode",
"platform": "prusai3_platform.stl",
"has_materials": true,
@@ -31,7 +31,7 @@
"retraction_prime_speed": { "default_value": 35 },
"adhesion_type": { "default_value": "skirt" },
"machine_head_with_fans_polygon": { "default_value": [[-31,31],[34,31],[34,-40],[-31,-40]] },
- "gantry_height": { "default_value": 28 },
+ "gantry_height": { "value": "28" },
"machine_max_feedrate_z": { "default_value": 12 },
"machine_max_feedrate_e": { "default_value": 120 },
"machine_max_acceleration_z": { "default_value": 500 },
diff --git a/resources/definitions/prusa_i3_xl.def.json b/resources/definitions/prusa_i3_xl.def.json
index 9931be5c72..b9628b9430 100644
--- a/resources/definitions/prusa_i3_xl.def.json
+++ b/resources/definitions/prusa_i3_xl.def.json
@@ -5,7 +5,7 @@
"metadata": {
"visible": true,
"author": "guigashm",
- "manufacturer": "Prusajr",
+ "manufacturer": "Prusa3D",
"file_formats": "text/x-gcode",
"platform": "prusai3_xl_platform.stl",
"machine_extruder_trains":
@@ -40,7 +40,7 @@
]
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/raise3D_N2_dual.def.json b/resources/definitions/raise3D_N2_dual.def.json
index f4600bc027..1994cc2bcb 100644
--- a/resources/definitions/raise3D_N2_dual.def.json
+++ b/resources/definitions/raise3D_N2_dual.def.json
@@ -58,7 +58,7 @@
"default_value": "skirt"
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_use_extruder_offset_to_offset_coords": {
"default_value": true
diff --git a/resources/definitions/raise3D_N2_plus_dual.def.json b/resources/definitions/raise3D_N2_plus_dual.def.json
index 010c8cfa73..23ad1fbd09 100644
--- a/resources/definitions/raise3D_N2_plus_dual.def.json
+++ b/resources/definitions/raise3D_N2_plus_dual.def.json
@@ -58,7 +58,7 @@
"default_value": "skirt"
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_use_extruder_offset_to_offset_coords": {
"default_value": true
diff --git a/resources/definitions/raise3D_N2_plus_single.def.json b/resources/definitions/raise3D_N2_plus_single.def.json
index dd2162f5a9..f8a1a7e0fb 100644
--- a/resources/definitions/raise3D_N2_plus_single.def.json
+++ b/resources/definitions/raise3D_N2_plus_single.def.json
@@ -57,7 +57,7 @@
"default_value": "skirt"
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_use_extruder_offset_to_offset_coords": {
"default_value": true
diff --git a/resources/definitions/raise3D_N2_single.def.json b/resources/definitions/raise3D_N2_single.def.json
index e549b97b3b..c69823466b 100644
--- a/resources/definitions/raise3D_N2_single.def.json
+++ b/resources/definitions/raise3D_N2_single.def.json
@@ -57,7 +57,7 @@
"default_value": "skirt"
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_use_extruder_offset_to_offset_coords": {
"default_value": true
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/rigid3d_zero2.def.json b/resources/definitions/rigid3d_zero2.def.json
index 09390ed8b5..f24c869636 100644
--- a/resources/definitions/rigid3d_zero2.def.json
+++ b/resources/definitions/rigid3d_zero2.def.json
@@ -81,7 +81,7 @@
"default_value": false
},
"gantry_height": {
- "default_value": 25
+ "value": "25"
},
"machine_gcode_flavor": {
"default_value": "RepRap"
diff --git a/resources/definitions/rigidbot.def.json b/resources/definitions/rigidbot.def.json
index 5eb346c7ca..c04cd7c5e6 100644
--- a/resources/definitions/rigidbot.def.json
+++ b/resources/definitions/rigidbot.def.json
@@ -29,7 +29,7 @@
"default_value": true
},
"gantry_height": {
- "default_value": 0
+ "value": "0"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/rigidbot_big.def.json b/resources/definitions/rigidbot_big.def.json
index 581b6144a0..c97c6df9f3 100644
--- a/resources/definitions/rigidbot_big.def.json
+++ b/resources/definitions/rigidbot_big.def.json
@@ -29,7 +29,7 @@
"default_value": true
},
"gantry_height": {
- "default_value": 0
+ "value": "0"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/stereotech_start.def.json b/resources/definitions/stereotech_start.def.json
new file mode 100644
index 0000000000..e85893d811
--- /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": "Stereotech LLC.",
+ "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..3eb114324b
--- /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": {
+ "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/strateo3d.def.json b/resources/definitions/strateo3d.def.json
new file mode 100644
index 0000000000..a3710fb9af
--- /dev/null
+++ b/resources/definitions/strateo3d.def.json
@@ -0,0 +1,137 @@
+{
+ "version": 2,
+ "name": "Strateo3D",
+ "inherits": "fdmprinter",
+ "metadata":
+ {
+ "author": "M.K",
+ "manufacturer": "eMotionTech",
+ "category": "Other",
+ "visible": true,
+ "file_formats": "text/x-gcode",
+ "has_machine_quality": true,
+ "has_materials": true,
+ "has_variants": true,
+ "preferred_variant_name": "Standard 0.6",
+ "preferred_material": "emotiontech_pla",
+ "preferred_quality_type": "e",
+ "variants_name": "Print Head",
+ "machine_extruder_trains":
+ {
+ "0": "strateo3d_right_extruder",
+ "1": "strateo3d_left_extruder"
+ }
+ },
+
+ "overrides":
+ {
+ "machine_name": { "default_value": "Strateo3D" },
+ "machine_width": { "default_value": 600 },
+ "machine_depth": { "default_value": 420 },
+ "machine_height": { "default_value": 495 },
+ "machine_heated_bed": { "default_value": true },
+ "machine_center_is_zero": { "default_value": false },
+ "machine_head_with_fans_polygon": { "default_value": [ [ -76, -51.8 ] , [ 25, -51.8 ] , [ 25, 38.2 ] , [ -76, 38.2 ] ] },
+ "gantry_height": { "default_value": 40 },
+ "machine_extruder_count": { "default_value": 2 },
+ "machine_gcode_flavor": { "default_value": "Marlin" },
+ "machine_start_gcode": { "default_value": "G28 \nG90 G1 X300 Y210 Z15 F6000 \nG92 E0" },
+ "machine_end_gcode": { "default_value": "T1 \nM104 S0 \nT0 \nM104 S0 \nM140 S0 \nM141 S0 \nG91 \nG0 E-1 F1500 \nG0 z1 \nG90 \nG28 \nM801.2 \nM801.0 \nM84" },
+ "extruder_prime_pos_y": {"minimum_value": "0", "maximum_value": "machine_depth"},
+ "extruder_prime_pos_x": {"minimum_value": "0", "maximum_value": "machine_width"},
+ "machine_heat_zone_length": { "default_value": 7 },
+ "default_material_print_temperature": { "maximum_value_warning": "350" },
+ "material_print_temperature": { "maximum_value_warning": "350" },
+ "material_print_temperature_layer_0": { "maximum_value_warning": "350" },
+ "material_bed_temperature": { "maximum_value": "130" },
+ "material_bed_temperature_layer_0": { "maximum_value": "130" },
+ "extruder_prime_pos_abs": { "default_value": true },
+ "machine_acceleration": { "default_value": 2000 },
+
+ "acceleration_enabled": { "value": false },
+ "acceleration_layer_0": { "value": "acceleration_topbottom" },
+ "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 1000 / 2000)" },
+ "acceleration_print": { "value": "2000" },
+ "acceleration_support": { "value": "acceleration_print" },
+ "acceleration_support_interface": { "value": "acceleration_topbottom" },
+ "acceleration_topbottom": { "value": "math.ceil(acceleration_print * 1000 / 2000)" },
+ "acceleration_wall": { "value": "math.ceil(acceleration_print * 1500 / 2000)" },
+ "acceleration_wall_0": { "value": "math.ceil(acceleration_wall * 1000 / 1500)" },
+ "adaptive_layer_height_variation": { "default_value": 0.1 },
+ "adaptive_layer_height_variation_step": { "default_value": 0.05 },
+ "adhesion_type": { "default_value": "skirt" },
+ "expand_skins_expand_distance": { "value": "wall_line_width_0 + wall_line_count * wall_line_width_x" },
+ "gradual_infill_step_height": { "value": "layer_height*10" },
+ "gradual_support_infill_step_height": { "value": "layer_height*7" },
+ "infill_before_walls": { "default_value": false },
+ "infill_overlap": { "value": "0" },
+ "infill_wipe_dist": { "value": "0" },
+ "jerk_enabled": { "value": "False" },
+ "jerk_layer_0": { "value": "jerk_topbottom" },
+ "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" },
+ "jerk_print": { "value": "25" },
+ "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" },
+ "jerk_support_interface": { "value": "jerk_topbottom" },
+ "jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" },
+ "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" },
+ "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" },
+ "layer_start_x": { "value": "sum(extruderValues('machine_extruder_start_pos_x')) / len(extruderValues('machine_extruder_start_pos_x'))" },
+ "layer_start_y": { "value": "sum(extruderValues('machine_extruder_start_pos_y')) / len(extruderValues('machine_extruder_start_pos_y'))" },
+ "machine_min_cool_heat_time_window": { "value": "15" },
+ "machine_nozzle_cool_down_speed": { "default_value": 0.50 },
+ "machine_nozzle_heat_up_speed": { "default_value": 2.25 },
+ "material_final_print_temperature": { "value": "material_print_temperature - 10" },
+ "material_flow": { "default_value": 93 },
+ "material_flow_layer_0": { "value": "math.ceil(material_flow*1)" },
+ "material_initial_print_temperature": { "value": "material_print_temperature - 5" },
+ "meshfix_maximum_resolution": { "value": "0.03" },
+ "optimize_wall_printing_order": { "value": "True" },
+ "prime_blob_enable": { "enabled": false, "default_value": false },
+ "prime_tower_min_volume": { "default_value": 35 },
+ "prime_tower_position_x": { "value": "machine_width/2 - 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')) * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0) - 1" },
+ "prime_tower_position_y": { "value": "machine_depth - prime_tower_size - 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')) * extruderValue(adhesion_extruder_nr, 'initial_layer_line_width_factor') / 100 - (resolveOrValue('draft_shield_dist') if resolveOrValue('draft_shield_enabled') else 0) - 1" },
+ "retraction_amount": { "default_value": 1.5 },
+ "retraction_combing": { "default_value": "all" },
+ "retraction_combing_max_distance": { "default_value": 5 },
+ "retraction_count_max": { "default_value": 15 },
+ "retraction_hop": { "value": "2" },
+ "retraction_hop_enabled": { "value": "extruders_enabled_count > 1" },
+ "retraction_hop_only_when_collides": { "value": "True" },
+ "retraction_min_travel": { "value": "3*line_width" },
+ "retraction_prime_speed": { "value": "retraction_speed-10" },
+ "retraction_speed": { "default_value": 25 },
+ "skin_overlap": { "value": "10" },
+ "skirt_brim_minimal_length": { "default_value": 333 },
+ "speed_layer_0": { "value": "20" },
+ "speed_travel_layer_0": { "value": "100" },
+ "speed_prime_tower": { "value": "speed_topbottom" },
+ "speed_print": { "value": "50" },
+ "speed_support": { "value": "speed_wall" },
+ "speed_support_interface": { "value": "speed_topbottom" },
+ "speed_topbottom": { "value": "math.ceil(speed_print * 20/35)" },
+ "speed_travel": { "value": "150" },
+ "speed_wall": { "value": "math.ceil(speed_print * 3/4)" },
+ "speed_wall_0": { "value": "math.ceil(speed_wall * 2/3)" },
+ "speed_wall_x": { "value": "speed_wall" },
+ "support_angle": { "value": "50" },
+ "support_bottom_distance": {"value": "extruderValue(support_bottom_extruder_nr if support_bottom_enable else support_infill_extruder_nr, 'support_z_distance/2') if support_type == 'everywhere' else 0", "maximum_value_warning": "machine_nozzle_size*1.5" },
+ "support_interface_enable": { "default_value": true },
+ "support_interface_height": { "value": "layer_height*3" },
+ "support_interface_offset": { "value": "support_offset" },
+ "support_top_distance": {"value": "extruderValue(support_roof_extruder_nr if support_roof_enable else support_infill_extruder_nr, 'support_z_distance')", "maximum_value_warning": "machine_nozzle_size*1.5" },
+ "support_use_towers": { "default_value": true },
+ "support_xy_distance": { "value": "line_width * 1.7" },
+ "support_xy_distance_overhang": { "value": "wall_line_width_0" },
+ "support_z_distance": { "value": "layer_height*2", "maximum_value_warning": "machine_nozzle_size*1.5" },
+ "switch_extruder_prime_speed": { "value": "retraction_prime_speed" },
+ "switch_extruder_retraction_amount": { "value": "7" },
+ "switch_extruder_retraction_speeds": {"value": "retraction_retract_speed"},
+ "top_bottom_thickness": { "value": "3*layer_height", "minimum_value_warning": "layer_height*2" },
+ "top_thickness": { "value": "top_bottom_thickness" },
+ "top_layers": { "value": "0 if infill_sparse_density == 100 else math.ceil(round(top_thickness / resolveOrValue('layer_height'), 4))"},
+ "bottom_thickness": { "value": "top_bottom_thickness-2*layer_height+layer_height_0" },
+ "bottom_layers": { "value": "999999 if infill_sparse_density == 100 else math.ceil(round(((bottom_thickness-resolveOrValue('layer_height_0')) / resolveOrValue('layer_height'))+1, 4))"},
+ "travel_avoid_distance": { "value": "3 if extruders_enabled_count > 1 else machine_nozzle_tip_outer_diameter / 2 * 1.5" },
+ "wall_thickness": { "value": "wall_line_width_0 + wall_line_width_x" }
+ }
+}
\ 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
index 2875b949be..a7f4b7e549 100644
--- a/resources/definitions/structur3d_discov3ry1_complete_um2plus.def.json
+++ b/resources/definitions/structur3d_discov3ry1_complete_um2plus.def.json
@@ -1,12 +1,11 @@
{
"version": 2,
- "name": "Discov3ry Complete (Ultimaker 2+)",
+ "name": "Discov3ry Complete",
"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",
@@ -15,9 +14,7 @@
"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": [],
@@ -77,7 +74,7 @@
"default_value": true
},
"gantry_height": {
- "default_value": 52
+ "value": "52"
},
"machine_nozzle_head_distance": {
"default_value": 5
diff --git a/resources/definitions/tam.def.json b/resources/definitions/tam.def.json
index 0ed8d657a2..67a4bb8eab 100644
--- a/resources/definitions/tam.def.json
+++ b/resources/definitions/tam.def.json
@@ -1,6 +1,6 @@
{
"version": 2,
- "name": "Type A Machines Series 1 2014",
+ "name": "Series 1 2014",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
@@ -32,8 +32,8 @@
"machine_heated_bed": { "default_value": true },
"machine_head_with_fans_polygon": { "default_value": [ [ -35, 65 ], [ -35, -55 ], [ 55, 65 ], [ 55, -55 ] ] },
- "gantry_height": { "default_value": 35 },
- "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
+ "gantry_height": { "value": "35" },
+ "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_center_is_zero": { "default_value": false },
"speed_print": { "default_value": 60 },
diff --git a/resources/definitions/tevo_blackwidow.def.json b/resources/definitions/tevo_blackwidow.def.json
index 25e7a2620d..9e450067fb 100644
--- a/resources/definitions/tevo_blackwidow.def.json
+++ b/resources/definitions/tevo_blackwidow.def.json
@@ -44,7 +44,7 @@
},
"gantry_height":
{
- "default_value": 0
+ "value": "0"
},
"machine_gcode_flavor":
{
diff --git a/resources/definitions/tevo_tarantula.def.json b/resources/definitions/tevo_tarantula.def.json
index ec4ae667d5..038cc3a318 100644
--- a/resources/definitions/tevo_tarantula.def.json
+++ b/resources/definitions/tevo_tarantula.def.json
@@ -33,7 +33,7 @@
[18, -18]
]
},
- "gantry_height": { "default_value": 55 },
+ "gantry_height": { "value": "55" },
"machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
"machine_acceleration": { "default_value": 2650 },
"machine_max_jerk_xy": { "default_value": 15.0 },
diff --git a/resources/definitions/tevo_tornado.def.json b/resources/definitions/tevo_tornado.def.json
index 9110e4ba4d..67f25ec9d8 100644
--- a/resources/definitions/tevo_tornado.def.json
+++ b/resources/definitions/tevo_tornado.def.json
@@ -13,7 +13,7 @@
}
},
"overrides": {
- "machine_name": {
+ "machine_name": {
"default_value": "Tevo Tornado"
},
"machine_width": {
@@ -25,8 +25,8 @@
"machine_depth": {
"default_value": 300
},
- "machine_center_is_zero": {
- "default_value": false
+ "machine_center_is_zero": {
+ "default_value": false
},
"machine_head_polygon": {
"default_value": [
@@ -70,21 +70,39 @@
"default_value": true
},
"gantry_height": {
- "default_value": 30
+ "value": "30"
},
"acceleration_enabled": {
- "default_value": false
+ "default_value": true
},
- "machine_acceleration": {
- "default_value": 1500
+ "acceleration_print": {
+ "default_value": 500
+ },
+ "acceleration_travel": {
+ "value": 500
+ },
+ "acceleration_travel_layer_0": {
+ "value": 500
+ },
+ "machine_acceleration": {
+ "default_value": 1500
},
"jerk_enabled": {
- "default_value": false
+ "default_value": true
},
- "machine_max_jerk_xy": {
- "default_value": 6
+ "jerk_print": {
+ "default_value": 8
},
- "machine_gcode_flavor": {
+ "jerk_travel": {
+ "value": 8
+ },
+ "jerk_travel_layer_0": {
+ "value": 8
+ },
+ "machine_max_jerk_xy": {
+ "default_value": 6
+ },
+ "machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
},
"machine_start_gcode": {
diff --git a/resources/definitions/tizyx_evy.def.json b/resources/definitions/tizyx_evy.def.json
index a0bf5d76be..f92f679677 100644
--- a/resources/definitions/tizyx_evy.def.json
+++ b/resources/definitions/tizyx_evy.def.json
@@ -10,7 +10,6 @@
"has_machine_quality": true,
"has_materials": true,
- "has_machine_materials": true,
"has_variants": true,
"preferred_variant_name": "0.4mm",
@@ -32,7 +31,7 @@
"machine_extruder_count": { "default_value": 1 },
"machine_heated_bed": { "default_value": true },
"machine_center_is_zero": { "default_value": false },
- "gantry_height": { "default_value": 500 },
+ "gantry_height": { "value": "500" },
"machine_height": { "default_value": 255 },
"machine_depth": { "default_value": 255 },
"machine_width": { "default_value": 255 },
@@ -69,6 +68,13 @@
"machine_end_gcode":
{
"default_value": "M104 S0\nM140 S0\nG91\nG1 E-5 F300\nG1 Z+3 F3000\nG1 Y245 F3000\nM84"
- }
+ },
+
+ "acceleration_enabled": {"value": "False"},
+ "acceleration_print": {"value": "1500"},
+ "z_seam_type": {"default_value": "back"},
+ "z_seam_x": {"value": "127.5"},
+ "z_seam_y": {"value": "250"},
+ "retraction_combing": {"default_value": "off"}
}
}
diff --git a/resources/definitions/tizyx_evy_dual.def.json b/resources/definitions/tizyx_evy_dual.def.json
index 2e5ed8b126..e06894139e 100644
--- a/resources/definitions/tizyx_evy_dual.def.json
+++ b/resources/definitions/tizyx_evy_dual.def.json
@@ -10,7 +10,6 @@
"has_machine_quality": true,
"has_materials": true,
- "has_machine_materials": true,
"has_variants": true,
"preferred_variant_name": "Classic Extruder",
@@ -33,7 +32,7 @@
"machine_extruder_count": { "default_value": 2 },
"machine_heated_bed": { "default_value": true },
"machine_center_is_zero": { "default_value": false },
- "gantry_height": { "default_value": 500 },
+ "gantry_height": { "value": "500" },
"machine_height": { "default_value": 255 },
"machine_depth": { "default_value": 255 },
"machine_width": { "default_value": 255 },
@@ -52,6 +51,13 @@
"machine_end_gcode":
{
"default_value": "M104 S0\nM140 S0\nG91\nG1 E-5 F300\nG1 Z+3 F3000\nG1 Y245 F3000\nM84"
- }
+ },
+
+ "acceleration_enabled": {"value": "False"},
+ "acceleration_print": {"value": "1500"},
+ "z_seam_type": {"default_value": "back"},
+ "z_seam_x": {"value": "127.5"},
+ "z_seam_y": {"value": "250"},
+ "retraction_combing": {"default_value": "off"}
}
}
diff --git a/resources/definitions/tizyx_k25.def.json b/resources/definitions/tizyx_k25.def.json
index c076b214c7..32fa9b331d 100644
--- a/resources/definitions/tizyx_k25.def.json
+++ b/resources/definitions/tizyx_k25.def.json
@@ -1,52 +1,60 @@
-{
- "version": 2,
- "name": "TiZYX K25",
- "inherits": "fdmprinter",
- "metadata":
- {
- "visible": true,
- "author": "TiZYX",
- "manufacturer": "TiZYX",
- "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", "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,
- "has_variants": true,
- "preferred_variant_name": "0.4 mm",
- "machine_extruder_trains":
- {
- "0": "tizyx_k25_extruder_0"
- }
- },
-
- "overrides":
- {
- "machine_name": { "default_value": "TiZYX K25" },
- "machine_heated_bed": { "default_value": true },
- "machine_width": { "default_value": 255 },
- "machine_height": { "default_value": 255 },
- "machine_depth": { "default_value": 255 },
- "machine_center_is_zero": { "default_value": false },
- "gantry_height": { "default_value": 500 },
- "machine_head_with_fans_polygon": {
- "default_value": [
- [25, 49],
- [25, -49],
- [-25, -49],
- [25, 49]
- ]
- },
- "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
- "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"
- }
- }
-}
+{
+ "version": 2,
+ "name": "TiZYX K25",
+ "inherits": "fdmprinter",
+ "metadata":
+ {
+ "visible": true,
+ "author": "TiZYX",
+ "manufacturer": "TiZYX",
+ "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", "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,
+ "has_variants": true,
+ "preferred_variant_name": "0.4 mm",
+ "machine_extruder_trains":
+ {
+ "0": "tizyx_k25_extruder_0"
+ }
+ },
+
+ "overrides":
+ {
+ "machine_name": { "default_value": "TiZYX K25" },
+ "machine_heated_bed": { "default_value": true },
+ "machine_width": { "default_value": 255 },
+ "machine_height": { "default_value": 255 },
+ "machine_depth": { "default_value": 255 },
+ "machine_center_is_zero": { "default_value": false },
+ "gantry_height": { "value": "500" },
+ "machine_head_with_fans_polygon": {
+ "default_value": [
+ [25, 49],
+ [25, -49],
+ [-25, -49],
+ [25, 49]
+ ]
+ },
+ "machine_gcode_flavor": { "default_value": "RepRap (Marlin/Sprinter)" },
+ "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"
+ },
+
+
+ "acceleration_enabled": {"value": "False"},
+ "acceleration_print": {"value": "1500"},
+ "z_seam_type": {"default_value": "back"},
+ "z_seam_x": {"value": "127.5"},
+ "z_seam_y": {"value": "250"},
+ "retraction_combing": {"default_value": "off"}
+ }
+}
diff --git a/resources/definitions/ubuild-3d_mr_bot_280.def.json b/resources/definitions/ubuild-3d_mr_bot_280.def.json
index 7eb65c3e78..060752387b 100644
--- a/resources/definitions/ubuild-3d_mr_bot_280.def.json
+++ b/resources/definitions/ubuild-3d_mr_bot_280.def.json
@@ -34,7 +34,7 @@
"machine_nozzle_heat_up_speed": { "default_value": 2 },
"machine_nozzle_cool_down_speed": { "default_value": 2 },
"machine_head_with_fans_polygon": { "default_value": [[-20,20],[10,10],[10,10],[10,10]] },
- "gantry_height": { "default_value": 275 },
+ "gantry_height": { "value": "275" },
"machine_max_feedrate_z": { "default_value": 15 },
"machine_max_feedrate_e": { "default_value": 60 },
"machine_max_acceleration_z": { "default_value": 1000 },
diff --git a/resources/definitions/ultimaker2.def.json b/resources/definitions/ultimaker2.def.json
index 4cc291ff45..285f5bed08 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":
@@ -56,7 +55,7 @@
"default_value": false
},
"gantry_height": {
- "default_value": 48
+ "value": "48"
},
"machine_use_extruder_offset_to_offset_coords": {
"default_value": true
diff --git a/resources/definitions/ultimaker2_plus.def.json b/resources/definitions/ultimaker2_plus.def.json
index 28fd2b71f9..65ee8f063b 100644
--- a/resources/definitions/ultimaker2_plus.def.json
+++ b/resources/definitions/ultimaker2_plus.def.json
@@ -12,8 +12,8 @@
"preferred_variant_name": "0.4 mm",
"has_variants": true,
"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":
@@ -50,7 +50,7 @@
"default_value": true
},
"gantry_height": {
- "default_value": 52
+ "value": "52"
},
"machine_nozzle_head_distance": {
"default_value": 5
diff --git a/resources/definitions/ultimaker3.def.json b/resources/definitions/ultimaker3.def.json
index 6e01390703..b34ff3bdba 100644
--- a/resources/definitions/ultimaker3.def.json
+++ b/resources/definitions/ultimaker3.def.json
@@ -12,8 +12,8 @@
"platform_offset": [0, 0, 0],
"has_machine_quality": true,
"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,14 +25,18 @@
"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/releases/firmware/9066/stable/um-update.swu.version"
+ "https://software.ultimaker.com/releases/firmware/9066/stable/um-update.swu.version"
],
"update_url": "https://ultimaker.com/firmware"
- }
+ },
+ "bom_numbers": [
+ 9066
+ ]
},
@@ -61,7 +65,7 @@
"machine_max_feedrate_y": { "default_value": 300 },
"machine_max_feedrate_z": { "default_value": 40 },
"machine_acceleration": { "default_value": 3000 },
- "gantry_height": { "default_value": 60 },
+ "gantry_height": { "value": "60" },
"machine_disallowed_areas": { "default_value": [
[[92.8, -53.4], [92.8, -97.5], [116.5, -97.5], [116.5, -53.4]],
[[73.8, 107.5], [73.8, 100.5], [116.5, 100.5], [116.5, 107.5]],
@@ -77,7 +81,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, "default_value": true },
+ "prime_blob_enable": { "enabled": true, "default_value": true, "value": "resolveOrValue('print_sequence') != 'one_at_a_time'" },
"acceleration_enabled": { "value": "True" },
"acceleration_layer_0": { "value": "acceleration_topbottom" },
@@ -117,7 +121,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..ba9824896f 100644
--- a/resources/definitions/ultimaker3_extended.def.json
+++ b/resources/definitions/ultimaker3_extended.def.json
@@ -12,7 +12,6 @@
"platform_texture": "Ultimaker3Extendedbackplate.png",
"platform_offset": [0, 0, 0],
"has_machine_quality": true,
- "has_machine_materials": true,
"has_materials": true,
"has_variants": true,
"preferred_variant_name": "AA 0.4",
@@ -28,11 +27,13 @@
"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"
+ "https://software.ultimaker.com/releases/firmware/9066/stable/um-update.swu.version"
],
"update_url": "https://ultimaker.com/firmware"
- }
+ },
+ "bom_numbers": [
+ 9511
+ ]
},
"overrides": {
diff --git a/resources/definitions/ultimaker_original.def.json b/resources/definitions/ultimaker_original.def.json
index 6a978c47cb..71130312e7 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"
@@ -46,7 +46,7 @@
]
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_use_extruder_offset_to_offset_coords": {
"default_value": true
diff --git a/resources/definitions/ultimaker_original_dual.def.json b/resources/definitions/ultimaker_original_dual.def.json
index 999650aa28..fd9b91e238 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": {
@@ -48,7 +48,7 @@
]
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_use_extruder_offset_to_offset_coords": {
"default_value": true
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_s3.def.json b/resources/definitions/ultimaker_s3.def.json
new file mode 100644
index 0000000000..f7f3a038fe
--- /dev/null
+++ b/resources/definitions/ultimaker_s3.def.json
@@ -0,0 +1,168 @@
+{
+ "id": "ultimaker_s3",
+ "version": 2,
+ "name": "Ultimaker S3",
+ "inherits": "ultimaker",
+ "metadata": {
+ "author": "Ultimaker",
+ "manufacturer": "Ultimaker B.V.",
+ "category": "Ultimaker",
+ "visible": true,
+ "file_formats": "application/x-ufp;text/x-gcode",
+ "platform": "ultimaker_s3_platform.obj",
+ "platform_texture": "UltimakerS3backplate.png",
+ "platform_offset": [0, 0, 0],
+ "has_machine_quality": true,
+ "has_materials": true,
+ "has_variant_buildplates": false,
+ "has_variants": true,
+ "exclude_materials": [ "generic_hips", "generic_petg", "structur3d_dap100silicone" ],
+ "preferred_variant_name": "AA 0.4",
+ "preferred_quality_type": "normal",
+ "variants_name": "Print core",
+ "nozzle_offsetting_for_disallowed_areas": false,
+ "machine_extruder_trains":
+ {
+ "0": "ultimaker_s3_extruder_left",
+ "1": "ultimaker_s3_extruder_right"
+ },
+ "first_start_actions": [ "DiscoverUM3Action" ],
+ "supported_actions": [ "DiscoverUM3Action" ],
+ "supports_usb_connection": false,
+ "weight": -1,
+ "firmware_update_info": {
+ "id": 213482,
+ "check_urls": ["https://software.ultimaker.com/releases/firmware/213482/stable/um-update.swu.version"],
+ "update_url": "https://ultimaker.com/firmware"
+ },
+ "bom_numbers": [
+ 213482
+ ]
+ },
+
+ "overrides": {
+ "machine_name": { "default_value": "Ultimaker S3" },
+ "machine_width": { "default_value": 230 },
+ "machine_depth": { "default_value": 190 },
+ "machine_height": { "default_value": 200 },
+ "machine_heated_bed": { "default_value": true },
+ "machine_nozzle_heat_up_speed": { "default_value": 1.4 },
+ "machine_nozzle_cool_down_speed": { "default_value": 0.8 },
+ "machine_head_with_fans_polygon":
+ {
+ "default_value":
+ [
+ [ -41.4, -45.8 ],
+ [ -41.4, 36.0 ],
+ [ 63.3, 36.0 ],
+ [ 63.3, -45.8 ]
+ ]
+ },
+ "machine_gcode_flavor": { "default_value": "Griffin" },
+ "machine_max_feedrate_x": { "default_value": 300 },
+ "machine_max_feedrate_y": { "default_value": 300 },
+ "machine_max_feedrate_z": { "default_value": 40 },
+ "machine_acceleration": { "default_value": 3000 },
+ "gantry_height": { "value": "60" },
+ "machine_extruder_count": { "default_value": 2 },
+ "extruder_prime_pos_abs": { "default_value": true },
+ "machine_start_gcode": { "default_value": "" },
+ "machine_end_gcode": { "default_value": "" },
+ "prime_tower_position_x": { "default_value": 345 },
+ "prime_tower_position_y": { "default_value": 222.5 },
+ "prime_blob_enable": { "enabled": true, "default_value": false },
+
+ "speed_travel":
+ {
+ "maximum_value": "150",
+ "value": "150"
+ },
+
+ "acceleration_enabled": { "value": "True" },
+ "acceleration_layer_0": { "value": "acceleration_topbottom" },
+ "acceleration_prime_tower": { "value": "math.ceil(acceleration_print * 2000 / 4000)" },
+ "acceleration_print": { "value": "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)" },
+ "brim_width": { "value": "3" },
+ "cool_fan_full_at_height": { "value": "layer_height_0 + 4 * layer_height" },
+ "cool_fan_speed": { "value": "50" },
+ "cool_fan_speed_max": { "value": "100" },
+ "cool_min_speed": { "value": "5" },
+ "infill_line_width": { "value": "round(line_width * 0.5 / 0.35, 2)" },
+ "infill_overlap": { "value": "0" },
+ "infill_pattern": { "value": "'triangles'" },
+ "infill_wipe_dist": { "value": "0" },
+ "jerk_enabled": { "value": "True" },
+ "jerk_layer_0": { "value": "jerk_topbottom" },
+ "jerk_prime_tower": { "value": "math.ceil(jerk_print * 15 / 25)" },
+ "jerk_print": { "value": "25" },
+ "jerk_support": { "value": "math.ceil(jerk_print * 15 / 25)" },
+ "jerk_support_interface": { "value": "jerk_topbottom" },
+ "jerk_topbottom": { "value": "math.ceil(jerk_print * 5 / 25)" },
+ "jerk_wall": { "value": "math.ceil(jerk_print * 10 / 25)" },
+ "jerk_wall_0": { "value": "math.ceil(jerk_wall * 5 / 10)" },
+ "layer_height_0": { "value": "round(machine_nozzle_size / 1.5, 2)" },
+ "layer_start_x": { "value": "sum(extruderValues('machine_extruder_start_pos_x')) / len(extruderValues('machine_extruder_start_pos_x'))" },
+ "layer_start_y": { "value": "sum(extruderValues('machine_extruder_start_pos_y')) / len(extruderValues('machine_extruder_start_pos_y'))" },
+ "line_width": { "value": "machine_nozzle_size * 0.875" },
+ "machine_min_cool_heat_time_window": { "value": "15" },
+ "default_material_print_temperature": { "value": "200" },
+ "material_standby_temperature": { "value": "100" },
+ "multiple_mesh_overlap": { "value": "0" },
+ "prime_tower_enable": { "value": "True" },
+ "raft_airgap": { "value": "0" },
+ "raft_base_speed": { "value": "20" },
+ "raft_base_thickness": { "value": "0.3" },
+ "raft_interface_line_spacing": { "value": "0.5" },
+ "raft_interface_line_width": { "value": "0.5" },
+ "raft_interface_speed": { "value": "20" },
+ "raft_interface_thickness": { "value": "0.2" },
+ "raft_jerk": { "value": "jerk_layer_0" },
+ "raft_margin": { "value": "10" },
+ "raft_speed": { "value": "25" },
+ "raft_surface_layers": { "value": "1" },
+ "retraction_amount": { "value": "6.5" },
+ "retraction_count_max": { "value": "10" },
+ "retraction_extrusion_window": { "value": "1" },
+ "retraction_hop": { "value": "2" },
+ "retraction_hop_enabled": { "value": "extruders_enabled_count > 1" },
+ "retraction_hop_only_when_collides": { "value": "True" },
+ "retraction_min_travel": { "value": "5" },
+ "retraction_prime_speed": { "value": "15" },
+ "skin_overlap": { "value": "10" },
+ "speed_equalize_flow_enabled": { "value": "True" },
+ "speed_layer_0": { "value": "20" },
+ "speed_prime_tower": { "value": "speed_topbottom" },
+ "speed_print": { "value": "35" },
+ "speed_support": { "value": "speed_wall_0" },
+ "speed_support_interface": { "value": "speed_topbottom" },
+ "speed_topbottom": { "value": "math.ceil(speed_print * 20 / 35)" },
+ "speed_wall": { "value": "math.ceil(speed_print * 30 / 35)" },
+ "speed_wall_0": { "value": "math.ceil(speed_wall * 20 / 30)" },
+ "speed_wall_x": { "value": "speed_wall" },
+ "support_angle": { "value": "45" },
+ "support_pattern": { "value": "'triangles'" },
+ "support_use_towers": { "value": "False" },
+ "support_xy_distance": { "value": "wall_line_width_0 * 2.5" },
+ "support_xy_distance_overhang": { "value": "wall_line_width_0" },
+ "support_z_distance": { "value": "0" },
+ "switch_extruder_prime_speed": { "value": "15" },
+ "switch_extruder_retraction_amount": { "value": "8" },
+ "top_bottom_thickness": { "value": "1" },
+ "travel_avoid_supports": { "value": "True" },
+ "travel_avoid_distance": { "value": "3 if extruders_enabled_count > 1 else machine_nozzle_tip_outer_diameter / 2 * 1.5" },
+ "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": "(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" },
+ "zig_zaggify_infill": { "value": "gradual_infill_steps == 0" }
+ }
+}
diff --git a/resources/definitions/ultimaker_s5.def.json b/resources/definitions/ultimaker_s5.def.json
index 3f24673e6d..fef8c87c27 100644
--- a/resources/definitions/ultimaker_s5.def.json
+++ b/resources/definitions/ultimaker_s5.def.json
@@ -14,7 +14,6 @@
"platform_offset": [0, -30, -10],
"has_machine_quality": true,
"has_materials": true,
- "has_machine_materials": true,
"has_variant_buildplates": true,
"has_variants": true,
"preferred_variant_name": "AA 0.4",
@@ -30,12 +29,16 @@
"first_start_actions": [ "DiscoverUM3Action" ],
"supported_actions": [ "DiscoverUM3Action" ],
"supports_usb_connection": false,
- "weight": -1,
+ "supports_network_connection": true,
+ "weight": -2,
"firmware_update_info": {
"id": 9051,
- "check_urls": ["http://software.ultimaker.com/releases/firmware/9051/stable/um-update.swu.version"],
+ "check_urls": ["https://software.ultimaker.com/releases/firmware/9051/stable/um-update.swu.version"],
"update_url": "https://ultimaker.com/firmware"
- }
+ },
+ "bom_numbers": [
+ 9051, 214475
+ ]
},
"overrides": {
@@ -44,6 +47,7 @@
"machine_depth": { "default_value": 240 },
"machine_height": { "default_value": 300 },
"machine_heated_bed": { "default_value": true },
+ "machine_heated_build_volume": { "default_value": true },
"machine_nozzle_heat_up_speed": { "default_value": 1.4 },
"machine_nozzle_cool_down_speed": { "default_value": 0.8 },
"machine_head_with_fans_polygon":
@@ -61,7 +65,7 @@
"machine_max_feedrate_y": { "default_value": 300 },
"machine_max_feedrate_z": { "default_value": 40 },
"machine_acceleration": { "default_value": 3000 },
- "gantry_height": { "default_value": 60 },
+ "gantry_height": { "value": "60" },
"machine_extruder_count": { "default_value": 2 },
"extruder_prime_pos_abs": { "default_value": true },
"machine_start_gcode": { "default_value": "" },
@@ -156,10 +160,12 @@
"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" },
- "zig_zaggify_infill": { "value": "gradual_infill_steps == 0" }
+ "zig_zaggify_infill": { "value": "gradual_infill_steps == 0" },
+ "build_volume_temperature": { "maximum_value": 50 }
}
}
diff --git a/resources/definitions/uniqbot_one.def.json b/resources/definitions/uniqbot_one.def.json
index 5a33500b75..ec8336ae50 100644
--- a/resources/definitions/uniqbot_one.def.json
+++ b/resources/definitions/uniqbot_one.def.json
@@ -30,7 +30,7 @@
"default_value": false
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/vertex_delta_k8800.def.json b/resources/definitions/vertex_delta_k8800.def.json
index df24bd84fb..c92476da49 100644
--- a/resources/definitions/vertex_delta_k8800.def.json
+++ b/resources/definitions/vertex_delta_k8800.def.json
@@ -3,10 +3,10 @@
"version": 2,
"inherits": "fdmprinter",
"metadata": {
- "manufacturer": "Velleman nv",
+ "manufacturer": "Velleman N.V.",
"file_formats": "text/x-gcode",
"visible": true,
- "author": "Velleman",
+ "author": "Velleman N.V.",
"has_machine_quality": true,
"has_materials": true,
"machine_extruder_trains":
@@ -31,7 +31,7 @@
"default_value": "elliptic"
},
"gantry_height": {
- "default_value": 0
+ "value": "0"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/vertex_k8400.def.json b/resources/definitions/vertex_k8400.def.json
index a3a3777547..6bba095978 100644
--- a/resources/definitions/vertex_k8400.def.json
+++ b/resources/definitions/vertex_k8400.def.json
@@ -4,7 +4,7 @@
"inherits": "fdmprinter",
"metadata": {
"visible": true,
- "manufacturer": "Velleman",
+ "manufacturer": "Velleman N.V.",
"file_formats": "text/x-gcode",
"platform": "Vertex_build_panel.stl",
"platform_offset": [0, -3, 0],
@@ -58,7 +58,7 @@
]
},
"gantry_height": {
- "default_value": 18
+ "value": "18"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/vertex_k8400_dual.def.json b/resources/definitions/vertex_k8400_dual.def.json
index c7706135bd..9d014b9cf8 100644
--- a/resources/definitions/vertex_k8400_dual.def.json
+++ b/resources/definitions/vertex_k8400_dual.def.json
@@ -4,7 +4,7 @@
"inherits": "fdmprinter",
"metadata": {
"visible": true,
- "manufacturer": "Velleman",
+ "manufacturer": "Velleman N.V.",
"file_formats": "text/x-gcode",
"platform": "Vertex_build_panel.stl",
"platform_offset": [0, -3, 0],
@@ -59,7 +59,7 @@
]
},
"gantry_height": {
- "default_value": 18
+ "value": "18"
},
"machine_extruder_count": {
"default_value": 2
diff --git a/resources/definitions/vertex_nano_k8600.def.json b/resources/definitions/vertex_nano_k8600.def.json
new file mode 100644
index 0000000000..02697a1152
--- /dev/null
+++ b/resources/definitions/vertex_nano_k8600.def.json
@@ -0,0 +1,83 @@
+{
+ "version": 2,
+ "name": "Vertex K8600",
+ "inherits": "fdmprinter",
+ "metadata": {
+ "visible": true,
+ "manufacturer": "Velleman N.V.",
+ "file_formats": "text/x-gcode",
+ "supports_usb_connection": true,
+ "supported_actions": ["MachineSettingsAction"],
+ "machine_extruder_trains": {
+ "0": "vertex_nano_k8600_extruder_0"
+ }
+ },
+ "overrides": {
+ "machine_name": {
+ "default_value": "Vertex K8600"
+ },
+ "machine_heated_bed": {
+ "default_value": false
+ },
+ "material_bed_temperature": {
+ "default_value": 0
+ },
+ "material_bed_temperature_layer_0": {
+ "default_value": 0
+ },
+ "machine_width": {
+ "default_value": 80
+ },
+ "machine_height": {
+ "default_value": 75
+ },
+ "machine_depth": {
+ "default_value": 80
+ },
+ "machine_center_is_zero": {
+ "default_value": false
+ },
+ "machine_gcode_flavor": {
+ "default_value": "RepRap (Marlin/Sprinter)"
+ },
+ "machine_start_gcode": {
+ "default_value": "; Vertex Nano Start G-code M0 is my nozzle clean M400 G28 ; Home extruder G90 ; Absolute positioning M82 ; Extruder in absolute mode M104 T0 S{material_print_temperature} G92 E0 ; Reset extruder position G1 Z1 F800 M109 T0 S{material_print_temperature} M117 Priming nozzle... M83 G1 E20 F100 ; purge/prime nozzle M82 G92 E0 ; Reset extruder position G4 S3 ; Wait 3 seconds G1 Z5 F2000 M117 Vertex Nano is printing"
+ },
+ "machine_end_gcode": {
+ "default_value": "; Vertex Nano end G-Code G91 ; Relative positioning T0 G1 E-1 F1500; Reduce filament pressure M104 T0 S0 G90 ; Absolute positioning G92 E0 ; Reset extruder position G28 M84 ; Turn steppers off"
+ },
+ "line_width": {
+ "value": 0.35
+ },
+ "infill_line_width": {
+ "value": 0.35
+ },
+ "wall_thickness": {
+ "value": 0.7
+ },
+ "top_bottom_thickness": {
+ "value": 0.6
+ },
+ "infill_sparse_density": {
+ "value": 40
+ },
+ "infill_overlap": {
+ "value": 5
+ },
+ "min_infill_area": {
+ "value": 0.1
+ },
+ "retract_at_layer_change": {
+ "value": true
+ },
+ "retraction_min_travel": {
+ "value": 1
+ },
+ "retraction_count_max": {
+ "value": 15
+ },
+ "retraction_extrusion_window": {
+ "value": 1
+ }
+ }
+}
diff --git a/resources/definitions/wanhao_d6.def.json b/resources/definitions/wanhao_d6.def.json
index c8a690d02c..eaaae54826 100644
--- a/resources/definitions/wanhao_d6.def.json
+++ b/resources/definitions/wanhao_d6.def.json
@@ -36,7 +36,7 @@
"default_value": true
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_gcode_flavor": {
"default_value": "RepRap (Marlin/Sprinter)"
diff --git a/resources/definitions/winbo_dragonl4.def.json b/resources/definitions/winbo_dragonl4.def.json
index 0ca68cdcee..bf52a785e9 100644
--- a/resources/definitions/winbo_dragonl4.def.json
+++ b/resources/definitions/winbo_dragonl4.def.json
@@ -37,7 +37,7 @@
"machine_max_feedrate_y": { "default_value": 300 },
"machine_max_feedrate_z": { "default_value": 40 },
"machine_acceleration": { "default_value": 2000 },
- "gantry_height": { "default_value": 80 },
+ "gantry_height": { "value": "80" },
"machine_extruder_count": { "default_value": 1 },
"machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nM9998\nG28 X0 Y0\nG28 Z0\nG1 F6000 Z0.3\nG92 E0\nG1 F800 X585 E12\nG92 E0" },
"machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" },
@@ -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..f1c94ca07e 100644
--- a/resources/definitions/winbo_mini2.def.json
+++ b/resources/definitions/winbo_mini2.def.json
@@ -37,7 +37,7 @@
"machine_max_feedrate_y": { "default_value": 200 },
"machine_max_feedrate_z": { "default_value": 40 },
"machine_acceleration": { "default_value": 3000 },
- "gantry_height": { "default_value": 75 },
+ "gantry_height": { "value": "75" },
"machine_extruder_count": { "default_value": 1 },
"machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nG28 X0 Y0\nG28 Z0\nG1 F1000 Z3\nG1 F4000 X0\nG1 F4000 Y0\nG1 F1000 Z0.2\nG92 E0\nG1 F1000 X30 E8\nG92 E0\nM117 Printing." },
"machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" },
@@ -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..ac78467a2a 100644
--- a/resources/definitions/winbo_superhelper105.def.json
+++ b/resources/definitions/winbo_superhelper105.def.json
@@ -37,7 +37,7 @@
"machine_max_feedrate_y": { "default_value": 200 },
"machine_max_feedrate_z": { "default_value": 40 },
"machine_acceleration": { "default_value": 2000 },
- "gantry_height": { "default_value": 200 },
+ "gantry_height": { "value": "200" },
"machine_extruder_count": { "default_value": 1 },
"machine_start_gcode": { "default_value": "G21\nG90\nM82\nM107\nG28 X0 Y0\nG28 Z0\nG1 F6000 Z0.3\nG92 E0\nG1 F1000 X30 E8\nG92 E0\nM117 Printing." },
"machine_end_gcode": { "default_value": "M104 S0\nM140 S0\nG92 E2\nG1 E0 F200\nG28 X0 Y0\nM84 X Y E" },
@@ -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/definitions/z-bolt_classic.def.json b/resources/definitions/z-bolt_classic.def.json
index d294de473a..f9212c9597 100644
--- a/resources/definitions/z-bolt_classic.def.json
+++ b/resources/definitions/z-bolt_classic.def.json
@@ -41,7 +41,7 @@
]
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_use_extruder_offset_to_offset_coords": {
"default_value": true
diff --git a/resources/definitions/z-bolt_plus.def.json b/resources/definitions/z-bolt_plus.def.json
index 57331df4c6..dace8ea300 100644
--- a/resources/definitions/z-bolt_plus.def.json
+++ b/resources/definitions/z-bolt_plus.def.json
@@ -41,7 +41,7 @@
]
},
"gantry_height": {
- "default_value": 55
+ "value": "55"
},
"machine_use_extruder_offset_to_offset_coords": {
"default_value": true
diff --git a/resources/definitions/zone3d_printer.def.json b/resources/definitions/zone3d_printer.def.json
index 328505e18a..5aa015cace 100644
--- a/resources/definitions/zone3d_printer.def.json
+++ b/resources/definitions/zone3d_printer.def.json
@@ -5,7 +5,7 @@
"metadata": {
"visible": true,
"author": "Ultimaker",
- "manufacturer": "Unknown",
+ "manufacturer": "Zone3D",
"file_formats": "text/x-gcode",
"platform_offset": [ 0, 0, 0],
"machine_extruder_trains":
diff --git a/resources/definitions/zyyx_agile.def.json b/resources/definitions/zyyx_agile.def.json
index 17265bf6f6..a4b3c3ee8b 100644
--- a/resources/definitions/zyyx_agile.def.json
+++ b/resources/definitions/zyyx_agile.def.json
@@ -33,7 +33,7 @@
"machine_center_is_zero": { "default_value": true },
"machine_gcode_flavor": { "default_value": "Makerbot" },
"machine_head_with_fans_polygon": { "default_value": [ [ -37, 50 ], [ 25, 50 ], [ 25, -40 ], [ -37, -40 ] ] },
- "gantry_height": { "default_value": 10 },
+ "gantry_height": { "value": "10" },
"machine_steps_per_mm_x": { "default_value": 88.888889 },
"machine_steps_per_mm_y": { "default_value": 88.888889 },
"machine_steps_per_mm_z": { "default_value": 400 },
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/creality_cr10_extruder_0.def.json b/resources/extruders/anet_a6_extruder_0.def.json
similarity index 80%
rename from resources/extruders/creality_cr10_extruder_0.def.json
rename to resources/extruders/anet_a6_extruder_0.def.json
index 3a259b672b..704d3a55ca 100644
--- a/resources/extruders/creality_cr10_extruder_0.def.json
+++ b/resources/extruders/anet_a6_extruder_0.def.json
@@ -1,10 +1,10 @@
{
- "id": "creality_cr10_extruder_0",
+ "id": "anet_a6_extruder_0",
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
- "machine": "creality_cr10",
+ "machine": "anet_a6",
"position": "0"
},
diff --git a/resources/extruders/creality_cr10s4_extruder_0.def.json b/resources/extruders/creality_base_extruder_0.def.json
similarity index 80%
rename from resources/extruders/creality_cr10s4_extruder_0.def.json
rename to resources/extruders/creality_base_extruder_0.def.json
index 8a40c6431f..a173d1c2fa 100644
--- a/resources/extruders/creality_cr10s4_extruder_0.def.json
+++ b/resources/extruders/creality_base_extruder_0.def.json
@@ -1,10 +1,9 @@
{
- "id": "creality_cr10s4_extruder_0",
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
- "machine": "creality_cr10s4",
+ "machine": "creality_base",
"position": "0"
},
@@ -12,5 +11,6 @@
"extruder_nr": { "default_value": 0 },
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
+
}
}
diff --git a/resources/extruders/creality_cr10s5_extruder_0.def.json b/resources/extruders/erzay3d_extruder_0.def.json
similarity index 80%
rename from resources/extruders/creality_cr10s5_extruder_0.def.json
rename to resources/extruders/erzay3d_extruder_0.def.json
index 98b701ae2e..65bf515263 100644
--- a/resources/extruders/creality_cr10s5_extruder_0.def.json
+++ b/resources/extruders/erzay3d_extruder_0.def.json
@@ -1,10 +1,10 @@
{
- "id": "creality_cr10s5_extruder_0",
+ "id": "erzay3d_extruder_0",
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
- "machine": "creality_cr10s5",
+ "machine": "erzay3d",
"position": "0"
},
diff --git a/resources/extruders/felixpro2_dual_extruder_0.def.json b/resources/extruders/felixpro2_dual_extruder_0.def.json
new file mode 100644
index 0000000000..90c41a83b5
--- /dev/null
+++ b/resources/extruders/felixpro2_dual_extruder_0.def.json
@@ -0,0 +1,28 @@
+{
+ "id": "felixpro2_dual_extruder_0",
+ "version": 2,
+ "name": "Left Extruder",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "felixpro2dual",
+ "position": "0"
+ },
+
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 0,
+ "maximum_value": "1"
+ },
+ "machine_nozzle_offset_x": { "default_value": 0 },
+ "machine_nozzle_offset_y": { "default_value": 0 },
+ "machine_nozzle_size": { "default_value": 0.35 },
+ "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" }
+ }
+}
diff --git a/resources/extruders/felixpro2_dual_extruder_1.def.json b/resources/extruders/felixpro2_dual_extruder_1.def.json
new file mode 100644
index 0000000000..3ff0d401fd
--- /dev/null
+++ b/resources/extruders/felixpro2_dual_extruder_1.def.json
@@ -0,0 +1,28 @@
+{
+ "id": "felixpro2_dual_extruder_1",
+ "version": 2,
+ "name": "Right Extruder",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "felixpro2dual",
+ "position": "1"
+ },
+
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 1,
+ "maximum_value": "2"
+ },
+ "machine_nozzle_offset_x": { "default_value": 0 },
+ "machine_nozzle_offset_y": { "default_value": 0 },
+ "machine_nozzle_size": { "default_value": 0.35 },
+ "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" }
+ }
+}
diff --git a/resources/extruders/creality_ender3_extruder_0.def.json b/resources/extruders/flsun_qq_s_extruder_0.def.json
similarity index 80%
rename from resources/extruders/creality_ender3_extruder_0.def.json
rename to resources/extruders/flsun_qq_s_extruder_0.def.json
index 431366c777..cba424e182 100644
--- a/resources/extruders/creality_ender3_extruder_0.def.json
+++ b/resources/extruders/flsun_qq_s_extruder_0.def.json
@@ -1,10 +1,10 @@
{
- "id": "creality_ender3_extruder_0",
+ "id": "flsun_qq_s_extruder_0",
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
- "machine": "creality_ender3",
+ "machine": "flsun_qq_s",
"position": "0"
},
diff --git a/resources/extruders/geeetech_a30_extruder_0.def.json b/resources/extruders/geeetech_a30_extruder_0.def.json
new file mode 100644
index 0000000000..bc1d6a6ed6
--- /dev/null
+++ b/resources/extruders/geeetech_a30_extruder_0.def.json
@@ -0,0 +1,16 @@
+{
+ "id": "geeetech_a30_extruder_0",
+ "version": 2,
+ "name": "Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "geeetech_a30",
+ "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/imade3d_jellybox_2_extruder_0.def.json b/resources/extruders/imade3d_jellybox_2_extruder_0.def.json
new file mode 100644
index 0000000000..1d50297343
--- /dev/null
+++ b/resources/extruders/imade3d_jellybox_2_extruder_0.def.json
@@ -0,0 +1,16 @@
+{
+ "id": "imade3d_jellybox_2_extruder_0",
+ "version": 2,
+ "name": "Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "imade3d_jellybox_2",
+ "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/jgaurora_a3s_extruder_0.def.json b/resources/extruders/jgaurora_a3s_extruder_0.def.json
new file mode 100644
index 0000000000..430867b38b
--- /dev/null
+++ b/resources/extruders/jgaurora_a3s_extruder_0.def.json
@@ -0,0 +1,16 @@
+{
+ "id": "jgaurora_a3s_extruder_0",
+ "version": 2,
+ "name": "Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "jgaurora_a3s",
+ "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/nwa3d_a31_extruder_0.def.json b/resources/extruders/nwa3d_a31_extruder_0.def.json
new file mode 100644
index 0000000000..999fe37d28
--- /dev/null
+++ b/resources/extruders/nwa3d_a31_extruder_0.def.json
@@ -0,0 +1,16 @@
+{
+ "id": "nwa3d_a31_extruder_0",
+ "version": 2,
+ "name": "Standard 0.4mm",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "nwa3d_a31",
+ "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/strateo3d_left_extruder.def.json b/resources/extruders/strateo3d_left_extruder.def.json
new file mode 100644
index 0000000000..1df8eb0ebb
--- /dev/null
+++ b/resources/extruders/strateo3d_left_extruder.def.json
@@ -0,0 +1,17 @@
+{
+ "id": "strateo3d_left_extruder",
+ "version": 2,
+ "name": "Left Extruder 2",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "strateo3d",
+ "position": "1"
+ },
+
+ "overrides": {
+ "extruder_nr": { "default_value": 1, "maximum_value": "1" },
+ "material_diameter": { "default_value": 1.75 },
+ "machine_nozzle_offset_x": { "default_value": 0 },
+ "machine_nozzle_offset_y": { "default_value": 0 }
+ }
+}
\ No newline at end of file
diff --git a/resources/extruders/strateo3d_right_extruder.def.json b/resources/extruders/strateo3d_right_extruder.def.json
new file mode 100644
index 0000000000..ea59870329
--- /dev/null
+++ b/resources/extruders/strateo3d_right_extruder.def.json
@@ -0,0 +1,17 @@
+{
+ "id": "strateo3d_right_extruder",
+ "version": 2,
+ "name": "Right Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "strateo3d",
+ "position": "0"
+ },
+
+ "overrides": {
+ "extruder_nr": { "default_value": 0, "maximum_value": "1" },
+ "material_diameter": { "default_value": 1.75 },
+ "machine_nozzle_offset_x": { "default_value": 0 },
+ "machine_nozzle_offset_y": { "default_value": 0 }
+ }
+}
\ No newline at end of file
diff --git a/resources/extruders/ultimaker_s3_extruder_left.def.json b/resources/extruders/ultimaker_s3_extruder_left.def.json
new file mode 100644
index 0000000000..61d3149e0b
--- /dev/null
+++ b/resources/extruders/ultimaker_s3_extruder_left.def.json
@@ -0,0 +1,30 @@
+{
+ "id": "ultimaker_s3_extruder_left",
+ "version": 2,
+ "name": "Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "ultimaker_s3",
+ "position": "0"
+ },
+
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 0,
+ "maximum_value": "1"
+ },
+ "machine_nozzle_offset_x": { "default_value": 0 },
+ "machine_nozzle_offset_y": { "default_value": 0 },
+
+ "machine_extruder_start_pos_abs": { "default_value": true },
+ "machine_extruder_start_pos_x": { "default_value": 180 },
+ "machine_extruder_start_pos_y": { "default_value": 180 },
+ "machine_extruder_end_pos_abs": { "default_value": true },
+ "machine_extruder_end_pos_x": { "default_value": 180 },
+ "machine_extruder_end_pos_y": { "default_value": 180 },
+ "machine_nozzle_head_distance": { "default_value": 2.7 },
+ "extruder_prime_pos_x": { "default_value": -3 },
+ "extruder_prime_pos_y": { "default_value": 6 },
+ "extruder_prime_pos_z": { "default_value": 2 }
+ }
+}
diff --git a/resources/extruders/ultimaker_s3_extruder_right.def.json b/resources/extruders/ultimaker_s3_extruder_right.def.json
new file mode 100644
index 0000000000..efcb6ae06a
--- /dev/null
+++ b/resources/extruders/ultimaker_s3_extruder_right.def.json
@@ -0,0 +1,30 @@
+{
+ "id": "ultimaker_s3_extruder_right",
+ "version": 2,
+ "name": "Extruder 2",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "ultimaker_s3",
+ "position": "1"
+ },
+
+ "overrides": {
+ "extruder_nr": {
+ "default_value": 1,
+ "maximum_value": "1"
+ },
+ "machine_nozzle_offset_x": { "default_value": 22 },
+ "machine_nozzle_offset_y": { "default_value": 0 },
+
+ "machine_extruder_start_pos_abs": { "default_value": true },
+ "machine_extruder_start_pos_x": { "default_value": 180 },
+ "machine_extruder_start_pos_y": { "default_value": 180 },
+ "machine_extruder_end_pos_abs": { "default_value": true },
+ "machine_extruder_end_pos_x": { "default_value": 180 },
+ "machine_extruder_end_pos_y": { "default_value": 180 },
+ "machine_nozzle_head_distance": { "default_value": 4.2 },
+ "extruder_prime_pos_x": { "default_value": 180 },
+ "extruder_prime_pos_y": { "default_value": 6 },
+ "extruder_prime_pos_z": { "default_value": 2 }
+ }
+}
diff --git a/resources/extruders/vertex_nano_k8600_extruder_0.def.json b/resources/extruders/vertex_nano_k8600_extruder_0.def.json
new file mode 100644
index 0000000000..cfb2d11217
--- /dev/null
+++ b/resources/extruders/vertex_nano_k8600_extruder_0.def.json
@@ -0,0 +1,15 @@
+{
+ "version": 2,
+ "name": "Extruder 1",
+ "inherits": "fdmextruder",
+ "metadata": {
+ "machine": "vertex_nano_k8600",
+ "position": "0"
+ },
+
+ "overrides": {
+ "extruder_nr": { "default_value": 0 },
+ "machine_nozzle_size": { "default_value": 0.35 },
+ "material_diameter": { "default_value": 1.75 }
+ }
+}
diff --git a/resources/i18n/cura.pot b/resources/i18n/cura.pot
index 749fdb65ee..8acdb06149 100644
--- a/resources/i18n/cura.pot
+++ b/resources/i18n/cura.pot
@@ -8,17 +8,17 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2019-02-26 16:36+0100\n"
+"POT-Creation-Date: 2019-07-16 14:38+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"Language: \n"
"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:27
msgctxt "@action"
msgid "Machine Settings"
msgstr ""
@@ -56,7 +56,7 @@ msgctxt "@info:title"
msgid "3D Model Assistant"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:86
+#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:90
#, python-brace-format
msgctxt "@info:status"
msgid ""
@@ -69,16 +69,6 @@ msgid ""
"guide
"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
-msgctxt "@item:inmenu"
-msgid "Changelog"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
-msgctxt "@item:inmenu"
-msgid "Show Changelog"
-msgstr ""
-
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py:25
msgctxt "@action"
msgid "Update Firmware"
@@ -94,38 +84,37 @@ msgctxt "@info:status"
msgid "Profile has been flattened & activated."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:33
+#: /home/ruben/Projects/Cura/plugins/AMFReader/__init__.py:15
+msgctxt "@item:inlistbox"
+msgid "AMF File"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:37
msgctxt "@item:inmenu"
msgid "USB printing"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:34
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:38
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print via USB"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:35
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:39
msgctxt "@info:tooltip"
msgid "Print via USB"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:71
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:75
msgctxt "@info:status"
msgid "Connected via USB"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:96
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:100
msgctxt "@label"
msgid ""
"A USB print is in progress, closing Cura will stop this print. Are you sure?"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
-msgctxt "X3G Writer File Description"
-msgid "X3G File"
-msgstr ""
-
#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/GPX-prefix/src/GPX/slicerplugins/cura15.06/X3gWriter/__init__.py:16
msgctxt "X3g Writer Plugin Description"
msgid "Writes X3g to files"
@@ -136,6 +125,11 @@ msgctxt "X3g Writer File Description"
msgid "X3g File"
msgstr ""
+#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
+msgctxt "X3G Writer File Description"
+msgid "X3G File"
+msgstr ""
+
#: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/__init__.py:17
#: /home/ruben/Projects/Cura/plugins/GCodeGzReader/__init__.py:17
msgctxt "@item:inlistbox"
@@ -148,6 +142,7 @@ msgid "GCodeGzWriter does not support text mode."
msgstr ""
#: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:28
+#: /home/ruben/Projects/Cura/plugins/UFPReader/__init__.py:22
msgctxt "@item:inlistbox"
msgid "Ultimaker Format Package"
msgstr ""
@@ -206,10 +201,10 @@ msgid "Could not save to removable drive {0}: {1}"
msgstr ""
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:137
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:152
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:133
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:140
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1629
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:188
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:134
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:141
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1622
msgctxt "@info:title"
msgid "Error"
msgstr ""
@@ -238,9 +233,9 @@ msgstr ""
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:151
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:163
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1619
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1719
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1612
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1712
msgctxt "@info:title"
msgid "Warning"
msgstr ""
@@ -267,109 +262,109 @@ msgctxt "@item:intext"
msgid "Removable Drive"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:74
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:93
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print over network"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:89
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:76
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:94
msgctxt "@properties:tooltip"
msgid "Print over network"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:95
msgctxt "@info:status"
msgid "Connected over the network."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:91
-msgctxt "@info:status"
-msgid ""
-"Connected over the network. Please approve the access request on the printer."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:93
-msgctxt "@info:status"
-msgid "Connected over the network. No access to control the printer."
-msgstr ""
-
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
msgctxt "@info:status"
msgid ""
+"Connected over the network. Please approve the access request on the printer."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:100
+msgctxt "@info:status"
+msgid "Connected over the network. No access to control the printer."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
+msgctxt "@info:status"
+msgid ""
"Access to the printer requested. Please approve the request on the printer"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:101
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
msgctxt "@info:title"
msgid "Authentication status"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:103
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:109
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:113
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:120
msgctxt "@info:title"
msgid "Authentication Status"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:104
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:187
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:111
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:198
msgctxt "@action:button"
msgid "Retry"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
msgctxt "@info:tooltip"
msgid "Re-send the access request"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:115
msgctxt "@info:status"
msgid "Access to the printer accepted"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:119
msgctxt "@info:status"
msgid "No access to print with this printer. Unable to send print job."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:114
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:121
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:65
msgctxt "@action:button"
msgid "Request Access"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:123
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:66
msgctxt "@info:tooltip"
msgid "Send access request to the printer"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:201
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:208
msgctxt "@label"
msgid "Unable to start a new print job."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:203
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:210
msgctxt "@label"
msgid ""
"There is an issue with the configuration of your Ultimaker, which makes it "
"impossible to start the print. Please resolve this issues before continuing."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:209
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:231
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:216
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:238
msgctxt "@window:title"
msgid "Mismatched configuration"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:230
msgctxt "@label"
msgid "Are you sure you wish to print with the selected configuration?"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:225
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:232
msgctxt "@label"
msgid ""
"There is a mismatch between the configuration or calibration of the printer "
@@ -377,57 +372,58 @@ msgid ""
"that are inserted in your printer."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:252
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:162
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:162
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:176
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:181
msgctxt "@info:status"
msgid ""
"Sending new jobs (temporarily) blocked, still sending the previous print job."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:180
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:197
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:266
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:194
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:211
msgctxt "@info:status"
msgid "Sending data to printer"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:260
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:182
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:199
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:267
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:196
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:213
msgctxt "@info:title"
msgid "Sending Data"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:261
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:200
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:268
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:214
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:18
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:19
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:81
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:395
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:410
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:20
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:38
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:143
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:58
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:149
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:391
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:254
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:283
msgctxt "@action:button"
msgid "Cancel"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:324
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:331
#, python-brace-format
msgctxt "@info:status"
msgid "No Printcore loaded in slot {slot_number}"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:337
#, python-brace-format
msgctxt "@info:status"
msgid "No material loaded in slot {slot_number}"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:353
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:360
#, python-brace-format
msgctxt "@label"
msgid ""
@@ -435,23 +431,23 @@ msgid ""
"{remote_printcore_name}) selected for extruder {extruder_id}"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:362
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:369
#, python-brace-format
msgctxt "@label"
msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:548
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:555
msgctxt "@window:title"
msgid "Sync with your printer"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:550
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:557
msgctxt "@label"
msgid "Would you like to use your current printer configuration in Cura?"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:552
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:559
msgctxt "@label"
msgid ""
"The PrintCores and/or materials on your printer differ from those within "
@@ -459,87 +455,87 @@ msgid ""
"and materials that are inserted in your printer."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:96
msgctxt "@info:status"
msgid "Connected over the network"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:275
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:342
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:370
msgctxt "@info:status"
msgid "Print job was successfully sent to the printer."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:277
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:343
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:291
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:371
msgctxt "@info:title"
msgid "Data Sent"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:278
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:292
msgctxt "@action:button"
msgid "View in Monitor"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:390
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:290
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:411
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Printer '{printer_name}' has finished printing '{job_name}'."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:392
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:294
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:413
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:322
#, python-brace-format
msgctxt "@info:status"
msgid "The print job '{job_name}' was finished."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:393
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:414
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:316
msgctxt "@info:status"
msgid "Print finished"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:573
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:595
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:629
msgctxt "@label:material"
msgid "Empty"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:596
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:630
msgctxt "@label:material"
msgid "Unknown"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:169
msgctxt "@action:button"
msgid "Print via Cloud"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:170
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:171
msgctxt "@info:status"
msgid "Connected via Cloud"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:163
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:331
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:182
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:359
msgctxt "@info:title"
msgid "Cloud error"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:199
msgctxt "@info:status"
msgid "Could not export print job."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:358
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
msgstr ""
@@ -554,50 +550,55 @@ msgctxt "@info:status"
msgid "today"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:187
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
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"
+msgid "Sending Print Job"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
+msgctxt "@info:status"
+msgid "Uploading via Ultimaker Cloud"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:621
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
-msgctxt "@info:status"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:627
+msgctxt ""
+"@info:status Ultimaker Cloud is a brand name and shouldn't be translated."
msgid "Connect to Ultimaker Cloud"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:628
msgctxt "@action"
msgid "Don't ask me again for this printer."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:631
msgctxt "@action"
msgid "Get started"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:637
msgctxt "@info:status"
msgid ""
"You can now send and monitor print jobs from anywhere using your Ultimaker "
"account."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:643
msgctxt "@info:status"
msgid "Connected!"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:645
msgctxt "@action"
msgid "Review your connection"
msgstr ""
@@ -612,7 +613,7 @@ msgctxt "@item:inmenu"
msgid "Monitor"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:124
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:118
msgctxt "@info"
msgid "Could not access update information."
msgstr ""
@@ -673,49 +674,11 @@ msgctxt "@info:tooltip"
msgid "Create a volume in which supports are not printed."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:52
-msgctxt "@info"
-msgid "Cura collects anonymized usage statistics."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:55
-msgctxt "@info:title"
-msgid "Collecting Data"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:57
-msgctxt "@action:button"
-msgid "More info"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:58
-msgctxt "@action:tooltip"
-msgid "See more information on what data Cura sends."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:60
-msgctxt "@action:button"
-msgid "Allow"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:61
-msgctxt "@action:tooltip"
-msgid ""
-"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."
-msgstr ""
-
#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "Cura 15.04 profiles"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
-msgctxt "@item:inmenu"
-msgid "Evaluation"
-msgstr ""
-
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "JPG Image"
@@ -741,24 +704,24 @@ msgctxt "@item:inlistbox"
msgid "GIF Image"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
msgctxt "@info:status"
msgid ""
"Unable to slice with the current material as it is incompatible with the "
"selected machine or configuration."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:389
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:398
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:407
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:416
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:362
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:386
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:395
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:404
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:413
msgctxt "@info:title"
msgid "Unable to slice"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:364
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:361
#, python-brace-format
msgctxt "@info:status"
msgid ""
@@ -766,7 +729,7 @@ msgid ""
"errors: {0}"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:388
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:385
#, python-brace-format
msgctxt "@info:status"
msgid ""
@@ -774,13 +737,13 @@ msgid ""
"errors on one or more models: {error_labels}"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:397
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:394
msgctxt "@info:status"
msgid ""
"Unable to slice because the prime tower or prime position(s) are invalid."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:406
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:403
#, python-format
msgctxt "@info:status"
msgid ""
@@ -788,7 +751,7 @@ msgid ""
"%s."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:412
msgctxt "@info:status"
msgid ""
"Nothing to slice because none of the models fit the build volume or are "
@@ -797,12 +760,12 @@ msgid ""
msgstr ""
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:status"
msgid "Processing Layers"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:title"
msgid "Information"
msgstr ""
@@ -833,13 +796,13 @@ msgctxt "@item:inlistbox"
msgid "3MF File"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:190
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:763
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:191
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:775
msgctxt "@label"
msgid "Nozzle"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:469
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:474
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid ""
@@ -848,7 +811,7 @@ msgid ""
"instead."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:472
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:477
msgctxt "@info:title"
msgid "Open Project File"
msgstr ""
@@ -863,18 +826,18 @@ msgctxt "@item:inlistbox"
msgid "G File"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:324
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:328
msgctxt "@info:status"
msgid "Parsing G-code"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:326
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:476
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:330
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:483
msgctxt "@info:title"
msgid "G-code Details"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:474
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:481
msgctxt "@info:generic"
msgid ""
"Make sure the g-code is suitable for your printer and printer configuration "
@@ -899,7 +862,7 @@ msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
+#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:132
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
msgstr ""
@@ -960,96 +923,35 @@ msgctxt "@item:inmenu"
msgid "Preview"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:19
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
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"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:81
-msgctxt "@tooltip"
-msgid "Outer Wall"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:82
-msgctxt "@tooltip"
-msgid "Inner Walls"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:83
-msgctxt "@tooltip"
-msgid "Skin"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:84
-msgctxt "@tooltip"
-msgid "Infill"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:85
-msgctxt "@tooltip"
-msgid "Support Infill"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:86
-msgctxt "@tooltip"
-msgid "Support Interface"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:87
-msgctxt "@tooltip"
-msgid "Support"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88
-msgctxt "@tooltip"
-msgid "Skirt"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89
-msgctxt "@tooltip"
-msgid "Travel"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90
-msgctxt "@tooltip"
-msgid "Retractions"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91
-msgctxt "@tooltip"
-msgid "Other"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:309
-#, python-brace-format
-msgctxt "@label"
-msgid "Pre-sliced file {0}"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/cura/API/Account.py:77
+#: /home/ruben/Projects/Cura/cura/API/Account.py:82
msgctxt "@info:title"
msgid "Login failed"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:201
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121
+#: /home/ruben/Projects/Cura/cura/Settings/cura_empty_instance_containers.py:33
+msgctxt "@info:not supported profile"
+msgid "Not supported"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:203
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
msgctxt "@title:window"
msgid "File Already Exists"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:202
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:204
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:123
#, python-brace-format
msgctxt "@label Don't translate the XML tag !"
msgid ""
@@ -1057,43 +959,36 @@ msgid ""
"overwrite it?"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:425
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:427
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:430
msgctxt "@info:status"
msgid "Invalid file URL:"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
-msgctxt "@menuitem"
-msgid "Not overridden"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:915
-#, python-format
-msgctxt "@info:generic"
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:925
+msgctxt "@info:message Followed by a list of settings."
msgid ""
-"Settings have been changed to match the current availability of extruders: "
-"[%s]"
+"Settings have been changed to match the current availability of extruders:"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:917
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:927
msgctxt "@info:title"
msgid "Settings updated"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1481
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:132
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid ""
"Failed to export profile to {0}: {1}"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:138
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:139
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid ""
@@ -1101,44 +996,44 @@ msgid ""
"failure."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Exported profile to {0}"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145
msgctxt "@info:title"
msgid "Export succeeded"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:170
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:172
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:176
#, 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 ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:192
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "No custom profile to import in file {0}"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:194
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:196
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}:"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:218
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:228
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:220
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid ""
@@ -1146,7 +1041,7 @@ msgid ""
"import it."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:241
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:243
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid ""
@@ -1154,60 +1049,145 @@ msgid ""
"with your current machine ({2}), could not import it."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:315
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to import profile from {0}:"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:316
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Successfully imported profile {0}"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:319
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321
#, python-brace-format
msgctxt "@info:status"
msgid "File {0} does not contain any valid profile."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:322
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:324
#, python-brace-format
msgctxt "@info:status"
msgid "Profile {0} has an unknown file type or is corrupted."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:340
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:359
msgctxt "@label"
msgid "Custom profile"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:356
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:375
msgctxt "@info:status"
msgid "Profile is missing a quality type."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:370
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:389
#, python-brace-format
msgctxt "@info:status"
msgid "Could not find a quality type {0} for the current configuration."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:69
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:76
+msgctxt "@tooltip"
+msgid "Outer Wall"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:77
+msgctxt "@tooltip"
+msgid "Inner Walls"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:78
+msgctxt "@tooltip"
+msgid "Skin"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:79
+msgctxt "@tooltip"
+msgid "Infill"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:80
+msgctxt "@tooltip"
+msgid "Support Infill"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:81
+msgctxt "@tooltip"
+msgid "Support Interface"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:82
+msgctxt "@tooltip"
+msgid "Support"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:83
+msgctxt "@tooltip"
+msgid "Skirt"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:84
+msgctxt "@tooltip"
+msgid "Prime Tower"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:85
+msgctxt "@tooltip"
+msgid "Travel"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:86
+msgctxt "@tooltip"
+msgid "Retractions"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:87
+msgctxt "@tooltip"
+msgid "Other"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:306
+#, python-brace-format
+msgctxt "@label"
+msgid "Pre-sliced file {0}"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/UI/WelcomePagesModel.py:56
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:62
+msgctxt "@action:button"
+msgid "Next"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/UI/ObjectsModel.py:61
#, python-brace-format
msgctxt "@label"
msgid "Group #{group_nr}"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Machines/Models/MachineManagementModel.py:65
-msgctxt "@info:title"
-msgid "Network enabled printers"
+#: /home/ruben/Projects/Cura/cura/UI/WhatsNewPagesModel.py:17
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:185
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:85
+#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:482
+#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:508
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:124
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:168
+msgctxt "@action:button"
+msgid "Close"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Machines/Models/MachineManagementModel.py:80
-msgctxt "@info:title"
-msgid "Local printers"
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:17
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:91
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:48
+msgctxt "@action:button"
+msgid "Add"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/ExtrudersModel.py:208
+msgctxt "@menuitem"
+msgid "Not overridden"
msgstr ""
#: /home/ruben/Projects/Cura/cura/Machines/Models/QualityManagementModel.py:109
@@ -1221,25 +1201,44 @@ msgctxt "@item:inlistbox"
msgid "All Files (*)"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:665
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:86
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:182
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:269
+msgctxt "@label"
+msgid "Unknown"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:116
+msgctxt "@label"
+msgid ""
+"The printer(s) below cannot be connected because they are part of a group"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:118
+msgctxt "@label"
+msgid "Available networked printers"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:689
msgctxt "@label"
msgid "Custom Material"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:666
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:256
+#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:690
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:203
msgctxt "@label"
msgid "Custom"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/BuildVolume.py:81
+#: /home/ruben/Projects/Cura/cura/BuildVolume.py:89
msgctxt "@info:status"
msgid ""
"The build volume height has been reduced due to the value of the \"Print "
"Sequence\" setting to prevent the gantry from colliding with printed models."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/BuildVolume.py:83
+#: /home/ruben/Projects/Cura/cura/BuildVolume.py:91
msgctxt "@info:title"
msgid "Build Volume"
msgstr ""
@@ -1254,17 +1253,31 @@ msgctxt "@info:backup_failed"
msgid "Tried to restore a Cura backup without having proper data or meta data."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Backups/Backup.py:124
+#: /home/ruben/Projects/Cura/cura/Backups/Backup.py:125
msgctxt "@info:backup_failed"
-msgid ""
-"Tried to restore a Cura backup that does not match your current version."
+msgid "Tried to restore a Cura backup that is higher than the current version."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationHelpers.py:79
+msgctxt "@message"
+msgid "Could not read response."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
msgstr ""
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationRequestHandler.py:66
+msgctxt "@message"
+msgid "Please give the required permissions when authorizing this application."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationRequestHandler.py:73
+msgctxt "@message"
+msgid "Something unexpected happened when trying to log in, please try again."
+msgstr ""
+
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
msgid "Multiplying and placing objects"
@@ -1277,7 +1290,7 @@ msgstr ""
#: /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
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:149
msgctxt "@info:status"
msgid "Unable to find a location within the build volume for all objects"
msgstr ""
@@ -1288,19 +1301,19 @@ msgid "Placing Object"
msgstr ""
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:30
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:67
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:66
msgctxt "@info:status"
msgid "Finding new location for objects"
msgstr ""
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:34
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:71
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:70
msgctxt "@info:title"
msgid "Finding Location"
msgstr ""
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:104
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:151
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:150
msgctxt "@info:title"
msgid "Can't Find Location"
msgstr ""
@@ -1430,30 +1443,32 @@ msgstr ""
#: /home/ruben/Projects/Cura/cura/CrashHandler.py:322
msgctxt "@title:groupbox"
-msgid "User description"
+msgid ""
+"User description (Note: Developers may not speak your language, please use "
+"English if possible)"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/CrashHandler.py:341
+#: /home/ruben/Projects/Cura/cura/CrashHandler.py:342
msgctxt "@action:button"
msgid "Send report"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:480
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:504
msgctxt "@info:progress"
msgid "Loading machines..."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:781
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:819
msgctxt "@info:progress"
msgid "Setting up scene..."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:817
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:854
msgctxt "@info:progress"
msgid "Loading interface..."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1059
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1133
#, python-format
msgctxt ""
"@info 'width', 'depth' and 'height' are variable names that must NOT be "
@@ -1461,230 +1476,166 @@ msgctxt ""
msgid "%(width).1f x %(depth).1f x %(height).1f mm"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1618
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1611
#, python-brace-format
msgctxt "@info:status"
msgid "Only one G-code file can be loaded at a time. Skipped importing {0}"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1628
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1621
#, python-brace-format
msgctxt "@info:status"
msgid "Can't open any other file if G-code is loading. Skipped importing {0}"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1718
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1711
msgctxt "@info:status"
msgid "The selected model was too small to load."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:62
-msgctxt "@title"
-msgid "Machine Settings"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:81
-msgctxt "@title:tab"
-msgid "Printer"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:100
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:58
+msgctxt "@title:label"
msgid "Printer Settings"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:111
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:72
msgctxt "@label"
msgid "X (Width)"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:112
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:122
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:132
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:238
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:387
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:403
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:429
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:441
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:897
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:76
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:90
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:104
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:194
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:213
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:232
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:253
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:272
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:79
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:93
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:109
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:124
msgctxt "@label"
msgid "mm"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:121
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:86
msgctxt "@label"
msgid "Y (Depth)"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:131
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:100
msgctxt "@label"
msgid "Z (Height)"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:143
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:114
msgctxt "@label"
msgid "Build plate shape"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:152
-msgctxt "@option:check"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:127
+msgctxt "@label"
msgid "Origin at center"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:160
-msgctxt "@option:check"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:139
+msgctxt "@label"
msgid "Heated bed"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:171
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:151
msgctxt "@label"
msgid "G-code flavor"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:184
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:176
+msgctxt "@title:label"
msgid "Printhead Settings"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:194
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:190
msgctxt "@label"
msgid "X min"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:195
-msgctxt "@tooltip"
-msgid ""
-"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\"."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:204
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:209
msgctxt "@label"
msgid "Y min"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:205
-msgctxt "@tooltip"
-msgid ""
-"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\"."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:214
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:228
msgctxt "@label"
msgid "X max"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:215
-msgctxt "@tooltip"
-msgid ""
-"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\"."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:224
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:249
msgctxt "@label"
msgid "Y max"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:225
-msgctxt "@tooltip"
-msgid ""
-"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\"."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:237
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:268
msgctxt "@label"
-msgid "Gantry height"
+msgid "Gantry Height"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:239
-msgctxt "@tooltip"
-msgid ""
-"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\"."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:258
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:282
msgctxt "@label"
msgid "Number of Extruders"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:314
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:341
+msgctxt "@title:label"
msgid "Start G-code"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:324
-msgctxt "@tooltip"
-msgid "G-code commands to be executed at the very start."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:333
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:355
+msgctxt "@title:label"
msgid "End G-code"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:343
-msgctxt "@tooltip"
-msgid "G-code commands to be executed at the very end."
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:42
+msgctxt "@title:tab"
+msgid "Printer"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:374
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:63
+msgctxt "@title:label"
msgid "Nozzle Settings"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:386
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:75
msgctxt "@label"
msgid "Nozzle size"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:402
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:89
msgctxt "@label"
msgid "Compatible material diameter"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:404
-msgctxt "@tooltip"
-msgid ""
-"The nominal diameter of filament supported by the printer. The exact "
-"diameter will be overridden by the material and/or the profile."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:428
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:105
msgctxt "@label"
msgid "Nozzle offset X"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:440
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:120
msgctxt "@label"
msgid "Nozzle offset Y"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:452
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:135
msgctxt "@label"
msgid "Cooling Fan Number"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:453
-msgctxt "@label"
-msgid ""
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:473
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:162
+msgctxt "@title:label"
msgid "Extruder Start G-code"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:491
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:176
+msgctxt "@title:label"
msgid "Extruder End G-code"
msgstr ""
@@ -1694,7 +1645,7 @@ msgid "Install"
msgstr ""
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:20
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:44
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:46
msgctxt "@action:button"
msgid "Installed"
msgstr ""
@@ -1711,15 +1662,15 @@ msgid "ratings"
msgstr ""
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:30
msgctxt "@title:tab"
msgid "Plugins"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:69
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:42
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:66
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:361
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:70
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:44
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:80
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:417
msgctxt "@title:tab"
msgid "Materials"
msgstr ""
@@ -1729,52 +1680,49 @@ msgctxt "@label"
msgid "Your rating"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:99
msgctxt "@label"
msgid "Version"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:105
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:106
msgctxt "@label"
msgid "Last updated"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:112
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:260
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:113
msgctxt "@label"
msgid "Author"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:119
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:120
msgctxt "@label"
msgid "Downloads"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:181
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:222
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:265
-msgctxt "@label"
-msgid "Unknown"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:56
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:73
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:80
+msgctxt "@label:The string between and is the highlighted link"
+msgid "Buy material spools"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:96
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
msgctxt "@action:button"
msgid "Update"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:74
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:97
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:35
msgctxt "@action:button"
msgid "Updating"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:75
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:98
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:36
msgctxt "@action:button"
msgid "Updated"
@@ -1852,7 +1800,7 @@ msgctxt "@label"
msgid "Generic Materials"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:56
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:59
msgctxt "@title:tab"
msgid "Installed"
msgstr ""
@@ -1935,12 +1883,12 @@ msgctxt "@info"
msgid "Fetching packages..."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:90
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:91
msgctxt "@label"
msgid "Website"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:97
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:98
msgctxt "@label"
msgid "Email"
msgstr ""
@@ -1952,22 +1900,6 @@ msgid ""
"adjustment."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18
-msgctxt "@label"
-msgid "Changelog"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:185
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:85
-#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:482
-#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:508
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:168
-msgctxt "@action:button"
-msgid "Close"
-msgstr ""
-
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:31
msgctxt "@title"
msgid "Update Firmware"
@@ -2051,16 +1983,17 @@ msgctxt "@label"
msgid "Firmware update failed due to missing firmware."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UserAgreement/UserAgreement.qml:16
-msgctxt "@title:window"
-msgid "User Agreement"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:144
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:181
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:153
+msgctxt "@label"
+msgid "Glass"
msgstr ""
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:208
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:249
msgctxt "@info"
-msgid ""
-"These options are not available because you are monitoring a cloud printer."
+msgid "Please update your printer's firmware to manage the queue remotely."
msgstr ""
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:241
@@ -2068,22 +2001,22 @@ msgctxt "@info"
msgid "The webcam is not available because you are monitoring a cloud printer."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:300
msgctxt "@label:status"
msgid "Loading..."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:304
msgctxt "@label:status"
msgid "Unavailable"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:308
msgctxt "@label:status"
msgid "Unreachable"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:312
msgctxt "@label:status"
msgid "Idle"
msgstr ""
@@ -2093,37 +2026,31 @@ msgctxt "@label"
msgid "Untitled"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:374
msgctxt "@label"
msgid "Anonymous"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:401
msgctxt "@label:status"
msgid "Requires configuration changes"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:439
msgctxt "@action:button"
msgid "Details"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:130
msgctxt "@label"
msgid "Unavailable printer"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "First available"
msgstr ""
-#: /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 ""
-
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:31
msgctxt "@label"
msgid "Queued"
@@ -2131,186 +2058,198 @@ msgstr ""
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:67
msgctxt "@label link to connect manager"
-msgid "Go to Cura Connect"
+msgid "Manage in browser"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:100
msgctxt "@label"
-msgid "Print jobs"
+msgid "There are no print jobs in the queue. Slice and send a job to add one."
msgstr ""
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
+msgid "Print jobs"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:132
+msgctxt "@label"
msgid "Total print time"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:148
msgctxt "@label"
msgid "Waiting for"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:246
-msgctxt "@label link to connect manager"
-msgid "View print history"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:50
msgctxt "@window:title"
msgid "Existing Connection"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:48
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:52
msgctxt "@message:text"
msgid ""
"This printer/group is already added to Cura. Please select another printer/"
"group."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:65
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:69
msgctxt "@title:window"
msgid "Connect to Networked Printer"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:77
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:81
msgctxt "@label"
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:"
+"printer."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44
-msgctxt "@action:button"
-msgid "Add"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:81
+msgctxt "@label"
+msgid "Select your printer from the list below:"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:97
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:101
msgctxt "@action:button"
msgid "Edit"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:108
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:128
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:117
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:112
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:146
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:55
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:121
msgctxt "@action:button"
msgid "Remove"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:120
msgctxt "@action:button"
msgid "Refresh"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:211
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:215
msgctxt "@label"
msgid ""
"If your printer is not listed, read the network printing "
"troubleshooting guide"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:240
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:244
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:258
msgctxt "@label"
msgid "Type"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:279
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:283
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:274
msgctxt "@label"
msgid "Firmware version"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:293
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:297
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:290
msgctxt "@label"
msgid "Address"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:317
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
msgctxt "@label"
msgid "This printer is not set up to host a group of printers."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:325
msgctxt "@label"
msgid "This printer is the host for a group of %1 printers."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:332
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:336
msgctxt "@label"
msgid "The printer at this address has not yet responded."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:337
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:341
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:74
msgctxt "@action:button"
msgid "Connect"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:351
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:354
+msgctxt "@title:window"
+msgid "Invalid IP address"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:355
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:146
+msgctxt "@text"
+msgid "Please enter a valid IP address."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:366
msgctxt "@title:window"
msgid "Printer Address"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:374
-msgctxt "@alabel"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:389
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:102
+msgctxt "@label"
msgid "Enter the IP address or hostname of your printer on the network."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:404
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:132
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:419
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:138
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181
msgctxt "@action:button"
msgid "OK"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:88
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:100
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:78
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:90
msgctxt "@label:status"
msgid "Aborted"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:90
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:92
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:80
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:82
msgctxt "@label:status"
msgid "Finished"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:94
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:84
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:86
msgctxt "@label:status"
msgid "Preparing..."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:88
msgctxt "@label:status"
msgid "Aborting..."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:92
msgctxt "@label:status"
msgid "Pausing..."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:94
msgctxt "@label:status"
msgid "Paused"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Resuming..."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Action required"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:100
msgctxt "@label:status"
msgid "Finishes %1 at %2"
msgstr ""
@@ -2414,7 +2353,7 @@ msgctxt "@action:button"
msgid "Override"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:85
msgctxt "@label"
msgid "The assigned printer, %1, requires the following configuration change:"
msgid_plural ""
@@ -2422,41 +2361,41 @@ msgid_plural ""
msgstr[0] ""
msgstr[1] ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:68
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:89
msgctxt "@label"
msgid ""
"The printer %1 is assigned, but the job contains an unknown material "
"configuration."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:78
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:99
msgctxt "@label"
msgid "Change material %1 from %2 to %3."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:81
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:102
msgctxt "@label"
msgid "Load %3 as material %1 (This cannot be overridden)."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:84
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:105
msgctxt "@label"
msgid "Change print core %1 from %2 to %3."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:87
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:108
msgctxt "@label"
msgid "Change build plate to %1 (This cannot be overridden)."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:115
msgctxt "@label"
msgid ""
"Override will use the specified settings with the existing printer "
"configuration. This may result in a failed print."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:135
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:156
msgctxt "@label"
msgid "Aluminum"
msgstr ""
@@ -2466,107 +2405,108 @@ msgctxt "@info:tooltip"
msgid "Connect to a printer"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:92
+#: /home/ruben/Projects/Cura/plugins/SettingsGuide/resources/qml/SettingsGuide.qml:16
+msgctxt "@title"
+msgid "Cura Settings Guide"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:100
msgctxt "@info"
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."
+"- Check if the printer is connected to the network.\n"
+"- Check if you are signed in to discover cloud-connected printers."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:117
msgctxt "@info"
-msgid "Please select a network connected printer to monitor."
+msgid "Please connect your printer to the network."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
-msgctxt "@info"
-msgid "Please connect your Ultimaker printer to your local network."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:156
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:20
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:49
msgctxt "@label"
msgid "Color scheme"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:105
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:107
msgctxt "@label:listbox"
msgid "Material Color"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:109
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:111
msgctxt "@label:listbox"
msgid "Line Type"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:113
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:115
msgctxt "@label:listbox"
msgid "Feedrate"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:117
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:119
msgctxt "@label:listbox"
msgid "Layer thickness"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:154
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:156
msgctxt "@label"
msgid "Compatibility Mode"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:230
msgctxt "@label"
msgid "Travels"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:236
msgctxt "@label"
msgid "Helpers"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:242
msgctxt "@label"
msgid "Shell"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:248
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
msgctxt "@label"
msgid "Infill"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:297
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:298
msgctxt "@label"
msgid "Only Show Top Layers"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:307
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:308
msgctxt "@label"
msgid "Show 5 Detailed Layers On Top"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:321
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:322
msgctxt "@label"
msgid "Top / Bottom"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:325
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:326
msgctxt "@label"
msgid "Inner Wall"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:383
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:384
msgctxt "@label"
msgid "min"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:432
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:433
msgctxt "@label"
msgid "max"
msgstr ""
@@ -2596,31 +2536,26 @@ msgctxt "@info:tooltip"
msgid "Change active post-processing scripts"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:16
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:17
msgctxt "@title:window"
msgid "More information on anonymous data collection"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:66
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:74
msgctxt "@text:window"
msgid ""
-"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."
+"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:"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:109
msgctxt "@text:window"
-msgid "I don't want to send this data"
+msgid "I don't want to send anonymous data"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:118
msgctxt "@text:window"
-msgid "Allow sending this data to Ultimaker and help us improve Cura"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/R2D2/EvaluationSidebar.qml:49
-msgctxt "@label"
-msgid "No print selected"
+msgid "Allow sending anonymous data"
msgstr ""
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
@@ -2671,15 +2606,10 @@ msgstr ""
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126
msgctxt "@info:tooltip"
msgid ""
-"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."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
-msgctxt "@item:inlistbox"
-msgid "Lighter is higher"
+"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."
msgstr ""
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
@@ -2687,6 +2617,11 @@ msgctxt "@item:inlistbox"
msgid "Darker is higher"
msgstr ""
+#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
+msgctxt "@item:inlistbox"
+msgid "Lighter is higher"
+msgstr ""
+
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149
msgctxt "@info:tooltip"
msgid "The amount of smoothing to apply to the image."
@@ -2800,7 +2735,7 @@ msgid "Printer Group"
msgstr ""
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:180
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:197
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:226
msgctxt "@action:label"
msgid "Profile settings"
msgstr ""
@@ -2813,19 +2748,19 @@ msgstr ""
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:121
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:221
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:250
msgctxt "@action:label"
msgid "Name"
msgstr ""
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:231
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:205
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:234
msgctxt "@action:label"
msgid "Not in profile"
msgstr ""
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:236
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:210
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:239
msgctxt "@action:label"
msgid "%1 override"
msgid_plural "%1 overrides"
@@ -2910,6 +2845,7 @@ msgstr ""
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:51
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:68
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:138
msgctxt "@button"
msgid "Sign in"
msgstr ""
@@ -3002,22 +2938,23 @@ msgid "Previous"
msgstr ""
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:60
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:152
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:174
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:159
msgctxt "@action:button"
msgid "Export"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:62
-msgctxt "@action:button"
-msgid "Next"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:169
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:209
msgctxt "@label"
msgid "Tip"
msgstr ""
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMaterialMenu.qml:20
+#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:66
+msgctxt "@label:category menu label"
+msgid "Generic"
+msgstr ""
+
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:160
msgctxt "@label"
msgid "Print experiment"
@@ -3028,28 +2965,22 @@ msgctxt "@label"
msgid "Checklist"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25
-msgctxt "@title"
-msgid "Select Printer Upgrades"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:38
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:30
msgctxt "@label"
msgid "Please select any upgrades made to this Ultimaker 2."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:47
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:44
msgctxt "@label"
msgid "Olsson Block"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:30
msgctxt "@title"
msgid "Build Plate Leveling"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:44
msgctxt "@label"
msgid ""
"To make sure your prints will come out great, you can now adjust your "
@@ -3057,7 +2988,7 @@ msgid ""
"the different positions that can be adjusted."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:57
msgctxt "@label"
msgid ""
"For every position; insert a piece of paper under the nozzle and adjust the "
@@ -3065,121 +2996,26 @@ msgid ""
"paper is slightly gripped by the tip of the nozzle."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:75
msgctxt "@action:button"
msgid "Start Build Plate Leveling"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:87
msgctxt "@action:button"
msgid "Move to Next Position"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:30
msgctxt "@label"
msgid "Please select any upgrades made to this Ultimaker Original"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:41
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"
@@ -3230,174 +3066,174 @@ msgctxt "@label"
msgid "Are you sure you want to abort the print?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:71
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:73
msgctxt "@title"
msgid "Information"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:100
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:102
msgctxt "@title:window"
msgid "Confirm Diameter Change"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:101
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:103
msgctxt "@label (%1 is a number)"
msgid ""
"The new filament diameter is set to %1 mm, which is not compatible with the "
"current extruder. Do you wish to continue?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:133
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:127
msgctxt "@label"
msgid "Display Name"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:143
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:137
msgctxt "@label"
msgid "Brand"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:153
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:147
msgctxt "@label"
msgid "Material Type"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:162
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:157
msgctxt "@label"
msgid "Color"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:212
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:207
msgctxt "@label"
msgid "Properties"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:214
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:209
msgctxt "@label"
msgid "Density"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:229
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:224
msgctxt "@label"
msgid "Diameter"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:263
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:258
msgctxt "@label"
msgid "Filament Cost"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:280
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:275
msgctxt "@label"
msgid "Filament weight"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:298
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:293
msgctxt "@label"
msgid "Filament length"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:307
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:302
msgctxt "@label"
msgid "Cost per Meter"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:321
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:316
msgctxt "@label"
msgid "This material is linked to %1 and shares some of its properties."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:328
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:323
msgctxt "@label"
msgid "Unlink Material"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:339
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:334
msgctxt "@label"
msgid "Description"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:352
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:347
msgctxt "@label"
msgid "Adhesion Information"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:378
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:17
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:373
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label"
msgid "Print settings"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:84
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:72
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:99
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:40
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:73
msgctxt "@action:button"
msgid "Activate"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:101
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:117
msgctxt "@action:button"
msgid "Create"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:114
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:131
msgctxt "@action:button"
msgid "Duplicate"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:141
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:142
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:160
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:148
msgctxt "@action:button"
msgid "Import"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:203
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:223
msgctxt "@action:label"
msgid "Printer"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:262
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:246
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:287
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:253
msgctxt "@title:window"
msgid "Confirm Remove"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:263
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:247
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:254
msgctxt "@label (%1 is object name)"
msgid "Are you sure you wish to remove %1? This cannot be undone!"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:277
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:285
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:304
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:312
msgctxt "@title:window"
msgid "Import Material"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:286
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:313
msgctxt "@info:status Don't translate the XML tags or !"
msgid ""
"Could not import material %1: %2"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:317
msgctxt "@info:status Don't translate the XML tag !"
msgid "Successfully imported material %1"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:308
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:316
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:335
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:343
msgctxt "@title:window"
msgid "Export Material"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:320
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:347
msgctxt "@info:status Don't translate the XML tags and !"
msgid ""
"Failed to export material to %1: %2"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:326
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:353
msgctxt "@info:status Don't translate the XML tag !"
msgid "Successfully exported material to %1"
msgstr ""
@@ -3412,248 +3248,272 @@ msgctxt "@label:textbox"
msgid "Check all"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:47
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:48
msgctxt "@info:status"
msgid "Calculated"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:61
msgctxt "@title:column"
msgid "Setting"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:68
msgctxt "@title:column"
msgid "Profile"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:74
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75
msgctxt "@title:column"
msgid "Current"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:82
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:83
msgctxt "@title:column"
msgid "Unit"
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:15
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:354
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:410
msgctxt "@title:tab"
msgid "General"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:126
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:130
msgctxt "@label"
msgid "Interface"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:137
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:141
msgctxt "@label"
msgid "Language:"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:204
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:208
msgctxt "@label"
msgid "Currency:"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:217
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221
msgctxt "@label"
msgid "Theme:"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:273
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:277
msgctxt "@label"
msgid ""
"You will need to restart the application for these changes to have effect."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:294
msgctxt "@info:tooltip"
msgid "Slice automatically when changing settings."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:302
msgctxt "@option:check"
msgid "Slice automatically"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:312
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:316
msgctxt "@label"
msgid "Viewport behavior"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:324
msgctxt "@info:tooltip"
msgid ""
"Highlight unsupported areas of the model in red. Without support these areas "
"will not print properly."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:329
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:333
msgctxt "@option:check"
msgid "Display overhang"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:336
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341
msgctxt "@info:tooltip"
msgid ""
"Moves the camera so the model is in the center of the view when a model is "
"selected"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:346
msgctxt "@action:button"
msgid "Center camera when item is selected"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:350
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356
msgctxt "@info:tooltip"
msgid "Should the default zoom behavior of cura be inverted?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:355
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361
msgctxt "@action:button"
msgid "Invert the direction of camera zoom."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:365
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371
msgctxt "@info:tooltip"
msgid "Should zooming move in the direction of the mouse?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371
+msgctxt "@info:tooltip"
+msgid ""
+"Zooming towards the mouse is not supported in the orthogonal perspective."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:376
msgctxt "@action:button"
msgid "Zoom toward mouse direction"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:380
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402
msgctxt "@info:tooltip"
msgid ""
"Should models on the platform be moved so that they no longer intersect?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:385
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:407
msgctxt "@option:check"
msgid "Ensure models are kept apart"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:394
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416
msgctxt "@info:tooltip"
msgid "Should models on the platform be moved down to touch the build plate?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:421
msgctxt "@option:check"
msgid "Automatically drop models to the build plate"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:411
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433
msgctxt "@info:tooltip"
msgid "Show caution message in g-code reader."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:420
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:442
msgctxt "@option:check"
msgid "Caution message in g-code reader"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:428
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:450
msgctxt "@info:tooltip"
msgid "Should layer be forced into compatibility mode?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:455
msgctxt "@option:check"
msgid "Force layer view compatibility mode (restart required)"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:449
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:465
+msgctxt "@info:tooltip"
+msgid "What type of camera rendering should be used?"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:472
+msgctxt "@window:text"
+msgid "Camera rendering: "
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:483
+msgid "Perspective"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:484
+msgid "Orthogonal"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:515
msgctxt "@label"
msgid "Opening and saving files"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:456
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522
msgctxt "@info:tooltip"
msgid "Should models be scaled to the build volume if they are too large?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:461
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:527
msgctxt "@option:check"
msgid "Scale large models"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537
msgctxt "@info:tooltip"
msgid ""
"An model may appear extremely small if its unit is for example in meters "
"rather than millimeters. Should these models be scaled up?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:542
msgctxt "@option:check"
msgid "Scale extremely small models"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:486
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:552
msgctxt "@info:tooltip"
msgid "Should models be selected after they are loaded?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:491
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:557
msgctxt "@option:check"
msgid "Select models when loaded"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:567
msgctxt "@info:tooltip"
msgid ""
"Should a prefix based on the printer name be added to the print job name "
"automatically?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:506
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:572
msgctxt "@option:check"
msgid "Add machine prefix to job name"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:516
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582
msgctxt "@info:tooltip"
msgid "Should a summary be shown when saving a project file?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:586
msgctxt "@option:check"
msgid "Show summary dialog when saving project"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:530
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596
msgctxt "@info:tooltip"
msgid "Default behavior when opening a project file"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:538
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:604
msgctxt "@window:text"
msgid "Default behavior when opening a project file: "
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:552
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:618
msgctxt "@option:openProject"
msgid "Always ask me this"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:553
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:619
msgctxt "@option:openProject"
msgid "Always open as a project"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:554
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620
msgctxt "@option:openProject"
msgid "Always import models"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:590
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656
msgctxt "@info:tooltip"
msgid ""
"When you have made changes to a profile and switched to a different one, a "
@@ -3661,50 +3521,50 @@ msgid ""
"not, or you can choose a default behaviour and never show that dialog again."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:599
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:665
msgctxt "@label"
msgid "Profiles"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:604
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:670
msgctxt "@window:text"
msgid ""
"Default behavior for changed setting values when switching to a different "
"profile: "
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:618
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:684
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:157
msgctxt "@option:discardOrKeep"
msgid "Always ask me this"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:619
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685
msgctxt "@option:discardOrKeep"
msgid "Always discard changed settings"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:686
msgctxt "@option:discardOrKeep"
msgid "Always transfer changed settings to new profile"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:654
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:720
msgctxt "@label"
msgid "Privacy"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:661
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:727
msgctxt "@info:tooltip"
msgid "Should Cura check for updates when the program is started?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:666
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:732
msgctxt "@option:check"
msgid "Check for updates on start"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:676
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:742
msgctxt "@info:tooltip"
msgid ""
"Should anonymous data about your print be sent to Ultimaker? Note, no "
@@ -3712,132 +3572,134 @@ msgid ""
"stored."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:681
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:747
msgctxt "@option:check"
msgid "Send (anonymous) print information"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:690
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:756
msgctxt "@action:button"
msgid "More information"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:708
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:774
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:27
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ProfileMenu.qml:23
msgctxt "@label"
msgid "Experimental"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:715
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:781
msgctxt "@info:tooltip"
msgid "Use multi build plate functionality"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:720
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:786
msgctxt "@option:check"
msgid "Use multi build plate functionality (restart required)"
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:16
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:359
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:415
msgctxt "@title:tab"
msgid "Printers"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:129
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:63
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:134
msgctxt "@action:button"
msgid "Rename"
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:36
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:363
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:419
msgctxt "@title:tab"
msgid "Profiles"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:87
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:89
msgctxt "@label"
msgid "Create"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:105
msgctxt "@label"
msgid "Duplicate"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:174
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:181
msgctxt "@title:window"
msgid "Create Profile"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:183
msgctxt "@info"
msgid "Please provide a name for this profile."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:239
msgctxt "@title:window"
msgid "Duplicate Profile"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:263
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:270
msgctxt "@title:window"
msgid "Rename Profile"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:276
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:283
msgctxt "@title:window"
msgid "Import Profile"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:302
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:309
msgctxt "@title:window"
msgid "Export Profile"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:357
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:364
msgctxt "@label %1 is printer name"
msgid "Printer: %1"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:420
msgctxt "@label"
msgid "Default profiles"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:420
msgctxt "@label"
msgid "Custom profiles"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:490
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:500
msgctxt "@action:button"
msgid "Update profile with current settings/overrides"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:497
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:507
msgctxt "@action:button"
msgid "Discard current changes"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:514
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:524
msgctxt "@action:label"
msgid ""
"This profile uses the defaults specified by the printer, so it has no "
"settings/overrides in the list below."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:521
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:531
msgctxt "@action:label"
msgid "Your current settings match the selected profile."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:540
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:550
msgctxt "@title:tab"
msgid "Global Settings"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:89
msgctxt "@action:button"
msgid "Marketplace"
msgstr ""
@@ -3880,12 +3742,12 @@ msgctxt "@title:menu menubar:toplevel"
msgid "&Help"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:123
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:124
msgctxt "@title:window"
msgid "New project"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:124
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:125
msgctxt "@info:question"
msgid ""
"Are you sure you want to start a new project? This will clear the build "
@@ -3902,33 +3764,33 @@ msgctxt "@label:textbox"
msgid "search settings"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:466
msgctxt "@action:menu"
msgid "Copy value to all extruders"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:474
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:475
msgctxt "@action:menu"
msgid "Copy all changed values to all extruders"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512
msgctxt "@action:menu"
msgid "Hide this setting"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:529
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:525
msgctxt "@action:menu"
msgid "Don't show this setting"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:533
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:529
msgctxt "@action:menu"
msgid "Keep this setting visible"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:557
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:548
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:434
msgctxt "@action:menu"
msgid "Configure setting visibility..."
msgstr ""
@@ -3942,29 +3804,36 @@ msgid ""
"Click to make these settings visible."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:81
+msgctxt "@label"
+msgid ""
+"This setting is not used because all the settings that it influences are "
+"overridden."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:86
msgctxt "@label Header for list of settings."
msgid "Affects"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:71
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:91
msgctxt "@label Header for list of settings."
msgid "Affected By"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:166
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186
msgctxt "@label"
msgid ""
"This setting is always shared between all extruders. Changing it here will "
"change the value for all extruders."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:170
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190
msgctxt "@label"
msgid "The value is resolved from per-extruder values "
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:208
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:228
msgctxt "@label"
msgid ""
"This setting has a value that is different from the profile.\n"
@@ -3972,7 +3841,7 @@ msgid ""
"Click to restore the value of the profile."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:302
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:322
msgctxt "@label"
msgid ""
"This setting is normally calculated, but it currently has an absolute value "
@@ -3981,12 +3850,12 @@ msgid ""
"Click to restore the calculated value."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:144
msgctxt "@button"
msgid "Recommended"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:158
msgctxt "@button"
msgid "Custom"
msgstr ""
@@ -4002,32 +3871,24 @@ msgid ""
"Gradual infill will gradually increase the amount of infill towards the top."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:30
msgctxt "@label"
msgid "Support"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:71
msgctxt "@label"
msgid ""
"Generate structures to support parts of the model which have overhangs. "
"Without these structures, such parts would collapse during printing."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:136
-msgctxt "@label"
-msgid ""
-"Select which extruder to use for support. This will build up supporting "
-"structures below the model to prevent the model from sagging or printing in "
-"mid air."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:29
msgctxt "@label"
msgid "Adhesion"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:74
msgctxt "@label"
msgid ""
"Enable printing a brim or raft. This will add a flat area around or under "
@@ -4050,7 +3911,7 @@ msgstr ""
msgctxt "@tooltip"
msgid ""
"This quality profile is not available for your current material and nozzle "
-"configuration. Please change these to enable this quality profile"
+"configuration. Please change these to enable this quality profile."
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
@@ -4084,9 +3945,9 @@ msgid ""
"Click to open the profile manager."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:21
msgctxt "@label shown when we load a Gcode file"
-msgid "Print setup disabled. G code file can not be modified."
+msgid "Print setup disabled. G-code file can not be modified."
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
@@ -4119,7 +3980,7 @@ msgctxt "@label"
msgid "Send G-code"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:364
+#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:365
msgctxt "@tooltip of G-code command input"
msgid ""
"Send a custom G-code command to the connected printer. Press 'enter' to send "
@@ -4228,11 +4089,6 @@ msgctxt "@label:category menu label"
msgid "Favorites"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:66
-msgctxt "@label:category menu label"
-msgid "Generic"
-msgstr ""
-
#: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25
msgctxt "@label:category menu label"
msgid "Network enabled printers"
@@ -4248,32 +4104,32 @@ msgctxt "@title:menu menubar:settings"
msgid "&Printer"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:26
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:32
msgctxt "@title:menu"
msgid "&Material"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:35
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:41
msgctxt "@action:inmenu"
msgid "Set as Active Extruder"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:41
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:47
msgctxt "@action:inmenu"
msgid "Enable Extruder"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:48
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:54
msgctxt "@action:inmenu"
msgid "Disable Extruder"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:62
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:68
msgctxt "@title:menu"
msgid "&Build plate"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:65
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:71
msgctxt "@title:settings"
msgid "&Profile"
msgstr ""
@@ -4283,7 +4139,22 @@ msgctxt "@action:inmenu menubar:view"
msgid "&Camera position"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:35
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:44
+msgctxt "@action:inmenu menubar:view"
+msgid "Camera view"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:47
+msgctxt "@action:inmenu menubar:view"
+msgid "Perspective"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:59
+msgctxt "@action:inmenu menubar:view"
+msgid "Orthographic"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:80
msgctxt "@action:inmenu menubar:view"
msgid "&Build plate"
msgstr ""
@@ -4347,12 +4218,7 @@ msgctxt "@label"
msgid "Select configuration"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
-msgctxt "@label"
-msgid "See the material compatibility chart"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:221
msgctxt "@label"
msgid "Configurations"
msgstr ""
@@ -4378,17 +4244,17 @@ msgctxt "@label"
msgid "Printer"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:213
msgctxt "@label"
msgid "Enabled"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:250
msgctxt "@label"
msgid "Material"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:375
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
msgstr ""
@@ -4410,42 +4276,47 @@ msgctxt "@title:menu menubar:file"
msgid "Open &Recent"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:145
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:140
msgctxt "@label"
msgid "Active print"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:153
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:148
msgctxt "@label"
msgid "Job Name"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:161
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:156
msgctxt "@label"
msgid "Printing Time"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:169
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:164
msgctxt "@label"
msgid "Estimated time left"
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
-msgid "View types"
+msgid "View type"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
+#: /home/ruben/Projects/Cura/resources/qml/ObjectSelector.qml:59
msgctxt "@label"
-msgid "Hi "
+msgid "Object list"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:22
+msgctxt "@label The argument is a username."
+msgid "Hi %1"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:33
msgctxt "@button"
msgid "Ultimaker account"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:42
msgctxt "@button"
msgid "Sign out"
msgstr ""
@@ -4455,11 +4326,6 @@ msgctxt "@action:button"
msgid "Sign in"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
-msgctxt "@label"
-msgid "Ultimaker Cloud"
-msgstr ""
-
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
@@ -4470,7 +4336,7 @@ msgctxt "@text"
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"
+"- Get exclusive access to print profiles from leading brands"
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
@@ -4483,49 +4349,54 @@ msgctxt "@label"
msgid "No time estimation available"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:77
msgctxt "@label"
msgid "No cost estimation available"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:127
msgctxt "@button"
msgid "Preview"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:55
msgctxt "@label:PrintjobStatus"
msgid "Slicing..."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:61
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:67
msgctxt "@label:PrintjobStatus"
-msgid "Unable to Slice"
+msgid "Unable to slice"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:103
+msgctxt "@button"
+msgid "Processing"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:103
msgctxt "@button"
msgid "Slice"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:104
msgctxt "@label"
msgid "Start the slicing process"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:118
msgctxt "@button"
msgid "Cancel"
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
-msgid "Time specification"
+msgid "Time estimation"
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
-msgid "Material specification"
+msgid "Material estimation"
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
@@ -4548,275 +4419,285 @@ msgctxt "@label"
msgid "Preset printers"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
+#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:166
msgctxt "@button"
msgid "Add printer"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
+#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:182
msgctxt "@button"
msgid "Manage printers"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:81
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:88
msgctxt "@action:inmenu"
msgid "Toggle Full Screen"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:92
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96
+msgctxt "@action:inmenu"
+msgid "Exit Full Screen"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:103
msgctxt "@action:inmenu menubar:edit"
msgid "&Undo"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:113
msgctxt "@action:inmenu menubar:edit"
msgid "&Redo"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:112
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:123
msgctxt "@action:inmenu menubar:file"
msgid "&Quit"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:120
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:131
msgctxt "@action:inmenu menubar:view"
msgid "3D View"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138
msgctxt "@action:inmenu menubar:view"
msgid "Front View"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:145
msgctxt "@action:inmenu menubar:view"
msgid "Top View"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:141
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:152
msgctxt "@action:inmenu menubar:view"
msgid "Left Side View"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:148
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:159
msgctxt "@action:inmenu menubar:view"
msgid "Right Side View"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:155
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:166
msgctxt "@action:inmenu"
msgid "Configure Cura..."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:173
msgctxt "@action:inmenu menubar:printer"
msgid "&Add Printer..."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179
msgctxt "@action:inmenu menubar:printer"
msgid "Manage Pr&inters..."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186
msgctxt "@action:inmenu"
msgid "Manage Materials..."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:184
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:195
msgctxt "@action:inmenu menubar:profile"
msgid "&Update profile with current settings/overrides"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:192
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203
msgctxt "@action:inmenu menubar:profile"
msgid "&Discard current changes"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:204
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:215
msgctxt "@action:inmenu menubar:profile"
msgid "&Create profile from current settings/overrides..."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:221
msgctxt "@action:inmenu menubar:profile"
msgid "Manage Profiles..."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:229
msgctxt "@action:inmenu menubar:help"
msgid "Show Online &Documentation"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:237
msgctxt "@action:inmenu menubar:help"
msgid "Report a &Bug"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:245
+msgctxt "@action:inmenu menubar:help"
+msgid "What's New"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:251
msgctxt "@action:inmenu menubar:help"
msgid "About..."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:241
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258
msgctxt "@action:inmenu menubar:edit"
msgid "Delete Selected Model"
msgid_plural "Delete Selected Models"
msgstr[0] ""
msgstr[1] ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:251
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:268
msgctxt "@action:inmenu menubar:edit"
msgid "Center Selected Model"
msgid_plural "Center Selected Models"
msgstr[0] ""
msgstr[1] ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277
msgctxt "@action:inmenu menubar:edit"
msgid "Multiply Selected Model"
msgid_plural "Multiply Selected Models"
msgstr[0] ""
msgstr[1] ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:286
msgctxt "@action:inmenu"
msgid "Delete Model"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294
msgctxt "@action:inmenu"
msgid "Ce&nter Model on Platform"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:283
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:300
msgctxt "@action:inmenu menubar:edit"
msgid "&Group Models"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:303
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:320
msgctxt "@action:inmenu menubar:edit"
msgid "Ungroup Models"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:313
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:330
msgctxt "@action:inmenu menubar:edit"
msgid "&Merge Models"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:340
msgctxt "@action:inmenu"
msgid "&Multiply Model..."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:330
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:347
msgctxt "@action:inmenu menubar:edit"
msgid "Select All Models"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:340
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:357
msgctxt "@action:inmenu menubar:edit"
msgid "Clear Build Plate"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:367
msgctxt "@action:inmenu menubar:file"
msgid "Reload All Models"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:359
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:376
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange All Models To All Build Plates"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:383
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange All Models"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:374
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:391
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange Selection"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:381
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:398
msgctxt "@action:inmenu menubar:edit"
msgid "Reset All Model Positions"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:388
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:405
msgctxt "@action:inmenu menubar:edit"
msgid "Reset All Model Transformations"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:412
msgctxt "@action:inmenu menubar:file"
msgid "&Open File(s)..."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:403
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:420
msgctxt "@action:inmenu menubar:file"
msgid "&New Project..."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:427
msgctxt "@action:inmenu menubar:help"
msgid "Show Configuration Folder"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:441
msgctxt "@action:menu"
msgid "&Marketplace"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:24
msgctxt "@title:window"
msgid "Ultimaker Cura"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:181
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232
msgctxt "@label"
msgid "This package will be installed after restarting."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:357
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:413
msgctxt "@title:tab"
msgid "Settings"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:486
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:539
msgctxt "@title:window"
msgid "Closing Cura"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:487
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:499
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:540
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:552
msgctxt "@label"
msgid "Are you sure you want to exit Cura?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:531
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:590
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:19
msgctxt "@title:window"
msgid "Open file(s)"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:632
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:691
msgctxt "@window:title"
msgid "Install Package"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:640
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:699
msgctxt "@title:window"
msgid "Open File(s)"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:643
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:702
msgctxt "@text:window"
msgid ""
"We have found one or more G-Code files within the files you have selected. "
@@ -4824,12 +4705,16 @@ msgid ""
"file, please just select only one."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:713
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:18
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:805
msgctxt "@title:window"
msgid "Add Printer"
msgstr ""
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:813
+msgctxt "@title:window"
+msgid "What's New"
+msgstr ""
+
#: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16
msgctxt "@label %1 is filled in with the name of an extruder"
msgid "Print Selected Model with %1"
@@ -4889,36 +4774,6 @@ msgctxt "@action:button"
msgid "Create New Profile"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
-msgctxt "@title:tab"
-msgid "Add a printer to Cura"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
-msgctxt "@title:tab"
-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 ""
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:249
-msgctxt "@label"
-msgid "Manufacturer"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
-msgctxt "@label"
-msgid "Printer Name"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
-msgctxt "@action:button"
-msgid "Add Printer"
-msgstr ""
-
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:15
msgctxt "@title:window"
msgid "About Cura"
@@ -5079,27 +4934,32 @@ msgctxt "@title:window"
msgid "Save Project"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:138
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:149
msgctxt "@action:label"
msgid "Build plate"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:170
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:183
msgctxt "@action:label"
msgid "Extruder %1"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:180
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:198
msgctxt "@action:label"
msgid "%1 & material"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:243
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:200
+msgctxt "@action:label"
+msgid "Material"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:272
msgctxt "@action:label"
msgid "Don't show project summary on save again"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:262
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:291
msgctxt "@action:button"
msgid "Save"
msgstr ""
@@ -5131,28 +4991,757 @@ msgctxt "@action:button"
msgid "Import models"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:210
-msgctxt "@option:check"
-msgid "See only current build plate"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DropDownWidget.qml:93
+msgctxt "@label"
+msgid "Empty"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:226
-msgctxt "@action:button"
-msgid "Arrange to all build plates"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:24
+msgctxt "@label"
+msgid "Add a printer"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:246
-msgctxt "@action:button"
-msgid "Arrange current build plate"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:39
+msgctxt "@label"
+msgid "Add a networked printer"
msgstr ""
-#: X3GWriter/plugin.json
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:81
+msgctxt "@label"
+msgid "Add a non-networked printer"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:70
+msgctxt "@label"
+msgid "Add printer by IP address"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:133
+msgctxt "@text"
+msgid "Place enter your printer's IP address."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:158
+msgctxt "@button"
+msgid "Add"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:204
+msgctxt "@label"
+msgid "Could not connect to device."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:208
+msgctxt "@label"
+msgid "The printer at this address has not responded yet."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:240
+msgctxt "@label"
+msgid ""
+"This printer cannot be added because it's an unknown printer or it's not the "
+"host of a group."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:329
+msgctxt "@button"
+msgid "Back"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:342
+msgctxt "@button"
+msgid "Connect"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/FirstStartMachineActionsContent.qml:77
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:123
+msgctxt "@button"
+msgid "Next"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:23
+msgctxt "@label"
+msgid "User Agreement"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:56
+msgctxt "@button"
+msgid "Agree"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:70
+msgctxt "@button"
+msgid "Decline and close"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:24
+msgctxt "@label"
+msgid "Help us to improve Ultimaker Cura"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:57
+msgctxt "@text"
+msgid ""
+"Ultimaker Cura collects anonymous data to improve print quality and user "
+"experience, including:"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:71
+msgctxt "@text"
+msgid "Machine types"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:77
+msgctxt "@text"
+msgid "Material usage"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:83
+msgctxt "@text"
+msgid "Number of slices"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:89
+msgctxt "@text"
+msgid "Print settings"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:102
+msgctxt "@text"
+msgid ""
+"Data collected by Ultimaker Cura will not contain any personal information."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:103
+msgctxt "@text"
+msgid "More information"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WhatsNewContent.qml:24
+msgctxt "@label"
+msgid "What's new in Ultimaker Cura"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:42
+msgctxt "@label"
+msgid "There is no printer found over your network."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:179
+msgctxt "@label"
+msgid "Refresh"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:190
+msgctxt "@label"
+msgid "Add printer by IP"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:223
+msgctxt "@label"
+msgid "Troubleshooting"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:207
+msgctxt "@label"
+msgid "Printer name"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:220
+msgctxt "@text"
+msgid "Please give your printer a name"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:36
+msgctxt "@label"
+msgid "Ultimaker Cloud"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:77
+msgctxt "@text"
+msgid "The next generation 3D printing workflow"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:94
+msgctxt "@text"
+msgid "- Send print jobs to Ultimaker printers outside your local network"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:97
+msgctxt "@text"
+msgid "- Store your Ultimaker Cura settings in the cloud for use anywhere"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:100
+msgctxt "@text"
+msgid "- Get exclusive access to print profiles from leading brands"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:119
+msgctxt "@button"
+msgid "Finish"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:128
+msgctxt "@button"
+msgid "Create an account"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:29
+msgctxt "@label"
+msgid "Welcome to Ultimaker Cura"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:47
+msgctxt "@text"
+msgid ""
+"Please follow these steps to set up\n"
+"Ultimaker Cura. This will only take a few moments."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:58
+msgctxt "@button"
+msgid "Get started"
+msgstr ""
+
+#: MachineSettingsAction/plugin.json
msgctxt "description"
-msgid "Allows saving the resulting slice as an X3G file, to support printers that read this format (Malyan, Makerbot and other Sailfish-based printers)."
+msgid ""
+"Provides a way to change machine settings (such as build volume, nozzle "
+"size, etc.)."
msgstr ""
-#: X3GWriter/plugin.json
+#: MachineSettingsAction/plugin.json
msgctxt "name"
-msgid "X3GWriter"
+msgid "Machine Settings action"
msgstr ""
+#: Toolbox/plugin.json
+msgctxt "description"
+msgid "Find, manage and install new Cura packages."
+msgstr ""
+
+#: Toolbox/plugin.json
+msgctxt "name"
+msgid "Toolbox"
+msgstr ""
+
+#: XRayView/plugin.json
+msgctxt "description"
+msgid "Provides the X-Ray view."
+msgstr ""
+
+#: XRayView/plugin.json
+msgctxt "name"
+msgid "X-Ray View"
+msgstr ""
+
+#: X3DReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading X3D files."
+msgstr ""
+
+#: X3DReader/plugin.json
+msgctxt "name"
+msgid "X3D Reader"
+msgstr ""
+
+#: GCodeWriter/plugin.json
+msgctxt "description"
+msgid "Writes g-code to a file."
+msgstr ""
+
+#: GCodeWriter/plugin.json
+msgctxt "name"
+msgid "G-code Writer"
+msgstr ""
+
+#: ModelChecker/plugin.json
+msgctxt "description"
+msgid ""
+"Checks models and print configuration for possible printing issues and give "
+"suggestions."
+msgstr ""
+
+#: ModelChecker/plugin.json
+msgctxt "name"
+msgid "Model Checker"
+msgstr ""
+
+#: cura-god-mode-plugin/src/GodMode/plugin.json
+msgctxt "description"
+msgid "Dump the contents of all settings to a HTML file."
+msgstr ""
+
+#: cura-god-mode-plugin/src/GodMode/plugin.json
+msgctxt "name"
+msgid "God Mode"
+msgstr ""
+
+#: FirmwareUpdater/plugin.json
+msgctxt "description"
+msgid "Provides a machine actions for updating firmware."
+msgstr ""
+
+#: FirmwareUpdater/plugin.json
+msgctxt "name"
+msgid "Firmware Updater"
+msgstr ""
+
+#: ProfileFlattener/plugin.json
+msgctxt "description"
+msgid "Create a flattened quality changes profile."
+msgstr ""
+
+#: ProfileFlattener/plugin.json
+msgctxt "name"
+msgid "Profile Flattener"
+msgstr ""
+
+#: AMFReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading AMF files."
+msgstr ""
+
+#: AMFReader/plugin.json
+msgctxt "name"
+msgid "AMF Reader"
+msgstr ""
+
+#: USBPrinting/plugin.json
+msgctxt "description"
+msgid ""
+"Accepts G-Code and sends them to a printer. Plugin can also update firmware."
+msgstr ""
+
+#: USBPrinting/plugin.json
+msgctxt "name"
+msgid "USB printing"
+msgstr ""
+
+#: GCodeGzWriter/plugin.json
+msgctxt "description"
+msgid "Writes g-code to a compressed archive."
+msgstr ""
+
+#: GCodeGzWriter/plugin.json
+msgctxt "name"
+msgid "Compressed G-code Writer"
+msgstr ""
+
+#: UFPWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for writing Ultimaker Format Packages."
+msgstr ""
+
+#: UFPWriter/plugin.json
+msgctxt "name"
+msgid "UFP Writer"
+msgstr ""
+
+#: PrepareStage/plugin.json
+msgctxt "description"
+msgid "Provides a prepare stage in Cura."
+msgstr ""
+
+#: PrepareStage/plugin.json
+msgctxt "name"
+msgid "Prepare Stage"
+msgstr ""
+
+#: RemovableDriveOutputDevice/plugin.json
+msgctxt "description"
+msgid "Provides removable drive hotplugging and writing support."
+msgstr ""
+
+#: RemovableDriveOutputDevice/plugin.json
+msgctxt "name"
+msgid "Removable Drive Output Device Plugin"
+msgstr ""
+
+#: UM3NetworkPrinting/plugin.json
+msgctxt "description"
+msgid "Manages network connections to Ultimaker 3 printers."
+msgstr ""
+
+#: UM3NetworkPrinting/plugin.json
+msgctxt "name"
+msgid "UM3 Network Connection"
+msgstr ""
+
+#: SettingsGuide/plugin.json
+msgctxt "description"
+msgid ""
+"Provides extra information and explanations about settings in Cura, with "
+"images and animations."
+msgstr ""
+
+#: SettingsGuide/plugin.json
+msgctxt "name"
+msgid "Settings Guide"
+msgstr ""
+
+#: MonitorStage/plugin.json
+msgctxt "description"
+msgid "Provides a monitor stage in Cura."
+msgstr ""
+
+#: MonitorStage/plugin.json
+msgctxt "name"
+msgid "Monitor Stage"
+msgstr ""
+
+#: FirmwareUpdateChecker/plugin.json
+msgctxt "description"
+msgid "Checks for firmware updates."
+msgstr ""
+
+#: FirmwareUpdateChecker/plugin.json
+msgctxt "name"
+msgid "Firmware Update Checker"
+msgstr ""
+
+#: SimulationView/plugin.json
+msgctxt "description"
+msgid "Provides the Simulation view."
+msgstr ""
+
+#: SimulationView/plugin.json
+msgctxt "name"
+msgid "Simulation View"
+msgstr ""
+
+#: GCodeGzReader/plugin.json
+msgctxt "description"
+msgid "Reads g-code from a compressed archive."
+msgstr ""
+
+#: GCodeGzReader/plugin.json
+msgctxt "name"
+msgid "Compressed G-code Reader"
+msgstr ""
+
+#: PostProcessingPlugin/plugin.json
+msgctxt "description"
+msgid "Extension that allows for user created scripts for post processing"
+msgstr ""
+
+#: PostProcessingPlugin/plugin.json
+msgctxt "name"
+msgid "Post Processing"
+msgstr ""
+
+#: SupportEraser/plugin.json
+msgctxt "description"
+msgid ""
+"Creates an eraser mesh to block the printing of support in certain places"
+msgstr ""
+
+#: SupportEraser/plugin.json
+msgctxt "name"
+msgid "Support Eraser"
+msgstr ""
+
+#: UFPReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading Ultimaker Format Packages."
+msgstr ""
+
+#: UFPReader/plugin.json
+msgctxt "name"
+msgid "UFP Reader"
+msgstr ""
+
+#: SliceInfoPlugin/plugin.json
+msgctxt "description"
+msgid "Submits anonymous slice info. Can be disabled through preferences."
+msgstr ""
+
+#: SliceInfoPlugin/plugin.json
+msgctxt "name"
+msgid "Slice info"
+msgstr ""
+
+#: XmlMaterialProfile/plugin.json
+msgctxt "description"
+msgid "Provides capabilities to read and write XML-based material profiles."
+msgstr ""
+
+#: XmlMaterialProfile/plugin.json
+msgctxt "name"
+msgid "Material Profiles"
+msgstr ""
+
+#: LegacyProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing profiles from legacy Cura versions."
+msgstr ""
+
+#: LegacyProfileReader/plugin.json
+msgctxt "name"
+msgid "Legacy Cura Profile Reader"
+msgstr ""
+
+#: GCodeProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing profiles from g-code files."
+msgstr ""
+
+#: GCodeProfileReader/plugin.json
+msgctxt "name"
+msgid "G-code Profile Reader"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade32to33/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.2 to Cura 3.3."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade32to33/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.2 to 3.3"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade33to34/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.3 to Cura 3.4."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade33to34/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.3 to 3.4"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade25to26/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade25to26/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.5 to 2.6"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade27to30/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade27to30/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.7 to 3.0"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade35to40/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.5 to Cura 4.0."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade35to40/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.5 to 4.0"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade34to35/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.4 to Cura 3.5."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade34to35/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.4 to 3.5"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade40to41/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 4.0 to Cura 4.1."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade40to41/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 4.0 to 4.1"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade30to31/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.0 to Cura 3.1."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade30to31/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.0 to 3.1"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade41to42/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 4.1 to Cura 4.2."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade41to42/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 4.1 to 4.2"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade26to27/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade26to27/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.6 to 2.7"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade21to22/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade21to22/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.1 to 2.2"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade22to24/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade22to24/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.2 to 2.4"
+msgstr ""
+
+#: ImageReader/plugin.json
+msgctxt "description"
+msgid "Enables ability to generate printable geometry from 2D image files."
+msgstr ""
+
+#: ImageReader/plugin.json
+msgctxt "name"
+msgid "Image Reader"
+msgstr ""
+
+#: CuraEngineBackend/plugin.json
+msgctxt "description"
+msgid "Provides the link to the CuraEngine slicing backend."
+msgstr ""
+
+#: CuraEngineBackend/plugin.json
+msgctxt "name"
+msgid "CuraEngine Backend"
+msgstr ""
+
+#: PerObjectSettingsTool/plugin.json
+msgctxt "description"
+msgid "Provides the Per Model Settings."
+msgstr ""
+
+#: PerObjectSettingsTool/plugin.json
+msgctxt "name"
+msgid "Per Model Settings Tool"
+msgstr ""
+
+#: 3MFReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading 3MF files."
+msgstr ""
+
+#: 3MFReader/plugin.json
+msgctxt "name"
+msgid "3MF Reader"
+msgstr ""
+
+#: SolidView/plugin.json
+msgctxt "description"
+msgid "Provides a normal solid mesh view."
+msgstr ""
+
+#: SolidView/plugin.json
+msgctxt "name"
+msgid "Solid View"
+msgstr ""
+
+#: GCodeReader/plugin.json
+msgctxt "description"
+msgid "Allows loading and displaying G-code files."
+msgstr ""
+
+#: GCodeReader/plugin.json
+msgctxt "name"
+msgid "G-code Reader"
+msgstr ""
+
+#: CuraDrive/plugin.json
+msgctxt "description"
+msgid "Backup and restore your configuration."
+msgstr ""
+
+#: CuraDrive/plugin.json
+msgctxt "name"
+msgid "Cura Backups"
+msgstr ""
+
+#: CuraProfileWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for exporting Cura profiles."
+msgstr ""
+
+#: CuraProfileWriter/plugin.json
+msgctxt "name"
+msgid "Cura Profile Writer"
+msgstr ""
+
+#: CuraPrintProfileCreator/plugin.json
+msgctxt "description"
+msgid ""
+"Allows material manufacturers to create new material and quality profiles "
+"using a drop-in UI."
+msgstr ""
+
+#: CuraPrintProfileCreator/plugin.json
+msgctxt "name"
+msgid "Print Profile Assistant"
+msgstr ""
+
+#: 3MFWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for writing 3MF files."
+msgstr ""
+
+#: 3MFWriter/plugin.json
+msgctxt "name"
+msgid "3MF Writer"
+msgstr ""
+
+#: PreviewStage/plugin.json
+msgctxt "description"
+msgid "Provides a preview stage in Cura."
+msgstr ""
+
+#: PreviewStage/plugin.json
+msgctxt "name"
+msgid "Preview Stage"
+msgstr ""
+
+#: UltimakerMachineActions/plugin.json
+msgctxt "description"
+msgid ""
+"Provides machine actions for Ultimaker machines (such as bed leveling "
+"wizard, selecting upgrades, etc.)."
+msgstr ""
+
+#: UltimakerMachineActions/plugin.json
+msgctxt "name"
+msgid "Ultimaker machine actions"
+msgstr ""
+
+#: CuraProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing Cura profiles."
+msgstr ""
+
+#: CuraProfileReader/plugin.json
+msgctxt "name"
+msgid "Cura Profile Reader"
+msgstr ""
diff --git a/resources/i18n/de_DE/cura.po b/resources/i18n/de_DE/cura.po
index 816f778f63..48c0d976b5 100644
--- a/resources/i18n/de_DE/cura.po
+++ b/resources/i18n/de_DE/cura.po
@@ -5,20 +5,20 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2019-03-13 14:00+0200\n"
-"Last-Translator: Bothof \n"
-"Language-Team: German\n"
+"POT-Creation-Date: 2019-07-16 14:38+0200\n"
+"PO-Revision-Date: 2019-07-29 15:51+0200\n"
+"Last-Translator: Lionbridge \n"
+"Language-Team: German , German \n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 2.0.6\n"
+"X-Generator: Poedit 2.2.3\n"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:27
msgctxt "@action"
msgid "Machine Settings"
msgstr "Geräteeinstellungen"
@@ -56,7 +56,7 @@ msgctxt "@info:title"
msgid "3D Model Assistant"
msgstr "3D-Modell-Assistent"
-#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:86
+#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:90
#, python-brace-format
msgctxt "@info:status"
msgid ""
@@ -64,17 +64,11 @@ msgid ""
"{model_names}
\n"
"Find out how to ensure the best possible print quality and reliability.
\n"
"View print quality guide
"
-msgstr "Ein oder mehrere 3D-Modelle können möglicherweise aufgrund der Modellgröße und Materialkonfiguration nicht optimal gedruckt werden:
\n{model_names}
\nErfahren Sie, wie Sie die bestmögliche Druckqualität und Zuverlässigkeit sicherstellen.
\nLeitfaden zu Druckqualität anzeigen
"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
-msgctxt "@item:inmenu"
-msgid "Changelog"
-msgstr "Änderungsprotokoll"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
-msgctxt "@item:inmenu"
-msgid "Show Changelog"
-msgstr "Änderungsprotokoll anzeigen"
+msgstr ""
+"Ein oder mehrere 3D-Modelle können möglicherweise aufgrund der Modellgröße und Materialkonfiguration nicht optimal gedruckt werden:
\n"
+"{model_names}
\n"
+"Erfahren Sie, wie Sie die bestmögliche Druckqualität und Zuverlässigkeit sicherstellen.
\n"
+"Leitfaden zu Druckqualität anzeigen
"
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py:25
msgctxt "@action"
@@ -91,37 +85,36 @@ msgctxt "@info:status"
msgid "Profile has been flattened & activated."
msgstr "Das Profil wurde geglättet und aktiviert."
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:33
+#: /home/ruben/Projects/Cura/plugins/AMFReader/__init__.py:15
+msgctxt "@item:inlistbox"
+msgid "AMF File"
+msgstr "AMF-Datei"
+
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:37
msgctxt "@item:inmenu"
msgid "USB printing"
msgstr "USB-Drucken"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:34
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:38
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print via USB"
msgstr "Über USB drucken"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:35
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:39
msgctxt "@info:tooltip"
msgid "Print via USB"
msgstr "Über USB drucken"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:71
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:75
msgctxt "@info:status"
msgid "Connected via USB"
msgstr "Über USB verbunden"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:96
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:100
msgctxt "@label"
msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?"
msgstr "Ein USB-Druck wird ausgeführt. Das Schließen von Cura beendet diesen Druck. Sind Sie sicher?"
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
-msgctxt "X3G Writer File Description"
-msgid "X3G File"
-msgstr "X3G-Datei"
-
#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/GPX-prefix/src/GPX/slicerplugins/cura15.06/X3gWriter/__init__.py:16
msgctxt "X3g Writer Plugin Description"
msgid "Writes X3g to files"
@@ -132,6 +125,11 @@ msgctxt "X3g Writer File Description"
msgid "X3g File"
msgstr "X3g-Datei"
+#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
+msgctxt "X3G Writer File Description"
+msgid "X3G File"
+msgstr "X3G-Datei"
+
#: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/__init__.py:17
#: /home/ruben/Projects/Cura/plugins/GCodeGzReader/__init__.py:17
msgctxt "@item:inlistbox"
@@ -144,6 +142,7 @@ msgid "GCodeGzWriter does not support text mode."
msgstr "GCodeWriter unterstützt keinen Textmodus."
#: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:28
+#: /home/ruben/Projects/Cura/plugins/UFPReader/__init__.py:22
msgctxt "@item:inlistbox"
msgid "Ultimaker Format Package"
msgstr "Ultimaker Format Package"
@@ -202,10 +201,10 @@ msgid "Could not save to removable drive {0}: {1}"
msgstr "Konnte nicht auf dem Wechseldatenträger gespeichert werden {0}: {1}"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:137
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:152
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:133
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:140
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1629
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:188
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:134
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:141
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1622
msgctxt "@info:title"
msgid "Error"
msgstr "Fehler"
@@ -234,9 +233,9 @@ msgstr "Wechseldatenträger auswerfen {0}"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:151
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:163
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1619
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1719
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1612
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1712
msgctxt "@info:title"
msgid "Warning"
msgstr "Warnhinweis"
@@ -263,266 +262,267 @@ msgctxt "@item:intext"
msgid "Removable Drive"
msgstr "Wechseldatenträger"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:74
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:93
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print over network"
msgstr "Drucken über Netzwerk"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:89
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:76
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:94
msgctxt "@properties:tooltip"
msgid "Print over network"
msgstr "Drücken über Netzwerk"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:95
msgctxt "@info:status"
msgid "Connected over the network."
msgstr "Über Netzwerk verbunden."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
msgctxt "@info:status"
msgid "Connected over the network. Please approve the access request on the printer."
msgstr "Über Netzwerk verbunden. Geben Sie die Zugriffsanforderung für den Drucker frei."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:93
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:100
msgctxt "@info:status"
msgid "Connected over the network. No access to control the printer."
msgstr "Über Netzwerk verbunden. Kein Zugriff auf die Druckerverwaltung."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
msgctxt "@info:status"
msgid "Access to the printer requested. Please approve the request on the printer"
msgstr "Zugriff auf Drucker erforderlich. Bestätigen Sie den Zugriff auf den Drucker"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:101
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
msgctxt "@info:title"
msgid "Authentication status"
msgstr "Authentifizierungsstatus"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:103
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:109
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:113
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:120
msgctxt "@info:title"
msgid "Authentication Status"
msgstr "Authentifizierungsstatus"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:104
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:187
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:111
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:198
msgctxt "@action:button"
msgid "Retry"
msgstr "Erneut versuchen"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
msgctxt "@info:tooltip"
msgid "Re-send the access request"
msgstr "Zugriffanforderung erneut senden"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:115
msgctxt "@info:status"
msgid "Access to the printer accepted"
msgstr "Zugriff auf den Drucker genehmigt"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:119
msgctxt "@info:status"
msgid "No access to print with this printer. Unable to send print job."
msgstr "Kein Zugriff auf das Drucken mit diesem Drucker. Druckauftrag kann nicht gesendet werden."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:114
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:121
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:65
msgctxt "@action:button"
msgid "Request Access"
msgstr "Zugriff anfordern"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:123
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:66
msgctxt "@info:tooltip"
msgid "Send access request to the printer"
msgstr "Zugriffsanforderung für den Drucker senden"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:201
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:208
msgctxt "@label"
msgid "Unable to start a new print job."
msgstr "Es kann kein neuer Druckauftrag gestartet werden."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:203
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:210
msgctxt "@label"
msgid "There is an issue with the configuration of your Ultimaker, which makes it impossible to start the print. Please resolve this issues before continuing."
msgstr "Es liegt ein Problem mit der Konfiguration Ihres Ultimaker vor, das den Druckstart verhindert. Lösen Sie dieses Problem bitte, bevor Sie fortfahren."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:209
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:231
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:216
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:238
msgctxt "@window:title"
msgid "Mismatched configuration"
msgstr "Konfiguration nicht übereinstimmend"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:230
msgctxt "@label"
msgid "Are you sure you wish to print with the selected configuration?"
msgstr "Möchten Sie wirklich mit der gewählten Konfiguration drucken?"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:225
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:232
msgctxt "@label"
msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer."
msgstr "Anforderungen zwischen der Druckerkonfiguration oder -kalibrierung und Cura stimmen nicht überein. Für optimale Ergebnisse schneiden Sie stets für die PrintCores und Materialien, die in Ihren Drucker eingelegt wurden."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:252
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:162
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:162
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:176
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:181
msgctxt "@info:status"
msgid "Sending new jobs (temporarily) blocked, still sending the previous print job."
msgstr "Das Senden neuer Aufträge ist (vorübergehend) blockiert; der vorherige Druckauftrag wird noch gesendet."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:180
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:197
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:266
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:194
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:211
msgctxt "@info:status"
msgid "Sending data to printer"
msgstr "Daten werden zum Drucker gesendet"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:260
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:182
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:199
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:267
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:196
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:213
msgctxt "@info:title"
msgid "Sending Data"
msgstr "Daten werden gesendet"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:261
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:200
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:268
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:214
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:18
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:19
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:81
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:395
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:410
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:20
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:38
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:143
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:58
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:149
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:391
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:254
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:283
msgctxt "@action:button"
msgid "Cancel"
msgstr "Abbrechen"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:324
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:331
#, python-brace-format
msgctxt "@info:status"
msgid "No Printcore loaded in slot {slot_number}"
msgstr "Kein PrintCore geladen in Steckplatz {slot_number}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:337
#, python-brace-format
msgctxt "@info:status"
msgid "No material loaded in slot {slot_number}"
msgstr "Kein Material geladen in Steckplatz {slot_number}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:353
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:360
#, python-brace-format
msgctxt "@label"
msgid "Different PrintCore (Cura: {cura_printcore_name}, Printer: {remote_printcore_name}) selected for extruder {extruder_id}"
msgstr "Abweichender PrintCore (Cura: {cura_printcore_name}, Printer: {remote_printcore_name}) für Extruder gewählt {extruder_id}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:362
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:369
#, python-brace-format
msgctxt "@label"
msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "Abweichendes Material (Cura: {0}, Drucker: {1}) für Extruder {2} gewählt"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:548
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:555
msgctxt "@window:title"
msgid "Sync with your printer"
msgstr "Synchronisieren Ihres Druckers"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:550
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:557
msgctxt "@label"
msgid "Would you like to use your current printer configuration in Cura?"
msgstr "Möchten Sie Ihre aktuelle Druckerkonfiguration in Cura verwenden?"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:552
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:559
msgctxt "@label"
msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer."
msgstr "Die PrintCores und/oder Materialien auf Ihrem Drucker unterscheiden sich von denen Ihres aktuellen Projekts. Für optimale Ergebnisse schneiden Sie stets für die PrintCores und Materialien, die in Ihren Drucker eingelegt wurden."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:96
msgctxt "@info:status"
msgid "Connected over the network"
msgstr "Über Netzwerk verbunden"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:275
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:342
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:370
msgctxt "@info:status"
msgid "Print job was successfully sent to the printer."
msgstr "Der Druckauftrag wurde erfolgreich an den Drucker gesendet."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:277
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:343
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:291
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:371
msgctxt "@info:title"
msgid "Data Sent"
msgstr "Daten gesendet"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:278
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:292
msgctxt "@action:button"
msgid "View in Monitor"
msgstr "In Monitor überwachen"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:390
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:290
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:411
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Printer '{printer_name}' has finished printing '{job_name}'."
msgstr "Drucker '{printer_name}' hat '{job_name}' vollständig gedrückt."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:392
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:294
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:413
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:322
#, python-brace-format
msgctxt "@info:status"
msgid "The print job '{job_name}' was finished."
msgstr "Der Druckauftrag '{job_name}' wurde ausgeführt."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:393
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:414
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:316
msgctxt "@info:status"
msgid "Print finished"
msgstr "Druck vollendet"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:573
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:595
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:629
msgctxt "@label:material"
msgid "Empty"
msgstr "Leer"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:596
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:630
msgctxt "@label:material"
msgid "Unknown"
msgstr "Unbekannt"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:169
msgctxt "@action:button"
msgid "Print via Cloud"
msgstr "Über Cloud drucken"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:170
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
msgstr "Über Cloud drucken"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:171
msgctxt "@info:status"
msgid "Connected via Cloud"
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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:182
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:359
msgctxt "@info:title"
msgid "Cloud error"
msgstr "Cloudfehler"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:199
msgctxt "@info:status"
msgid "Could not export print job."
msgstr "Druckauftrag konnte nicht exportiert werden."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:358
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
msgstr "Daten konnten nicht in Drucker geladen werden."
@@ -537,48 +537,52 @@ msgctxt "@info:status"
msgid "today"
msgstr "heute"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:187
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
msgstr "Es liegt ein Fehler beim Verbinden mit der Cloud vor."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
+msgctxt "@info:status"
+msgid "Sending Print Job"
+msgstr "Druckauftrag senden"
+
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
-msgid "Sending data to remote cluster"
-msgstr "Daten werden zu Remote-Cluster gesendet"
+msgid "Uploading via Ultimaker Cloud"
+msgstr "Über Ultimaker Cloud hochladen"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:621
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
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"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:627
+msgctxt "@info:status Ultimaker Cloud is a brand name and shouldn't be translated."
msgid "Connect to Ultimaker Cloud"
msgstr "Verbinden mit Ultimaker Cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:628
msgctxt "@action"
msgid "Don't ask me again for this printer."
-msgstr "Nicht mehr für diesen Drucker nachfragen"
+msgstr "Nicht mehr für diesen Drucker nachfragen."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:631
msgctxt "@action"
msgid "Get started"
msgstr "Erste Schritte"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:637
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:643
msgctxt "@info:status"
msgid "Connected!"
msgstr "Verbunden!"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:645
msgctxt "@action"
msgid "Review your connection"
msgstr "Ihre Verbindung überprüfen"
@@ -593,7 +597,7 @@ msgctxt "@item:inmenu"
msgid "Monitor"
msgstr "Überwachen"
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:124
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:118
msgctxt "@info"
msgid "Could not access update information."
msgstr "Zugriff auf Update-Informationen nicht möglich."
@@ -650,46 +654,11 @@ msgctxt "@info:tooltip"
msgid "Create a volume in which supports are not printed."
msgstr "Erstellt ein Volumen, in dem keine Stützstrukturen gedruckt werden."
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:52
-msgctxt "@info"
-msgid "Cura collects anonymized usage statistics."
-msgstr "Cura erfasst anonymisierte Nutzungsstatistiken."
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:55
-msgctxt "@info:title"
-msgid "Collecting Data"
-msgstr "Daten werden erfasst"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:57
-msgctxt "@action:button"
-msgid "More info"
-msgstr "Mehr Infos"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:58
-msgctxt "@action:tooltip"
-msgid "See more information on what data Cura sends."
-msgstr "Siehe mehr Informationen dazu, was Cura sendet."
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:60
-msgctxt "@action:button"
-msgid "Allow"
-msgstr "Zulassen"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:61
-msgctxt "@action:tooltip"
-msgid "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."
-msgstr "Damit lassen Sie zu, dass Cura anonymisierte Nutzungsstatistiken sendet, um zukünftige Verbesserungen für Cura zu definieren. Einige Ihrer Präferenzen und Einstellungen, die Cura-Version und ein Hash der Modelle, die Sie slicen, werden gesendet."
-
#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "Cura 15.04 profiles"
msgstr "Cura 15.04-Profile"
-#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
-msgctxt "@item:inmenu"
-msgid "Evaluation"
-msgstr "Bewertung"
-
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "JPG Image"
@@ -715,56 +684,56 @@ msgctxt "@item:inlistbox"
msgid "GIF Image"
msgstr "GIF-Bilddatei"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
msgctxt "@info:status"
msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration."
msgstr "Slicing mit dem aktuellen Material nicht möglich, da es mit der gewählten Maschine oder Konfiguration nicht kompatibel ist."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:389
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:398
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:407
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:416
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:362
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:386
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:395
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:404
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:413
msgctxt "@info:title"
msgid "Unable to slice"
msgstr "Slicing nicht möglich"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:364
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:361
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to slice with the current settings. The following settings have errors: {0}"
msgstr "Die aktuellen Einstellungen lassen kein Schneiden (Slicing) zu. Die folgenden Einstellungen sind fehlerhaft:{0}"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:388
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:385
#, 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 "Aufgrund der Pro-Modell-Einstellungen ist kein Schneiden (Slicing) möglich. Die folgenden Einstellungen sind für ein oder mehrere Modelle fehlerhaft: {error_labels}"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:397
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:394
msgctxt "@info:status"
msgid "Unable to slice because the prime tower or prime position(s) are invalid."
msgstr "Schneiden (Slicing) ist nicht möglich, da der Einzugsturm oder die Einzugsposition(en) ungültig ist (sind)."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:406
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:403
#, python-format
msgctxt "@info:status"
msgid "Unable to slice because there are objects associated with disabled Extruder %s."
msgstr "Schneiden (Slicing) ist nicht möglich, da Objekte vorhanden sind, die mit dem deaktivierten Extruder %s verbunden sind."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:412
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 "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
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:status"
msgid "Processing Layers"
msgstr "Schichten werden verarbeitet"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:title"
msgid "Information"
msgstr "Informationen"
@@ -795,19 +764,19 @@ msgctxt "@item:inlistbox"
msgid "3MF File"
msgstr "3MF-Datei"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:190
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:763
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:191
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:775
msgctxt "@label"
msgid "Nozzle"
msgstr "Düse"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:469
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:474
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead."
msgstr "Projektdatei {0} enthält einen unbekannten Maschinentyp {1}. Importieren der Maschine ist nicht möglich. Stattdessen werden die Modelle importiert."
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:472
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:477
msgctxt "@info:title"
msgid "Open Project File"
msgstr "Projektdatei öffnen"
@@ -822,18 +791,18 @@ msgctxt "@item:inlistbox"
msgid "G File"
msgstr "G-Datei"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:324
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:328
msgctxt "@info:status"
msgid "Parsing G-code"
msgstr "G-Code parsen"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:326
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:476
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:330
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:483
msgctxt "@info:title"
msgid "G-code Details"
msgstr "G-Code-Details"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:474
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:481
msgctxt "@info:generic"
msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate."
msgstr "Stellen Sie sicher, dass der G-Code für Ihren Drucker und Ihre Druckerkonfiguration geeignet ist, bevor Sie die Datei senden. Der Darstellung des G-Codes ist möglicherweise nicht korrekt."
@@ -856,7 +825,7 @@ msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
msgstr "Beim Versuch, Ihre Backups aufzulisten, trat ein Fehler auf."
-#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
+#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:132
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
msgstr "Beim Versuch, Ihr Backup wiederherzustellen, trat ein Fehler auf."
@@ -917,243 +886,261 @@ msgctxt "@item:inmenu"
msgid "Preview"
msgstr "Vorschau"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:19
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
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"
msgstr "Druckbett nivellieren"
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:81
-msgctxt "@tooltip"
-msgid "Outer Wall"
-msgstr "Außenwand"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:82
-msgctxt "@tooltip"
-msgid "Inner Walls"
-msgstr "Innenwände"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:83
-msgctxt "@tooltip"
-msgid "Skin"
-msgstr "Außenhaut"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:84
-msgctxt "@tooltip"
-msgid "Infill"
-msgstr "Füllung"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:85
-msgctxt "@tooltip"
-msgid "Support Infill"
-msgstr "Stützstruktur-Füllung"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:86
-msgctxt "@tooltip"
-msgid "Support Interface"
-msgstr "Stützstruktur-Schnittstelle"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:87
-msgctxt "@tooltip"
-msgid "Support"
-msgstr "Stützstruktur"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88
-msgctxt "@tooltip"
-msgid "Skirt"
-msgstr "Skirt"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89
-msgctxt "@tooltip"
-msgid "Travel"
-msgstr "Bewegungen"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90
-msgctxt "@tooltip"
-msgid "Retractions"
-msgstr "Einzüge"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91
-msgctxt "@tooltip"
-msgid "Other"
-msgstr "Sonstige"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:309
-#, python-brace-format
-msgctxt "@label"
-msgid "Pre-sliced file {0}"
-msgstr "Vorgeschnittene Datei {0}"
-
-#: /home/ruben/Projects/Cura/cura/API/Account.py:77
+#: /home/ruben/Projects/Cura/cura/API/Account.py:82
msgctxt "@info:title"
msgid "Login failed"
msgstr "Login fehlgeschlagen"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:201
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121
+#: /home/ruben/Projects/Cura/cura/Settings/cura_empty_instance_containers.py:33
+msgctxt "@info:not supported profile"
+msgid "Not supported"
+msgstr "Nicht unterstützt"
+
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:203
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
msgctxt "@title:window"
msgid "File Already Exists"
msgstr "Datei bereits vorhanden"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:202
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:204
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:123
#, python-brace-format
msgctxt "@label Don't translate the XML tag !"
msgid "The file {0} already exists. Are you sure you want to overwrite it?"
msgstr "Die Datei {0} ist bereits vorhanden. Soll die Datei wirklich überschrieben werden?"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:425
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:427
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:430
msgctxt "@info:status"
msgid "Invalid file URL:"
msgstr "Ungültige Datei-URL:"
-#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
-msgctxt "@menuitem"
-msgid "Not overridden"
-msgstr "Nicht überschrieben"
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:925
+msgctxt "@info:message Followed by a list of settings."
+msgid "Settings have been changed to match the current availability of extruders:"
+msgstr "Die Einstellungen wurden an die aktuell verfügbaren Extruder angepasst:"
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:915
-#, python-format
-msgctxt "@info:generic"
-msgid "Settings have been changed to match the current availability of extruders: [%s]"
-msgstr "Die Einstellungen wurden passend für die aktuelle Verfügbarkeit der Extruder geändert: [%s]"
-
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:917
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:927
msgctxt "@info:title"
msgid "Settings updated"
msgstr "Einstellungen aktualisiert"
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1481
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
msgstr "Extruder deaktiviert"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:132
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to export profile to {0}: {1}"
msgstr "Export des Profils nach {0} fehlgeschlagen: {1}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:138
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:139
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Failed to export profile to {0}: Writer plugin reported failure."
msgstr "Export des Profils nach {0} fehlgeschlagen: Fehlermeldung von Writer-Plugin."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Exported profile to {0}"
msgstr "Profil wurde nach {0} exportiert"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145
msgctxt "@info:title"
msgid "Export succeeded"
msgstr "Export erfolgreich ausgeführt"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:170
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:172
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
msgstr "Import des Profils aus Datei {0}: {1} fehlgeschlagen"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:176
#, 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 "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
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:192
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "No custom profile to import in file {0}"
msgstr "Kein benutzerdefiniertes Profil für das Importieren in Datei {0}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:194
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:196
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}:"
msgstr "Import des Profils aus Datei {0} fehlgeschlagen:"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:218
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:228
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:220
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "This profile {0} contains incorrect data, could not import it."
msgstr "Dieses Profil {0} enthält falsche Daten, Importieren nicht möglich."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:241
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:243
#, 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 "Die Maschine, die im Profil {0} ({1}) definiert wurde, entspricht nicht Ihrer derzeitigen Maschine ({2}). Importieren nicht möglich."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:315
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to import profile from {0}:"
msgstr "Import des Profils aus Datei {0} fehlgeschlagen:"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:316
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Successfully imported profile {0}"
msgstr "Profil erfolgreich importiert {0}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:319
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321
#, python-brace-format
msgctxt "@info:status"
msgid "File {0} does not contain any valid profile."
msgstr "Datei {0} enthält kein gültiges Profil."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:322
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:324
#, python-brace-format
msgctxt "@info:status"
msgid "Profile {0} has an unknown file type or is corrupted."
msgstr "Profil {0} hat einen unbekannten Dateityp oder ist beschädigt."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:340
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:359
msgctxt "@label"
msgid "Custom profile"
msgstr "Benutzerdefiniertes Profil"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:356
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:375
msgctxt "@info:status"
msgid "Profile is missing a quality type."
msgstr "Für das Profil fehlt eine Qualitätsangabe."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:370
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:389
#, python-brace-format
msgctxt "@info:status"
msgid "Could not find a quality type {0} for the current configuration."
msgstr "Es konnte keine Qualitätsangabe {0} für die vorliegende Konfiguration gefunden werden."
-#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:69
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:76
+msgctxt "@tooltip"
+msgid "Outer Wall"
+msgstr "Außenwand"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:77
+msgctxt "@tooltip"
+msgid "Inner Walls"
+msgstr "Innenwände"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:78
+msgctxt "@tooltip"
+msgid "Skin"
+msgstr "Außenhaut"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:79
+msgctxt "@tooltip"
+msgid "Infill"
+msgstr "Füllung"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:80
+msgctxt "@tooltip"
+msgid "Support Infill"
+msgstr "Stützstruktur-Füllung"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:81
+msgctxt "@tooltip"
+msgid "Support Interface"
+msgstr "Stützstruktur-Schnittstelle"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:82
+msgctxt "@tooltip"
+msgid "Support"
+msgstr "Stützstruktur"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:83
+msgctxt "@tooltip"
+msgid "Skirt"
+msgstr "Skirt"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:84
+msgctxt "@tooltip"
+msgid "Prime Tower"
+msgstr "Einzugsturm"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:85
+msgctxt "@tooltip"
+msgid "Travel"
+msgstr "Bewegungen"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:86
+msgctxt "@tooltip"
+msgid "Retractions"
+msgstr "Einzüge"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:87
+msgctxt "@tooltip"
+msgid "Other"
+msgstr "Sonstige"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:306
+#, python-brace-format
+msgctxt "@label"
+msgid "Pre-sliced file {0}"
+msgstr "Vorgeschnittene Datei {0}"
+
+#: /home/ruben/Projects/Cura/cura/UI/WelcomePagesModel.py:56
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:62
+msgctxt "@action:button"
+msgid "Next"
+msgstr "Weiter"
+
+#: /home/ruben/Projects/Cura/cura/UI/ObjectsModel.py:61
#, python-brace-format
msgctxt "@label"
msgid "Group #{group_nr}"
msgstr "Gruppe #{group_nr}"
-#: /home/ruben/Projects/Cura/cura/Machines/Models/MachineManagementModel.py:65
-msgctxt "@info:title"
-msgid "Network enabled printers"
-msgstr "Netzwerkfähige Drucker"
+#: /home/ruben/Projects/Cura/cura/UI/WhatsNewPagesModel.py:17
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:185
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:85
+#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:482
+#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:508
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:124
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:168
+msgctxt "@action:button"
+msgid "Close"
+msgstr "Schließen"
-#: /home/ruben/Projects/Cura/cura/Machines/Models/MachineManagementModel.py:80
-msgctxt "@info:title"
-msgid "Local printers"
-msgstr "Lokale Drucker"
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:17
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:91
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:48
+msgctxt "@action:button"
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/ExtrudersModel.py:208
+msgctxt "@menuitem"
+msgid "Not overridden"
+msgstr "Nicht überschrieben"
#: /home/ruben/Projects/Cura/cura/Machines/Models/QualityManagementModel.py:109
#, python-brace-format
@@ -1166,23 +1153,41 @@ msgctxt "@item:inlistbox"
msgid "All Files (*)"
msgstr "Alle Dateien (*)"
-#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:665
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:86
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:182
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:269
+msgctxt "@label"
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:116
+msgctxt "@label"
+msgid "The printer(s) below cannot be connected because they are part of a group"
+msgstr "Der/die nachfolgende(n) Drucker kann/können nicht verbunden werden, weil er/sie Teil einer Gruppe ist/sind"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:118
+msgctxt "@label"
+msgid "Available networked printers"
+msgstr "Verfügbare vernetzte Drucker"
+
+#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:689
msgctxt "@label"
msgid "Custom Material"
msgstr "Benutzerdefiniertes Material"
-#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:666
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:256
+#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:690
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:203
msgctxt "@label"
msgid "Custom"
msgstr "Benutzerdefiniert"
-#: /home/ruben/Projects/Cura/cura/BuildVolume.py:81
+#: /home/ruben/Projects/Cura/cura/BuildVolume.py:89
msgctxt "@info:status"
msgid "The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from colliding with printed models."
msgstr "Die Höhe der Druckabmessung wurde aufgrund des Wertes der Einstellung „Druckreihenfolge“ reduziert, um eine Kollision der Brücke mit den gedruckten Modellen zu verhindern."
-#: /home/ruben/Projects/Cura/cura/BuildVolume.py:83
+#: /home/ruben/Projects/Cura/cura/BuildVolume.py:91
msgctxt "@info:title"
msgid "Build Volume"
msgstr "Produktabmessungen"
@@ -1197,16 +1202,31 @@ msgctxt "@info:backup_failed"
msgid "Tried to restore a Cura backup without having proper data or meta data."
msgstr "Versucht, ein Cura-Backup-Verzeichnis ohne entsprechende Daten oder Metadaten wiederherzustellen."
-#: /home/ruben/Projects/Cura/cura/Backups/Backup.py:124
+#: /home/ruben/Projects/Cura/cura/Backups/Backup.py:125
msgctxt "@info:backup_failed"
-msgid "Tried to restore a Cura backup that does not match your current version."
-msgstr "Versucht, ein Cura-Backup zu erstellen, das nicht Ihrer aktuellen Version entspricht."
+msgid "Tried to restore a Cura backup that is higher than the current version."
+msgstr "Versucht, ein Cura-Backup wiederherzustellen, das eine höhere Version als die aktuelle hat."
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationHelpers.py:79
+msgctxt "@message"
+msgid "Could not read response."
+msgstr "Antwort konnte nicht gelesen werden."
+
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
msgstr "Der Ultimaker-Konto-Server konnte nicht erreicht werden."
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationRequestHandler.py:66
+msgctxt "@message"
+msgid "Please give the required permissions when authorizing this application."
+msgstr "Erteilen Sie bitte die erforderlichen Freigaben bei der Autorisierung dieser Anwendung."
+
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationRequestHandler.py:73
+msgctxt "@message"
+msgid "Something unexpected happened when trying to log in, please try again."
+msgstr "Bei dem Versuch, sich anzumelden, trat ein unerwarteter Fehler auf. Bitte erneut versuchen."
+
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
msgid "Multiplying and placing objects"
@@ -1219,7 +1239,7 @@ msgstr "Objekte platzieren"
#: /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
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:149
msgctxt "@info:status"
msgid "Unable to find a location within the build volume for all objects"
msgstr "Innerhalb der Druckabmessung für alle Objekte konnte keine Position gefunden werden"
@@ -1230,19 +1250,19 @@ msgid "Placing Object"
msgstr "Objekt-Platzierung"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:30
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:67
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:66
msgctxt "@info:status"
msgid "Finding new location for objects"
msgstr "Neue Position für Objekte finden"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:34
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:71
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:70
msgctxt "@info:title"
msgid "Finding Location"
msgstr "Position finden"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:104
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:151
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:150
msgctxt "@info:title"
msgid "Can't Find Location"
msgstr "Kann Position nicht finden"
@@ -1260,7 +1280,12 @@ 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.
\n"
+" "
#: /home/ruben/Projects/Cura/cura/CrashHandler.py:98
msgctxt "@action:button"
@@ -1293,7 +1318,10 @@ msgid ""
"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"
@@ -1365,242 +1393,195 @@ msgstr "Protokolle"
#: /home/ruben/Projects/Cura/cura/CrashHandler.py:322
msgctxt "@title:groupbox"
-msgid "User description"
-msgstr "Benutzerbeschreibung"
+msgid "User description (Note: Developers may not speak your language, please use English if possible)"
+msgstr "Benutzerbeschreibung (Hinweis: Bitte schreiben Sie auf Englisch, da die Entwickler Ihre Sprache möglicherweise nicht beherrschen.)"
-#: /home/ruben/Projects/Cura/cura/CrashHandler.py:341
+#: /home/ruben/Projects/Cura/cura/CrashHandler.py:342
msgctxt "@action:button"
msgid "Send report"
msgstr "Bericht senden"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:480
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:504
msgctxt "@info:progress"
msgid "Loading machines..."
msgstr "Geräte werden geladen..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:781
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:819
msgctxt "@info:progress"
msgid "Setting up scene..."
msgstr "Die Szene wird eingerichtet..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:817
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:854
msgctxt "@info:progress"
msgid "Loading interface..."
msgstr "Die Benutzeroberfläche wird geladen..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1059
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1133
#, python-format
msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm."
msgid "%(width).1f x %(depth).1f x %(height).1f mm"
msgstr "%(width).1f x %(depth).1f x %(height).1f mm"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1618
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1611
#, python-brace-format
msgctxt "@info:status"
msgid "Only one G-code file can be loaded at a time. Skipped importing {0}"
msgstr "Es kann nur jeweils ein G-Code gleichzeitig geladen werden. Wichtige {0} werden übersprungen."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1628
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1621
#, python-brace-format
msgctxt "@info:status"
msgid "Can't open any other file if G-code is loading. Skipped importing {0}"
msgstr "Wenn G-Code geladen wird, kann keine weitere Datei geöffnet werden. Wichtige {0} werden übersprungen."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1718
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1711
msgctxt "@info:status"
msgid "The selected model was too small to load."
msgstr "Das gewählte Modell war zu klein zum Laden."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:62
-msgctxt "@title"
-msgid "Machine Settings"
-msgstr "Geräteeinstellungen"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:81
-msgctxt "@title:tab"
-msgid "Printer"
-msgstr "Drucker"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:100
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:58
+msgctxt "@title:label"
msgid "Printer Settings"
msgstr "Druckereinstellungen"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:111
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:72
msgctxt "@label"
msgid "X (Width)"
msgstr "X (Breite)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:112
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:122
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:132
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:238
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:387
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:403
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:429
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:441
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:897
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:76
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:90
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:104
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:194
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:213
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:232
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:253
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:272
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:79
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:93
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:109
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:124
msgctxt "@label"
msgid "mm"
msgstr "mm"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:121
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:86
msgctxt "@label"
msgid "Y (Depth)"
msgstr "Y (Tiefe)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:131
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:100
msgctxt "@label"
msgid "Z (Height)"
msgstr "Z (Höhe)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:143
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:114
msgctxt "@label"
msgid "Build plate shape"
msgstr "Druckbettform"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:152
-msgctxt "@option:check"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:127
+msgctxt "@label"
msgid "Origin at center"
msgstr "Ausgang in Mitte"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:160
-msgctxt "@option:check"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:139
+msgctxt "@label"
msgid "Heated bed"
msgstr "Heizbares Bett"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:171
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:151
msgctxt "@label"
msgid "G-code flavor"
msgstr "G-Code-Variante"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:184
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:176
+msgctxt "@title:label"
msgid "Printhead Settings"
msgstr "Druckkopfeinstellungen"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:194
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:190
msgctxt "@label"
msgid "X min"
msgstr "X min."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:195
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Abstand von der linken Seite des Druckkopfes zur Düsenmitte. Wird verwendet, um Kollisionen zwischen vorherigen Drucken und dem Druckkopf während des Druckmodus „Nacheinander“ zu vermeiden."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:204
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:209
msgctxt "@label"
msgid "Y min"
msgstr "Y min."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:205
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Abstand von der Vorderseite des Druckkopfes zur Düsenmitte. Wird verwendet, um Kollisionen zwischen vorherigen Drucken und dem Druckkopf während des Druckmodus „Nacheinander“ zu vermeiden."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:214
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:228
msgctxt "@label"
msgid "X max"
msgstr "X max."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:215
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Abstand von der rechten Seite des Druckkopfes zur Düsenmitte. Wird verwendet, um Kollisionen zwischen vorherigen Drucken und dem Druckkopf während des Druckmodus „Nacheinander“ zu vermeiden."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:224
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:249
msgctxt "@label"
msgid "Y max"
msgstr "Y max."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:225
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Abstand von der Rückseite des Druckkopfes zur Düsenmitte. Wird verwendet, um Kollisionen zwischen vorherigen Drucken und dem Druckkopf während des Druckmodus „Nacheinander“ zu vermeiden."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:237
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:268
msgctxt "@label"
-msgid "Gantry height"
+msgid "Gantry Height"
msgstr "Brückenhöhe"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:239
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Der Höhenunterschied zwischen der Düsenspitze und dem Brückensystem (X- und Y-Achsen). Wird verwendet, um Kollisionen zwischen vorherigen Drucken und der Brücke zu verhindern, wenn im Modus „Nacheinander“ gedruckt wird."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:258
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:282
msgctxt "@label"
msgid "Number of Extruders"
msgstr "Anzahl Extruder"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:314
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:341
+msgctxt "@title:label"
msgid "Start G-code"
-msgstr "Start G-code"
+msgstr "Start G-Code"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:324
-msgctxt "@tooltip"
-msgid "G-code commands to be executed at the very start."
-msgstr "G-Code-Befehle, die zum Start ausgeführt werden sollen."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:333
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:355
+msgctxt "@title:label"
msgid "End G-code"
-msgstr "Ende G-code"
+msgstr "Ende G-Code"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:343
-msgctxt "@tooltip"
-msgid "G-code commands to be executed at the very end."
-msgstr "G-Code-Befehle, die am Ende ausgeführt werden sollen."
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:42
+msgctxt "@title:tab"
+msgid "Printer"
+msgstr "Drucker"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:374
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:63
+msgctxt "@title:label"
msgid "Nozzle Settings"
msgstr "Düseneinstellungen"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:386
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:75
msgctxt "@label"
msgid "Nozzle size"
msgstr "Düsengröße"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:402
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:89
msgctxt "@label"
msgid "Compatible material diameter"
msgstr "Kompatibler Materialdurchmesser"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:404
-msgctxt "@tooltip"
-msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile."
-msgstr "Der Nenndurchmesser des durch den Drucker unterstützten Filaments. Der exakte Durchmesser wird durch das Material und/oder das Profil überschrieben."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:428
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:105
msgctxt "@label"
msgid "Nozzle offset X"
msgstr "X-Versatz Düse"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:440
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:120
msgctxt "@label"
msgid "Nozzle offset Y"
msgstr "Y-Versatz Düse"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:452
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:135
msgctxt "@label"
msgid "Cooling Fan Number"
msgstr "Kühllüfter-Nr."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:453
-msgctxt "@label"
-msgid ""
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:473
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:162
+msgctxt "@title:label"
msgid "Extruder Start G-code"
msgstr "G-Code Extruder-Start"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:491
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:176
+msgctxt "@title:label"
msgid "Extruder End G-code"
msgstr "G-Code Extruder-Ende"
@@ -1610,7 +1591,7 @@ msgid "Install"
msgstr "Installieren"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:20
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:44
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:46
msgctxt "@action:button"
msgid "Installed"
msgstr "Installiert"
@@ -1626,15 +1607,15 @@ msgid "ratings"
msgstr "Bewertungen"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:30
msgctxt "@title:tab"
msgid "Plugins"
msgstr "Plugins"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:69
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:42
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:66
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:361
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:70
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:44
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:80
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:417
msgctxt "@title:tab"
msgid "Materials"
msgstr "Materialien"
@@ -1644,52 +1625,49 @@ msgctxt "@label"
msgid "Your rating"
msgstr "Ihre Bewertung"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:99
msgctxt "@label"
msgid "Version"
msgstr "Version"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:105
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:106
msgctxt "@label"
msgid "Last updated"
msgstr "Zuletzt aktualisiert"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:112
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:260
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:113
msgctxt "@label"
msgid "Author"
msgstr "Autor"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:119
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:120
msgctxt "@label"
msgid "Downloads"
msgstr "Downloads"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:181
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:222
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:265
-msgctxt "@label"
-msgid "Unknown"
-msgstr "Unbekannt"
-
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:56
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
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/ToolboxDetailTileActions.qml:80
+msgctxt "@label:The string between and is the highlighted link"
+msgid "Buy material spools"
+msgstr "Materialspulen kaufen"
+
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:96
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
msgctxt "@action:button"
msgid "Update"
msgstr "Aktualisierung"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:74
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:97
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:35
msgctxt "@action:button"
msgid "Updating"
msgstr "Aktualisierung wird durchgeführt"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:75
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:98
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:36
msgctxt "@action:button"
msgid "Updated"
@@ -1765,7 +1743,7 @@ msgctxt "@label"
msgid "Generic Materials"
msgstr "Generische Materialien"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:56
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:59
msgctxt "@title:tab"
msgid "Installed"
msgstr "Installiert"
@@ -1801,7 +1779,10 @@ 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.\nSie müssen diese Lizenz akzeptieren, um das Plugin zu installieren.\nStimmen Sie den nachfolgenden Bedingungen zu?"
+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?"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:55
msgctxt "@action:button"
@@ -1848,12 +1829,12 @@ msgctxt "@info"
msgid "Fetching packages..."
msgstr "Pakete werden abgeholt..."
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:90
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:91
msgctxt "@label"
msgid "Website"
msgstr "Website"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:97
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:98
msgctxt "@label"
msgid "Email"
msgstr "E-Mail"
@@ -1863,22 +1844,6 @@ msgctxt "@info:tooltip"
msgid "Some things could be problematic in this print. Click to see tips for adjustment."
msgstr "Einige Punkte bei diesem Druck könnten problematisch sein. Klicken Sie, um Tipps für die Anpassung zu erhalten."
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18
-msgctxt "@label"
-msgid "Changelog"
-msgstr "Änderungsprotokoll"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:185
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:85
-#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:482
-#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:508
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:168
-msgctxt "@action:button"
-msgid "Close"
-msgstr "Schließen"
-
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:31
msgctxt "@title"
msgid "Update Firmware"
@@ -1954,38 +1919,40 @@ msgctxt "@label"
msgid "Firmware update failed due to missing firmware."
msgstr "Die Firmware-Aktualisierung ist aufgrund von fehlender Firmware fehlgeschlagen."
-#: /home/ruben/Projects/Cura/plugins/UserAgreement/UserAgreement.qml:16
-msgctxt "@title:window"
-msgid "User Agreement"
-msgstr "Benutzervereinbarung"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:144
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:181
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:153
+msgctxt "@label"
+msgid "Glass"
+msgstr "Glas"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:208
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:249
msgctxt "@info"
-msgid "These options are not available because you are monitoring a cloud printer."
-msgstr "Diese Optionen sind nicht verfügbar, weil Sie einen Cloud-Drucker überwachen."
+msgid "Please update your printer's firmware to manage the queue remotely."
+msgstr "Damit Sie die Warteschlange aus der Ferne verwalten können, müssen Sie die Druckfirmware aktualisieren."
#: /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 "Die Webcam ist nicht verfügbar, weil Sie einen Cloud-Drucker überwachen."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:300
msgctxt "@label:status"
msgid "Loading..."
msgstr "Lädt..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:304
msgctxt "@label:status"
msgid "Unavailable"
msgstr "Nicht verfügbar"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:308
msgctxt "@label:status"
msgid "Unreachable"
msgstr "Nicht erreichbar"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:312
msgctxt "@label:status"
msgid "Idle"
msgstr "Leerlauf"
@@ -1995,37 +1962,31 @@ msgctxt "@label"
msgid "Untitled"
msgstr "Unbenannt"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:374
msgctxt "@label"
msgid "Anonymous"
msgstr "Anonym"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:401
msgctxt "@label:status"
msgid "Requires configuration changes"
msgstr "Erfordert Konfigurationsänderungen"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:439
msgctxt "@action:button"
msgid "Details"
msgstr "Details"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:130
msgctxt "@label"
msgid "Unavailable printer"
msgstr "Drucker nicht verfügbar"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "First available"
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
-msgctxt "@label"
-msgid "Glass"
-msgstr "Glas"
-
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:31
msgctxt "@label"
msgid "Queued"
@@ -2033,178 +1994,190 @@ 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 "Gehe zu Cura Connect"
+msgid "Manage in browser"
+msgstr "Im Browser verwalten"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:100
+msgctxt "@label"
+msgid "There are no print jobs in the queue. Slice and send a job to add one."
+msgstr "Die Warteschlange enthält keine Druckaufträge. Slicen Sie einen Auftrag und schicken Sie ihn ab, um ihn zur Warteschlange hinzuzufügen."
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Print jobs"
msgstr "Druckaufträge"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:132
msgctxt "@label"
msgid "Total print time"
msgstr "Druckdauer insgesamt"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:148
msgctxt "@label"
msgid "Waiting for"
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 "Druckauftragshistorie anzeigen"
-
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:50
msgctxt "@window:title"
msgid "Existing Connection"
msgstr "Vorhandene Verbindung"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:48
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:52
msgctxt "@message:text"
msgid "This printer/group is already added to Cura. Please select another printer/group."
msgstr "Diese/r Drucker/Gruppe wurde bereits zu Cura hinzugefügt. Wählen Sie bitte eine/n andere/n Drucker/Gruppe."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:65
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:69
msgctxt "@title:window"
msgid "Connect to Networked Printer"
msgstr "Anschluss an vernetzten Drucker"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:77
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:81
msgctxt "@label"
-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\nWählen Sie Ihren Drucker aus der folgenden Liste:"
+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."
+msgstr "Um direkt auf Ihrem Drucker über das Netzwerk zu drucken, muss der Drucker über ein Netzwerkkabel oder per WLAN mit dem Netzwerk verbunden sein. Wenn Sie"
+" Cura nicht mit Ihrem Drucker verbinden, können Sie G-Code-Dateien auf einen USB-Stick kopieren und diesen am Drucker anschließen."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44
-msgctxt "@action:button"
-msgid "Add"
-msgstr "Hinzufügen"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:81
+msgctxt "@label"
+msgid "Select your printer from the list below:"
+msgstr "Wählen Sie Ihren Drucker aus der folgenden Liste aus:"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:97
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:101
msgctxt "@action:button"
msgid "Edit"
msgstr "Bearbeiten"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:108
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:128
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:117
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:112
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:146
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:55
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:121
msgctxt "@action:button"
msgid "Remove"
msgstr "Entfernen"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:120
msgctxt "@action:button"
msgid "Refresh"
msgstr "Aktualisieren"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:211
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:215
msgctxt "@label"
msgid "If your printer is not listed, read the network printing troubleshooting guide"
msgstr "Wenn Ihr Drucker nicht aufgeführt ist, lesen Sie die Anleitung für Fehlerbehebung für Netzwerkdruck"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:240
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:244
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:258
msgctxt "@label"
msgid "Type"
msgstr "Typ"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:279
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:283
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:274
msgctxt "@label"
msgid "Firmware version"
msgstr "Firmware-Version"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:293
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:297
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:290
msgctxt "@label"
msgid "Address"
msgstr "Adresse"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:317
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
msgctxt "@label"
msgid "This printer is not set up to host a group of printers."
msgstr "Dieser Drucker ist nicht eingerichtet um eine Gruppe von Druckern anzusteuern."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:325
msgctxt "@label"
msgid "This printer is the host for a group of %1 printers."
msgstr "Dieser Drucker steuert eine Gruppe von %1 Druckern an."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:332
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:336
msgctxt "@label"
msgid "The printer at this address has not yet responded."
msgstr "Der Drucker unter dieser Adresse hat nicht reagiert."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:337
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:341
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:74
msgctxt "@action:button"
msgid "Connect"
msgstr "Verbinden"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:351
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:354
+msgctxt "@title:window"
+msgid "Invalid IP address"
+msgstr "Ungültige IP-Adresse"
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:355
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:146
+msgctxt "@text"
+msgid "Please enter a valid IP address."
+msgstr "Bitte eine gültige IP-Adresse eingeben."
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:366
msgctxt "@title:window"
msgid "Printer Address"
msgstr "Druckeradresse"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:374
-msgctxt "@alabel"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:389
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:102
+msgctxt "@label"
msgid "Enter the IP address or hostname of your printer on the network."
msgstr "Geben Sie die IP-Adresse oder den Hostnamen Ihres Druckers auf dem Netzwerk ein."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:404
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:132
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:419
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:138
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181
msgctxt "@action:button"
msgid "OK"
msgstr "OK"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:88
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:100
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:78
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:90
msgctxt "@label:status"
msgid "Aborted"
msgstr "Abgebrochen"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:90
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:92
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:80
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:82
msgctxt "@label:status"
msgid "Finished"
msgstr "Beendet"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:94
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:84
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:86
msgctxt "@label:status"
msgid "Preparing..."
msgstr "Vorbereitung..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:88
msgctxt "@label:status"
msgid "Aborting..."
msgstr "Wird abgebrochen..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:92
msgctxt "@label:status"
msgid "Pausing..."
msgstr "Wird pausiert..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:94
msgctxt "@label:status"
msgid "Paused"
msgstr "Pausiert"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Resuming..."
msgstr "Wird fortgesetzt..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Action required"
msgstr "Handlung erforderlich"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:100
msgctxt "@label:status"
msgid "Finishes %1 at %2"
msgstr "Fertigstellung %1 auf %2"
@@ -2308,44 +2281,44 @@ msgctxt "@action:button"
msgid "Override"
msgstr "Überschreiben"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:85
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] "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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:89
msgctxt "@label"
msgid "The printer %1 is assigned, but the job contains an unknown material configuration."
msgstr "Der Drucker %1 wurde zugewiesen, allerdings enthält der Auftrag eine unbekannte Materialkonfiguration."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:78
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:99
msgctxt "@label"
msgid "Change material %1 from %2 to %3."
msgstr "Material %1 von %2 auf %3 wechseln."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:81
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:102
msgctxt "@label"
msgid "Load %3 as material %1 (This cannot be overridden)."
msgstr "%3 als Material %1 laden (Dies kann nicht übergangen werden)."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:84
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:105
msgctxt "@label"
msgid "Change print core %1 from %2 to %3."
msgstr "Print Core %1 von %2 auf %3 wechseln."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:87
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:108
msgctxt "@label"
msgid "Change build plate to %1 (This cannot be overridden)."
msgstr "Druckplatte auf %1 wechseln (Dies kann nicht übergangen werden)."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:115
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:156
msgctxt "@label"
msgid "Aluminum"
msgstr "Aluminium"
@@ -2355,107 +2328,109 @@ msgctxt "@info:tooltip"
msgid "Connect to a printer"
msgstr "Mit einem Drucker verbinden"
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:92
+#: /home/ruben/Projects/Cura/plugins/SettingsGuide/resources/qml/SettingsGuide.qml:16
+msgctxt "@title"
+msgid "Cura Settings Guide"
+msgstr "Anleitung für Cura-Einstellungen"
+
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:100
msgctxt "@info"
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 "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."
+"- Check if the printer is connected to the network.\n"
+"- Check if you are signed in to discover cloud-connected printers."
+msgstr "Stellen Sie sicher, dass der Drucker verbunden ist:\n– Prüfen Sie, ob der Drucker eingeschaltet ist.– Prüfen Sie, ob der Drucker mit dem Netzwerk verbunden"
+" ist.\n– Prüfen Sie, ob Sie angemeldet sind, falls Sie über die Cloud verbundene Drucker suchen möchten."
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:117
msgctxt "@info"
-msgid "Please select a network connected printer to monitor."
-msgstr "Bitte einen mit dem Netzwerk verbunden Drucker für die Überwachung wählen."
+msgid "Please connect your printer to the network."
+msgstr "Verbinden Sie Ihren Drucker bitte mit dem Netzwerk."
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
-msgctxt "@info"
-msgid "Please connect your Ultimaker printer to your local network."
-msgstr "Verbinden Sie Ihren Ultimaker-Drucker bitte mit Ihrem lokalen Netzwerk."
-
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:156
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
msgstr "Benutzerhandbücher online anzeigen"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:20
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:49
msgctxt "@label"
msgid "Color scheme"
msgstr "Farbschema"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:105
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:107
msgctxt "@label:listbox"
msgid "Material Color"
msgstr "Materialfarbe"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:109
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:111
msgctxt "@label:listbox"
msgid "Line Type"
msgstr "Linientyp"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:113
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:115
msgctxt "@label:listbox"
msgid "Feedrate"
msgstr "Vorschub"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:117
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:119
msgctxt "@label:listbox"
msgid "Layer thickness"
msgstr "Schichtdicke"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:154
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:156
msgctxt "@label"
msgid "Compatibility Mode"
msgstr "Kompatibilitätsmodus"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:230
msgctxt "@label"
msgid "Travels"
msgstr "Bewegungen"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:236
msgctxt "@label"
msgid "Helpers"
msgstr "Helfer"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:242
msgctxt "@label"
msgid "Shell"
msgstr "Gehäuse"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:248
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
msgctxt "@label"
msgid "Infill"
msgstr "Füllung"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:297
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:298
msgctxt "@label"
msgid "Only Show Top Layers"
msgstr "Nur obere Schichten anzeigen"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:307
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:308
msgctxt "@label"
msgid "Show 5 Detailed Layers On Top"
msgstr "5 detaillierte Schichten oben anzeigen"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:321
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:322
msgctxt "@label"
msgid "Top / Bottom"
msgstr "Oben/Unten"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:325
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:326
msgctxt "@label"
msgid "Inner Wall"
msgstr "Innenwand"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:383
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:384
msgctxt "@label"
msgid "min"
msgstr "min."
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:432
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:433
msgctxt "@label"
msgid "max"
msgstr "max."
@@ -2485,30 +2460,25 @@ msgctxt "@info:tooltip"
msgid "Change active post-processing scripts"
msgstr "Aktive Skripts Nachbearbeitung ändern"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:16
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:17
msgctxt "@title:window"
msgid "More information on anonymous data collection"
msgstr "Weitere Informationen zur anonymen Datenerfassung"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:66
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:74
msgctxt "@text:window"
-msgid "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."
-msgstr "Cura sendet anonyme Daten an Ultimaker, um die Druckqualität und Benutzererfahrung zu steigern. Nachfolgend ist ein Beispiel aller Daten, die gesendet werden."
+msgid "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:"
+msgstr "Ultimaker Cura erfasst anonyme Daten, um die Druckqualität und Benutzererfahrung zu steigern. Nachfolgend ist ein Beispiel aller Daten, die geteilt werden:"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:109
msgctxt "@text:window"
-msgid "I don't want to send this data"
-msgstr "Ich möchte diese Daten nicht senden"
+msgid "I don't want to send anonymous data"
+msgstr "Ich möchte keine anonymen Daten senden"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:118
msgctxt "@text:window"
-msgid "Allow sending this data to Ultimaker and help us improve Cura"
-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 "Kein Druck ausgewählt"
+msgid "Allow sending anonymous data"
+msgstr "Senden von anonymen Daten erlauben"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2557,19 +2527,19 @@ msgstr "Tiefe (mm)"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126
msgctxt "@info:tooltip"
-msgid "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."
-msgstr "Standardmäßig repräsentieren weiße Pixel hohe Punkte im Netz und schwarze Pixel repräsentieren niedrige Punkte im Netz. Ändern Sie diese Option um das Verhalten so umzukehren, dass schwarze Pixel hohe Punkte im Netz darstellen und weiße Pixel niedrige Punkte im Netz."
-
-#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
-msgctxt "@item:inlistbox"
-msgid "Lighter is higher"
-msgstr "Heller ist höher"
+msgid "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."
+msgstr "Für Lithophanien sollten dunkle Pixel dickeren Positionen entsprechen, um mehr einfallendes Licht zu blockieren. Für Höhenkarten stellen hellere Pixel höheres Terrain dar, sodass hellere Pixel dickeren Positionen im generierten 3D-Modell entsprechen sollten."
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
msgctxt "@item:inlistbox"
msgid "Darker is higher"
msgstr "Dunkler ist höher"
+#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
+msgctxt "@item:inlistbox"
+msgid "Lighter is higher"
+msgstr "Heller ist höher"
+
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149
msgctxt "@info:tooltip"
msgid "The amount of smoothing to apply to the image."
@@ -2683,7 +2653,7 @@ msgid "Printer Group"
msgstr "Druckergruppe"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:180
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:197
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:226
msgctxt "@action:label"
msgid "Profile settings"
msgstr "Profileinstellungen"
@@ -2696,19 +2666,19 @@ msgstr "Wie soll der Konflikt im Profil gelöst werden?"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:121
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:221
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:250
msgctxt "@action:label"
msgid "Name"
msgstr "Name"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:231
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:205
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:234
msgctxt "@action:label"
msgid "Not in profile"
msgstr "Nicht im Profil"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:236
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:210
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:239
msgctxt "@action:label"
msgid "%1 override"
msgid_plural "%1 overrides"
@@ -2789,6 +2759,7 @@ 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
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:138
msgctxt "@button"
msgid "Sign in"
msgstr "Anmelden"
@@ -2879,22 +2850,23 @@ msgid "Previous"
msgstr "Zurück"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:60
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:152
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:174
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:159
msgctxt "@action:button"
msgid "Export"
msgstr "Export"
-#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:62
-msgctxt "@action:button"
-msgid "Next"
-msgstr "Weiter"
-
-#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:169
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:209
msgctxt "@label"
msgid "Tip"
msgstr "Tipp"
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMaterialMenu.qml:20
+#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:66
+msgctxt "@label:category menu label"
+msgid "Generic"
+msgstr "Generisch"
+
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:160
msgctxt "@label"
msgid "Print experiment"
@@ -2905,150 +2877,51 @@ msgctxt "@label"
msgid "Checklist"
msgstr "Checkliste"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25
-msgctxt "@title"
-msgid "Select Printer Upgrades"
-msgstr "Drucker-Upgrades wählen"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:38
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:30
msgctxt "@label"
msgid "Please select any upgrades made to this Ultimaker 2."
msgstr "Wählen Sie bitte alle durchgeführten Upgrades für diesen Ultimaker 2."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:47
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:44
msgctxt "@label"
msgid "Olsson Block"
msgstr "Olsson-Block"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:30
msgctxt "@title"
msgid "Build Plate Leveling"
msgstr "Nivellierung der Druckplatte"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:44
msgctxt "@label"
msgid "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."
msgstr "Um sicherzustellen, dass Ihre Drucke hervorragend werden, können Sie nun Ihre Druckplatte justieren. Wenn Sie auf „Gehe zur nächsten Position“ klicken, bewegt sich die Düse zu den verschiedenen Positionen, die justiert werden können."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:57
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 "Legen Sie für jede Position ein Blatt Papier unter die Düse und stellen Sie die Höhe der Druckplatte ein. Die Höhe der Druckplatte ist korrekt, wenn das Papier von der Spitze der Düse leicht berührt wird."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:75
msgctxt "@action:button"
msgid "Start Build Plate Leveling"
msgstr "Nivellierung der Druckplatte starten"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:87
msgctxt "@action:button"
msgid "Move to Next Position"
msgstr "Gehe zur nächsten Position"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:30
msgctxt "@label"
msgid "Please select any upgrades made to this Ultimaker Original"
msgstr "Wählen Sie bitte alle Upgrades für dieses Ultimaker-Original"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:41
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"
@@ -3099,170 +2972,170 @@ msgctxt "@label"
msgid "Are you sure you want to abort the print?"
msgstr "Soll das Drucken wirklich abgebrochen werden?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:71
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:73
msgctxt "@title"
msgid "Information"
msgstr "Informationen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:100
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:102
msgctxt "@title:window"
msgid "Confirm Diameter Change"
msgstr "Änderung Durchmesser bestätigen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:101
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:103
msgctxt "@label (%1 is a number)"
msgid "The new filament diameter is set to %1 mm, which is not compatible with the current extruder. Do you wish to continue?"
msgstr "Der neue Filament-Durchmesser wurde auf %1 mm eingestellt, was nicht kompatibel mit dem aktuellen Extruder ist. Möchten Sie fortfahren?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:133
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:127
msgctxt "@label"
msgid "Display Name"
msgstr "Namen anzeigen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:143
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:137
msgctxt "@label"
msgid "Brand"
msgstr "Marke"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:153
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:147
msgctxt "@label"
msgid "Material Type"
msgstr "Materialtyp"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:162
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:157
msgctxt "@label"
msgid "Color"
msgstr "Farbe"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:212
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:207
msgctxt "@label"
msgid "Properties"
msgstr "Eigenschaften"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:214
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:209
msgctxt "@label"
msgid "Density"
msgstr "Dichte"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:229
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:224
msgctxt "@label"
msgid "Diameter"
msgstr "Durchmesser"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:263
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:258
msgctxt "@label"
msgid "Filament Cost"
msgstr "Filamentkosten"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:280
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:275
msgctxt "@label"
msgid "Filament weight"
msgstr "Filamentgewicht"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:298
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:293
msgctxt "@label"
msgid "Filament length"
msgstr "Filamentlänge"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:307
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:302
msgctxt "@label"
msgid "Cost per Meter"
msgstr "Kosten pro Meter"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:321
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:316
msgctxt "@label"
msgid "This material is linked to %1 and shares some of its properties."
msgstr "Dieses Material ist mit %1 verknüpft und teilt sich damit einige seiner Eigenschaften."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:328
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:323
msgctxt "@label"
msgid "Unlink Material"
msgstr "Material trennen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:339
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:334
msgctxt "@label"
msgid "Description"
msgstr "Beschreibung"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:352
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:347
msgctxt "@label"
msgid "Adhesion Information"
msgstr "Haftungsinformationen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:378
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:17
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:373
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label"
msgid "Print settings"
msgstr "Druckeinstellungen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:84
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:72
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:99
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:40
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:73
msgctxt "@action:button"
msgid "Activate"
msgstr "Aktivieren"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:101
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:117
msgctxt "@action:button"
msgid "Create"
msgstr "Erstellen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:114
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:131
msgctxt "@action:button"
msgid "Duplicate"
msgstr "Duplizieren"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:141
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:142
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:160
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:148
msgctxt "@action:button"
msgid "Import"
msgstr "Import"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:203
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:223
msgctxt "@action:label"
msgid "Printer"
msgstr "Drucker"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:262
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:246
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:287
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:253
msgctxt "@title:window"
msgid "Confirm Remove"
msgstr "Entfernen bestätigen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:263
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:247
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:254
msgctxt "@label (%1 is object name)"
msgid "Are you sure you wish to remove %1? This cannot be undone!"
msgstr "Möchten Sie %1 wirklich entfernen? Dies kann nicht rückgängig gemacht werden!"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:277
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:285
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:304
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:312
msgctxt "@title:window"
msgid "Import Material"
msgstr "Material importieren"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:286
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:313
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Could not import material %1: %2"
msgstr "Material konnte nicht importiert werden %1: %2"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:317
msgctxt "@info:status Don't translate the XML tag !"
msgid "Successfully imported material %1"
msgstr "Material wurde erfolgreich importiert %1"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:308
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:316
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:335
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:343
msgctxt "@title:window"
msgid "Export Material"
msgstr "Material exportieren"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:320
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:347
msgctxt "@info:status Don't translate the XML tags and !"
msgid "Failed to export material to %1: %2"
msgstr "Exportieren des Materials nach %1: %2 schlug fehl"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:326
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:353
msgctxt "@info:status Don't translate the XML tag !"
msgid "Successfully exported material to %1"
msgstr "Material erfolgreich nach %1 exportiert"
@@ -3277,412 +3150,437 @@ msgctxt "@label:textbox"
msgid "Check all"
msgstr "Alle prüfen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:47
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:48
msgctxt "@info:status"
msgid "Calculated"
msgstr "Berechnet"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:61
msgctxt "@title:column"
msgid "Setting"
msgstr "Einstellung"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:68
msgctxt "@title:column"
msgid "Profile"
msgstr "Profil"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:74
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75
msgctxt "@title:column"
msgid "Current"
msgstr "Aktuell"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:82
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:83
msgctxt "@title:column"
msgid "Unit"
msgstr "Einheit"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:15
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:354
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:410
msgctxt "@title:tab"
msgid "General"
msgstr "Allgemein"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:126
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:130
msgctxt "@label"
msgid "Interface"
msgstr "Schnittstelle"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:137
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:141
msgctxt "@label"
msgid "Language:"
msgstr "Sprache:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:204
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:208
msgctxt "@label"
msgid "Currency:"
msgstr "Währung:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:217
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221
msgctxt "@label"
msgid "Theme:"
msgstr "Thema:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:273
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:277
msgctxt "@label"
msgid "You will need to restart the application for these changes to have effect."
msgstr "Die Anwendung muss neu gestartet werden, um die Änderungen zu übernehmen."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:294
msgctxt "@info:tooltip"
msgid "Slice automatically when changing settings."
msgstr "Bei Änderung der Einstellungen automatisch schneiden."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:302
msgctxt "@option:check"
msgid "Slice automatically"
msgstr "Automatisch schneiden"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:312
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:316
msgctxt "@label"
msgid "Viewport behavior"
msgstr "Viewport-Verhalten"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:324
msgctxt "@info:tooltip"
msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly."
msgstr "Nicht gestützte Bereiche des Modells in rot hervorheben. Ohne Support werden diese Bereiche nicht korrekt gedruckt."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:329
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:333
msgctxt "@option:check"
msgid "Display overhang"
msgstr "Überhang anzeigen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:336
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341
msgctxt "@info:tooltip"
msgid "Moves the camera so the model is in the center of the view when a model is selected"
msgstr "Bewegt die Kamera, bis sich das Modell im Mittelpunkt der Ansicht befindet, wenn ein Modell ausgewählt wurde"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:346
msgctxt "@action:button"
msgid "Center camera when item is selected"
msgstr "Zentrieren Sie die Kamera, wenn das Element ausgewählt wurde"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:350
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356
msgctxt "@info:tooltip"
msgid "Should the default zoom behavior of cura be inverted?"
msgstr "Soll das standardmäßige Zoom-Verhalten von Cura umgekehrt werden?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:355
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361
msgctxt "@action:button"
msgid "Invert the direction of camera zoom."
msgstr "Kehren Sie die Richtung des Kamera-Zooms um."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:365
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371
msgctxt "@info:tooltip"
msgid "Should zooming move in the direction of the mouse?"
msgstr "Soll das Zoomen in Richtung der Maus erfolgen?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371
+msgctxt "@info:tooltip"
+msgid "Zooming towards the mouse is not supported in the orthogonal perspective."
+msgstr "Das Zoomen in Mausrichtung wird in der Orthogonalansicht nicht unterstützt."
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:376
msgctxt "@action:button"
msgid "Zoom toward mouse direction"
msgstr "In Mausrichtung zoomen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:380
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402
msgctxt "@info:tooltip"
msgid "Should models on the platform be moved so that they no longer intersect?"
msgstr "Sollen Modelle auf der Plattform so verschoben werden, dass sie sich nicht länger überschneiden?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:385
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:407
msgctxt "@option:check"
msgid "Ensure models are kept apart"
msgstr "Stellen Sie sicher, dass die Modelle getrennt gehalten werden"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:394
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416
msgctxt "@info:tooltip"
msgid "Should models on the platform be moved down to touch the build plate?"
msgstr "Sollen Modelle auf der Plattform so nach unten verschoben werden, dass sie die Druckplatte berühren?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:421
msgctxt "@option:check"
msgid "Automatically drop models to the build plate"
msgstr "Setzt Modelle automatisch auf der Druckplatte ab"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:411
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433
msgctxt "@info:tooltip"
msgid "Show caution message in g-code reader."
msgstr "Warnmeldung im G-Code-Reader anzeigen."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:420
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:442
msgctxt "@option:check"
msgid "Caution message in g-code reader"
msgstr "Warnmeldung in G-Code-Reader"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:428
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:450
msgctxt "@info:tooltip"
msgid "Should layer be forced into compatibility mode?"
msgstr "Soll die Schicht in den Kompatibilitätsmodus gezwungen werden?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:455
msgctxt "@option:check"
msgid "Force layer view compatibility mode (restart required)"
msgstr "Schichtenansicht Kompatibilitätsmodus erzwingen (Neustart erforderlich)"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:449
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:465
+msgctxt "@info:tooltip"
+msgid "What type of camera rendering should be used?"
+msgstr "Welches Kamera-Rendering sollte verwendet werden?"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:472
+msgctxt "@window:text"
+msgid "Camera rendering: "
+msgstr "Kamera-Rendering: "
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:483
+msgid "Perspective"
+msgstr "Ansicht"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:484
+msgid "Orthogonal"
+msgstr "Orthogonal"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:515
msgctxt "@label"
msgid "Opening and saving files"
msgstr "Dateien öffnen und speichern"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:456
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522
msgctxt "@info:tooltip"
msgid "Should models be scaled to the build volume if they are too large?"
msgstr "Sollen Modelle an das Erstellungsvolumen angepasst werden, wenn sie zu groß sind?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:461
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:527
msgctxt "@option:check"
msgid "Scale large models"
msgstr "Große Modelle anpassen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537
msgctxt "@info:tooltip"
msgid "An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be scaled up?"
msgstr "Ein Modell kann extrem klein erscheinen, wenn seine Maßeinheit z. B. in Metern anstelle von Millimetern angegeben ist. Sollen diese Modelle hoch skaliert werden?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:542
msgctxt "@option:check"
msgid "Scale extremely small models"
msgstr "Extrem kleine Modelle skalieren"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:486
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:552
msgctxt "@info:tooltip"
msgid "Should models be selected after they are loaded?"
msgstr "Sollten Modelle gewählt werden, nachdem sie geladen wurden?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:491
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:557
msgctxt "@option:check"
msgid "Select models when loaded"
msgstr "Modelle wählen, nachdem sie geladen wurden"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:567
msgctxt "@info:tooltip"
msgid "Should a prefix based on the printer name be added to the print job name automatically?"
msgstr "Soll ein Präfix anhand des Druckernamens automatisch zum Namen des Druckauftrags hinzugefügt werden?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:506
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:572
msgctxt "@option:check"
msgid "Add machine prefix to job name"
msgstr "Geräte-Präfix zu Auftragsnamen hinzufügen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:516
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582
msgctxt "@info:tooltip"
msgid "Should a summary be shown when saving a project file?"
msgstr "Soll beim Speichern einer Projektdatei eine Zusammenfassung angezeigt werden?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:586
msgctxt "@option:check"
msgid "Show summary dialog when saving project"
msgstr "Dialog Zusammenfassung beim Speichern eines Projekts anzeigen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:530
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596
msgctxt "@info:tooltip"
msgid "Default behavior when opening a project file"
msgstr "Standardverhalten beim Öffnen einer Projektdatei"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:538
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:604
msgctxt "@window:text"
msgid "Default behavior when opening a project file: "
msgstr "Standardverhalten beim Öffnen einer Projektdatei: "
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:552
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:618
msgctxt "@option:openProject"
msgid "Always ask me this"
msgstr "Stets nachfragen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:553
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:619
msgctxt "@option:openProject"
msgid "Always open as a project"
msgstr "Immer als Projekt öffnen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:554
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620
msgctxt "@option:openProject"
msgid "Always import models"
msgstr "Modelle immer importieren"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:590
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656
msgctxt "@info:tooltip"
msgid "When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want to keep your modifications or not, or you can choose a default behaviour and never show that dialog again."
msgstr "Wenn Sie Änderungen für ein Profil vorgenommen haben und zu einem anderen Profil gewechselt sind, wird ein Dialog angezeigt, der hinterfragt, ob Sie Ihre Änderungen beibehalten möchten oder nicht; optional können Sie ein Standardverhalten wählen, sodass dieser Dialog nicht erneut angezeigt wird."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:599
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:665
msgctxt "@label"
msgid "Profiles"
msgstr "Profile"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:604
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:670
msgctxt "@window:text"
msgid "Default behavior for changed setting values when switching to a different profile: "
msgstr "Standardverhalten für geänderte Einstellungswerte beim Wechsel zu einem anderen Profil: "
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:618
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:684
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:157
msgctxt "@option:discardOrKeep"
msgid "Always ask me this"
msgstr "Stets nachfragen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:619
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685
msgctxt "@option:discardOrKeep"
msgid "Always discard changed settings"
msgstr "Geänderte Einstellungen immer verwerfen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:686
msgctxt "@option:discardOrKeep"
msgid "Always transfer changed settings to new profile"
msgstr "Geänderte Einstellungen immer auf neues Profil übertragen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:654
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:720
msgctxt "@label"
msgid "Privacy"
msgstr "Privatsphäre"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:661
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:727
msgctxt "@info:tooltip"
msgid "Should Cura check for updates when the program is started?"
msgstr "Soll Cura bei Programmstart nach Updates suchen?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:666
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:732
msgctxt "@option:check"
msgid "Check for updates on start"
msgstr "Bei Start nach Updates suchen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:676
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:742
msgctxt "@info:tooltip"
msgid "Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored."
msgstr "Sollen anonyme Daten über Ihren Druck an Ultimaker gesendet werden? Beachten Sie, dass keine Modelle, IP-Adressen oder andere personenbezogene Daten gesendet oder gespeichert werden."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:681
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:747
msgctxt "@option:check"
msgid "Send (anonymous) print information"
msgstr "(Anonyme) Druckinformationen senden"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:690
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:756
msgctxt "@action:button"
msgid "More information"
msgstr "Mehr Informationen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:708
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:774
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:27
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ProfileMenu.qml:23
msgctxt "@label"
msgid "Experimental"
msgstr "Experimentell"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:715
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:781
msgctxt "@info:tooltip"
msgid "Use multi build plate functionality"
msgstr "Mehrfach-Druckplattenfunktion verwenden"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:720
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:786
msgctxt "@option:check"
msgid "Use multi build plate functionality (restart required)"
msgstr "Mehrfach-Druckplattenfunktion verwenden (Neustart erforderlich)"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:16
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:359
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:415
msgctxt "@title:tab"
msgid "Printers"
msgstr "Drucker"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:129
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:63
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:134
msgctxt "@action:button"
msgid "Rename"
msgstr "Umbenennen"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:36
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:363
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:419
msgctxt "@title:tab"
msgid "Profiles"
msgstr "Profile"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:87
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:89
msgctxt "@label"
msgid "Create"
msgstr "Erstellen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:105
msgctxt "@label"
msgid "Duplicate"
msgstr "Duplizieren"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:174
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:181
msgctxt "@title:window"
msgid "Create Profile"
msgstr "Profil erstellen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:183
msgctxt "@info"
msgid "Please provide a name for this profile."
msgstr "Geben Sie bitte einen Namen für dieses Profil an."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:239
msgctxt "@title:window"
msgid "Duplicate Profile"
msgstr "Profil duplizieren"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:263
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:270
msgctxt "@title:window"
msgid "Rename Profile"
msgstr "Profil umbenennen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:276
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:283
msgctxt "@title:window"
msgid "Import Profile"
msgstr "Profil importieren"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:302
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:309
msgctxt "@title:window"
msgid "Export Profile"
msgstr "Profil exportieren"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:357
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:364
msgctxt "@label %1 is printer name"
msgid "Printer: %1"
msgstr "Drucker: %1"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:420
msgctxt "@label"
msgid "Default profiles"
msgstr "Standardprofile"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:420
msgctxt "@label"
msgid "Custom profiles"
msgstr "Benutzerdefinierte Profile"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:490
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:500
msgctxt "@action:button"
msgid "Update profile with current settings/overrides"
msgstr "Profil mit aktuellen Einstellungen/Überschreibungen aktualisieren"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:497
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:507
msgctxt "@action:button"
msgid "Discard current changes"
msgstr "Aktuelle Änderungen verwerfen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:514
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:524
msgctxt "@action:label"
msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below."
msgstr "Dieses Profil verwendet die vom Drucker festgelegten Standardeinstellungen, deshalb sind in der folgenden Liste keine Einstellungen/Überschreibungen enthalten."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:521
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:531
msgctxt "@action:label"
msgid "Your current settings match the selected profile."
msgstr "Ihre aktuellen Einstellungen stimmen mit dem gewählten Profil überein."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:540
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:550
msgctxt "@title:tab"
msgid "Global Settings"
msgstr "Globale Einstellungen"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:89
msgctxt "@action:button"
msgid "Marketplace"
msgstr "Marktplatz"
@@ -3725,12 +3623,12 @@ msgctxt "@title:menu menubar:toplevel"
msgid "&Help"
msgstr "&Hilfe"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:123
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:124
msgctxt "@title:window"
msgid "New project"
msgstr "Neues Projekt"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:124
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:125
msgctxt "@info:question"
msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings."
msgstr "Möchten Sie wirklich ein neues Projekt beginnen? Damit werden das Druckbett und alle nicht gespeicherten Einstellungen gelöscht."
@@ -3745,33 +3643,33 @@ msgctxt "@label:textbox"
msgid "search settings"
msgstr "Einstellungen durchsuchen"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:466
msgctxt "@action:menu"
msgid "Copy value to all extruders"
msgstr "Werte für alle Extruder kopieren"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:474
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:475
msgctxt "@action:menu"
msgid "Copy all changed values to all extruders"
msgstr "Alle geänderten Werte für alle Extruder kopieren"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512
msgctxt "@action:menu"
msgid "Hide this setting"
msgstr "Diese Einstellung ausblenden"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:529
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:525
msgctxt "@action:menu"
msgid "Don't show this setting"
msgstr "Diese Einstellung ausblenden"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:533
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:529
msgctxt "@action:menu"
msgid "Keep this setting visible"
msgstr "Diese Einstellung weiterhin anzeigen"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:557
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:548
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:434
msgctxt "@action:menu"
msgid "Configure setting visibility..."
msgstr "Sichtbarkeit einstellen wird konfiguriert..."
@@ -3782,50 +3680,64 @@ 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\nKlicken Sie, um diese Einstellungen sichtbar zu machen."
+msgstr ""
+"Einige ausgeblendete Einstellungen verwenden Werte, die von ihren normalen, berechneten Werten abweichen.\n"
+"\n"
+"Klicken Sie, um diese Einstellungen sichtbar zu machen."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:81
+msgctxt "@label"
+msgid "This setting is not used because all the settings that it influences are overridden."
+msgstr "Diese Einstellung wird nicht verwendet, weil alle hierdurch beeinflussten Einstellungen aufgehoben werden."
+
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:86
msgctxt "@label Header for list of settings."
msgid "Affects"
msgstr "Hat Einfluss auf"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:71
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:91
msgctxt "@label Header for list of settings."
msgid "Affected By"
msgstr "Wird beeinflusst von"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:166
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186
msgctxt "@label"
msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders."
msgstr "Diese Einstellung wird stets zwischen allen Extrudern geteilt. Eine Änderung ändert den Wert für alle Extruder."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:170
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190
msgctxt "@label"
msgid "The value is resolved from per-extruder values "
msgstr "Der Wert wird von Pro-Extruder-Werten gelöst "
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:208
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:228
msgctxt "@label"
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\nKlicken Sie, um den Wert des Profils wiederherzustellen."
+msgstr ""
+"Diese Einstellung hat einen vom Profil abweichenden Wert.\n"
+"\n"
+"Klicken Sie, um den Wert des Profils wiederherzustellen."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:302
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:322
msgctxt "@label"
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\nKlicken Sie, um den berechneten Wert wiederherzustellen."
+msgstr ""
+"Diese Einstellung wird normalerweise berechnet; aktuell ist jedoch ein Absolutwert eingestellt.\n"
+"\n"
+"Klicken Sie, um den berechneten Wert wiederherzustellen."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:144
msgctxt "@button"
msgid "Recommended"
msgstr "Empfohlen"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:158
msgctxt "@button"
msgid "Custom"
msgstr "Benutzerdefiniert"
@@ -3840,27 +3752,22 @@ msgctxt "@label"
msgid "Gradual infill will gradually increase the amount of infill towards the top."
msgstr "Die graduelle Füllung steigert die Menge der Füllung nach oben hin schrittweise."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:30
msgctxt "@label"
msgid "Support"
msgstr "Stützstruktur"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:71
msgctxt "@label"
msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing."
msgstr "Damit werden Strukturen zur Unterstützung von Modellteilen mit Überhängen generiert. Ohne diese Strukturen würden solche Teile während des Druckvorgangs zusammenfallen."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:136
-msgctxt "@label"
-msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air."
-msgstr "Wählen Sie, welcher Extruder für die Unterstützung verwendet wird. Dient zum Konstruieren von Stützstrukturen unter dem Modell, damit dieses nicht absinkt oder frei schwebend gedruckt wird."
-
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:29
msgctxt "@label"
msgid "Adhesion"
msgstr "Haftung"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:74
msgctxt "@label"
msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards."
msgstr "Drucken eines Brim- oder Raft-Elements aktivieren. Es wird ein flacher Bereich rund um oder unter Ihrem Objekt hinzugefügt, das im Anschluss leicht abgeschnitten werden kann."
@@ -3877,7 +3784,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"
+msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile."
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
@@ -3906,12 +3813,15 @@ 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\nKlicken Sie, um den Profilmanager zu öffnen."
+msgstr ""
+"Einige Einstellungs-/Überschreibungswerte unterscheiden sich von den im Profil gespeicherten Werten.\n"
+"\n"
+"Klicken Sie, um den Profilmanager zu öffnen."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:21
msgctxt "@label shown when we load a Gcode file"
-msgid "Print setup disabled. G code file can not be modified."
-msgstr "Druckeinrichtung ist deaktiviert. G-Code kann nicht geändert werden."
+msgid "Print setup disabled. G-code file can not be modified."
+msgstr "Druckeinrichtung ist deaktiviert. G-Code-Datei kann nicht geändert werden."
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
msgctxt "@label"
@@ -3943,7 +3853,7 @@ msgctxt "@label"
msgid "Send G-code"
msgstr "G-Code senden"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:364
+#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:365
msgctxt "@tooltip of G-code command input"
msgid "Send a custom G-code command to the connected printer. Press 'enter' to send the command."
msgstr "Einen benutzerdefinierten G-Code-Befehl an den verbundenen Drucker senden. „Eingabe“ drücken, um den Befehl zu senden."
@@ -4040,11 +3950,6 @@ msgctxt "@label:category menu label"
msgid "Favorites"
msgstr "Favoriten"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:66
-msgctxt "@label:category menu label"
-msgid "Generic"
-msgstr "Generisch"
-
#: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25
msgctxt "@label:category menu label"
msgid "Network enabled printers"
@@ -4060,32 +3965,32 @@ msgctxt "@title:menu menubar:settings"
msgid "&Printer"
msgstr "Dr&ucker"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:26
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:32
msgctxt "@title:menu"
msgid "&Material"
msgstr "&Material"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:35
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:41
msgctxt "@action:inmenu"
msgid "Set as Active Extruder"
msgstr "Als aktiven Extruder festlegen"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:41
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:47
msgctxt "@action:inmenu"
msgid "Enable Extruder"
msgstr "Extruder aktivieren"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:48
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:54
msgctxt "@action:inmenu"
msgid "Disable Extruder"
msgstr "Extruder deaktivieren"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:62
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:68
msgctxt "@title:menu"
msgid "&Build plate"
msgstr "&Druckplatte"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:65
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:71
msgctxt "@title:settings"
msgid "&Profile"
msgstr "&Profil"
@@ -4095,7 +4000,22 @@ msgctxt "@action:inmenu menubar:view"
msgid "&Camera position"
msgstr "&Kameraposition"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:35
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:44
+msgctxt "@action:inmenu menubar:view"
+msgid "Camera view"
+msgstr "Kameraansicht"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:47
+msgctxt "@action:inmenu menubar:view"
+msgid "Perspective"
+msgstr "Ansicht"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:59
+msgctxt "@action:inmenu menubar:view"
+msgid "Orthographic"
+msgstr "Orthogonal"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:80
msgctxt "@action:inmenu menubar:view"
msgid "&Build plate"
msgstr "&Druckplatte"
@@ -4159,12 +4079,7 @@ msgctxt "@label"
msgid "Select configuration"
msgstr "Konfiguration wählen"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
-msgctxt "@label"
-msgid "See the material compatibility chart"
-msgstr "Siehe Materialkompatibilitätstabelle"
-
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:221
msgctxt "@label"
msgid "Configurations"
msgstr "Konfigurationen"
@@ -4189,17 +4104,17 @@ msgctxt "@label"
msgid "Printer"
msgstr "Drucker"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:213
msgctxt "@label"
msgid "Enabled"
msgstr "Aktiviert"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:250
msgctxt "@label"
msgid "Material"
msgstr "Material"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:375
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
msgstr "Für diese Materialkombination Kleber für eine bessere Haftung verwenden."
@@ -4219,42 +4134,47 @@ msgctxt "@title:menu menubar:file"
msgid "Open &Recent"
msgstr "&Zuletzt geöffnet"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:145
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:140
msgctxt "@label"
msgid "Active print"
msgstr "Aktiver Druck"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:153
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:148
msgctxt "@label"
msgid "Job Name"
msgstr "Name des Auftrags"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:161
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:156
msgctxt "@label"
msgid "Printing Time"
msgstr "Druckzeit"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:169
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:164
msgctxt "@label"
msgid "Estimated time left"
msgstr "Geschätzte verbleibende Zeit"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
-msgid "View types"
-msgstr "Typen anzeigen"
+msgid "View type"
+msgstr "Typ anzeigen"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
+#: /home/ruben/Projects/Cura/resources/qml/ObjectSelector.qml:59
msgctxt "@label"
-msgid "Hi "
-msgstr "Hallo "
+msgid "Object list"
+msgstr "Objektliste"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:22
+msgctxt "@label The argument is a username."
+msgid "Hi %1"
+msgstr "Hallo %1"
+
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:33
msgctxt "@button"
msgid "Ultimaker account"
msgstr "Ultimaker‑Konto"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:42
msgctxt "@button"
msgid "Sign out"
msgstr "Abmelden"
@@ -4264,11 +4184,6 @@ msgctxt "@action:button"
msgid "Sign in"
msgstr "Anmelden"
-#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
-msgctxt "@label"
-msgid "Ultimaker Cloud"
-msgstr "Ultimaker Cloud"
-
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
@@ -4279,8 +4194,11 @@ msgctxt "@text"
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 "- 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"
+"- Get exclusive access to print profiles from leading brands"
+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 Druckprofilen von führenden Marken erhalten"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
@@ -4292,50 +4210,55 @@ msgctxt "@label"
msgid "No time estimation available"
msgstr "Keine Zeitschätzung verfügbar"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:77
msgctxt "@label"
msgid "No cost estimation available"
msgstr "Keine Kostenschätzung verfügbar"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:127
msgctxt "@button"
msgid "Preview"
msgstr "Vorschau"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:55
msgctxt "@label:PrintjobStatus"
msgid "Slicing..."
msgstr "Das Slicing läuft..."
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:61
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:67
msgctxt "@label:PrintjobStatus"
-msgid "Unable to Slice"
+msgid "Unable to slice"
msgstr "Slicing nicht möglich"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:103
+msgctxt "@button"
+msgid "Processing"
+msgstr "Verarbeitung läuft"
+
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:103
msgctxt "@button"
msgid "Slice"
msgstr "Slice"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:104
msgctxt "@label"
msgid "Start the slicing process"
msgstr "Slicing-Vorgang starten"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:118
msgctxt "@button"
msgid "Cancel"
msgstr "Abbrechen"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
-msgid "Time specification"
-msgstr "Zeitangabe"
+msgid "Time estimation"
+msgstr "Zeitschätzung"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
-msgid "Material specification"
-msgstr "Materialangabe"
+msgid "Material estimation"
+msgstr "Materialschätzung"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4357,285 +4280,299 @@ msgctxt "@label"
msgid "Preset printers"
msgstr "Voreingestellte Drucker"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
+#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:166
msgctxt "@button"
msgid "Add printer"
msgstr "Drucker hinzufügen"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
+#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:182
msgctxt "@button"
msgid "Manage printers"
msgstr "Drucker verwalten"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:81
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
msgstr "Online-Fehlerbehebung anzeigen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:88
msgctxt "@action:inmenu"
msgid "Toggle Full Screen"
msgstr "Umschalten auf Vollbild-Modus"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:92
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96
+msgctxt "@action:inmenu"
+msgid "Exit Full Screen"
+msgstr "Vollbildmodus beenden"
+
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:103
msgctxt "@action:inmenu menubar:edit"
msgid "&Undo"
msgstr "&Rückgängig machen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:113
msgctxt "@action:inmenu menubar:edit"
msgid "&Redo"
msgstr "&Wiederholen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:112
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:123
msgctxt "@action:inmenu menubar:file"
msgid "&Quit"
msgstr "&Beenden"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:120
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:131
msgctxt "@action:inmenu menubar:view"
msgid "3D View"
msgstr "3D-Ansicht"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138
msgctxt "@action:inmenu menubar:view"
msgid "Front View"
msgstr "Vorderansicht"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:145
msgctxt "@action:inmenu menubar:view"
msgid "Top View"
msgstr "Draufsicht"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:141
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:152
msgctxt "@action:inmenu menubar:view"
msgid "Left Side View"
msgstr "Ansicht von links"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:148
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:159
msgctxt "@action:inmenu menubar:view"
msgid "Right Side View"
msgstr "Ansicht von rechts"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:155
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:166
msgctxt "@action:inmenu"
msgid "Configure Cura..."
msgstr "Cura konfigurieren..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:173
msgctxt "@action:inmenu menubar:printer"
msgid "&Add Printer..."
msgstr "&Drucker hinzufügen..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179
msgctxt "@action:inmenu menubar:printer"
msgid "Manage Pr&inters..."
msgstr "Dr&ucker verwalten..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186
msgctxt "@action:inmenu"
msgid "Manage Materials..."
msgstr "Materialien werden verwaltet..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:184
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:195
msgctxt "@action:inmenu menubar:profile"
msgid "&Update profile with current settings/overrides"
msgstr "&Profil mit aktuellen Einstellungen/Überschreibungen aktualisieren"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:192
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203
msgctxt "@action:inmenu menubar:profile"
msgid "&Discard current changes"
msgstr "&Aktuelle Änderungen verwerfen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:204
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:215
msgctxt "@action:inmenu menubar:profile"
msgid "&Create profile from current settings/overrides..."
msgstr "P&rofil von aktuellen Einstellungen/Überschreibungen erstellen..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:221
msgctxt "@action:inmenu menubar:profile"
msgid "Manage Profiles..."
msgstr "Profile verwalten..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:229
msgctxt "@action:inmenu menubar:help"
msgid "Show Online &Documentation"
msgstr "Online-&Dokumentation anzeigen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:237
msgctxt "@action:inmenu menubar:help"
msgid "Report a &Bug"
msgstr "&Fehler melden"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:245
+msgctxt "@action:inmenu menubar:help"
+msgid "What's New"
+msgstr "Neuheiten"
+
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:251
msgctxt "@action:inmenu menubar:help"
msgid "About..."
msgstr "Über..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:241
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258
msgctxt "@action:inmenu menubar:edit"
msgid "Delete Selected Model"
msgid_plural "Delete Selected Models"
msgstr[0] "Ausgewähltes Modell löschen"
msgstr[1] "Ausgewählte Modelle löschen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:251
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:268
msgctxt "@action:inmenu menubar:edit"
msgid "Center Selected Model"
msgid_plural "Center Selected Models"
msgstr[0] "Ausgewähltes Modell zentrieren"
msgstr[1] "Ausgewählte Modelle zentrieren"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277
msgctxt "@action:inmenu menubar:edit"
msgid "Multiply Selected Model"
msgid_plural "Multiply Selected Models"
msgstr[0] "Ausgewähltes Modell multiplizieren"
msgstr[1] "Ausgewählte Modelle multiplizieren"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:286
msgctxt "@action:inmenu"
msgid "Delete Model"
msgstr "Modell löschen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294
msgctxt "@action:inmenu"
msgid "Ce&nter Model on Platform"
msgstr "Modell auf Druckplatte ze&ntrieren"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:283
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:300
msgctxt "@action:inmenu menubar:edit"
msgid "&Group Models"
msgstr "Modelle &gruppieren"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:303
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:320
msgctxt "@action:inmenu menubar:edit"
msgid "Ungroup Models"
msgstr "Gruppierung für Modelle aufheben"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:313
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:330
msgctxt "@action:inmenu menubar:edit"
msgid "&Merge Models"
msgstr "Modelle &zusammenführen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:340
msgctxt "@action:inmenu"
msgid "&Multiply Model..."
msgstr "Modell &multiplizieren..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:330
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:347
msgctxt "@action:inmenu menubar:edit"
msgid "Select All Models"
msgstr "Alle Modelle wählen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:340
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:357
msgctxt "@action:inmenu menubar:edit"
msgid "Clear Build Plate"
msgstr "Druckplatte reinigen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:367
msgctxt "@action:inmenu menubar:file"
msgid "Reload All Models"
msgstr "Alle Modelle neu laden"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:359
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:376
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange All Models To All Build Plates"
msgstr "Alle Modelle an allen Druckplatten anordnen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:383
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange All Models"
msgstr "Alle Modelle anordnen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:374
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:391
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange Selection"
msgstr "Anordnung auswählen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:381
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:398
msgctxt "@action:inmenu menubar:edit"
msgid "Reset All Model Positions"
msgstr "Alle Modellpositionen zurücksetzen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:388
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:405
msgctxt "@action:inmenu menubar:edit"
msgid "Reset All Model Transformations"
msgstr "Alle Modelltransformationen zurücksetzen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:412
msgctxt "@action:inmenu menubar:file"
msgid "&Open File(s)..."
msgstr "&Datei(en) öffnen..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:403
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:420
msgctxt "@action:inmenu menubar:file"
msgid "&New Project..."
msgstr "&Neues Projekt..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:427
msgctxt "@action:inmenu menubar:help"
msgid "Show Configuration Folder"
msgstr "Konfigurationsordner anzeigen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:441
msgctxt "@action:menu"
msgid "&Marketplace"
msgstr "&Marktplatz"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:24
msgctxt "@title:window"
msgid "Ultimaker Cura"
msgstr "Ultimaker Cura"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:181
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232
msgctxt "@label"
msgid "This package will be installed after restarting."
msgstr "Dieses Paket wird nach einem Neustart installiert."
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:357
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:413
msgctxt "@title:tab"
msgid "Settings"
msgstr "Einstellungen"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:486
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:539
msgctxt "@title:window"
msgid "Closing Cura"
msgstr "Cura wird geschlossen"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:487
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:499
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:540
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:552
msgctxt "@label"
msgid "Are you sure you want to exit Cura?"
msgstr "Möchten Sie Cura wirklich beenden?"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:531
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:590
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:19
msgctxt "@title:window"
msgid "Open file(s)"
msgstr "Datei(en) öffnen"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:632
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:691
msgctxt "@window:title"
msgid "Install Package"
msgstr "Paket installieren"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:640
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:699
msgctxt "@title:window"
msgid "Open File(s)"
msgstr "Datei(en) öffnen"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:643
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:702
msgctxt "@text:window"
msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one."
msgstr "Es wurden eine oder mehrere G-Code-Datei(en) innerhalb der von Ihnen gewählten Dateien gefunden. Sie können nur eine G-Code-Datei auf einmal öffnen. Wenn Sie eine G-Code-Datei öffnen möchten wählen Sie bitte nur eine Datei."
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:713
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:18
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:805
msgctxt "@title:window"
msgid "Add Printer"
msgstr "Drucker hinzufügen"
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:813
+msgctxt "@title:window"
+msgid "What's New"
+msgstr "Neuheiten"
+
#: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16
msgctxt "@label %1 is filled in with the name of an extruder"
msgid "Print Selected Model with %1"
@@ -4653,7 +4590,9 @@ 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.\nMöchten Sie diese Einstellungen übernehmen oder verwerfen?"
+msgstr ""
+"Sie haben einige Profileinstellungen angepasst.\n"
+"Möchten Sie diese Einstellungen übernehmen oder verwerfen?"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:110
msgctxt "@title:column"
@@ -4695,34 +4634,6 @@ msgctxt "@action:button"
msgid "Create New Profile"
msgstr "Neues Profil erstellen"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
-msgctxt "@title:tab"
-msgid "Add a printer to Cura"
-msgstr "Fügen Sie einen Drucker zu Cura hinzu"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
-msgctxt "@title:tab"
-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 "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 "Hersteller"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
-msgctxt "@label"
-msgid "Printer Name"
-msgstr "Druckername"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
-msgctxt "@action:button"
-msgid "Add Printer"
-msgstr "Drucker hinzufügen"
-
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:15
msgctxt "@title:window"
msgid "About Cura"
@@ -4743,7 +4654,9 @@ 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.\nCura verwendet mit Stolz die folgenden Open Source-Projekte:"
+msgstr ""
+"Cura wurde von Ultimaker B.V. in Zusammenarbeit mit der Community entwickelt.\n"
+"Cura verwendet mit Stolz die folgenden Open Source-Projekte:"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:134
msgctxt "@label"
@@ -4880,27 +4793,32 @@ msgctxt "@title:window"
msgid "Save Project"
msgstr "Projekt speichern"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:138
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:149
msgctxt "@action:label"
msgid "Build plate"
msgstr "Druckplatte"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:170
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:183
msgctxt "@action:label"
msgid "Extruder %1"
msgstr "Extruder %1"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:180
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:198
msgctxt "@action:label"
msgid "%1 & material"
msgstr "%1 & Material"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:243
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:200
+msgctxt "@action:label"
+msgid "Material"
+msgstr "Material"
+
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:272
msgctxt "@action:label"
msgid "Don't show project summary on save again"
msgstr "Projektzusammenfassung beim Speichern nicht erneut anzeigen"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:262
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:291
msgctxt "@action:button"
msgid "Save"
msgstr "Speichern"
@@ -4930,30 +4848,1069 @@ msgctxt "@action:button"
msgid "Import models"
msgstr "Modelle importieren"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:210
-msgctxt "@option:check"
-msgid "See only current build plate"
-msgstr "Nur aktuelle Druckplatte anzeigen"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DropDownWidget.qml:93
+msgctxt "@label"
+msgid "Empty"
+msgstr "Leer"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:226
-msgctxt "@action:button"
-msgid "Arrange to all build plates"
-msgstr "An allen Druckplatten ausrichten"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:24
+msgctxt "@label"
+msgid "Add a printer"
+msgstr "Einen Drucker hinzufügen"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:246
-msgctxt "@action:button"
-msgid "Arrange current build plate"
-msgstr "An aktueller Druckplatte ausrichten"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:39
+msgctxt "@label"
+msgid "Add a networked printer"
+msgstr "Einen vernetzten Drucker hinzufügen"
-#: X3GWriter/plugin.json
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:81
+msgctxt "@label"
+msgid "Add a non-networked printer"
+msgstr "Einen unvernetzten Drucker hinzufügen"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:70
+msgctxt "@label"
+msgid "Add printer by IP address"
+msgstr "Drucker nach IP-Adresse hinzufügen"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:133
+msgctxt "@text"
+msgid "Place enter your printer's IP address."
+msgstr "Bitte geben Sie die IP-Adresse Ihres Druckers ein."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:158
+msgctxt "@button"
+msgid "Add"
+msgstr "Hinzufügen"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:204
+msgctxt "@label"
+msgid "Could not connect to device."
+msgstr "Verbindung mit Drucker nicht möglich."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:208
+msgctxt "@label"
+msgid "The printer at this address has not responded yet."
+msgstr "Der Drucker unter dieser Adresse hat noch nicht reagiert."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:240
+msgctxt "@label"
+msgid "This printer cannot be added because it's an unknown printer or it's not the host of a group."
+msgstr "Dieser Drucker kann nicht hinzugefügt werden, weil es sich um einen unbekannten Drucker handelt oder er nicht im Host einer Gruppe enthalten ist."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:329
+msgctxt "@button"
+msgid "Back"
+msgstr "Zurück"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:342
+msgctxt "@button"
+msgid "Connect"
+msgstr "Verbinden"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/FirstStartMachineActionsContent.qml:77
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:123
+msgctxt "@button"
+msgid "Next"
+msgstr "Weiter"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:23
+msgctxt "@label"
+msgid "User Agreement"
+msgstr "Benutzervereinbarung"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:56
+msgctxt "@button"
+msgid "Agree"
+msgstr "Stimme zu"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:70
+msgctxt "@button"
+msgid "Decline and close"
+msgstr "Ablehnen und schließen"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:24
+msgctxt "@label"
+msgid "Help us to improve Ultimaker Cura"
+msgstr "Helfen Sie uns, Ultimaker Cura zu verbessern"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:57
+msgctxt "@text"
+msgid "Ultimaker Cura collects anonymous data to improve print quality and user experience, including:"
+msgstr "Ultimaker Cura erfasst anonyme Daten, um die Druckqualität und Benutzererfahrung zu steigern. Dazu gehören:"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:71
+msgctxt "@text"
+msgid "Machine types"
+msgstr "Gerätetypen"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:77
+msgctxt "@text"
+msgid "Material usage"
+msgstr "Materialverbrauch"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:83
+msgctxt "@text"
+msgid "Number of slices"
+msgstr "Anzahl der Slices"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:89
+msgctxt "@text"
+msgid "Print settings"
+msgstr "Druckeinstellungen"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:102
+msgctxt "@text"
+msgid "Data collected by Ultimaker Cura will not contain any personal information."
+msgstr "Die von Ultimaker Cura erfassten Daten enthalten keine personenbezogenen Daten."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:103
+msgctxt "@text"
+msgid "More information"
+msgstr "Mehr Informationen"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WhatsNewContent.qml:24
+msgctxt "@label"
+msgid "What's new in Ultimaker Cura"
+msgstr "Neuheiten bei Ultimaker Cura"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:42
+msgctxt "@label"
+msgid "There is no printer found over your network."
+msgstr "Kein Drucker in Ihrem Netzwerk gefunden."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:179
+msgctxt "@label"
+msgid "Refresh"
+msgstr "Aktualisieren"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:190
+msgctxt "@label"
+msgid "Add printer by IP"
+msgstr "Drucker nach IP hinzufügen"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:223
+msgctxt "@label"
+msgid "Troubleshooting"
+msgstr "Störungen beheben"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:207
+msgctxt "@label"
+msgid "Printer name"
+msgstr "Druckername"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:220
+msgctxt "@text"
+msgid "Please give your printer a name"
+msgstr "Weisen Sie Ihrem Drucker bitte einen Namen zu"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:36
+msgctxt "@label"
+msgid "Ultimaker Cloud"
+msgstr "Ultimaker Cloud"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:77
+msgctxt "@text"
+msgid "The next generation 3D printing workflow"
+msgstr "Der 3D-Druckablauf der nächsten Generation"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:94
+msgctxt "@text"
+msgid "- Send print jobs to Ultimaker printers outside your local network"
+msgstr "- Aufträge an Ultimaker-Drucker außerhalb Ihres lokalen Netzwerks senden"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:97
+msgctxt "@text"
+msgid "- Store your Ultimaker Cura settings in the cloud for use anywhere"
+msgstr "- Ihre Ultimaker Cura-Einstellungen für die Verwendung andernorts an die Cloud senden"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:100
+msgctxt "@text"
+msgid "- Get exclusive access to print profiles from leading brands"
+msgstr "- Exklusiven Zugang zu Druckprofilen von führenden Marken erhalten"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:119
+msgctxt "@button"
+msgid "Finish"
+msgstr "Beenden"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:128
+msgctxt "@button"
+msgid "Create an account"
+msgstr "Ein Konto erstellen"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:29
+msgctxt "@label"
+msgid "Welcome to Ultimaker Cura"
+msgstr "Willkommen bei Ultimaker Cura"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:47
+msgctxt "@text"
+msgid ""
+"Please follow these steps to set up\n"
+"Ultimaker Cura. This will only take a few moments."
+msgstr ""
+"Befolgen Sie bitte diese Schritte für das Einrichten von\n"
+"Ultimaker Cura. Dies dauert nur wenige Sekunden."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:58
+msgctxt "@button"
+msgid "Get started"
+msgstr "Erste Schritte"
+
+#: MachineSettingsAction/plugin.json
msgctxt "description"
-msgid "Allows saving the resulting slice as an X3G file, to support printers that read this format (Malyan, Makerbot and other Sailfish-based printers)."
-msgstr "Ermöglicht das Speichern des resultierenden Slices als X3G-Datei, um Drucker zu unterstützen, die dieses Format lesen (Malyan, Makerbot und andere Sailfish-basierte Drucker)."
+msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)."
+msgstr "Beschreibt die Durchführung der Geräteeinstellung (z. B. Druckabmessung, Düsengröße usw.)"
-#: X3GWriter/plugin.json
+#: MachineSettingsAction/plugin.json
msgctxt "name"
-msgid "X3GWriter"
-msgstr "X3G-Writer"
+msgid "Machine Settings action"
+msgstr "Beschreibung Geräteeinstellungen"
+
+#: Toolbox/plugin.json
+msgctxt "description"
+msgid "Find, manage and install new Cura packages."
+msgstr "Neue Cura Pakete finden, verwalten und installieren."
+
+#: Toolbox/plugin.json
+msgctxt "name"
+msgid "Toolbox"
+msgstr "Toolbox"
+
+#: XRayView/plugin.json
+msgctxt "description"
+msgid "Provides the X-Ray view."
+msgstr "Stellt die Röntgen-Ansicht bereit."
+
+#: XRayView/plugin.json
+msgctxt "name"
+msgid "X-Ray View"
+msgstr "Röntgen-Ansicht"
+
+#: X3DReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading X3D files."
+msgstr "Bietet Unterstützung für das Lesen von X3D-Dateien."
+
+#: X3DReader/plugin.json
+msgctxt "name"
+msgid "X3D Reader"
+msgstr "X3D-Reader"
+
+#: GCodeWriter/plugin.json
+msgctxt "description"
+msgid "Writes g-code to a file."
+msgstr "Schreibt G-Code in eine Datei."
+
+#: GCodeWriter/plugin.json
+msgctxt "name"
+msgid "G-code Writer"
+msgstr "G-Code-Writer"
+
+#: ModelChecker/plugin.json
+msgctxt "description"
+msgid "Checks models and print configuration for possible printing issues and give suggestions."
+msgstr "Überprüft Modelle und Druckkonfiguration auf mögliche Probleme und erteilt Empfehlungen."
+
+#: ModelChecker/plugin.json
+msgctxt "name"
+msgid "Model Checker"
+msgstr "Modell-Prüfer"
+
+#: cura-god-mode-plugin/src/GodMode/plugin.json
+msgctxt "description"
+msgid "Dump the contents of all settings to a HTML file."
+msgstr "Die Inhalte aller Einstellungen in eine HTML-Datei ausgeben."
+
+#: cura-god-mode-plugin/src/GodMode/plugin.json
+msgctxt "name"
+msgid "God Mode"
+msgstr "Gott-Modus"
+
+#: FirmwareUpdater/plugin.json
+msgctxt "description"
+msgid "Provides a machine actions for updating firmware."
+msgstr "Ermöglicht Gerätemaßnahmen für die Aktualisierung der Firmware."
+
+#: FirmwareUpdater/plugin.json
+msgctxt "name"
+msgid "Firmware Updater"
+msgstr "Firmware-Aktualisierungsfunktion"
+
+#: ProfileFlattener/plugin.json
+msgctxt "description"
+msgid "Create a flattened quality changes profile."
+msgstr "Erstellt eine geglättete Qualität, verändert das Profil."
+
+#: ProfileFlattener/plugin.json
+msgctxt "name"
+msgid "Profile Flattener"
+msgstr "Profilglättfunktion"
+
+#: AMFReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading AMF files."
+msgstr "Ermöglicht das Lesen von AMF-Dateien."
+
+#: AMFReader/plugin.json
+msgctxt "name"
+msgid "AMF Reader"
+msgstr "AMF-Reader"
+
+#: USBPrinting/plugin.json
+msgctxt "description"
+msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware."
+msgstr "Akzeptiert den G-Code und sendet diesen an einen Drucker. Das Plugin kann auch die Firmware aktualisieren."
+
+#: USBPrinting/plugin.json
+msgctxt "name"
+msgid "USB printing"
+msgstr "USB-Drucken"
+
+#: GCodeGzWriter/plugin.json
+msgctxt "description"
+msgid "Writes g-code to a compressed archive."
+msgstr "G-Code wird in ein komprimiertes Archiv geschrieben."
+
+#: GCodeGzWriter/plugin.json
+msgctxt "name"
+msgid "Compressed G-code Writer"
+msgstr "Writer für komprimierten G-Code"
+
+#: UFPWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for writing Ultimaker Format Packages."
+msgstr "Bietet Unterstützung für das Schreiben von Ultimaker Format Packages."
+
+#: UFPWriter/plugin.json
+msgctxt "name"
+msgid "UFP Writer"
+msgstr "UFP-Writer"
+
+#: PrepareStage/plugin.json
+msgctxt "description"
+msgid "Provides a prepare stage in Cura."
+msgstr "Bietet eine Vorbereitungsstufe in Cura."
+
+#: PrepareStage/plugin.json
+msgctxt "name"
+msgid "Prepare Stage"
+msgstr "Vorbereitungsstufe"
+
+#: RemovableDriveOutputDevice/plugin.json
+msgctxt "description"
+msgid "Provides removable drive hotplugging and writing support."
+msgstr "Ermöglicht Hotplugging des Wechseldatenträgers und Beschreiben."
+
+#: RemovableDriveOutputDevice/plugin.json
+msgctxt "name"
+msgid "Removable Drive Output Device Plugin"
+msgstr "Ausgabegerät-Plugin für Wechseldatenträger"
+
+#: UM3NetworkPrinting/plugin.json
+msgctxt "description"
+msgid "Manages network connections to Ultimaker 3 printers."
+msgstr "Verwaltet Netzwerkverbindungen zu Ultimaker 3-Druckern."
+
+#: UM3NetworkPrinting/plugin.json
+msgctxt "name"
+msgid "UM3 Network Connection"
+msgstr "UM3-Netzwerkverbindung"
+
+#: SettingsGuide/plugin.json
+msgctxt "description"
+msgid "Provides extra information and explanations about settings in Cura, with images and animations."
+msgstr "Bietet zusätzliche Informationen und Erklärungen zu den Einstellungen in Cura mit Abbildungen und Animationen."
+
+#: SettingsGuide/plugin.json
+msgctxt "name"
+msgid "Settings Guide"
+msgstr "Anleitung für Einstellungen"
+
+#: MonitorStage/plugin.json
+msgctxt "description"
+msgid "Provides a monitor stage in Cura."
+msgstr "Bietet eine Überwachungsstufe in Cura."
+
+#: MonitorStage/plugin.json
+msgctxt "name"
+msgid "Monitor Stage"
+msgstr "Überwachungsstufe"
+
+#: FirmwareUpdateChecker/plugin.json
+msgctxt "description"
+msgid "Checks for firmware updates."
+msgstr "Nach Firmware-Updates suchen."
+
+#: FirmwareUpdateChecker/plugin.json
+msgctxt "name"
+msgid "Firmware Update Checker"
+msgstr "Firmware-Update-Prüfer"
+
+#: SimulationView/plugin.json
+msgctxt "description"
+msgid "Provides the Simulation view."
+msgstr "Ermöglicht die Simulationsansicht."
+
+#: SimulationView/plugin.json
+msgctxt "name"
+msgid "Simulation View"
+msgstr "Simulationsansicht"
+
+#: GCodeGzReader/plugin.json
+msgctxt "description"
+msgid "Reads g-code from a compressed archive."
+msgstr "Liest G-Code-Format aus einem komprimierten Archiv."
+
+#: GCodeGzReader/plugin.json
+msgctxt "name"
+msgid "Compressed G-code Reader"
+msgstr "Reader für komprimierten G-Code"
+
+#: PostProcessingPlugin/plugin.json
+msgctxt "description"
+msgid "Extension that allows for user created scripts for post processing"
+msgstr "Erweiterung, die eine Nachbearbeitung von Skripten ermöglicht, die von Benutzern erstellt wurden"
+
+#: PostProcessingPlugin/plugin.json
+msgctxt "name"
+msgid "Post Processing"
+msgstr "Nachbearbeitung"
+
+#: SupportEraser/plugin.json
+msgctxt "description"
+msgid "Creates an eraser mesh to block the printing of support in certain places"
+msgstr "Erstellt ein Radierernetz, um den Druck von Stützstrukturen in bestimmten Positionen zu blockieren"
+
+#: SupportEraser/plugin.json
+msgctxt "name"
+msgid "Support Eraser"
+msgstr "Stützstruktur-Radierer"
+
+#: UFPReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading Ultimaker Format Packages."
+msgstr "Bietet Unterstützung für das Lesen von Ultimaker Format Packages."
+
+#: UFPReader/plugin.json
+msgctxt "name"
+msgid "UFP Reader"
+msgstr "UFP-Reader"
+
+#: SliceInfoPlugin/plugin.json
+msgctxt "description"
+msgid "Submits anonymous slice info. Can be disabled through preferences."
+msgstr "Sendet anonymisierte Slice-Informationen. Kann in den Einstellungen deaktiviert werden."
+
+#: SliceInfoPlugin/plugin.json
+msgctxt "name"
+msgid "Slice info"
+msgstr "Slice-Informationen"
+
+#: XmlMaterialProfile/plugin.json
+msgctxt "description"
+msgid "Provides capabilities to read and write XML-based material profiles."
+msgstr "Bietet Möglichkeiten, um XML-basierte Materialprofile zu lesen und zu schreiben."
+
+#: XmlMaterialProfile/plugin.json
+msgctxt "name"
+msgid "Material Profiles"
+msgstr "Materialprofile"
+
+#: LegacyProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing profiles from legacy Cura versions."
+msgstr "Bietet Unterstützung für den Import von Profilen der Vorgängerversionen von Cura."
+
+#: LegacyProfileReader/plugin.json
+msgctxt "name"
+msgid "Legacy Cura Profile Reader"
+msgstr "Cura-Vorgängerprofil-Reader"
+
+#: GCodeProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing profiles from g-code files."
+msgstr "Ermöglicht das Importieren von Profilen aus G-Code-Dateien."
+
+#: GCodeProfileReader/plugin.json
+msgctxt "name"
+msgid "G-code Profile Reader"
+msgstr "G-Code-Profil-Reader"
+
+#: VersionUpgrade/VersionUpgrade32to33/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.2 to Cura 3.3."
+msgstr "Aktualisiert Konfigurationen von Cura 3.2 auf Cura 3.3."
+
+#: VersionUpgrade/VersionUpgrade32to33/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.2 to 3.3"
+msgstr "Upgrade von Version 3.2 auf 3.3"
+
+#: VersionUpgrade/VersionUpgrade33to34/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.3 to Cura 3.4."
+msgstr "Aktualisiert Konfigurationen von Cura 3.3 auf Cura 3.4."
+
+#: VersionUpgrade/VersionUpgrade33to34/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.3 to 3.4"
+msgstr "Upgrade von Version 3.3 auf 3.4"
+
+#: VersionUpgrade/VersionUpgrade25to26/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
+msgstr "Aktualisiert Konfigurationen von Cura 2.5 auf Cura 2.6."
+
+#: VersionUpgrade/VersionUpgrade25to26/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.5 to 2.6"
+msgstr "Upgrade von Version 2.5 auf 2.6"
+
+#: VersionUpgrade/VersionUpgrade27to30/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
+msgstr "Aktualisiert Konfigurationen von Cura 2.7 auf Cura 3.0."
+
+#: VersionUpgrade/VersionUpgrade27to30/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.7 to 3.0"
+msgstr "Upgrade von Version 2.7 auf 3.0"
+
+#: VersionUpgrade/VersionUpgrade35to40/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.5 to Cura 4.0."
+msgstr "Aktualisiert Konfigurationen von Cura 3.5 auf Cura 4.0."
+
+#: VersionUpgrade/VersionUpgrade35to40/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.5 to 4.0"
+msgstr "Upgrade von Version 3.5 auf 4.0"
+
+#: VersionUpgrade/VersionUpgrade34to35/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.4 to Cura 3.5."
+msgstr "Aktualisiert Konfigurationen von Cura 3.4 auf Cura 3.5."
+
+#: VersionUpgrade/VersionUpgrade34to35/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.4 to 3.5"
+msgstr "Upgrade von Version 3.4 auf 3.5"
+
+#: VersionUpgrade/VersionUpgrade40to41/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 4.0 to Cura 4.1."
+msgstr "Aktualisiert Konfigurationen von Cura 4.0 auf Cura 4.1."
+
+#: VersionUpgrade/VersionUpgrade40to41/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 4.0 to 4.1"
+msgstr "Upgrade von Version 4.0 auf 4.1"
+
+#: VersionUpgrade/VersionUpgrade30to31/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.0 to Cura 3.1."
+msgstr "Aktualisiert Konfigurationen von Cura 3.0 auf Cura 3.1."
+
+#: VersionUpgrade/VersionUpgrade30to31/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.0 to 3.1"
+msgstr "Upgrade von Version 3.0 auf 3.1"
+
+#: VersionUpgrade/VersionUpgrade41to42/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 4.1 to Cura 4.2."
+msgstr "Aktualisiert Konfigurationen von Cura 4.1 auf Cura 4.2."
+
+#: VersionUpgrade/VersionUpgrade41to42/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 4.1 to 4.2"
+msgstr "Upgrade von Version 4.1 auf 4.2"
+
+#: VersionUpgrade/VersionUpgrade26to27/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
+msgstr "Aktualisiert Konfigurationen von Cura 2.6 auf Cura 2.7."
+
+#: VersionUpgrade/VersionUpgrade26to27/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.6 to 2.7"
+msgstr "Upgrade von Version 2.6 auf 2.7"
+
+#: VersionUpgrade/VersionUpgrade21to22/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
+msgstr "Aktualisiert Konfigurationen von Cura 2.1 auf Cura 2.2."
+
+#: VersionUpgrade/VersionUpgrade21to22/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.1 to 2.2"
+msgstr "Upgrade von Version 2.1 auf 2.2"
+
+#: VersionUpgrade/VersionUpgrade22to24/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
+msgstr "Aktualisiert Konfigurationen von Cura 2.2 auf Cura 2.4."
+
+#: VersionUpgrade/VersionUpgrade22to24/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.2 to 2.4"
+msgstr "Upgrade von Version 2.2 auf 2.4"
+
+#: ImageReader/plugin.json
+msgctxt "description"
+msgid "Enables ability to generate printable geometry from 2D image files."
+msgstr "Ermöglicht Erstellung von druckbarer Geometrie aus einer 2D-Bilddatei."
+
+#: ImageReader/plugin.json
+msgctxt "name"
+msgid "Image Reader"
+msgstr "Bild-Reader"
+
+#: CuraEngineBackend/plugin.json
+msgctxt "description"
+msgid "Provides the link to the CuraEngine slicing backend."
+msgstr "Stellt die Verbindung zum Slicing-Backend der CuraEngine her."
+
+#: CuraEngineBackend/plugin.json
+msgctxt "name"
+msgid "CuraEngine Backend"
+msgstr "CuraEngine Backend"
+
+#: PerObjectSettingsTool/plugin.json
+msgctxt "description"
+msgid "Provides the Per Model Settings."
+msgstr "Ermöglicht die Einstellungen pro Objekt."
+
+#: PerObjectSettingsTool/plugin.json
+msgctxt "name"
+msgid "Per Model Settings Tool"
+msgstr "Werkzeug „Einstellungen pro Objekt“"
+
+#: 3MFReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading 3MF files."
+msgstr "Ermöglicht das Lesen von 3MF-Dateien."
+
+#: 3MFReader/plugin.json
+msgctxt "name"
+msgid "3MF Reader"
+msgstr "3MF-Reader"
+
+#: SolidView/plugin.json
+msgctxt "description"
+msgid "Provides a normal solid mesh view."
+msgstr "Bietet eine normale, solide Netzansicht."
+
+#: SolidView/plugin.json
+msgctxt "name"
+msgid "Solid View"
+msgstr "Solide Ansicht"
+
+#: GCodeReader/plugin.json
+msgctxt "description"
+msgid "Allows loading and displaying G-code files."
+msgstr "Ermöglicht das Laden und Anzeigen von G-Code-Dateien."
+
+#: GCodeReader/plugin.json
+msgctxt "name"
+msgid "G-code Reader"
+msgstr "G-Code-Reader"
+
+#: CuraDrive/plugin.json
+msgctxt "description"
+msgid "Backup and restore your configuration."
+msgstr "Sicherung und Wiederherstellen Ihrer Konfiguration."
+
+#: CuraDrive/plugin.json
+msgctxt "name"
+msgid "Cura Backups"
+msgstr "Cura-Backups"
+
+#: CuraProfileWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for exporting Cura profiles."
+msgstr "Ermöglicht das Exportieren von Cura-Profilen."
+
+#: CuraProfileWriter/plugin.json
+msgctxt "name"
+msgid "Cura Profile Writer"
+msgstr "Cura-Profil-Writer"
+
+#: CuraPrintProfileCreator/plugin.json
+msgctxt "description"
+msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI."
+msgstr "Ermöglichen Sie Materialherstellern die Erstellung neuer Material- und Qualitätsprofile, indem Sie eine Drop-In-Benutzerschnittstelle verwenden."
+
+#: CuraPrintProfileCreator/plugin.json
+msgctxt "name"
+msgid "Print Profile Assistant"
+msgstr "Druckprofil-Assistent"
+
+#: 3MFWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for writing 3MF files."
+msgstr "Bietet Unterstützung für das Schreiben von 3MF-Dateien."
+
+#: 3MFWriter/plugin.json
+msgctxt "name"
+msgid "3MF Writer"
+msgstr "3MF-Writer"
+
+#: PreviewStage/plugin.json
+msgctxt "description"
+msgid "Provides a preview stage in Cura."
+msgstr "Bietet eine Vorschaustufe in Cura."
+
+#: PreviewStage/plugin.json
+msgctxt "name"
+msgid "Preview Stage"
+msgstr "Vorschaustufe"
+
+#: UltimakerMachineActions/plugin.json
+msgctxt "description"
+msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)."
+msgstr "Ermöglicht Maschinenabläufe für Ultimaker-Maschinen (z. B. Assistent für Bettnivellierung, Auswahl von Upgrades usw.)"
+
+#: UltimakerMachineActions/plugin.json
+msgctxt "name"
+msgid "Ultimaker machine actions"
+msgstr "Ultimaker-Maschinenabläufe"
+
+#: CuraProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing Cura profiles."
+msgstr "Ermöglicht das Importieren von Cura-Profilen."
+
+#: CuraProfileReader/plugin.json
+msgctxt "name"
+msgid "Cura Profile Reader"
+msgstr "Cura-Profil-Reader"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Cura Settings Guide"
+#~ msgstr "Anleitung für Cura-Einstellungen"
+
+#~ msgctxt "@info:generic"
+#~ msgid "Settings have been changed to match the current availability of extruders: [%s]"
+#~ msgstr "Die Einstellungen wurden passend für die aktuelle Verfügbarkeit der Extruder geändert: [%s]"
+
+#~ msgctxt "@title:groupbox"
+#~ msgid "User description"
+#~ msgstr "Benutzerbeschreibung"
+
+#~ msgctxt "@info"
+#~ msgid "These options are not available because you are monitoring a cloud printer."
+#~ msgstr "Diese Optionen sind nicht verfügbar, weil Sie einen Cloud-Drucker überwachen."
+
+#~ msgctxt "@label link to connect manager"
+#~ msgid "Go to Cura Connect"
+#~ msgstr "Gehe zu Cura Connect"
+
+#~ msgctxt "@info"
+#~ msgid "All jobs are printed."
+#~ msgstr "Alle Aufträge wurden gedruckt."
+
+#~ msgctxt "@label link to connect manager"
+#~ msgid "View print history"
+#~ msgstr "Druckauftragshistorie anzeigen"
+
+#~ msgctxt "@label"
+#~ 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:"
+
+#~ msgctxt "@info"
+#~ 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 ""
+#~ "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."
+
+#~ msgctxt "@option:check"
+#~ msgid "See only current build plate"
+#~ msgstr "Nur aktuelle Druckplatte anzeigen"
+
+#~ msgctxt "@action:button"
+#~ msgid "Arrange to all build plates"
+#~ msgstr "An allen Druckplatten ausrichten"
+
+#~ msgctxt "@action:button"
+#~ msgid "Arrange current build plate"
+#~ msgstr "An aktueller Druckplatte ausrichten"
+
+#~ msgctxt "description"
+#~ msgid "Allows saving the resulting slice as an X3G file, to support printers that read this format (Malyan, Makerbot and other Sailfish-based printers)."
+#~ msgstr "Ermöglicht das Speichern des resultierenden Slices als X3G-Datei, um Drucker zu unterstützen, die dieses Format lesen (Malyan, Makerbot und andere Sailfish-basierte Drucker)."
+
+#~ msgctxt "name"
+#~ msgid "X3GWriter"
+#~ msgstr "X3G-Writer"
+
+#~ msgctxt "description"
+#~ msgid "Reads SVG files as toolpaths, for debugging printer movements."
+#~ msgstr "Liest SVG-Dateien als Werkzeugwege für die Fehlersuche bei Druckerbewegungen."
+
+#~ msgctxt "name"
+#~ msgid "SVG Toolpath Reader"
+#~ msgstr "SVG-Werkzeugweg-Reader"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Changelog"
+#~ msgstr "Änderungsprotokoll"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Show Changelog"
+#~ msgstr "Änderungsprotokoll anzeigen"
+
+#~ msgctxt "@info:status"
+#~ msgid "Sending data to remote cluster"
+#~ msgstr "Daten werden zu Remote-Cluster gesendet"
+
+#~ msgctxt "@info:status"
+#~ msgid "Connect to Ultimaker Cloud"
+#~ msgstr "Verbinden mit Ultimaker Cloud"
+
+#~ msgctxt "@info"
+#~ msgid "Cura collects anonymized usage statistics."
+#~ msgstr "Cura erfasst anonymisierte Nutzungsstatistiken."
+
+#~ msgctxt "@info:title"
+#~ msgid "Collecting Data"
+#~ msgstr "Daten werden erfasst"
+
+#~ msgctxt "@action:button"
+#~ msgid "More info"
+#~ msgstr "Mehr Infos"
+
+#~ msgctxt "@action:tooltip"
+#~ msgid "See more information on what data Cura sends."
+#~ msgstr "Siehe mehr Informationen dazu, was Cura sendet."
+
+#~ msgctxt "@action:button"
+#~ msgid "Allow"
+#~ msgstr "Zulassen"
+
+#~ msgctxt "@action:tooltip"
+#~ msgid "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."
+#~ msgstr "Damit lassen Sie zu, dass Cura anonymisierte Nutzungsstatistiken sendet, um zukünftige Verbesserungen für Cura zu definieren. Einige Ihrer Präferenzen und Einstellungen, die Cura-Version und ein Hash der Modelle, die Sie slicen, werden gesendet."
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Evaluation"
+#~ msgstr "Bewertung"
+
+#~ msgctxt "@info:title"
+#~ msgid "Network enabled printers"
+#~ msgstr "Netzwerkfähige Drucker"
+
+#~ msgctxt "@info:title"
+#~ msgid "Local printers"
+#~ msgstr "Lokale Drucker"
+
+#~ msgctxt "@info:backup_failed"
+#~ msgid "Tried to restore a Cura backup that does not match your current version."
+#~ msgstr "Versucht, ein Cura-Backup zu erstellen, das nicht Ihrer aktuellen Version entspricht."
+
+#~ msgctxt "@title"
+#~ msgid "Machine Settings"
+#~ msgstr "Geräteeinstellungen"
+
+#~ msgctxt "@label"
+#~ msgid "Printer Settings"
+#~ msgstr "Druckereinstellungen"
+
+#~ msgctxt "@option:check"
+#~ msgid "Origin at center"
+#~ msgstr "Ausgang in Mitte"
+
+#~ msgctxt "@option:check"
+#~ msgid "Heated bed"
+#~ msgstr "Heizbares Bett"
+
+#~ msgctxt "@label"
+#~ msgid "Printhead Settings"
+#~ msgstr "Druckkopfeinstellungen"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Abstand von der linken Seite des Druckkopfes zur Düsenmitte. Wird verwendet, um Kollisionen zwischen vorherigen Drucken und dem Druckkopf während des Druckmodus „Nacheinander“ zu vermeiden."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Abstand von der Vorderseite des Druckkopfes zur Düsenmitte. Wird verwendet, um Kollisionen zwischen vorherigen Drucken und dem Druckkopf während des Druckmodus „Nacheinander“ zu vermeiden."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Abstand von der rechten Seite des Druckkopfes zur Düsenmitte. Wird verwendet, um Kollisionen zwischen vorherigen Drucken und dem Druckkopf während des Druckmodus „Nacheinander“ zu vermeiden."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Abstand von der Rückseite des Druckkopfes zur Düsenmitte. Wird verwendet, um Kollisionen zwischen vorherigen Drucken und dem Druckkopf während des Druckmodus „Nacheinander“ zu vermeiden."
+
+#~ msgctxt "@label"
+#~ msgid "Gantry height"
+#~ msgstr "Brückenhöhe"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Der Höhenunterschied zwischen der Düsenspitze und dem Brückensystem (X- und Y-Achsen). Wird verwendet, um Kollisionen zwischen vorherigen Drucken und der Brücke zu verhindern, wenn im Modus „Nacheinander“ gedruckt wird."
+
+#~ msgctxt "@label"
+#~ msgid "Start G-code"
+#~ msgstr "Start G-code"
+
+#~ msgctxt "@tooltip"
+#~ msgid "G-code commands to be executed at the very start."
+#~ msgstr "G-Code-Befehle, die zum Start ausgeführt werden sollen."
+
+#~ msgctxt "@label"
+#~ msgid "End G-code"
+#~ msgstr "Ende G-code"
+
+#~ msgctxt "@tooltip"
+#~ msgid "G-code commands to be executed at the very end."
+#~ msgstr "G-Code-Befehle, die am Ende ausgeführt werden sollen."
+
+#~ msgctxt "@label"
+#~ msgid "Nozzle Settings"
+#~ msgstr "Düseneinstellungen"
+
+#~ msgctxt "@tooltip"
+#~ msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile."
+#~ msgstr "Der Nenndurchmesser des durch den Drucker unterstützten Filaments. Der exakte Durchmesser wird durch das Material und/oder das Profil überschrieben."
+
+#~ msgctxt "@label"
+#~ msgid "Extruder Start G-code"
+#~ msgstr "G-Code Extruder-Start"
+
+#~ msgctxt "@label"
+#~ msgid "Extruder End G-code"
+#~ msgstr "G-Code Extruder-Ende"
+
+#~ msgctxt "@label"
+#~ msgid "Changelog"
+#~ msgstr "Änderungsprotokoll"
+
+#~ msgctxt "@title:window"
+#~ msgid "User Agreement"
+#~ msgstr "Benutzervereinbarung"
+
+#~ msgctxt "@alabel"
+#~ msgid "Enter the IP address or hostname of your printer on the network."
+#~ msgstr "Geben Sie die IP-Adresse oder den Hostnamen Ihres Druckers auf dem Netzwerk ein."
+
+#~ msgctxt "@info"
+#~ msgid "Please select a network connected printer to monitor."
+#~ msgstr "Bitte einen mit dem Netzwerk verbunden Drucker für die Überwachung wählen."
+
+#~ msgctxt "@info"
+#~ msgid "Please connect your Ultimaker printer to your local network."
+#~ msgstr "Verbinden Sie Ihren Ultimaker-Drucker bitte mit Ihrem lokalen Netzwerk."
+
+#~ msgctxt "@text:window"
+#~ msgid "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."
+#~ msgstr "Cura sendet anonyme Daten an Ultimaker, um die Druckqualität und Benutzererfahrung zu steigern. Nachfolgend ist ein Beispiel aller Daten, die gesendet werden."
+
+#~ msgctxt "@text:window"
+#~ msgid "I don't want to send this data"
+#~ msgstr "Ich möchte diese Daten nicht senden"
+
+#~ msgctxt "@text:window"
+#~ msgid "Allow sending this data to Ultimaker and help us improve Cura"
+#~ msgstr "Ich erlaube das Senden der Daten an Ultimaker, um Cura zu verbessern"
+
+#~ msgctxt "@label"
+#~ msgid "No print selected"
+#~ msgstr "Kein Druck ausgewählt"
+
+#~ msgctxt "@info:tooltip"
+#~ msgid "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."
+#~ msgstr "Standardmäßig repräsentieren weiße Pixel hohe Punkte im Netz und schwarze Pixel repräsentieren niedrige Punkte im Netz. Ändern Sie diese Option um das Verhalten so umzukehren, dass schwarze Pixel hohe Punkte im Netz darstellen und weiße Pixel niedrige Punkte im Netz."
+
+#~ msgctxt "@title"
+#~ msgid "Select Printer Upgrades"
+#~ msgstr "Drucker-Upgrades wählen"
+
+#~ msgctxt "@label"
+#~ msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air."
+#~ msgstr "Wählen Sie, welcher Extruder für die Unterstützung verwendet wird. Dient zum Konstruieren von Stützstrukturen unter dem Modell, damit dieses nicht absinkt oder frei schwebend gedruckt wird."
+
+#~ 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 "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."
+
+#~ msgctxt "@label shown when we load a Gcode file"
+#~ msgid "Print setup disabled. G code file can not be modified."
+#~ msgstr "Druckeinrichtung ist deaktiviert. G-Code kann nicht geändert werden."
+
+#~ msgctxt "@label"
+#~ msgid "See the material compatibility chart"
+#~ msgstr "Siehe Materialkompatibilitätstabelle"
+
+#~ msgctxt "@label"
+#~ msgid "View types"
+#~ msgstr "Typen anzeigen"
+
+#~ msgctxt "@label"
+#~ msgid "Hi "
+#~ msgstr "Hallo "
+
+#~ msgctxt "@text"
+#~ 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 ""
+#~ "- 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"
+
+#~ msgctxt "@label:PrintjobStatus"
+#~ msgid "Unable to Slice"
+#~ msgstr "Slicing nicht möglich"
+
+#~ msgctxt "@label"
+#~ msgid "Time specification"
+#~ msgstr "Zeitangabe"
+
+#~ msgctxt "@label"
+#~ msgid "Material specification"
+#~ msgstr "Materialangabe"
+
+#~ msgctxt "@title:tab"
+#~ msgid "Add a printer to Cura"
+#~ msgstr "Fügen Sie einen Drucker zu Cura hinzu"
+
+#~ msgctxt "@title:tab"
+#~ 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 ""
+#~ "Wählen Sie den zu verwendenden Drucker aus der nachfolgenden Liste.\n"
+#~ "\n"
+#~ "Wenn 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."
+
+#~ msgctxt "@label"
+#~ msgid "Manufacturer"
+#~ msgstr "Hersteller"
+
+#~ msgctxt "@label"
+#~ msgid "Printer Name"
+#~ msgstr "Druckername"
+
+#~ msgctxt "@action:button"
+#~ msgid "Add Printer"
+#~ msgstr "Drucker hinzufügen"
#~ msgid "Modify G-Code"
#~ msgstr "G-Code ändern"
@@ -5151,7 +6108,6 @@ 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"
@@ -5295,62 +6251,6 @@ msgstr "X3G-Writer"
#~ msgid "Click to check the material compatibility on Ultimaker.com."
#~ msgstr "Klicken Sie, um die Materialkompatibilität auf Ultimaker.com zu prüfen."
-#~ msgctxt "description"
-#~ msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)."
-#~ msgstr "Beschreibt die Durchführung der Geräteeinstellung (z. B. Druckabmessung, Düsengröße usw.)"
-
-#~ msgctxt "name"
-#~ msgid "Machine Settings action"
-#~ msgstr "Beschreibung Geräteeinstellungen"
-
-#~ msgctxt "description"
-#~ msgid "Find, manage and install new Cura packages."
-#~ msgstr "Neue Cura Pakete finden, verwalten und installieren."
-
-#~ msgctxt "name"
-#~ msgid "Toolbox"
-#~ msgstr "Toolbox"
-
-#~ msgctxt "description"
-#~ msgid "Provides the X-Ray view."
-#~ msgstr "Stellt die Röntgen-Ansicht bereit."
-
-#~ msgctxt "name"
-#~ msgid "X-Ray View"
-#~ msgstr "Röntgen-Ansicht"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for reading X3D files."
-#~ msgstr "Bietet Unterstützung für das Lesen von X3D-Dateien."
-
-#~ msgctxt "name"
-#~ msgid "X3D Reader"
-#~ msgstr "X3D-Reader"
-
-#~ msgctxt "description"
-#~ msgid "Writes g-code to a file."
-#~ msgstr "Schreibt G-Code in eine Datei."
-
-#~ msgctxt "name"
-#~ msgid "G-code Writer"
-#~ msgstr "G-Code-Writer"
-
-#~ msgctxt "description"
-#~ msgid "Checks models and print configuration for possible printing issues and give suggestions."
-#~ msgstr "Überprüft Modelle und Druckkonfiguration auf mögliche Probleme und erteilt Empfehlungen."
-
-#~ msgctxt "name"
-#~ msgid "Model Checker"
-#~ msgstr "Modell-Prüfer"
-
-#~ msgctxt "description"
-#~ msgid "Dump the contents of all settings to a HTML file."
-#~ msgstr "Die Inhalte aller Einstellungen in eine HTML-Datei ausgeben."
-
-#~ msgctxt "name"
-#~ msgid "God Mode"
-#~ msgstr "Gott-Modus"
-
#~ msgctxt "description"
#~ msgid "Shows changes since latest checked version."
#~ msgstr "Zeigt die Änderungen seit der letzten geprüften Version an."
@@ -5359,14 +6259,6 @@ msgstr "X3G-Writer"
#~ msgid "Changelog"
#~ msgstr "Änderungsprotokoll"
-#~ msgctxt "description"
-#~ msgid "Provides a machine actions for updating firmware."
-#~ msgstr "Ermöglicht Gerätemaßnahmen für die Aktualisierung der Firmware."
-
-#~ msgctxt "name"
-#~ msgid "Firmware Updater"
-#~ msgstr "Firmware-Aktualisierungsfunktion"
-
#~ msgctxt "description"
#~ msgid "Create a flattend quality changes profile."
#~ msgstr "Erstellt eine geglättete Qualität, verändert das Profil."
@@ -5375,14 +6267,6 @@ msgstr "X3G-Writer"
#~ msgid "Profile flatener"
#~ msgstr "Profilglättfunktion"
-#~ msgctxt "description"
-#~ msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware."
-#~ msgstr "Akzeptiert den G-Code und sendet diesen an einen Drucker. Das Plugin kann auch die Firmware aktualisieren."
-
-#~ msgctxt "name"
-#~ msgid "USB printing"
-#~ msgstr "USB-Drucken"
-
#~ msgctxt "description"
#~ msgid "Ask the user once if he/she agrees with our license."
#~ msgstr "Den Benutzer einmalig fragen, ob er unsere Lizenz akzeptiert."
@@ -5391,278 +6275,6 @@ msgstr "X3G-Writer"
#~ msgid "UserAgreement"
#~ msgstr "UserAgreement"
-#~ msgctxt "description"
-#~ msgid "Writes g-code to a compressed archive."
-#~ msgstr "G-Code wird in ein komprimiertes Archiv geschrieben."
-
-#~ msgctxt "name"
-#~ msgid "Compressed G-code Writer"
-#~ msgstr "Writer für komprimierten G-Code"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for writing Ultimaker Format Packages."
-#~ msgstr "Bietet Unterstützung für das Schreiben von Ultimaker Format Packages."
-
-#~ msgctxt "name"
-#~ msgid "UFP Writer"
-#~ msgstr "UFP-Writer"
-
-#~ msgctxt "description"
-#~ msgid "Provides a prepare stage in Cura."
-#~ msgstr "Bietet eine Vorbereitungsstufe in Cura."
-
-#~ msgctxt "name"
-#~ msgid "Prepare Stage"
-#~ msgstr "Vorbereitungsstufe"
-
-#~ msgctxt "description"
-#~ msgid "Provides removable drive hotplugging and writing support."
-#~ msgstr "Ermöglicht Hotplugging des Wechseldatenträgers und Beschreiben."
-
-#~ msgctxt "name"
-#~ msgid "Removable Drive Output Device Plugin"
-#~ msgstr "Ausgabegerät-Plugin für Wechseldatenträger"
-
-#~ msgctxt "description"
-#~ msgid "Manages network connections to Ultimaker 3 printers."
-#~ msgstr "Verwaltet Netzwerkverbindungen zu Ultimaker 3-Druckern."
-
-#~ msgctxt "name"
-#~ msgid "UM3 Network Connection"
-#~ msgstr "UM3-Netzwerkverbindung"
-
-#~ msgctxt "description"
-#~ msgid "Provides a monitor stage in Cura."
-#~ msgstr "Bietet eine Überwachungsstufe in Cura."
-
-#~ msgctxt "name"
-#~ msgid "Monitor Stage"
-#~ msgstr "Überwachungsstufe"
-
-#~ msgctxt "description"
-#~ msgid "Checks for firmware updates."
-#~ msgstr "Nach Firmware-Updates suchen."
-
-#~ msgctxt "name"
-#~ msgid "Firmware Update Checker"
-#~ msgstr "Firmware-Update-Prüfer"
-
-#~ msgctxt "description"
-#~ msgid "Provides the Simulation view."
-#~ msgstr "Ermöglicht die Simulationsansicht."
-
-#~ msgctxt "name"
-#~ msgid "Simulation View"
-#~ msgstr "Simulationsansicht"
-
-#~ msgctxt "description"
-#~ msgid "Reads g-code from a compressed archive."
-#~ msgstr "Liest G-Code-Format aus einem komprimierten Archiv."
-
-#~ msgctxt "name"
-#~ msgid "Compressed G-code Reader"
-#~ msgstr "Reader für komprimierten G-Code"
-
-#~ msgctxt "description"
-#~ msgid "Extension that allows for user created scripts for post processing"
-#~ msgstr "Erweiterung, die eine Nachbearbeitung von Skripten ermöglicht, die von Benutzern erstellt wurden"
-
-#~ msgctxt "name"
-#~ msgid "Post Processing"
-#~ msgstr "Nachbearbeitung"
-
-#~ msgctxt "description"
-#~ msgid "Creates an eraser mesh to block the printing of support in certain places"
-#~ msgstr "Erstellt ein Radierernetz, um den Druck von Stützstrukturen in bestimmten Positionen zu blockieren"
-
-#~ msgctxt "name"
-#~ msgid "Support Eraser"
-#~ msgstr "Stützstruktur-Radierer"
-
-#~ msgctxt "description"
-#~ msgid "Submits anonymous slice info. Can be disabled through preferences."
-#~ msgstr "Sendet anonymisierte Slice-Informationen. Kann in den Einstellungen deaktiviert werden."
-
-#~ msgctxt "name"
-#~ msgid "Slice info"
-#~ msgstr "Slice-Informationen"
-
-#~ msgctxt "description"
-#~ msgid "Provides capabilities to read and write XML-based material profiles."
-#~ msgstr "Bietet Möglichkeiten, um XML-basierte Materialprofile zu lesen und zu schreiben."
-
-#~ msgctxt "name"
-#~ msgid "Material Profiles"
-#~ msgstr "Materialprofile"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing profiles from legacy Cura versions."
-#~ msgstr "Bietet Unterstützung für den Import von Profilen der Vorgängerversionen von Cura."
-
-#~ msgctxt "name"
-#~ msgid "Legacy Cura Profile Reader"
-#~ msgstr "Cura-Vorgängerprofil-Reader"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing profiles from g-code files."
-#~ msgstr "Ermöglicht das Importieren von Profilen aus G-Code-Dateien."
-
-#~ msgctxt "name"
-#~ msgid "G-code Profile Reader"
-#~ msgstr "G-Code-Profil-Reader"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.2 to Cura 3.3."
-#~ msgstr "Aktualisiert Konfigurationen von Cura 3.2 auf Cura 3.3."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.2 to 3.3"
-#~ msgstr "Upgrade von Version 3.2 auf 3.3"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.3 to Cura 3.4."
-#~ msgstr "Aktualisiert Konfigurationen von Cura 3.3 auf Cura 3.4."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.3 to 3.4"
-#~ msgstr "Upgrade von Version 3.3 auf 3.4"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
-#~ msgstr "Aktualisiert Konfigurationen von Cura 2.5 auf Cura 2.6."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.5 to 2.6"
-#~ msgstr "Upgrade von Version 2.5 auf 2.6"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
-#~ msgstr "Aktualisiert Konfigurationen von Cura 2.7 auf Cura 3.0."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.7 to 3.0"
-#~ msgstr "Upgrade von Version 2.7 auf 3.0"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.4 to Cura 3.5."
-#~ msgstr "Aktualisiert Konfigurationen von Cura 3.4 auf Cura 3.5."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.4 to 3.5"
-#~ msgstr "Upgrade von Version 3.4 auf 3.5"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.0 to Cura 3.1."
-#~ msgstr "Aktualisiert Konfigurationen von Cura 3.0 auf Cura 3.1."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.0 to 3.1"
-#~ msgstr "Upgrade von Version 3.0 auf 3.1"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
-#~ msgstr "Aktualisiert Konfigurationen von Cura 2.6 auf Cura 2.7."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.6 to 2.7"
-#~ msgstr "Upgrade von Version 2.6 auf 2.7"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
-#~ msgstr "Aktualisiert Konfigurationen von Cura 2.1 auf Cura 2.2."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.1 to 2.2"
-#~ msgstr "Upgrade von Version 2.1 auf 2.2"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
-#~ msgstr "Aktualisiert Konfigurationen von Cura 2.2 auf Cura 2.4."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.2 to 2.4"
-#~ msgstr "Upgrade von Version 2.2 auf 2.4"
-
-#~ msgctxt "description"
-#~ msgid "Enables ability to generate printable geometry from 2D image files."
-#~ msgstr "Ermöglicht Erstellung von druckbarer Geometrie aus einer 2D-Bilddatei."
-
-#~ msgctxt "name"
-#~ msgid "Image Reader"
-#~ msgstr "Bild-Reader"
-
-#~ msgctxt "description"
-#~ msgid "Provides the link to the CuraEngine slicing backend."
-#~ msgstr "Stellt die Verbindung zum Slicing-Backend der CuraEngine her."
-
-#~ msgctxt "name"
-#~ msgid "CuraEngine Backend"
-#~ msgstr "CuraEngine Backend"
-
-#~ msgctxt "description"
-#~ msgid "Provides the Per Model Settings."
-#~ msgstr "Ermöglicht die Einstellungen pro Objekt."
-
-#~ msgctxt "name"
-#~ msgid "Per Model Settings Tool"
-#~ msgstr "Werkzeug „Einstellungen pro Objekt“"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for reading 3MF files."
-#~ msgstr "Ermöglicht das Lesen von 3MF-Dateien."
-
-#~ msgctxt "name"
-#~ msgid "3MF Reader"
-#~ msgstr "3MF-Reader"
-
-#~ msgctxt "description"
-#~ msgid "Provides a normal solid mesh view."
-#~ msgstr "Bietet eine normale, solide Netzansicht."
-
-#~ msgctxt "name"
-#~ msgid "Solid View"
-#~ msgstr "Solide Ansicht"
-
-#~ msgctxt "description"
-#~ msgid "Allows loading and displaying G-code files."
-#~ msgstr "Ermöglicht das Laden und Anzeigen von G-Code-Dateien."
-
-#~ msgctxt "name"
-#~ msgid "G-code Reader"
-#~ msgstr "G-Code-Reader"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for exporting Cura profiles."
-#~ msgstr "Ermöglicht das Exportieren von Cura-Profilen."
-
-#~ msgctxt "name"
-#~ msgid "Cura Profile Writer"
-#~ msgstr "Cura-Profil-Writer"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for writing 3MF files."
-#~ msgstr "Bietet Unterstützung für das Schreiben von 3MF-Dateien."
-
-#~ msgctxt "name"
-#~ msgid "3MF Writer"
-#~ msgstr "3MF-Writer"
-
-#~ msgctxt "description"
-#~ msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)."
-#~ msgstr "Ermöglicht Maschinenabläufe für Ultimaker-Maschinen (z. B. Assistent für Bettnivellierung, Auswahl von Upgrades usw.)"
-
-#~ msgctxt "name"
-#~ msgid "Ultimaker machine actions"
-#~ msgstr "Ultimaker-Maschinenabläufe"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing Cura profiles."
-#~ msgstr "Ermöglicht das Importieren von Cura-Profilen."
-
-#~ msgctxt "name"
-#~ msgid "Cura Profile Reader"
-#~ msgstr "Cura-Profil-Reader"
-
#~ msgctxt "@warning:status"
#~ msgid "Please generate G-code before saving."
#~ msgstr "Generieren Sie vor dem Speichern bitte einen G-Code."
@@ -5703,14 +6315,6 @@ msgstr "X3G-Writer"
#~ msgid "Upgrade Firmware"
#~ msgstr "Firmware aktualisieren"
-#~ msgctxt "description"
-#~ msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI."
-#~ msgstr "Ermöglichen Sie Materialherstellern die Erstellung neuer Material- und Qualitätsprofile, indem Sie eine Drop-In-Benutzerschnittstelle verwenden."
-
-#~ msgctxt "name"
-#~ msgid "Print Profile Assistant"
-#~ msgstr "Druckprofil-Assistent"
-
#~ msgctxt "@action:button"
#~ msgid "Print with Doodle3D WiFi-Box"
#~ msgstr "Mit Doodle3D WLAN-Box drucken"
@@ -5756,7 +6360,6 @@ msgstr "X3G-Writer"
#~ "Could not export using \"{}\" quality!\n"
#~ "Felt back to \"{}\"."
#~ msgstr ""
-
#~ "Exportieren in \"{}\" Qualität nicht möglich!\n"
#~ "Zurückgeschaltet auf \"{}\"."
@@ -5933,7 +6536,6 @@ 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"
@@ -5950,7 +6552,6 @@ 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!"
@@ -5961,7 +6562,6 @@ 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!"
@@ -5986,7 +6586,6 @@ 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"
@@ -6001,7 +6600,6 @@ 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"
@@ -6106,7 +6704,6 @@ msgstr "X3G-Writer"
#~ "Open the directory\n"
#~ "with macro and icon"
#~ msgstr ""
-
#~ "Verzeichnis\n"
#~ "mit Makro und Symbol öffnen"
@@ -6405,7 +7002,6 @@ 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!"
@@ -6416,7 +7012,6 @@ 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!"
@@ -6451,7 +7046,6 @@ 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"
#~ " "
@@ -6618,7 +7212,6 @@ msgstr "X3G-Writer"
#~ " Please use the \"Send report\" button to post a bug report automatically to our servers
\n"
#~ " "
#~ msgstr ""
-
#~ "Ein schwerer Ausnahmefehler 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"
#~ " "
@@ -6765,7 +7358,6 @@ msgstr "X3G-Writer"
#~ " Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues
\n"
#~ " "
#~ msgstr ""
-
#~ "Ein schwerer Ausnahmezustand ist aufgetreten, den wir nicht beseitigen konnten!
\n"
#~ " Bitte senden Sie einen Fehlerbericht an folgende URL http://github.com/Ultimaker/Cura/issues
\n"
#~ " "
@@ -6808,7 +7400,6 @@ 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?"
@@ -7336,7 +7927,6 @@ 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"
@@ -7366,7 +7956,6 @@ msgstr "X3G-Writer"
#~ " Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues
\n"
#~ " "
#~ msgstr ""
-
#~ "Ein schwerer Ausnahmezustand ist aufgetreten, den wir nicht beseitigen konnten!
\n"
#~ " Wir hoffen, dass dieses Bild eines Kätzchens Ihren Schock etwas abschwächt.
\n"
#~ " Verwenden Sie bitte die nachstehenden Informationen, um einen Fehlerbericht an folgende URL zu senden: http://github.com/Ultimaker/Cura/issues
\n"
diff --git a/resources/i18n/de_DE/fdmextruder.def.json.po b/resources/i18n/de_DE/fdmextruder.def.json.po
index bb77e47fec..3df5bac5ef 100644
--- a/resources/i18n/de_DE/fdmextruder.def.json.po
+++ b/resources/i18n/de_DE/fdmextruder.def.json.po
@@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0000\n"
+"POT-Creation-Date: 2019-07-16 14:38+0000\n"
"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: German\n"
diff --git a/resources/i18n/de_DE/fdmprinter.def.json.po b/resources/i18n/de_DE/fdmprinter.def.json.po
index cc2ed06ac5..99d81c92f2 100644
--- a/resources/i18n/de_DE/fdmprinter.def.json.po
+++ b/resources/i18n/de_DE/fdmprinter.def.json.po
@@ -5,12 +5,12 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2019-03-13 14:00+0200\n"
-"Last-Translator: Bothof \n"
-"Language-Team: German\n"
+"POT-Creation-Date: 2019-07-16 14:38+0000\n"
+"PO-Revision-Date: 2019-07-29 15:51+0200\n"
+"Last-Translator: Lionbridge \n"
+"Language-Team: German , German \n"
"Language: de_DE\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -57,7 +57,9 @@ 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"
@@ -69,7 +71,9 @@ 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"
@@ -233,7 +237,7 @@ msgstr "Anzahl der Extruder-Elemente. Ein Extruder-Element ist die Kombination a
#: fdmprinter.def.json
msgctxt "extruders_enabled_count label"
-msgid "Number of Extruders that are enabled"
+msgid "Number of Extruders That Are Enabled"
msgstr "Anzahl der aktivierten Extruder"
#: fdmprinter.def.json
@@ -243,7 +247,7 @@ msgstr "Anzahl der aktivierten Extruder-Elemente; wird automatisch in der Softwa
#: fdmprinter.def.json
msgctxt "machine_nozzle_tip_outer_diameter label"
-msgid "Outer nozzle diameter"
+msgid "Outer Nozzle Diameter"
msgstr "Düsendurchmesser außen"
#: fdmprinter.def.json
@@ -253,7 +257,7 @@ msgstr "Der Außendurchmesser der Düsenspitze."
#: fdmprinter.def.json
msgctxt "machine_nozzle_head_distance label"
-msgid "Nozzle length"
+msgid "Nozzle Length"
msgstr "Düsenlänge"
#: fdmprinter.def.json
@@ -263,7 +267,7 @@ msgstr "Der Höhenunterschied zwischen der Düsenspitze und dem untersten Bereic
#: fdmprinter.def.json
msgctxt "machine_nozzle_expansion_angle label"
-msgid "Nozzle angle"
+msgid "Nozzle Angle"
msgstr "Düsenwinkel"
#: fdmprinter.def.json
@@ -273,7 +277,7 @@ msgstr "Der Winkel zwischen der horizontalen Planfläche und dem konischen Teil
#: fdmprinter.def.json
msgctxt "machine_heat_zone_length label"
-msgid "Heat zone length"
+msgid "Heat Zone Length"
msgstr "Heizzonenlänge"
#: fdmprinter.def.json
@@ -303,7 +307,7 @@ msgstr "Für die Temperatursteuerung von Cura. Schalten Sie diese Funktion aus,
#: fdmprinter.def.json
msgctxt "machine_nozzle_heat_up_speed label"
-msgid "Heat up speed"
+msgid "Heat Up Speed"
msgstr "Aufheizgeschwindigkeit"
#: fdmprinter.def.json
@@ -313,7 +317,7 @@ msgstr "Die Geschwindigkeit (°C/Sek.), mit der die Düse durchschnittlich bei n
#: fdmprinter.def.json
msgctxt "machine_nozzle_cool_down_speed label"
-msgid "Cool down speed"
+msgid "Cool Down Speed"
msgstr "Abkühlgeschwindigkeit"
#: fdmprinter.def.json
@@ -333,7 +337,7 @@ msgstr "Die Mindestzeit, die ein Extruder inaktiv sein muss, bevor die Düse abk
#: fdmprinter.def.json
msgctxt "machine_gcode_flavor label"
-msgid "G-code flavour"
+msgid "G-code Flavor"
msgstr "G-Code-Variante"
#: fdmprinter.def.json
@@ -398,7 +402,7 @@ msgstr "Definiert, ob Firmware-Einzugsbefehle (G10/G11) anstelle der E-Eigenscha
#: fdmprinter.def.json
msgctxt "machine_disallowed_areas label"
-msgid "Disallowed areas"
+msgid "Disallowed Areas"
msgstr "Unzulässige Bereiche"
#: fdmprinter.def.json
@@ -418,7 +422,7 @@ msgstr "Eine Liste mit Polygonen mit Bereichen, in welche die Düse nicht eintre
#: fdmprinter.def.json
msgctxt "machine_head_polygon label"
-msgid "Machine head polygon"
+msgid "Machine Head Polygon"
msgstr "Gerätekopf Polygon"
#: fdmprinter.def.json
@@ -428,7 +432,7 @@ msgstr "Eine 2D-Shilhouette des Druckkopfes (ohne Lüfterkappen)."
#: fdmprinter.def.json
msgctxt "machine_head_with_fans_polygon label"
-msgid "Machine head & Fan polygon"
+msgid "Machine Head & Fan Polygon"
msgstr "Gerätekopf und Lüfter Polygon"
#: fdmprinter.def.json
@@ -438,7 +442,7 @@ msgstr "Eine 2D-Shilhouette des Druckkopfes (mit Lüfterkappen)."
#: fdmprinter.def.json
msgctxt "gantry_height label"
-msgid "Gantry height"
+msgid "Gantry Height"
msgstr "Brückenhöhe"
#: fdmprinter.def.json
@@ -468,7 +472,7 @@ msgstr "Der Innendurchmesser der Düse. Verwenden Sie diese Einstellung, wenn Si
#: fdmprinter.def.json
msgctxt "machine_use_extruder_offset_to_offset_coords label"
-msgid "Offset With Extruder"
+msgid "Offset with Extruder"
msgstr "Versatz mit Extruder"
#: fdmprinter.def.json
@@ -1293,8 +1297,12 @@ msgstr "Präferenz Nahtkante"
#: fdmprinter.def.json
msgctxt "z_seam_corner description"
-msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner."
-msgstr "Definieren Sie, ob Kanten am Modell-Umriss die Nahtposition beeinflussen. Keine bedeutet, dass Kanten keinen Einfluss auf die Nahtposition haben. Naht verbergen lässt die Naht mit höherer Wahrscheinlichkeit an einer innenliegenden Kante auftreten. Naht offenlegen lässt die Naht mit höherer Wahrscheinlichkeit an einer Außenkante auftreten. Naht verbergen oder offenlegen lässt die Naht mit höherer Wahrscheinlichkeit an einer innenliegenden oder außenliegenden Kante auftreten."
+msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner. Smart Hiding allows both inside and outside corners, but chooses inside corners more frequently, if appropriate."
+msgstr "Definieren Sie, ob Kanten am Modell-Umriss die Nahtposition beeinflussen. Keine bedeutet, dass Kanten keinen Einfluss auf die Nahtposition haben. Naht"
+" verbergen lässt die Naht mit höherer Wahrscheinlichkeit an einer innenliegenden Kante auftreten. Naht offenlegen lässt die Naht mit höherer Wahrscheinlichkeit"
+" an einer Außenkante auftreten. Naht verbergen oder offenlegen lässt die Naht mit höherer Wahrscheinlichkeit an einer innenliegenden oder außenliegenden"
+" Kante auftreten. Intelligent verbergen lässt die Naht an innen- oder außenliegenden Kanten auftreten, verwendet aber – falls zweckmäßig – häufiger innenliegende"
+" Kanten."
#: fdmprinter.def.json
msgctxt "z_seam_corner option z_seam_corner_none"
@@ -1316,6 +1324,11 @@ msgctxt "z_seam_corner option z_seam_corner_any"
msgid "Hide or Expose Seam"
msgstr "Naht verbergen oder offenlegen"
+#: fdmprinter.def.json
+msgctxt "z_seam_corner option z_seam_corner_weighted"
+msgid "Smart Hiding"
+msgstr "Intelligent verbergen"
+
#: fdmprinter.def.json
msgctxt "z_seam_relative label"
msgid "Z Seam Relative"
@@ -1328,13 +1341,15 @@ msgstr "Bei Aktivierung sind die Z-Naht-Koordinaten relativ zur Mitte der jeweil
#: fdmprinter.def.json
msgctxt "skin_no_small_gaps_heuristic label"
-msgid "Ignore Small Z Gaps"
-msgstr "Schmale Z-Lücken ignorieren"
+msgid "No Skin in Z Gaps"
+msgstr "Keine Außenhaut in Z-Lücken"
#: fdmprinter.def.json
msgctxt "skin_no_small_gaps_heuristic description"
-msgid "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting."
-msgstr "Wenn das Modell schmale vertikale Lücken hat, kann etwa 5 % zusätzliche Rechenzeit aufgewendet werden, um eine obere und untere Außenhaut in diesen engen Räumen zu generieren. In diesem Fall deaktivieren Sie die Einstellung."
+msgid "When the model has small vertical gaps of only a few layers, there should normally be skin around those layers in the narrow space. Enable this setting to not generate skin if the vertical gap is very small. This improves printing time and slicing time, but technically leaves infill exposed to the air."
+msgstr "Wenn das Modell kleine, nur wenige Schichten hohe vertikale Lücken aufweist, sind diese normalerweise von einer Außenhaut bedeckt. Aktivieren Sie diese"
+" Einstellung, damit bei sehr kleinen Lücken keine Außenhaut gedruckt wird. Dies verkürzt die zum Drucken und Slicen benötigte Zeit, aber die Füllung bleibt"
+" der Luft ausgesetzt."
#: fdmprinter.def.json
msgctxt "skin_outline_count label"
@@ -1631,7 +1646,9 @@ 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"
@@ -1863,6 +1880,16 @@ msgctxt "default_material_print_temperature description"
msgid "The default temperature used for printing. This should be the \"base\" temperature of a material. All other print temperatures should use offsets based on this value"
msgstr "Die für den Druck verwendete Standardtemperatur. Dies sollte die „Basis“-Temperatur eines Materials sein. Alle anderen Drucktemperaturen sollten anhand dieses Wertes einen Versatz verwenden"
+#: fdmprinter.def.json
+msgctxt "build_volume_temperature label"
+msgid "Build Volume Temperature"
+msgstr "Temperatur Druckabmessung"
+
+#: fdmprinter.def.json
+msgctxt "build_volume_temperature description"
+msgid "The temperature of the environment to print in. If this is 0, the build volume temperature will not be adjusted."
+msgstr "Die Temperatur der Druckumgebung. Beträgt der Wert 0, wird die Druckraumtemperatur nicht angepasst."
+
#: fdmprinter.def.json
msgctxt "material_print_temperature label"
msgid "Printing Temperature"
@@ -1973,6 +2000,86 @@ msgctxt "material_shrinkage_percentage description"
msgid "Shrinkage ratio in percentage."
msgstr "Schrumpfungsverhältnis in Prozent."
+#: fdmprinter.def.json
+msgctxt "material_crystallinity label"
+msgid "Crystalline Material"
+msgstr "Kristallines Material"
+
+#: fdmprinter.def.json
+msgctxt "material_crystallinity description"
+msgid "Is this material the type that breaks off cleanly when heated (crystalline), or is it the type that produces long intertwined polymer chains (non-crystalline)?"
+msgstr "Lässt sich das Material im erhitzten Zustand leicht brechen (kristallin) oder bildet es lange, verflochtene Polymerketten (nicht kristallin)?"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retracted_position label"
+msgid "Anti-ooze Retracted Position"
+msgstr "Einzugsmaß für Sickerschutz"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retracted_position description"
+msgid "How far the material needs to be retracted before it stops oozing."
+msgstr "Maß, um das das Material eingezogen werden muss, damit es nicht heraussickert."
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retraction_speed label"
+msgid "Anti-ooze Retraction Speed"
+msgstr "Einzugsgeschwindigkeit für Sickerschutz"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retraction_speed description"
+msgid "How fast the material needs to be retracted during a filament switch to prevent oozing."
+msgstr "Geschwindigkeit, mit der das Material beim Filamentwechsel eingezogen werden muss, damit es nicht heraussickert."
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_retracted_position label"
+msgid "Break Preparation Retracted Position"
+msgstr "Einzugsmaß für Bruchvorbereitung"
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_retracted_position description"
+msgid "How far the filament can be stretched before it breaks, while heated."
+msgstr "Streckmaß für das Filament im erhitzten Zustand, bevor es bricht."
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_speed label"
+msgid "Break Preparation Retraction Speed"
+msgstr "Einzugsgeschwindigkeit für Bruchvorbereitung"
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_speed description"
+msgid "How fast the filament needs to be retracted just before breaking it off in a retraction."
+msgstr "Geschwindigkeit, mit der das Filament eingezogen werden muss, bevor es beim Einziehen abgebrochen wird."
+
+#: fdmprinter.def.json
+msgctxt "material_break_retracted_position label"
+msgid "Break Retracted Position"
+msgstr "Einzugsmaß für das Brechen"
+
+#: fdmprinter.def.json
+msgctxt "material_break_retracted_position description"
+msgid "How far to retract the filament in order to break it cleanly."
+msgstr "Maß, um das das Filament eingezogen werden muss, damit es sauber abgebrochen werden kann."
+
+#: fdmprinter.def.json
+msgctxt "material_break_speed label"
+msgid "Break Retraction Speed"
+msgstr "Einzugsgeschwindigkeit für das Brechen"
+
+#: fdmprinter.def.json
+msgctxt "material_break_speed description"
+msgid "The speed at which to retract the filament in order to break it cleanly."
+msgstr "Geschwindigkeit, mit der das Filament eingezogen werden muss, damit es sauber abgebrochen werden kann."
+
+#: fdmprinter.def.json
+msgctxt "material_break_temperature label"
+msgid "Break Temperature"
+msgstr "Bruchtemperatur"
+
+#: fdmprinter.def.json
+msgctxt "material_break_temperature description"
+msgid "The temperature at which the filament is broken for a clean break."
+msgstr "Die Temperatur, bei der das Filament für eine saubere Bruchstelle gebrochen wird."
+
#: fdmprinter.def.json
msgctxt "material_flow label"
msgid "Flow"
@@ -1983,6 +2090,126 @@ msgctxt "material_flow description"
msgid "Flow compensation: the amount of material extruded is multiplied by this value."
msgstr "Fluss-Kompensation: Die extrudierte Materialmenge wird mit diesem Wert multipliziert."
+#: fdmprinter.def.json
+msgctxt "wall_material_flow label"
+msgid "Wall Flow"
+msgstr "Wandfluss"
+
+#: fdmprinter.def.json
+msgctxt "wall_material_flow description"
+msgid "Flow compensation on wall lines."
+msgstr "Durchflusskompensation an Wandlinien."
+
+#: fdmprinter.def.json
+msgctxt "wall_0_material_flow label"
+msgid "Outer Wall Flow"
+msgstr "Wandfluss außen"
+
+#: fdmprinter.def.json
+msgctxt "wall_0_material_flow description"
+msgid "Flow compensation on the outermost wall line."
+msgstr "Durchflusskompensation an der äußeren Wandlinie."
+
+#: fdmprinter.def.json
+msgctxt "wall_x_material_flow label"
+msgid "Inner Wall(s) Flow"
+msgstr "Wandfluss innen"
+
+#: fdmprinter.def.json
+msgctxt "wall_x_material_flow description"
+msgid "Flow compensation on wall lines for all wall lines except the outermost one."
+msgstr "Durchflusskompensation an allen Wandlinien bis auf die äußere."
+
+#: fdmprinter.def.json
+msgctxt "skin_material_flow label"
+msgid "Top/Bottom Flow"
+msgstr "Fluss oben/unten"
+
+#: fdmprinter.def.json
+msgctxt "skin_material_flow description"
+msgid "Flow compensation on top/bottom lines."
+msgstr "Durchflusskompensation an oberen/unteren Linien."
+
+#: fdmprinter.def.json
+msgctxt "roofing_material_flow label"
+msgid "Top Surface Skin Flow"
+msgstr "Fluss Oberfläche Außenhaut"
+
+#: fdmprinter.def.json
+msgctxt "roofing_material_flow description"
+msgid "Flow compensation on lines of the areas at the top of the print."
+msgstr "Durchflusskompensation an Linien von Flächen an der Oberseite des Druckobjekts."
+
+#: fdmprinter.def.json
+msgctxt "infill_material_flow label"
+msgid "Infill Flow"
+msgstr "Fluss der Füllung"
+
+#: fdmprinter.def.json
+msgctxt "infill_material_flow description"
+msgid "Flow compensation on infill lines."
+msgstr "Durchflusskompensation an Füllungslinien."
+
+#: fdmprinter.def.json
+msgctxt "skirt_brim_material_flow label"
+msgid "Skirt/Brim Flow"
+msgstr "Skirt/Brim-Fluss"
+
+#: fdmprinter.def.json
+msgctxt "skirt_brim_material_flow description"
+msgid "Flow compensation on skirt or brim lines."
+msgstr "Durchflusskompensation an Skirt- oder Brim-Linien."
+
+#: fdmprinter.def.json
+msgctxt "support_material_flow label"
+msgid "Support Flow"
+msgstr "Stützstruktur-Fluss"
+
+#: fdmprinter.def.json
+msgctxt "support_material_flow description"
+msgid "Flow compensation on support structure lines."
+msgstr "Durchflusskompensation an Stützstrukturlinien."
+
+#: fdmprinter.def.json
+msgctxt "support_interface_material_flow label"
+msgid "Support Interface Flow"
+msgstr "Fluss Stützstruktur-Schnittstelle"
+
+#: fdmprinter.def.json
+msgctxt "support_interface_material_flow description"
+msgid "Flow compensation on lines of support roof or floor."
+msgstr "Durchflusskompensation an Dach- oder Bodenlinien der Stützstruktur."
+
+#: fdmprinter.def.json
+msgctxt "support_roof_material_flow label"
+msgid "Support Roof Flow"
+msgstr "Stützdachfluss"
+
+#: fdmprinter.def.json
+msgctxt "support_roof_material_flow description"
+msgid "Flow compensation on support roof lines."
+msgstr "Durchflusskompensation an Stützdachlinien."
+
+#: fdmprinter.def.json
+msgctxt "support_bottom_material_flow label"
+msgid "Support Floor Flow"
+msgstr "Stützbodenfluss"
+
+#: fdmprinter.def.json
+msgctxt "support_bottom_material_flow description"
+msgid "Flow compensation on support floor lines."
+msgstr "Durchflusskompensation an Stützbodenlinien."
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_flow label"
+msgid "Prime Tower Flow"
+msgstr "Fluss Einzugsturm"
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_flow description"
+msgid "Flow compensation on prime tower lines."
+msgstr "Durchflusskompensation an Einzugsturmlinien."
+
#: fdmprinter.def.json
msgctxt "material_flow_layer_0 label"
msgid "Initial Layer Flow"
@@ -2100,8 +2327,9 @@ msgstr "Stützstruktur-Einzüge einschränken"
#: fdmprinter.def.json
msgctxt "limit_support_retractions description"
-msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excesive stringing within the support structure."
-msgstr "Lassen Sie den Einzug beim Vorgehen von Stützstruktur zu Stützstruktur in einer geraden Linie aus. Die Aktivierung dieser Einstellung spart Druckzeit, kann jedoch zu übermäßigem Fadenziehen innerhalb der Stützstruktur führen."
+msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excessive stringing within the support structure."
+msgstr "Lassen Sie den Einzug beim Vorgehen von Stützstruktur zu Stützstruktur in einer geraden Linie aus. Die Aktivierung dieser Einstellung spart Druckzeit,"
+" kann jedoch zu übermäßigem Fadenziehen innerhalb der Stützstruktur führen."
#: fdmprinter.def.json
msgctxt "material_standby_temperature label"
@@ -2153,6 +2381,16 @@ msgctxt "switch_extruder_prime_speed description"
msgid "The speed at which the filament is pushed back after a nozzle switch retraction."
msgstr "Die Geschwindigkeit, mit der das Filament während eines Düsenschaltereinzugs zurückgeschoben wird."
+#: fdmprinter.def.json
+msgctxt "switch_extruder_extra_prime_amount label"
+msgid "Nozzle Switch Extra Prime Amount"
+msgstr "Zusätzliche Einzugsmenge bei Düsenwechsel"
+
+#: fdmprinter.def.json
+msgctxt "switch_extruder_extra_prime_amount description"
+msgid "Extra material to prime after nozzle switching."
+msgstr "Nach einem Düsenwechsel zusätzlich bereitzustellendes Material."
+
#: fdmprinter.def.json
msgctxt "speed label"
msgid "Speed"
@@ -2344,14 +2582,15 @@ msgid "The speed at which the skirt and brim are printed. Normally this is done
msgstr "Die Geschwindigkeit, mit der die Skirt- und Brim-Elemente gedruckt werden. Normalerweise wird dafür die Geschwindigkeit der Basisschicht verwendet. In machen Fällen kann es jedoch vorteilhaft sein, das Skirt- oder Brim-Element mit einer anderen Geschwindigkeit zu drucken."
#: fdmprinter.def.json
-msgctxt "max_feedrate_z_override label"
-msgid "Maximum Z Speed"
-msgstr "Maximale Z-Geschwindigkeit"
+msgctxt "speed_z_hop label"
+msgid "Z Hop Speed"
+msgstr "Sprunghöhe Z"
#: fdmprinter.def.json
-msgctxt "max_feedrate_z_override description"
-msgid "The maximum speed with which the build plate is moved. Setting this to zero causes the print to use the firmware defaults for the maximum z speed."
-msgstr "Die maximale Geschwindigkeit, mit der die Druckplatte bewegt wird. Eine Einstellung auf Null veranlasst die Verwendung der Firmware-Grundeinstellungen für die maximale Z-Geschwindigkeit."
+msgctxt "speed_z_hop description"
+msgid "The speed at which the vertical Z movement is made for Z Hops. This is typically lower than the print speed since the build plate or machine's gantry is harder to move."
+msgstr "Die Geschwindigkeit, mit der bei Z-Sprüngen die vertikale Bewegung (Z-Achse) erfolgt. Diese liegt in der Regel unterhalb der Druckgeschwindigkeit, da die"
+" Bewegung von Druckbett oder Brücke schwieriger ist."
#: fdmprinter.def.json
msgctxt "speed_slowdown_layers label"
@@ -2923,6 +3162,16 @@ msgctxt "retraction_hop_after_extruder_switch description"
msgid "After the machine switched from one extruder to the other, the build plate is lowered to create clearance between the nozzle and the print. This prevents the nozzle from leaving oozed material on the outside of a print."
msgstr "Nachdem das Gerät von einem Extruder zu einem anderen geschaltet hat, wird die Druckplatte abgesenkt, um einen Abstand zwischen der Düse und dem Druck zu bilden. Das verhindert, dass die Düse abgesondertes Material auf der Außenseite des Drucks hinterlässt."
+#: fdmprinter.def.json
+msgctxt "retraction_hop_after_extruder_switch_height label"
+msgid "Z Hop After Extruder Switch Height"
+msgstr "Z-Sprung nach Extruder-Schalterhöhe"
+
+#: fdmprinter.def.json
+msgctxt "retraction_hop_after_extruder_switch_height description"
+msgid "The height difference when performing a Z Hop after extruder switch."
+msgstr "Der Höhenunterschied bei Ausführung eines Z-Sprungs nach Extruder-Schalter."
+
#: fdmprinter.def.json
msgctxt "cooling label"
msgid "Cooling"
@@ -3193,6 +3442,11 @@ msgctxt "support_pattern option cross"
msgid "Cross"
msgstr "Quer"
+#: fdmprinter.def.json
+msgctxt "support_pattern option gyroid"
+msgid "Gyroid"
+msgstr "Gyroid"
+
#: fdmprinter.def.json
msgctxt "support_wall_count label"
msgid "Support Wall Line Count"
@@ -3254,12 +3508,12 @@ msgid "Distance between the printed initial layer support structure lines. This
msgstr "Der Abstand zwischen der ursprünglichen gedruckten Stützstrukturlinien. Diese Einstellung wird anhand der Dichte der Stützstruktur berechnet."
#: fdmprinter.def.json
-msgctxt "support_infill_angle label"
-msgid "Support Infill Line Direction"
+msgctxt "support_infill_angles label"
+msgid "Support Infill Line Directions"
msgstr "Unterstützung Linienrichtung Füllung"
#: fdmprinter.def.json
-msgctxt "support_infill_angle description"
+msgctxt "support_infill_angles description"
msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane."
msgstr "Ausrichtung des Füllmusters für Unterstützung. Das Füllmuster für Unterstützung wird in der horizontalen Planfläche gedreht."
@@ -3390,8 +3644,9 @@ msgstr "Abstand für Zusammenführung der Stützstrukturen"
#: fdmprinter.def.json
msgctxt "support_join_distance description"
-msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one."
-msgstr "Der Maximalabstand zwischen Stützstrukturen in der X- und Y-Richtung. Wenn sich einzelne Strukturen näher aneinander befinden, als dieser Wert, werden diese Strukturen in eine einzige Struktur zusammengefügt."
+msgid "The maximum distance between support structures in the X/Y directions. When separate structures are closer together than this value, the structures merge into one."
+msgstr "Der Maximalabstand zwischen Stützstrukturen in der X- und Y-Richtung. Wenn der Abstand einzelner Strukturen zueinander diesen Wert unterschreitet, werden"
+" diese Strukturen miteinander kombiniert und bilden eine Struktur."
#: fdmprinter.def.json
msgctxt "support_offset label"
@@ -3769,13 +4024,13 @@ msgid "The diameter of a special tower."
msgstr "Der Durchmesser eines speziellen Pfeilers."
#: fdmprinter.def.json
-msgctxt "support_minimal_diameter label"
-msgid "Minimum Diameter"
-msgstr "Mindestdurchmesser"
+msgctxt "support_tower_maximum_supported_diameter label"
+msgid "Maximum Tower-Supported Diameter"
+msgstr "Maximaler Durchmesser für Stützpfeiler"
#: fdmprinter.def.json
-msgctxt "support_minimal_diameter description"
-msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
+msgctxt "support_tower_maximum_supported_diameter description"
+msgid "Maximum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
msgstr "Der Mindestdurchmesser in den X/Y-Richtungen eines kleinen Bereichs, der durch einen speziellen Stützpfeiler gestützt wird."
#: fdmprinter.def.json
@@ -3898,7 +4153,9 @@ 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.\nEs 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.\n"
+"Es 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"
@@ -4270,16 +4527,6 @@ msgctxt "prime_tower_enable description"
msgid "Print a tower next to the print which serves to prime the material after each nozzle switch."
msgstr "Drucken Sie einen Turm neben dem Druck, der zum Einziehen des Materials nach jeder Düsenschaltung dient."
-#: fdmprinter.def.json
-msgctxt "prime_tower_circular label"
-msgid "Circular Prime Tower"
-msgstr "Einzugsturm kreisförmig"
-
-#: fdmprinter.def.json
-msgctxt "prime_tower_circular description"
-msgid "Make the prime tower as a circular shape."
-msgstr "Macht den Einzugsturm zu einer Kreisform."
-
#: fdmprinter.def.json
msgctxt "prime_tower_size label"
msgid "Prime Tower Size"
@@ -4320,16 +4567,6 @@ msgctxt "prime_tower_position_y description"
msgid "The y coordinate of the position of the prime tower."
msgstr "Die Y-Koordinate der Position des Einzugsturms."
-#: fdmprinter.def.json
-msgctxt "prime_tower_flow label"
-msgid "Prime Tower Flow"
-msgstr "Fluss Einzugsturm"
-
-#: fdmprinter.def.json
-msgctxt "prime_tower_flow description"
-msgid "Flow compensation: the amount of material extruded is multiplied by this value."
-msgstr "Fluss-Kompensation: Die extrudierte Materialmenge wird mit diesem Wert multipliziert."
-
#: fdmprinter.def.json
msgctxt "prime_tower_wipe_enabled label"
msgid "Wipe Inactive Nozzle on Prime Tower"
@@ -4340,6 +4577,16 @@ msgctxt "prime_tower_wipe_enabled description"
msgid "After printing the prime tower with one nozzle, wipe the oozed material from the other nozzle off on the prime tower."
msgstr "Nach dem Drucken des Einzugsturms mit einer Düse wird das ausgetretene Material von der anderen Düse am Einzugsturm abgewischt."
+#: fdmprinter.def.json
+msgctxt "prime_tower_brim_enable label"
+msgid "Prime Tower Brim"
+msgstr "Brim Einzugsturm"
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_brim_enable description"
+msgid "Prime-towers might need the extra adhesion afforded by a brim even if the model doesn't. Presently can't be used with the 'Raft' adhesion-type."
+msgstr "Einzugstürme benötigen möglicherweise zusätzliche Haftung in Form eines Brims, auch wenn das Modell selbst dies nicht benötigt. Kann derzeit nicht mit dem „Raft“-Haftungstyp verwendet werden."
+
#: fdmprinter.def.json
msgctxt "ooze_shield_enabled label"
msgid "Enable Ooze Shield"
@@ -4622,8 +4869,9 @@ msgstr "Spiralisieren der äußeren Konturen glätten"
#: fdmprinter.def.json
msgctxt "smooth_spiralized_contours description"
-msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
-msgstr "Glättet die spiralförmigen Konturen, um die Sichtbarkeit der Z-Naht zu reduzieren (die Z-Naht sollte auf dem Druck kaum sichtbar sein, ist jedoch in der Schichtenansicht erkennbar). Beachten Sie, dass das Glätten dazu neigt, feine Oberflächendetails zu verwischen."
+msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
+msgstr "Glättet die spiralförmigen Konturen, um die Sichtbarkeit der Z-Naht zu reduzieren (die Z-Naht sollte am Druckobjekt kaum sichtbar sein, ist jedoch in der"
+" Schichtenansicht erkennbar). Beachten Sie, dass beim Glätten feine Oberflächendetails verwischt werden."
#: fdmprinter.def.json
msgctxt "relative_extrusion label"
@@ -4855,6 +5103,16 @@ msgctxt "meshfix_maximum_travel_resolution description"
msgid "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."
msgstr "Die maximale Größe eines Bewegungsliniensegments nach dem Slicen. Wenn Sie diesen Wert erhöhen, weisen die Fahrtbewegungen weniger glatte Kanten aus. Das ermöglicht dem Drucker, die für die Verarbeitung eines G-Codes erforderliche Geschwindigkeit aufrechtzuerhalten, allerdings kann das Modell damit auch weniger akkurat werden."
+#: fdmprinter.def.json
+msgctxt "meshfix_maximum_deviation label"
+msgid "Maximum Deviation"
+msgstr "Maximale Abweichung"
+
+#: fdmprinter.def.json
+msgctxt "meshfix_maximum_deviation description"
+msgid "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."
+msgstr "Die maximal zulässige Abweichung bei Reduzierung der Auflösung für die Einstellung der maximalen Auflösung. Wenn Sie diesen Wert erhöhen, wird der Druck ungenauer, der G-Code wird jedoch kleiner."
+
#: fdmprinter.def.json
msgctxt "support_skip_some_zags label"
msgid "Break Up Support In Chunks"
@@ -5112,8 +5370,8 @@ msgstr "Konische Stützstruktur aktivieren"
#: fdmprinter.def.json
msgctxt "support_conical_enabled description"
-msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang."
-msgstr "Experimentelle Funktion: Macht die Bereiche der Stützstruktur am Boden kleiner als beim Überhang."
+msgid "Make support areas smaller at the bottom than at the overhang."
+msgstr "Macht die Bereiche der Stützstruktur am Boden kleiner als beim Überhang."
#: fdmprinter.def.json
msgctxt "support_conical_angle label"
@@ -5345,7 +5603,9 @@ 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.\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."
+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."
#: fdmprinter.def.json
msgctxt "wireframe_top_jump label"
@@ -5454,7 +5714,7 @@ msgstr "Der Abstand zwischen der Düse und den horizontalen Abwärtslinien. Bei
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_enabled label"
-msgid "Use adaptive layers"
+msgid "Use Adaptive Layers"
msgstr "Anpassschichten verwenden"
#: fdmprinter.def.json
@@ -5464,7 +5724,7 @@ msgstr "Die Funktion Anpassschichten berechnet die Schichthöhe je nach Form des
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_variation label"
-msgid "Adaptive layers maximum variation"
+msgid "Adaptive Layers Maximum Variation"
msgstr "Maximale Abweichung für Anpassschichten"
#: fdmprinter.def.json
@@ -5474,7 +5734,7 @@ msgstr "Die max. zulässige Höhendifferenz von der Basisschichthöhe."
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_variation_step label"
-msgid "Adaptive layers variation step size"
+msgid "Adaptive Layers Variation Step Size"
msgstr "Abweichung Schrittgröße für Anpassschichten"
#: fdmprinter.def.json
@@ -5484,7 +5744,7 @@ msgstr "Der Höhenunterscheid der nächsten Schichthöhe im Vergleich zur vorher
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_threshold label"
-msgid "Adaptive layers threshold"
+msgid "Adaptive Layers Threshold"
msgstr "Schwellenwert Anpassschichten"
#: fdmprinter.def.json
@@ -5702,6 +5962,156 @@ msgctxt "bridge_fan_speed_3 description"
msgid "Percentage fan speed to use when printing the third bridge skin layer."
msgstr "Prozentwert der Lüfterdrehzahl für das Drucken der dritten Brücken-Außenhautschicht."
+#: fdmprinter.def.json
+msgctxt "clean_between_layers label"
+msgid "Wipe Nozzle Between Layers"
+msgstr "Düse zwischen den Schichten abwischen"
+
+#: fdmprinter.def.json
+msgctxt "clean_between_layers description"
+msgid "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."
+msgstr "Option für das Einfügen eines G-Codes für das Abwischen der Düse zwischen den Schichten. Die Aktivierung dieser Einstellung könnte das Einzugsverhalten beim Schichtenwechsel beeinflussen. Verwenden Sie bitte die Einstellungen für Abwischen bei Einzug, um das Einziehen bei Schichten zu steuern, bei denen das Skript für Wischen aktiv wird."
+
+#: fdmprinter.def.json
+msgctxt "max_extrusion_before_wipe label"
+msgid "Material Volume Between Wipes"
+msgstr "Materialmenge zwischen den Wischvorgängen"
+
+#: fdmprinter.def.json
+msgctxt "max_extrusion_before_wipe description"
+msgid "Maximum material, that can be extruded before another nozzle wipe is initiated."
+msgstr "Die maximale Materialmenge, die extrudiert werden kann, bevor die Düse ein weiteres Mal abgewischt wird."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_enable label"
+msgid "Wipe Retraction Enable"
+msgstr "Abwischen bei Einzug aktivieren"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_enable description"
+msgid "Retract the filament when the nozzle is moving over a non-printed area."
+msgstr "Das Filament wird eingezogen, wenn sich die Düse über einen nicht zu bedruckenden Bereich bewegt."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_amount label"
+msgid "Wipe Retraction Distance"
+msgstr "Einzugsabstand für Abwischen"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_amount description"
+msgid "Amount to retract the filament so it does not ooze during the wipe sequence."
+msgstr "Wert, um den das Filament eingezogen wird, damit es während des Abwischens nicht austritt."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_extra_prime_amount label"
+msgid "Wipe Retraction Extra Prime Amount"
+msgstr "Zusätzliche Zurückschiebemenge nach Einzug für Abwischen"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_extra_prime_amount description"
+msgid "Some material can ooze away during a wipe travel moves, which can be compensated for here."
+msgstr "Während einer Bewegung für den Abwischvorgang kann Material wegsickern, was hier kompensiert werden kann."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_speed label"
+msgid "Wipe Retraction Speed"
+msgstr "Einzugsgeschwindigkeit für Abwischen"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_speed description"
+msgid "The speed at which the filament is retracted and primed during a wipe retraction move."
+msgstr "Die Geschwindigkeit, mit der das Filament während einer Einzugsbewegung eingezogen und während einer Einzugsbewegung für Abwischen zurückgeschoben wird."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_retract_speed label"
+msgid "Wipe Retraction Retract Speed"
+msgstr "Einzugsgeschwindigkeit (Einzug) für Abwischen"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_retract_speed description"
+msgid "The speed at which the filament is retracted during a wipe retraction move."
+msgstr "Die Geschwindigkeit, mit der das Filament während einer Einzugsbewegung für Abwischen eingezogen wird."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_prime_speed label"
+msgid "Retraction Prime Speed"
+msgstr "Einzugsgeschwindigkeit (Einzug)"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_prime_speed description"
+msgid "The speed at which the filament is primed during a wipe retraction move."
+msgstr "Die Geschwindigkeit, mit der das Filament während einer Einzugsbewegung vorbereitet wird."
+
+#: fdmprinter.def.json
+msgctxt "wipe_pause label"
+msgid "Wipe Pause"
+msgstr "Abwischen pausieren"
+
+#: fdmprinter.def.json
+msgctxt "wipe_pause description"
+msgid "Pause after the unretract."
+msgstr "Pausieren nach Aufhebung des Einzugs."
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_enable label"
+msgid "Wipe Z Hop When Retracted"
+msgstr "Z-Sprung beim Einziehen - Abwischen"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_enable description"
+msgid "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."
+msgstr "Nach dem Einzug wird das Druckbett gesenkt, um einen Abstand zwischen Düse und Druck herzustellen. Das verhindert, dass die Düse den Druck während der Bewegungen anschlägt und verringert die Möglichkeit, dass der Druck vom Druckbett heruntergestoßen wird."
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_amount label"
+msgid "Wipe Z Hop Height"
+msgstr "Z-Sprung Höhe - Abwischen"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_amount description"
+msgid "The height difference when performing a Z Hop."
+msgstr "Der Höhenunterschied bei Ausführung eines Z-Sprungs."
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_speed label"
+msgid "Wipe Hop Speed"
+msgstr "Sprunghöhe - Abwischen"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_speed description"
+msgid "Speed to move the z-axis during the hop."
+msgstr "Geschwindigkeit für das Verfahren der Z-Achse während des Sprungs."
+
+#: fdmprinter.def.json
+msgctxt "wipe_brush_pos_x label"
+msgid "Wipe Brush X Position"
+msgstr "X-Position für Bürste - Abwischen"
+
+#: fdmprinter.def.json
+msgctxt "wipe_brush_pos_x description"
+msgid "X location where wipe script will start."
+msgstr "X-Position, an der das Skript für Abwischen startet."
+
+#: fdmprinter.def.json
+msgctxt "wipe_repeat_count label"
+msgid "Wipe Repeat Count"
+msgstr "Wiederholungszähler - Abwischen"
+
+#: fdmprinter.def.json
+msgctxt "wipe_repeat_count description"
+msgid "Number of times to move the nozzle across the brush."
+msgstr "Anzahl der Wiederholungen für das Bewegen der Düse über der Bürste."
+
+#: fdmprinter.def.json
+msgctxt "wipe_move_distance label"
+msgid "Wipe Move Distance"
+msgstr "Abstand Wischbewegung"
+
+#: fdmprinter.def.json
+msgctxt "wipe_move_distance description"
+msgid "The distance to move the head back and forth across the brush."
+msgstr "Die Strecke, die der Kopf durch Vorwärts- und Rückwärtsbewegung über die Bürste hinweg fährt."
+
#: fdmprinter.def.json
msgctxt "command_line_settings label"
msgid "Command Line Settings"
@@ -5762,6 +6172,138 @@ msgctxt "mesh_rotation_matrix description"
msgid "Transformation matrix to be applied to the model when loading it from file."
msgstr "Transformationsmatrix, die beim Laden aus der Datei auf das Modell angewandt wird."
+#~ msgctxt "machine_gcode_flavor label"
+#~ msgid "G-code Flavour"
+#~ msgstr "G-Code-Variante"
+
+#~ msgctxt "z_seam_corner description"
+#~ msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner."
+#~ msgstr "Definieren Sie, ob Kanten am Modell-Umriss die Nahtposition beeinflussen. Keine bedeutet, dass Kanten keinen Einfluss auf die Nahtposition haben. Naht verbergen lässt die Naht mit höherer Wahrscheinlichkeit an einer innenliegenden Kante auftreten. Naht offenlegen lässt die Naht mit höherer Wahrscheinlichkeit an einer Außenkante auftreten. Naht verbergen oder offenlegen lässt die Naht mit höherer Wahrscheinlichkeit an einer innenliegenden oder außenliegenden Kante auftreten."
+
+#~ msgctxt "skin_no_small_gaps_heuristic label"
+#~ msgid "Ignore Small Z Gaps"
+#~ msgstr "Schmale Z-Lücken ignorieren"
+
+#~ msgctxt "skin_no_small_gaps_heuristic description"
+#~ msgid "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting."
+#~ msgstr "Wenn das Modell schmale vertikale Lücken hat, kann etwa 5 % zusätzliche Rechenzeit aufgewendet werden, um eine obere und untere Außenhaut in diesen engen Räumen zu generieren. In diesem Fall deaktivieren Sie die Einstellung."
+
+#~ msgctxt "build_volume_temperature description"
+#~ msgid "The temperature used for build volume. If this is 0, the build volume temperature will not be adjusted."
+#~ msgstr "Die für die Druckabmessung verwendete Temperatur. Wenn dieser Wert 0 beträgt, wird die Temperatur der Druckabmessung nicht angepasst."
+
+#~ msgctxt "limit_support_retractions description"
+#~ msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excesive stringing within the support structure."
+#~ msgstr "Lassen Sie den Einzug beim Vorgehen von Stützstruktur zu Stützstruktur in einer geraden Linie aus. Die Aktivierung dieser Einstellung spart Druckzeit, kann jedoch zu übermäßigem Fadenziehen innerhalb der Stützstruktur führen."
+
+#~ msgctxt "max_feedrate_z_override label"
+#~ msgid "Maximum Z Speed"
+#~ msgstr "Maximale Z-Geschwindigkeit"
+
+#~ msgctxt "max_feedrate_z_override description"
+#~ msgid "The maximum speed with which the build plate is moved. Setting this to zero causes the print to use the firmware defaults for the maximum z speed."
+#~ msgstr "Die maximale Geschwindigkeit, mit der die Druckplatte bewegt wird. Eine Einstellung auf Null veranlasst die Verwendung der Firmware-Grundeinstellungen für die maximale Z-Geschwindigkeit."
+
+#~ msgctxt "support_join_distance description"
+#~ msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one."
+#~ msgstr "Der Maximalabstand zwischen Stützstrukturen in der X- und Y-Richtung. Wenn sich einzelne Strukturen näher aneinander befinden, als dieser Wert, werden diese Strukturen in eine einzige Struktur zusammengefügt."
+
+#~ msgctxt "support_minimal_diameter label"
+#~ msgid "Minimum Diameter"
+#~ msgstr "Mindestdurchmesser"
+
+#~ msgctxt "support_minimal_diameter description"
+#~ msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
+#~ msgstr "Der Mindestdurchmesser in den X/Y-Richtungen eines kleinen Bereichs, der durch einen speziellen Stützpfeiler gestützt wird."
+
+#~ msgctxt "prime_tower_circular label"
+#~ msgid "Circular Prime Tower"
+#~ msgstr "Einzugsturm kreisförmig"
+
+#~ msgctxt "prime_tower_circular description"
+#~ msgid "Make the prime tower as a circular shape."
+#~ msgstr "Macht den Einzugsturm zu einer Kreisform."
+
+#~ msgctxt "prime_tower_flow description"
+#~ msgid "Flow compensation: the amount of material extruded is multiplied by this value."
+#~ msgstr "Fluss-Kompensation: Die extrudierte Materialmenge wird mit diesem Wert multipliziert."
+
+#~ msgctxt "smooth_spiralized_contours description"
+#~ msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
+#~ msgstr "Glättet die spiralförmigen Konturen, um die Sichtbarkeit der Z-Naht zu reduzieren (die Z-Naht sollte auf dem Druck kaum sichtbar sein, ist jedoch in der Schichtenansicht erkennbar). Beachten Sie, dass das Glätten dazu neigt, feine Oberflächendetails zu verwischen."
+
+#~ msgctxt "support_conical_enabled description"
+#~ msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang."
+#~ msgstr "Experimentelle Funktion: Macht die Bereiche der Stützstruktur am Boden kleiner als beim Überhang."
+
+#~ msgctxt "extruders_enabled_count label"
+#~ msgid "Number of Extruders that are enabled"
+#~ msgstr "Anzahl der aktivierten Extruder"
+
+#~ msgctxt "machine_nozzle_tip_outer_diameter label"
+#~ msgid "Outer nozzle diameter"
+#~ msgstr "Düsendurchmesser außen"
+
+#~ msgctxt "machine_nozzle_head_distance label"
+#~ msgid "Nozzle length"
+#~ msgstr "Düsenlänge"
+
+#~ msgctxt "machine_nozzle_expansion_angle label"
+#~ msgid "Nozzle angle"
+#~ msgstr "Düsenwinkel"
+
+#~ msgctxt "machine_heat_zone_length label"
+#~ msgid "Heat zone length"
+#~ msgstr "Heizzonenlänge"
+
+#~ msgctxt "machine_nozzle_heat_up_speed label"
+#~ msgid "Heat up speed"
+#~ msgstr "Aufheizgeschwindigkeit"
+
+#~ msgctxt "machine_nozzle_cool_down_speed label"
+#~ msgid "Cool down speed"
+#~ msgstr "Abkühlgeschwindigkeit"
+
+#~ msgctxt "machine_gcode_flavor label"
+#~ msgid "G-code flavour"
+#~ msgstr "G-Code-Variante"
+
+#~ msgctxt "machine_disallowed_areas label"
+#~ msgid "Disallowed areas"
+#~ msgstr "Unzulässige Bereiche"
+
+#~ msgctxt "machine_head_polygon label"
+#~ msgid "Machine head polygon"
+#~ msgstr "Gerätekopf Polygon"
+
+#~ msgctxt "machine_head_with_fans_polygon label"
+#~ msgid "Machine head & Fan polygon"
+#~ msgstr "Gerätekopf und Lüfter Polygon"
+
+#~ msgctxt "gantry_height label"
+#~ msgid "Gantry height"
+#~ msgstr "Brückenhöhe"
+
+#~ msgctxt "machine_use_extruder_offset_to_offset_coords label"
+#~ msgid "Offset With Extruder"
+#~ msgstr "Versatz mit Extruder"
+
+#~ msgctxt "adaptive_layer_height_enabled label"
+#~ msgid "Use adaptive layers"
+#~ msgstr "Anpassschichten verwenden"
+
+#~ msgctxt "adaptive_layer_height_variation label"
+#~ msgid "Adaptive layers maximum variation"
+#~ msgstr "Maximale Abweichung für Anpassschichten"
+
+#~ msgctxt "adaptive_layer_height_variation_step label"
+#~ msgid "Adaptive layers variation step size"
+#~ msgstr "Abweichung Schrittgröße für Anpassschichten"
+
+#~ msgctxt "adaptive_layer_height_threshold label"
+#~ msgid "Adaptive layers threshold"
+#~ msgstr "Schwellenwert Anpassschichten"
+
#~ msgctxt "skin_overlap description"
#~ msgid "The amount of overlap between the skin and the walls as a percentage of the skin line width. A slight overlap allows the walls to connect firmly to the skin. This is a percentage of the average line widths of the skin lines and the innermost wall."
#~ msgstr "Das Ausmaß des Überlappens zwischen der Außenhaut und den Wänden als Prozentwert der Außenhaut-Linienbreite. Ein leichtes Überlappen ermöglicht es den Wänden, eine solide Verbindung mit der Außenhaut herzustellen. Dies ist ein Prozentwert der durchschnittlichen Linienbreiten der Außenhautlinien und der innersten Wand."
@@ -5899,7 +6441,6 @@ 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"
#~ "."
@@ -5912,7 +6453,6 @@ 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"
#~ "."
@@ -5969,7 +6509,6 @@ 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 7a08130af6..834396b94c 100644
--- a/resources/i18n/es_ES/cura.po
+++ b/resources/i18n/es_ES/cura.po
@@ -5,20 +5,20 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2019-03-13 14:00+0200\n"
-"Last-Translator: Bothof \n"
-"Language-Team: Spanish\n"
+"POT-Creation-Date: 2019-07-16 14:38+0200\n"
+"PO-Revision-Date: 2019-07-29 15:51+0200\n"
+"Last-Translator: Lionbridge \n"
+"Language-Team: Spanish , Spanish \n"
"Language: es_ES\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 2.0.6\n"
+"X-Generator: Poedit 2.2.3\n"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:27
msgctxt "@action"
msgid "Machine Settings"
msgstr "Ajustes de la máquina"
@@ -56,7 +56,7 @@ msgctxt "@info:title"
msgid "3D Model Assistant"
msgstr "Asistente del modelo 3D"
-#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:86
+#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:90
#, python-brace-format
msgctxt "@info:status"
msgid ""
@@ -64,17 +64,11 @@ msgid ""
"{model_names}
\n"
"Find out how to ensure the best possible print quality and reliability.
\n"
"View print quality guide
"
-msgstr "Es posible que uno o más modelos 3D no se impriman correctamente debido al tamaño del modelo y la configuración del material:
\n{model_names}
\nObtenga más información sobre cómo garantizar la mejor calidad y fiabilidad de impresión posible.
\nVer guía de impresión de calidad
"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
-msgctxt "@item:inmenu"
-msgid "Changelog"
-msgstr "Registro de cambios"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
-msgctxt "@item:inmenu"
-msgid "Show Changelog"
-msgstr "Mostrar registro de cambios"
+msgstr ""
+"Es posible que uno o más modelos 3D no se impriman correctamente debido al tamaño del modelo y la configuración del material:
\n"
+"{model_names}
\n"
+"Obtenga más información sobre cómo garantizar la mejor calidad y fiabilidad de impresión posible.
\n"
+"Ver guía de impresión de calidad
"
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py:25
msgctxt "@action"
@@ -91,37 +85,36 @@ msgctxt "@info:status"
msgid "Profile has been flattened & activated."
msgstr "El perfil se ha aplanado y activado."
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:33
+#: /home/ruben/Projects/Cura/plugins/AMFReader/__init__.py:15
+msgctxt "@item:inlistbox"
+msgid "AMF File"
+msgstr "Archivo AMF"
+
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:37
msgctxt "@item:inmenu"
msgid "USB printing"
msgstr "Impresión USB"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:34
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:38
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print via USB"
msgstr "Imprimir mediante USB"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:35
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:39
msgctxt "@info:tooltip"
msgid "Print via USB"
msgstr "Imprimir mediante USB"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:71
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:75
msgctxt "@info:status"
msgid "Connected via USB"
msgstr "Conectado mediante USB"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:96
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:100
msgctxt "@label"
msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?"
msgstr "Se está realizando una impresión con USB, si cierra Cura detendrá la impresión. ¿Desea continuar?"
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
-msgctxt "X3G Writer File Description"
-msgid "X3G File"
-msgstr "Archivo X3G"
-
#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/GPX-prefix/src/GPX/slicerplugins/cura15.06/X3gWriter/__init__.py:16
msgctxt "X3g Writer Plugin Description"
msgid "Writes X3g to files"
@@ -132,6 +125,11 @@ msgctxt "X3g Writer File Description"
msgid "X3g File"
msgstr "Archivo X3g"
+#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
+msgctxt "X3G Writer File Description"
+msgid "X3G File"
+msgstr "Archivo X3G"
+
#: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/__init__.py:17
#: /home/ruben/Projects/Cura/plugins/GCodeGzReader/__init__.py:17
msgctxt "@item:inlistbox"
@@ -144,6 +142,7 @@ msgid "GCodeGzWriter does not support text mode."
msgstr "GCodeGzWriter no es compatible con el modo texto."
#: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:28
+#: /home/ruben/Projects/Cura/plugins/UFPReader/__init__.py:22
msgctxt "@item:inlistbox"
msgid "Ultimaker Format Package"
msgstr "Paquete de formato Ultimaker"
@@ -202,10 +201,10 @@ msgid "Could not save to removable drive {0}: {1}"
msgstr "No se pudo guardar en unidad extraíble {0}: {1}"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:137
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:152
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:133
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:140
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1629
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:188
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:134
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:141
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1622
msgctxt "@info:title"
msgid "Error"
msgstr "Error"
@@ -234,9 +233,9 @@ msgstr "Expulsar dispositivo extraíble {0}"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:151
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:163
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1619
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1719
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1612
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1712
msgctxt "@info:title"
msgid "Warning"
msgstr "Advertencia"
@@ -263,266 +262,267 @@ msgctxt "@item:intext"
msgid "Removable Drive"
msgstr "Unidad extraíble"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:74
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:93
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print over network"
msgstr "Imprimir a través de la red"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:89
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:76
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:94
msgctxt "@properties:tooltip"
msgid "Print over network"
msgstr "Imprime a través de la red"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:95
msgctxt "@info:status"
msgid "Connected over the network."
msgstr "Conectado a través de la red."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
msgctxt "@info:status"
msgid "Connected over the network. Please approve the access request on the printer."
msgstr "Conectado a través de la red. Apruebe la solicitud de acceso en la impresora."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:93
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:100
msgctxt "@info:status"
msgid "Connected over the network. No access to control the printer."
msgstr "Conectado a través de la red. No hay acceso para controlar la impresora."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
msgctxt "@info:status"
msgid "Access to the printer requested. Please approve the request on the printer"
msgstr "Acceso a la impresora solicitado. Apruebe la solicitud en la impresora"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:101
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
msgctxt "@info:title"
msgid "Authentication status"
msgstr "Estado de la autenticación"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:103
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:109
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:113
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:120
msgctxt "@info:title"
msgid "Authentication Status"
msgstr "Estado de la autenticación"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:104
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:187
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:111
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:198
msgctxt "@action:button"
msgid "Retry"
msgstr "Volver a intentar"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
msgctxt "@info:tooltip"
msgid "Re-send the access request"
msgstr "Reenvía la solicitud de acceso"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:115
msgctxt "@info:status"
msgid "Access to the printer accepted"
msgstr "Acceso a la impresora aceptado"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:119
msgctxt "@info:status"
msgid "No access to print with this printer. Unable to send print job."
msgstr "No hay acceso para imprimir con esta impresora. No se puede enviar el trabajo de impresión."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:114
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:121
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:65
msgctxt "@action:button"
msgid "Request Access"
msgstr "Solicitar acceso"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:123
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:66
msgctxt "@info:tooltip"
msgid "Send access request to the printer"
msgstr "Envía la solicitud de acceso a la impresora"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:201
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:208
msgctxt "@label"
msgid "Unable to start a new print job."
msgstr "No se puede iniciar un nuevo trabajo de impresión."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:203
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:210
msgctxt "@label"
msgid "There is an issue with the configuration of your Ultimaker, which makes it impossible to start the print. Please resolve this issues before continuing."
msgstr "Un problema con la configuración de Ultimaker impide iniciar la impresión. Soluciónelo antes de continuar."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:209
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:231
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:216
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:238
msgctxt "@window:title"
msgid "Mismatched configuration"
msgstr "Configuración desajustada"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:230
msgctxt "@label"
msgid "Are you sure you wish to print with the selected configuration?"
msgstr "¿Seguro que desea imprimir con la configuración seleccionada?"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:225
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:232
msgctxt "@label"
msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer."
msgstr "La configuración o calibración de la impresora y de Cura no coinciden. Para obtener el mejor resultado, segmente siempre los PrintCores y los materiales que se insertan en la impresora."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:252
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:162
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:162
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:176
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:181
msgctxt "@info:status"
msgid "Sending new jobs (temporarily) blocked, still sending the previous print job."
msgstr "Envío de nuevos trabajos (temporalmente) bloqueado; se sigue enviando el trabajo de impresión previo."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:180
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:197
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:266
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:194
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:211
msgctxt "@info:status"
msgid "Sending data to printer"
msgstr "Enviando datos a la impresora"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:260
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:182
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:199
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:267
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:196
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:213
msgctxt "@info:title"
msgid "Sending Data"
msgstr "Enviando datos"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:261
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:200
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:268
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:214
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:18
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:19
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:81
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:395
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:410
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:20
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:38
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:143
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:58
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:149
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:391
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:254
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:283
msgctxt "@action:button"
msgid "Cancel"
msgstr "Cancelar"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:324
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:331
#, python-brace-format
msgctxt "@info:status"
msgid "No Printcore loaded in slot {slot_number}"
msgstr "No se ha cargado ningún PrintCore en la ranura {slot_number}."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:337
#, python-brace-format
msgctxt "@info:status"
msgid "No material loaded in slot {slot_number}"
msgstr "No se ha cargado ningún material en la ranura {slot_number}."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:353
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:360
#, python-brace-format
msgctxt "@label"
msgid "Different PrintCore (Cura: {cura_printcore_name}, Printer: {remote_printcore_name}) selected for extruder {extruder_id}"
msgstr "PrintCore distinto (Cura: {cura_printcore_name}, impresora: {remote_printcore_name}) seleccionado para extrusor {extruder_id}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:362
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:369
#, python-brace-format
msgctxt "@label"
msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "Material distinto (Cura: {0}, impresora: {1}) seleccionado para extrusor {2}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:548
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:555
msgctxt "@window:title"
msgid "Sync with your printer"
msgstr "Sincronizar con la impresora"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:550
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:557
msgctxt "@label"
msgid "Would you like to use your current printer configuration in Cura?"
msgstr "¿Desea utilizar la configuración actual de su impresora en Cura?"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:552
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:559
msgctxt "@label"
msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer."
msgstr "Los PrintCores o los materiales de la impresora difieren de los del proyecto actual. Para obtener el mejor resultado, segmente siempre los PrintCores y materiales que se hayan insertado en la impresora."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:96
msgctxt "@info:status"
msgid "Connected over the network"
msgstr "Conectado a través de la red"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:275
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:342
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:370
msgctxt "@info:status"
msgid "Print job was successfully sent to the printer."
msgstr "El trabajo de impresión se ha enviado correctamente a la impresora."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:277
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:343
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:291
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:371
msgctxt "@info:title"
msgid "Data Sent"
msgstr "Fecha de envío"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:278
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:292
msgctxt "@action:button"
msgid "View in Monitor"
msgstr "Ver en pantalla"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:390
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:290
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:411
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Printer '{printer_name}' has finished printing '{job_name}'."
msgstr "{printer_name} ha terminado de imprimir «{job_name}»."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:392
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:294
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:413
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:322
#, python-brace-format
msgctxt "@info:status"
msgid "The print job '{job_name}' was finished."
msgstr "El trabajo de impresión '{job_name}' ha terminado."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:393
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:414
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:316
msgctxt "@info:status"
msgid "Print finished"
msgstr "Impresión terminada"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:573
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:595
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:629
msgctxt "@label:material"
msgid "Empty"
msgstr "Vacío"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:596
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:630
msgctxt "@label:material"
msgid "Unknown"
msgstr "Desconocido"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:169
msgctxt "@action:button"
msgid "Print via Cloud"
msgstr "Imprimir mediante Cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:170
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
msgstr "Imprimir mediante Cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:171
msgctxt "@info:status"
msgid "Connected via Cloud"
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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:182
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:359
msgctxt "@info:title"
msgid "Cloud error"
msgstr "Error de Cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:199
msgctxt "@info:status"
msgid "Could not export print job."
msgstr "No se ha podido exportar el trabajo de impresión."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:358
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
msgstr "No se han podido cargar los datos en la impresora."
@@ -537,48 +537,52 @@ msgctxt "@info:status"
msgid "today"
msgstr "hoy"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:187
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
msgstr "Se ha producido un error al conectarse a la nube."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
+msgctxt "@info:status"
+msgid "Sending Print Job"
+msgstr "Enviando trabajo de impresión"
+
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
-msgid "Sending data to remote cluster"
-msgstr "Enviando datos al clúster remoto"
+msgid "Uploading via Ultimaker Cloud"
+msgstr "Cargando a través de Ultimaker Cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:621
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
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"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:627
+msgctxt "@info:status Ultimaker Cloud is a brand name and shouldn't be translated."
msgid "Connect to Ultimaker Cloud"
msgstr "Conectar a Ultimaker Cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:628
msgctxt "@action"
msgid "Don't ask me again for this printer."
msgstr "No volver a preguntarme para esta impresora."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:631
msgctxt "@action"
msgid "Get started"
msgstr "Empezar"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:637
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:643
msgctxt "@info:status"
msgid "Connected!"
msgstr "¡Conectado!"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:645
msgctxt "@action"
msgid "Review your connection"
msgstr "Revise su conexión"
@@ -593,7 +597,7 @@ msgctxt "@item:inmenu"
msgid "Monitor"
msgstr "Supervisar"
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:124
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:118
msgctxt "@info"
msgid "Could not access update information."
msgstr "No se pudo acceder a la información actualizada."
@@ -650,46 +654,11 @@ msgctxt "@info:tooltip"
msgid "Create a volume in which supports are not printed."
msgstr "Cree un volumen que no imprima los soportes."
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:52
-msgctxt "@info"
-msgid "Cura collects anonymized usage statistics."
-msgstr "Cura recopila estadísticas de uso de forma anónima."
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:55
-msgctxt "@info:title"
-msgid "Collecting Data"
-msgstr "Recopilando datos"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:57
-msgctxt "@action:button"
-msgid "More info"
-msgstr "Más información"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:58
-msgctxt "@action:tooltip"
-msgid "See more information on what data Cura sends."
-msgstr "Obtenga más información sobre qué datos envía Cura."
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:60
-msgctxt "@action:button"
-msgid "Allow"
-msgstr "Permitir"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:61
-msgctxt "@action:tooltip"
-msgid "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."
-msgstr "Permitir a Cura enviar estadísticas de uso de forma anónima para ayudar a priorizar mejoras futuras para Cura. Se envían algunas de sus preferencias y ajustes, la versión de Cura y un resumen de los modelos que está fragmentando."
-
#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "Cura 15.04 profiles"
msgstr "Perfiles de Cura 15.04"
-#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
-msgctxt "@item:inmenu"
-msgid "Evaluation"
-msgstr "Evaluación"
-
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "JPG Image"
@@ -715,56 +684,56 @@ msgctxt "@item:inlistbox"
msgid "GIF Image"
msgstr "Imagen GIF"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
msgctxt "@info:status"
msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration."
msgstr "No se puede segmentar con el material actual, ya que es incompatible con el dispositivo o la configuración seleccionados."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:389
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:398
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:407
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:416
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:362
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:386
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:395
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:404
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:413
msgctxt "@info:title"
msgid "Unable to slice"
msgstr "No se puede segmentar"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:364
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:361
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to slice with the current settings. The following settings have errors: {0}"
msgstr "Los ajustes actuales no permiten la segmentación. Los siguientes ajustes contienen errores: {0}"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:388
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:385
#, 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 "Los ajustes de algunos modelos no permiten la segmentación. Los siguientes ajustes contienen errores en uno o más modelos: {error_labels}."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:397
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:394
msgctxt "@info:status"
msgid "Unable to slice because the prime tower or prime position(s) are invalid."
msgstr "No se puede segmentar porque la torre auxiliar o la posición o posiciones de preparación no son válidas."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:406
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:403
#, python-format
msgctxt "@info:status"
msgid "Unable to slice because there are objects associated with disabled Extruder %s."
msgstr "No se puede segmentar porque hay objetos asociados al extrusor %s que está deshabilitado."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:412
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 "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
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:status"
msgid "Processing Layers"
msgstr "Procesando capas"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:title"
msgid "Information"
msgstr "Información"
@@ -795,19 +764,19 @@ msgctxt "@item:inlistbox"
msgid "3MF File"
msgstr "Archivo 3MF"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:190
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:763
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:191
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:775
msgctxt "@label"
msgid "Nozzle"
msgstr "Tobera"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:469
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:474
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead."
-msgstr "El archivo del proyecto{0} contiene un tipo de máquina desconocida {1}. No se puede importar la máquina, en su lugar, se importarán los modelos."
+msgstr "El archivo del proyecto {0} contiene un tipo de máquina desconocida {1}. No se puede importar la máquina, en su lugar, se importarán los modelos."
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:472
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:477
msgctxt "@info:title"
msgid "Open Project File"
msgstr "Abrir archivo de proyecto"
@@ -822,18 +791,18 @@ msgctxt "@item:inlistbox"
msgid "G File"
msgstr "Archivo G"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:324
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:328
msgctxt "@info:status"
msgid "Parsing G-code"
msgstr "Analizar GCode"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:326
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:476
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:330
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:483
msgctxt "@info:title"
msgid "G-code Details"
msgstr "Datos de GCode"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:474
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:481
msgctxt "@info:generic"
msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate."
msgstr "Asegúrese de que el GCode es adecuado para la impresora y para su configuración antes de enviar el archivo a la misma. Es posible que la representación del GCode no sea precisa."
@@ -856,7 +825,7 @@ msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
msgstr "Se ha producido un error al obtener sus copias de seguridad."
-#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
+#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:132
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
msgstr "Se ha producido un error al intentar restaurar su copia de seguridad."
@@ -917,243 +886,261 @@ msgctxt "@item:inmenu"
msgid "Preview"
msgstr "Vista previa"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:19
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
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"
msgstr "Nivelar placa de impresión"
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:81
-msgctxt "@tooltip"
-msgid "Outer Wall"
-msgstr "Pared exterior"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:82
-msgctxt "@tooltip"
-msgid "Inner Walls"
-msgstr "Paredes interiores"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:83
-msgctxt "@tooltip"
-msgid "Skin"
-msgstr "Forro"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:84
-msgctxt "@tooltip"
-msgid "Infill"
-msgstr "Relleno"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:85
-msgctxt "@tooltip"
-msgid "Support Infill"
-msgstr "Relleno de soporte"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:86
-msgctxt "@tooltip"
-msgid "Support Interface"
-msgstr "Interfaz de soporte"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:87
-msgctxt "@tooltip"
-msgid "Support"
-msgstr "Soporte"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88
-msgctxt "@tooltip"
-msgid "Skirt"
-msgstr "Falda"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89
-msgctxt "@tooltip"
-msgid "Travel"
-msgstr "Desplazamiento"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90
-msgctxt "@tooltip"
-msgid "Retractions"
-msgstr "Retracciones"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91
-msgctxt "@tooltip"
-msgid "Other"
-msgstr "Otro"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:309
-#, python-brace-format
-msgctxt "@label"
-msgid "Pre-sliced file {0}"
-msgstr "Archivo {0} presegmentado"
-
-#: /home/ruben/Projects/Cura/cura/API/Account.py:77
+#: /home/ruben/Projects/Cura/cura/API/Account.py:82
msgctxt "@info:title"
msgid "Login failed"
msgstr "Fallo de inicio de sesión"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:201
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121
+#: /home/ruben/Projects/Cura/cura/Settings/cura_empty_instance_containers.py:33
+msgctxt "@info:not supported profile"
+msgid "Not supported"
+msgstr "No compatible"
+
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:203
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
msgctxt "@title:window"
msgid "File Already Exists"
msgstr "El archivo ya existe"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:202
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:204
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:123
#, python-brace-format
msgctxt "@label Don't translate the XML tag !"
msgid "The file {0} already exists. Are you sure you want to overwrite it?"
msgstr "El archivo {0} ya existe. ¿Está seguro de que desea sobrescribirlo?"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:425
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:427
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:430
msgctxt "@info:status"
msgid "Invalid file URL:"
msgstr "URL del archivo no válida:"
-#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
-msgctxt "@menuitem"
-msgid "Not overridden"
-msgstr "No reemplazado"
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:925
+msgctxt "@info:message Followed by a list of settings."
+msgid "Settings have been changed to match the current availability of extruders:"
+msgstr "La configuración se ha cambiado para que coincida con los extrusores disponibles en este momento:"
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:915
-#, python-format
-msgctxt "@info:generic"
-msgid "Settings have been changed to match the current availability of extruders: [%s]"
-msgstr "La configuración se ha cambiado para que coincida con los extrusores disponibles en este momento: [%s]."
-
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:917
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:927
msgctxt "@info:title"
msgid "Settings updated"
msgstr "Ajustes actualizados"
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1481
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
msgstr "Extrusores deshabilitados"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:132
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to export profile to {0}: {1}"
msgstr "Error al exportar el perfil a {0}: {1}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:138
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:139
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Failed to export profile to {0}: Writer plugin reported failure."
msgstr "Error al exportar el perfil a {0}: Error en el complemento de escritura."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Exported profile to {0}"
msgstr "Perfil exportado a {0}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145
msgctxt "@info:title"
msgid "Export succeeded"
msgstr "Exportación correcta"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:170
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:172
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
msgstr "Error al importar el perfil de {0}: {1}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:176
#, 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 "No se puede importar el perfil de {0} antes de añadir una impresora."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:192
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "No custom profile to import in file {0}"
-msgstr "No hay ningún perfil personalizado para importar en el archivo {0}."
+msgstr "No hay ningún perfil personalizado para importar en el archivo {0}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:194
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:196
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}:"
msgstr "Error al importar el perfil de {0}:"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:218
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:228
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:220
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "This profile {0} contains incorrect data, could not import it."
msgstr "Este perfil {0} contiene datos incorrectos, no se han podido importar."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:241
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:243
#, 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 "El equipo definido en el perfil {0} ({1}) no coincide con el equipo actual ({2}), no se ha podido importar."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:315
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to import profile from {0}:"
msgstr "Error al importar el perfil de {0}:"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:316
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Successfully imported profile {0}"
msgstr "Perfil {0} importado correctamente"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:319
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321
#, python-brace-format
msgctxt "@info:status"
msgid "File {0} does not contain any valid profile."
msgstr "El archivo {0} no contiene ningún perfil válido."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:322
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:324
#, python-brace-format
msgctxt "@info:status"
msgid "Profile {0} has an unknown file type or is corrupted."
msgstr "El perfil {0} tiene un tipo de archivo desconocido o está corrupto."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:340
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:359
msgctxt "@label"
msgid "Custom profile"
msgstr "Perfil personalizado"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:356
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:375
msgctxt "@info:status"
msgid "Profile is missing a quality type."
msgstr "Al perfil le falta un tipo de calidad."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:370
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:389
#, python-brace-format
msgctxt "@info:status"
msgid "Could not find a quality type {0} for the current configuration."
msgstr "No se ha podido encontrar un tipo de calidad {0} para la configuración actual."
-#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:69
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:76
+msgctxt "@tooltip"
+msgid "Outer Wall"
+msgstr "Pared exterior"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:77
+msgctxt "@tooltip"
+msgid "Inner Walls"
+msgstr "Paredes interiores"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:78
+msgctxt "@tooltip"
+msgid "Skin"
+msgstr "Forro"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:79
+msgctxt "@tooltip"
+msgid "Infill"
+msgstr "Relleno"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:80
+msgctxt "@tooltip"
+msgid "Support Infill"
+msgstr "Relleno de soporte"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:81
+msgctxt "@tooltip"
+msgid "Support Interface"
+msgstr "Interfaz de soporte"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:82
+msgctxt "@tooltip"
+msgid "Support"
+msgstr "Soporte"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:83
+msgctxt "@tooltip"
+msgid "Skirt"
+msgstr "Falda"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:84
+msgctxt "@tooltip"
+msgid "Prime Tower"
+msgstr "Torre auxiliar"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:85
+msgctxt "@tooltip"
+msgid "Travel"
+msgstr "Desplazamiento"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:86
+msgctxt "@tooltip"
+msgid "Retractions"
+msgstr "Retracciones"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:87
+msgctxt "@tooltip"
+msgid "Other"
+msgstr "Otro"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:306
+#, python-brace-format
+msgctxt "@label"
+msgid "Pre-sliced file {0}"
+msgstr "Archivo {0} presegmentado"
+
+#: /home/ruben/Projects/Cura/cura/UI/WelcomePagesModel.py:56
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:62
+msgctxt "@action:button"
+msgid "Next"
+msgstr "Siguiente"
+
+#: /home/ruben/Projects/Cura/cura/UI/ObjectsModel.py:61
#, python-brace-format
msgctxt "@label"
msgid "Group #{group_nr}"
msgstr "N.º de grupo {group_nr}"
-#: /home/ruben/Projects/Cura/cura/Machines/Models/MachineManagementModel.py:65
-msgctxt "@info:title"
-msgid "Network enabled printers"
-msgstr "Impresoras de red habilitadas"
+#: /home/ruben/Projects/Cura/cura/UI/WhatsNewPagesModel.py:17
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:185
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:85
+#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:482
+#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:508
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:124
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:168
+msgctxt "@action:button"
+msgid "Close"
+msgstr "Cerrar"
-#: /home/ruben/Projects/Cura/cura/Machines/Models/MachineManagementModel.py:80
-msgctxt "@info:title"
-msgid "Local printers"
-msgstr "Impresoras locales"
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:17
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:91
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:48
+msgctxt "@action:button"
+msgid "Add"
+msgstr "Agregar"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/ExtrudersModel.py:208
+msgctxt "@menuitem"
+msgid "Not overridden"
+msgstr "No reemplazado"
#: /home/ruben/Projects/Cura/cura/Machines/Models/QualityManagementModel.py:109
#, python-brace-format
@@ -1166,23 +1153,41 @@ msgctxt "@item:inlistbox"
msgid "All Files (*)"
msgstr "Todos los archivos (*)"
-#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:665
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:86
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:182
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:269
+msgctxt "@label"
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:116
+msgctxt "@label"
+msgid "The printer(s) below cannot be connected because they are part of a group"
+msgstr "Las siguientes impresoras no pueden conectarse porque forman parte de un grupo"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:118
+msgctxt "@label"
+msgid "Available networked printers"
+msgstr "Impresoras en red disponibles"
+
+#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:689
msgctxt "@label"
msgid "Custom Material"
msgstr "Material personalizado"
-#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:666
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:256
+#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:690
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:203
msgctxt "@label"
msgid "Custom"
msgstr "Personalizado"
-#: /home/ruben/Projects/Cura/cura/BuildVolume.py:81
+#: /home/ruben/Projects/Cura/cura/BuildVolume.py:89
msgctxt "@info:status"
msgid "The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from colliding with printed models."
msgstr "La altura del volumen de impresión se ha reducido debido al valor del ajuste «Secuencia de impresión» para evitar que el caballete colisione con los modelos impresos."
-#: /home/ruben/Projects/Cura/cura/BuildVolume.py:83
+#: /home/ruben/Projects/Cura/cura/BuildVolume.py:91
msgctxt "@info:title"
msgid "Build Volume"
msgstr "Volumen de impresión"
@@ -1197,16 +1202,31 @@ msgctxt "@info:backup_failed"
msgid "Tried to restore a Cura backup without having proper data or meta data."
msgstr "Se ha intentado restaurar una copia de seguridad de Cura sin tener los datos o metadatos adecuados."
-#: /home/ruben/Projects/Cura/cura/Backups/Backup.py:124
+#: /home/ruben/Projects/Cura/cura/Backups/Backup.py:125
msgctxt "@info:backup_failed"
-msgid "Tried to restore a Cura backup that does not match your current version."
-msgstr "Se ha intentado restaurar una copia de seguridad de Cura que no coincide con la versión actual."
+msgid "Tried to restore a Cura backup that is higher than the current version."
+msgstr "Se ha intentado restaurar una copia de seguridad de Cura superior a la versión actual."
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationHelpers.py:79
+msgctxt "@message"
+msgid "Could not read response."
+msgstr "No se ha podido leer la respuesta."
+
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
msgstr "No se puede acceder al servidor de cuentas de Ultimaker."
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationRequestHandler.py:66
+msgctxt "@message"
+msgid "Please give the required permissions when authorizing this application."
+msgstr "Conceda los permisos necesarios al autorizar esta aplicación."
+
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationRequestHandler.py:73
+msgctxt "@message"
+msgid "Something unexpected happened when trying to log in, please try again."
+msgstr "Se ha producido un problema al intentar iniciar sesión, vuelva a intentarlo."
+
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
msgid "Multiplying and placing objects"
@@ -1219,7 +1239,7 @@ 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
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:149
msgctxt "@info:status"
msgid "Unable to find a location within the build volume for all objects"
msgstr "No se puede encontrar una ubicación dentro del volumen de impresión para todos los objetos"
@@ -1230,19 +1250,19 @@ msgid "Placing Object"
msgstr "Colocando objeto"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:30
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:67
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:66
msgctxt "@info:status"
msgid "Finding new location for objects"
msgstr "Buscando nueva ubicación para los objetos"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:34
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:71
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:70
msgctxt "@info:title"
msgid "Finding Location"
msgstr "Buscando ubicación"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:104
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:151
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:150
msgctxt "@info:title"
msgid "Can't Find Location"
msgstr "No se puede encontrar la ubicación"
@@ -1260,7 +1280,12 @@ 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.
\n"
+" "
#: /home/ruben/Projects/Cura/cura/CrashHandler.py:98
msgctxt "@action:button"
@@ -1293,7 +1318,10 @@ msgid ""
"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"
@@ -1365,242 +1393,195 @@ msgstr "Registros"
#: /home/ruben/Projects/Cura/cura/CrashHandler.py:322
msgctxt "@title:groupbox"
-msgid "User description"
-msgstr "Descripción del usuario"
+msgid "User description (Note: Developers may not speak your language, please use English if possible)"
+msgstr "Descripción del usuario (Nota: es posible que los desarrolladores no hablen su idioma; si es posible, utilice el inglés)"
-#: /home/ruben/Projects/Cura/cura/CrashHandler.py:341
+#: /home/ruben/Projects/Cura/cura/CrashHandler.py:342
msgctxt "@action:button"
msgid "Send report"
msgstr "Enviar informe"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:480
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:504
msgctxt "@info:progress"
msgid "Loading machines..."
msgstr "Cargando máquinas..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:781
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:819
msgctxt "@info:progress"
msgid "Setting up scene..."
msgstr "Configurando escena..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:817
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:854
msgctxt "@info:progress"
msgid "Loading interface..."
msgstr "Cargando interfaz..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1059
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1133
#, python-format
msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm."
msgid "%(width).1f x %(depth).1f x %(height).1f mm"
msgstr "%(width).1f x %(depth).1f x %(height).1f mm"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1618
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1611
#, python-brace-format
msgctxt "@info:status"
msgid "Only one G-code file can be loaded at a time. Skipped importing {0}"
msgstr "Solo se puede cargar un archivo GCode a la vez. Se omitió la importación de {0}"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1628
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1621
#, python-brace-format
msgctxt "@info:status"
msgid "Can't open any other file if G-code is loading. Skipped importing {0}"
msgstr "No se puede abrir ningún archivo si se está cargando un archivo GCode. Se omitió la importación de {0}"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1718
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1711
msgctxt "@info:status"
msgid "The selected model was too small to load."
msgstr "No se puede cargar el modelo seleccionado, es demasiado pequeño."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:62
-msgctxt "@title"
-msgid "Machine Settings"
-msgstr "Ajustes de la máquina"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:81
-msgctxt "@title:tab"
-msgid "Printer"
-msgstr "Impresora"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:100
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:58
+msgctxt "@title:label"
msgid "Printer Settings"
msgstr "Ajustes de la impresora"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:111
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:72
msgctxt "@label"
msgid "X (Width)"
msgstr "X (anchura)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:112
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:122
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:132
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:238
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:387
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:403
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:429
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:441
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:897
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:76
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:90
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:104
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:194
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:213
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:232
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:253
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:272
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:79
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:93
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:109
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:124
msgctxt "@label"
msgid "mm"
msgstr "mm"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:121
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:86
msgctxt "@label"
msgid "Y (Depth)"
msgstr "Y (profundidad)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:131
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:100
msgctxt "@label"
msgid "Z (Height)"
msgstr "Z (altura)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:143
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:114
msgctxt "@label"
msgid "Build plate shape"
msgstr "Forma de la placa de impresión"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:152
-msgctxt "@option:check"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:127
+msgctxt "@label"
msgid "Origin at center"
msgstr "Origen en el centro"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:160
-msgctxt "@option:check"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:139
+msgctxt "@label"
msgid "Heated bed"
-msgstr "Plataforma caliente"
+msgstr "Plataforma calentada"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:171
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:151
msgctxt "@label"
msgid "G-code flavor"
msgstr "Tipo de GCode"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:184
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:176
+msgctxt "@title:label"
msgid "Printhead Settings"
msgstr "Ajustes del cabezal de impresión"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:194
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:190
msgctxt "@label"
msgid "X min"
msgstr "X mín."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:195
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Distancia desde la parte izquierda del cabezal de impresión hasta el centro de la tobera. Se usa para evitar que colisionen la impresión anterior con el cabezal de impresión al imprimir «de uno en uno»."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:204
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:209
msgctxt "@label"
msgid "Y min"
msgstr "Y mín."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:205
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Distancia desde la parte frontal del cabezal de impresión hasta el centro de la tobera. Se usa para evitar que colisionen la impresión anterior con el cabezal de impresión al imprimir «de uno en uno»."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:214
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:228
msgctxt "@label"
msgid "X max"
msgstr "X máx."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:215
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Distancia desde la parte derecha del cabezal de impresión hasta el centro de la tobera. Se usa para evitar que colisionen la impresión anterior con el cabezal de impresión al imprimir «de uno en uno»."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:224
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:249
msgctxt "@label"
msgid "Y max"
msgstr "Y máx."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:225
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Distancia desde la parte trasera del cabezal de impresión hasta el centro de la tobera. Se usa para evitar que colisionen la impresión anterior con el cabezal de impresión al imprimir «de uno en uno»."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:237
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:268
msgctxt "@label"
-msgid "Gantry height"
-msgstr "Altura del caballete"
+msgid "Gantry Height"
+msgstr "Altura del puente"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:239
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Diferencia de altura entre la punta de la tobera y el sistema del puente (ejes X e Y). Se usa para evitar que colisionen la impresión anterior con el caballete al imprimir «de uno en uno»."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:258
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:282
msgctxt "@label"
msgid "Number of Extruders"
msgstr "Número de extrusores"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:314
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:341
+msgctxt "@title:label"
msgid "Start G-code"
msgstr "Iniciar GCode"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:324
-msgctxt "@tooltip"
-msgid "G-code commands to be executed at the very start."
-msgstr "Los comandos de GCode que se ejecutarán justo al inicio."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:333
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:355
+msgctxt "@title:label"
msgid "End G-code"
msgstr "Finalizar GCode"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:343
-msgctxt "@tooltip"
-msgid "G-code commands to be executed at the very end."
-msgstr "Los comandos de GCode que se ejecutarán justo al final."
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:42
+msgctxt "@title:tab"
+msgid "Printer"
+msgstr "Impresora"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:374
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:63
+msgctxt "@title:label"
msgid "Nozzle Settings"
msgstr "Ajustes de la tobera"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:386
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:75
msgctxt "@label"
msgid "Nozzle size"
msgstr "Tamaño de la tobera"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:402
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:89
msgctxt "@label"
msgid "Compatible material diameter"
msgstr "Diámetro del material compatible"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:404
-msgctxt "@tooltip"
-msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile."
-msgstr "El diámetro nominal del filamento compatible con la impresora. El diámetro exacto se sobrescribirá según el material o el perfil."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:428
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:105
msgctxt "@label"
msgid "Nozzle offset X"
msgstr "Desplazamiento de la tobera sobre el eje X"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:440
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:120
msgctxt "@label"
msgid "Nozzle offset Y"
msgstr "Desplazamiento de la tobera sobre el eje Y"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:452
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:135
msgctxt "@label"
msgid "Cooling Fan Number"
msgstr "Número de ventilador de enfriamiento"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:453
-msgctxt "@label"
-msgid ""
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:473
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:162
+msgctxt "@title:label"
msgid "Extruder Start G-code"
msgstr "GCode inicial del extrusor"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:491
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:176
+msgctxt "@title:label"
msgid "Extruder End G-code"
msgstr "GCode final del extrusor"
@@ -1610,7 +1591,7 @@ msgid "Install"
msgstr "Instalar"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:20
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:44
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:46
msgctxt "@action:button"
msgid "Installed"
msgstr "Instalado"
@@ -1626,15 +1607,15 @@ msgid "ratings"
msgstr "calificaciones"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:30
msgctxt "@title:tab"
msgid "Plugins"
msgstr "Complementos"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:69
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:42
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:66
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:361
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:70
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:44
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:80
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:417
msgctxt "@title:tab"
msgid "Materials"
msgstr "Materiales"
@@ -1644,52 +1625,49 @@ msgctxt "@label"
msgid "Your rating"
msgstr "Su calificación"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:99
msgctxt "@label"
msgid "Version"
msgstr "Versión"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:105
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:106
msgctxt "@label"
msgid "Last updated"
msgstr "Última actualización"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:112
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:260
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:113
msgctxt "@label"
msgid "Author"
msgstr "Autor"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:119
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:120
msgctxt "@label"
msgid "Downloads"
msgstr "Descargas"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:181
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:222
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:265
-msgctxt "@label"
-msgid "Unknown"
-msgstr "Desconocido"
-
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:56
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
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/ToolboxDetailTileActions.qml:80
+msgctxt "@label:The string between and is the highlighted link"
+msgid "Buy material spools"
+msgstr "Comprar bobinas de material"
+
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:96
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
msgctxt "@action:button"
msgid "Update"
msgstr "Actualizar"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:74
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:97
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:35
msgctxt "@action:button"
msgid "Updating"
msgstr "Actualizando"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:75
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:98
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:36
msgctxt "@action:button"
msgid "Updated"
@@ -1765,7 +1743,7 @@ msgctxt "@label"
msgid "Generic Materials"
msgstr "Materiales genéricos"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:56
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:59
msgctxt "@title:tab"
msgid "Installed"
msgstr "Instalado"
@@ -1801,7 +1779,10 @@ 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.\nDebe aceptar dicha licencia para instalar el complemento.\n¿Acepta las condiciones que aparecen a continuación?"
+msgstr ""
+"Este complemento incluye una licencia.\n"
+"Debe 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"
@@ -1848,12 +1829,12 @@ msgctxt "@info"
msgid "Fetching packages..."
msgstr "Buscando paquetes..."
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:90
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:91
msgctxt "@label"
msgid "Website"
msgstr "Sitio web"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:97
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:98
msgctxt "@label"
msgid "Email"
msgstr "Correo electrónico"
@@ -1861,23 +1842,7 @@ msgstr "Correo electrónico"
#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.qml:22
msgctxt "@info:tooltip"
msgid "Some things could be problematic in this print. Click to see tips for adjustment."
-msgstr "Algunos elementos pueden causar problemas durante la impresión. Haga clic para ver consejos sobre cómo ajustarla."
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18
-msgctxt "@label"
-msgid "Changelog"
-msgstr "Registro de cambios"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:185
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:85
-#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:482
-#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:508
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:168
-msgctxt "@action:button"
-msgid "Close"
-msgstr "Cerrar"
+msgstr "Algunos elementos pueden causar problemas durante la impresión. Haga clic para ver consejos sobre cómo ajustarlos."
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:31
msgctxt "@title"
@@ -1954,38 +1919,40 @@ msgctxt "@label"
msgid "Firmware update failed due to missing firmware."
msgstr "Se ha producido un error al actualizar el firmware porque falta el firmware."
-#: /home/ruben/Projects/Cura/plugins/UserAgreement/UserAgreement.qml:16
-msgctxt "@title:window"
-msgid "User Agreement"
-msgstr "Acuerdo de usuario"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:144
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:181
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:153
+msgctxt "@label"
+msgid "Glass"
+msgstr "Vidrio"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:208
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:249
msgctxt "@info"
-msgid "These options are not available because you are monitoring a cloud printer."
-msgstr "Estas opciones no se encuentran disponibles porque está supervisando una impresora en la nube."
+msgid "Please update your printer's firmware to manage the queue remotely."
+msgstr "Actualice el firmware de la impresora para gestionar la cola de forma remota."
#: /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 "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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:300
msgctxt "@label:status"
msgid "Loading..."
msgstr "Cargando..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:304
msgctxt "@label:status"
msgid "Unavailable"
msgstr "No disponible"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:308
msgctxt "@label:status"
msgid "Unreachable"
msgstr "No se puede conectar"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:312
msgctxt "@label:status"
msgid "Idle"
msgstr "Sin actividad"
@@ -1995,37 +1962,31 @@ msgctxt "@label"
msgid "Untitled"
msgstr "Sin título"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:374
msgctxt "@label"
msgid "Anonymous"
msgstr "Anónimo"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:401
msgctxt "@label:status"
msgid "Requires configuration changes"
msgstr "Debe cambiar la configuración"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:439
msgctxt "@action:button"
msgid "Details"
msgstr "Detalles"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:130
msgctxt "@label"
msgid "Unavailable printer"
msgstr "Impresora no disponible"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "First available"
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
-msgctxt "@label"
-msgid "Glass"
-msgstr "Vidrio"
-
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:31
msgctxt "@label"
msgid "Queued"
@@ -2033,178 +1994,190 @@ 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 "Ir a Cura Connect"
+msgid "Manage in browser"
+msgstr "Gestionar en el navegador"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:100
+msgctxt "@label"
+msgid "There are no print jobs in the queue. Slice and send a job to add one."
+msgstr "No hay trabajos de impresión en la cola. Segmentar y enviar un trabajo para añadir uno."
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Print jobs"
msgstr "Trabajos de impresión"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:132
msgctxt "@label"
msgid "Total print time"
msgstr "Tiempo de impresión total"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:148
msgctxt "@label"
msgid "Waiting for"
msgstr "Esperando"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:246
-msgctxt "@label link to connect manager"
-msgid "View print history"
-msgstr "Ver historial de impresión"
-
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:50
msgctxt "@window:title"
msgid "Existing Connection"
msgstr "Conexión existente"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:48
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:52
msgctxt "@message:text"
msgid "This printer/group is already added to Cura. Please select another printer/group."
msgstr "Esta impresora o grupo de impresoras ya se ha añadido a Cura. Seleccione otra impresora o grupo de impresoras."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:65
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:69
msgctxt "@title:window"
msgid "Connect to Networked Printer"
msgstr "Conectar con la impresora en red"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:77
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:81
msgctxt "@label"
-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\nSeleccione la impresora de la siguiente lista:"
+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."
+msgstr "Para imprimir directamente a través de la red, asegúrese de que la impresora está conectada a la red mediante 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."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44
-msgctxt "@action:button"
-msgid "Add"
-msgstr "Agregar"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:81
+msgctxt "@label"
+msgid "Select your printer from the list below:"
+msgstr "Seleccione la impresora en la lista siguiente:"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:97
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:101
msgctxt "@action:button"
msgid "Edit"
msgstr "Editar"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:108
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:128
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:117
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:112
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:146
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:55
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:121
msgctxt "@action:button"
msgid "Remove"
msgstr "Eliminar"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:120
msgctxt "@action:button"
msgid "Refresh"
msgstr "Actualizar"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:211
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:215
msgctxt "@label"
msgid "If your printer is not listed, read the network printing troubleshooting guide"
msgstr "Si la impresora no aparece en la lista, lea la guía de solución de problemas de impresión y red"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:240
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:244
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:258
msgctxt "@label"
msgid "Type"
msgstr "Tipo"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:279
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:283
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:274
msgctxt "@label"
msgid "Firmware version"
msgstr "Versión de firmware"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:293
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:297
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:290
msgctxt "@label"
msgid "Address"
msgstr "Dirección"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:317
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
msgctxt "@label"
msgid "This printer is not set up to host a group of printers."
msgstr "Esta impresora no está configurada para alojar un grupo de impresoras."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:325
msgctxt "@label"
msgid "This printer is the host for a group of %1 printers."
msgstr "Esta impresora aloja un grupo de %1 impresoras."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:332
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:336
msgctxt "@label"
msgid "The printer at this address has not yet responded."
msgstr "La impresora todavía no ha respondido en esta dirección."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:337
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:341
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:74
msgctxt "@action:button"
msgid "Connect"
msgstr "Conectar"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:351
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:354
+msgctxt "@title:window"
+msgid "Invalid IP address"
+msgstr "Dirección IP no válida"
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:355
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:146
+msgctxt "@text"
+msgid "Please enter a valid IP address."
+msgstr "Introduzca una dirección IP válida."
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:366
msgctxt "@title:window"
msgid "Printer Address"
msgstr "Dirección de la impresora"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:374
-msgctxt "@alabel"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:389
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:102
+msgctxt "@label"
msgid "Enter the IP address or hostname of your printer on the network."
-msgstr "Introduzca la dirección IP o el nombre de host de la impresora en red."
+msgstr "Introduzca la dirección IP o el nombre de host de la impresora en la red."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:404
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:132
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:419
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:138
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181
msgctxt "@action:button"
msgid "OK"
msgstr "Aceptar"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:88
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:100
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:78
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:90
msgctxt "@label:status"
msgid "Aborted"
msgstr "Cancelado"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:90
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:92
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:80
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:82
msgctxt "@label:status"
msgid "Finished"
msgstr "Terminado"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:94
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:84
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:86
msgctxt "@label:status"
msgid "Preparing..."
msgstr "Preparando..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:88
msgctxt "@label:status"
msgid "Aborting..."
msgstr "Cancelando..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:92
msgctxt "@label:status"
msgid "Pausing..."
msgstr "Pausando..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:94
msgctxt "@label:status"
msgid "Paused"
msgstr "En pausa"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Resuming..."
-msgstr "Reanudando"
+msgstr "Reanudando..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Action required"
msgstr "Acción requerida"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:100
msgctxt "@label:status"
msgid "Finishes %1 at %2"
msgstr "Termina el %1 a las %2"
@@ -2248,7 +2221,7 @@ msgstr "Pausando..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:104
msgctxt "@label"
msgid "Resuming..."
-msgstr "Reanudando"
+msgstr "Reanudando..."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorContextMenu.qml:106
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:284
@@ -2308,44 +2281,44 @@ msgctxt "@action:button"
msgid "Override"
msgstr "Anular"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:85
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] "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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:89
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."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:78
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:99
msgctxt "@label"
msgid "Change material %1 from %2 to %3."
msgstr "Cambiar material %1, de %2 a %3."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:81
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:102
msgctxt "@label"
msgid "Load %3 as material %1 (This cannot be overridden)."
msgstr "Cargar %3 como material %1 (no se puede anular)."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:84
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:105
msgctxt "@label"
msgid "Change print core %1 from %2 to %3."
msgstr "Cambiar print core %1, de %2 a %3."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:87
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:108
msgctxt "@label"
msgid "Change build plate to %1 (This cannot be overridden)."
msgstr "Cambiar la placa de impresión a %1 (no se puede anular)."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:115
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:156
msgctxt "@label"
msgid "Aluminum"
msgstr "Aluminio"
@@ -2355,107 +2328,109 @@ msgctxt "@info:tooltip"
msgid "Connect to a printer"
msgstr "Conecta a una impresora"
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:92
+#: /home/ruben/Projects/Cura/plugins/SettingsGuide/resources/qml/SettingsGuide.qml:16
+msgctxt "@title"
+msgid "Cura Settings Guide"
+msgstr "Guía de ajustes de Cura"
+
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:100
msgctxt "@info"
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 "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."
+"- Check if the printer is connected to the network.\n"
+"- Check if you are signed in to discover cloud-connected printers."
+msgstr "Asegúrese de que la impresora está conectada:\n- Compruebe que la impresora está encendida.\n- Compruebe que la impresora está conectada a la red.\n- Compruebe"
+" que ha iniciado sesión para ver impresoras conectadas a la nube."
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:117
msgctxt "@info"
-msgid "Please select a network connected printer to monitor."
-msgstr "Seleccione la impresora conectada a la red que desee supervisar."
+msgid "Please connect your printer to the network."
+msgstr "Conecte su impresora a la red."
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
-msgctxt "@info"
-msgid "Please connect your Ultimaker printer to your local network."
-msgstr "Conecte su impresora Ultimaker a su red local."
-
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:156
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
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
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:20
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:49
msgctxt "@label"
msgid "Color scheme"
msgstr "Combinación de colores"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:105
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:107
msgctxt "@label:listbox"
msgid "Material Color"
msgstr "Color del material"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:109
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:111
msgctxt "@label:listbox"
msgid "Line Type"
msgstr "Tipo de línea"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:113
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:115
msgctxt "@label:listbox"
msgid "Feedrate"
msgstr "Velocidad"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:117
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:119
msgctxt "@label:listbox"
msgid "Layer thickness"
msgstr "Grosor de la capa"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:154
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:156
msgctxt "@label"
msgid "Compatibility Mode"
msgstr "Modo de compatibilidad"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:230
msgctxt "@label"
msgid "Travels"
msgstr "Desplazamientos"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:236
msgctxt "@label"
msgid "Helpers"
msgstr "Asistentes"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:242
msgctxt "@label"
msgid "Shell"
msgstr "Perímetro"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:248
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
msgctxt "@label"
msgid "Infill"
msgstr "Relleno"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:297
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:298
msgctxt "@label"
msgid "Only Show Top Layers"
msgstr "Mostrar solo capas superiores"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:307
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:308
msgctxt "@label"
msgid "Show 5 Detailed Layers On Top"
msgstr "Mostrar cinco capas detalladas en la parte superior"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:321
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:322
msgctxt "@label"
msgid "Top / Bottom"
msgstr "Superior o inferior"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:325
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:326
msgctxt "@label"
msgid "Inner Wall"
msgstr "Pared interior"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:383
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:384
msgctxt "@label"
msgid "min"
msgstr "mín."
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:432
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:433
msgctxt "@label"
msgid "max"
msgstr "máx."
@@ -2485,30 +2460,25 @@ msgctxt "@info:tooltip"
msgid "Change active post-processing scripts"
msgstr "Cambia las secuencias de comandos de posprocesamiento"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:16
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:17
msgctxt "@title:window"
msgid "More information on anonymous data collection"
msgstr "Más información sobre la recopilación de datos anónimos"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:66
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:74
msgctxt "@text:window"
-msgid "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."
-msgstr "Cura envía datos anónimos a Ultimaker para mejorar la calidad de impresión y la experiencia de usuario. A continuación, hay un ejemplo de todos los datos que se han enviado."
+msgid "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:"
+msgstr "Ultimaker Cura recopila datos anónimos para mejorar la calidad de impresión y la experiencia de usuario. A continuación, hay un ejemplo de todos los datos que se comparten:"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:109
msgctxt "@text:window"
-msgid "I don't want to send this data"
-msgstr "No deseo enviar estos datos"
+msgid "I don't want to send anonymous data"
+msgstr "No deseo enviar datos anónimos"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:118
msgctxt "@text:window"
-msgid "Allow sending this data to Ultimaker and help us improve Cura"
-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 "No ha seleccionado ninguna impresora"
+msgid "Allow sending anonymous data"
+msgstr "Permitir el envío de datos anónimos"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2557,19 +2527,19 @@ msgstr "Profundidad (mm)"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126
msgctxt "@info:tooltip"
-msgid "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."
-msgstr "De manera predeterminada, los píxeles blancos representan los puntos altos de la malla y los píxeles negros representan los puntos bajos de la malla. Cambie esta opción para invertir el comportamiento de tal manera que los píxeles negros representen los puntos altos de la malla y los píxeles blancos representen los puntos bajos de la malla."
-
-#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
-msgctxt "@item:inlistbox"
-msgid "Lighter is higher"
-msgstr "Cuanto más claro más alto"
+msgid "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."
+msgstr "Para las litofanías, los píxeles oscuros deben coincidir con ubicaciones más gruesas para bloquear la entrada de más luz. En los mapas de altura, los píxeles más claros se corresponden con un terreno más alto, por lo que dichos píxeles deben coincidir con ubicaciones más gruesas en el modelo 3D generado."
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
msgctxt "@item:inlistbox"
msgid "Darker is higher"
msgstr "Cuanto más oscuro más alto"
+#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
+msgctxt "@item:inlistbox"
+msgid "Lighter is higher"
+msgstr "Cuanto más claro más alto"
+
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149
msgctxt "@info:tooltip"
msgid "The amount of smoothing to apply to the image."
@@ -2683,7 +2653,7 @@ msgid "Printer Group"
msgstr "Grupo de impresoras"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:180
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:197
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:226
msgctxt "@action:label"
msgid "Profile settings"
msgstr "Ajustes del perfil"
@@ -2696,19 +2666,19 @@ msgstr "¿Cómo debería solucionarse el conflicto en el perfil?"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:121
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:221
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:250
msgctxt "@action:label"
msgid "Name"
msgstr "Nombre"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:231
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:205
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:234
msgctxt "@action:label"
msgid "Not in profile"
msgstr "No está en el perfil"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:236
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:210
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:239
msgctxt "@action:label"
msgid "%1 override"
msgid_plural "%1 overrides"
@@ -2789,6 +2759,7 @@ 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
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:138
msgctxt "@button"
msgid "Sign in"
msgstr "Iniciar sesión"
@@ -2879,22 +2850,23 @@ msgid "Previous"
msgstr "Anterior"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:60
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:152
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:174
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:159
msgctxt "@action:button"
msgid "Export"
msgstr "Exportar"
-#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:62
-msgctxt "@action:button"
-msgid "Next"
-msgstr "Siguiente"
-
-#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:169
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:209
msgctxt "@label"
msgid "Tip"
msgstr "Consejo"
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMaterialMenu.qml:20
+#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:66
+msgctxt "@label:category menu label"
+msgid "Generic"
+msgstr "Genérico"
+
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:160
msgctxt "@label"
msgid "Print experiment"
@@ -2905,150 +2877,51 @@ msgctxt "@label"
msgid "Checklist"
msgstr "Lista de verificación"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25
-msgctxt "@title"
-msgid "Select Printer Upgrades"
-msgstr "Seleccionar actualizaciones de impresora"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:38
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:30
msgctxt "@label"
msgid "Please select any upgrades made to this Ultimaker 2."
msgstr "Seleccione cualquier actualización de este Ultimaker 2."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:47
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:44
msgctxt "@label"
msgid "Olsson Block"
msgstr "Bloque Olsson"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:30
msgctxt "@title"
msgid "Build Plate Leveling"
msgstr "Nivelación de la placa de impresión"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:44
msgctxt "@label"
msgid "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."
msgstr "Ahora puede ajustar la placa de impresión para asegurarse de que sus impresiones salgan muy bien. Al hacer clic en 'Mover a la siguiente posición', la tobera se trasladará a las diferentes posiciones que se pueden ajustar."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:57
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 "Para cada posición: inserte una hoja de papel debajo de la tobera y ajuste la altura de la placa de impresión. La altura de la placa de impresión es correcta cuando el papel queda ligeramente sujeto por la punta de la tobera."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:75
msgctxt "@action:button"
msgid "Start Build Plate Leveling"
msgstr "Iniciar nivelación de la placa de impresión"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:87
msgctxt "@action:button"
msgid "Move to Next Position"
msgstr "Mover a la siguiente posición"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:30
msgctxt "@label"
msgid "Please select any upgrades made to this Ultimaker Original"
msgstr "Seleccione cualquier actualización de Ultimaker Original"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:41
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"
@@ -3099,170 +2972,170 @@ msgctxt "@label"
msgid "Are you sure you want to abort the print?"
msgstr "¿Está seguro de que desea cancelar la impresión?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:71
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:73
msgctxt "@title"
msgid "Information"
msgstr "Información"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:100
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:102
msgctxt "@title:window"
msgid "Confirm Diameter Change"
msgstr "Confirmar cambio de diámetro"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:101
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:103
msgctxt "@label (%1 is a number)"
msgid "The new filament diameter is set to %1 mm, which is not compatible with the current extruder. Do you wish to continue?"
msgstr "El nuevo diámetro del filamento está ajustado en %1 mm y no es compatible con el extrusor actual. ¿Desea continuar?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:133
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:127
msgctxt "@label"
msgid "Display Name"
msgstr "Mostrar nombre"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:143
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:137
msgctxt "@label"
msgid "Brand"
msgstr "Marca"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:153
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:147
msgctxt "@label"
msgid "Material Type"
msgstr "Tipo de material"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:162
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:157
msgctxt "@label"
msgid "Color"
msgstr "Color"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:212
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:207
msgctxt "@label"
msgid "Properties"
msgstr "Propiedades"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:214
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:209
msgctxt "@label"
msgid "Density"
msgstr "Densidad"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:229
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:224
msgctxt "@label"
msgid "Diameter"
msgstr "Diámetro"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:263
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:258
msgctxt "@label"
msgid "Filament Cost"
msgstr "Coste del filamento"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:280
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:275
msgctxt "@label"
msgid "Filament weight"
msgstr "Anchura del filamento"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:298
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:293
msgctxt "@label"
msgid "Filament length"
msgstr "Longitud del filamento"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:307
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:302
msgctxt "@label"
msgid "Cost per Meter"
msgstr "Coste por metro"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:321
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:316
msgctxt "@label"
msgid "This material is linked to %1 and shares some of its properties."
msgstr "Este material está vinculado a %1 y comparte alguna de sus propiedades."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:328
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:323
msgctxt "@label"
msgid "Unlink Material"
msgstr "Desvincular material"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:339
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:334
msgctxt "@label"
msgid "Description"
msgstr "Descripción"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:352
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:347
msgctxt "@label"
msgid "Adhesion Information"
msgstr "Información sobre adherencia"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:378
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:17
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:373
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label"
msgid "Print settings"
msgstr "Ajustes de impresión"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:84
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:72
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:99
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:40
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:73
msgctxt "@action:button"
msgid "Activate"
msgstr "Activar"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:101
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:117
msgctxt "@action:button"
msgid "Create"
msgstr "Crear"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:114
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:131
msgctxt "@action:button"
msgid "Duplicate"
msgstr "Duplicado"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:141
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:142
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:160
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:148
msgctxt "@action:button"
msgid "Import"
msgstr "Importar"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:203
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:223
msgctxt "@action:label"
msgid "Printer"
msgstr "Impresora"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:262
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:246
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:287
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:253
msgctxt "@title:window"
msgid "Confirm Remove"
msgstr "Confirmar eliminación"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:263
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:247
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:254
msgctxt "@label (%1 is object name)"
msgid "Are you sure you wish to remove %1? This cannot be undone!"
msgstr "¿Seguro que desea eliminar %1? ¡Esta acción no se puede deshacer!"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:277
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:285
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:304
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:312
msgctxt "@title:window"
msgid "Import Material"
msgstr "Importar material"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:286
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:313
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Could not import material %1: %2"
msgstr "No se pudo importar el material en %1: %2"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:317
msgctxt "@info:status Don't translate the XML tag !"
msgid "Successfully imported material %1"
msgstr "El material se ha importado correctamente en %1"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:308
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:316
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:335
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:343
msgctxt "@title:window"
msgid "Export Material"
msgstr "Exportar material"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:320
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:347
msgctxt "@info:status Don't translate the XML tags and !"
msgid "Failed to export material to %1: %2"
msgstr "Se ha producido un error al exportar el material a %1: %2"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:326
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:353
msgctxt "@info:status Don't translate the XML tag !"
msgid "Successfully exported material to %1"
msgstr "El material se ha exportado correctamente a %1"
@@ -3277,412 +3150,437 @@ msgctxt "@label:textbox"
msgid "Check all"
msgstr "Comprobar todo"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:47
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:48
msgctxt "@info:status"
msgid "Calculated"
msgstr "Calculado"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:61
msgctxt "@title:column"
msgid "Setting"
msgstr "Ajustes"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:68
msgctxt "@title:column"
msgid "Profile"
msgstr "Perfil"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:74
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75
msgctxt "@title:column"
msgid "Current"
msgstr "Actual"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:82
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:83
msgctxt "@title:column"
msgid "Unit"
msgstr "Unidad"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:15
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:354
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:410
msgctxt "@title:tab"
msgid "General"
msgstr "General"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:126
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:130
msgctxt "@label"
msgid "Interface"
msgstr "Interfaz"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:137
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:141
msgctxt "@label"
msgid "Language:"
msgstr "Idioma:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:204
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:208
msgctxt "@label"
msgid "Currency:"
msgstr "Moneda:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:217
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221
msgctxt "@label"
msgid "Theme:"
msgstr "Tema:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:273
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:277
msgctxt "@label"
msgid "You will need to restart the application for these changes to have effect."
msgstr "Tendrá que reiniciar la aplicación para que estos cambios tengan efecto."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:294
msgctxt "@info:tooltip"
msgid "Slice automatically when changing settings."
msgstr "Segmentar automáticamente al cambiar los ajustes."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:302
msgctxt "@option:check"
msgid "Slice automatically"
msgstr "Segmentar automáticamente"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:312
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:316
msgctxt "@label"
msgid "Viewport behavior"
msgstr "Comportamiento de la ventanilla"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:324
msgctxt "@info:tooltip"
msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly."
msgstr "Resaltar en rojo las áreas del modelo sin soporte. Sin soporte, estas áreas no se imprimirán correctamente."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:329
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:333
msgctxt "@option:check"
msgid "Display overhang"
msgstr "Mostrar voladizos"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:336
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341
msgctxt "@info:tooltip"
msgid "Moves the camera so the model is in the center of the view when a model is selected"
msgstr "Mueve la cámara de manera que el modelo se encuentre en el centro de la vista cuando se selecciona un modelo"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:346
msgctxt "@action:button"
msgid "Center camera when item is selected"
msgstr "Centrar cámara cuando se selecciona elemento"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:350
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356
msgctxt "@info:tooltip"
msgid "Should the default zoom behavior of cura be inverted?"
msgstr "¿Se debería invertir el comportamiento predeterminado del zoom de cura?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:355
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361
msgctxt "@action:button"
msgid "Invert the direction of camera zoom."
msgstr "Invertir la dirección del zoom de la cámara."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:365
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371
msgctxt "@info:tooltip"
msgid "Should zooming move in the direction of the mouse?"
msgstr "¿Debería moverse el zoom en la dirección del ratón?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371
+msgctxt "@info:tooltip"
+msgid "Zooming towards the mouse is not supported in the orthogonal perspective."
+msgstr "Hacer zoom en la dirección del ratón no es compatible con la perspectiva ortogonal."
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:376
msgctxt "@action:button"
msgid "Zoom toward mouse direction"
msgstr "Hacer zoom en la dirección del ratón"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:380
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402
msgctxt "@info:tooltip"
msgid "Should models on the platform be moved so that they no longer intersect?"
msgstr "¿Deben moverse los modelos en la plataforma de modo que no se crucen?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:385
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:407
msgctxt "@option:check"
msgid "Ensure models are kept apart"
-msgstr "Asegúrese de que lo modelos están separados"
+msgstr "Asegúrese de que los modelos están separados"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:394
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416
msgctxt "@info:tooltip"
msgid "Should models on the platform be moved down to touch the build plate?"
msgstr "¿Deben moverse los modelos del área de impresión de modo que no toquen la placa de impresión?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:421
msgctxt "@option:check"
msgid "Automatically drop models to the build plate"
msgstr "Arrastrar modelos a la placa de impresión de forma automática"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:411
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433
msgctxt "@info:tooltip"
msgid "Show caution message in g-code reader."
msgstr "Se muestra el mensaje de advertencia en el lector de GCode."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:420
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:442
msgctxt "@option:check"
msgid "Caution message in g-code reader"
msgstr "Mensaje de advertencia en el lector de GCode"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:428
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:450
msgctxt "@info:tooltip"
msgid "Should layer be forced into compatibility mode?"
msgstr "¿Debe forzarse el modo de compatibilidad de la capa?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:455
msgctxt "@option:check"
msgid "Force layer view compatibility mode (restart required)"
msgstr "Forzar modo de compatibilidad de la vista de capas (necesario reiniciar)"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:449
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:465
+msgctxt "@info:tooltip"
+msgid "What type of camera rendering should be used?"
+msgstr "¿Qué tipo de renderizado de cámara debería usarse?"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:472
+msgctxt "@window:text"
+msgid "Camera rendering: "
+msgstr "Renderizado de cámara: "
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:483
+msgid "Perspective"
+msgstr "Perspectiva"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:484
+msgid "Orthogonal"
+msgstr "Ortográfica"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:515
msgctxt "@label"
msgid "Opening and saving files"
msgstr "Abrir y guardar archivos"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:456
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522
msgctxt "@info:tooltip"
msgid "Should models be scaled to the build volume if they are too large?"
msgstr "¿Deben ajustarse los modelos al volumen de impresión si son demasiado grandes?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:461
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:527
msgctxt "@option:check"
msgid "Scale large models"
msgstr "Escalar modelos de gran tamaño"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537
msgctxt "@info:tooltip"
msgid "An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be scaled up?"
msgstr "Un modelo puede mostrarse demasiado pequeño si su unidad son metros en lugar de milímetros, por ejemplo. ¿Deben escalarse estos modelos?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:542
msgctxt "@option:check"
msgid "Scale extremely small models"
msgstr "Escalar modelos demasiado pequeños"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:486
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:552
msgctxt "@info:tooltip"
msgid "Should models be selected after they are loaded?"
msgstr "¿Se deberían seleccionar los modelos después de haberse cargado?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:491
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:557
msgctxt "@option:check"
msgid "Select models when loaded"
msgstr "Seleccionar modelos al abrirlos"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:567
msgctxt "@info:tooltip"
msgid "Should a prefix based on the printer name be added to the print job name automatically?"
msgstr "¿Debe añadirse automáticamente un prefijo basado en el nombre de la impresora al nombre del trabajo de impresión?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:506
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:572
msgctxt "@option:check"
msgid "Add machine prefix to job name"
msgstr "Agregar prefijo de la máquina al nombre del trabajo"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:516
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582
msgctxt "@info:tooltip"
msgid "Should a summary be shown when saving a project file?"
msgstr "¿Mostrar un resumen al guardar un archivo de proyecto?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:586
msgctxt "@option:check"
msgid "Show summary dialog when saving project"
msgstr "Mostrar un cuadro de diálogo de resumen al guardar el proyecto"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:530
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596
msgctxt "@info:tooltip"
msgid "Default behavior when opening a project file"
msgstr "Comportamiento predeterminado al abrir un archivo del proyecto"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:538
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:604
msgctxt "@window:text"
msgid "Default behavior when opening a project file: "
msgstr "Comportamiento predeterminado al abrir un archivo del proyecto: "
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:552
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:618
msgctxt "@option:openProject"
msgid "Always ask me this"
msgstr "Preguntar siempre"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:553
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:619
msgctxt "@option:openProject"
msgid "Always open as a project"
msgstr "Abrir siempre como un proyecto"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:554
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620
msgctxt "@option:openProject"
msgid "Always import models"
msgstr "Importar modelos siempre"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:590
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656
msgctxt "@info:tooltip"
msgid "When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want to keep your modifications or not, or you can choose a default behaviour and never show that dialog again."
msgstr "Si ha realizado cambios en un perfil y, a continuación, ha cambiado a otro, aparecerá un cuadro de diálogo que le preguntará si desea guardar o descartar los cambios. También puede elegir el comportamiento predeterminado, así ese cuadro de diálogo no volverá a aparecer."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:599
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:665
msgctxt "@label"
msgid "Profiles"
msgstr "Perfiles"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:604
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:670
msgctxt "@window:text"
msgid "Default behavior for changed setting values when switching to a different profile: "
msgstr "Comportamiento predeterminado para los valores modificados al cambiar a otro perfil: "
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:618
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:684
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:157
msgctxt "@option:discardOrKeep"
msgid "Always ask me this"
msgstr "Preguntar siempre"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:619
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685
msgctxt "@option:discardOrKeep"
msgid "Always discard changed settings"
msgstr "Descartar siempre los ajustes modificados"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:686
msgctxt "@option:discardOrKeep"
msgid "Always transfer changed settings to new profile"
msgstr "Transferir siempre los ajustes modificados al nuevo perfil"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:654
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:720
msgctxt "@label"
msgid "Privacy"
msgstr "Privacidad"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:661
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:727
msgctxt "@info:tooltip"
msgid "Should Cura check for updates when the program is started?"
msgstr "¿Debe Cura buscar actualizaciones cuando se abre el programa?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:666
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:732
msgctxt "@option:check"
msgid "Check for updates on start"
msgstr "Buscar actualizaciones al iniciar"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:676
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:742
msgctxt "@info:tooltip"
msgid "Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored."
msgstr "¿Deben enviarse datos anónimos sobre la impresión a Ultimaker? Tenga en cuenta que no se envían ni almacenan modelos, direcciones IP ni otra información de identificación personal."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:681
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:747
msgctxt "@option:check"
msgid "Send (anonymous) print information"
msgstr "Enviar información (anónima) de impresión"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:690
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:756
msgctxt "@action:button"
msgid "More information"
msgstr "Más información"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:708
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:774
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:27
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ProfileMenu.qml:23
msgctxt "@label"
msgid "Experimental"
msgstr "Experimental"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:715
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:781
msgctxt "@info:tooltip"
msgid "Use multi build plate functionality"
msgstr "Utilizar funcionalidad de placa de impresión múltiple"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:720
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:786
msgctxt "@option:check"
msgid "Use multi build plate functionality (restart required)"
msgstr "Utilizar funcionalidad de placa de impresión múltiple (reinicio requerido)"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:16
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:359
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:415
msgctxt "@title:tab"
msgid "Printers"
msgstr "Impresoras"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:129
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:63
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:134
msgctxt "@action:button"
msgid "Rename"
msgstr "Cambiar nombre"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:36
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:363
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:419
msgctxt "@title:tab"
msgid "Profiles"
msgstr "Perfiles"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:87
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:89
msgctxt "@label"
msgid "Create"
msgstr "Crear"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:105
msgctxt "@label"
msgid "Duplicate"
msgstr "Duplicado"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:174
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:181
msgctxt "@title:window"
msgid "Create Profile"
msgstr "Crear perfil"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:183
msgctxt "@info"
msgid "Please provide a name for this profile."
msgstr "Introduzca un nombre para este perfil."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:239
msgctxt "@title:window"
msgid "Duplicate Profile"
msgstr "Duplicar perfil"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:263
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:270
msgctxt "@title:window"
msgid "Rename Profile"
msgstr "Cambiar nombre de perfil"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:276
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:283
msgctxt "@title:window"
msgid "Import Profile"
msgstr "Importar perfil"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:302
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:309
msgctxt "@title:window"
msgid "Export Profile"
msgstr "Exportar perfil"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:357
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:364
msgctxt "@label %1 is printer name"
msgid "Printer: %1"
msgstr "Impresora: %1"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:420
msgctxt "@label"
msgid "Default profiles"
msgstr "Perfiles predeterminados"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:420
msgctxt "@label"
msgid "Custom profiles"
msgstr "Perfiles personalizados"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:490
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:500
msgctxt "@action:button"
msgid "Update profile with current settings/overrides"
msgstr "Actualizar perfil con ajustes o sobrescrituras actuales"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:497
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:507
msgctxt "@action:button"
msgid "Discard current changes"
msgstr "Descartar cambios actuales"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:514
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:524
msgctxt "@action:label"
msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below."
msgstr "Este perfil utiliza los ajustes predeterminados especificados por la impresora, por eso no aparece ningún ajuste o sobrescritura en la lista que se ve a continuación."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:521
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:531
msgctxt "@action:label"
msgid "Your current settings match the selected profile."
msgstr "Los ajustes actuales coinciden con el perfil seleccionado."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:540
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:550
msgctxt "@title:tab"
msgid "Global Settings"
msgstr "Ajustes globales"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:89
msgctxt "@action:button"
msgid "Marketplace"
msgstr "Marketplace"
@@ -3725,12 +3623,12 @@ msgctxt "@title:menu menubar:toplevel"
msgid "&Help"
msgstr "A&yuda"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:123
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:124
msgctxt "@title:window"
msgid "New project"
msgstr "Nuevo proyecto"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:124
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:125
msgctxt "@info:question"
msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings."
msgstr "¿Está seguro de que desea iniciar un nuevo proyecto? Esto borrará la placa de impresión y cualquier ajuste no guardado."
@@ -3745,33 +3643,33 @@ msgctxt "@label:textbox"
msgid "search settings"
msgstr "buscar ajustes"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:466
msgctxt "@action:menu"
msgid "Copy value to all extruders"
msgstr "Copiar valor en todos los extrusores"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:474
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:475
msgctxt "@action:menu"
msgid "Copy all changed values to all extruders"
msgstr "Copiar todos los valores cambiados en todos los extrusores"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512
msgctxt "@action:menu"
msgid "Hide this setting"
msgstr "Ocultar este ajuste"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:529
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:525
msgctxt "@action:menu"
msgid "Don't show this setting"
msgstr "No mostrar este ajuste"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:533
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:529
msgctxt "@action:menu"
msgid "Keep this setting visible"
msgstr "Mostrar este ajuste"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:557
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:548
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:434
msgctxt "@action:menu"
msgid "Configure setting visibility..."
msgstr "Configurar visibilidad de los ajustes..."
@@ -3782,50 +3680,64 @@ 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\nHaga clic para mostrar estos ajustes."
+msgstr ""
+"Algunos ajustes ocultos utilizan valores diferentes de los valores normales calculados.\n"
+"\n"
+"Haga clic para mostrar estos ajustes."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:81
+msgctxt "@label"
+msgid "This setting is not used because all the settings that it influences are overridden."
+msgstr "Este ajuste no se utiliza porque los ajustes a los que afecta están sobrescritos."
+
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:86
msgctxt "@label Header for list of settings."
msgid "Affects"
msgstr "Afecta a"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:71
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:91
msgctxt "@label Header for list of settings."
msgid "Affected By"
msgstr "Afectado por"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:166
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186
msgctxt "@label"
msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders."
msgstr "Este ajuste siempre se comparte entre extrusores. Si lo modifica, modificará el valor de todos los extrusores."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:170
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190
msgctxt "@label"
msgid "The value is resolved from per-extruder values "
msgstr "El valor se resuelve según los valores de los extrusores. "
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:208
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:228
msgctxt "@label"
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\nHaga clic para restaurar el valor del perfil."
+msgstr ""
+"Este ajuste tiene un valor distinto del perfil.\n"
+"\n"
+"Haga clic para restaurar el valor del perfil."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:302
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:322
msgctxt "@label"
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\nHaga clic para restaurar el valor calculado."
+msgstr ""
+"Este ajuste se calcula normalmente pero actualmente tiene un valor absoluto establecido.\n"
+"\n"
+"Haga clic para restaurar el valor calculado."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:144
msgctxt "@button"
msgid "Recommended"
msgstr "Recomendado"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:158
msgctxt "@button"
msgid "Custom"
msgstr "Personalizado"
@@ -3840,27 +3752,22 @@ msgctxt "@label"
msgid "Gradual infill will gradually increase the amount of infill towards the top."
msgstr "Un relleno gradual aumentará gradualmente la cantidad de relleno hacia arriba."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:30
msgctxt "@label"
msgid "Support"
msgstr "Soporte"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:71
msgctxt "@label"
msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing."
msgstr "Generar estructuras para soportar piezas del modelo que tengan voladizos. Sin estas estructuras, estas piezas se romperían durante la impresión."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:136
-msgctxt "@label"
-msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air."
-msgstr "Seleccione qué extrusor se utilizará como soporte. Esta opción formará estructuras de soporte por debajo del modelo para evitar que éste se combe o la impresión se haga en el aire."
-
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:29
msgctxt "@label"
msgid "Adhesion"
msgstr "Adherencia"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:74
msgctxt "@label"
msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards."
msgstr "Habilita la impresión de un borde o una balsa. Esta opción agregará un área plana alrededor del objeto, que es fácil de cortar después."
@@ -3877,8 +3784,8 @@ 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 "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."
+msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile."
+msgstr "Este perfil de calidad no se encuentra disponible para su configuración de material y tobera actual. Cámbielas para poder habilitar este perfil de calidad."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
msgctxt "@tooltip"
@@ -3906,12 +3813,15 @@ 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\nHaga 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"
+"\n"
+"Haga clic para abrir el administrador de perfiles."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:21
msgctxt "@label shown when we load a Gcode file"
-msgid "Print setup disabled. G code file can not be modified."
-msgstr "Configuración de impresión deshabilitada. No se puede modificar el GCode."
+msgid "Print setup disabled. G-code file can not be modified."
+msgstr "Configuración de impresión deshabilitada. No se puede modificar el archivo GCode."
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
msgctxt "@label"
@@ -3943,7 +3853,7 @@ msgctxt "@label"
msgid "Send G-code"
msgstr "Enviar GCode"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:364
+#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:365
msgctxt "@tooltip of G-code command input"
msgid "Send a custom G-code command to the connected printer. Press 'enter' to send the command."
msgstr "Envíe un comando de GCode personalizado a la impresora conectada. Pulse «Intro» para enviar el comando."
@@ -4040,11 +3950,6 @@ msgctxt "@label:category menu label"
msgid "Favorites"
msgstr "Favoritos"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:66
-msgctxt "@label:category menu label"
-msgid "Generic"
-msgstr "Genérico"
-
#: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25
msgctxt "@label:category menu label"
msgid "Network enabled printers"
@@ -4060,32 +3965,32 @@ msgctxt "@title:menu menubar:settings"
msgid "&Printer"
msgstr "&Impresora"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:26
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:32
msgctxt "@title:menu"
msgid "&Material"
msgstr "&Material"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:35
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:41
msgctxt "@action:inmenu"
msgid "Set as Active Extruder"
msgstr "Definir como extrusor activo"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:41
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:47
msgctxt "@action:inmenu"
msgid "Enable Extruder"
msgstr "Habilitar extrusor"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:48
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:54
msgctxt "@action:inmenu"
msgid "Disable Extruder"
msgstr "Deshabilitar extrusor"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:62
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:68
msgctxt "@title:menu"
msgid "&Build plate"
msgstr "&Placa de impresión"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:65
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:71
msgctxt "@title:settings"
msgid "&Profile"
msgstr "&Perfil"
@@ -4095,7 +4000,22 @@ msgctxt "@action:inmenu menubar:view"
msgid "&Camera position"
msgstr "&Posición de la cámara"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:35
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:44
+msgctxt "@action:inmenu menubar:view"
+msgid "Camera view"
+msgstr "Vista de cámara"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:47
+msgctxt "@action:inmenu menubar:view"
+msgid "Perspective"
+msgstr "Perspectiva"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:59
+msgctxt "@action:inmenu menubar:view"
+msgid "Orthographic"
+msgstr "Ortográfica"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:80
msgctxt "@action:inmenu menubar:view"
msgid "&Build plate"
msgstr "P&laca de impresión"
@@ -4159,12 +4079,7 @@ msgctxt "@label"
msgid "Select configuration"
msgstr "Seleccionar configuración"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
-msgctxt "@label"
-msgid "See the material compatibility chart"
-msgstr "Ver el gráfico de compatibilidad de materiales"
-
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:221
msgctxt "@label"
msgid "Configurations"
msgstr "Configuraciones"
@@ -4189,17 +4104,17 @@ msgctxt "@label"
msgid "Printer"
msgstr "Impresora"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:213
msgctxt "@label"
msgid "Enabled"
msgstr "Habilitado"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:250
msgctxt "@label"
msgid "Material"
msgstr "Material"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:375
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
msgstr "Utilice pegamento con esta combinación de materiales para lograr una mejor adhesión."
@@ -4219,42 +4134,47 @@ msgctxt "@title:menu menubar:file"
msgid "Open &Recent"
msgstr "Abrir &reciente"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:145
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:140
msgctxt "@label"
msgid "Active print"
msgstr "Activar impresión"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:153
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:148
msgctxt "@label"
msgid "Job Name"
msgstr "Nombre del trabajo"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:161
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:156
msgctxt "@label"
msgid "Printing Time"
msgstr "Tiempo de impresión"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:169
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:164
msgctxt "@label"
msgid "Estimated time left"
msgstr "Tiempo restante estimado"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
-msgid "View types"
-msgstr "Ver tipos"
+msgid "View type"
+msgstr "Ver tipo"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
+#: /home/ruben/Projects/Cura/resources/qml/ObjectSelector.qml:59
msgctxt "@label"
-msgid "Hi "
-msgstr "Hola "
+msgid "Object list"
+msgstr "Lista de objetos"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:22
+msgctxt "@label The argument is a username."
+msgid "Hi %1"
+msgstr "Hola, %1"
+
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:33
msgctxt "@button"
msgid "Ultimaker account"
msgstr "Cuenta de Ultimaker"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:42
msgctxt "@button"
msgid "Sign out"
msgstr "Cerrar sesión"
@@ -4264,11 +4184,6 @@ msgctxt "@action:button"
msgid "Sign in"
msgstr "Iniciar sesión"
-#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
-msgctxt "@label"
-msgid "Ultimaker Cloud"
-msgstr "Ultimaker Cloud"
-
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
@@ -4279,8 +4194,11 @@ msgctxt "@text"
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 "- 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"
+"- Get exclusive access to print profiles from leading brands"
+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 impresión de marcas líderes"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
@@ -4292,50 +4210,55 @@ msgctxt "@label"
msgid "No time estimation available"
msgstr "Ningún cálculo de tiempo disponible"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:77
msgctxt "@label"
msgid "No cost estimation available"
msgstr "Ningún cálculo de costes disponible"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:127
msgctxt "@button"
msgid "Preview"
msgstr "Vista previa"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:55
msgctxt "@label:PrintjobStatus"
msgid "Slicing..."
msgstr "Segmentando..."
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:61
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:67
msgctxt "@label:PrintjobStatus"
-msgid "Unable to Slice"
+msgid "Unable to slice"
msgstr "No se puede segmentar"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:103
+msgctxt "@button"
+msgid "Processing"
+msgstr "Procesando"
+
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:103
msgctxt "@button"
msgid "Slice"
msgstr "Segmentación"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:104
msgctxt "@label"
msgid "Start the slicing process"
msgstr "Iniciar el proceso de segmentación"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:118
msgctxt "@button"
msgid "Cancel"
msgstr "Cancelar"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
-msgid "Time specification"
-msgstr "Especificación de tiempos"
+msgid "Time estimation"
+msgstr "Estimación de tiempos"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
-msgid "Material specification"
-msgstr "Especificación de materiales"
+msgid "Material estimation"
+msgstr "Estimación de material"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4357,285 +4280,299 @@ msgctxt "@label"
msgid "Preset printers"
msgstr "Impresoras preconfiguradas"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
+#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:166
msgctxt "@button"
msgid "Add printer"
msgstr "Agregar impresora"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
+#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:182
msgctxt "@button"
msgid "Manage printers"
msgstr "Administrar impresoras"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:81
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
msgstr "Mostrar Guía de resolución de problemas en línea"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:88
msgctxt "@action:inmenu"
msgid "Toggle Full Screen"
msgstr "Alternar pantalla completa"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:92
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96
+msgctxt "@action:inmenu"
+msgid "Exit Full Screen"
+msgstr "Salir de modo de pantalla completa"
+
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:103
msgctxt "@action:inmenu menubar:edit"
msgid "&Undo"
msgstr "Des&hacer"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:113
msgctxt "@action:inmenu menubar:edit"
msgid "&Redo"
msgstr "&Rehacer"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:112
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:123
msgctxt "@action:inmenu menubar:file"
msgid "&Quit"
msgstr "&Salir"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:120
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:131
msgctxt "@action:inmenu menubar:view"
msgid "3D View"
msgstr "Vista en 3D"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138
msgctxt "@action:inmenu menubar:view"
msgid "Front View"
msgstr "Vista frontal"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:145
msgctxt "@action:inmenu menubar:view"
msgid "Top View"
msgstr "Vista superior"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:141
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:152
msgctxt "@action:inmenu menubar:view"
msgid "Left Side View"
msgstr "Vista del lado izquierdo"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:148
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:159
msgctxt "@action:inmenu menubar:view"
msgid "Right Side View"
msgstr "Vista del lado derecho"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:155
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:166
msgctxt "@action:inmenu"
msgid "Configure Cura..."
msgstr "Configurar Cura..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:173
msgctxt "@action:inmenu menubar:printer"
msgid "&Add Printer..."
msgstr "&Agregar impresora..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179
msgctxt "@action:inmenu menubar:printer"
msgid "Manage Pr&inters..."
msgstr "Adm&inistrar impresoras ..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186
msgctxt "@action:inmenu"
msgid "Manage Materials..."
msgstr "Administrar materiales..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:184
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:195
msgctxt "@action:inmenu menubar:profile"
msgid "&Update profile with current settings/overrides"
msgstr "&Actualizar perfil con ajustes o sobrescrituras actuales"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:192
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203
msgctxt "@action:inmenu menubar:profile"
msgid "&Discard current changes"
msgstr "&Descartar cambios actuales"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:204
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:215
msgctxt "@action:inmenu menubar:profile"
msgid "&Create profile from current settings/overrides..."
msgstr "&Crear perfil a partir de ajustes o sobrescrituras actuales..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:221
msgctxt "@action:inmenu menubar:profile"
msgid "Manage Profiles..."
msgstr "Administrar perfiles..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:229
msgctxt "@action:inmenu menubar:help"
msgid "Show Online &Documentation"
msgstr "Mostrar &documentación en línea"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:237
msgctxt "@action:inmenu menubar:help"
msgid "Report a &Bug"
msgstr "Informar de un &error"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:245
+msgctxt "@action:inmenu menubar:help"
+msgid "What's New"
+msgstr "Novedades"
+
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:251
msgctxt "@action:inmenu menubar:help"
msgid "About..."
msgstr "Acerca de..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:241
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258
msgctxt "@action:inmenu menubar:edit"
msgid "Delete Selected Model"
msgid_plural "Delete Selected Models"
msgstr[0] "Eliminar modelo seleccionado"
msgstr[1] "Eliminar modelos seleccionados"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:251
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:268
msgctxt "@action:inmenu menubar:edit"
msgid "Center Selected Model"
msgid_plural "Center Selected Models"
msgstr[0] "Centrar modelo seleccionado"
msgstr[1] "Centrar modelos seleccionados"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277
msgctxt "@action:inmenu menubar:edit"
msgid "Multiply Selected Model"
msgid_plural "Multiply Selected Models"
msgstr[0] "Multiplicar modelo seleccionado"
msgstr[1] "Multiplicar modelos seleccionados"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:286
msgctxt "@action:inmenu"
msgid "Delete Model"
msgstr "Eliminar modelo"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294
msgctxt "@action:inmenu"
msgid "Ce&nter Model on Platform"
msgstr "Ce&ntrar modelo en plataforma"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:283
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:300
msgctxt "@action:inmenu menubar:edit"
msgid "&Group Models"
msgstr "A&grupar modelos"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:303
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:320
msgctxt "@action:inmenu menubar:edit"
msgid "Ungroup Models"
msgstr "Desagrupar modelos"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:313
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:330
msgctxt "@action:inmenu menubar:edit"
msgid "&Merge Models"
msgstr "Co&mbinar modelos"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:340
msgctxt "@action:inmenu"
msgid "&Multiply Model..."
msgstr "&Multiplicar modelo..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:330
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:347
msgctxt "@action:inmenu menubar:edit"
msgid "Select All Models"
msgstr "Seleccionar todos los modelos"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:340
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:357
msgctxt "@action:inmenu menubar:edit"
msgid "Clear Build Plate"
msgstr "Borrar placa de impresión"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:367
msgctxt "@action:inmenu menubar:file"
msgid "Reload All Models"
msgstr "Recargar todos los modelos"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:359
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:376
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange All Models To All Build Plates"
msgstr "Organizar todos los modelos en todas las placas de impresión"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:383
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange All Models"
msgstr "Organizar todos los modelos"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:374
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:391
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange Selection"
msgstr "Organizar selección"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:381
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:398
msgctxt "@action:inmenu menubar:edit"
msgid "Reset All Model Positions"
msgstr "Restablecer las posiciones de todos los modelos"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:388
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:405
msgctxt "@action:inmenu menubar:edit"
msgid "Reset All Model Transformations"
msgstr "Restablecer las transformaciones de todos los modelos"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:412
msgctxt "@action:inmenu menubar:file"
msgid "&Open File(s)..."
msgstr "&Abrir archivo(s)..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:403
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:420
msgctxt "@action:inmenu menubar:file"
msgid "&New Project..."
msgstr "&Nuevo proyecto..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:427
msgctxt "@action:inmenu menubar:help"
msgid "Show Configuration Folder"
msgstr "Mostrar carpeta de configuración"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:441
msgctxt "@action:menu"
msgid "&Marketplace"
msgstr "&Marketplace"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:24
msgctxt "@title:window"
msgid "Ultimaker Cura"
msgstr "Ultimaker Cura"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:181
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232
msgctxt "@label"
msgid "This package will be installed after restarting."
msgstr "Este paquete se instalará después de reiniciar."
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:357
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:413
msgctxt "@title:tab"
msgid "Settings"
msgstr "Ajustes"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:486
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:539
msgctxt "@title:window"
msgid "Closing Cura"
msgstr "Cerrando Cura"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:487
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:499
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:540
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:552
msgctxt "@label"
msgid "Are you sure you want to exit Cura?"
msgstr "¿Seguro que desea salir de Cura?"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:531
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:590
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:19
msgctxt "@title:window"
msgid "Open file(s)"
msgstr "Abrir archivo(s)"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:632
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:691
msgctxt "@window:title"
msgid "Install Package"
msgstr "Instalar paquete"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:640
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:699
msgctxt "@title:window"
msgid "Open File(s)"
msgstr "Abrir archivo(s)"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:643
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:702
msgctxt "@text:window"
msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one."
msgstr "Hemos encontrado uno o más archivos de GCode entre los archivos que ha seleccionado. Solo puede abrir los archivos GCode de uno en uno. Si desea abrir un archivo GCode, seleccione solo uno."
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:713
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:18
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:805
msgctxt "@title:window"
msgid "Add Printer"
msgstr "Agregar impresora"
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:813
+msgctxt "@title:window"
+msgid "What's New"
+msgstr "Novedades"
+
#: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16
msgctxt "@label %1 is filled in with the name of an extruder"
msgid "Print Selected Model with %1"
@@ -4653,7 +4590,9 @@ 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"
@@ -4695,34 +4634,6 @@ msgctxt "@action:button"
msgid "Create New Profile"
msgstr "Crear nuevo perfil"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
-msgctxt "@title:tab"
-msgid "Add a printer to Cura"
-msgstr "Añadir una impresora a Cura"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
-msgctxt "@title:tab"
-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 "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 "Fabricante"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
-msgctxt "@label"
-msgid "Printer Name"
-msgstr "Nombre de la impresora"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
-msgctxt "@action:button"
-msgid "Add Printer"
-msgstr "Agregar impresora"
-
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:15
msgctxt "@title:window"
msgid "About Cura"
@@ -4743,7 +4654,9 @@ 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.\nCura se enorgullece de utilizar los siguientes proyectos de código abierto:"
+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:"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:134
msgctxt "@label"
@@ -4880,27 +4793,32 @@ msgctxt "@title:window"
msgid "Save Project"
msgstr "Guardar proyecto"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:138
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:149
msgctxt "@action:label"
msgid "Build plate"
msgstr "Placa de impresión"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:170
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:183
msgctxt "@action:label"
msgid "Extruder %1"
msgstr "Extrusor %1"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:180
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:198
msgctxt "@action:label"
msgid "%1 & material"
msgstr "%1 y material"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:243
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:200
+msgctxt "@action:label"
+msgid "Material"
+msgstr "Material"
+
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:272
msgctxt "@action:label"
msgid "Don't show project summary on save again"
msgstr "No mostrar resumen de proyecto al guardar de nuevo"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:262
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:291
msgctxt "@action:button"
msgid "Save"
msgstr "Guardar"
@@ -4930,30 +4848,1069 @@ msgctxt "@action:button"
msgid "Import models"
msgstr "Importar modelos"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:210
-msgctxt "@option:check"
-msgid "See only current build plate"
-msgstr "Ver solo placa de impresión actual"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DropDownWidget.qml:93
+msgctxt "@label"
+msgid "Empty"
+msgstr "Vacío"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:226
-msgctxt "@action:button"
-msgid "Arrange to all build plates"
-msgstr "Organizar todas las placas de impresión"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:24
+msgctxt "@label"
+msgid "Add a printer"
+msgstr "Agregar una impresora"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:246
-msgctxt "@action:button"
-msgid "Arrange current build plate"
-msgstr "Organizar placa de impresión actual"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:39
+msgctxt "@label"
+msgid "Add a networked printer"
+msgstr "Agregar una impresora en red"
-#: X3GWriter/plugin.json
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:81
+msgctxt "@label"
+msgid "Add a non-networked printer"
+msgstr "Agregar una impresora fuera de red"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:70
+msgctxt "@label"
+msgid "Add printer by IP address"
+msgstr "Agregar impresora por dirección IP"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:133
+msgctxt "@text"
+msgid "Place enter your printer's IP address."
+msgstr "Introduzca la dirección IP de su impresora."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:158
+msgctxt "@button"
+msgid "Add"
+msgstr "Agregar"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:204
+msgctxt "@label"
+msgid "Could not connect to device."
+msgstr "No se ha podido conectar al dispositivo."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:208
+msgctxt "@label"
+msgid "The printer at this address has not responded yet."
+msgstr "La impresora todavía no ha respondido en esta dirección."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:240
+msgctxt "@label"
+msgid "This printer cannot be added because it's an unknown printer or it's not the host of a group."
+msgstr "No se puede agregar la impresora porque es desconocida o no aloja un grupo."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:329
+msgctxt "@button"
+msgid "Back"
+msgstr "Atrás"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:342
+msgctxt "@button"
+msgid "Connect"
+msgstr "Conectar"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/FirstStartMachineActionsContent.qml:77
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:123
+msgctxt "@button"
+msgid "Next"
+msgstr "Siguiente"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:23
+msgctxt "@label"
+msgid "User Agreement"
+msgstr "Acuerdo de usuario"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:56
+msgctxt "@button"
+msgid "Agree"
+msgstr "Estoy de acuerdo"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:70
+msgctxt "@button"
+msgid "Decline and close"
+msgstr "Rechazar y cerrar"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:24
+msgctxt "@label"
+msgid "Help us to improve Ultimaker Cura"
+msgstr "Ayúdenos a mejorar Ultimaker Cura"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:57
+msgctxt "@text"
+msgid "Ultimaker Cura collects anonymous data to improve print quality and user experience, including:"
+msgstr "Ultimaker Cura recopila datos anónimos para mejorar la calidad de impresión y la experiencia de usuario, entre otros:"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:71
+msgctxt "@text"
+msgid "Machine types"
+msgstr "Tipos de máquina"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:77
+msgctxt "@text"
+msgid "Material usage"
+msgstr "Uso de material"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:83
+msgctxt "@text"
+msgid "Number of slices"
+msgstr "Número de segmentos"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:89
+msgctxt "@text"
+msgid "Print settings"
+msgstr "Ajustes de impresión"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:102
+msgctxt "@text"
+msgid "Data collected by Ultimaker Cura will not contain any personal information."
+msgstr "Los datos recopilados por Ultimaker Cura no contendrán información personal."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:103
+msgctxt "@text"
+msgid "More information"
+msgstr "Más información"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WhatsNewContent.qml:24
+msgctxt "@label"
+msgid "What's new in Ultimaker Cura"
+msgstr "Novedades en Ultimaker Cura"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:42
+msgctxt "@label"
+msgid "There is no printer found over your network."
+msgstr "No se ha encontrado ninguna impresora en su red."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:179
+msgctxt "@label"
+msgid "Refresh"
+msgstr "Actualizar"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:190
+msgctxt "@label"
+msgid "Add printer by IP"
+msgstr "Agregar impresora por IP"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:223
+msgctxt "@label"
+msgid "Troubleshooting"
+msgstr "Solución de problemas"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:207
+msgctxt "@label"
+msgid "Printer name"
+msgstr "Nombre de la impresora"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:220
+msgctxt "@text"
+msgid "Please give your printer a name"
+msgstr "Indique un nombre para su impresora"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:36
+msgctxt "@label"
+msgid "Ultimaker Cloud"
+msgstr "Ultimaker Cloud"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:77
+msgctxt "@text"
+msgid "The next generation 3D printing workflow"
+msgstr "El flujo de trabajo de impresión 3D de próxima generación"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:94
+msgctxt "@text"
+msgid "- Send print jobs to Ultimaker printers outside your local network"
+msgstr "- Envíe trabajos de impresión a impresoras Ultimaker fuera de su red local"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:97
+msgctxt "@text"
+msgid "- Store your Ultimaker Cura settings in the cloud for use anywhere"
+msgstr "- Guarde su configuración de Ultimaker Cura en la nube para poder usarla en cualquier lugar"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:100
+msgctxt "@text"
+msgid "- Get exclusive access to print profiles from leading brands"
+msgstr "- Disfrute de acceso exclusivo a perfiles de impresión de marcas líderes"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:119
+msgctxt "@button"
+msgid "Finish"
+msgstr "Finalizar"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:128
+msgctxt "@button"
+msgid "Create an account"
+msgstr "Crear una cuenta"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:29
+msgctxt "@label"
+msgid "Welcome to Ultimaker Cura"
+msgstr "Le damos la bienvenida a Ultimaker Cura"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:47
+msgctxt "@text"
+msgid ""
+"Please follow these steps to set up\n"
+"Ultimaker Cura. This will only take a few moments."
+msgstr ""
+"Siga estos pasos para configurar\n"
+"Ultimaker Cura. Solo le llevará unos minutos."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:58
+msgctxt "@button"
+msgid "Get started"
+msgstr "Empezar"
+
+#: MachineSettingsAction/plugin.json
msgctxt "description"
-msgid "Allows saving the resulting slice as an X3G file, to support printers that read this format (Malyan, Makerbot and other Sailfish-based printers)."
-msgstr "Permite guardar el segmento resultante como un archivo X3G para dar compatibilidad a impresoras que leen este formato (Malyan, Makerbot y otras impresoras basadas en Sailfish)."
+msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)."
+msgstr "Permite cambiar los ajustes de la máquina (como el volumen de impresión, el tamaño de la tobera, etc.)."
-#: X3GWriter/plugin.json
+#: MachineSettingsAction/plugin.json
msgctxt "name"
-msgid "X3GWriter"
-msgstr "X3GWriter"
+msgid "Machine Settings action"
+msgstr "Acción Ajustes de la máquina"
+
+#: Toolbox/plugin.json
+msgctxt "description"
+msgid "Find, manage and install new Cura packages."
+msgstr "Buscar, administrar e instalar nuevos paquetes de Cura."
+
+#: Toolbox/plugin.json
+msgctxt "name"
+msgid "Toolbox"
+msgstr "Cuadro de herramientas"
+
+#: XRayView/plugin.json
+msgctxt "description"
+msgid "Provides the X-Ray view."
+msgstr "Proporciona la vista de rayos X."
+
+#: XRayView/plugin.json
+msgctxt "name"
+msgid "X-Ray View"
+msgstr "Vista de rayos X"
+
+#: X3DReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading X3D files."
+msgstr "Proporciona asistencia para leer archivos X3D."
+
+#: X3DReader/plugin.json
+msgctxt "name"
+msgid "X3D Reader"
+msgstr "Lector de X3D"
+
+#: GCodeWriter/plugin.json
+msgctxt "description"
+msgid "Writes g-code to a file."
+msgstr "Escribe GCode en un archivo."
+
+#: GCodeWriter/plugin.json
+msgctxt "name"
+msgid "G-code Writer"
+msgstr "Escritor de GCode"
+
+#: ModelChecker/plugin.json
+msgctxt "description"
+msgid "Checks models and print configuration for possible printing issues and give suggestions."
+msgstr "Comprueba las configuraciones de los modelos y la impresión en busca de posibles problemas de impresión y da consejos."
+
+#: ModelChecker/plugin.json
+msgctxt "name"
+msgid "Model Checker"
+msgstr "Comprobador de modelos"
+
+#: cura-god-mode-plugin/src/GodMode/plugin.json
+msgctxt "description"
+msgid "Dump the contents of all settings to a HTML file."
+msgstr "Vuelva el contenido de todas las configuraciones en un archivo HTML."
+
+#: cura-god-mode-plugin/src/GodMode/plugin.json
+msgctxt "name"
+msgid "God Mode"
+msgstr "God Mode"
+
+#: FirmwareUpdater/plugin.json
+msgctxt "description"
+msgid "Provides a machine actions for updating firmware."
+msgstr "Proporciona opciones a la máquina para actualizar el firmware."
+
+#: FirmwareUpdater/plugin.json
+msgctxt "name"
+msgid "Firmware Updater"
+msgstr "Actualizador de firmware"
+
+#: ProfileFlattener/plugin.json
+msgctxt "description"
+msgid "Create a flattened quality changes profile."
+msgstr "Crear un perfil de cambios de calidad aplanado."
+
+#: ProfileFlattener/plugin.json
+msgctxt "name"
+msgid "Profile Flattener"
+msgstr "Aplanador de perfil"
+
+#: AMFReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading AMF files."
+msgstr "Proporciona asistencia para leer archivos AMF."
+
+#: AMFReader/plugin.json
+msgctxt "name"
+msgid "AMF Reader"
+msgstr "Lector de AMF"
+
+#: USBPrinting/plugin.json
+msgctxt "description"
+msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware."
+msgstr "Acepta GCode y lo envía a una impresora. El complemento también puede actualizar el firmware."
+
+#: USBPrinting/plugin.json
+msgctxt "name"
+msgid "USB printing"
+msgstr "Impresión USB"
+
+#: GCodeGzWriter/plugin.json
+msgctxt "description"
+msgid "Writes g-code to a compressed archive."
+msgstr "Escribe GCode en un archivo comprimido."
+
+#: GCodeGzWriter/plugin.json
+msgctxt "name"
+msgid "Compressed G-code Writer"
+msgstr "Escritor de GCode comprimido"
+
+#: UFPWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for writing Ultimaker Format Packages."
+msgstr "Permite la escritura de paquetes de formato Ultimaker."
+
+#: UFPWriter/plugin.json
+msgctxt "name"
+msgid "UFP Writer"
+msgstr "Escritor de UFP"
+
+#: PrepareStage/plugin.json
+msgctxt "description"
+msgid "Provides a prepare stage in Cura."
+msgstr "Proporciona una fase de preparación en Cura."
+
+#: PrepareStage/plugin.json
+msgctxt "name"
+msgid "Prepare Stage"
+msgstr "Fase de preparación"
+
+#: RemovableDriveOutputDevice/plugin.json
+msgctxt "description"
+msgid "Provides removable drive hotplugging and writing support."
+msgstr "Proporciona asistencia para la conexión directa y la escritura de la unidad extraíble."
+
+#: RemovableDriveOutputDevice/plugin.json
+msgctxt "name"
+msgid "Removable Drive Output Device Plugin"
+msgstr "Complemento de dispositivo de salida de unidad extraíble"
+
+#: UM3NetworkPrinting/plugin.json
+msgctxt "description"
+msgid "Manages network connections to Ultimaker 3 printers."
+msgstr "Gestiona las conexiones de red a las impresoras Ultimaker 3."
+
+#: UM3NetworkPrinting/plugin.json
+msgctxt "name"
+msgid "UM3 Network Connection"
+msgstr "Conexión de red UM3"
+
+#: SettingsGuide/plugin.json
+msgctxt "description"
+msgid "Provides extra information and explanations about settings in Cura, with images and animations."
+msgstr "Proporciona información y explicaciones adicionales sobre los ajustes de Cura con imágenes y animaciones."
+
+#: SettingsGuide/plugin.json
+msgctxt "name"
+msgid "Settings Guide"
+msgstr "Guía de ajustes"
+
+#: MonitorStage/plugin.json
+msgctxt "description"
+msgid "Provides a monitor stage in Cura."
+msgstr "Proporciona una fase de supervisión en Cura."
+
+#: MonitorStage/plugin.json
+msgctxt "name"
+msgid "Monitor Stage"
+msgstr "Fase de supervisión"
+
+#: FirmwareUpdateChecker/plugin.json
+msgctxt "description"
+msgid "Checks for firmware updates."
+msgstr "Busca actualizaciones de firmware."
+
+#: FirmwareUpdateChecker/plugin.json
+msgctxt "name"
+msgid "Firmware Update Checker"
+msgstr "Buscador de actualizaciones de firmware"
+
+#: SimulationView/plugin.json
+msgctxt "description"
+msgid "Provides the Simulation view."
+msgstr "Abre la vista de simulación."
+
+#: SimulationView/plugin.json
+msgctxt "name"
+msgid "Simulation View"
+msgstr "Vista de simulación"
+
+#: GCodeGzReader/plugin.json
+msgctxt "description"
+msgid "Reads g-code from a compressed archive."
+msgstr "Lee GCode de un archivo comprimido."
+
+#: GCodeGzReader/plugin.json
+msgctxt "name"
+msgid "Compressed G-code Reader"
+msgstr "Lector de GCode comprimido"
+
+#: PostProcessingPlugin/plugin.json
+msgctxt "description"
+msgid "Extension that allows for user created scripts for post processing"
+msgstr "Extensión que permite el posprocesamiento de las secuencias de comandos creadas por los usuarios"
+
+#: PostProcessingPlugin/plugin.json
+msgctxt "name"
+msgid "Post Processing"
+msgstr "Posprocesamiento"
+
+#: SupportEraser/plugin.json
+msgctxt "description"
+msgid "Creates an eraser mesh to block the printing of support in certain places"
+msgstr "Crea una malla de borrado que impide la impresión de soportes en determinados lugares"
+
+#: SupportEraser/plugin.json
+msgctxt "name"
+msgid "Support Eraser"
+msgstr "Borrador de soporte"
+
+#: UFPReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading Ultimaker Format Packages."
+msgstr "Proporciona soporte para la lectura de paquetes de formato Ultimaker."
+
+#: UFPReader/plugin.json
+msgctxt "name"
+msgid "UFP Reader"
+msgstr "Lector de UFP"
+
+#: SliceInfoPlugin/plugin.json
+msgctxt "description"
+msgid "Submits anonymous slice info. Can be disabled through preferences."
+msgstr "Envía información anónima de la segmentación. Se puede desactivar en las preferencias."
+
+#: SliceInfoPlugin/plugin.json
+msgctxt "name"
+msgid "Slice info"
+msgstr "Info de la segmentación"
+
+#: XmlMaterialProfile/plugin.json
+msgctxt "description"
+msgid "Provides capabilities to read and write XML-based material profiles."
+msgstr "Permite leer y escribir perfiles de material basados en XML."
+
+#: XmlMaterialProfile/plugin.json
+msgctxt "name"
+msgid "Material Profiles"
+msgstr "Perfiles de material"
+
+#: LegacyProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing profiles from legacy Cura versions."
+msgstr "Proporciona asistencia para la importación de perfiles de versiones anteriores de Cura."
+
+#: LegacyProfileReader/plugin.json
+msgctxt "name"
+msgid "Legacy Cura Profile Reader"
+msgstr "Lector de perfiles antiguos de Cura"
+
+#: GCodeProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing profiles from g-code files."
+msgstr "Proporciona asistencia para la importación de perfiles de archivos GCode."
+
+#: GCodeProfileReader/plugin.json
+msgctxt "name"
+msgid "G-code Profile Reader"
+msgstr "Lector de perfiles GCode"
+
+#: VersionUpgrade/VersionUpgrade32to33/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.2 to Cura 3.3."
+msgstr "Actualiza la configuración de Cura 3.2 a Cura 3.3."
+
+#: VersionUpgrade/VersionUpgrade32to33/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.2 to 3.3"
+msgstr "Actualización de la versión 3.2 a la 3.3"
+
+#: VersionUpgrade/VersionUpgrade33to34/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.3 to Cura 3.4."
+msgstr "Actualiza la configuración de Cura 3.3 a Cura 3.4."
+
+#: VersionUpgrade/VersionUpgrade33to34/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.3 to 3.4"
+msgstr "Actualización de la versión 3.3 a la 3.4"
+
+#: VersionUpgrade/VersionUpgrade25to26/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
+msgstr "Actualiza la configuración de Cura 2.5 a Cura 2.6."
+
+#: VersionUpgrade/VersionUpgrade25to26/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.5 to 2.6"
+msgstr "Actualización de la versión 2.5 a la 2.6"
+
+#: VersionUpgrade/VersionUpgrade27to30/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
+msgstr "Actualiza la configuración de Cura 2.7 a Cura 3.0."
+
+#: VersionUpgrade/VersionUpgrade27to30/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.7 to 3.0"
+msgstr "Actualización de la versión 2.7 a la 3.0"
+
+#: VersionUpgrade/VersionUpgrade35to40/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.5 to Cura 4.0."
+msgstr "Actualiza la configuración de Cura 3.5 a Cura 4.0."
+
+#: VersionUpgrade/VersionUpgrade35to40/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.5 to 4.0"
+msgstr "Actualización de la versión 3.5 a la 4.0"
+
+#: VersionUpgrade/VersionUpgrade34to35/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.4 to Cura 3.5."
+msgstr "Actualiza las configuraciones de Cura 3.4 a Cura 3.5."
+
+#: VersionUpgrade/VersionUpgrade34to35/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.4 to 3.5"
+msgstr "Actualización de la versión 3.4 a la 3.5"
+
+#: VersionUpgrade/VersionUpgrade40to41/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 4.0 to Cura 4.1."
+msgstr "Actualiza la configuración de Cura 4.0 a Cura 4.1."
+
+#: VersionUpgrade/VersionUpgrade40to41/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 4.0 to 4.1"
+msgstr "Actualización de la versión 4.0 a la 4.1"
+
+#: VersionUpgrade/VersionUpgrade30to31/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.0 to Cura 3.1."
+msgstr "Actualiza la configuración de Cura 3.0 a Cura 3.1."
+
+#: VersionUpgrade/VersionUpgrade30to31/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.0 to 3.1"
+msgstr "Actualización de la versión 3.0 a la 3.1"
+
+#: VersionUpgrade/VersionUpgrade41to42/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 4.1 to Cura 4.2."
+msgstr "Actualiza la configuración de Cura 4.1 a Cura 4.2."
+
+#: VersionUpgrade/VersionUpgrade41to42/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 4.1 to 4.2"
+msgstr "Actualización de la versión 4.1 a la 4.2"
+
+#: VersionUpgrade/VersionUpgrade26to27/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
+msgstr "Actualiza la configuración de Cura 2.6 a Cura 2.7."
+
+#: VersionUpgrade/VersionUpgrade26to27/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.6 to 2.7"
+msgstr "Actualización de la versión 2.6 a la 2.7"
+
+#: VersionUpgrade/VersionUpgrade21to22/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
+msgstr "Actualiza las configuraciones de Cura 2.1 a Cura 2.2."
+
+#: VersionUpgrade/VersionUpgrade21to22/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.1 to 2.2"
+msgstr "Actualización de la versión 2.1 a la 2.2"
+
+#: VersionUpgrade/VersionUpgrade22to24/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
+msgstr "Actualiza la configuración de Cura 2.2 a Cura 2.4."
+
+#: VersionUpgrade/VersionUpgrade22to24/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.2 to 2.4"
+msgstr "Actualización de la versión 2.2 a la 2.4"
+
+#: ImageReader/plugin.json
+msgctxt "description"
+msgid "Enables ability to generate printable geometry from 2D image files."
+msgstr "Habilita la capacidad de generar geometría imprimible a partir de archivos de imagen 2D."
+
+#: ImageReader/plugin.json
+msgctxt "name"
+msgid "Image Reader"
+msgstr "Lector de imágenes"
+
+#: CuraEngineBackend/plugin.json
+msgctxt "description"
+msgid "Provides the link to the CuraEngine slicing backend."
+msgstr "Proporciona el vínculo para el backend de segmentación de CuraEngine."
+
+#: CuraEngineBackend/plugin.json
+msgctxt "name"
+msgid "CuraEngine Backend"
+msgstr "Backend de CuraEngine"
+
+#: PerObjectSettingsTool/plugin.json
+msgctxt "description"
+msgid "Provides the Per Model Settings."
+msgstr "Proporciona los ajustes por modelo."
+
+#: PerObjectSettingsTool/plugin.json
+msgctxt "name"
+msgid "Per Model Settings Tool"
+msgstr "Herramienta de ajustes por modelo"
+
+#: 3MFReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading 3MF files."
+msgstr "Proporciona asistencia para leer archivos 3MF."
+
+#: 3MFReader/plugin.json
+msgctxt "name"
+msgid "3MF Reader"
+msgstr "Lector de 3MF"
+
+#: SolidView/plugin.json
+msgctxt "description"
+msgid "Provides a normal solid mesh view."
+msgstr "Proporciona una vista de malla sólida normal."
+
+#: SolidView/plugin.json
+msgctxt "name"
+msgid "Solid View"
+msgstr "Vista de sólidos"
+
+#: GCodeReader/plugin.json
+msgctxt "description"
+msgid "Allows loading and displaying G-code files."
+msgstr "Permite cargar y visualizar archivos GCode."
+
+#: GCodeReader/plugin.json
+msgctxt "name"
+msgid "G-code Reader"
+msgstr "Lector de GCode"
+
+#: CuraDrive/plugin.json
+msgctxt "description"
+msgid "Backup and restore your configuration."
+msgstr "Realice una copia de seguridad de su configuración y restáurela."
+
+#: CuraDrive/plugin.json
+msgctxt "name"
+msgid "Cura Backups"
+msgstr "Copias de seguridad de Cura"
+
+#: CuraProfileWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for exporting Cura profiles."
+msgstr "Proporciona asistencia para exportar perfiles de Cura."
+
+#: CuraProfileWriter/plugin.json
+msgctxt "name"
+msgid "Cura Profile Writer"
+msgstr "Escritor de perfiles de Cura"
+
+#: CuraPrintProfileCreator/plugin.json
+msgctxt "description"
+msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI."
+msgstr "Permite a los fabricantes de material crear nuevos perfiles de material y calidad mediante una IU integrada."
+
+#: CuraPrintProfileCreator/plugin.json
+msgctxt "name"
+msgid "Print Profile Assistant"
+msgstr "Imprimir asistente del perfil"
+
+#: 3MFWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for writing 3MF files."
+msgstr "Proporciona asistencia para escribir archivos 3MF."
+
+#: 3MFWriter/plugin.json
+msgctxt "name"
+msgid "3MF Writer"
+msgstr "Escritor de 3MF"
+
+#: PreviewStage/plugin.json
+msgctxt "description"
+msgid "Provides a preview stage in Cura."
+msgstr "Proporciona una fase de vista previa en Cura."
+
+#: PreviewStage/plugin.json
+msgctxt "name"
+msgid "Preview Stage"
+msgstr "Fase de vista previa"
+
+#: UltimakerMachineActions/plugin.json
+msgctxt "description"
+msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)."
+msgstr "Proporciona las acciones de la máquina de las máquinas Ultimaker (como un asistente para la nivelación de la plataforma, la selección de actualizaciones, etc.)."
+
+#: UltimakerMachineActions/plugin.json
+msgctxt "name"
+msgid "Ultimaker machine actions"
+msgstr "Acciones de la máquina Ultimaker"
+
+#: CuraProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing Cura profiles."
+msgstr "Proporciona asistencia para la importación de perfiles de Cura."
+
+#: CuraProfileReader/plugin.json
+msgctxt "name"
+msgid "Cura Profile Reader"
+msgstr "Lector de perfiles de Cura"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Cura Settings Guide"
+#~ msgstr "Guía de ajustes de Cura"
+
+#~ msgctxt "@info:generic"
+#~ msgid "Settings have been changed to match the current availability of extruders: [%s]"
+#~ msgstr "La configuración se ha cambiado para que coincida con los extrusores disponibles en este momento: [%s]."
+
+#~ msgctxt "@title:groupbox"
+#~ msgid "User description"
+#~ msgstr "Descripción del usuario"
+
+#~ msgctxt "@info"
+#~ msgid "These options are not available because you are monitoring a cloud printer."
+#~ msgstr "Estas opciones no se encuentran disponibles porque está supervisando una impresora en la nube."
+
+#~ msgctxt "@label link to connect manager"
+#~ msgid "Go to Cura Connect"
+#~ msgstr "Ir a Cura Connect"
+
+#~ msgctxt "@info"
+#~ msgid "All jobs are printed."
+#~ msgstr "Se han imprimido todos los trabajos."
+
+#~ msgctxt "@label link to connect manager"
+#~ msgid "View print history"
+#~ msgstr "Ver historial de impresión"
+
+#~ msgctxt "@label"
+#~ 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 ésta 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:"
+
+#~ msgctxt "@info"
+#~ 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 ""
+#~ "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."
+
+#~ msgctxt "@option:check"
+#~ msgid "See only current build plate"
+#~ msgstr "Ver solo placa de impresión actual"
+
+#~ msgctxt "@action:button"
+#~ msgid "Arrange to all build plates"
+#~ msgstr "Organizar todas las placas de impresión"
+
+#~ msgctxt "@action:button"
+#~ msgid "Arrange current build plate"
+#~ msgstr "Organizar placa de impresión actual"
+
+#~ msgctxt "description"
+#~ msgid "Allows saving the resulting slice as an X3G file, to support printers that read this format (Malyan, Makerbot and other Sailfish-based printers)."
+#~ msgstr "Permite guardar el segmento resultante como un archivo X3G para dar compatibilidad a impresoras que leen este formato (Malyan, Makerbot y otras impresoras basadas en Sailfish)."
+
+#~ msgctxt "name"
+#~ msgid "X3GWriter"
+#~ msgstr "X3GWriter"
+
+#~ msgctxt "description"
+#~ msgid "Reads SVG files as toolpaths, for debugging printer movements."
+#~ msgstr "Lee archivos SVG como trayectorias de herramienta para solucionar errores en los movimientos de la impresora."
+
+#~ msgctxt "name"
+#~ msgid "SVG Toolpath Reader"
+#~ msgstr "Lector de trayectoria de herramienta de SVG"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Changelog"
+#~ msgstr "Registro de cambios"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Show Changelog"
+#~ msgstr "Mostrar registro de cambios"
+
+#~ msgctxt "@info:status"
+#~ msgid "Sending data to remote cluster"
+#~ msgstr "Enviando datos al clúster remoto"
+
+#~ msgctxt "@info:status"
+#~ msgid "Connect to Ultimaker Cloud"
+#~ msgstr "Conectar a Ultimaker Cloud"
+
+#~ msgctxt "@info"
+#~ msgid "Cura collects anonymized usage statistics."
+#~ msgstr "Cura recopila estadísticas de uso de forma anónima."
+
+#~ msgctxt "@info:title"
+#~ msgid "Collecting Data"
+#~ msgstr "Recopilando datos"
+
+#~ msgctxt "@action:button"
+#~ msgid "More info"
+#~ msgstr "Más información"
+
+#~ msgctxt "@action:tooltip"
+#~ msgid "See more information on what data Cura sends."
+#~ msgstr "Obtenga más información sobre qué datos envía Cura."
+
+#~ msgctxt "@action:button"
+#~ msgid "Allow"
+#~ msgstr "Permitir"
+
+#~ msgctxt "@action:tooltip"
+#~ msgid "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."
+#~ msgstr "Permitir a Cura enviar estadísticas de uso de forma anónima para ayudar a priorizar mejoras futuras para Cura. Se envían algunas de sus preferencias y ajustes, la versión de Cura y un resumen de los modelos que está fragmentando."
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Evaluation"
+#~ msgstr "Evaluación"
+
+#~ msgctxt "@info:title"
+#~ msgid "Network enabled printers"
+#~ msgstr "Impresoras de red habilitadas"
+
+#~ msgctxt "@info:title"
+#~ msgid "Local printers"
+#~ msgstr "Impresoras locales"
+
+#~ msgctxt "@info:backup_failed"
+#~ msgid "Tried to restore a Cura backup that does not match your current version."
+#~ msgstr "Se ha intentado restaurar una copia de seguridad de Cura que no coincide con la versión actual."
+
+#~ msgctxt "@title"
+#~ msgid "Machine Settings"
+#~ msgstr "Ajustes de la máquina"
+
+#~ msgctxt "@label"
+#~ msgid "Printer Settings"
+#~ msgstr "Ajustes de la impresora"
+
+#~ msgctxt "@option:check"
+#~ msgid "Origin at center"
+#~ msgstr "Origen en el centro"
+
+#~ msgctxt "@option:check"
+#~ msgid "Heated bed"
+#~ msgstr "Plataforma caliente"
+
+#~ msgctxt "@label"
+#~ msgid "Printhead Settings"
+#~ msgstr "Ajustes del cabezal de impresión"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Distancia desde la parte izquierda del cabezal de impresión hasta el centro de la tobera. Se usa para evitar que colisionen la impresión anterior con el cabezal de impresión al imprimir «de uno en uno»."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Distancia desde la parte frontal del cabezal de impresión hasta el centro de la tobera. Se usa para evitar que colisionen la impresión anterior con el cabezal de impresión al imprimir «de uno en uno»."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Distancia desde la parte derecha del cabezal de impresión hasta el centro de la tobera. Se usa para evitar que colisionen la impresión anterior con el cabezal de impresión al imprimir «de uno en uno»."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Distancia desde la parte trasera del cabezal de impresión hasta el centro de la tobera. Se usa para evitar que colisionen la impresión anterior con el cabezal de impresión al imprimir «de uno en uno»."
+
+#~ msgctxt "@label"
+#~ msgid "Gantry height"
+#~ msgstr "Altura del caballete"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Diferencia de altura entre la punta de la tobera y el sistema del puente (ejes X e Y). Se usa para evitar que colisionen la impresión anterior con el caballete al imprimir «de uno en uno»."
+
+#~ msgctxt "@label"
+#~ msgid "Start G-code"
+#~ msgstr "Iniciar GCode"
+
+#~ msgctxt "@tooltip"
+#~ msgid "G-code commands to be executed at the very start."
+#~ msgstr "Los comandos de GCode que se ejecutarán justo al inicio."
+
+#~ msgctxt "@label"
+#~ msgid "End G-code"
+#~ msgstr "Finalizar GCode"
+
+#~ msgctxt "@tooltip"
+#~ msgid "G-code commands to be executed at the very end."
+#~ msgstr "Los comandos de GCode que se ejecutarán justo al final."
+
+#~ msgctxt "@label"
+#~ msgid "Nozzle Settings"
+#~ msgstr "Ajustes de la tobera"
+
+#~ msgctxt "@tooltip"
+#~ msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile."
+#~ msgstr "El diámetro nominal del filamento compatible con la impresora. El diámetro exacto se sobrescribirá según el material o el perfil."
+
+#~ msgctxt "@label"
+#~ msgid "Extruder Start G-code"
+#~ msgstr "GCode inicial del extrusor"
+
+#~ msgctxt "@label"
+#~ msgid "Extruder End G-code"
+#~ msgstr "GCode final del extrusor"
+
+#~ msgctxt "@label"
+#~ msgid "Changelog"
+#~ msgstr "Registro de cambios"
+
+#~ msgctxt "@title:window"
+#~ msgid "User Agreement"
+#~ msgstr "Acuerdo de usuario"
+
+#~ msgctxt "@alabel"
+#~ msgid "Enter the IP address or hostname of your printer on the network."
+#~ msgstr "Introduzca la dirección IP o el nombre de host de la impresora en red."
+
+#~ msgctxt "@info"
+#~ msgid "Please select a network connected printer to monitor."
+#~ msgstr "Seleccione la impresora conectada a la red que desee supervisar."
+
+#~ msgctxt "@info"
+#~ msgid "Please connect your Ultimaker printer to your local network."
+#~ msgstr "Conecte su impresora Ultimaker a su red local."
+
+#~ msgctxt "@text:window"
+#~ msgid "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."
+#~ msgstr "Cura envía datos anónimos a Ultimaker para mejorar la calidad de impresión y la experiencia de usuario. A continuación, hay un ejemplo de todos los datos que se han enviado."
+
+#~ msgctxt "@text:window"
+#~ msgid "I don't want to send this data"
+#~ msgstr "No deseo enviar estos datos"
+
+#~ msgctxt "@text:window"
+#~ msgid "Allow sending this data to Ultimaker and help us improve Cura"
+#~ msgstr "Permita que estos datos se envíen a Ultimaker y ayúdenos a mejorar Cura"
+
+#~ msgctxt "@label"
+#~ msgid "No print selected"
+#~ msgstr "No ha seleccionado ninguna impresora"
+
+#~ msgctxt "@info:tooltip"
+#~ msgid "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."
+#~ msgstr "De manera predeterminada, los píxeles blancos representan los puntos altos de la malla y los píxeles negros representan los puntos bajos de la malla. Cambie esta opción para invertir el comportamiento de tal manera que los píxeles negros representen los puntos altos de la malla y los píxeles blancos representen los puntos bajos de la malla."
+
+#~ msgctxt "@title"
+#~ msgid "Select Printer Upgrades"
+#~ msgstr "Seleccionar actualizaciones de impresora"
+
+#~ msgctxt "@label"
+#~ msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air."
+#~ msgstr "Seleccione qué extrusor se utilizará como soporte. Esta opción formará estructuras de soporte por debajo del modelo para evitar que éste se combe o la impresión se haga en el aire."
+
+#~ 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 "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."
+
+#~ msgctxt "@label shown when we load a Gcode file"
+#~ msgid "Print setup disabled. G code file can not be modified."
+#~ msgstr "Configuración de impresión deshabilitada. No se puede modificar el GCode."
+
+#~ msgctxt "@label"
+#~ msgid "See the material compatibility chart"
+#~ msgstr "Ver el gráfico de compatibilidad de materiales"
+
+#~ msgctxt "@label"
+#~ msgid "View types"
+#~ msgstr "Ver tipos"
+
+#~ msgctxt "@label"
+#~ msgid "Hi "
+#~ msgstr "Hola "
+
+#~ msgctxt "@text"
+#~ 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 ""
+#~ "- 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"
+
+#~ msgctxt "@label:PrintjobStatus"
+#~ msgid "Unable to Slice"
+#~ msgstr "No se puede segmentar"
+
+#~ msgctxt "@label"
+#~ msgid "Time specification"
+#~ msgstr "Especificación de tiempos"
+
+#~ msgctxt "@label"
+#~ msgid "Material specification"
+#~ msgstr "Especificación de materiales"
+
+#~ msgctxt "@title:tab"
+#~ msgid "Add a printer to Cura"
+#~ msgstr "Añadir una impresora a Cura"
+
+#~ msgctxt "@title:tab"
+#~ 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 ""
+#~ "Seleccione la impresora que desee utilizar de la lista que se muestra a continuación.\n"
+#~ "\n"
+#~ "Si 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."
+
+#~ msgctxt "@label"
+#~ msgid "Manufacturer"
+#~ msgstr "Fabricante"
+
+#~ msgctxt "@label"
+#~ msgid "Printer Name"
+#~ msgstr "Nombre de la impresora"
+
+#~ msgctxt "@action:button"
+#~ msgid "Add Printer"
+#~ msgstr "Agregar impresora"
#~ msgid "Modify G-Code"
#~ msgstr "Modificar GCode"
@@ -5151,7 +6108,6 @@ 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"
@@ -5295,62 +6251,6 @@ msgstr "X3GWriter"
#~ msgid "Click to check the material compatibility on Ultimaker.com."
#~ msgstr "Haga clic para comprobar la compatibilidad de los materiales en Utimaker.com."
-#~ msgctxt "description"
-#~ msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)."
-#~ msgstr "Permite cambiar los ajustes de la máquina (como el volumen de impresión, el tamaño de la tobera, etc.)."
-
-#~ msgctxt "name"
-#~ msgid "Machine Settings action"
-#~ msgstr "Acción Ajustes de la máquina"
-
-#~ msgctxt "description"
-#~ msgid "Find, manage and install new Cura packages."
-#~ msgstr "Buscar, administrar e instalar nuevos paquetes de Cura."
-
-#~ msgctxt "name"
-#~ msgid "Toolbox"
-#~ msgstr "Cuadro de herramientas"
-
-#~ msgctxt "description"
-#~ msgid "Provides the X-Ray view."
-#~ msgstr "Proporciona la vista de rayos X."
-
-#~ msgctxt "name"
-#~ msgid "X-Ray View"
-#~ msgstr "Vista de rayos X"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for reading X3D files."
-#~ msgstr "Proporciona asistencia para leer archivos X3D."
-
-#~ msgctxt "name"
-#~ msgid "X3D Reader"
-#~ msgstr "Lector de X3D"
-
-#~ msgctxt "description"
-#~ msgid "Writes g-code to a file."
-#~ msgstr "Escribe GCode en un archivo."
-
-#~ msgctxt "name"
-#~ msgid "G-code Writer"
-#~ msgstr "Escritor de GCode"
-
-#~ msgctxt "description"
-#~ msgid "Checks models and print configuration for possible printing issues and give suggestions."
-#~ msgstr "Comprueba las configuraciones de los modelos y la impresión en busca de posibles problemas de impresión y da consejos."
-
-#~ msgctxt "name"
-#~ msgid "Model Checker"
-#~ msgstr "Comprobador de modelos"
-
-#~ msgctxt "description"
-#~ msgid "Dump the contents of all settings to a HTML file."
-#~ msgstr "Vuelva el contenido de todas las configuraciones en un archivo HTML."
-
-#~ msgctxt "name"
-#~ msgid "God Mode"
-#~ msgstr "God Mode"
-
#~ msgctxt "description"
#~ msgid "Shows changes since latest checked version."
#~ msgstr "Muestra los cambios desde la última versión comprobada."
@@ -5359,14 +6259,6 @@ msgstr "X3GWriter"
#~ msgid "Changelog"
#~ msgstr "Registro de cambios"
-#~ msgctxt "description"
-#~ msgid "Provides a machine actions for updating firmware."
-#~ msgstr "Proporciona opciones a la máquina para actualizar el firmware."
-
-#~ msgctxt "name"
-#~ msgid "Firmware Updater"
-#~ msgstr "Actualizador de firmware"
-
#~ msgctxt "description"
#~ msgid "Create a flattend quality changes profile."
#~ msgstr "Crear un perfil de cambios de calidad aplanado."
@@ -5375,14 +6267,6 @@ msgstr "X3GWriter"
#~ msgid "Profile flatener"
#~ msgstr "Aplanador de perfil"
-#~ msgctxt "description"
-#~ msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware."
-#~ msgstr "Acepta GCode y lo envía a una impresora. El complemento también puede actualizar el firmware."
-
-#~ msgctxt "name"
-#~ msgid "USB printing"
-#~ msgstr "Impresión USB"
-
#~ msgctxt "description"
#~ msgid "Ask the user once if he/she agrees with our license."
#~ msgstr "Preguntar al usuario una vez si acepta la licencia."
@@ -5391,278 +6275,6 @@ msgstr "X3GWriter"
#~ msgid "UserAgreement"
#~ msgstr "UserAgreement"
-#~ msgctxt "description"
-#~ msgid "Writes g-code to a compressed archive."
-#~ msgstr "Escribe GCode en un archivo comprimido."
-
-#~ msgctxt "name"
-#~ msgid "Compressed G-code Writer"
-#~ msgstr "Escritor de GCode comprimido"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for writing Ultimaker Format Packages."
-#~ msgstr "Permite la escritura de paquetes de formato Ultimaker."
-
-#~ msgctxt "name"
-#~ msgid "UFP Writer"
-#~ msgstr "Escritor de UFP"
-
-#~ msgctxt "description"
-#~ msgid "Provides a prepare stage in Cura."
-#~ msgstr "Proporciona una fase de preparación en Cura."
-
-#~ msgctxt "name"
-#~ msgid "Prepare Stage"
-#~ msgstr "Fase de preparación"
-
-#~ msgctxt "description"
-#~ msgid "Provides removable drive hotplugging and writing support."
-#~ msgstr "Proporciona asistencia para la conexión directa y la escritura de la unidad extraíble."
-
-#~ msgctxt "name"
-#~ msgid "Removable Drive Output Device Plugin"
-#~ msgstr "Complemento de dispositivo de salida de unidad extraíble"
-
-#~ msgctxt "description"
-#~ msgid "Manages network connections to Ultimaker 3 printers."
-#~ msgstr "Gestiona las conexiones de red a las impresoras Ultimaker 3."
-
-#~ msgctxt "name"
-#~ msgid "UM3 Network Connection"
-#~ msgstr "Conexión de red UM3"
-
-#~ msgctxt "description"
-#~ msgid "Provides a monitor stage in Cura."
-#~ msgstr "Proporciona una fase de supervisión en Cura."
-
-#~ msgctxt "name"
-#~ msgid "Monitor Stage"
-#~ msgstr "Fase de supervisión"
-
-#~ msgctxt "description"
-#~ msgid "Checks for firmware updates."
-#~ msgstr "Busca actualizaciones de firmware."
-
-#~ msgctxt "name"
-#~ msgid "Firmware Update Checker"
-#~ msgstr "Buscador de actualizaciones de firmware"
-
-#~ msgctxt "description"
-#~ msgid "Provides the Simulation view."
-#~ msgstr "Abre la vista de simulación."
-
-#~ msgctxt "name"
-#~ msgid "Simulation View"
-#~ msgstr "Vista de simulación"
-
-#~ msgctxt "description"
-#~ msgid "Reads g-code from a compressed archive."
-#~ msgstr "Lee GCode de un archivo comprimido."
-
-#~ msgctxt "name"
-#~ msgid "Compressed G-code Reader"
-#~ msgstr "Lector de GCode comprimido"
-
-#~ msgctxt "description"
-#~ msgid "Extension that allows for user created scripts for post processing"
-#~ msgstr "Extensión que permite el posprocesamiento de las secuencias de comandos creadas por los usuarios"
-
-#~ msgctxt "name"
-#~ msgid "Post Processing"
-#~ msgstr "Posprocesamiento"
-
-#~ msgctxt "description"
-#~ msgid "Creates an eraser mesh to block the printing of support in certain places"
-#~ msgstr "Crea una malla de borrado que impide la impresión de soportes en determinados lugares"
-
-#~ msgctxt "name"
-#~ msgid "Support Eraser"
-#~ msgstr "Borrador de soporte"
-
-#~ msgctxt "description"
-#~ msgid "Submits anonymous slice info. Can be disabled through preferences."
-#~ msgstr "Envía información anónima de la segmentación. Se puede desactivar en las preferencias."
-
-#~ msgctxt "name"
-#~ msgid "Slice info"
-#~ msgstr "Info de la segmentación"
-
-#~ msgctxt "description"
-#~ msgid "Provides capabilities to read and write XML-based material profiles."
-#~ msgstr "Permite leer y escribir perfiles de material basados en XML."
-
-#~ msgctxt "name"
-#~ msgid "Material Profiles"
-#~ msgstr "Perfiles de material"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing profiles from legacy Cura versions."
-#~ msgstr "Proporciona asistencia para la importación de perfiles de versiones anteriores de Cura."
-
-#~ msgctxt "name"
-#~ msgid "Legacy Cura Profile Reader"
-#~ msgstr "Lector de perfiles antiguos de Cura"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing profiles from g-code files."
-#~ msgstr "Proporciona asistencia para la importación de perfiles de archivos GCode."
-
-#~ msgctxt "name"
-#~ msgid "G-code Profile Reader"
-#~ msgstr "Lector de perfiles GCode"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.2 to Cura 3.3."
-#~ msgstr "Actualiza la configuración de Cura 3.2 a Cura 3.3."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.2 to 3.3"
-#~ msgstr "Actualización de la versión 3.2 a la 3.3"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.3 to Cura 3.4."
-#~ msgstr "Actualiza la configuración de Cura 3.3 a Cura 3.4."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.3 to 3.4"
-#~ msgstr "Actualización de la versión 3.3 a la 3.4"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
-#~ msgstr "Actualiza la configuración de Cura 2.5 a Cura 2.6."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.5 to 2.6"
-#~ msgstr "Actualización de la versión 2.5 a la 2.6"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
-#~ msgstr "Actualiza la configuración de Cura 2.7 a Cura 3.0."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.7 to 3.0"
-#~ msgstr "Actualización de la versión 2.7 a la 3.0"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.4 to Cura 3.5."
-#~ msgstr "Actualiza las configuraciones de Cura 3.4 a Cura 3.5."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.4 to 3.5"
-#~ msgstr "Actualización de la versión 3.4 a la 3.5"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.0 to Cura 3.1."
-#~ msgstr "Actualiza la configuración de Cura 3.0 a Cura 3.1."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.0 to 3.1"
-#~ msgstr "Actualización de la versión 3.0 a la 3.1"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
-#~ msgstr "Actualiza la configuración de Cura 2.6 a Cura 2.7."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.6 to 2.7"
-#~ msgstr "Actualización de la versión 2.6 a la 2.7"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
-#~ msgstr "Actualiza las configuraciones de Cura 2.1 a Cura 2.2."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.1 to 2.2"
-#~ msgstr "Actualización de la versión 2.1 a la 2.2"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
-#~ msgstr "Actualiza la configuración de Cura 2.2 a Cura 2.4."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.2 to 2.4"
-#~ msgstr "Actualización de la versión 2.2 a la 2.4"
-
-#~ msgctxt "description"
-#~ msgid "Enables ability to generate printable geometry from 2D image files."
-#~ msgstr "Habilita la capacidad de generar geometría imprimible a partir de archivos de imagen 2D."
-
-#~ msgctxt "name"
-#~ msgid "Image Reader"
-#~ msgstr "Lector de imágenes"
-
-#~ msgctxt "description"
-#~ msgid "Provides the link to the CuraEngine slicing backend."
-#~ msgstr "Proporciona el vínculo para el backend de segmentación de CuraEngine."
-
-#~ msgctxt "name"
-#~ msgid "CuraEngine Backend"
-#~ msgstr "Backend de CuraEngine"
-
-#~ msgctxt "description"
-#~ msgid "Provides the Per Model Settings."
-#~ msgstr "Proporciona los ajustes por modelo."
-
-#~ msgctxt "name"
-#~ msgid "Per Model Settings Tool"
-#~ msgstr "Herramienta de ajustes por modelo"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for reading 3MF files."
-#~ msgstr "Proporciona asistencia para leer archivos 3MF."
-
-#~ msgctxt "name"
-#~ msgid "3MF Reader"
-#~ msgstr "Lector de 3MF"
-
-#~ msgctxt "description"
-#~ msgid "Provides a normal solid mesh view."
-#~ msgstr "Proporciona una vista de malla sólida normal."
-
-#~ msgctxt "name"
-#~ msgid "Solid View"
-#~ msgstr "Vista de sólidos"
-
-#~ msgctxt "description"
-#~ msgid "Allows loading and displaying G-code files."
-#~ msgstr "Permite cargar y visualizar archivos GCode."
-
-#~ msgctxt "name"
-#~ msgid "G-code Reader"
-#~ msgstr "Lector de GCode"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for exporting Cura profiles."
-#~ msgstr "Proporciona asistencia para exportar perfiles de Cura."
-
-#~ msgctxt "name"
-#~ msgid "Cura Profile Writer"
-#~ msgstr "Escritor de perfiles de Cura"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for writing 3MF files."
-#~ msgstr "Proporciona asistencia para escribir archivos 3MF."
-
-#~ msgctxt "name"
-#~ msgid "3MF Writer"
-#~ msgstr "Escritor de 3MF"
-
-#~ msgctxt "description"
-#~ msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)."
-#~ msgstr "Proporciona las acciones de la máquina de las máquinas Ultimaker (como un asistente para la nivelación de la plataforma, la selección de actualizaciones, etc.)."
-
-#~ msgctxt "name"
-#~ msgid "Ultimaker machine actions"
-#~ msgstr "Acciones de la máquina Ultimaker"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing Cura profiles."
-#~ msgstr "Proporciona asistencia para la importación de perfiles de Cura."
-
-#~ msgctxt "name"
-#~ msgid "Cura Profile Reader"
-#~ msgstr "Lector de perfiles de Cura"
-
#~ msgctxt "@warning:status"
#~ msgid "Please generate G-code before saving."
#~ msgstr "Genere un G-code antes de guardar."
@@ -5703,14 +6315,6 @@ msgstr "X3GWriter"
#~ msgid "Upgrade Firmware"
#~ msgstr "Actualización de firmware"
-#~ msgctxt "description"
-#~ msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI."
-#~ msgstr "Permite a los fabricantes de material crear nuevos perfiles de material y calidad mediante una IU integrada."
-
-#~ msgctxt "name"
-#~ msgid "Print Profile Assistant"
-#~ msgstr "Imprimir asistente del perfil"
-
#~ msgctxt "@action:button"
#~ msgid "Print with Doodle3D WiFi-Box"
#~ msgstr "Imprimir con un enrutador Doodle3D"
@@ -5756,7 +6360,6 @@ msgstr "X3GWriter"
#~ "Could not export using \"{}\" quality!\n"
#~ "Felt back to \"{}\"."
#~ msgstr ""
-
#~ "No ha podido exportarse con la calidad \"{}\"\n"
#~ "Retroceder a \"{}\"."
@@ -5933,7 +6536,6 @@ 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"
@@ -5950,7 +6552,6 @@ 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."
@@ -5961,7 +6562,6 @@ 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."
@@ -5986,7 +6586,6 @@ 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"
@@ -6001,7 +6600,6 @@ 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"
@@ -6106,7 +6704,6 @@ msgstr "X3GWriter"
#~ "Open the directory\n"
#~ "with macro and icon"
#~ msgstr ""
-
#~ "Abra el directorio\n"
#~ "con la macro y el icono"
@@ -6136,7 +6733,7 @@ msgstr "X3GWriter"
#~ msgctxt "@title:window"
#~ msgid "SolidWorks plugin: Configuration"
-#~ msgstr "Complementos de SolidWorks: configuración"
+#~ msgstr "Complemento de SolidWorks: configuración"
#~ msgctxt "@title:tab"
#~ msgid "Conversion settings"
@@ -6228,7 +6825,7 @@ msgstr "X3GWriter"
#~ msgctxt "description"
#~ msgid "Helps you to install an 'export to Cura' button in Siemens NX."
-#~ msgstr "Ayuda a instalar el botón para exportar a Cura en in Siemens NX."
+#~ msgstr "Ayuda a instalar el botón para exportar a Cura en Siemens NX."
#~ msgctxt "name"
#~ msgid "Siemens NX Integration"
@@ -6405,7 +7002,6 @@ 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."
@@ -6416,7 +7012,6 @@ 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."
@@ -6451,7 +7046,6 @@ 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"
#~ " "
@@ -6618,7 +7212,6 @@ msgstr "X3GWriter"
#~ " Please use the \"Send report\" button to post a bug report automatically to our servers
\n"
#~ " "
#~ msgstr ""
-
#~ "Se ha producido una excepción fatal. Envíenos este informe de errores 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"
#~ " "
@@ -6765,7 +7358,6 @@ msgstr "X3GWriter"
#~ " Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues
\n"
#~ " "
#~ msgstr ""
-
#~ "Se ha producido una excepción fatal de la que no podemos recuperarnos.
\n"
#~ " Use la siguiente información para enviar un informe de error a http://github.com/Ultimaker/Cura/issues
\n"
#~ " "
@@ -6808,7 +7400,6 @@ msgstr "X3GWriter"
#~ "You need to accept this license to install this plugin.\n"
#~ "Do you agree with the terms below?"
#~ msgstr ""
-
#~ " El complemento incluye una licencia.\n"
#~ "Debe aceptar dicha licencia para instalar el complemento.\n"
#~ "¿Acepta las siguientes condiciones?"
@@ -7336,7 +7927,6 @@ msgstr "X3GWriter"
#~ msgid "Print Selected Model with %1"
#~ msgid_plural "Print Selected Models With %1"
#~ msgstr[0] "Imprimir modelo seleccionado con %1"
-
#~ msgstr[1] "Imprimir modelos seleccionados con %1"
#~ msgctxt "@info:status"
@@ -7366,7 +7956,6 @@ msgstr "X3GWriter"
#~ " Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues
\n"
#~ " "
#~ msgstr ""
-
#~ "Se ha producido una excepción fatal de la que no podemos recuperarnos.
\n"
#~ " Esperamos que la imagen de este gatito le ayude a recuperarse del shock.
\n"
#~ " Use la siguiente información para enviar un informe de error a http://github.com/Ultimaker/Cura/issues
\n"
diff --git a/resources/i18n/es_ES/fdmextruder.def.json.po b/resources/i18n/es_ES/fdmextruder.def.json.po
index 9333665e05..2183670518 100644
--- a/resources/i18n/es_ES/fdmextruder.def.json.po
+++ b/resources/i18n/es_ES/fdmextruder.def.json.po
@@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0000\n"
+"POT-Creation-Date: 2019-07-16 14:38+0000\n"
"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Spanish\n"
diff --git a/resources/i18n/es_ES/fdmprinter.def.json.po b/resources/i18n/es_ES/fdmprinter.def.json.po
index 3eeabf81ca..8ffd3969a6 100644
--- a/resources/i18n/es_ES/fdmprinter.def.json.po
+++ b/resources/i18n/es_ES/fdmprinter.def.json.po
@@ -5,17 +5,17 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2019-03-13 14:00+0200\n"
-"Last-Translator: Bothof \n"
-"Language-Team: Spanish\n"
+"POT-Creation-Date: 2019-07-16 14:38+0000\n"
+"PO-Revision-Date: 2019-07-29 15:51+0200\n"
+"Last-Translator: Lionbridge \n"
+"Language-Team: Spanish , Spanish \n"
"Language: es_ES\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.2.3\n"
#: fdmprinter.def.json
msgctxt "machine_settings label"
@@ -57,7 +57,9 @@ 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"
@@ -69,7 +71,9 @@ 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"
@@ -233,7 +237,7 @@ msgstr "Número de trenes extrusores. Un tren extrusor está formado por un alim
#: fdmprinter.def.json
msgctxt "extruders_enabled_count label"
-msgid "Number of Extruders that are enabled"
+msgid "Number of Extruders That Are Enabled"
msgstr "Número de extrusores habilitados"
#: fdmprinter.def.json
@@ -243,7 +247,7 @@ msgstr "Número de trenes extrusores habilitados y configurados en el software d
#: fdmprinter.def.json
msgctxt "machine_nozzle_tip_outer_diameter label"
-msgid "Outer nozzle diameter"
+msgid "Outer Nozzle Diameter"
msgstr "Diámetro exterior de la tobera"
#: fdmprinter.def.json
@@ -253,7 +257,7 @@ msgstr "Diámetro exterior de la punta de la tobera."
#: fdmprinter.def.json
msgctxt "machine_nozzle_head_distance label"
-msgid "Nozzle length"
+msgid "Nozzle Length"
msgstr "Longitud de la tobera"
#: fdmprinter.def.json
@@ -263,7 +267,7 @@ msgstr "Diferencia de altura entre la punta de la tobera y la parte más baja de
#: fdmprinter.def.json
msgctxt "machine_nozzle_expansion_angle label"
-msgid "Nozzle angle"
+msgid "Nozzle Angle"
msgstr "Ángulo de la tobera"
#: fdmprinter.def.json
@@ -273,7 +277,7 @@ msgstr "Ángulo entre el plano horizontal y la parte cónica que hay justo encim
#: fdmprinter.def.json
msgctxt "machine_heat_zone_length label"
-msgid "Heat zone length"
+msgid "Heat Zone Length"
msgstr "Longitud de la zona térmica"
#: fdmprinter.def.json
@@ -303,7 +307,7 @@ msgstr "Para controlar la temperatura desde Cura. Si va a controlar la temperatu
#: fdmprinter.def.json
msgctxt "machine_nozzle_heat_up_speed label"
-msgid "Heat up speed"
+msgid "Heat Up Speed"
msgstr "Velocidad de calentamiento"
#: fdmprinter.def.json
@@ -313,7 +317,7 @@ msgstr "Velocidad (°C/s) de calentamiento de la tobera calculada como una media
#: fdmprinter.def.json
msgctxt "machine_nozzle_cool_down_speed label"
-msgid "Cool down speed"
+msgid "Cool Down Speed"
msgstr "Velocidad de enfriamiento"
#: fdmprinter.def.json
@@ -333,7 +337,7 @@ msgstr "Tiempo mínimo que un extrusor debe permanecer inactivo antes de que la
#: fdmprinter.def.json
msgctxt "machine_gcode_flavor label"
-msgid "G-code flavour"
+msgid "G-code Flavor"
msgstr "Tipo de GCode"
#: fdmprinter.def.json
@@ -398,7 +402,7 @@ msgstr "Utilizar o no los comandos de retracción de firmware (G10/G11) en lugar
#: fdmprinter.def.json
msgctxt "machine_disallowed_areas label"
-msgid "Disallowed areas"
+msgid "Disallowed Areas"
msgstr "Áreas no permitidas"
#: fdmprinter.def.json
@@ -418,7 +422,7 @@ msgstr "Lista de polígonos con áreas en las que la tobera no tiene permitido e
#: fdmprinter.def.json
msgctxt "machine_head_polygon label"
-msgid "Machine head polygon"
+msgid "Machine Head Polygon"
msgstr "Polígono del cabezal de la máquina"
#: fdmprinter.def.json
@@ -428,7 +432,7 @@ msgstr "Silueta 2D del cabezal de impresión (sin incluir las tapas del ventilad
#: fdmprinter.def.json
msgctxt "machine_head_with_fans_polygon label"
-msgid "Machine head & Fan polygon"
+msgid "Machine Head & Fan Polygon"
msgstr "Polígono del cabezal de la máquina y del ventilador"
#: fdmprinter.def.json
@@ -438,7 +442,7 @@ msgstr "Silueta 2D del cabezal de impresión (incluidas las tapas del ventilador
#: fdmprinter.def.json
msgctxt "gantry_height label"
-msgid "Gantry height"
+msgid "Gantry Height"
msgstr "Altura del puente"
#: fdmprinter.def.json
@@ -468,7 +472,7 @@ msgstr "Diámetro interior de la tobera. Cambie este ajuste cuando utilice un ta
#: fdmprinter.def.json
msgctxt "machine_use_extruder_offset_to_offset_coords label"
-msgid "Offset With Extruder"
+msgid "Offset with Extruder"
msgstr "Desplazamiento con extrusor"
#: fdmprinter.def.json
@@ -1293,8 +1297,12 @@ msgstr "Preferencia de esquina de costura"
#: fdmprinter.def.json
msgctxt "z_seam_corner description"
-msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner."
-msgstr "Controlar si las esquinas del contorno del modelo influyen en la posición de la costura. «Ninguno» significa que las esquinas no influyen en la posición de la costura. «Ocultar costura» significa que es probable que la costura se realice en una esquina interior. «Mostrar costura» significa que es probable que la costura sea en una esquina exterior. «Ocultar o mostrar costura» significa que es probable que la costura se realice en una esquina interior o exterior."
+msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner. Smart Hiding allows both inside and outside corners, but chooses inside corners more frequently, if appropriate."
+msgstr "Controlar si las esquinas del contorno del modelo influyen en la posición de la costura. «Ninguno» significa que las esquinas no influyen en la posición"
+" de la costura. «Ocultar costura» significa que es probable que la costura se realice en una esquina interior. «Mostrar costura» significa que es probable"
+" que la costura se realice en una esquina exterior. «Ocultar o mostrar costura» significa que es probable que la costura se realice en una esquina interior"
+" o exterior. «Costura inteligente» permite realizar la costura en ambas esquinas, pero opta con más frecuencia por las esquinas interiores, si resulta"
+" oportuno."
#: fdmprinter.def.json
msgctxt "z_seam_corner option z_seam_corner_none"
@@ -1316,6 +1324,11 @@ msgctxt "z_seam_corner option z_seam_corner_any"
msgid "Hide or Expose Seam"
msgstr "Ocultar o mostrar costura"
+#: fdmprinter.def.json
+msgctxt "z_seam_corner option z_seam_corner_weighted"
+msgid "Smart Hiding"
+msgstr "Costura inteligente"
+
#: fdmprinter.def.json
msgctxt "z_seam_relative label"
msgid "Z Seam Relative"
@@ -1328,13 +1341,15 @@ msgstr "Cuando se habilita, las coordenadas de la costura en z son relativas al
#: fdmprinter.def.json
msgctxt "skin_no_small_gaps_heuristic label"
-msgid "Ignore Small Z Gaps"
-msgstr "Ignorar los pequeños huecos en Z"
+msgid "No Skin in Z Gaps"
+msgstr "Sin forro en huecos en Z"
#: fdmprinter.def.json
msgctxt "skin_no_small_gaps_heuristic description"
-msgid "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting."
-msgstr "Cuando el modelo tiene pequeños huecos verticales, el tiempo de cálculo puede aumentar alrededor de un 5 % para generar el forro superior e inferior en estos espacios estrechos. En tal caso, desactive este ajuste."
+msgid "When the model has small vertical gaps of only a few layers, there should normally be skin around those layers in the narrow space. Enable this setting to not generate skin if the vertical gap is very small. This improves printing time and slicing time, but technically leaves infill exposed to the air."
+msgstr "Cuando el modelo tiene pequeños huecos verticales de solo unas pocas capas, normalmente suele haber forro alrededor de ellas en el espacio estrecho. Active"
+" este ajuste para no generar forro si el hueco vertical es muy pequeño. Esto mejora el tiempo de impresión y de segmentación, pero deja el relleno expuesto"
+" al aire."
#: fdmprinter.def.json
msgctxt "skin_outline_count label"
@@ -1631,7 +1646,9 @@ 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.\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."
+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."
#: fdmprinter.def.json
msgctxt "sub_div_rad_add label"
@@ -1863,6 +1880,16 @@ msgctxt "default_material_print_temperature description"
msgid "The default temperature used for printing. This should be the \"base\" temperature of a material. All other print temperatures should use offsets based on this value"
msgstr "La temperatura predeterminada que se utiliza para imprimir. Debería ser la temperatura básica del material. Las demás temperaturas de impresión deberían calcularse a partir de este valor"
+#: fdmprinter.def.json
+msgctxt "build_volume_temperature label"
+msgid "Build Volume Temperature"
+msgstr "Temperatura de volumen de impresión"
+
+#: fdmprinter.def.json
+msgctxt "build_volume_temperature description"
+msgid "The temperature of the environment to print in. If this is 0, the build volume temperature will not be adjusted."
+msgstr "La temperatura del entorno de impresión. Si el valor es 0, la temperatura de volumen de impresión no se ajustará."
+
#: fdmprinter.def.json
msgctxt "material_print_temperature label"
msgid "Printing Temperature"
@@ -1973,6 +2000,87 @@ msgctxt "material_shrinkage_percentage description"
msgid "Shrinkage ratio in percentage."
msgstr "Índice de compresión en porcentaje."
+#: fdmprinter.def.json
+msgctxt "material_crystallinity label"
+msgid "Crystalline Material"
+msgstr "Material cristalino"
+
+#: fdmprinter.def.json
+msgctxt "material_crystallinity description"
+msgid "Is this material the type that breaks off cleanly when heated (crystalline), or is it the type that produces long intertwined polymer chains (non-crystalline)?"
+msgstr "¿Es este el tipo de material que se desprende limpiamente cuando se calienta (cristalino) o el que produce largas cadenas de polímeros entrelazadas (no"
+" cristalino)?"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retracted_position label"
+msgid "Anti-ooze Retracted Position"
+msgstr "Velocidad de retracción antirrezumado"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retracted_position description"
+msgid "How far the material needs to be retracted before it stops oozing."
+msgstr "Hasta dónde tiene que retraerse el material antes de detener el rezumado."
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retraction_speed label"
+msgid "Anti-ooze Retraction Speed"
+msgstr "Velocidad de retracción antirrezumado"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retraction_speed description"
+msgid "How fast the material needs to be retracted during a filament switch to prevent oozing."
+msgstr "Con qué velocidad tiene que retraerse el material durante un cambio de filamento para evitar el rezumado."
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_retracted_position label"
+msgid "Break Preparation Retracted Position"
+msgstr "Posición retraída de preparación de rotura"
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_retracted_position description"
+msgid "How far the filament can be stretched before it breaks, while heated."
+msgstr "Hasta dónde puede estirarse el filamento antes de que se rompa mientras se calienta."
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_speed label"
+msgid "Break Preparation Retraction Speed"
+msgstr "Velocidad de retracción de preparación de rotura"
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_speed description"
+msgid "How fast the filament needs to be retracted just before breaking it off in a retraction."
+msgstr "Con qué velocidad debe retraerse el filamento justo antes de romperse en una retracción."
+
+#: fdmprinter.def.json
+msgctxt "material_break_retracted_position label"
+msgid "Break Retracted Position"
+msgstr "Posición retraída de rotura"
+
+#: fdmprinter.def.json
+msgctxt "material_break_retracted_position description"
+msgid "How far to retract the filament in order to break it cleanly."
+msgstr "Hasta dónde debe retraerse el filamento para que se rompa limpiamente."
+
+#: fdmprinter.def.json
+msgctxt "material_break_speed label"
+msgid "Break Retraction Speed"
+msgstr "Velocidad de retracción de rotura"
+
+#: fdmprinter.def.json
+msgctxt "material_break_speed description"
+msgid "The speed at which to retract the filament in order to break it cleanly."
+msgstr "Velocidad a la que debe retraerse el filamento para que se rompa limpiamente."
+
+#: fdmprinter.def.json
+msgctxt "material_break_temperature label"
+msgid "Break Temperature"
+msgstr "Temperatura de rotura"
+
+#: fdmprinter.def.json
+msgctxt "material_break_temperature description"
+msgid "The temperature at which the filament is broken for a clean break."
+msgstr "Temperatura a la que se rompe el filamento de forma limpia."
+
#: fdmprinter.def.json
msgctxt "material_flow label"
msgid "Flow"
@@ -1983,6 +2091,126 @@ msgctxt "material_flow description"
msgid "Flow compensation: the amount of material extruded is multiplied by this value."
msgstr "Compensación de flujo: la cantidad de material extruido se multiplica por este valor."
+#: fdmprinter.def.json
+msgctxt "wall_material_flow label"
+msgid "Wall Flow"
+msgstr "Flujo de pared"
+
+#: fdmprinter.def.json
+msgctxt "wall_material_flow description"
+msgid "Flow compensation on wall lines."
+msgstr "Compensación de flujo en líneas de pared."
+
+#: fdmprinter.def.json
+msgctxt "wall_0_material_flow label"
+msgid "Outer Wall Flow"
+msgstr "Flujo de pared exterior"
+
+#: fdmprinter.def.json
+msgctxt "wall_0_material_flow description"
+msgid "Flow compensation on the outermost wall line."
+msgstr "Compensación de flujo en la línea de pared más externa."
+
+#: fdmprinter.def.json
+msgctxt "wall_x_material_flow label"
+msgid "Inner Wall(s) Flow"
+msgstr "Flujo de pared o paredes interiores"
+
+#: fdmprinter.def.json
+msgctxt "wall_x_material_flow description"
+msgid "Flow compensation on wall lines for all wall lines except the outermost one."
+msgstr "Compensación de flujo en líneas de pared para todas las líneas excepto la más externa."
+
+#: fdmprinter.def.json
+msgctxt "skin_material_flow label"
+msgid "Top/Bottom Flow"
+msgstr "Flujo superior o inferior"
+
+#: fdmprinter.def.json
+msgctxt "skin_material_flow description"
+msgid "Flow compensation on top/bottom lines."
+msgstr "Compensación de flujo en las líneas superiores o inferiores."
+
+#: fdmprinter.def.json
+msgctxt "roofing_material_flow label"
+msgid "Top Surface Skin Flow"
+msgstr "Flujo de forro de superficie superior"
+
+#: fdmprinter.def.json
+msgctxt "roofing_material_flow description"
+msgid "Flow compensation on lines of the areas at the top of the print."
+msgstr "Compensación de flujo en líneas de las áreas superiores de la impresión."
+
+#: fdmprinter.def.json
+msgctxt "infill_material_flow label"
+msgid "Infill Flow"
+msgstr "Flujo de relleno"
+
+#: fdmprinter.def.json
+msgctxt "infill_material_flow description"
+msgid "Flow compensation on infill lines."
+msgstr "Compensación de flujo en líneas de relleno."
+
+#: fdmprinter.def.json
+msgctxt "skirt_brim_material_flow label"
+msgid "Skirt/Brim Flow"
+msgstr "Flujo de falda/borde"
+
+#: fdmprinter.def.json
+msgctxt "skirt_brim_material_flow description"
+msgid "Flow compensation on skirt or brim lines."
+msgstr "Compensación de flujo en líneas de falda o borde."
+
+#: fdmprinter.def.json
+msgctxt "support_material_flow label"
+msgid "Support Flow"
+msgstr "Flujo de soporte"
+
+#: fdmprinter.def.json
+msgctxt "support_material_flow description"
+msgid "Flow compensation on support structure lines."
+msgstr "Compensación de flujo en líneas de estructura de soporte."
+
+#: fdmprinter.def.json
+msgctxt "support_interface_material_flow label"
+msgid "Support Interface Flow"
+msgstr "Flujo de interfaz de soporte"
+
+#: fdmprinter.def.json
+msgctxt "support_interface_material_flow description"
+msgid "Flow compensation on lines of support roof or floor."
+msgstr "Compensación de flujo en líneas de techo o suelo de soporte."
+
+#: fdmprinter.def.json
+msgctxt "support_roof_material_flow label"
+msgid "Support Roof Flow"
+msgstr "Flujo de techo de soporte"
+
+#: fdmprinter.def.json
+msgctxt "support_roof_material_flow description"
+msgid "Flow compensation on support roof lines."
+msgstr "Compensación de flujo en líneas de techo de soporte."
+
+#: fdmprinter.def.json
+msgctxt "support_bottom_material_flow label"
+msgid "Support Floor Flow"
+msgstr "Flujo de suelo de soporte"
+
+#: fdmprinter.def.json
+msgctxt "support_bottom_material_flow description"
+msgid "Flow compensation on support floor lines."
+msgstr "Compensación de flujo en líneas de suelo de soporte."
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_flow label"
+msgid "Prime Tower Flow"
+msgstr "Flujo de la torre auxiliar"
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_flow description"
+msgid "Flow compensation on prime tower lines."
+msgstr "Compensación de flujo en líneas de la torre auxiliar."
+
#: fdmprinter.def.json
msgctxt "material_flow_layer_0 label"
msgid "Initial Layer Flow"
@@ -2100,8 +2328,9 @@ msgstr "Limitar las retracciones de soporte"
#: fdmprinter.def.json
msgctxt "limit_support_retractions description"
-msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excesive stringing within the support structure."
-msgstr "Omitir la retracción al moverse de soporte a soporte en línea recta. Habilitar este ajuste ahorra tiempo de impresión pero puede ocasionar un encordado excesivo en la estructura de soporte."
+msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excessive stringing within the support structure."
+msgstr "Omitir la retracción al moverse de soporte a soporte en línea recta. Habilitar este ajuste ahorra tiempo de impresión pero puede ocasionar un encordado"
+" excesivo en la estructura de soporte."
#: fdmprinter.def.json
msgctxt "material_standby_temperature label"
@@ -2153,6 +2382,16 @@ msgctxt "switch_extruder_prime_speed description"
msgid "The speed at which the filament is pushed back after a nozzle switch retraction."
msgstr "Velocidad a la que se retrae el filamento durante una retracción del cambio de tobera."
+#: fdmprinter.def.json
+msgctxt "switch_extruder_extra_prime_amount label"
+msgid "Nozzle Switch Extra Prime Amount"
+msgstr "Volumen de cebado adicional tras cambio de tobera"
+
+#: fdmprinter.def.json
+msgctxt "switch_extruder_extra_prime_amount description"
+msgid "Extra material to prime after nozzle switching."
+msgstr "Material adicional que debe cebarse tras el cambio de tobera."
+
#: fdmprinter.def.json
msgctxt "speed label"
msgid "Speed"
@@ -2344,14 +2583,15 @@ msgid "The speed at which the skirt and brim are printed. Normally this is done
msgstr "Velocidad a la que se imprimen la falda y el borde. Normalmente, esto se hace a la velocidad de la capa inicial, pero a veces es posible que se prefiera imprimir la falda o el borde a una velocidad diferente."
#: fdmprinter.def.json
-msgctxt "max_feedrate_z_override label"
-msgid "Maximum Z Speed"
-msgstr "Velocidad máxima de Z"
+msgctxt "speed_z_hop label"
+msgid "Z Hop Speed"
+msgstr "Velocidad del salto en Z"
#: fdmprinter.def.json
-msgctxt "max_feedrate_z_override description"
-msgid "The maximum speed with which the build plate is moved. Setting this to zero causes the print to use the firmware defaults for the maximum z speed."
-msgstr "Velocidad máxima a la que se mueve la placa de impresión. Definir este valor en 0 hace que la impresión utilice los valores predeterminados de la velocidad máxima de Z."
+msgctxt "speed_z_hop description"
+msgid "The speed at which the vertical Z movement is made for Z Hops. This is typically lower than the print speed since the build plate or machine's gantry is harder to move."
+msgstr "Velocidad a la que se realiza el movimiento vertical en la dirección Z para los saltos en Z. Suele ser inferior a la velocidad de impresión porque la placa"
+" de impresión o el puente de la máquina es más difícil de desplazar."
#: fdmprinter.def.json
msgctxt "speed_slowdown_layers label"
@@ -2923,6 +3163,16 @@ msgctxt "retraction_hop_after_extruder_switch description"
msgid "After the machine switched from one extruder to the other, the build plate is lowered to create clearance between the nozzle and the print. This prevents the nozzle from leaving oozed material on the outside of a print."
msgstr "Cuando la máquina cambia de un extrusor a otro, la placa de impresión se baja para crear holgura entre la tobera y la impresión. Esto impide que el material rezumado quede fuera de la impresión."
+#: fdmprinter.def.json
+msgctxt "retraction_hop_after_extruder_switch_height label"
+msgid "Z Hop After Extruder Switch Height"
+msgstr "Salto en Z tras altura de cambio de extrusor"
+
+#: fdmprinter.def.json
+msgctxt "retraction_hop_after_extruder_switch_height description"
+msgid "The height difference when performing a Z Hop after extruder switch."
+msgstr "Diferencia de altura cuando se realiza un salto en Z después de un cambio de extrusor."
+
#: fdmprinter.def.json
msgctxt "cooling label"
msgid "Cooling"
@@ -3193,6 +3443,11 @@ msgctxt "support_pattern option cross"
msgid "Cross"
msgstr "Cruz"
+#: fdmprinter.def.json
+msgctxt "support_pattern option gyroid"
+msgid "Gyroid"
+msgstr "Giroide"
+
#: fdmprinter.def.json
msgctxt "support_wall_count label"
msgid "Support Wall Line Count"
@@ -3254,12 +3509,12 @@ msgid "Distance between the printed initial layer support structure lines. This
msgstr "Distancia entre las líneas de estructuras del soporte de la capa inicial impresas. Este ajuste se calcula por la densidad del soporte."
#: fdmprinter.def.json
-msgctxt "support_infill_angle label"
-msgid "Support Infill Line Direction"
+msgctxt "support_infill_angles label"
+msgid "Support Infill Line Directions"
msgstr "Dirección de línea de relleno de soporte"
#: fdmprinter.def.json
-msgctxt "support_infill_angle description"
+msgctxt "support_infill_angles description"
msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane."
msgstr "Orientación del patrón de relleno para soportes. El patrón de relleno de soporte se gira en el plano horizontal."
@@ -3390,8 +3645,9 @@ msgstr "Distancia de unión del soporte"
#: fdmprinter.def.json
msgctxt "support_join_distance description"
-msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one."
-msgstr "Distancia máxima entre las estructuras del soporte en las direcciones X/Y. Cuando estructuras separadas están más cerca entre sí que de este valor, las estructuras se combinan en una."
+msgid "The maximum distance between support structures in the X/Y directions. When separate structures are closer together than this value, the structures merge into one."
+msgstr "Distancia máxima entre las estructuras del soporte en las direcciones X/Y. Cuando las estructuras separadas están más cerca entre sí que este valor, se"
+" combinan en una."
#: fdmprinter.def.json
msgctxt "support_offset label"
@@ -3769,14 +4025,14 @@ msgid "The diameter of a special tower."
msgstr "Diámetro de una torre especial."
#: fdmprinter.def.json
-msgctxt "support_minimal_diameter label"
-msgid "Minimum Diameter"
-msgstr "Diámetro mínimo"
+msgctxt "support_tower_maximum_supported_diameter label"
+msgid "Maximum Tower-Supported Diameter"
+msgstr "Diámetro máximo soportado por la torre"
#: fdmprinter.def.json
-msgctxt "support_minimal_diameter description"
-msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
-msgstr "Diámetro mínimo en las direcciones X/Y de una pequeña área que soportará una torre de soporte especializada."
+msgctxt "support_tower_maximum_supported_diameter description"
+msgid "Maximum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
+msgstr "Diámetro máximo en las direcciones X/Y de una pequeña área que debe ser soportada por una torre de soporte especializada."
#: fdmprinter.def.json
msgctxt "support_tower_roof_angle label"
@@ -3898,7 +4154,9 @@ 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.\nSe 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.\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."
#: fdmprinter.def.json
msgctxt "skirt_brim_minimal_length label"
@@ -4270,16 +4528,6 @@ msgctxt "prime_tower_enable description"
msgid "Print a tower next to the print which serves to prime the material after each nozzle switch."
msgstr "Imprimir una torre junto a la impresión que sirve para preparar el material tras cada cambio de tobera."
-#: fdmprinter.def.json
-msgctxt "prime_tower_circular label"
-msgid "Circular Prime Tower"
-msgstr "Torre auxiliar circular"
-
-#: fdmprinter.def.json
-msgctxt "prime_tower_circular description"
-msgid "Make the prime tower as a circular shape."
-msgstr "Hacer que la torre auxiliar sea circular."
-
#: fdmprinter.def.json
msgctxt "prime_tower_size label"
msgid "Prime Tower Size"
@@ -4320,16 +4568,6 @@ msgctxt "prime_tower_position_y description"
msgid "The y coordinate of the position of the prime tower."
msgstr "Coordenada Y de la posición de la torre auxiliar."
-#: fdmprinter.def.json
-msgctxt "prime_tower_flow label"
-msgid "Prime Tower Flow"
-msgstr "Flujo de la torre auxiliar"
-
-#: fdmprinter.def.json
-msgctxt "prime_tower_flow description"
-msgid "Flow compensation: the amount of material extruded is multiplied by this value."
-msgstr "Compensación de flujo: la cantidad de material extruido se multiplica por este valor."
-
#: fdmprinter.def.json
msgctxt "prime_tower_wipe_enabled label"
msgid "Wipe Inactive Nozzle on Prime Tower"
@@ -4340,6 +4578,16 @@ msgctxt "prime_tower_wipe_enabled description"
msgid "After printing the prime tower with one nozzle, wipe the oozed material from the other nozzle off on the prime tower."
msgstr "Tras imprimir la torre auxiliar con una tobera, limpie el material rezumado de la otra tobera de la torre auxiliar."
+#: fdmprinter.def.json
+msgctxt "prime_tower_brim_enable label"
+msgid "Prime Tower Brim"
+msgstr "Borde de la torre auxiliar"
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_brim_enable description"
+msgid "Prime-towers might need the extra adhesion afforded by a brim even if the model doesn't. Presently can't be used with the 'Raft' adhesion-type."
+msgstr "Puede que las torres auxiliares necesiten la adherencia adicional que proporciona un borde, aunque no sea requisito del modelo. Actualmente, no se puede usar con el tipo de adherencia «balsa»."
+
#: fdmprinter.def.json
msgctxt "ooze_shield_enabled label"
msgid "Enable Ooze Shield"
@@ -4622,8 +4870,9 @@ msgstr "Contornos espiralizados suaves"
#: fdmprinter.def.json
msgctxt "smooth_spiralized_contours description"
-msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
-msgstr "Suavice los contornos espiralizados para reducir la visibilidad de la costura Z (la costura Z debería ser apenas visible en la impresora pero seguirá siendo visible en la vista de capas). Tenga en cuenta que la suavización tenderá a desdibujar detalles finos de la superficie."
+msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
+msgstr "Suaviza los contornos espiralizados para reducir la visibilidad de la costura Z (la costura Z debería ser apenas visible en la impresora pero seguirá siendo"
+" visible en la vista de capas). Tenga en cuenta que la suavización tenderá a desdibujar detalles finos de la superficie."
#: fdmprinter.def.json
msgctxt "relative_extrusion label"
@@ -4855,6 +5104,16 @@ msgctxt "meshfix_maximum_travel_resolution description"
msgid "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."
msgstr "El tamaño mínimo de un segmento de línea de desplazamiento tras la segmentación. Si se aumenta, los movimientos de desplazamiento tendrán esquinas menos suavizadas. Esto puede le permite a la impresora mantener la velocidad que necesita para procesar GCode pero puede ocasionar que evitar el modelo sea menos preciso."
+#: fdmprinter.def.json
+msgctxt "meshfix_maximum_deviation label"
+msgid "Maximum Deviation"
+msgstr "Desviación máxima"
+
+#: fdmprinter.def.json
+msgctxt "meshfix_maximum_deviation description"
+msgid "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."
+msgstr "La desviación máxima permitida al reducir la resolución en el ajuste de resolución máxima. Si se aumenta el valor, la impresión será menos precisa pero el GCode será más pequeño."
+
#: fdmprinter.def.json
msgctxt "support_skip_some_zags label"
msgid "Break Up Support In Chunks"
@@ -5112,8 +5371,8 @@ msgstr "Activar soporte cónico"
#: fdmprinter.def.json
msgctxt "support_conical_enabled description"
-msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang."
-msgstr "Función experimental: hace áreas de soporte más pequeñas en la parte inferior que en el voladizo."
+msgid "Make support areas smaller at the bottom than at the overhang."
+msgstr "Hace que las áreas de soporte sean más pequeñas en la parte inferior que en el voladizo."
#: fdmprinter.def.json
msgctxt "support_conical_angle label"
@@ -5345,7 +5604,9 @@ 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.\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."
+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."
#: fdmprinter.def.json
msgctxt "wireframe_top_jump label"
@@ -5454,7 +5715,7 @@ msgstr "Distancia entre la tobera y líneas descendentes en horizontal. Cuanto m
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_enabled label"
-msgid "Use adaptive layers"
+msgid "Use Adaptive Layers"
msgstr "Utilizar capas de adaptación"
#: fdmprinter.def.json
@@ -5464,7 +5725,7 @@ msgstr "Las capas de adaptación calculan las alturas de las capas dependiendo d
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_variation label"
-msgid "Adaptive layers maximum variation"
+msgid "Adaptive Layers Maximum Variation"
msgstr "Variación máxima de las capas de adaptación"
#: fdmprinter.def.json
@@ -5474,7 +5735,7 @@ msgstr "La diferencia de altura máxima permitida en comparación con la altura
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_variation_step label"
-msgid "Adaptive layers variation step size"
+msgid "Adaptive Layers Variation Step Size"
msgstr "Tamaño de pasos de variación de las capas de adaptación"
#: fdmprinter.def.json
@@ -5484,7 +5745,7 @@ msgstr "La diferencia de altura de la siguiente altura de capa en comparación c
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_threshold label"
-msgid "Adaptive layers threshold"
+msgid "Adaptive Layers Threshold"
msgstr "Umbral de las capas de adaptación"
#: fdmprinter.def.json
@@ -5702,6 +5963,156 @@ msgctxt "bridge_fan_speed_3 description"
msgid "Percentage fan speed to use when printing the third bridge skin layer."
msgstr "Velocidad del ventilador en porcentaje que se utiliza para imprimir la tercera capa del forro del puente."
+#: fdmprinter.def.json
+msgctxt "clean_between_layers label"
+msgid "Wipe Nozzle Between Layers"
+msgstr "Limpiar tobera entre capas"
+
+#: fdmprinter.def.json
+msgctxt "clean_between_layers description"
+msgid "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."
+msgstr "Posibilidad de incluir GCode de limpieza de tobera entre capas. Habilitar este ajuste puede influir en el comportamiento de retracción en el cambio de capa. Utilice los ajustes de retracción de limpieza para controlar la retracción en las capas donde la secuencia de limpieza estará en curso."
+
+#: fdmprinter.def.json
+msgctxt "max_extrusion_before_wipe label"
+msgid "Material Volume Between Wipes"
+msgstr "Volumen de material entre limpiezas"
+
+#: fdmprinter.def.json
+msgctxt "max_extrusion_before_wipe description"
+msgid "Maximum material, that can be extruded before another nozzle wipe is initiated."
+msgstr "Material máximo que puede extruirse antes de que se inicie otra limpieza de tobera."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_enable label"
+msgid "Wipe Retraction Enable"
+msgstr "Habilitación de retracción de limpieza"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_enable description"
+msgid "Retract the filament when the nozzle is moving over a non-printed area."
+msgstr "Retrae el filamento cuando la tobera se mueve sobre un área no impresa."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_amount label"
+msgid "Wipe Retraction Distance"
+msgstr "Distancia de retracción de limpieza"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_amount description"
+msgid "Amount to retract the filament so it does not ooze during the wipe sequence."
+msgstr "Cantidad para retraer el filamento para que no rezume durante la secuencia de limpieza."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_extra_prime_amount label"
+msgid "Wipe Retraction Extra Prime Amount"
+msgstr "Cantidad de cebado adicional de retracción de limpieza"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_extra_prime_amount description"
+msgid "Some material can ooze away during a wipe travel moves, which can be compensated for here."
+msgstr "Algunos materiales pueden rezumar durante el movimiento de un desplazamiento de limpieza, lo cual se puede corregir aquí."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_speed label"
+msgid "Wipe Retraction Speed"
+msgstr "Velocidad de retracción de limpieza"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_speed description"
+msgid "The speed at which the filament is retracted and primed during a wipe retraction move."
+msgstr "Velocidad a la que se retrae el filamento y se prepara durante un movimiento de retracción de limpieza."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_retract_speed label"
+msgid "Wipe Retraction Retract Speed"
+msgstr "Velocidad de retracción en retracción de limpieza"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_retract_speed description"
+msgid "The speed at which the filament is retracted during a wipe retraction move."
+msgstr "Velocidad a la que se retrae el filamento durante un movimiento de retracción de limpieza."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_prime_speed label"
+msgid "Retraction Prime Speed"
+msgstr "Velocidad de cebado de retracción"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_prime_speed description"
+msgid "The speed at which the filament is primed during a wipe retraction move."
+msgstr "Velocidad a la que se prepara el filamento durante un movimiento de retracción de limpieza."
+
+#: fdmprinter.def.json
+msgctxt "wipe_pause label"
+msgid "Wipe Pause"
+msgstr "Pausar limpieza"
+
+#: fdmprinter.def.json
+msgctxt "wipe_pause description"
+msgid "Pause after the unretract."
+msgstr "Pausa después de no haber retracción."
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_enable label"
+msgid "Wipe Z Hop When Retracted"
+msgstr "Limpiar salto en Z en la retracción"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_enable description"
+msgid "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."
+msgstr "Siempre que se realiza una retracción, la placa de impresión se baja para crear holgura entre la tobera y la impresión. Impide que la tobera golpee la impresión durante movimientos de desplazamiento, reduciendo las posibilidades de alcanzar la impresión de la placa de impresión."
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_amount label"
+msgid "Wipe Z Hop Height"
+msgstr "Limpiar altura del salto en Z"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_amount description"
+msgid "The height difference when performing a Z Hop."
+msgstr "Diferencia de altura cuando se realiza un salto en Z."
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_speed label"
+msgid "Wipe Hop Speed"
+msgstr "Limpiar velocidad de salto"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_speed description"
+msgid "Speed to move the z-axis during the hop."
+msgstr "Velocidad para mover el eje Z durante el salto."
+
+#: fdmprinter.def.json
+msgctxt "wipe_brush_pos_x label"
+msgid "Wipe Brush X Position"
+msgstr "Limpiar posición X de cepillo"
+
+#: fdmprinter.def.json
+msgctxt "wipe_brush_pos_x description"
+msgid "X location where wipe script will start."
+msgstr "Ubicación X donde se iniciará la secuencia de limpieza."
+
+#: fdmprinter.def.json
+msgctxt "wipe_repeat_count label"
+msgid "Wipe Repeat Count"
+msgstr "Recuento de repeticiones de limpieza"
+
+#: fdmprinter.def.json
+msgctxt "wipe_repeat_count description"
+msgid "Number of times to move the nozzle across the brush."
+msgstr "Número de movimientos de la tobera a lo largo del cepillo."
+
+#: fdmprinter.def.json
+msgctxt "wipe_move_distance label"
+msgid "Wipe Move Distance"
+msgstr "Distancia de movimiento de limpieza"
+
+#: fdmprinter.def.json
+msgctxt "wipe_move_distance description"
+msgid "The distance to move the head back and forth across the brush."
+msgstr "La distancia para mover el cabezal hacia adelante y hacia atrás a lo largo del cepillo."
+
#: fdmprinter.def.json
msgctxt "command_line_settings label"
msgid "Command Line Settings"
@@ -5762,6 +6173,138 @@ msgctxt "mesh_rotation_matrix description"
msgid "Transformation matrix to be applied to the model when loading it from file."
msgstr "Matriz de transformación que se aplicará al modelo cuando se cargue desde el archivo."
+#~ msgctxt "machine_gcode_flavor label"
+#~ msgid "G-code Flavour"
+#~ msgstr "Tipo de GCode"
+
+#~ msgctxt "z_seam_corner description"
+#~ msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner."
+#~ msgstr "Controlar si las esquinas del contorno del modelo influyen en la posición de la costura. «Ninguno» significa que las esquinas no influyen en la posición de la costura. «Ocultar costura» significa que es probable que la costura se realice en una esquina interior. «Mostrar costura» significa que es probable que la costura sea en una esquina exterior. «Ocultar o mostrar costura» significa que es probable que la costura se realice en una esquina interior o exterior."
+
+#~ msgctxt "skin_no_small_gaps_heuristic label"
+#~ msgid "Ignore Small Z Gaps"
+#~ msgstr "Ignorar los pequeños huecos en Z"
+
+#~ msgctxt "skin_no_small_gaps_heuristic description"
+#~ msgid "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting."
+#~ msgstr "Cuando el modelo tiene pequeños huecos verticales, el tiempo de cálculo puede aumentar alrededor de un 5 % para generar el forro superior e inferior en estos espacios estrechos. En tal caso, desactive este ajuste."
+
+#~ msgctxt "build_volume_temperature description"
+#~ msgid "The temperature used for build volume. If this is 0, the build volume temperature will not be adjusted."
+#~ msgstr "La temperatura utilizada para el volumen de impresión. Si el valor es 0, la temperatura de volumen de impresión no se ajustará."
+
+#~ msgctxt "limit_support_retractions description"
+#~ msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excesive stringing within the support structure."
+#~ msgstr "Omitir la retracción al moverse de soporte a soporte en línea recta. Habilitar este ajuste ahorra tiempo de impresión pero puede ocasionar un encordado excesivo en la estructura de soporte."
+
+#~ msgctxt "max_feedrate_z_override label"
+#~ msgid "Maximum Z Speed"
+#~ msgstr "Velocidad máxima de Z"
+
+#~ msgctxt "max_feedrate_z_override description"
+#~ msgid "The maximum speed with which the build plate is moved. Setting this to zero causes the print to use the firmware defaults for the maximum z speed."
+#~ msgstr "Velocidad máxima a la que se mueve la placa de impresión. Definir este valor en 0 hace que la impresión utilice los valores predeterminados de la velocidad máxima de Z."
+
+#~ msgctxt "support_join_distance description"
+#~ msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one."
+#~ msgstr "Distancia máxima entre las estructuras del soporte en las direcciones X/Y. Cuando estructuras separadas están más cerca entre sí que de este valor, las estructuras se combinan en una."
+
+#~ msgctxt "support_minimal_diameter label"
+#~ msgid "Minimum Diameter"
+#~ msgstr "Diámetro mínimo"
+
+#~ msgctxt "support_minimal_diameter description"
+#~ msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
+#~ msgstr "Diámetro mínimo en las direcciones X/Y de una pequeña área que soportará una torre de soporte especializada."
+
+#~ msgctxt "prime_tower_circular label"
+#~ msgid "Circular Prime Tower"
+#~ msgstr "Torre auxiliar circular"
+
+#~ msgctxt "prime_tower_circular description"
+#~ msgid "Make the prime tower as a circular shape."
+#~ msgstr "Hacer que la torre auxiliar sea circular."
+
+#~ msgctxt "prime_tower_flow description"
+#~ msgid "Flow compensation: the amount of material extruded is multiplied by this value."
+#~ msgstr "Compensación de flujo: la cantidad de material extruido se multiplica por este valor."
+
+#~ msgctxt "smooth_spiralized_contours description"
+#~ msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
+#~ msgstr "Suavice los contornos espiralizados para reducir la visibilidad de la costura Z (la costura Z debería ser apenas visible en la impresora pero seguirá siendo visible en la vista de capas). Tenga en cuenta que la suavización tenderá a desdibujar detalles finos de la superficie."
+
+#~ msgctxt "support_conical_enabled description"
+#~ msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang."
+#~ msgstr "Función experimental: hace áreas de soporte más pequeñas en la parte inferior que en el voladizo."
+
+#~ msgctxt "extruders_enabled_count label"
+#~ msgid "Number of Extruders that are enabled"
+#~ msgstr "Número de extrusores habilitados"
+
+#~ msgctxt "machine_nozzle_tip_outer_diameter label"
+#~ msgid "Outer nozzle diameter"
+#~ msgstr "Diámetro exterior de la tobera"
+
+#~ msgctxt "machine_nozzle_head_distance label"
+#~ msgid "Nozzle length"
+#~ msgstr "Longitud de la tobera"
+
+#~ msgctxt "machine_nozzle_expansion_angle label"
+#~ msgid "Nozzle angle"
+#~ msgstr "Ángulo de la tobera"
+
+#~ msgctxt "machine_heat_zone_length label"
+#~ msgid "Heat zone length"
+#~ msgstr "Longitud de la zona térmica"
+
+#~ msgctxt "machine_nozzle_heat_up_speed label"
+#~ msgid "Heat up speed"
+#~ msgstr "Velocidad de calentamiento"
+
+#~ msgctxt "machine_nozzle_cool_down_speed label"
+#~ msgid "Cool down speed"
+#~ msgstr "Velocidad de enfriamiento"
+
+#~ msgctxt "machine_gcode_flavor label"
+#~ msgid "G-code flavour"
+#~ msgstr "Tipo de GCode"
+
+#~ msgctxt "machine_disallowed_areas label"
+#~ msgid "Disallowed areas"
+#~ msgstr "Áreas no permitidas"
+
+#~ msgctxt "machine_head_polygon label"
+#~ msgid "Machine head polygon"
+#~ msgstr "Polígono del cabezal de la máquina"
+
+#~ msgctxt "machine_head_with_fans_polygon label"
+#~ msgid "Machine head & Fan polygon"
+#~ msgstr "Polígono del cabezal de la máquina y del ventilador"
+
+#~ msgctxt "gantry_height label"
+#~ msgid "Gantry height"
+#~ msgstr "Altura del puente"
+
+#~ msgctxt "machine_use_extruder_offset_to_offset_coords label"
+#~ msgid "Offset With Extruder"
+#~ msgstr "Desplazamiento con extrusor"
+
+#~ msgctxt "adaptive_layer_height_enabled label"
+#~ msgid "Use adaptive layers"
+#~ msgstr "Utilizar capas de adaptación"
+
+#~ msgctxt "adaptive_layer_height_variation label"
+#~ msgid "Adaptive layers maximum variation"
+#~ msgstr "Variación máxima de las capas de adaptación"
+
+#~ msgctxt "adaptive_layer_height_variation_step label"
+#~ msgid "Adaptive layers variation step size"
+#~ msgstr "Tamaño de pasos de variación de las capas de adaptación"
+
+#~ msgctxt "adaptive_layer_height_threshold label"
+#~ msgid "Adaptive layers threshold"
+#~ msgstr "Umbral de las capas de adaptación"
+
#~ msgctxt "skin_overlap description"
#~ msgid "The amount of overlap between the skin and the walls as a percentage of the skin line width. A slight overlap allows the walls to connect firmly to the skin. This is a percentage of the average line widths of the skin lines and the innermost wall."
#~ msgstr "La cantidad de superposición entre el forro y las paredes son un porcentaje del ancho de la línea de forro. Una ligera superposición permite que las paredes estén firmemente unidas al forro. Este es el porcentaje de la media de los anchos de las líneas del forro y la pared más profunda."
@@ -5899,7 +6442,6 @@ 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"
#~ "."
@@ -5912,7 +6454,6 @@ 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"
#~ "."
@@ -5969,7 +6510,6 @@ 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/fdmextruder.def.json.pot b/resources/i18n/fdmextruder.def.json.pot
index afec8e8257..991d418f7a 100644
--- a/resources/i18n/fdmextruder.def.json.pot
+++ b/resources/i18n/fdmextruder.def.json.pot
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Uranium json setting files\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0000\n"
+"POT-Creation-Date: 2019-07-16 14:38+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE\n"
diff --git a/resources/i18n/fdmprinter.def.json.pot b/resources/i18n/fdmprinter.def.json.pot
index 2c18d6ebed..d1a75607cb 100644
--- a/resources/i18n/fdmprinter.def.json.pot
+++ b/resources/i18n/fdmprinter.def.json.pot
@@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Uranium json setting files\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0000\n"
+"POT-Creation-Date: 2019-07-16 14:38+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE\n"
@@ -244,7 +244,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "extruders_enabled_count label"
-msgid "Number of Extruders that are enabled"
+msgid "Number of Extruders That Are Enabled"
msgstr ""
#: fdmprinter.def.json
@@ -255,7 +255,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "machine_nozzle_tip_outer_diameter label"
-msgid "Outer nozzle diameter"
+msgid "Outer Nozzle Diameter"
msgstr ""
#: fdmprinter.def.json
@@ -265,7 +265,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "machine_nozzle_head_distance label"
-msgid "Nozzle length"
+msgid "Nozzle Length"
msgstr ""
#: fdmprinter.def.json
@@ -277,7 +277,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "machine_nozzle_expansion_angle label"
-msgid "Nozzle angle"
+msgid "Nozzle Angle"
msgstr ""
#: fdmprinter.def.json
@@ -289,7 +289,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "machine_heat_zone_length label"
-msgid "Heat zone length"
+msgid "Heat Zone Length"
msgstr ""
#: fdmprinter.def.json
@@ -325,7 +325,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "machine_nozzle_heat_up_speed label"
-msgid "Heat up speed"
+msgid "Heat Up Speed"
msgstr ""
#: fdmprinter.def.json
@@ -337,7 +337,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "machine_nozzle_cool_down_speed label"
-msgid "Cool down speed"
+msgid "Cool Down Speed"
msgstr ""
#: fdmprinter.def.json
@@ -362,7 +362,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "machine_gcode_flavor label"
-msgid "G-code flavour"
+msgid "G-code Flavor"
msgstr ""
#: fdmprinter.def.json
@@ -429,7 +429,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "machine_disallowed_areas label"
-msgid "Disallowed areas"
+msgid "Disallowed Areas"
msgstr ""
#: fdmprinter.def.json
@@ -449,7 +449,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "machine_head_polygon label"
-msgid "Machine head polygon"
+msgid "Machine Head Polygon"
msgstr ""
#: fdmprinter.def.json
@@ -459,7 +459,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "machine_head_with_fans_polygon label"
-msgid "Machine head & Fan polygon"
+msgid "Machine Head & Fan Polygon"
msgstr ""
#: fdmprinter.def.json
@@ -469,7 +469,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "gantry_height label"
-msgid "Gantry height"
+msgid "Gantry Height"
msgstr ""
#: fdmprinter.def.json
@@ -503,7 +503,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "machine_use_extruder_offset_to_offset_coords label"
-msgid "Offset With Extruder"
+msgid "Offset with Extruder"
msgstr ""
#: fdmprinter.def.json
@@ -1448,7 +1448,9 @@ msgid ""
"seam. None means that corners have no influence on the seam position. Hide "
"Seam makes the seam more likely to occur on an inside corner. Expose Seam "
"makes the seam more likely to occur on an outside corner. Hide or Expose "
-"Seam makes the seam more likely to occur at an inside or outside corner."
+"Seam makes the seam more likely to occur at an inside or outside corner. "
+"Smart Hiding allows both inside and outside corners, but chooses inside "
+"corners more frequently, if appropriate."
msgstr ""
#: fdmprinter.def.json
@@ -1471,6 +1473,11 @@ msgctxt "z_seam_corner option z_seam_corner_any"
msgid "Hide or Expose Seam"
msgstr ""
+#: fdmprinter.def.json
+msgctxt "z_seam_corner option z_seam_corner_weighted"
+msgid "Smart Hiding"
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "z_seam_relative label"
msgid "Z Seam Relative"
@@ -1486,15 +1493,17 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "skin_no_small_gaps_heuristic label"
-msgid "Ignore Small Z Gaps"
+msgid "No Skin in Z Gaps"
msgstr ""
#: fdmprinter.def.json
msgctxt "skin_no_small_gaps_heuristic description"
msgid ""
-"When the model has small vertical gaps, about 5% extra computation time can "
-"be spent on generating top and bottom skin in these narrow spaces. In such "
-"case, disable the setting."
+"When the model has small vertical gaps of only a few layers, there should "
+"normally be skin around those layers in the narrow space. Enable this "
+"setting to not generate skin if the vertical gap is very small. This "
+"improves printing time and slicing time, but technically leaves infill "
+"exposed to the air."
msgstr ""
#: fdmprinter.def.json
@@ -2143,6 +2152,18 @@ msgid ""
"based on this value"
msgstr ""
+#: fdmprinter.def.json
+msgctxt "build_volume_temperature label"
+msgid "Build Volume Temperature"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "build_volume_temperature description"
+msgid ""
+"The temperature of the environment to print in. If this is 0, the build "
+"volume temperature will not be adjusted."
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "material_print_temperature label"
msgid "Printing Temperature"
@@ -2266,6 +2287,94 @@ msgctxt "material_shrinkage_percentage description"
msgid "Shrinkage ratio in percentage."
msgstr ""
+#: fdmprinter.def.json
+msgctxt "material_crystallinity label"
+msgid "Crystalline Material"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_crystallinity description"
+msgid ""
+"Is this material the type that breaks off cleanly when heated (crystalline), "
+"or is it the type that produces long intertwined polymer chains (non-"
+"crystalline)?"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retracted_position label"
+msgid "Anti-ooze Retracted Position"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retracted_position description"
+msgid "How far the material needs to be retracted before it stops oozing."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retraction_speed label"
+msgid "Anti-ooze Retraction Speed"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retraction_speed description"
+msgid ""
+"How fast the material needs to be retracted during a filament switch to "
+"prevent oozing."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_retracted_position label"
+msgid "Break Preparation Retracted Position"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_retracted_position description"
+msgid "How far the filament can be stretched before it breaks, while heated."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_speed label"
+msgid "Break Preparation Retraction Speed"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_speed description"
+msgid ""
+"How fast the filament needs to be retracted just before breaking it off in a "
+"retraction."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_retracted_position label"
+msgid "Break Retracted Position"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_retracted_position description"
+msgid "How far to retract the filament in order to break it cleanly."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_speed label"
+msgid "Break Retraction Speed"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_speed description"
+msgid ""
+"The speed at which to retract the filament in order to break it cleanly."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_temperature label"
+msgid "Break Temperature"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_temperature description"
+msgid "The temperature at which the filament is broken for a clean break."
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "material_flow label"
msgid "Flow"
@@ -2278,6 +2387,127 @@ msgid ""
"value."
msgstr ""
+#: fdmprinter.def.json
+msgctxt "wall_material_flow label"
+msgid "Wall Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wall_material_flow description"
+msgid "Flow compensation on wall lines."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wall_0_material_flow label"
+msgid "Outer Wall Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wall_0_material_flow description"
+msgid "Flow compensation on the outermost wall line."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wall_x_material_flow label"
+msgid "Inner Wall(s) Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wall_x_material_flow description"
+msgid ""
+"Flow compensation on wall lines for all wall lines except the outermost one."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "skin_material_flow label"
+msgid "Top/Bottom Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "skin_material_flow description"
+msgid "Flow compensation on top/bottom lines."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "roofing_material_flow label"
+msgid "Top Surface Skin Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "roofing_material_flow description"
+msgid "Flow compensation on lines of the areas at the top of the print."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "infill_material_flow label"
+msgid "Infill Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "infill_material_flow description"
+msgid "Flow compensation on infill lines."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "skirt_brim_material_flow label"
+msgid "Skirt/Brim Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "skirt_brim_material_flow description"
+msgid "Flow compensation on skirt or brim lines."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "support_material_flow label"
+msgid "Support Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "support_material_flow description"
+msgid "Flow compensation on support structure lines."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "support_interface_material_flow label"
+msgid "Support Interface Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "support_interface_material_flow description"
+msgid "Flow compensation on lines of support roof or floor."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "support_roof_material_flow label"
+msgid "Support Roof Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "support_roof_material_flow description"
+msgid "Flow compensation on support roof lines."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "support_bottom_material_flow label"
+msgid "Support Floor Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "support_bottom_material_flow description"
+msgid "Flow compensation on support floor lines."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_flow label"
+msgid "Prime Tower Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_flow description"
+msgid "Flow compensation on prime tower lines."
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "material_flow_layer_0 label"
msgid "Initial Layer Flow"
@@ -2414,7 +2644,7 @@ msgstr ""
msgctxt "limit_support_retractions description"
msgid ""
"Omit retraction when moving from support to support in a straight line. "
-"Enabling this setting saves print time, but can lead to excesive stringing "
+"Enabling this setting saves print time, but can lead to excessive stringing "
"within the support structure."
msgstr ""
@@ -2478,6 +2708,16 @@ msgid ""
"retraction."
msgstr ""
+#: fdmprinter.def.json
+msgctxt "switch_extruder_extra_prime_amount label"
+msgid "Nozzle Switch Extra Prime Amount"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "switch_extruder_extra_prime_amount description"
+msgid "Extra material to prime after nozzle switching."
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "speed label"
msgid "Speed"
@@ -2701,15 +2941,16 @@ msgid ""
msgstr ""
#: fdmprinter.def.json
-msgctxt "max_feedrate_z_override label"
-msgid "Maximum Z Speed"
+msgctxt "speed_z_hop label"
+msgid "Z Hop Speed"
msgstr ""
#: fdmprinter.def.json
-msgctxt "max_feedrate_z_override description"
+msgctxt "speed_z_hop description"
msgid ""
-"The maximum speed with which the build plate is moved. Setting this to zero "
-"causes the print to use the firmware defaults for the maximum z speed."
+"The speed at which the vertical Z movement is made for Z Hops. This is "
+"typically lower than the print speed since the build plate or machine's "
+"gantry is harder to move."
msgstr ""
#: fdmprinter.def.json
@@ -3360,6 +3601,16 @@ msgid ""
"prevents the nozzle from leaving oozed material on the outside of a print."
msgstr ""
+#: fdmprinter.def.json
+msgctxt "retraction_hop_after_extruder_switch_height label"
+msgid "Z Hop After Extruder Switch Height"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "retraction_hop_after_extruder_switch_height description"
+msgid "The height difference when performing a Z Hop after extruder switch."
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "cooling label"
msgid "Cooling"
@@ -3682,6 +3933,11 @@ msgctxt "support_pattern option cross"
msgid "Cross"
msgstr ""
+#: fdmprinter.def.json
+msgctxt "support_pattern option gyroid"
+msgid "Gyroid"
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "support_wall_count label"
msgid "Support Wall Line Count"
@@ -3757,12 +4013,12 @@ msgid ""
msgstr ""
#: fdmprinter.def.json
-msgctxt "support_infill_angle label"
-msgid "Support Infill Line Direction"
+msgctxt "support_infill_angles label"
+msgid "Support Infill Line Directions"
msgstr ""
#: fdmprinter.def.json
-msgctxt "support_infill_angle description"
+msgctxt "support_infill_angles description"
msgid ""
"Orientation of the infill pattern for supports. The support infill pattern "
"is rotated in the horizontal plane."
@@ -3919,7 +4175,7 @@ msgstr ""
msgctxt "support_join_distance description"
msgid ""
"The maximum distance between support structures in the X/Y directions. When "
-"seperate structures are closer together than this value, the structures "
+"separate structures are closer together than this value, the structures "
"merge into one."
msgstr ""
@@ -4353,14 +4609,14 @@ msgid "The diameter of a special tower."
msgstr ""
#: fdmprinter.def.json
-msgctxt "support_minimal_diameter label"
-msgid "Minimum Diameter"
+msgctxt "support_tower_maximum_supported_diameter label"
+msgid "Maximum Tower-Supported Diameter"
msgstr ""
#: fdmprinter.def.json
-msgctxt "support_minimal_diameter description"
+msgctxt "support_tower_maximum_supported_diameter description"
msgid ""
-"Minimum diameter in the X/Y directions of a small area which is to be "
+"Maximum diameter in the X/Y directions of a small area which is to be "
"supported by a specialized support tower."
msgstr ""
@@ -4935,16 +5191,6 @@ msgid ""
"each nozzle switch."
msgstr ""
-#: fdmprinter.def.json
-msgctxt "prime_tower_circular label"
-msgid "Circular Prime Tower"
-msgstr ""
-
-#: fdmprinter.def.json
-msgctxt "prime_tower_circular description"
-msgid "Make the prime tower as a circular shape."
-msgstr ""
-
#: fdmprinter.def.json
msgctxt "prime_tower_size label"
msgid "Prime Tower Size"
@@ -4987,18 +5233,6 @@ msgctxt "prime_tower_position_y description"
msgid "The y coordinate of the position of the prime tower."
msgstr ""
-#: fdmprinter.def.json
-msgctxt "prime_tower_flow label"
-msgid "Prime Tower Flow"
-msgstr ""
-
-#: fdmprinter.def.json
-msgctxt "prime_tower_flow description"
-msgid ""
-"Flow compensation: the amount of material extruded is multiplied by this "
-"value."
-msgstr ""
-
#: fdmprinter.def.json
msgctxt "prime_tower_wipe_enabled label"
msgid "Wipe Inactive Nozzle on Prime Tower"
@@ -5011,6 +5245,18 @@ msgid ""
"the other nozzle off on the prime tower."
msgstr ""
+#: fdmprinter.def.json
+msgctxt "prime_tower_brim_enable label"
+msgid "Prime Tower Brim"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_brim_enable description"
+msgid ""
+"Prime-towers might need the extra adhesion afforded by a brim even if the "
+"model doesn't. Presently can't be used with the 'Raft' adhesion-type."
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "ooze_shield_enabled label"
msgid "Enable Ooze Shield"
@@ -5358,7 +5604,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "smooth_spiralized_contours description"
msgid ""
-"Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-"
+"Smooth the spiralized contours to reduce the visibility of the Z seam (the Z "
"seam should be barely visible on the print but will still be visible in the "
"layer view). Note that smoothing will tend to blur fine surface details."
msgstr ""
@@ -5653,6 +5899,19 @@ msgid ""
"model avoidance to become less accurate."
msgstr ""
+#: fdmprinter.def.json
+msgctxt "meshfix_maximum_deviation label"
+msgid "Maximum Deviation"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "meshfix_maximum_deviation description"
+msgid ""
+"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."
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "support_skip_some_zags label"
msgid "Break Up Support In Chunks"
@@ -5965,9 +6224,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "support_conical_enabled description"
-msgid ""
-"Experimental feature: Make support areas smaller at the bottom than at the "
-"overhang."
+msgid "Make support areas smaller at the bottom than at the overhang."
msgstr ""
#: fdmprinter.def.json
@@ -6382,7 +6639,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_enabled label"
-msgid "Use adaptive layers"
+msgid "Use Adaptive Layers"
msgstr ""
#: fdmprinter.def.json
@@ -6394,7 +6651,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_variation label"
-msgid "Adaptive layers maximum variation"
+msgid "Adaptive Layers Maximum Variation"
msgstr ""
#: fdmprinter.def.json
@@ -6404,7 +6661,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_variation_step label"
-msgid "Adaptive layers variation step size"
+msgid "Adaptive Layers Variation Step Size"
msgstr ""
#: fdmprinter.def.json
@@ -6416,7 +6673,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_threshold label"
-msgid "Adaptive layers threshold"
+msgid "Adaptive Layers Threshold"
msgstr ""
#: fdmprinter.def.json
@@ -6668,6 +6925,173 @@ msgctxt "bridge_fan_speed_3 description"
msgid "Percentage fan speed to use when printing the third bridge skin layer."
msgstr ""
+#: fdmprinter.def.json
+msgctxt "clean_between_layers label"
+msgid "Wipe Nozzle Between Layers"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "clean_between_layers description"
+msgid ""
+"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."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "max_extrusion_before_wipe label"
+msgid "Material Volume Between Wipes"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "max_extrusion_before_wipe description"
+msgid ""
+"Maximum material, that can be extruded before another nozzle wipe is "
+"initiated."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_enable label"
+msgid "Wipe Retraction Enable"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_enable description"
+msgid "Retract the filament when the nozzle is moving over a non-printed area."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_amount label"
+msgid "Wipe Retraction Distance"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_amount description"
+msgid ""
+"Amount to retract the filament so it does not ooze during the wipe sequence."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_extra_prime_amount label"
+msgid "Wipe Retraction Extra Prime Amount"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_extra_prime_amount description"
+msgid ""
+"Some material can ooze away during a wipe travel moves, which can be "
+"compensated for here."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_speed label"
+msgid "Wipe Retraction Speed"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_speed description"
+msgid ""
+"The speed at which the filament is retracted and primed during a wipe "
+"retraction move."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_retract_speed label"
+msgid "Wipe Retraction Retract Speed"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_retract_speed description"
+msgid ""
+"The speed at which the filament is retracted during a wipe retraction move."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_prime_speed label"
+msgid "Retraction Prime Speed"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_prime_speed description"
+msgid ""
+"The speed at which the filament is primed during a wipe retraction move."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_pause label"
+msgid "Wipe Pause"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_pause description"
+msgid "Pause after the unretract."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_enable label"
+msgid "Wipe Z Hop When Retracted"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_enable description"
+msgid ""
+"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."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_amount label"
+msgid "Wipe Z Hop Height"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_amount description"
+msgid "The height difference when performing a Z Hop."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_speed label"
+msgid "Wipe Hop Speed"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_speed description"
+msgid "Speed to move the z-axis during the hop."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_brush_pos_x label"
+msgid "Wipe Brush X Position"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_brush_pos_x description"
+msgid "X location where wipe script will start."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_repeat_count label"
+msgid "Wipe Repeat Count"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_repeat_count description"
+msgid "Number of times to move the nozzle across the brush."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_move_distance label"
+msgid "Wipe Move Distance"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_move_distance description"
+msgid "The distance to move the head back and forth across the brush."
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "command_line_settings label"
msgid "Command Line Settings"
diff --git a/resources/i18n/fi_FI/cura.po b/resources/i18n/fi_FI/cura.po
index 677f414f77..4a49ee7835 100644
--- a/resources/i18n/fi_FI/cura.po
+++ b/resources/i18n/fi_FI/cura.po
@@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0100\n"
+"POT-Creation-Date: 2019-07-16 14:38+0200\n"
"PO-Revision-Date: 2017-09-27 12:27+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Finnish\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:27
msgctxt "@action"
msgid "Machine Settings"
msgstr "Laitteen asetukset"
@@ -54,7 +54,7 @@ msgctxt "@info:title"
msgid "3D Model Assistant"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:86
+#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:90
#, python-brace-format
msgctxt "@info:status"
msgid ""
@@ -64,16 +64,6 @@ msgid ""
"View print quality guide
"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
-msgctxt "@item:inmenu"
-msgid "Changelog"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
-msgctxt "@item:inmenu"
-msgid "Show Changelog"
-msgstr "Näytä muutosloki"
-
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py:25
msgctxt "@action"
msgid "Update Firmware"
@@ -89,37 +79,36 @@ msgctxt "@info:status"
msgid "Profile has been flattened & activated."
msgstr "Profiili on tasoitettu ja aktivoitu."
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:33
+#: /home/ruben/Projects/Cura/plugins/AMFReader/__init__.py:15
+msgctxt "@item:inlistbox"
+msgid "AMF File"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:37
msgctxt "@item:inmenu"
msgid "USB printing"
msgstr "USB-tulostus"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:34
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:38
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print via USB"
msgstr "Tulosta USB:n kautta"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:35
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:39
msgctxt "@info:tooltip"
msgid "Print via USB"
msgstr "Tulosta USB:n kautta"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:71
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:75
msgctxt "@info:status"
msgid "Connected via USB"
msgstr "Yhdistetty USB:n kautta"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:96
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:100
msgctxt "@label"
msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
-msgctxt "X3G Writer File Description"
-msgid "X3G File"
-msgstr "X3G-tiedosto"
-
#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/GPX-prefix/src/GPX/slicerplugins/cura15.06/X3gWriter/__init__.py:16
msgctxt "X3g Writer Plugin Description"
msgid "Writes X3g to files"
@@ -130,6 +119,11 @@ msgctxt "X3g Writer File Description"
msgid "X3g File"
msgstr ""
+#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
+msgctxt "X3G Writer File Description"
+msgid "X3G File"
+msgstr "X3G-tiedosto"
+
#: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/__init__.py:17
#: /home/ruben/Projects/Cura/plugins/GCodeGzReader/__init__.py:17
msgctxt "@item:inlistbox"
@@ -142,6 +136,7 @@ msgid "GCodeGzWriter does not support text mode."
msgstr ""
#: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:28
+#: /home/ruben/Projects/Cura/plugins/UFPReader/__init__.py:22
msgctxt "@item:inlistbox"
msgid "Ultimaker Format Package"
msgstr ""
@@ -200,10 +195,10 @@ msgid "Could not save to removable drive {0}: {1}"
msgstr "Ei voitu tallentaa siirrettävälle asemalle {0}: {1}"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:137
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:152
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:133
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:140
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1629
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:188
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:134
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:141
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1622
msgctxt "@info:title"
msgid "Error"
msgstr "Virhe"
@@ -232,9 +227,9 @@ msgstr "Poista siirrettävä asema {0}"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:151
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:163
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1619
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1719
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1612
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1712
msgctxt "@info:title"
msgid "Warning"
msgstr "Varoitus"
@@ -261,266 +256,267 @@ msgctxt "@item:intext"
msgid "Removable Drive"
msgstr "Siirrettävä asema"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:74
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:93
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print over network"
msgstr "Tulosta verkon kautta"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:89
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:76
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:94
msgctxt "@properties:tooltip"
msgid "Print over network"
msgstr "Tulosta verkon kautta"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:95
msgctxt "@info:status"
msgid "Connected over the network."
msgstr "Yhdistetty verkon kautta tulostimeen."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
msgctxt "@info:status"
msgid "Connected over the network. Please approve the access request on the printer."
msgstr "Yhdistetty verkon kautta. Hyväksy tulostimen käyttöoikeuspyyntö."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:93
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:100
msgctxt "@info:status"
msgid "Connected over the network. No access to control the printer."
msgstr "Yhdistetty verkon kautta tulostimeen. Ei käyttöoikeutta tulostimen hallintaan."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
msgctxt "@info:status"
msgid "Access to the printer requested. Please approve the request on the printer"
msgstr "Tulostimen käyttöoikeutta pyydetty. Hyväksy tulostimen pyyntö"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:101
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
msgctxt "@info:title"
msgid "Authentication status"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:103
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:109
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:113
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:120
msgctxt "@info:title"
msgid "Authentication Status"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:104
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:187
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:111
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:198
msgctxt "@action:button"
msgid "Retry"
msgstr "Yritä uudelleen"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
msgctxt "@info:tooltip"
msgid "Re-send the access request"
msgstr "Lähetä käyttöoikeuspyyntö uudelleen"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:115
msgctxt "@info:status"
msgid "Access to the printer accepted"
msgstr "Tulostimen käyttöoikeus hyväksytty"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:119
msgctxt "@info:status"
msgid "No access to print with this printer. Unable to send print job."
msgstr "Tällä tulostimella tulostukseen ei ole käyttöoikeutta. Tulostustyön lähetys ei onnistu."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:114
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:121
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:65
msgctxt "@action:button"
msgid "Request Access"
msgstr "Pyydä käyttöoikeutta"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:123
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:66
msgctxt "@info:tooltip"
msgid "Send access request to the printer"
msgstr "Lähetä tulostimen käyttöoikeuspyyntö"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:201
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:208
msgctxt "@label"
msgid "Unable to start a new print job."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:203
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:210
msgctxt "@label"
msgid "There is an issue with the configuration of your Ultimaker, which makes it impossible to start the print. Please resolve this issues before continuing."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:209
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:231
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:216
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:238
msgctxt "@window:title"
msgid "Mismatched configuration"
msgstr "Ristiriitainen määritys"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:230
msgctxt "@label"
msgid "Are you sure you wish to print with the selected configuration?"
msgstr "Haluatko varmasti tulostaa valitulla määrityksellä?"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:225
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:232
msgctxt "@label"
msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer."
msgstr "Tulostimen ja Curan määrityksen tai kalibroinnin välillä on ristiriita. Parhaat tulokset saavutetaan viipaloimalla aina tulostimeen asetetuille PrintCoreille ja materiaaleille."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:252
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:162
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:162
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:176
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:181
msgctxt "@info:status"
msgid "Sending new jobs (temporarily) blocked, still sending the previous print job."
msgstr "Uusien töiden lähettäminen (tilapäisesti) estetty, edellistä tulostustyötä lähetetään vielä."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:180
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:197
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:266
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:194
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:211
msgctxt "@info:status"
msgid "Sending data to printer"
msgstr "Lähetetään tietoja tulostimeen"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:260
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:182
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:199
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:267
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:196
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:213
msgctxt "@info:title"
msgid "Sending Data"
msgstr "Lähetetään tietoja"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:261
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:200
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:268
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:214
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:18
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:19
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:81
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:395
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:410
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:20
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:38
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:143
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:58
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:149
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:391
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:254
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:283
msgctxt "@action:button"
msgid "Cancel"
msgstr "Peruuta"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:324
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:331
#, python-brace-format
msgctxt "@info:status"
msgid "No Printcore loaded in slot {slot_number}"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:337
#, python-brace-format
msgctxt "@info:status"
msgid "No material loaded in slot {slot_number}"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:353
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:360
#, python-brace-format
msgctxt "@label"
msgid "Different PrintCore (Cura: {cura_printcore_name}, Printer: {remote_printcore_name}) selected for extruder {extruder_id}"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:362
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:369
#, python-brace-format
msgctxt "@label"
msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "Eri materiaali (Cura: {0}, tulostin: {1}) valittu suulakkeelle {2}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:548
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:555
msgctxt "@window:title"
msgid "Sync with your printer"
msgstr "Synkronoi tulostimen kanssa"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:550
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:557
msgctxt "@label"
msgid "Would you like to use your current printer configuration in Cura?"
msgstr "Haluatko käyttää nykyistä tulostimen määritystä Curassa?"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:552
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:559
msgctxt "@label"
msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer."
msgstr "Tulostimen PrintCoret tai materiaalit eivät vastaa tulostettavan projektin asetuksia. Parhaat tulokset saavutetaan viipaloimalla aina tulostimeen asetetuille PrintCoreille ja materiaaleille."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:96
msgctxt "@info:status"
msgid "Connected over the network"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:275
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:342
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:370
msgctxt "@info:status"
msgid "Print job was successfully sent to the printer."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:277
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:343
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:291
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:371
msgctxt "@info:title"
msgid "Data Sent"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:278
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:292
msgctxt "@action:button"
msgid "View in Monitor"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:390
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:290
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:411
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Printer '{printer_name}' has finished printing '{job_name}'."
msgstr "{printer_name} on tulostanut työn '{job_name}'."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:392
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:294
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:413
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:322
#, python-brace-format
msgctxt "@info:status"
msgid "The print job '{job_name}' was finished."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:393
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:414
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:316
msgctxt "@info:status"
msgid "Print finished"
msgstr "Tulosta valmis"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:573
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:595
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:629
msgctxt "@label:material"
msgid "Empty"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:596
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:630
msgctxt "@label:material"
msgid "Unknown"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:169
msgctxt "@action:button"
msgid "Print via Cloud"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:170
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:171
msgctxt "@info:status"
msgid "Connected via Cloud"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:163
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:331
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:182
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:359
msgctxt "@info:title"
msgid "Cloud error"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:199
msgctxt "@info:status"
msgid "Could not export print job."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:358
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
msgstr ""
@@ -535,48 +531,52 @@ msgctxt "@info:status"
msgid "today"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:187
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
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"
+msgid "Sending Print Job"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
+msgctxt "@info:status"
+msgid "Uploading via Ultimaker Cloud"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:621
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
-msgctxt "@info:status"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:627
+msgctxt "@info:status Ultimaker Cloud is a brand name and shouldn't be translated."
msgid "Connect to Ultimaker Cloud"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:628
msgctxt "@action"
msgid "Don't ask me again for this printer."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:631
msgctxt "@action"
msgid "Get started"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:637
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:643
msgctxt "@info:status"
msgid "Connected!"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:645
msgctxt "@action"
msgid "Review your connection"
msgstr ""
@@ -591,7 +591,7 @@ msgctxt "@item:inmenu"
msgid "Monitor"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:124
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:118
msgctxt "@info"
msgid "Could not access update information."
msgstr "Päivitystietoja ei löytynyt."
@@ -648,46 +648,11 @@ msgctxt "@info:tooltip"
msgid "Create a volume in which supports are not printed."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:52
-msgctxt "@info"
-msgid "Cura collects anonymized usage statistics."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:55
-msgctxt "@info:title"
-msgid "Collecting Data"
-msgstr "Kerätään tietoja"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:57
-msgctxt "@action:button"
-msgid "More info"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:58
-msgctxt "@action:tooltip"
-msgid "See more information on what data Cura sends."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:60
-msgctxt "@action:button"
-msgid "Allow"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:61
-msgctxt "@action:tooltip"
-msgid "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."
-msgstr ""
-
#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "Cura 15.04 profiles"
msgstr "Cura 15.04 -profiilit"
-#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
-msgctxt "@item:inmenu"
-msgid "Evaluation"
-msgstr ""
-
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "JPG Image"
@@ -713,56 +678,56 @@ msgctxt "@item:inlistbox"
msgid "GIF Image"
msgstr "GIF-kuva"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
msgctxt "@info:status"
msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration."
msgstr "Viipalointi ei onnistu nykyisellä materiaalilla, sillä se ei sovellu käytettäväksi valitun laitteen tai kokoonpanon kanssa."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:389
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:398
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:407
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:416
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:362
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:386
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:395
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:404
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:413
msgctxt "@info:title"
msgid "Unable to slice"
msgstr "Viipalointi ei onnistu"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:364
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:361
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to slice with the current settings. The following settings have errors: {0}"
msgstr "Viipalointi ei onnistu nykyisten asetuksien ollessa voimassa. Seuraavissa asetuksissa on virheitä: {0}"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:388
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:385
#, 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 ""
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:397
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:394
msgctxt "@info:status"
msgid "Unable to slice because the prime tower or prime position(s) are invalid."
msgstr "Viipalointi ei onnistu, koska esitäyttötorni tai esitäytön sijainti tai sijainnit eivät kelpaa."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:406
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:403
#, python-format
msgctxt "@info:status"
msgid "Unable to slice because there are objects associated with disabled Extruder %s."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:412
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 ""
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:status"
msgid "Processing Layers"
msgstr "Käsitellään kerroksia"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:title"
msgid "Information"
msgstr "Tiedot"
@@ -793,19 +758,19 @@ msgctxt "@item:inlistbox"
msgid "3MF File"
msgstr "3MF-tiedosto"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:190
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:763
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:191
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:775
msgctxt "@label"
msgid "Nozzle"
msgstr "Suutin"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:469
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:474
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:472
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:477
msgctxt "@info:title"
msgid "Open Project File"
msgstr ""
@@ -820,18 +785,18 @@ msgctxt "@item:inlistbox"
msgid "G File"
msgstr "G File -tiedosto"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:324
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:328
msgctxt "@info:status"
msgid "Parsing G-code"
msgstr "G-coden jäsennys"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:326
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:476
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:330
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:483
msgctxt "@info:title"
msgid "G-code Details"
msgstr "G-coden tiedot"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:474
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:481
msgctxt "@info:generic"
msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate."
msgstr "Varmista, että G-code on tulostimelle ja sen tulostusasetuksille soveltuva, ennen kuin lähetät tiedoston siihen. G-coden esitys ei välttämättä ole tarkka."
@@ -854,7 +819,7 @@ msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
+#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:132
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
msgstr ""
@@ -915,242 +880,260 @@ msgctxt "@item:inmenu"
msgid "Preview"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:19
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
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"
msgstr "Tasaa alusta"
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:81
-msgctxt "@tooltip"
-msgid "Outer Wall"
-msgstr "Ulkoseinämä"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:82
-msgctxt "@tooltip"
-msgid "Inner Walls"
-msgstr "Sisäseinämät"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:83
-msgctxt "@tooltip"
-msgid "Skin"
-msgstr "Pintakalvo"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:84
-msgctxt "@tooltip"
-msgid "Infill"
-msgstr "Täyttö"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:85
-msgctxt "@tooltip"
-msgid "Support Infill"
-msgstr "Tuen täyttö"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:86
-msgctxt "@tooltip"
-msgid "Support Interface"
-msgstr "Tukiliittymä"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:87
-msgctxt "@tooltip"
-msgid "Support"
-msgstr "Tuki"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88
-msgctxt "@tooltip"
-msgid "Skirt"
-msgstr "Helma"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89
-msgctxt "@tooltip"
-msgid "Travel"
-msgstr "Siirtoliike"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90
-msgctxt "@tooltip"
-msgid "Retractions"
-msgstr "Takaisinvedot"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91
-msgctxt "@tooltip"
-msgid "Other"
-msgstr "Muu"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:309
-#, python-brace-format
-msgctxt "@label"
-msgid "Pre-sliced file {0}"
-msgstr "Esiviipaloitu tiedosto {0}"
-
-#: /home/ruben/Projects/Cura/cura/API/Account.py:77
+#: /home/ruben/Projects/Cura/cura/API/Account.py:82
msgctxt "@info:title"
msgid "Login failed"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:201
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121
+#: /home/ruben/Projects/Cura/cura/Settings/cura_empty_instance_containers.py:33
+msgctxt "@info:not supported profile"
+msgid "Not supported"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:203
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
msgctxt "@title:window"
msgid "File Already Exists"
msgstr "Tiedosto on jo olemassa"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:202
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:204
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:123
#, python-brace-format
msgctxt "@label Don't translate the XML tag !"
msgid "The file {0} already exists. Are you sure you want to overwrite it?"
msgstr "Tiedosto {0} on jo olemassa. Haluatko varmasti kirjoittaa sen päälle?"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:425
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:427
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:430
msgctxt "@info:status"
msgid "Invalid file URL:"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
-msgctxt "@menuitem"
-msgid "Not overridden"
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:925
+msgctxt "@info:message Followed by a list of settings."
+msgid "Settings have been changed to match the current availability of extruders:"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:915
-#, python-format
-msgctxt "@info:generic"
-msgid "Settings have been changed to match the current availability of extruders: [%s]"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:917
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:927
msgctxt "@info:title"
msgid "Settings updated"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1481
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:132
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to export profile to {0}: {1}"
msgstr "Profiilin vienti epäonnistui tiedostoon {0}: {1}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:138
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:139
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Failed to export profile to {0}: Writer plugin reported failure."
msgstr "Profiilin vienti epäonnistui tiedostoon {0}: Kirjoitin-lisäosa ilmoitti virheestä."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Exported profile to {0}"
msgstr "Profiili viety tiedostoon {0}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145
msgctxt "@info:title"
msgid "Export succeeded"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:170
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:172
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:176
#, 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 ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:192
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "No custom profile to import in file {0}"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:194
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:196
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}:"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:218
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:228
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:220
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "This profile {0} contains incorrect data, could not import it."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:241
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:243
#, 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 ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:315
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to import profile from {0}:"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:316
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Successfully imported profile {0}"
msgstr "Onnistuneesti tuotu profiili {0}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:319
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321
#, python-brace-format
msgctxt "@info:status"
msgid "File {0} does not contain any valid profile."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:322
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:324
#, python-brace-format
msgctxt "@info:status"
msgid "Profile {0} has an unknown file type or is corrupted."
msgstr "Profiililla {0} on tuntematon tiedostotyyppi tai se on vioittunut."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:340
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:359
msgctxt "@label"
msgid "Custom profile"
msgstr "Mukautettu profiili"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:356
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:375
msgctxt "@info:status"
msgid "Profile is missing a quality type."
msgstr "Profiilista puuttuu laatutyyppi."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:370
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:389
#, python-brace-format
msgctxt "@info:status"
msgid "Could not find a quality type {0} for the current configuration."
msgstr "Laatutyyppiä {0} ei löydy nykyiselle kokoonpanolle."
-#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:69
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:76
+msgctxt "@tooltip"
+msgid "Outer Wall"
+msgstr "Ulkoseinämä"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:77
+msgctxt "@tooltip"
+msgid "Inner Walls"
+msgstr "Sisäseinämät"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:78
+msgctxt "@tooltip"
+msgid "Skin"
+msgstr "Pintakalvo"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:79
+msgctxt "@tooltip"
+msgid "Infill"
+msgstr "Täyttö"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:80
+msgctxt "@tooltip"
+msgid "Support Infill"
+msgstr "Tuen täyttö"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:81
+msgctxt "@tooltip"
+msgid "Support Interface"
+msgstr "Tukiliittymä"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:82
+msgctxt "@tooltip"
+msgid "Support"
+msgstr "Tuki"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:83
+msgctxt "@tooltip"
+msgid "Skirt"
+msgstr "Helma"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:84
+msgctxt "@tooltip"
+msgid "Prime Tower"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:85
+msgctxt "@tooltip"
+msgid "Travel"
+msgstr "Siirtoliike"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:86
+msgctxt "@tooltip"
+msgid "Retractions"
+msgstr "Takaisinvedot"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:87
+msgctxt "@tooltip"
+msgid "Other"
+msgstr "Muu"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:306
+#, python-brace-format
+msgctxt "@label"
+msgid "Pre-sliced file {0}"
+msgstr "Esiviipaloitu tiedosto {0}"
+
+#: /home/ruben/Projects/Cura/cura/UI/WelcomePagesModel.py:56
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:62
+msgctxt "@action:button"
+msgid "Next"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/UI/ObjectsModel.py:61
#, python-brace-format
msgctxt "@label"
msgid "Group #{group_nr}"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Machines/Models/MachineManagementModel.py:65
-msgctxt "@info:title"
-msgid "Network enabled printers"
-msgstr ""
+#: /home/ruben/Projects/Cura/cura/UI/WhatsNewPagesModel.py:17
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:185
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:85
+#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:482
+#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:508
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:124
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:168
+msgctxt "@action:button"
+msgid "Close"
+msgstr "Sulje"
-#: /home/ruben/Projects/Cura/cura/Machines/Models/MachineManagementModel.py:80
-msgctxt "@info:title"
-msgid "Local printers"
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:17
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:91
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:48
+msgctxt "@action:button"
+msgid "Add"
+msgstr "Lisää"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/ExtrudersModel.py:208
+msgctxt "@menuitem"
+msgid "Not overridden"
msgstr ""
#: /home/ruben/Projects/Cura/cura/Machines/Models/QualityManagementModel.py:109
@@ -1164,23 +1147,41 @@ msgctxt "@item:inlistbox"
msgid "All Files (*)"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:665
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:86
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:182
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:269
+msgctxt "@label"
+msgid "Unknown"
+msgstr "Tuntematon"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:116
+msgctxt "@label"
+msgid "The printer(s) below cannot be connected because they are part of a group"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:118
+msgctxt "@label"
+msgid "Available networked printers"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:689
msgctxt "@label"
msgid "Custom Material"
msgstr "Mukautettu materiaali"
-#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:666
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:256
+#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:690
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:203
msgctxt "@label"
msgid "Custom"
msgstr "Mukautettu"
-#: /home/ruben/Projects/Cura/cura/BuildVolume.py:81
+#: /home/ruben/Projects/Cura/cura/BuildVolume.py:89
msgctxt "@info:status"
msgid "The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from colliding with printed models."
msgstr "Tulostustilavuuden korkeutta on vähennetty tulostusjärjestysasetuksen vuoksi, jotta koroke ei osuisi tulostettuihin malleihin."
-#: /home/ruben/Projects/Cura/cura/BuildVolume.py:83
+#: /home/ruben/Projects/Cura/cura/BuildVolume.py:91
msgctxt "@info:title"
msgid "Build Volume"
msgstr "Tulostustilavuus"
@@ -1195,16 +1196,31 @@ msgctxt "@info:backup_failed"
msgid "Tried to restore a Cura backup without having proper data or meta data."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/Backups/Backup.py:124
+#: /home/ruben/Projects/Cura/cura/Backups/Backup.py:125
msgctxt "@info:backup_failed"
-msgid "Tried to restore a Cura backup that does not match your current version."
+msgid "Tried to restore a Cura backup that is higher than the current version."
msgstr ""
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationHelpers.py:79
+msgctxt "@message"
+msgid "Could not read response."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
msgstr ""
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationRequestHandler.py:66
+msgctxt "@message"
+msgid "Please give the required permissions when authorizing this application."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationRequestHandler.py:73
+msgctxt "@message"
+msgid "Something unexpected happened when trying to log in, please try again."
+msgstr ""
+
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
msgid "Multiplying and placing objects"
@@ -1217,7 +1233,7 @@ msgstr ""
#: /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
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:149
msgctxt "@info:status"
msgid "Unable to find a location within the build volume for all objects"
msgstr "Kaikille kappaleille ei löydy paikkaa tulostustilavuudessa."
@@ -1228,19 +1244,19 @@ msgid "Placing Object"
msgstr "Sijoitetaan kappaletta"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:30
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:67
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:66
msgctxt "@info:status"
msgid "Finding new location for objects"
msgstr "Uusien paikkojen etsiminen kappaleille"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:34
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:71
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:70
msgctxt "@info:title"
msgid "Finding Location"
msgstr "Etsitään paikkaa"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:104
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:151
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:150
msgctxt "@info:title"
msgid "Can't Find Location"
msgstr "Paikkaa ei löydy"
@@ -1363,242 +1379,195 @@ msgstr ""
#: /home/ruben/Projects/Cura/cura/CrashHandler.py:322
msgctxt "@title:groupbox"
-msgid "User description"
+msgid "User description (Note: Developers may not speak your language, please use English if possible)"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/CrashHandler.py:341
+#: /home/ruben/Projects/Cura/cura/CrashHandler.py:342
msgctxt "@action:button"
msgid "Send report"
msgstr ""
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:480
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:504
msgctxt "@info:progress"
msgid "Loading machines..."
msgstr "Ladataan laitteita..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:781
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:819
msgctxt "@info:progress"
msgid "Setting up scene..."
msgstr "Asetetaan näkymää..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:817
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:854
msgctxt "@info:progress"
msgid "Loading interface..."
msgstr "Ladataan käyttöliittymää..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1059
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1133
#, python-format
msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm."
msgid "%(width).1f x %(depth).1f x %(height).1f mm"
msgstr "%(width).1f x %(depth).1f x %(height).1f mm"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1618
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1611
#, python-brace-format
msgctxt "@info:status"
msgid "Only one G-code file can be loaded at a time. Skipped importing {0}"
msgstr "Vain yksi G-code-tiedosto voidaan ladata kerralla. Tiedoston {0} tuonti ohitettiin."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1628
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1621
#, python-brace-format
msgctxt "@info:status"
msgid "Can't open any other file if G-code is loading. Skipped importing {0}"
msgstr "Muita tiedostoja ei voida ladata, kun G-code latautuu. Tiedoston {0} tuonti ohitettiin."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1718
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1711
msgctxt "@info:status"
msgid "The selected model was too small to load."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:62
-msgctxt "@title"
-msgid "Machine Settings"
-msgstr "Laitteen asetukset"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:81
-msgctxt "@title:tab"
-msgid "Printer"
-msgstr "Tulostin"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:100
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:58
+msgctxt "@title:label"
msgid "Printer Settings"
-msgstr "Tulostimen asetukset"
+msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:111
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:72
msgctxt "@label"
msgid "X (Width)"
msgstr "X (leveys)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:112
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:122
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:132
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:238
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:387
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:403
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:429
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:441
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:897
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:76
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:90
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:104
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:194
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:213
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:232
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:253
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:272
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:79
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:93
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:109
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:124
msgctxt "@label"
msgid "mm"
msgstr "mm"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:121
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:86
msgctxt "@label"
msgid "Y (Depth)"
msgstr "Y (syvyys)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:131
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:100
msgctxt "@label"
msgid "Z (Height)"
msgstr "Z (korkeus)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:143
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:114
msgctxt "@label"
msgid "Build plate shape"
msgstr "Alustan muoto"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:152
-msgctxt "@option:check"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:127
+msgctxt "@label"
msgid "Origin at center"
-msgstr "Alkukohta keskellä"
+msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:160
-msgctxt "@option:check"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:139
+msgctxt "@label"
msgid "Heated bed"
-msgstr "Lämmitettävä pöytä"
+msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:171
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:151
msgctxt "@label"
msgid "G-code flavor"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:184
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:176
+msgctxt "@title:label"
msgid "Printhead Settings"
-msgstr "Tulostuspään asetukset"
+msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:194
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:190
msgctxt "@label"
msgid "X min"
msgstr "X väh."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:195
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Etäisyys tulostuspään vasemmalta puolelta suuttimen keskikohtaan. Käytetään estämään aiempien tulosteiden ja tulostuspään yhteentörmäyksiä, kun tulostetaan yksi kerrallaan."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:204
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:209
msgctxt "@label"
msgid "Y min"
msgstr "Y väh."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:205
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Etäisyys tulostuspään etupuolelta suuttimen keskikohtaan. Käytetään estämään aiempien tulosteiden ja tulostuspään yhteentörmäyksiä, kun tulostetaan yksi kerrallaan."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:214
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:228
msgctxt "@label"
msgid "X max"
msgstr "X enint."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:215
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Etäisyys tulostuspään oikealta puolelta suuttimen keskikohtaan. Käytetään estämään aiempien tulosteiden ja tulostuspään yhteentörmäyksiä, kun tulostetaan yksi kerrallaan."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:224
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:249
msgctxt "@label"
msgid "Y max"
msgstr "Y enint."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:225
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Etäisyys tulostuspään takapuolelta suuttimen keskikohtaan. Käytetään estämään aiempien tulosteiden ja tulostuspään yhteentörmäyksiä, kun tulostetaan yksi kerrallaan."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:237
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:268
msgctxt "@label"
-msgid "Gantry height"
-msgstr "Korokkeen korkeus"
+msgid "Gantry Height"
+msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:239
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Suuttimen kärjen ja korokejärjestelmän (X- ja Y-akselit) välinen korkeusero. Käytetään estämään aiempien tulosteiden ja korokkeen yhteentörmäyksiä, kun tulostetaan yksi kerrallaan."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:258
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:282
msgctxt "@label"
msgid "Number of Extruders"
msgstr "Suulakkeiden määrä"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:314
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:341
+msgctxt "@title:label"
msgid "Start G-code"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:324
-msgctxt "@tooltip"
-msgid "G-code commands to be executed at the very start."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:333
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:355
+msgctxt "@title:label"
msgid "End G-code"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:343
-msgctxt "@tooltip"
-msgid "G-code commands to be executed at the very end."
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:42
+msgctxt "@title:tab"
+msgid "Printer"
+msgstr "Tulostin"
+
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:63
+msgctxt "@title:label"
+msgid "Nozzle Settings"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:374
-msgctxt "@label"
-msgid "Nozzle Settings"
-msgstr "Suutinasetukset"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:386
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:75
msgctxt "@label"
msgid "Nozzle size"
msgstr "Suuttimen koko"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:402
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:89
msgctxt "@label"
msgid "Compatible material diameter"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:404
-msgctxt "@tooltip"
-msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile."
-msgstr "Tulostimen tukema tulostuslangan nimellinen halkaisija. Materiaali ja/tai profiili korvaa tarkan halkaisijan."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:428
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:105
msgctxt "@label"
msgid "Nozzle offset X"
msgstr "Suuttimen X-siirtymä"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:440
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:120
msgctxt "@label"
msgid "Nozzle offset Y"
msgstr "Suuttimen Y-siirtymä"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:452
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:135
msgctxt "@label"
msgid "Cooling Fan Number"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:453
-msgctxt "@label"
-msgid ""
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:473
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:162
+msgctxt "@title:label"
msgid "Extruder Start G-code"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:491
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:176
+msgctxt "@title:label"
msgid "Extruder End G-code"
msgstr ""
@@ -1608,7 +1577,7 @@ msgid "Install"
msgstr ""
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:20
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:44
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:46
msgctxt "@action:button"
msgid "Installed"
msgstr "Asennettu"
@@ -1624,15 +1593,15 @@ msgid "ratings"
msgstr ""
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:30
msgctxt "@title:tab"
msgid "Plugins"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:69
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:42
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:66
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:361
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:70
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:44
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:80
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:417
msgctxt "@title:tab"
msgid "Materials"
msgstr "Materiaalit"
@@ -1642,52 +1611,49 @@ msgctxt "@label"
msgid "Your rating"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:99
msgctxt "@label"
msgid "Version"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:105
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:106
msgctxt "@label"
msgid "Last updated"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:112
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:260
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:113
msgctxt "@label"
msgid "Author"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:119
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:120
msgctxt "@label"
msgid "Downloads"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:181
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:222
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:265
-msgctxt "@label"
-msgid "Unknown"
-msgstr "Tuntematon"
-
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:56
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:73
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:80
+msgctxt "@label:The string between and is the highlighted link"
+msgid "Buy material spools"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:96
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
msgctxt "@action:button"
msgid "Update"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:74
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:97
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:35
msgctxt "@action:button"
msgid "Updating"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:75
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:98
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:36
msgctxt "@action:button"
msgid "Updated"
@@ -1763,7 +1729,7 @@ msgctxt "@label"
msgid "Generic Materials"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:56
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:59
msgctxt "@title:tab"
msgid "Installed"
msgstr ""
@@ -1846,12 +1812,12 @@ msgctxt "@info"
msgid "Fetching packages..."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:90
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:91
msgctxt "@label"
msgid "Website"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:97
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:98
msgctxt "@label"
msgid "Email"
msgstr ""
@@ -1861,22 +1827,6 @@ msgctxt "@info:tooltip"
msgid "Some things could be problematic in this print. Click to see tips for adjustment."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18
-msgctxt "@label"
-msgid "Changelog"
-msgstr "Muutosloki"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:185
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:85
-#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:482
-#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:508
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:168
-msgctxt "@action:button"
-msgid "Close"
-msgstr "Sulje"
-
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:31
msgctxt "@title"
msgid "Update Firmware"
@@ -1952,15 +1902,17 @@ msgctxt "@label"
msgid "Firmware update failed due to missing firmware."
msgstr "Laiteohjelmiston päivitys epäonnistui puuttuvan laiteohjelmiston takia."
-#: /home/ruben/Projects/Cura/plugins/UserAgreement/UserAgreement.qml:16
-msgctxt "@title:window"
-msgid "User Agreement"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:144
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:181
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:153
+msgctxt "@label"
+msgid "Glass"
msgstr ""
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:208
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:249
msgctxt "@info"
-msgid "These options are not available because you are monitoring a cloud printer."
+msgid "Please update your printer's firmware to manage the queue remotely."
msgstr ""
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:241
@@ -1968,22 +1920,22 @@ msgctxt "@info"
msgid "The webcam is not available because you are monitoring a cloud printer."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:300
msgctxt "@label:status"
msgid "Loading..."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:304
msgctxt "@label:status"
msgid "Unavailable"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:308
msgctxt "@label:status"
msgid "Unreachable"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:312
msgctxt "@label:status"
msgid "Idle"
msgstr ""
@@ -1993,37 +1945,31 @@ msgctxt "@label"
msgid "Untitled"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:374
msgctxt "@label"
msgid "Anonymous"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:401
msgctxt "@label:status"
msgid "Requires configuration changes"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:439
msgctxt "@action:button"
msgid "Details"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:130
msgctxt "@label"
msgid "Unavailable printer"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "First available"
msgstr ""
-#: /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 ""
-
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:31
msgctxt "@label"
msgid "Queued"
@@ -2031,181 +1977,189 @@ msgstr "Jonossa"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:67
msgctxt "@label link to connect manager"
-msgid "Go to Cura Connect"
+msgid "Manage in browser"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:100
msgctxt "@label"
-msgid "Print jobs"
+msgid "There are no print jobs in the queue. Slice and send a job to add one."
msgstr ""
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
+msgid "Print jobs"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:132
+msgctxt "@label"
msgid "Total print time"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:148
msgctxt "@label"
msgid "Waiting for"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:246
-msgctxt "@label link to connect manager"
-msgid "View print history"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:50
msgctxt "@window:title"
msgid "Existing Connection"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:48
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:52
msgctxt "@message:text"
msgid "This printer/group is already added to Cura. Please select another printer/group."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:65
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:69
msgctxt "@title:window"
msgid "Connect to Networked Printer"
msgstr "Yhdistä verkkotulostimeen"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:77
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:81
msgctxt "@label"
-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:"
+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."
msgstr ""
-"Tulosta suoraan tulostimeen verkon kautta yhdistämällä tulostin verkkoon verkkokaapelilla tai yhdistämällä tulostin Wi-Fi-verkkoon. Jos Curaa ei yhdistetä tulostimeen, GCode-tiedostot voidaan silti siirtää tulostimeen USB-aseman avulla.\n"
-"\n"
-"Valitse tulostin alla olevasta luettelosta:"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44
-msgctxt "@action:button"
-msgid "Add"
-msgstr "Lisää"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:81
+msgctxt "@label"
+msgid "Select your printer from the list below:"
+msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:97
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:101
msgctxt "@action:button"
msgid "Edit"
msgstr "Muokkaa"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:108
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:128
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:117
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:112
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:146
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:55
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:121
msgctxt "@action:button"
msgid "Remove"
msgstr "Poista"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:120
msgctxt "@action:button"
msgid "Refresh"
msgstr "Päivitä"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:211
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:215
msgctxt "@label"
msgid "If your printer is not listed, read the network printing troubleshooting guide"
msgstr "Jos tulostinta ei ole luettelossa, lue verkkotulostuksen vianetsintäopas"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:240
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:244
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:258
msgctxt "@label"
msgid "Type"
msgstr "Tyyppi"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:279
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:283
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:274
msgctxt "@label"
msgid "Firmware version"
msgstr "Laiteohjelmistoversio"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:293
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:297
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:290
msgctxt "@label"
msgid "Address"
msgstr "Osoite"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:317
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
msgctxt "@label"
msgid "This printer is not set up to host a group of printers."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:325
msgctxt "@label"
msgid "This printer is the host for a group of %1 printers."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:332
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:336
msgctxt "@label"
msgid "The printer at this address has not yet responded."
msgstr "Tämän osoitteen tulostin ei ole vielä vastannut."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:337
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:341
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:74
msgctxt "@action:button"
msgid "Connect"
msgstr "Yhdistä"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:351
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:354
+msgctxt "@title:window"
+msgid "Invalid IP address"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:355
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:146
+msgctxt "@text"
+msgid "Please enter a valid IP address."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:366
msgctxt "@title:window"
msgid "Printer Address"
msgstr "Tulostimen osoite"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:374
-msgctxt "@alabel"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:389
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:102
+msgctxt "@label"
msgid "Enter the IP address or hostname of your printer on the network."
-msgstr "Anna verkon tulostimen IP-osoite tai isäntänimi."
+msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:404
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:132
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:419
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:138
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181
msgctxt "@action:button"
msgid "OK"
msgstr "OK"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:88
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:100
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:78
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:90
msgctxt "@label:status"
msgid "Aborted"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:90
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:92
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:80
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:82
msgctxt "@label:status"
msgid "Finished"
msgstr "Valmis"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:94
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:84
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:86
msgctxt "@label:status"
msgid "Preparing..."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:88
msgctxt "@label:status"
msgid "Aborting..."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:92
msgctxt "@label:status"
msgid "Pausing..."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:94
msgctxt "@label:status"
msgid "Paused"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Resuming..."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Action required"
msgstr "Vaatii toimenpiteitä"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:100
msgctxt "@label:status"
msgid "Finishes %1 at %2"
msgstr ""
@@ -2309,44 +2263,44 @@ msgctxt "@action:button"
msgid "Override"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:85
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] ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:68
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:89
msgctxt "@label"
msgid "The printer %1 is assigned, but the job contains an unknown material configuration."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:78
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:99
msgctxt "@label"
msgid "Change material %1 from %2 to %3."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:81
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:102
msgctxt "@label"
msgid "Load %3 as material %1 (This cannot be overridden)."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:84
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:105
msgctxt "@label"
msgid "Change print core %1 from %2 to %3."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:87
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:108
msgctxt "@label"
msgid "Change build plate to %1 (This cannot be overridden)."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:115
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:135
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:156
msgctxt "@label"
msgid "Aluminum"
msgstr ""
@@ -2356,107 +2310,108 @@ msgctxt "@info:tooltip"
msgid "Connect to a printer"
msgstr "Yhdistä tulostimeen"
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:92
+#: /home/ruben/Projects/Cura/plugins/SettingsGuide/resources/qml/SettingsGuide.qml:16
+msgctxt "@title"
+msgid "Cura Settings Guide"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:100
msgctxt "@info"
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."
+"- Check if the printer is connected to the network.\n"
+"- Check if you are signed in to discover cloud-connected printers."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:117
msgctxt "@info"
-msgid "Please select a network connected printer to monitor."
+msgid "Please connect your printer to the network."
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
-msgctxt "@info"
-msgid "Please connect your Ultimaker printer to your local network."
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:156
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:20
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:49
msgctxt "@label"
msgid "Color scheme"
msgstr "Värimalli"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:105
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:107
msgctxt "@label:listbox"
msgid "Material Color"
msgstr "Materiaalin väri"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:109
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:111
msgctxt "@label:listbox"
msgid "Line Type"
msgstr "Linjojen tyyppi"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:113
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:115
msgctxt "@label:listbox"
msgid "Feedrate"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:117
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:119
msgctxt "@label:listbox"
msgid "Layer thickness"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:154
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:156
msgctxt "@label"
msgid "Compatibility Mode"
msgstr "Yhteensopivuustila"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:230
msgctxt "@label"
msgid "Travels"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:236
msgctxt "@label"
msgid "Helpers"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:242
msgctxt "@label"
msgid "Shell"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:248
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
msgctxt "@label"
msgid "Infill"
msgstr "Täyttö"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:297
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:298
msgctxt "@label"
msgid "Only Show Top Layers"
msgstr "Näytä vain yläkerrokset"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:307
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:308
msgctxt "@label"
msgid "Show 5 Detailed Layers On Top"
msgstr "Näytä 5 yksityiskohtaista kerrosta ylhäällä"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:321
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:322
msgctxt "@label"
msgid "Top / Bottom"
msgstr "Yläosa/alaosa"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:325
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:326
msgctxt "@label"
msgid "Inner Wall"
msgstr "Sisäseinämä"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:383
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:384
msgctxt "@label"
msgid "min"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:432
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:433
msgctxt "@label"
msgid "max"
msgstr ""
@@ -2486,29 +2441,24 @@ msgctxt "@info:tooltip"
msgid "Change active post-processing scripts"
msgstr "Muuta aktiivisia jälkikäsittelykomentosarjoja"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:16
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:17
msgctxt "@title:window"
msgid "More information on anonymous data collection"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:66
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:74
msgctxt "@text:window"
-msgid "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."
+msgid "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:"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:109
msgctxt "@text:window"
-msgid "I don't want to send this data"
+msgid "I don't want to send anonymous data"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:118
msgctxt "@text:window"
-msgid "Allow sending this data to Ultimaker and help us improve Cura"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/R2D2/EvaluationSidebar.qml:49
-msgctxt "@label"
-msgid "No print selected"
+msgid "Allow sending anonymous data"
msgstr ""
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
@@ -2558,19 +2508,19 @@ msgstr "Syvyys (mm)"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126
msgctxt "@info:tooltip"
-msgid "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."
-msgstr "Oletuksena valkoiset pikselit edustavat verkossa korkeita pisteitä ja mustat pikselit edustavat verkossa matalia pisteitä. Muuta asetus, jos haluat, että mustat pikselit edustavat verkossa korkeita pisteitä ja valkoiset pikselit edustavat verkossa matalia pisteitä."
-
-#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
-msgctxt "@item:inlistbox"
-msgid "Lighter is higher"
-msgstr "Vaaleampi on korkeampi"
+msgid "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."
+msgstr ""
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
msgctxt "@item:inlistbox"
msgid "Darker is higher"
msgstr "Tummempi on korkeampi"
+#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
+msgctxt "@item:inlistbox"
+msgid "Lighter is higher"
+msgstr "Vaaleampi on korkeampi"
+
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149
msgctxt "@info:tooltip"
msgid "The amount of smoothing to apply to the image."
@@ -2684,7 +2634,7 @@ msgid "Printer Group"
msgstr ""
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:180
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:197
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:226
msgctxt "@action:label"
msgid "Profile settings"
msgstr "Profiilin asetukset"
@@ -2697,19 +2647,19 @@ msgstr "Miten profiilin ristiriita pitäisi ratkaista?"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:121
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:221
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:250
msgctxt "@action:label"
msgid "Name"
msgstr "Nimi"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:231
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:205
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:234
msgctxt "@action:label"
msgid "Not in profile"
msgstr "Ei profiilissa"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:236
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:210
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:239
msgctxt "@action:label"
msgid "%1 override"
msgid_plural "%1 overrides"
@@ -2790,6 +2740,7 @@ msgstr ""
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:51
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:68
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:138
msgctxt "@button"
msgid "Sign in"
msgstr ""
@@ -2880,22 +2831,23 @@ msgid "Previous"
msgstr ""
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:60
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:152
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:174
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:159
msgctxt "@action:button"
msgid "Export"
msgstr "Vie"
-#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:62
-msgctxt "@action:button"
-msgid "Next"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:169
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:209
msgctxt "@label"
msgid "Tip"
msgstr ""
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMaterialMenu.qml:20
+#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:66
+msgctxt "@label:category menu label"
+msgid "Generic"
+msgstr ""
+
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:160
msgctxt "@label"
msgid "Print experiment"
@@ -2906,150 +2858,51 @@ msgctxt "@label"
msgid "Checklist"
msgstr ""
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25
-msgctxt "@title"
-msgid "Select Printer Upgrades"
-msgstr "Valitse tulostimen päivitykset"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:38
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:30
msgctxt "@label"
msgid "Please select any upgrades made to this Ultimaker 2."
msgstr "Valitse tähän Ultimaker 2 -laitteeseen tehdyt päivitykset."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:47
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:44
msgctxt "@label"
msgid "Olsson Block"
msgstr "Olsson Block -lämmitysosa"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:30
msgctxt "@title"
msgid "Build Plate Leveling"
msgstr "Alustan tasaaminen"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:44
msgctxt "@label"
msgid "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."
msgstr "Voit säätää alustaa, jotta tulosteista tulisi hyviä. Kun napsautat \"Siirry seuraavaan positioon\", suutin siirtyy eri positioihin, joita voidaan säätää."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:57
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 "Laita paperinpala kussakin positiossa suuttimen alle ja säädä tulostusalustan korkeus. Tulostusalustan korkeus on oikea, kun suuttimen kärki juuri ja juuri osuu paperiin."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:75
msgctxt "@action:button"
msgid "Start Build Plate Leveling"
msgstr "Aloita alustan tasaaminen"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:87
msgctxt "@action:button"
msgid "Move to Next Position"
msgstr "Siirry seuraavaan positioon"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:30
msgctxt "@label"
msgid "Please select any upgrades made to this Ultimaker Original"
msgstr "Valitse tähän Ultimaker Original -laitteeseen tehdyt päivitykset"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:41
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"
@@ -3100,170 +2953,170 @@ msgctxt "@label"
msgid "Are you sure you want to abort the print?"
msgstr "Haluatko varmasti keskeyttää tulostuksen?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:71
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:73
msgctxt "@title"
msgid "Information"
msgstr "Tiedot"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:100
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:102
msgctxt "@title:window"
msgid "Confirm Diameter Change"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:101
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:103
msgctxt "@label (%1 is a number)"
msgid "The new filament diameter is set to %1 mm, which is not compatible with the current extruder. Do you wish to continue?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:133
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:127
msgctxt "@label"
msgid "Display Name"
msgstr "Näytä nimi"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:143
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:137
msgctxt "@label"
msgid "Brand"
msgstr "Merkki"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:153
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:147
msgctxt "@label"
msgid "Material Type"
msgstr "Materiaalin tyyppi"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:162
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:157
msgctxt "@label"
msgid "Color"
msgstr "Väri"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:212
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:207
msgctxt "@label"
msgid "Properties"
msgstr "Ominaisuudet"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:214
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:209
msgctxt "@label"
msgid "Density"
msgstr "Tiheys"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:229
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:224
msgctxt "@label"
msgid "Diameter"
msgstr "Läpimitta"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:263
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:258
msgctxt "@label"
msgid "Filament Cost"
msgstr "Tulostuslangan hinta"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:280
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:275
msgctxt "@label"
msgid "Filament weight"
msgstr "Tulostuslangan paino"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:298
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:293
msgctxt "@label"
msgid "Filament length"
msgstr "Tulostuslangan pituus"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:307
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:302
msgctxt "@label"
msgid "Cost per Meter"
msgstr "Hinta metriä kohden"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:321
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:316
msgctxt "@label"
msgid "This material is linked to %1 and shares some of its properties."
msgstr "Materiaali on linkitetty kohteeseen %1 ja niillä on joitain samoja ominaisuuksia."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:328
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:323
msgctxt "@label"
msgid "Unlink Material"
msgstr "Poista materiaalin linkitys"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:339
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:334
msgctxt "@label"
msgid "Description"
msgstr "Kuvaus"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:352
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:347
msgctxt "@label"
msgid "Adhesion Information"
msgstr "Tarttuvuustiedot"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:378
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:17
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:373
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label"
msgid "Print settings"
msgstr "Tulostusasetukset"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:84
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:72
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:99
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:40
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:73
msgctxt "@action:button"
msgid "Activate"
msgstr "Aktivoi"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:101
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:117
msgctxt "@action:button"
msgid "Create"
msgstr "Luo"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:114
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:131
msgctxt "@action:button"
msgid "Duplicate"
msgstr "Jäljennös"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:141
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:142
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:160
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:148
msgctxt "@action:button"
msgid "Import"
msgstr "Tuo"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:203
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:223
msgctxt "@action:label"
msgid "Printer"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:262
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:246
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:287
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:253
msgctxt "@title:window"
msgid "Confirm Remove"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:263
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:247
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:254
msgctxt "@label (%1 is object name)"
msgid "Are you sure you wish to remove %1? This cannot be undone!"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:277
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:285
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:304
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:312
msgctxt "@title:window"
msgid "Import Material"
msgstr "Tuo materiaali"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:286
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:313
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Could not import material %1: %2"
msgstr "Materiaalin tuominen epäonnistui: %1: %2"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:317
msgctxt "@info:status Don't translate the XML tag !"
msgid "Successfully imported material %1"
msgstr "Materiaalin tuominen onnistui: %1"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:308
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:316
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:335
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:343
msgctxt "@title:window"
msgid "Export Material"
msgstr "Vie materiaali"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:320
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:347
msgctxt "@info:status Don't translate the XML tags and !"
msgid "Failed to export material to %1: %2"
msgstr "Materiaalin vieminen epäonnistui kohteeseen %1: %2"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:326
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:353
msgctxt "@info:status Don't translate the XML tag !"
msgid "Successfully exported material to %1"
msgstr "Materiaalin vieminen onnistui kohteeseen %1"
@@ -3278,412 +3131,437 @@ msgctxt "@label:textbox"
msgid "Check all"
msgstr "Tarkista kaikki"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:47
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:48
msgctxt "@info:status"
msgid "Calculated"
msgstr "Laskettu"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:61
msgctxt "@title:column"
msgid "Setting"
msgstr "Asetus"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:68
msgctxt "@title:column"
msgid "Profile"
msgstr "Profiili"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:74
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75
msgctxt "@title:column"
msgid "Current"
msgstr "Nykyinen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:82
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:83
msgctxt "@title:column"
msgid "Unit"
msgstr "Yksikkö"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:15
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:354
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:410
msgctxt "@title:tab"
msgid "General"
msgstr "Yleiset"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:126
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:130
msgctxt "@label"
msgid "Interface"
msgstr "Käyttöliittymä"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:137
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:141
msgctxt "@label"
msgid "Language:"
msgstr "Kieli:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:204
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:208
msgctxt "@label"
msgid "Currency:"
msgstr "Valuutta:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:217
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221
msgctxt "@label"
msgid "Theme:"
msgstr "Teema:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:273
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:277
msgctxt "@label"
msgid "You will need to restart the application for these changes to have effect."
msgstr "Sovellus on käynnistettävä uudelleen, jotta nämä muutokset tulevat voimaan."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:294
msgctxt "@info:tooltip"
msgid "Slice automatically when changing settings."
msgstr "Viipaloi automaattisesti, kun asetuksia muutetaan."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:302
msgctxt "@option:check"
msgid "Slice automatically"
msgstr "Viipaloi automaattisesti"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:312
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:316
msgctxt "@label"
msgid "Viewport behavior"
msgstr "Näyttöikkunan käyttäytyminen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:324
msgctxt "@info:tooltip"
msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly."
msgstr "Korosta mallin vailla tukea olevat alueet punaisella. Ilman tukea nämä alueet eivät tulostu kunnolla."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:329
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:333
msgctxt "@option:check"
msgid "Display overhang"
msgstr "Näytä uloke"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:336
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341
msgctxt "@info:tooltip"
msgid "Moves the camera so the model is in the center of the view when a model is selected"
msgstr "Siirtää kameraa siten, että valittuna oleva malli on näkymän keskellä."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:346
msgctxt "@action:button"
msgid "Center camera when item is selected"
msgstr "Keskitä kamera kun kohde on valittu"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:350
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356
msgctxt "@info:tooltip"
msgid "Should the default zoom behavior of cura be inverted?"
msgstr "Pitääkö Curan oletusarvoinen zoom-toimintatapa muuttaa päinvastaiseksi?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:355
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361
msgctxt "@action:button"
msgid "Invert the direction of camera zoom."
msgstr "Käännä kameran zoomin suunta päinvastaiseksi."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:365
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371
msgctxt "@info:tooltip"
msgid "Should zooming move in the direction of the mouse?"
msgstr "Tuleeko zoomauksen siirtyä hiiren suuntaan?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371
+msgctxt "@info:tooltip"
+msgid "Zooming towards the mouse is not supported in the orthogonal perspective."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:376
msgctxt "@action:button"
msgid "Zoom toward mouse direction"
msgstr "Zoomaa hiiren suuntaan"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:380
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402
msgctxt "@info:tooltip"
msgid "Should models on the platform be moved so that they no longer intersect?"
msgstr "Pitäisikö alustalla olevia malleja siirtää niin, etteivät ne enää leikkaa toisiaan?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:385
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:407
msgctxt "@option:check"
msgid "Ensure models are kept apart"
msgstr "Varmista, että mallit ovat erillään"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:394
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416
msgctxt "@info:tooltip"
msgid "Should models on the platform be moved down to touch the build plate?"
msgstr "Pitäisikö tulostusalueella olevia malleja siirtää alas niin, että ne koskettavat tulostusalustaa?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:421
msgctxt "@option:check"
msgid "Automatically drop models to the build plate"
msgstr "Pudota mallit automaattisesti alustalle"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:411
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433
msgctxt "@info:tooltip"
msgid "Show caution message in g-code reader."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:420
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:442
msgctxt "@option:check"
msgid "Caution message in g-code reader"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:428
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:450
msgctxt "@info:tooltip"
msgid "Should layer be forced into compatibility mode?"
msgstr "Pakotetaanko kerros yhteensopivuustilaan?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:455
msgctxt "@option:check"
msgid "Force layer view compatibility mode (restart required)"
msgstr "Pakota kerrosnäkymän yhteensopivuustila (vaatii uudelleenkäynnistyksen)"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:449
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:465
+msgctxt "@info:tooltip"
+msgid "What type of camera rendering should be used?"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:472
+msgctxt "@window:text"
+msgid "Camera rendering: "
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:483
+msgid "Perspective"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:484
+msgid "Orthogonal"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:515
msgctxt "@label"
msgid "Opening and saving files"
msgstr "Tiedostojen avaaminen ja tallentaminen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:456
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522
msgctxt "@info:tooltip"
msgid "Should models be scaled to the build volume if they are too large?"
msgstr "Pitäisikö mallit skaalata tulostustilavuuteen, jos ne ovat liian isoja?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:461
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:527
msgctxt "@option:check"
msgid "Scale large models"
msgstr "Skaalaa suuret mallit"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537
msgctxt "@info:tooltip"
msgid "An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be scaled up?"
msgstr "Malli voi vaikuttaa erittäin pieneltä, jos sen koko on ilmoitettu esimerkiksi metreissä eikä millimetreissä. Pitäisikö nämä mallit suurentaa?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:542
msgctxt "@option:check"
msgid "Scale extremely small models"
msgstr "Skaalaa erittäin pienet mallit"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:486
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:552
msgctxt "@info:tooltip"
msgid "Should models be selected after they are loaded?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:491
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:557
msgctxt "@option:check"
msgid "Select models when loaded"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:567
msgctxt "@info:tooltip"
msgid "Should a prefix based on the printer name be added to the print job name automatically?"
msgstr "Pitäisikö tulostustyön nimeen lisätä automaattisesti tulostimen nimeen perustuva etuliite?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:506
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:572
msgctxt "@option:check"
msgid "Add machine prefix to job name"
msgstr "Lisää laitteen etuliite työn nimeen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:516
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582
msgctxt "@info:tooltip"
msgid "Should a summary be shown when saving a project file?"
msgstr "Näytetäänkö yhteenveto, kun projektitiedosto tallennetaan?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:586
msgctxt "@option:check"
msgid "Show summary dialog when saving project"
msgstr "Näytä yhteenvetoikkuna, kun projekti tallennetaan"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:530
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596
msgctxt "@info:tooltip"
msgid "Default behavior when opening a project file"
msgstr "Projektitiedoston avaamisen oletustoimintatapa"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:538
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:604
msgctxt "@window:text"
msgid "Default behavior when opening a project file: "
msgstr "Projektitiedoston avaamisen oletustoimintatapa: "
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:552
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:618
msgctxt "@option:openProject"
msgid "Always ask me this"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:553
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:619
msgctxt "@option:openProject"
msgid "Always open as a project"
msgstr "Avaa aina projektina"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:554
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620
msgctxt "@option:openProject"
msgid "Always import models"
msgstr "Tuo mallit aina"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:590
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656
msgctxt "@info:tooltip"
msgid "When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want to keep your modifications or not, or you can choose a default behaviour and never show that dialog again."
msgstr "Kun olet tehnyt muutokset profiiliin ja vaihtanut toiseen, näytetään valintaikkuna, jossa kysytään, haluatko säilyttää vai hylätä muutokset. Tässä voit myös valita oletuskäytöksen, jolloin valintaikkunaa ei näytetä uudelleen."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:599
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:665
msgctxt "@label"
msgid "Profiles"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:604
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:670
msgctxt "@window:text"
msgid "Default behavior for changed setting values when switching to a different profile: "
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:618
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:684
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:157
msgctxt "@option:discardOrKeep"
msgid "Always ask me this"
msgstr "Kysy aina"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:619
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685
msgctxt "@option:discardOrKeep"
msgid "Always discard changed settings"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:686
msgctxt "@option:discardOrKeep"
msgid "Always transfer changed settings to new profile"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:654
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:720
msgctxt "@label"
msgid "Privacy"
msgstr "Tietosuoja"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:661
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:727
msgctxt "@info:tooltip"
msgid "Should Cura check for updates when the program is started?"
msgstr "Pitäisikö Curan tarkistaa saatavilla olevat päivitykset, kun ohjelma käynnistetään?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:666
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:732
msgctxt "@option:check"
msgid "Check for updates on start"
msgstr "Tarkista päivitykset käynnistettäessä"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:676
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:742
msgctxt "@info:tooltip"
msgid "Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored."
msgstr "Pitäisikö anonyymejä tietoja tulosteesta lähettää Ultimakerille? Huomaa, että malleja, IP-osoitteita tai muita henkilökohtaisia tietoja ei lähetetä eikä tallenneta."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:681
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:747
msgctxt "@option:check"
msgid "Send (anonymous) print information"
msgstr "Lähetä (anonyymit) tulostustiedot"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:690
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:756
msgctxt "@action:button"
msgid "More information"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:708
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:774
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:27
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ProfileMenu.qml:23
msgctxt "@label"
msgid "Experimental"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:715
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:781
msgctxt "@info:tooltip"
msgid "Use multi build plate functionality"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:720
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:786
msgctxt "@option:check"
msgid "Use multi build plate functionality (restart required)"
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:16
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:359
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:415
msgctxt "@title:tab"
msgid "Printers"
msgstr "Tulostimet"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:129
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:63
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:134
msgctxt "@action:button"
msgid "Rename"
msgstr "Nimeä uudelleen"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:36
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:363
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:419
msgctxt "@title:tab"
msgid "Profiles"
msgstr "Profiilit"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:87
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:89
msgctxt "@label"
msgid "Create"
msgstr "Luo"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:105
msgctxt "@label"
msgid "Duplicate"
msgstr "Jäljennös"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:174
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:181
msgctxt "@title:window"
msgid "Create Profile"
msgstr "Luo profiili"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:183
msgctxt "@info"
msgid "Please provide a name for this profile."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:239
msgctxt "@title:window"
msgid "Duplicate Profile"
msgstr "Monista profiili"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:263
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:270
msgctxt "@title:window"
msgid "Rename Profile"
msgstr "Nimeä profiili uudelleen"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:276
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:283
msgctxt "@title:window"
msgid "Import Profile"
msgstr "Profiilin tuonti"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:302
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:309
msgctxt "@title:window"
msgid "Export Profile"
msgstr "Profiilin vienti"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:357
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:364
msgctxt "@label %1 is printer name"
msgid "Printer: %1"
msgstr "Tulostin: %1"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:420
msgctxt "@label"
msgid "Default profiles"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:420
msgctxt "@label"
msgid "Custom profiles"
msgstr "Mukautetut profiilit"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:490
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:500
msgctxt "@action:button"
msgid "Update profile with current settings/overrides"
msgstr "Päivitä nykyiset asetukset tai ohitukset profiiliin"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:497
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:507
msgctxt "@action:button"
msgid "Discard current changes"
msgstr "Hylkää tehdyt muutokset"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:514
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:524
msgctxt "@action:label"
msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below."
msgstr "Tässä profiilissa käytetään tulostimen oletusarvoja, joten siinä ei ole alla olevan listan asetuksia tai ohituksia."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:521
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:531
msgctxt "@action:label"
msgid "Your current settings match the selected profile."
msgstr "Nykyiset asetukset vastaavat valittua profiilia."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:540
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:550
msgctxt "@title:tab"
msgid "Global Settings"
msgstr "Yleiset asetukset"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:89
msgctxt "@action:button"
msgid "Marketplace"
msgstr ""
@@ -3726,12 +3604,12 @@ msgctxt "@title:menu menubar:toplevel"
msgid "&Help"
msgstr "&Ohje"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:123
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:124
msgctxt "@title:window"
msgid "New project"
msgstr "Uusi projekti"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:124
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:125
msgctxt "@info:question"
msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings."
msgstr "Haluatko varmasti aloittaa uuden projektin? Se tyhjentää alustan ja kaikki tallentamattomat asetukset."
@@ -3746,33 +3624,33 @@ msgctxt "@label:textbox"
msgid "search settings"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:466
msgctxt "@action:menu"
msgid "Copy value to all extruders"
msgstr "Kopioi arvo kaikkiin suulakepuristimiin"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:474
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:475
msgctxt "@action:menu"
msgid "Copy all changed values to all extruders"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512
msgctxt "@action:menu"
msgid "Hide this setting"
msgstr "Piilota tämä asetus"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:529
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:525
msgctxt "@action:menu"
msgid "Don't show this setting"
msgstr "Älä näytä tätä asetusta"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:533
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:529
msgctxt "@action:menu"
msgid "Keep this setting visible"
msgstr "Pidä tämä asetus näkyvissä"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:557
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:548
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:434
msgctxt "@action:menu"
msgid "Configure setting visibility..."
msgstr "Määritä asetusten näkyvyys..."
@@ -3788,27 +3666,32 @@ msgstr ""
"\n"
"Tee asetuksista näkyviä napsauttamalla."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:81
+msgctxt "@label"
+msgid "This setting is not used because all the settings that it influences are overridden."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:86
msgctxt "@label Header for list of settings."
msgid "Affects"
msgstr "Koskee seuraavia:"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:71
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:91
msgctxt "@label Header for list of settings."
msgid "Affected By"
msgstr "Riippuu seuraavista:"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:166
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186
msgctxt "@label"
msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:170
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190
msgctxt "@label"
msgid "The value is resolved from per-extruder values "
msgstr "Arvo perustuu suulakepuristimien arvoihin "
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:208
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:228
msgctxt "@label"
msgid ""
"This setting has a value that is different from the profile.\n"
@@ -3819,7 +3702,7 @@ msgstr ""
"\n"
"Palauta profiilin arvo napsauttamalla."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:302
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:322
msgctxt "@label"
msgid ""
"This setting is normally calculated, but it currently has an absolute value set.\n"
@@ -3830,12 +3713,12 @@ msgstr ""
"\n"
"Palauta laskettu arvo napsauttamalla."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:144
msgctxt "@button"
msgid "Recommended"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:158
msgctxt "@button"
msgid "Custom"
msgstr ""
@@ -3850,27 +3733,22 @@ msgctxt "@label"
msgid "Gradual infill will gradually increase the amount of infill towards the top."
msgstr "Asteittainen täyttö lisää täytön tiheyttä vähitellen yläosaa kohti."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:30
msgctxt "@label"
msgid "Support"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:71
msgctxt "@label"
msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing."
msgstr "Muodosta rakenteita, jotka tukevat mallin ulokkeita sisältäviä osia. Ilman tukirakenteita kyseiset osat luhistuvat tulostuksen aikana."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:136
-msgctxt "@label"
-msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air."
-msgstr "Valitse tukena käytettävä suulakepuristin. Näin mallin alle rakennetaan tukirakenteita estämään mallin painuminen tai tulostuminen ilmaan."
-
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:29
msgctxt "@label"
msgid "Adhesion"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:74
msgctxt "@label"
msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards."
msgstr "Ota reunuksen tai pohjaristikon tulostus käyttöön. Tämä lisää kappaleen ympärille tai alle tasaisen alueen, joka on helppo leikata pois myöhemmin."
@@ -3887,7 +3765,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"
+msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile."
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
@@ -3921,9 +3799,9 @@ msgstr ""
"\n"
"Avaa profiilin hallinta napsauttamalla."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:21
msgctxt "@label shown when we load a Gcode file"
-msgid "Print setup disabled. G code file can not be modified."
+msgid "Print setup disabled. G-code file can not be modified."
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
@@ -3956,7 +3834,7 @@ msgctxt "@label"
msgid "Send G-code"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:364
+#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:365
msgctxt "@tooltip of G-code command input"
msgid "Send a custom G-code command to the connected printer. Press 'enter' to send the command."
msgstr ""
@@ -4053,11 +3931,6 @@ msgctxt "@label:category menu label"
msgid "Favorites"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:66
-msgctxt "@label:category menu label"
-msgid "Generic"
-msgstr ""
-
#: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25
msgctxt "@label:category menu label"
msgid "Network enabled printers"
@@ -4073,32 +3946,32 @@ msgctxt "@title:menu menubar:settings"
msgid "&Printer"
msgstr "&Tulostin"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:26
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:32
msgctxt "@title:menu"
msgid "&Material"
msgstr "&Materiaali"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:35
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:41
msgctxt "@action:inmenu"
msgid "Set as Active Extruder"
msgstr "Aseta aktiiviseksi suulakepuristimeksi"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:41
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:47
msgctxt "@action:inmenu"
msgid "Enable Extruder"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:48
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:54
msgctxt "@action:inmenu"
msgid "Disable Extruder"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:62
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:68
msgctxt "@title:menu"
msgid "&Build plate"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:65
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:71
msgctxt "@title:settings"
msgid "&Profile"
msgstr "&Profiili"
@@ -4108,7 +3981,22 @@ msgctxt "@action:inmenu menubar:view"
msgid "&Camera position"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:35
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:44
+msgctxt "@action:inmenu menubar:view"
+msgid "Camera view"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:47
+msgctxt "@action:inmenu menubar:view"
+msgid "Perspective"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:59
+msgctxt "@action:inmenu menubar:view"
+msgid "Orthographic"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:80
msgctxt "@action:inmenu menubar:view"
msgid "&Build plate"
msgstr ""
@@ -4172,12 +4060,7 @@ msgctxt "@label"
msgid "Select configuration"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
-msgctxt "@label"
-msgid "See the material compatibility chart"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:221
msgctxt "@label"
msgid "Configurations"
msgstr ""
@@ -4202,17 +4085,17 @@ msgctxt "@label"
msgid "Printer"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:213
msgctxt "@label"
msgid "Enabled"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:250
msgctxt "@label"
msgid "Material"
msgstr "Materiaali"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:375
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
msgstr ""
@@ -4232,42 +4115,47 @@ msgctxt "@title:menu menubar:file"
msgid "Open &Recent"
msgstr "Avaa &viimeisin"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:145
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:140
msgctxt "@label"
msgid "Active print"
msgstr "Aktiivinen tulostustyö"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:153
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:148
msgctxt "@label"
msgid "Job Name"
msgstr "Työn nimi"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:161
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:156
msgctxt "@label"
msgid "Printing Time"
msgstr "Tulostusaika"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:169
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:164
msgctxt "@label"
msgid "Estimated time left"
msgstr "Aikaa jäljellä arviolta"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
-msgid "View types"
+msgid "View type"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
+#: /home/ruben/Projects/Cura/resources/qml/ObjectSelector.qml:59
msgctxt "@label"
-msgid "Hi "
+msgid "Object list"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:22
+msgctxt "@label The argument is a username."
+msgid "Hi %1"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:33
msgctxt "@button"
msgid "Ultimaker account"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:42
msgctxt "@button"
msgid "Sign out"
msgstr ""
@@ -4277,11 +4165,6 @@ msgctxt "@action:button"
msgid "Sign in"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
-msgctxt "@label"
-msgid "Ultimaker Cloud"
-msgstr ""
-
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
@@ -4292,7 +4175,7 @@ msgctxt "@text"
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"
+"- Get exclusive access to print profiles from leading brands"
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
@@ -4305,49 +4188,54 @@ msgctxt "@label"
msgid "No time estimation available"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:77
msgctxt "@label"
msgid "No cost estimation available"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:127
msgctxt "@button"
msgid "Preview"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:55
msgctxt "@label:PrintjobStatus"
msgid "Slicing..."
msgstr "Viipaloidaan..."
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:61
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:67
msgctxt "@label:PrintjobStatus"
-msgid "Unable to Slice"
-msgstr "Viipalointi ei onnistu"
+msgid "Unable to slice"
+msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:103
+msgctxt "@button"
+msgid "Processing"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:103
msgctxt "@button"
msgid "Slice"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:104
msgctxt "@label"
msgid "Start the slicing process"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:118
msgctxt "@button"
msgid "Cancel"
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
-msgid "Time specification"
+msgid "Time estimation"
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
-msgid "Material specification"
+msgid "Material estimation"
msgstr ""
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
@@ -4370,285 +4258,299 @@ msgctxt "@label"
msgid "Preset printers"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
+#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:166
msgctxt "@button"
msgid "Add printer"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
+#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:182
msgctxt "@button"
msgid "Manage printers"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:81
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:88
msgctxt "@action:inmenu"
msgid "Toggle Full Screen"
msgstr "Vaihda koko näyttöön"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:92
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96
+msgctxt "@action:inmenu"
+msgid "Exit Full Screen"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:103
msgctxt "@action:inmenu menubar:edit"
msgid "&Undo"
msgstr "&Kumoa"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:113
msgctxt "@action:inmenu menubar:edit"
msgid "&Redo"
msgstr "Tee &uudelleen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:112
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:123
msgctxt "@action:inmenu menubar:file"
msgid "&Quit"
msgstr "&Lopeta"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:120
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:131
msgctxt "@action:inmenu menubar:view"
msgid "3D View"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138
msgctxt "@action:inmenu menubar:view"
msgid "Front View"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:145
msgctxt "@action:inmenu menubar:view"
msgid "Top View"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:141
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:152
msgctxt "@action:inmenu menubar:view"
msgid "Left Side View"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:148
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:159
msgctxt "@action:inmenu menubar:view"
msgid "Right Side View"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:155
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:166
msgctxt "@action:inmenu"
msgid "Configure Cura..."
msgstr "Määritä Curan asetukset..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:173
msgctxt "@action:inmenu menubar:printer"
msgid "&Add Printer..."
msgstr "L&isää tulostin..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179
msgctxt "@action:inmenu menubar:printer"
msgid "Manage Pr&inters..."
msgstr "Tulostinten &hallinta..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186
msgctxt "@action:inmenu"
msgid "Manage Materials..."
msgstr "Hallitse materiaaleja..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:184
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:195
msgctxt "@action:inmenu menubar:profile"
msgid "&Update profile with current settings/overrides"
msgstr "&Päivitä nykyiset asetukset tai ohitukset profiiliin"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:192
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203
msgctxt "@action:inmenu menubar:profile"
msgid "&Discard current changes"
msgstr "&Hylkää tehdyt muutokset"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:204
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:215
msgctxt "@action:inmenu menubar:profile"
msgid "&Create profile from current settings/overrides..."
msgstr "&Luo profiili nykyisten asetusten tai ohitusten perusteella..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:221
msgctxt "@action:inmenu menubar:profile"
msgid "Manage Profiles..."
msgstr "Profiilien hallinta..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:229
msgctxt "@action:inmenu menubar:help"
msgid "Show Online &Documentation"
msgstr "Näytä sähköinen &dokumentaatio"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:237
msgctxt "@action:inmenu menubar:help"
msgid "Report a &Bug"
msgstr "Ilmoita &virheestä"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:245
+msgctxt "@action:inmenu menubar:help"
+msgid "What's New"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:251
msgctxt "@action:inmenu menubar:help"
msgid "About..."
msgstr "Tietoja..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:241
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258
msgctxt "@action:inmenu menubar:edit"
msgid "Delete Selected Model"
msgid_plural "Delete Selected Models"
msgstr[0] "Poista valittu malli"
msgstr[1] "Poista valitut mallit"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:251
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:268
msgctxt "@action:inmenu menubar:edit"
msgid "Center Selected Model"
msgid_plural "Center Selected Models"
msgstr[0] "Keskitä valittu malli"
msgstr[1] "Keskitä valitut mallit"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277
msgctxt "@action:inmenu menubar:edit"
msgid "Multiply Selected Model"
msgid_plural "Multiply Selected Models"
msgstr[0] "Kerro valittu malli"
msgstr[1] "Kerro valitut mallit"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:286
msgctxt "@action:inmenu"
msgid "Delete Model"
msgstr "Poista malli"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294
msgctxt "@action:inmenu"
msgid "Ce&nter Model on Platform"
msgstr "Ke&skitä malli alustalle"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:283
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:300
msgctxt "@action:inmenu menubar:edit"
msgid "&Group Models"
msgstr "&Ryhmittele mallit"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:303
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:320
msgctxt "@action:inmenu menubar:edit"
msgid "Ungroup Models"
msgstr "Poista mallien ryhmitys"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:313
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:330
msgctxt "@action:inmenu menubar:edit"
msgid "&Merge Models"
msgstr "&Yhdistä mallit"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:340
msgctxt "@action:inmenu"
msgid "&Multiply Model..."
msgstr "&Kerro malli..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:330
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:347
msgctxt "@action:inmenu menubar:edit"
msgid "Select All Models"
msgstr "Valitse kaikki mallit"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:340
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:357
msgctxt "@action:inmenu menubar:edit"
msgid "Clear Build Plate"
msgstr "Tyhjennä tulostusalusta"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:367
msgctxt "@action:inmenu menubar:file"
msgid "Reload All Models"
msgstr "Lataa kaikki mallit uudelleen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:359
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:376
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange All Models To All Build Plates"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:383
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange All Models"
msgstr "Järjestä kaikki mallit"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:374
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:391
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange Selection"
msgstr "Järjestä valinta"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:381
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:398
msgctxt "@action:inmenu menubar:edit"
msgid "Reset All Model Positions"
msgstr "Määritä kaikkien mallien positiot uudelleen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:388
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:405
msgctxt "@action:inmenu menubar:edit"
msgid "Reset All Model Transformations"
msgstr "Määritä kaikkien mallien muutokset uudelleen"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:412
msgctxt "@action:inmenu menubar:file"
msgid "&Open File(s)..."
msgstr "&Avaa tiedosto(t)..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:403
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:420
msgctxt "@action:inmenu menubar:file"
msgid "&New Project..."
msgstr "&Uusi projekti..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:427
msgctxt "@action:inmenu menubar:help"
msgid "Show Configuration Folder"
msgstr "Näytä määrityskansio"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:441
msgctxt "@action:menu"
msgid "&Marketplace"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:24
msgctxt "@title:window"
msgid "Ultimaker Cura"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:181
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232
msgctxt "@label"
msgid "This package will be installed after restarting."
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:357
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:413
msgctxt "@title:tab"
msgid "Settings"
msgstr "Asetukset"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:486
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:539
msgctxt "@title:window"
msgid "Closing Cura"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:487
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:499
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:540
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:552
msgctxt "@label"
msgid "Are you sure you want to exit Cura?"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:531
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:590
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:19
msgctxt "@title:window"
msgid "Open file(s)"
msgstr "Avaa tiedosto(t)"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:632
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:691
msgctxt "@window:title"
msgid "Install Package"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:640
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:699
msgctxt "@title:window"
msgid "Open File(s)"
msgstr "Avaa tiedosto(t)"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:643
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:702
msgctxt "@text:window"
msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one."
msgstr "Löysimme vähintään yhden Gcode-tiedoston valitsemiesi tiedostojen joukosta. Voit avata vain yhden Gcode-tiedoston kerrallaan. Jos haluat avata Gcode-tiedoston, valitse vain yksi."
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:713
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:18
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:805
msgctxt "@title:window"
msgid "Add Printer"
msgstr "Lisää tulostin"
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:813
+msgctxt "@title:window"
+msgid "What's New"
+msgstr ""
+
#: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16
msgctxt "@label %1 is filled in with the name of an extruder"
msgid "Print Selected Model with %1"
@@ -4710,34 +4612,6 @@ msgctxt "@action:button"
msgid "Create New Profile"
msgstr "Luo uusi profiili"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
-msgctxt "@title:tab"
-msgid "Add a printer to Cura"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
-msgctxt "@title:tab"
-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 ""
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:249
-msgctxt "@label"
-msgid "Manufacturer"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
-msgctxt "@label"
-msgid "Printer Name"
-msgstr ""
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
-msgctxt "@action:button"
-msgid "Add Printer"
-msgstr "Lisää tulostin"
-
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:15
msgctxt "@title:window"
msgid "About Cura"
@@ -4897,27 +4771,32 @@ msgctxt "@title:window"
msgid "Save Project"
msgstr "Tallenna projekti"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:138
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:149
msgctxt "@action:label"
msgid "Build plate"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:170
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:183
msgctxt "@action:label"
msgid "Extruder %1"
msgstr "Suulake %1"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:180
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:198
msgctxt "@action:label"
msgid "%1 & material"
msgstr "%1 & materiaali"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:243
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:200
+msgctxt "@action:label"
+msgid "Material"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:272
msgctxt "@action:label"
msgid "Don't show project summary on save again"
msgstr "Älä näytä projektin yhteenvetoa tallennettaessa"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:262
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:291
msgctxt "@action:button"
msgid "Save"
msgstr "Tallenna"
@@ -4947,31 +4826,842 @@ msgctxt "@action:button"
msgid "Import models"
msgstr "Tuo mallit"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:210
-msgctxt "@option:check"
-msgid "See only current build plate"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DropDownWidget.qml:93
+msgctxt "@label"
+msgid "Empty"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:226
-msgctxt "@action:button"
-msgid "Arrange to all build plates"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:24
+msgctxt "@label"
+msgid "Add a printer"
msgstr ""
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:246
-msgctxt "@action:button"
-msgid "Arrange current build plate"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:39
+msgctxt "@label"
+msgid "Add a networked printer"
msgstr ""
-#: X3GWriter/plugin.json
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:81
+msgctxt "@label"
+msgid "Add a non-networked printer"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:70
+msgctxt "@label"
+msgid "Add printer by IP address"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:133
+msgctxt "@text"
+msgid "Place enter your printer's IP address."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:158
+msgctxt "@button"
+msgid "Add"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:204
+msgctxt "@label"
+msgid "Could not connect to device."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:208
+msgctxt "@label"
+msgid "The printer at this address has not responded yet."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:240
+msgctxt "@label"
+msgid "This printer cannot be added because it's an unknown printer or it's not the host of a group."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:329
+msgctxt "@button"
+msgid "Back"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:342
+msgctxt "@button"
+msgid "Connect"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/FirstStartMachineActionsContent.qml:77
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:123
+msgctxt "@button"
+msgid "Next"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:23
+msgctxt "@label"
+msgid "User Agreement"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:56
+msgctxt "@button"
+msgid "Agree"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:70
+msgctxt "@button"
+msgid "Decline and close"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:24
+msgctxt "@label"
+msgid "Help us to improve Ultimaker Cura"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:57
+msgctxt "@text"
+msgid "Ultimaker Cura collects anonymous data to improve print quality and user experience, including:"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:71
+msgctxt "@text"
+msgid "Machine types"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:77
+msgctxt "@text"
+msgid "Material usage"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:83
+msgctxt "@text"
+msgid "Number of slices"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:89
+msgctxt "@text"
+msgid "Print settings"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:102
+msgctxt "@text"
+msgid "Data collected by Ultimaker Cura will not contain any personal information."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:103
+msgctxt "@text"
+msgid "More information"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WhatsNewContent.qml:24
+msgctxt "@label"
+msgid "What's new in Ultimaker Cura"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:42
+msgctxt "@label"
+msgid "There is no printer found over your network."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:179
+msgctxt "@label"
+msgid "Refresh"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:190
+msgctxt "@label"
+msgid "Add printer by IP"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:223
+msgctxt "@label"
+msgid "Troubleshooting"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:207
+msgctxt "@label"
+msgid "Printer name"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:220
+msgctxt "@text"
+msgid "Please give your printer a name"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:36
+msgctxt "@label"
+msgid "Ultimaker Cloud"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:77
+msgctxt "@text"
+msgid "The next generation 3D printing workflow"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:94
+msgctxt "@text"
+msgid "- Send print jobs to Ultimaker printers outside your local network"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:97
+msgctxt "@text"
+msgid "- Store your Ultimaker Cura settings in the cloud for use anywhere"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:100
+msgctxt "@text"
+msgid "- Get exclusive access to print profiles from leading brands"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:119
+msgctxt "@button"
+msgid "Finish"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:128
+msgctxt "@button"
+msgid "Create an account"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:29
+msgctxt "@label"
+msgid "Welcome to Ultimaker Cura"
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:47
+msgctxt "@text"
+msgid ""
+"Please follow these steps to set up\n"
+"Ultimaker Cura. This will only take a few moments."
+msgstr ""
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:58
+msgctxt "@button"
+msgid "Get started"
+msgstr ""
+
+#: MachineSettingsAction/plugin.json
msgctxt "description"
-msgid "Allows saving the resulting slice as an X3G file, to support printers that read this format (Malyan, Makerbot and other Sailfish-based printers)."
+msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)."
msgstr ""
-#: X3GWriter/plugin.json
+#: MachineSettingsAction/plugin.json
msgctxt "name"
-msgid "X3GWriter"
+msgid "Machine Settings action"
+msgstr "Laitteen asetukset -toiminto"
+
+#: Toolbox/plugin.json
+msgctxt "description"
+msgid "Find, manage and install new Cura packages."
msgstr ""
+#: Toolbox/plugin.json
+msgctxt "name"
+msgid "Toolbox"
+msgstr ""
+
+#: XRayView/plugin.json
+msgctxt "description"
+msgid "Provides the X-Ray view."
+msgstr "Näyttää kerrosnäkymän."
+
+#: XRayView/plugin.json
+msgctxt "name"
+msgid "X-Ray View"
+msgstr "Kerrosnäkymä"
+
+#: X3DReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading X3D files."
+msgstr "Tukee X3D-tiedostojen lukemista."
+
+#: X3DReader/plugin.json
+msgctxt "name"
+msgid "X3D Reader"
+msgstr "X3D-lukija"
+
+#: GCodeWriter/plugin.json
+msgctxt "description"
+msgid "Writes g-code to a file."
+msgstr ""
+
+#: GCodeWriter/plugin.json
+msgctxt "name"
+msgid "G-code Writer"
+msgstr ""
+
+#: ModelChecker/plugin.json
+msgctxt "description"
+msgid "Checks models and print configuration for possible printing issues and give suggestions."
+msgstr ""
+
+#: ModelChecker/plugin.json
+msgctxt "name"
+msgid "Model Checker"
+msgstr ""
+
+#: cura-god-mode-plugin/src/GodMode/plugin.json
+msgctxt "description"
+msgid "Dump the contents of all settings to a HTML file."
+msgstr "Vedosta kaikkien asetusten sisällöt HTML-tiedostoon."
+
+#: cura-god-mode-plugin/src/GodMode/plugin.json
+msgctxt "name"
+msgid "God Mode"
+msgstr "Jumala-tila"
+
+#: FirmwareUpdater/plugin.json
+msgctxt "description"
+msgid "Provides a machine actions for updating firmware."
+msgstr ""
+
+#: FirmwareUpdater/plugin.json
+msgctxt "name"
+msgid "Firmware Updater"
+msgstr ""
+
+#: ProfileFlattener/plugin.json
+msgctxt "description"
+msgid "Create a flattened quality changes profile."
+msgstr ""
+
+#: ProfileFlattener/plugin.json
+msgctxt "name"
+msgid "Profile Flattener"
+msgstr ""
+
+#: AMFReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading AMF files."
+msgstr ""
+
+#: AMFReader/plugin.json
+msgctxt "name"
+msgid "AMF Reader"
+msgstr ""
+
+#: USBPrinting/plugin.json
+msgctxt "description"
+msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware."
+msgstr "Hyväksyy GCode-määrittelyt ja lähettää ne tulostimeen. Lisäosa voi myös päivittää laiteohjelmiston."
+
+#: USBPrinting/plugin.json
+msgctxt "name"
+msgid "USB printing"
+msgstr "USB-tulostus"
+
+#: GCodeGzWriter/plugin.json
+msgctxt "description"
+msgid "Writes g-code to a compressed archive."
+msgstr ""
+
+#: GCodeGzWriter/plugin.json
+msgctxt "name"
+msgid "Compressed G-code Writer"
+msgstr ""
+
+#: UFPWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for writing Ultimaker Format Packages."
+msgstr ""
+
+#: UFPWriter/plugin.json
+msgctxt "name"
+msgid "UFP Writer"
+msgstr ""
+
+#: PrepareStage/plugin.json
+msgctxt "description"
+msgid "Provides a prepare stage in Cura."
+msgstr ""
+
+#: PrepareStage/plugin.json
+msgctxt "name"
+msgid "Prepare Stage"
+msgstr ""
+
+#: RemovableDriveOutputDevice/plugin.json
+msgctxt "description"
+msgid "Provides removable drive hotplugging and writing support."
+msgstr "Tukee irrotettavan aseman kytkemistä lennossa ja sille kirjoittamista."
+
+#: RemovableDriveOutputDevice/plugin.json
+msgctxt "name"
+msgid "Removable Drive Output Device Plugin"
+msgstr "Irrotettavan aseman tulostusvälineen laajennus"
+
+#: UM3NetworkPrinting/plugin.json
+msgctxt "description"
+msgid "Manages network connections to Ultimaker 3 printers."
+msgstr ""
+
+#: UM3NetworkPrinting/plugin.json
+msgctxt "name"
+msgid "UM3 Network Connection"
+msgstr "UM3-verkkoyhteys"
+
+#: SettingsGuide/plugin.json
+msgctxt "description"
+msgid "Provides extra information and explanations about settings in Cura, with images and animations."
+msgstr ""
+
+#: SettingsGuide/plugin.json
+msgctxt "name"
+msgid "Settings Guide"
+msgstr ""
+
+#: MonitorStage/plugin.json
+msgctxt "description"
+msgid "Provides a monitor stage in Cura."
+msgstr ""
+
+#: MonitorStage/plugin.json
+msgctxt "name"
+msgid "Monitor Stage"
+msgstr ""
+
+#: FirmwareUpdateChecker/plugin.json
+msgctxt "description"
+msgid "Checks for firmware updates."
+msgstr "Tarkistaa laiteohjelmistopäivitykset."
+
+#: FirmwareUpdateChecker/plugin.json
+msgctxt "name"
+msgid "Firmware Update Checker"
+msgstr "Laiteohjelmiston päivitysten tarkistus"
+
+#: SimulationView/plugin.json
+msgctxt "description"
+msgid "Provides the Simulation view."
+msgstr ""
+
+#: SimulationView/plugin.json
+msgctxt "name"
+msgid "Simulation View"
+msgstr ""
+
+#: GCodeGzReader/plugin.json
+msgctxt "description"
+msgid "Reads g-code from a compressed archive."
+msgstr ""
+
+#: GCodeGzReader/plugin.json
+msgctxt "name"
+msgid "Compressed G-code Reader"
+msgstr ""
+
+#: PostProcessingPlugin/plugin.json
+msgctxt "description"
+msgid "Extension that allows for user created scripts for post processing"
+msgstr "Lisäosa, jonka avulla käyttäjät voivat luoda komentosarjoja jälkikäsittelyä varten"
+
+#: PostProcessingPlugin/plugin.json
+msgctxt "name"
+msgid "Post Processing"
+msgstr "Jälkikäsittely"
+
+#: SupportEraser/plugin.json
+msgctxt "description"
+msgid "Creates an eraser mesh to block the printing of support in certain places"
+msgstr ""
+
+#: SupportEraser/plugin.json
+msgctxt "name"
+msgid "Support Eraser"
+msgstr ""
+
+#: UFPReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading Ultimaker Format Packages."
+msgstr ""
+
+#: UFPReader/plugin.json
+msgctxt "name"
+msgid "UFP Reader"
+msgstr ""
+
+#: SliceInfoPlugin/plugin.json
+msgctxt "description"
+msgid "Submits anonymous slice info. Can be disabled through preferences."
+msgstr "Lähettää anonyymiä viipalointitietoa. Voidaan lisäasetuksista kytkeä pois käytöstä."
+
+#: SliceInfoPlugin/plugin.json
+msgctxt "name"
+msgid "Slice info"
+msgstr "Viipalointitiedot"
+
+#: XmlMaterialProfile/plugin.json
+msgctxt "description"
+msgid "Provides capabilities to read and write XML-based material profiles."
+msgstr "Mahdollistaa XML-pohjaisten materiaaliprofiilien lukemisen ja kirjoittamisen."
+
+#: XmlMaterialProfile/plugin.json
+msgctxt "name"
+msgid "Material Profiles"
+msgstr "Materiaaliprofiilit"
+
+#: LegacyProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing profiles from legacy Cura versions."
+msgstr "Tukee profiilien tuontia aikaisemmista Cura-versioista."
+
+#: LegacyProfileReader/plugin.json
+msgctxt "name"
+msgid "Legacy Cura Profile Reader"
+msgstr "Aikaisempien Cura-profiilien lukija"
+
+#: GCodeProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing profiles from g-code files."
+msgstr "Tukee profiilien tuontia GCode-tiedostoista."
+
+#: GCodeProfileReader/plugin.json
+msgctxt "name"
+msgid "G-code Profile Reader"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade32to33/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.2 to Cura 3.3."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade32to33/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.2 to 3.3"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade33to34/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.3 to Cura 3.4."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade33to34/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.3 to 3.4"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade25to26/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
+msgstr "Päivittää kokoonpanon versiosta Cura 2.5 versioon Cura 2.6."
+
+#: VersionUpgrade/VersionUpgrade25to26/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.5 to 2.6"
+msgstr "Päivitys versiosta 2.5 versioon 2.6"
+
+#: VersionUpgrade/VersionUpgrade27to30/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
+msgstr "Päivittää kokoonpanon versiosta Cura 2.7 versioon Cura 3.0."
+
+#: VersionUpgrade/VersionUpgrade27to30/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.7 to 3.0"
+msgstr "Päivitys versiosta 2.7 versioon 3.0"
+
+#: VersionUpgrade/VersionUpgrade35to40/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.5 to Cura 4.0."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade35to40/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.5 to 4.0"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade34to35/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.4 to Cura 3.5."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade34to35/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.4 to 3.5"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade40to41/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 4.0 to Cura 4.1."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade40to41/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 4.0 to 4.1"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade30to31/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.0 to Cura 3.1."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade30to31/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.0 to 3.1"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade41to42/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 4.1 to Cura 4.2."
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade41to42/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 4.1 to 4.2"
+msgstr ""
+
+#: VersionUpgrade/VersionUpgrade26to27/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
+msgstr "Päivittää kokoonpanon versiosta Cura 2.6 versioon Cura 2.7."
+
+#: VersionUpgrade/VersionUpgrade26to27/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.6 to 2.7"
+msgstr "Päivitys versiosta 2.6 versioon 2.7"
+
+#: VersionUpgrade/VersionUpgrade21to22/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
+msgstr "Päivittää kokoonpanon versiosta Cura 2.1 versioon Cura 2.2."
+
+#: VersionUpgrade/VersionUpgrade21to22/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.1 to 2.2"
+msgstr "Päivitys versiosta 2.1 versioon 2.2"
+
+#: VersionUpgrade/VersionUpgrade22to24/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
+msgstr "Päivittää kokoonpanon versiosta Cura 2.2 versioon Cura 2.4."
+
+#: VersionUpgrade/VersionUpgrade22to24/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.2 to 2.4"
+msgstr "Päivitys versiosta 2.2 versioon 2.4"
+
+#: ImageReader/plugin.json
+msgctxt "description"
+msgid "Enables ability to generate printable geometry from 2D image files."
+msgstr "Mahdollistaa tulostettavien geometrioiden luomisen 2D-kuvatiedostoista."
+
+#: ImageReader/plugin.json
+msgctxt "name"
+msgid "Image Reader"
+msgstr "Kuvanlukija"
+
+#: CuraEngineBackend/plugin.json
+msgctxt "description"
+msgid "Provides the link to the CuraEngine slicing backend."
+msgstr "Linkki CuraEngine-viipalointiin taustalla."
+
+#: CuraEngineBackend/plugin.json
+msgctxt "name"
+msgid "CuraEngine Backend"
+msgstr "CuraEngine-taustaosa"
+
+#: PerObjectSettingsTool/plugin.json
+msgctxt "description"
+msgid "Provides the Per Model Settings."
+msgstr "Mallikohtaisten asetusten muokkaus."
+
+#: PerObjectSettingsTool/plugin.json
+msgctxt "name"
+msgid "Per Model Settings Tool"
+msgstr "Mallikohtaisten asetusten työkalu"
+
+#: 3MFReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading 3MF files."
+msgstr "Tukee 3MF-tiedostojen lukemista."
+
+#: 3MFReader/plugin.json
+msgctxt "name"
+msgid "3MF Reader"
+msgstr "3MF-lukija"
+
+#: SolidView/plugin.json
+msgctxt "description"
+msgid "Provides a normal solid mesh view."
+msgstr "Näyttää normaalin kiinteän verkkonäkymän."
+
+#: SolidView/plugin.json
+msgctxt "name"
+msgid "Solid View"
+msgstr "Kiinteä näkymä"
+
+#: GCodeReader/plugin.json
+msgctxt "description"
+msgid "Allows loading and displaying G-code files."
+msgstr "Mahdollistaa GCode-tiedostojen lataamisen ja näyttämisen."
+
+#: GCodeReader/plugin.json
+msgctxt "name"
+msgid "G-code Reader"
+msgstr "GCode-lukija"
+
+#: CuraDrive/plugin.json
+msgctxt "description"
+msgid "Backup and restore your configuration."
+msgstr ""
+
+#: CuraDrive/plugin.json
+msgctxt "name"
+msgid "Cura Backups"
+msgstr ""
+
+#: CuraProfileWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for exporting Cura profiles."
+msgstr "Tukee Cura-profiilien vientiä."
+
+#: CuraProfileWriter/plugin.json
+msgctxt "name"
+msgid "Cura Profile Writer"
+msgstr "Cura-profiilin kirjoitin"
+
+#: CuraPrintProfileCreator/plugin.json
+msgctxt "description"
+msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI."
+msgstr ""
+
+#: CuraPrintProfileCreator/plugin.json
+msgctxt "name"
+msgid "Print Profile Assistant"
+msgstr ""
+
+#: 3MFWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for writing 3MF files."
+msgstr "Tukee 3MF-tiedostojen kirjoittamista."
+
+#: 3MFWriter/plugin.json
+msgctxt "name"
+msgid "3MF Writer"
+msgstr "3MF-kirjoitin"
+
+#: PreviewStage/plugin.json
+msgctxt "description"
+msgid "Provides a preview stage in Cura."
+msgstr ""
+
+#: PreviewStage/plugin.json
+msgctxt "name"
+msgid "Preview Stage"
+msgstr ""
+
+#: UltimakerMachineActions/plugin.json
+msgctxt "description"
+msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)."
+msgstr ""
+
+#: UltimakerMachineActions/plugin.json
+msgctxt "name"
+msgid "Ultimaker machine actions"
+msgstr "Ultimaker-laitteen toiminnot"
+
+#: CuraProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing Cura profiles."
+msgstr "Tukee Cura-profiilien tuontia."
+
+#: CuraProfileReader/plugin.json
+msgctxt "name"
+msgid "Cura Profile Reader"
+msgstr "Cura-profiilin lukija"
+
+#~ msgctxt "@label"
+#~ 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 ""
+#~ "Tulosta suoraan tulostimeen verkon kautta yhdistämällä tulostin verkkoon verkkokaapelilla tai yhdistämällä tulostin Wi-Fi-verkkoon. Jos Curaa ei yhdistetä tulostimeen, GCode-tiedostot voidaan silti siirtää tulostimeen USB-aseman avulla.\n"
+#~ "\n"
+#~ "Valitse tulostin alla olevasta luettelosta:"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Show Changelog"
+#~ msgstr "Näytä muutosloki"
+
+#~ msgctxt "@info:title"
+#~ msgid "Collecting Data"
+#~ msgstr "Kerätään tietoja"
+
+#~ msgctxt "@title"
+#~ msgid "Machine Settings"
+#~ msgstr "Laitteen asetukset"
+
+#~ msgctxt "@label"
+#~ msgid "Printer Settings"
+#~ msgstr "Tulostimen asetukset"
+
+#~ msgctxt "@option:check"
+#~ msgid "Origin at center"
+#~ msgstr "Alkukohta keskellä"
+
+#~ msgctxt "@option:check"
+#~ msgid "Heated bed"
+#~ msgstr "Lämmitettävä pöytä"
+
+#~ msgctxt "@label"
+#~ msgid "Printhead Settings"
+#~ msgstr "Tulostuspään asetukset"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Etäisyys tulostuspään vasemmalta puolelta suuttimen keskikohtaan. Käytetään estämään aiempien tulosteiden ja tulostuspään yhteentörmäyksiä, kun tulostetaan yksi kerrallaan."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Etäisyys tulostuspään etupuolelta suuttimen keskikohtaan. Käytetään estämään aiempien tulosteiden ja tulostuspään yhteentörmäyksiä, kun tulostetaan yksi kerrallaan."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Etäisyys tulostuspään oikealta puolelta suuttimen keskikohtaan. Käytetään estämään aiempien tulosteiden ja tulostuspään yhteentörmäyksiä, kun tulostetaan yksi kerrallaan."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Etäisyys tulostuspään takapuolelta suuttimen keskikohtaan. Käytetään estämään aiempien tulosteiden ja tulostuspään yhteentörmäyksiä, kun tulostetaan yksi kerrallaan."
+
+#~ msgctxt "@label"
+#~ msgid "Gantry height"
+#~ msgstr "Korokkeen korkeus"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Suuttimen kärjen ja korokejärjestelmän (X- ja Y-akselit) välinen korkeusero. Käytetään estämään aiempien tulosteiden ja korokkeen yhteentörmäyksiä, kun tulostetaan yksi kerrallaan."
+
+#~ msgctxt "@label"
+#~ msgid "Nozzle Settings"
+#~ msgstr "Suutinasetukset"
+
+#~ msgctxt "@tooltip"
+#~ msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile."
+#~ msgstr "Tulostimen tukema tulostuslangan nimellinen halkaisija. Materiaali ja/tai profiili korvaa tarkan halkaisijan."
+
+#~ msgctxt "@label"
+#~ msgid "Changelog"
+#~ msgstr "Muutosloki"
+
+#~ msgctxt "@alabel"
+#~ msgid "Enter the IP address or hostname of your printer on the network."
+#~ msgstr "Anna verkon tulostimen IP-osoite tai isäntänimi."
+
+#~ msgctxt "@info:tooltip"
+#~ msgid "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."
+#~ msgstr "Oletuksena valkoiset pikselit edustavat verkossa korkeita pisteitä ja mustat pikselit edustavat verkossa matalia pisteitä. Muuta asetus, jos haluat, että mustat pikselit edustavat verkossa korkeita pisteitä ja valkoiset pikselit edustavat verkossa matalia pisteitä."
+
+#~ msgctxt "@title"
+#~ msgid "Select Printer Upgrades"
+#~ msgstr "Valitse tulostimen päivitykset"
+
+#~ msgctxt "@label"
+#~ msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air."
+#~ msgstr "Valitse tukena käytettävä suulakepuristin. Näin mallin alle rakennetaan tukirakenteita estämään mallin painuminen tai tulostuminen ilmaan."
+
+#~ msgctxt "@label:PrintjobStatus"
+#~ msgid "Unable to Slice"
+#~ msgstr "Viipalointi ei onnistu"
+
+#~ msgctxt "@action:button"
+#~ msgid "Add Printer"
+#~ msgstr "Lisää tulostin"
+
#~ msgid "Modify G-Code"
#~ msgstr "Muokkaa GCode-arvoa"
@@ -5163,34 +5853,6 @@ msgstr ""
#~ msgid "Click to check the material compatibility on Ultimaker.com."
#~ msgstr "Napsauta ja tarkista materiaalin yhteensopivuus sivustolla Ultimaker.com."
-#~ msgctxt "name"
-#~ msgid "Machine Settings action"
-#~ msgstr "Laitteen asetukset -toiminto"
-
-#~ msgctxt "description"
-#~ msgid "Provides the X-Ray view."
-#~ msgstr "Näyttää kerrosnäkymän."
-
-#~ msgctxt "name"
-#~ msgid "X-Ray View"
-#~ msgstr "Kerrosnäkymä"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for reading X3D files."
-#~ msgstr "Tukee X3D-tiedostojen lukemista."
-
-#~ msgctxt "name"
-#~ msgid "X3D Reader"
-#~ msgstr "X3D-lukija"
-
-#~ msgctxt "description"
-#~ msgid "Dump the contents of all settings to a HTML file."
-#~ msgstr "Vedosta kaikkien asetusten sisällöt HTML-tiedostoon."
-
-#~ msgctxt "name"
-#~ msgid "God Mode"
-#~ msgstr "Jumala-tila"
-
#~ msgctxt "description"
#~ msgid "Shows changes since latest checked version."
#~ msgstr "Näyttää viimeisimmän tarkistetun version jälkeen tapahtuneet muutokset."
@@ -5207,186 +5869,6 @@ msgstr ""
#~ msgid "Profile flatener"
#~ msgstr "Profiilin tasoitus"
-#~ msgctxt "description"
-#~ msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware."
-#~ msgstr "Hyväksyy GCode-määrittelyt ja lähettää ne tulostimeen. Lisäosa voi myös päivittää laiteohjelmiston."
-
-#~ msgctxt "name"
-#~ msgid "USB printing"
-#~ msgstr "USB-tulostus"
-
-#~ msgctxt "description"
-#~ msgid "Provides removable drive hotplugging and writing support."
-#~ msgstr "Tukee irrotettavan aseman kytkemistä lennossa ja sille kirjoittamista."
-
-#~ msgctxt "name"
-#~ msgid "Removable Drive Output Device Plugin"
-#~ msgstr "Irrotettavan aseman tulostusvälineen laajennus"
-
-#~ msgctxt "name"
-#~ msgid "UM3 Network Connection"
-#~ msgstr "UM3-verkkoyhteys"
-
-#~ msgctxt "description"
-#~ msgid "Checks for firmware updates."
-#~ msgstr "Tarkistaa laiteohjelmistopäivitykset."
-
-#~ msgctxt "name"
-#~ msgid "Firmware Update Checker"
-#~ msgstr "Laiteohjelmiston päivitysten tarkistus"
-
-#~ msgctxt "description"
-#~ msgid "Extension that allows for user created scripts for post processing"
-#~ msgstr "Lisäosa, jonka avulla käyttäjät voivat luoda komentosarjoja jälkikäsittelyä varten"
-
-#~ msgctxt "name"
-#~ msgid "Post Processing"
-#~ msgstr "Jälkikäsittely"
-
-#~ msgctxt "description"
-#~ msgid "Submits anonymous slice info. Can be disabled through preferences."
-#~ msgstr "Lähettää anonyymiä viipalointitietoa. Voidaan lisäasetuksista kytkeä pois käytöstä."
-
-#~ msgctxt "name"
-#~ msgid "Slice info"
-#~ msgstr "Viipalointitiedot"
-
-#~ msgctxt "description"
-#~ msgid "Provides capabilities to read and write XML-based material profiles."
-#~ msgstr "Mahdollistaa XML-pohjaisten materiaaliprofiilien lukemisen ja kirjoittamisen."
-
-#~ msgctxt "name"
-#~ msgid "Material Profiles"
-#~ msgstr "Materiaaliprofiilit"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing profiles from legacy Cura versions."
-#~ msgstr "Tukee profiilien tuontia aikaisemmista Cura-versioista."
-
-#~ msgctxt "name"
-#~ msgid "Legacy Cura Profile Reader"
-#~ msgstr "Aikaisempien Cura-profiilien lukija"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing profiles from g-code files."
-#~ msgstr "Tukee profiilien tuontia GCode-tiedostoista."
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
-#~ msgstr "Päivittää kokoonpanon versiosta Cura 2.5 versioon Cura 2.6."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.5 to 2.6"
-#~ msgstr "Päivitys versiosta 2.5 versioon 2.6"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
-#~ msgstr "Päivittää kokoonpanon versiosta Cura 2.7 versioon Cura 3.0."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.7 to 3.0"
-#~ msgstr "Päivitys versiosta 2.7 versioon 3.0"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
-#~ msgstr "Päivittää kokoonpanon versiosta Cura 2.6 versioon Cura 2.7."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.6 to 2.7"
-#~ msgstr "Päivitys versiosta 2.6 versioon 2.7"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
-#~ msgstr "Päivittää kokoonpanon versiosta Cura 2.1 versioon Cura 2.2."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.1 to 2.2"
-#~ msgstr "Päivitys versiosta 2.1 versioon 2.2"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
-#~ msgstr "Päivittää kokoonpanon versiosta Cura 2.2 versioon Cura 2.4."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.2 to 2.4"
-#~ msgstr "Päivitys versiosta 2.2 versioon 2.4"
-
-#~ msgctxt "description"
-#~ msgid "Enables ability to generate printable geometry from 2D image files."
-#~ msgstr "Mahdollistaa tulostettavien geometrioiden luomisen 2D-kuvatiedostoista."
-
-#~ msgctxt "name"
-#~ msgid "Image Reader"
-#~ msgstr "Kuvanlukija"
-
-#~ msgctxt "description"
-#~ msgid "Provides the link to the CuraEngine slicing backend."
-#~ msgstr "Linkki CuraEngine-viipalointiin taustalla."
-
-#~ msgctxt "name"
-#~ msgid "CuraEngine Backend"
-#~ msgstr "CuraEngine-taustaosa"
-
-#~ msgctxt "description"
-#~ msgid "Provides the Per Model Settings."
-#~ msgstr "Mallikohtaisten asetusten muokkaus."
-
-#~ msgctxt "name"
-#~ msgid "Per Model Settings Tool"
-#~ msgstr "Mallikohtaisten asetusten työkalu"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for reading 3MF files."
-#~ msgstr "Tukee 3MF-tiedostojen lukemista."
-
-#~ msgctxt "name"
-#~ msgid "3MF Reader"
-#~ msgstr "3MF-lukija"
-
-#~ msgctxt "description"
-#~ msgid "Provides a normal solid mesh view."
-#~ msgstr "Näyttää normaalin kiinteän verkkonäkymän."
-
-#~ msgctxt "name"
-#~ msgid "Solid View"
-#~ msgstr "Kiinteä näkymä"
-
-#~ msgctxt "description"
-#~ msgid "Allows loading and displaying G-code files."
-#~ msgstr "Mahdollistaa GCode-tiedostojen lataamisen ja näyttämisen."
-
-#~ msgctxt "name"
-#~ msgid "G-code Reader"
-#~ msgstr "GCode-lukija"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for exporting Cura profiles."
-#~ msgstr "Tukee Cura-profiilien vientiä."
-
-#~ msgctxt "name"
-#~ msgid "Cura Profile Writer"
-#~ msgstr "Cura-profiilin kirjoitin"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for writing 3MF files."
-#~ msgstr "Tukee 3MF-tiedostojen kirjoittamista."
-
-#~ msgctxt "name"
-#~ msgid "3MF Writer"
-#~ msgstr "3MF-kirjoitin"
-
-#~ msgctxt "name"
-#~ msgid "Ultimaker machine actions"
-#~ msgstr "Ultimaker-laitteen toiminnot"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing Cura profiles."
-#~ msgstr "Tukee Cura-profiilien tuontia."
-
-#~ msgctxt "name"
-#~ msgid "Cura Profile Reader"
-#~ msgstr "Cura-profiilin lukija"
-
#~ msgctxt "@action"
#~ msgid "Upgrade Firmware"
#~ msgstr "Päivitä laiteohjelmisto"
diff --git a/resources/i18n/fi_FI/fdmextruder.def.json.po b/resources/i18n/fi_FI/fdmextruder.def.json.po
index f5ce73790d..949d9518a5 100644
--- a/resources/i18n/fi_FI/fdmextruder.def.json.po
+++ b/resources/i18n/fi_FI/fdmextruder.def.json.po
@@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0000\n"
+"POT-Creation-Date: 2019-07-16 14:38+0000\n"
"PO-Revision-Date: 2017-08-11 14:31+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Finnish\n"
diff --git a/resources/i18n/fi_FI/fdmprinter.def.json.po b/resources/i18n/fi_FI/fdmprinter.def.json.po
index 3bb377fe22..a00a4832a9 100644
--- a/resources/i18n/fi_FI/fdmprinter.def.json.po
+++ b/resources/i18n/fi_FI/fdmprinter.def.json.po
@@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0000\n"
+"POT-Creation-Date: 2019-07-16 14:38+0000\n"
"PO-Revision-Date: 2017-09-27 12:27+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Finnish\n"
@@ -232,7 +232,7 @@ msgstr "Suulakeryhmien määrä. Suulakeryhmä on syöttölaitteen, Bowden-putke
#: fdmprinter.def.json
msgctxt "extruders_enabled_count label"
-msgid "Number of Extruders that are enabled"
+msgid "Number of Extruders That Are Enabled"
msgstr ""
#: fdmprinter.def.json
@@ -242,8 +242,8 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "machine_nozzle_tip_outer_diameter label"
-msgid "Outer nozzle diameter"
-msgstr "Suuttimen ulkoläpimitta"
+msgid "Outer Nozzle Diameter"
+msgstr ""
#: fdmprinter.def.json
msgctxt "machine_nozzle_tip_outer_diameter description"
@@ -252,8 +252,8 @@ msgstr "Suuttimen kärjen ulkoläpimitta."
#: fdmprinter.def.json
msgctxt "machine_nozzle_head_distance label"
-msgid "Nozzle length"
-msgstr "Suuttimen pituus"
+msgid "Nozzle Length"
+msgstr ""
#: fdmprinter.def.json
msgctxt "machine_nozzle_head_distance description"
@@ -262,8 +262,8 @@ msgstr "Suuttimen kärjen ja tulostuspään alimman osan välinen korkeusero."
#: fdmprinter.def.json
msgctxt "machine_nozzle_expansion_angle label"
-msgid "Nozzle angle"
-msgstr "Suuttimen kulma"
+msgid "Nozzle Angle"
+msgstr ""
#: fdmprinter.def.json
msgctxt "machine_nozzle_expansion_angle description"
@@ -272,8 +272,8 @@ msgstr "Vaakatason ja suuttimen kärjen yllä olevan kartiomaisen osan välinen
#: fdmprinter.def.json
msgctxt "machine_heat_zone_length label"
-msgid "Heat zone length"
-msgstr "Lämpöalueen pituus"
+msgid "Heat Zone Length"
+msgstr ""
#: fdmprinter.def.json
msgctxt "machine_heat_zone_length description"
@@ -302,8 +302,8 @@ msgstr "Lämpötilan hallinta Curan kautta. Kytke tämä pois, niin voit hallita
#: fdmprinter.def.json
msgctxt "machine_nozzle_heat_up_speed label"
-msgid "Heat up speed"
-msgstr "Lämpenemisnopeus"
+msgid "Heat Up Speed"
+msgstr ""
#: fdmprinter.def.json
msgctxt "machine_nozzle_heat_up_speed description"
@@ -312,8 +312,8 @@ msgstr "Nopeus (°C/s), jolla suutin lämpenee, mitattuna keskiarvona normaaleis
#: fdmprinter.def.json
msgctxt "machine_nozzle_cool_down_speed label"
-msgid "Cool down speed"
-msgstr "Jäähdytysnopeus"
+msgid "Cool Down Speed"
+msgstr ""
#: fdmprinter.def.json
msgctxt "machine_nozzle_cool_down_speed description"
@@ -332,7 +332,7 @@ msgstr "Minimiaika, jonka suulakkeen on oltava ei-aktiivinen, ennen kuin suutin
#: fdmprinter.def.json
msgctxt "machine_gcode_flavor label"
-msgid "G-code flavour"
+msgid "G-code Flavor"
msgstr ""
#: fdmprinter.def.json
@@ -397,8 +397,8 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "machine_disallowed_areas label"
-msgid "Disallowed areas"
-msgstr "Kielletyt alueet"
+msgid "Disallowed Areas"
+msgstr ""
#: fdmprinter.def.json
msgctxt "machine_disallowed_areas description"
@@ -417,8 +417,8 @@ msgstr "Monikulmioluettelo, jossa on alueet, joihin suutin ei saa siirtyä."
#: fdmprinter.def.json
msgctxt "machine_head_polygon label"
-msgid "Machine head polygon"
-msgstr "Laiteen pään monikulmio"
+msgid "Machine Head Polygon"
+msgstr ""
#: fdmprinter.def.json
msgctxt "machine_head_polygon description"
@@ -427,8 +427,8 @@ msgstr "2D-siluetti tulostuspäästä (tuulettimen kannattimet pois lukien)"
#: fdmprinter.def.json
msgctxt "machine_head_with_fans_polygon label"
-msgid "Machine head & Fan polygon"
-msgstr "Laiteen pään ja tuulettimen monikulmio"
+msgid "Machine Head & Fan Polygon"
+msgstr ""
#: fdmprinter.def.json
msgctxt "machine_head_with_fans_polygon description"
@@ -437,8 +437,8 @@ msgstr "2D-siluetti tulostuspäästä (tuulettimen päät mukaan lukien)"
#: fdmprinter.def.json
msgctxt "gantry_height label"
-msgid "Gantry height"
-msgstr "Korokkeen korkeus"
+msgid "Gantry Height"
+msgstr ""
#: fdmprinter.def.json
msgctxt "gantry_height description"
@@ -467,8 +467,8 @@ msgstr "Suuttimen sisäläpimitta. Muuta tätä asetusta, kun käytössä on muu
#: fdmprinter.def.json
msgctxt "machine_use_extruder_offset_to_offset_coords label"
-msgid "Offset With Extruder"
-msgstr "Suulakkeen siirtymä"
+msgid "Offset with Extruder"
+msgstr ""
#: fdmprinter.def.json
msgctxt "machine_use_extruder_offset_to_offset_coords description"
@@ -1292,8 +1292,8 @@ msgstr "Saumakulmien asetus"
#: fdmprinter.def.json
msgctxt "z_seam_corner description"
-msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner."
-msgstr "Määritä, vaikuttavatko mallin ulkolinjan kulmat sauman sijaintiin. Ei mitään tarkoittaa, että kulmilla ei ole vaikutusta sauman sijaintiin. Piilota sauma -valinnalla sauman sijainti sisäkulmassa on todennäköisempää. Paljasta sauma -valinnalla sauman sijainti ulkokulmassa on todennäköisempää. Piilota tai paljasta sauma -valinnalla sauman sijainti sisä- tai ulkokulmassa on todennäköisempää."
+msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner. Smart Hiding allows both inside and outside corners, but chooses inside corners more frequently, if appropriate."
+msgstr ""
#: fdmprinter.def.json
msgctxt "z_seam_corner option z_seam_corner_none"
@@ -1315,6 +1315,11 @@ msgctxt "z_seam_corner option z_seam_corner_any"
msgid "Hide or Expose Seam"
msgstr "Piilota tai paljasta sauma"
+#: fdmprinter.def.json
+msgctxt "z_seam_corner option z_seam_corner_weighted"
+msgid "Smart Hiding"
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "z_seam_relative label"
msgid "Z Seam Relative"
@@ -1327,13 +1332,13 @@ msgstr "Kun tämä on käytössä, Z-sauman koordinaatit ovat suhteessa kunkin o
#: fdmprinter.def.json
msgctxt "skin_no_small_gaps_heuristic label"
-msgid "Ignore Small Z Gaps"
-msgstr "Ohita pienet Z-raot"
+msgid "No Skin in Z Gaps"
+msgstr ""
#: fdmprinter.def.json
msgctxt "skin_no_small_gaps_heuristic description"
-msgid "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting."
-msgstr "Kun mallissa on pieniä pystyrakoja, ylä- ja alapuolen pintakalvon tekemiseen näihin kapeisiin paikkoihin voi kulua noin 5 % ylimääräistä laskenta-aikaa. Poista siinä tapauksessa tämä asetus käytöstä."
+msgid "When the model has small vertical gaps of only a few layers, there should normally be skin around those layers in the narrow space. Enable this setting to not generate skin if the vertical gap is very small. This improves printing time and slicing time, but technically leaves infill exposed to the air."
+msgstr ""
#: fdmprinter.def.json
msgctxt "skin_outline_count label"
@@ -1862,6 +1867,16 @@ msgctxt "default_material_print_temperature description"
msgid "The default temperature used for printing. This should be the \"base\" temperature of a material. All other print temperatures should use offsets based on this value"
msgstr "Tulostuksessa käytettävä oletuslämpötila. Tämän tulee olla materiaalin ”pohjalämpötila”. Kaikkien muiden tulostuslämpötilojen tulee käyttää tähän arvoon perustuvia siirtymiä."
+#: fdmprinter.def.json
+msgctxt "build_volume_temperature label"
+msgid "Build Volume Temperature"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "build_volume_temperature description"
+msgid "The temperature of the environment to print in. If this is 0, the build volume temperature will not be adjusted."
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "material_print_temperature label"
msgid "Printing Temperature"
@@ -1972,6 +1987,86 @@ msgctxt "material_shrinkage_percentage description"
msgid "Shrinkage ratio in percentage."
msgstr ""
+#: fdmprinter.def.json
+msgctxt "material_crystallinity label"
+msgid "Crystalline Material"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_crystallinity description"
+msgid "Is this material the type that breaks off cleanly when heated (crystalline), or is it the type that produces long intertwined polymer chains (non-crystalline)?"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retracted_position label"
+msgid "Anti-ooze Retracted Position"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retracted_position description"
+msgid "How far the material needs to be retracted before it stops oozing."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retraction_speed label"
+msgid "Anti-ooze Retraction Speed"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retraction_speed description"
+msgid "How fast the material needs to be retracted during a filament switch to prevent oozing."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_retracted_position label"
+msgid "Break Preparation Retracted Position"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_retracted_position description"
+msgid "How far the filament can be stretched before it breaks, while heated."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_speed label"
+msgid "Break Preparation Retraction Speed"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_speed description"
+msgid "How fast the filament needs to be retracted just before breaking it off in a retraction."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_retracted_position label"
+msgid "Break Retracted Position"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_retracted_position description"
+msgid "How far to retract the filament in order to break it cleanly."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_speed label"
+msgid "Break Retraction Speed"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_speed description"
+msgid "The speed at which to retract the filament in order to break it cleanly."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_temperature label"
+msgid "Break Temperature"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "material_break_temperature description"
+msgid "The temperature at which the filament is broken for a clean break."
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "material_flow label"
msgid "Flow"
@@ -1982,6 +2077,126 @@ msgctxt "material_flow description"
msgid "Flow compensation: the amount of material extruded is multiplied by this value."
msgstr "Virtauksen kompensointi: pursotetun materiaalin määrä kerrotaan tällä arvolla."
+#: fdmprinter.def.json
+msgctxt "wall_material_flow label"
+msgid "Wall Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wall_material_flow description"
+msgid "Flow compensation on wall lines."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wall_0_material_flow label"
+msgid "Outer Wall Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wall_0_material_flow description"
+msgid "Flow compensation on the outermost wall line."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wall_x_material_flow label"
+msgid "Inner Wall(s) Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wall_x_material_flow description"
+msgid "Flow compensation on wall lines for all wall lines except the outermost one."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "skin_material_flow label"
+msgid "Top/Bottom Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "skin_material_flow description"
+msgid "Flow compensation on top/bottom lines."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "roofing_material_flow label"
+msgid "Top Surface Skin Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "roofing_material_flow description"
+msgid "Flow compensation on lines of the areas at the top of the print."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "infill_material_flow label"
+msgid "Infill Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "infill_material_flow description"
+msgid "Flow compensation on infill lines."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "skirt_brim_material_flow label"
+msgid "Skirt/Brim Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "skirt_brim_material_flow description"
+msgid "Flow compensation on skirt or brim lines."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "support_material_flow label"
+msgid "Support Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "support_material_flow description"
+msgid "Flow compensation on support structure lines."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "support_interface_material_flow label"
+msgid "Support Interface Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "support_interface_material_flow description"
+msgid "Flow compensation on lines of support roof or floor."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "support_roof_material_flow label"
+msgid "Support Roof Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "support_roof_material_flow description"
+msgid "Flow compensation on support roof lines."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "support_bottom_material_flow label"
+msgid "Support Floor Flow"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "support_bottom_material_flow description"
+msgid "Flow compensation on support floor lines."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_flow label"
+msgid "Prime Tower Flow"
+msgstr "Esitäyttötornin virtaus"
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_flow description"
+msgid "Flow compensation on prime tower lines."
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "material_flow_layer_0 label"
msgid "Initial Layer Flow"
@@ -2099,7 +2314,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "limit_support_retractions description"
-msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excesive stringing within the support structure."
+msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excessive stringing within the support structure."
msgstr ""
#: fdmprinter.def.json
@@ -2152,6 +2367,16 @@ msgctxt "switch_extruder_prime_speed description"
msgid "The speed at which the filament is pushed back after a nozzle switch retraction."
msgstr "Nopeus, jolla tulostuslanka työnnetään takaisin suuttimen vaihdon takaisinvedon jälkeen."
+#: fdmprinter.def.json
+msgctxt "switch_extruder_extra_prime_amount label"
+msgid "Nozzle Switch Extra Prime Amount"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "switch_extruder_extra_prime_amount description"
+msgid "Extra material to prime after nozzle switching."
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "speed label"
msgid "Speed"
@@ -2343,14 +2568,14 @@ msgid "The speed at which the skirt and brim are printed. Normally this is done
msgstr "Nopeus, jolla helma ja reunus tulostetaan. Yleensä se tehdään alkukerroksen nopeudella. Joskus helma tai reunus halutaan kuitenkin tulostaa eri nopeudella."
#: fdmprinter.def.json
-msgctxt "max_feedrate_z_override label"
-msgid "Maximum Z Speed"
-msgstr "Z:n maksiminopeus"
+msgctxt "speed_z_hop label"
+msgid "Z Hop Speed"
+msgstr ""
#: fdmprinter.def.json
-msgctxt "max_feedrate_z_override description"
-msgid "The maximum speed with which the build plate is moved. Setting this to zero causes the print to use the firmware defaults for the maximum z speed."
-msgstr "Maksiminopeus, jolla alustaa liikutetaan. Jos tämä määritetään nollaan, tulostuksessa käytetään laiteohjelmiston oletusasetuksia Z:n maksiminopeudelle."
+msgctxt "speed_z_hop description"
+msgid "The speed at which the vertical Z movement is made for Z Hops. This is typically lower than the print speed since the build plate or machine's gantry is harder to move."
+msgstr ""
#: fdmprinter.def.json
msgctxt "speed_slowdown_layers label"
@@ -2922,6 +3147,16 @@ msgctxt "retraction_hop_after_extruder_switch description"
msgid "After the machine switched from one extruder to the other, the build plate is lowered to create clearance between the nozzle and the print. This prevents the nozzle from leaving oozed material on the outside of a print."
msgstr "Alustaa lasketaan koneen vaihdettua yhdestä suulakkeesta toiseen, jotta suuttimen ja tulosteen väliin jää tilaa. Tämä estää suutinta jättämästä tihkunutta ainetta tulosteen ulkopuolelle."
+#: fdmprinter.def.json
+msgctxt "retraction_hop_after_extruder_switch_height label"
+msgid "Z Hop After Extruder Switch Height"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "retraction_hop_after_extruder_switch_height description"
+msgid "The height difference when performing a Z Hop after extruder switch."
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "cooling label"
msgid "Cooling"
@@ -3192,6 +3427,11 @@ msgctxt "support_pattern option cross"
msgid "Cross"
msgstr "Risti"
+#: fdmprinter.def.json
+msgctxt "support_pattern option gyroid"
+msgid "Gyroid"
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "support_wall_count label"
msgid "Support Wall Line Count"
@@ -3253,12 +3493,12 @@ msgid "Distance between the printed initial layer support structure lines. This
msgstr ""
#: fdmprinter.def.json
-msgctxt "support_infill_angle label"
-msgid "Support Infill Line Direction"
+msgctxt "support_infill_angles label"
+msgid "Support Infill Line Directions"
msgstr ""
#: fdmprinter.def.json
-msgctxt "support_infill_angle description"
+msgctxt "support_infill_angles description"
msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane."
msgstr ""
@@ -3389,8 +3629,8 @@ msgstr "Tuen liitosetäisyys"
#: fdmprinter.def.json
msgctxt "support_join_distance description"
-msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one."
-msgstr "Tukirakenteiden maksimietäisyys toisistaan X-/Y-suunnissa. Kun erilliset rakenteet ovat tätä arvoa lähempänä toisiaan, rakenteet sulautuvat toisiinsa."
+msgid "The maximum distance between support structures in the X/Y directions. When separate structures are closer together than this value, the structures merge into one."
+msgstr ""
#: fdmprinter.def.json
msgctxt "support_offset label"
@@ -3768,14 +4008,14 @@ msgid "The diameter of a special tower."
msgstr "Erityistornin läpimitta."
#: fdmprinter.def.json
-msgctxt "support_minimal_diameter label"
-msgid "Minimum Diameter"
-msgstr "Minimiläpimitta"
+msgctxt "support_tower_maximum_supported_diameter label"
+msgid "Maximum Tower-Supported Diameter"
+msgstr ""
#: fdmprinter.def.json
-msgctxt "support_minimal_diameter description"
-msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
-msgstr "Erityisellä tukitornilla tuettavan pienen alueen minimiläpimitta X- ja Y-suunnissa."
+msgctxt "support_tower_maximum_supported_diameter description"
+msgid "Maximum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
+msgstr ""
#: fdmprinter.def.json
msgctxt "support_tower_roof_angle label"
@@ -4269,16 +4509,6 @@ msgctxt "prime_tower_enable description"
msgid "Print a tower next to the print which serves to prime the material after each nozzle switch."
msgstr "Tulosta tulosteen viereen torni, jolla materiaali esitäytetään aina suuttimen vaihdon jälkeen."
-#: fdmprinter.def.json
-msgctxt "prime_tower_circular label"
-msgid "Circular Prime Tower"
-msgstr ""
-
-#: fdmprinter.def.json
-msgctxt "prime_tower_circular description"
-msgid "Make the prime tower as a circular shape."
-msgstr ""
-
#: fdmprinter.def.json
msgctxt "prime_tower_size label"
msgid "Prime Tower Size"
@@ -4319,16 +4549,6 @@ msgctxt "prime_tower_position_y description"
msgid "The y coordinate of the position of the prime tower."
msgstr "Esitäyttötornin sijainnin Y-koordinaatti."
-#: fdmprinter.def.json
-msgctxt "prime_tower_flow label"
-msgid "Prime Tower Flow"
-msgstr "Esitäyttötornin virtaus"
-
-#: fdmprinter.def.json
-msgctxt "prime_tower_flow description"
-msgid "Flow compensation: the amount of material extruded is multiplied by this value."
-msgstr "Virtauksen kompensointi: pursotetun materiaalin määrä kerrotaan tällä arvolla."
-
#: fdmprinter.def.json
msgctxt "prime_tower_wipe_enabled label"
msgid "Wipe Inactive Nozzle on Prime Tower"
@@ -4339,6 +4559,16 @@ msgctxt "prime_tower_wipe_enabled description"
msgid "After printing the prime tower with one nozzle, wipe the oozed material from the other nozzle off on the prime tower."
msgstr "Kun esitäyttötorni on tulostettu yhdellä suuttimella, pyyhi toisesta suuttimesta tihkunut materiaali pois esitäyttötornissa."
+#: fdmprinter.def.json
+msgctxt "prime_tower_brim_enable label"
+msgid "Prime Tower Brim"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_brim_enable description"
+msgid "Prime-towers might need the extra adhesion afforded by a brim even if the model doesn't. Presently can't be used with the 'Raft' adhesion-type."
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "ooze_shield_enabled label"
msgid "Enable Ooze Shield"
@@ -4621,8 +4851,8 @@ msgstr "Kierukoitujen ääriviivojen tasoittaminen"
#: fdmprinter.def.json
msgctxt "smooth_spiralized_contours description"
-msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
-msgstr "Vähennä Z-sauman näkyvyyttä tasoittamalla kierukoidut ääriviivat (Z-sauman pitäisi olla lähes näkymätön tulosteessa, mutta kerrosnäkymässä sen voi edelleen havaita). Ota huomioon, että tasoittaminen usein sumentaa pinnan pieniä yksityiskohtia."
+msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
+msgstr ""
#: fdmprinter.def.json
msgctxt "relative_extrusion label"
@@ -4854,6 +5084,16 @@ msgctxt "meshfix_maximum_travel_resolution description"
msgid "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."
msgstr ""
+#: fdmprinter.def.json
+msgctxt "meshfix_maximum_deviation label"
+msgid "Maximum Deviation"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "meshfix_maximum_deviation description"
+msgid "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."
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "support_skip_some_zags label"
msgid "Break Up Support In Chunks"
@@ -5111,8 +5351,8 @@ msgstr "Ota kartiomainen tuki käyttöön"
#: fdmprinter.def.json
msgctxt "support_conical_enabled description"
-msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang."
-msgstr "Kokeellinen ominaisuus: tekee tukialueet pienemmiksi alaosassa verrattuna ulokkeeseen."
+msgid "Make support areas smaller at the bottom than at the overhang."
+msgstr ""
#: fdmprinter.def.json
msgctxt "support_conical_angle label"
@@ -5455,7 +5695,7 @@ msgstr "Suuttimen ja vaakasuoraan laskevien linjojen välinen etäisyys. Suuremp
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_enabled label"
-msgid "Use adaptive layers"
+msgid "Use Adaptive Layers"
msgstr ""
#: fdmprinter.def.json
@@ -5465,7 +5705,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_variation label"
-msgid "Adaptive layers maximum variation"
+msgid "Adaptive Layers Maximum Variation"
msgstr ""
#: fdmprinter.def.json
@@ -5475,7 +5715,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_variation_step label"
-msgid "Adaptive layers variation step size"
+msgid "Adaptive Layers Variation Step Size"
msgstr ""
#: fdmprinter.def.json
@@ -5485,7 +5725,7 @@ msgstr ""
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_threshold label"
-msgid "Adaptive layers threshold"
+msgid "Adaptive Layers Threshold"
msgstr ""
#: fdmprinter.def.json
@@ -5703,6 +5943,156 @@ msgctxt "bridge_fan_speed_3 description"
msgid "Percentage fan speed to use when printing the third bridge skin layer."
msgstr ""
+#: fdmprinter.def.json
+msgctxt "clean_between_layers label"
+msgid "Wipe Nozzle Between Layers"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "clean_between_layers description"
+msgid "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."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "max_extrusion_before_wipe label"
+msgid "Material Volume Between Wipes"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "max_extrusion_before_wipe description"
+msgid "Maximum material, that can be extruded before another nozzle wipe is initiated."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_enable label"
+msgid "Wipe Retraction Enable"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_enable description"
+msgid "Retract the filament when the nozzle is moving over a non-printed area."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_amount label"
+msgid "Wipe Retraction Distance"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_amount description"
+msgid "Amount to retract the filament so it does not ooze during the wipe sequence."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_extra_prime_amount label"
+msgid "Wipe Retraction Extra Prime Amount"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_extra_prime_amount description"
+msgid "Some material can ooze away during a wipe travel moves, which can be compensated for here."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_speed label"
+msgid "Wipe Retraction Speed"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_speed description"
+msgid "The speed at which the filament is retracted and primed during a wipe retraction move."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_retract_speed label"
+msgid "Wipe Retraction Retract Speed"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_retract_speed description"
+msgid "The speed at which the filament is retracted during a wipe retraction move."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_prime_speed label"
+msgid "Retraction Prime Speed"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_prime_speed description"
+msgid "The speed at which the filament is primed during a wipe retraction move."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_pause label"
+msgid "Wipe Pause"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_pause description"
+msgid "Pause after the unretract."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_enable label"
+msgid "Wipe Z Hop When Retracted"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_enable description"
+msgid "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."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_amount label"
+msgid "Wipe Z Hop Height"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_amount description"
+msgid "The height difference when performing a Z Hop."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_speed label"
+msgid "Wipe Hop Speed"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_speed description"
+msgid "Speed to move the z-axis during the hop."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_brush_pos_x label"
+msgid "Wipe Brush X Position"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_brush_pos_x description"
+msgid "X location where wipe script will start."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_repeat_count label"
+msgid "Wipe Repeat Count"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_repeat_count description"
+msgid "Number of times to move the nozzle across the brush."
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_move_distance label"
+msgid "Wipe Move Distance"
+msgstr ""
+
+#: fdmprinter.def.json
+msgctxt "wipe_move_distance description"
+msgid "The distance to move the head back and forth across the brush."
+msgstr ""
+
#: fdmprinter.def.json
msgctxt "command_line_settings label"
msgid "Command Line Settings"
@@ -5763,6 +6153,94 @@ msgctxt "mesh_rotation_matrix description"
msgid "Transformation matrix to be applied to the model when loading it from file."
msgstr "Mallissa käytettävä muunnosmatriisi, kun malli ladataan tiedostosta."
+#~ msgctxt "z_seam_corner description"
+#~ msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner."
+#~ msgstr "Määritä, vaikuttavatko mallin ulkolinjan kulmat sauman sijaintiin. Ei mitään tarkoittaa, että kulmilla ei ole vaikutusta sauman sijaintiin. Piilota sauma -valinnalla sauman sijainti sisäkulmassa on todennäköisempää. Paljasta sauma -valinnalla sauman sijainti ulkokulmassa on todennäköisempää. Piilota tai paljasta sauma -valinnalla sauman sijainti sisä- tai ulkokulmassa on todennäköisempää."
+
+#~ msgctxt "skin_no_small_gaps_heuristic label"
+#~ msgid "Ignore Small Z Gaps"
+#~ msgstr "Ohita pienet Z-raot"
+
+#~ msgctxt "skin_no_small_gaps_heuristic description"
+#~ msgid "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting."
+#~ msgstr "Kun mallissa on pieniä pystyrakoja, ylä- ja alapuolen pintakalvon tekemiseen näihin kapeisiin paikkoihin voi kulua noin 5 % ylimääräistä laskenta-aikaa. Poista siinä tapauksessa tämä asetus käytöstä."
+
+#~ msgctxt "max_feedrate_z_override label"
+#~ msgid "Maximum Z Speed"
+#~ msgstr "Z:n maksiminopeus"
+
+#~ msgctxt "max_feedrate_z_override description"
+#~ msgid "The maximum speed with which the build plate is moved. Setting this to zero causes the print to use the firmware defaults for the maximum z speed."
+#~ msgstr "Maksiminopeus, jolla alustaa liikutetaan. Jos tämä määritetään nollaan, tulostuksessa käytetään laiteohjelmiston oletusasetuksia Z:n maksiminopeudelle."
+
+#~ msgctxt "support_join_distance description"
+#~ msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one."
+#~ msgstr "Tukirakenteiden maksimietäisyys toisistaan X-/Y-suunnissa. Kun erilliset rakenteet ovat tätä arvoa lähempänä toisiaan, rakenteet sulautuvat toisiinsa."
+
+#~ msgctxt "support_minimal_diameter label"
+#~ msgid "Minimum Diameter"
+#~ msgstr "Minimiläpimitta"
+
+#~ msgctxt "support_minimal_diameter description"
+#~ msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
+#~ msgstr "Erityisellä tukitornilla tuettavan pienen alueen minimiläpimitta X- ja Y-suunnissa."
+
+#~ msgctxt "prime_tower_flow description"
+#~ msgid "Flow compensation: the amount of material extruded is multiplied by this value."
+#~ msgstr "Virtauksen kompensointi: pursotetun materiaalin määrä kerrotaan tällä arvolla."
+
+#~ msgctxt "smooth_spiralized_contours description"
+#~ msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
+#~ msgstr "Vähennä Z-sauman näkyvyyttä tasoittamalla kierukoidut ääriviivat (Z-sauman pitäisi olla lähes näkymätön tulosteessa, mutta kerrosnäkymässä sen voi edelleen havaita). Ota huomioon, että tasoittaminen usein sumentaa pinnan pieniä yksityiskohtia."
+
+#~ msgctxt "support_conical_enabled description"
+#~ msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang."
+#~ msgstr "Kokeellinen ominaisuus: tekee tukialueet pienemmiksi alaosassa verrattuna ulokkeeseen."
+
+#~ msgctxt "machine_nozzle_tip_outer_diameter label"
+#~ msgid "Outer nozzle diameter"
+#~ msgstr "Suuttimen ulkoläpimitta"
+
+#~ msgctxt "machine_nozzle_head_distance label"
+#~ msgid "Nozzle length"
+#~ msgstr "Suuttimen pituus"
+
+#~ msgctxt "machine_nozzle_expansion_angle label"
+#~ msgid "Nozzle angle"
+#~ msgstr "Suuttimen kulma"
+
+#~ msgctxt "machine_heat_zone_length label"
+#~ msgid "Heat zone length"
+#~ msgstr "Lämpöalueen pituus"
+
+#~ msgctxt "machine_nozzle_heat_up_speed label"
+#~ msgid "Heat up speed"
+#~ msgstr "Lämpenemisnopeus"
+
+#~ msgctxt "machine_nozzle_cool_down_speed label"
+#~ msgid "Cool down speed"
+#~ msgstr "Jäähdytysnopeus"
+
+#~ msgctxt "machine_disallowed_areas label"
+#~ msgid "Disallowed areas"
+#~ msgstr "Kielletyt alueet"
+
+#~ msgctxt "machine_head_polygon label"
+#~ msgid "Machine head polygon"
+#~ msgstr "Laiteen pään monikulmio"
+
+#~ msgctxt "machine_head_with_fans_polygon label"
+#~ msgid "Machine head & Fan polygon"
+#~ msgstr "Laiteen pään ja tuulettimen monikulmio"
+
+#~ msgctxt "gantry_height label"
+#~ msgid "Gantry height"
+#~ msgstr "Korokkeen korkeus"
+
+#~ msgctxt "machine_use_extruder_offset_to_offset_coords label"
+#~ msgid "Offset With Extruder"
+#~ msgstr "Suulakkeen siirtymä"
+
#~ msgctxt "skin_overlap_mm description"
#~ msgid "The amount of overlap between the skin and the walls. A slight overlap allows the walls to connect firmly to the skin."
#~ msgstr "Limityksen määrä pintakalvon ja seinämien välillä. Pienellä limityksellä seinämät liittyvät tukevasti pintakalvoon."
diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po
index cc91fe8cdb..41917b4933 100644
--- a/resources/i18n/fr_FR/cura.po
+++ b/resources/i18n/fr_FR/cura.po
@@ -5,20 +5,20 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2019-03-13 14:00+0200\n"
-"Last-Translator: Bothof \n"
-"Language-Team: French\n"
+"POT-Creation-Date: 2019-07-16 14:38+0200\n"
+"PO-Revision-Date: 2019-07-29 15:51+0200\n"
+"Last-Translator: Lionbridge \n"
+"Language-Team: French , French \n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Poedit 2.0.6\n"
+"X-Generator: Poedit 2.2.3\n"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:27
msgctxt "@action"
msgid "Machine Settings"
msgstr "Paramètres de la machine"
@@ -56,7 +56,7 @@ msgctxt "@info:title"
msgid "3D Model Assistant"
msgstr "Assistant de modèle 3D"
-#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:86
+#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:90
#, python-brace-format
msgctxt "@info:status"
msgid ""
@@ -64,17 +64,11 @@ msgid ""
"{model_names}
\n"
"Find out how to ensure the best possible print quality and reliability.
\n"
"View print quality guide
"
-msgstr "Un ou plusieurs modèles 3D peuvent ne pas s'imprimer de manière optimale en raison de la taille du modèle et de la configuration matérielle :
\n{model_names}
\nDécouvrez comment optimiser la qualité et la fiabilité de l'impression.
\nConsultez le guide de qualité d'impression
"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
-msgctxt "@item:inmenu"
-msgid "Changelog"
-msgstr "Récapitulatif des changements"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
-msgctxt "@item:inmenu"
-msgid "Show Changelog"
-msgstr "Afficher le récapitulatif des changements"
+msgstr ""
+"Un ou plusieurs modèles 3D peuvent ne pas s'imprimer de manière optimale en raison de la taille du modèle et de la configuration matérielle :
\n"
+"{model_names}
\n"
+"Découvrez comment optimiser la qualité et la fiabilité de l'impression.
\n"
+"Consultez le guide de qualité d'impression
"
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py:25
msgctxt "@action"
@@ -91,37 +85,36 @@ msgctxt "@info:status"
msgid "Profile has been flattened & activated."
msgstr "Le profil a été aplati et activé."
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:33
+#: /home/ruben/Projects/Cura/plugins/AMFReader/__init__.py:15
+msgctxt "@item:inlistbox"
+msgid "AMF File"
+msgstr "Fichier AMF"
+
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:37
msgctxt "@item:inmenu"
msgid "USB printing"
msgstr "Impression par USB"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:34
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:38
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print via USB"
msgstr "Imprimer via USB"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:35
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:39
msgctxt "@info:tooltip"
msgid "Print via USB"
msgstr "Imprimer via USB"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:71
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:75
msgctxt "@info:status"
msgid "Connected via USB"
msgstr "Connecté via USB"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:96
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:100
msgctxt "@label"
msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?"
msgstr "Une impression USB est en cours, la fermeture de Cura arrêtera cette impression. Êtes-vous sûr ?"
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
-msgctxt "X3G Writer File Description"
-msgid "X3G File"
-msgstr "Fichier X3G"
-
#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/GPX-prefix/src/GPX/slicerplugins/cura15.06/X3gWriter/__init__.py:16
msgctxt "X3g Writer Plugin Description"
msgid "Writes X3g to files"
@@ -132,6 +125,11 @@ msgctxt "X3g Writer File Description"
msgid "X3g File"
msgstr "Fichier X3G"
+#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
+msgctxt "X3G Writer File Description"
+msgid "X3G File"
+msgstr "Fichier X3G"
+
#: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/__init__.py:17
#: /home/ruben/Projects/Cura/plugins/GCodeGzReader/__init__.py:17
msgctxt "@item:inlistbox"
@@ -144,6 +142,7 @@ msgid "GCodeGzWriter does not support text mode."
msgstr "GCodeGzWriter ne prend pas en charge le mode texte."
#: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:28
+#: /home/ruben/Projects/Cura/plugins/UFPReader/__init__.py:22
msgctxt "@item:inlistbox"
msgid "Ultimaker Format Package"
msgstr "Ultimaker Format Package"
@@ -202,10 +201,10 @@ msgid "Could not save to removable drive {0}: {1}"
msgstr "Impossible d'enregistrer sur le lecteur {0}: {1}"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:137
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:152
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:133
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:140
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1629
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:188
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:134
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:141
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1622
msgctxt "@info:title"
msgid "Error"
msgstr "Erreur"
@@ -234,9 +233,9 @@ msgstr "Ejecter le lecteur amovible {0}"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:151
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:163
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1619
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1719
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1612
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1712
msgctxt "@info:title"
msgid "Warning"
msgstr "Avertissement"
@@ -263,266 +262,267 @@ msgctxt "@item:intext"
msgid "Removable Drive"
msgstr "Lecteur amovible"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:74
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:93
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print over network"
msgstr "Imprimer sur le réseau"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:89
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:76
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:94
msgctxt "@properties:tooltip"
msgid "Print over network"
msgstr "Imprimer sur le réseau"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:95
msgctxt "@info:status"
msgid "Connected over the network."
msgstr "Connecté sur le réseau."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
msgctxt "@info:status"
msgid "Connected over the network. Please approve the access request on the printer."
msgstr "Connecté sur le réseau. Veuillez approuver la demande d'accès sur l'imprimante."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:93
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:100
msgctxt "@info:status"
msgid "Connected over the network. No access to control the printer."
msgstr "Connecté sur le réseau. Pas d'accès pour commander l'imprimante."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
msgctxt "@info:status"
msgid "Access to the printer requested. Please approve the request on the printer"
msgstr "Accès à l'imprimante demandé. Veuillez approuver la demande sur l'imprimante"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:101
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
msgctxt "@info:title"
msgid "Authentication status"
msgstr "Statut d'authentification"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:103
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:109
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:113
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:120
msgctxt "@info:title"
msgid "Authentication Status"
msgstr "Statut d'authentification"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:104
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:187
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:111
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:198
msgctxt "@action:button"
msgid "Retry"
msgstr "Réessayer"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
msgctxt "@info:tooltip"
msgid "Re-send the access request"
msgstr "Renvoyer la demande d'accès"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:115
msgctxt "@info:status"
msgid "Access to the printer accepted"
msgstr "Accès à l'imprimante accepté"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:119
msgctxt "@info:status"
msgid "No access to print with this printer. Unable to send print job."
msgstr "Aucun accès pour imprimer avec cette imprimante. Impossible d'envoyer la tâche d'impression."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:114
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:121
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:65
msgctxt "@action:button"
msgid "Request Access"
msgstr "Demande d'accès"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:123
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:66
msgctxt "@info:tooltip"
msgid "Send access request to the printer"
msgstr "Envoyer la demande d'accès à l'imprimante"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:201
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:208
msgctxt "@label"
msgid "Unable to start a new print job."
msgstr "Impossible de démarrer une nouvelle tâche d'impression."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:203
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:210
msgctxt "@label"
msgid "There is an issue with the configuration of your Ultimaker, which makes it impossible to start the print. Please resolve this issues before continuing."
msgstr "Un problème avec la configuration de votre Ultimaker empêche le démarrage de l'impression. Veuillez résoudre ce problème avant de continuer."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:209
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:231
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:216
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:238
msgctxt "@window:title"
msgid "Mismatched configuration"
msgstr "Configuration différente"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:230
msgctxt "@label"
msgid "Are you sure you wish to print with the selected configuration?"
msgstr "Êtes-vous sûr(e) de vouloir imprimer avec la configuration sélectionnée ?"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:225
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:232
msgctxt "@label"
msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer."
msgstr "Problème de compatibilité entre la configuration ou l'étalonnage de l'imprimante et Cura. Pour un résultat optimal, découpez toujours pour les PrintCores et matériaux insérés dans votre imprimante."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:252
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:162
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:162
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:176
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:181
msgctxt "@info:status"
msgid "Sending new jobs (temporarily) blocked, still sending the previous print job."
msgstr "Envoi de nouvelles tâches (temporairement) bloqué, envoi de la tâche d'impression précédente en cours."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:180
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:197
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:266
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:194
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:211
msgctxt "@info:status"
msgid "Sending data to printer"
msgstr "Envoi des données à l'imprimante"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:260
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:182
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:199
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:267
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:196
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:213
msgctxt "@info:title"
msgid "Sending Data"
msgstr "Envoi des données"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:261
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:200
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:268
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:214
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:18
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:19
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:81
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:395
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:410
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:20
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:38
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:143
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:58
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:149
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:391
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:254
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:283
msgctxt "@action:button"
msgid "Cancel"
msgstr "Annuler"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:324
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:331
#, python-brace-format
msgctxt "@info:status"
msgid "No Printcore loaded in slot {slot_number}"
msgstr "Pas de PrintCore inséré dans la fente {slot_number}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:337
#, python-brace-format
msgctxt "@info:status"
msgid "No material loaded in slot {slot_number}"
msgstr "Aucun matériau inséré dans la fente {slot_number}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:353
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:360
#, python-brace-format
msgctxt "@label"
msgid "Different PrintCore (Cura: {cura_printcore_name}, Printer: {remote_printcore_name}) selected for extruder {extruder_id}"
msgstr "PrintCore différent (Cura : {cura_printcore_name}, Imprimante : {remote_printcore_name}) sélectionné pour l'extrudeuse {extruder_id}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:362
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:369
#, python-brace-format
msgctxt "@label"
msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "Matériau différent (Cura : {0}, Imprimante : {1}) sélectionné pour l'extrudeuse {2}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:548
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:555
msgctxt "@window:title"
msgid "Sync with your printer"
msgstr "Synchroniser avec votre imprimante"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:550
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:557
msgctxt "@label"
msgid "Would you like to use your current printer configuration in Cura?"
msgstr "Voulez-vous utiliser votre configuration d'imprimante actuelle dans Cura ?"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:552
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:559
msgctxt "@label"
msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer."
msgstr "Les PrintCores et / ou matériaux sur votre imprimante diffèrent de ceux de votre projet actuel. Pour un résultat optimal, découpez toujours pour les PrintCores et matériaux insérés dans votre imprimante."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:96
msgctxt "@info:status"
msgid "Connected over the network"
msgstr "Connecté sur le réseau"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:275
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:342
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:370
msgctxt "@info:status"
msgid "Print job was successfully sent to the printer."
msgstr "L'envoi de la tâche d'impression à l'imprimante a réussi."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:277
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:343
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:291
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:371
msgctxt "@info:title"
msgid "Data Sent"
msgstr "Données envoyées"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:278
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:292
msgctxt "@action:button"
msgid "View in Monitor"
msgstr "Afficher sur le moniteur"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:390
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:290
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:411
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Printer '{printer_name}' has finished printing '{job_name}'."
msgstr "{printer_name} a terminé d'imprimer '{job_name}'."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:392
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:294
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:413
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:322
#, python-brace-format
msgctxt "@info:status"
msgid "The print job '{job_name}' was finished."
msgstr "La tâche d'impression '{job_name}' est terminée."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:393
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:414
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:316
msgctxt "@info:status"
msgid "Print finished"
msgstr "Impression terminée"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:573
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:595
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:629
msgctxt "@label:material"
msgid "Empty"
msgstr "Vide"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:596
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:630
msgctxt "@label:material"
msgid "Unknown"
msgstr "Inconnu"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:169
msgctxt "@action:button"
msgid "Print via Cloud"
msgstr "Imprimer via le cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:170
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
msgstr "Imprimer via le cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:171
msgctxt "@info:status"
msgid "Connected via Cloud"
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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:182
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:359
msgctxt "@info:title"
msgid "Cloud error"
msgstr "Erreur de cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:199
msgctxt "@info:status"
msgid "Could not export print job."
msgstr "Impossible d'exporter la tâche d'impression."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:358
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
msgstr "Impossible de transférer les données à l'imprimante."
@@ -537,48 +537,52 @@ msgctxt "@info:status"
msgid "today"
msgstr "aujourd'hui"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:187
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
msgstr "Une erreur s'est produite lors de la connexion au cloud."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
+msgctxt "@info:status"
+msgid "Sending Print Job"
+msgstr "Lancement d'une tâche d'impression"
+
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
-msgid "Sending data to remote cluster"
-msgstr "Envoi de données à un cluster distant"
+msgid "Uploading via Ultimaker Cloud"
+msgstr "Téléchargement via Ultimaker Cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:621
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
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"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:627
+msgctxt "@info:status Ultimaker Cloud is a brand name and shouldn't be translated."
msgid "Connect to Ultimaker Cloud"
msgstr "Se connecter à Ultimaker Cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:628
msgctxt "@action"
msgid "Don't ask me again for this printer."
msgstr "Ne plus me demander pour cette imprimante."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:631
msgctxt "@action"
msgid "Get started"
msgstr "Prise en main"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:637
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:643
msgctxt "@info:status"
msgid "Connected!"
msgstr "Connecté !"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:645
msgctxt "@action"
msgid "Review your connection"
msgstr "Consulter votre connexion"
@@ -593,7 +597,7 @@ msgctxt "@item:inmenu"
msgid "Monitor"
msgstr "Surveiller"
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:124
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:118
msgctxt "@info"
msgid "Could not access update information."
msgstr "Impossible d'accéder aux informations de mise à jour."
@@ -650,46 +654,11 @@ msgctxt "@info:tooltip"
msgid "Create a volume in which supports are not printed."
msgstr "Créer un volume dans lequel les supports ne sont pas imprimés."
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:52
-msgctxt "@info"
-msgid "Cura collects anonymized usage statistics."
-msgstr "Cura recueille des statistiques d'utilisation anonymes."
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:55
-msgctxt "@info:title"
-msgid "Collecting Data"
-msgstr "Collecte des données"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:57
-msgctxt "@action:button"
-msgid "More info"
-msgstr "Plus d'informations"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:58
-msgctxt "@action:tooltip"
-msgid "See more information on what data Cura sends."
-msgstr "Voir plus d'informations sur les données envoyées par Cura."
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:60
-msgctxt "@action:button"
-msgid "Allow"
-msgstr "Autoriser"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:61
-msgctxt "@action:tooltip"
-msgid "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."
-msgstr "Autoriser Cura à envoyer des statistiques d'utilisation anonymes pour mieux prioriser les améliorations futures apportées à Cura. Certaines de vos préférences et paramètres sont envoyés, ainsi que la version du logiciel Cura et un hachage des modèles que vous découpez."
-
#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "Cura 15.04 profiles"
msgstr "Profils Cura 15.04"
-#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
-msgctxt "@item:inmenu"
-msgid "Evaluation"
-msgstr "Évaluation"
-
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "JPG Image"
@@ -715,56 +684,56 @@ msgctxt "@item:inlistbox"
msgid "GIF Image"
msgstr "Image GIF"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
msgctxt "@info:status"
msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration."
msgstr "Impossible de découper le matériau actuel, car celui-ci est incompatible avec la machine ou la configuration sélectionnée."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:389
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:398
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:407
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:416
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:362
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:386
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:395
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:404
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:413
msgctxt "@info:title"
msgid "Unable to slice"
msgstr "Impossible de découper"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:364
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:361
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to slice with the current settings. The following settings have errors: {0}"
msgstr "Impossible de couper avec les paramètres actuels. Les paramètres suivants contiennent des erreurs : {0}"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:388
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:385
#, 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 "Impossible de couper en raison de certains paramètres par modèle. Les paramètres suivants contiennent des erreurs sur un ou plusieurs modèles : {error_labels}"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:397
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:394
msgctxt "@info:status"
msgid "Unable to slice because the prime tower or prime position(s) are invalid."
msgstr "Impossible de couper car la tour primaire ou la (les) position(s) d'amorçage ne sont pas valides."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:406
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:403
#, python-format
msgctxt "@info:status"
msgid "Unable to slice because there are objects associated with disabled Extruder %s."
msgstr "Impossible de couper car il existe des objets associés à l'extrudeuse désactivée %s."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:412
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 "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
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:status"
msgid "Processing Layers"
msgstr "Traitement des couches"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:title"
msgid "Information"
msgstr "Informations"
@@ -795,19 +764,19 @@ msgctxt "@item:inlistbox"
msgid "3MF File"
msgstr "Fichier 3MF"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:190
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:763
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:191
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:775
msgctxt "@label"
msgid "Nozzle"
msgstr "Buse"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:469
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:474
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead."
msgstr "Le fichier projet {0} contient un type de machine inconnu {1}. Impossible d'importer la machine. Les modèles seront importés à la place."
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:472
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:477
msgctxt "@info:title"
msgid "Open Project File"
msgstr "Ouvrir un fichier de projet"
@@ -822,18 +791,18 @@ msgctxt "@item:inlistbox"
msgid "G File"
msgstr "Fichier G"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:324
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:328
msgctxt "@info:status"
msgid "Parsing G-code"
msgstr "Analyse du G-Code"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:326
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:476
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:330
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:483
msgctxt "@info:title"
msgid "G-code Details"
msgstr "Détails G-Code"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:474
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:481
msgctxt "@info:generic"
msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate."
msgstr "Assurez-vous que le g-code est adapté à votre imprimante et à la configuration de l'imprimante avant d'y envoyer le fichier. La représentation du g-code peut ne pas être exacte."
@@ -856,7 +825,7 @@ msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
msgstr "Une erreur s’est produite lors du listage de vos sauvegardes."
-#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
+#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:132
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
msgstr "Une erreur s’est produite lors de la tentative de restauration de votre sauvegarde."
@@ -917,243 +886,261 @@ msgctxt "@item:inmenu"
msgid "Preview"
msgstr "Aperçu"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:19
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
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"
msgstr "Nivellement du plateau"
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:81
-msgctxt "@tooltip"
-msgid "Outer Wall"
-msgstr "Paroi externe"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:82
-msgctxt "@tooltip"
-msgid "Inner Walls"
-msgstr "Parois internes"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:83
-msgctxt "@tooltip"
-msgid "Skin"
-msgstr "Couche extérieure"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:84
-msgctxt "@tooltip"
-msgid "Infill"
-msgstr "Remplissage"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:85
-msgctxt "@tooltip"
-msgid "Support Infill"
-msgstr "Remplissage du support"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:86
-msgctxt "@tooltip"
-msgid "Support Interface"
-msgstr "Interface du support"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:87
-msgctxt "@tooltip"
-msgid "Support"
-msgstr "Support"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88
-msgctxt "@tooltip"
-msgid "Skirt"
-msgstr "Jupe"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89
-msgctxt "@tooltip"
-msgid "Travel"
-msgstr "Déplacement"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90
-msgctxt "@tooltip"
-msgid "Retractions"
-msgstr "Rétractions"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91
-msgctxt "@tooltip"
-msgid "Other"
-msgstr "Autre"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:309
-#, python-brace-format
-msgctxt "@label"
-msgid "Pre-sliced file {0}"
-msgstr "Fichier {0} prédécoupé"
-
-#: /home/ruben/Projects/Cura/cura/API/Account.py:77
+#: /home/ruben/Projects/Cura/cura/API/Account.py:82
msgctxt "@info:title"
msgid "Login failed"
msgstr "La connexion a échoué"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:201
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121
+#: /home/ruben/Projects/Cura/cura/Settings/cura_empty_instance_containers.py:33
+msgctxt "@info:not supported profile"
+msgid "Not supported"
+msgstr "Non pris en charge"
+
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:203
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
msgctxt "@title:window"
msgid "File Already Exists"
msgstr "Le fichier existe déjà"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:202
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:204
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:123
#, python-brace-format
msgctxt "@label Don't translate the XML tag !"
msgid "The file {0} already exists. Are you sure you want to overwrite it?"
msgstr "Le fichier {0} existe déjà. Êtes-vous sûr de vouloir le remplacer ?"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:425
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:427
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:430
msgctxt "@info:status"
msgid "Invalid file URL:"
msgstr "URL de fichier invalide :"
-#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
-msgctxt "@menuitem"
-msgid "Not overridden"
-msgstr "Pas écrasé"
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:925
+msgctxt "@info:message Followed by a list of settings."
+msgid "Settings have been changed to match the current availability of extruders:"
+msgstr "Les paramètres ont été modifiés pour correspondre aux extrudeuses actuellement disponibles :"
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:915
-#, python-format
-msgctxt "@info:generic"
-msgid "Settings have been changed to match the current availability of extruders: [%s]"
-msgstr "Les paramètres ont été modifiés pour correspondre aux extrudeuses actuellement disponibles : [%s]"
-
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:917
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:927
msgctxt "@info:title"
msgid "Settings updated"
msgstr "Paramètres mis à jour"
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1481
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
msgstr "Extrudeuse(s) désactivée(s)"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:132
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to export profile to {0}: {1}"
msgstr "Échec de l'exportation du profil vers {0} : {1}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:138
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:139
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Failed to export profile to {0}: Writer plugin reported failure."
msgstr "Échec de l'exportation du profil vers {0} : le plug-in du générateur a rapporté une erreur."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Exported profile to {0}"
msgstr "Profil exporté vers {0}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145
msgctxt "@info:title"
msgid "Export succeeded"
msgstr "L'exportation a réussi"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:170
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:172
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
msgstr "Impossible d'importer le profil depuis {0} : {1}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:176
#, 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 "Impossible d'importer le profil depuis {0} avant l'ajout d'une imprimante."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:192
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "No custom profile to import in file {0}"
msgstr "Aucun profil personnalisé à importer dans le fichier {0}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:194
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:196
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}:"
msgstr "Échec de l'importation du profil depuis le fichier {0} :"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:218
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:228
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:220
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "This profile {0} contains incorrect data, could not import it."
msgstr "Le profil {0} contient des données incorrectes ; échec de l'importation."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:241
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:243
#, 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 "La machine définie dans le profil {0} ({1}) ne correspond pas à votre machine actuelle ({2}) ; échec de l'importation."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:315
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to import profile from {0}:"
msgstr "Échec de l'importation du profil depuis le fichier {0} :"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:316
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Successfully imported profile {0}"
msgstr "Importation du profil {0} réussie"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:319
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321
#, python-brace-format
msgctxt "@info:status"
msgid "File {0} does not contain any valid profile."
msgstr "Le fichier {0} ne contient pas de profil valide."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:322
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:324
#, python-brace-format
msgctxt "@info:status"
msgid "Profile {0} has an unknown file type or is corrupted."
msgstr "Le profil {0} est un type de fichier inconnu ou est corrompu."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:340
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:359
msgctxt "@label"
msgid "Custom profile"
msgstr "Personnaliser le profil"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:356
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:375
msgctxt "@info:status"
msgid "Profile is missing a quality type."
msgstr "Il manque un type de qualité au profil."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:370
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:389
#, python-brace-format
msgctxt "@info:status"
msgid "Could not find a quality type {0} for the current configuration."
msgstr "Impossible de trouver un type de qualité {0} pour la configuration actuelle."
-#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:69
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:76
+msgctxt "@tooltip"
+msgid "Outer Wall"
+msgstr "Paroi externe"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:77
+msgctxt "@tooltip"
+msgid "Inner Walls"
+msgstr "Parois internes"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:78
+msgctxt "@tooltip"
+msgid "Skin"
+msgstr "Couche extérieure"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:79
+msgctxt "@tooltip"
+msgid "Infill"
+msgstr "Remplissage"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:80
+msgctxt "@tooltip"
+msgid "Support Infill"
+msgstr "Remplissage du support"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:81
+msgctxt "@tooltip"
+msgid "Support Interface"
+msgstr "Interface du support"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:82
+msgctxt "@tooltip"
+msgid "Support"
+msgstr "Support"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:83
+msgctxt "@tooltip"
+msgid "Skirt"
+msgstr "Jupe"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:84
+msgctxt "@tooltip"
+msgid "Prime Tower"
+msgstr "Tour primaire"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:85
+msgctxt "@tooltip"
+msgid "Travel"
+msgstr "Déplacement"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:86
+msgctxt "@tooltip"
+msgid "Retractions"
+msgstr "Rétractions"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:87
+msgctxt "@tooltip"
+msgid "Other"
+msgstr "Autre"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:306
+#, python-brace-format
+msgctxt "@label"
+msgid "Pre-sliced file {0}"
+msgstr "Fichier {0} prédécoupé"
+
+#: /home/ruben/Projects/Cura/cura/UI/WelcomePagesModel.py:56
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:62
+msgctxt "@action:button"
+msgid "Next"
+msgstr "Suivant"
+
+#: /home/ruben/Projects/Cura/cura/UI/ObjectsModel.py:61
#, python-brace-format
msgctxt "@label"
msgid "Group #{group_nr}"
msgstr "Groupe nº {group_nr}"
-#: /home/ruben/Projects/Cura/cura/Machines/Models/MachineManagementModel.py:65
-msgctxt "@info:title"
-msgid "Network enabled printers"
-msgstr "Imprimantes réseau"
+#: /home/ruben/Projects/Cura/cura/UI/WhatsNewPagesModel.py:17
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:185
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:85
+#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:482
+#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:508
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:124
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:168
+msgctxt "@action:button"
+msgid "Close"
+msgstr "Fermer"
-#: /home/ruben/Projects/Cura/cura/Machines/Models/MachineManagementModel.py:80
-msgctxt "@info:title"
-msgid "Local printers"
-msgstr "Imprimantes locales"
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:17
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:91
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:48
+msgctxt "@action:button"
+msgid "Add"
+msgstr "Ajouter"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/ExtrudersModel.py:208
+msgctxt "@menuitem"
+msgid "Not overridden"
+msgstr "Pas écrasé"
#: /home/ruben/Projects/Cura/cura/Machines/Models/QualityManagementModel.py:109
#, python-brace-format
@@ -1166,23 +1153,41 @@ msgctxt "@item:inlistbox"
msgid "All Files (*)"
msgstr "Tous les fichiers (*)"
-#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:665
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:86
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:182
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:269
+msgctxt "@label"
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:116
+msgctxt "@label"
+msgid "The printer(s) below cannot be connected because they are part of a group"
+msgstr "Les imprimantes ci-dessous ne peuvent pas être connectées car elles font partie d'un groupe"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:118
+msgctxt "@label"
+msgid "Available networked printers"
+msgstr "Imprimantes en réseau disponibles"
+
+#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:689
msgctxt "@label"
msgid "Custom Material"
msgstr "Matériau personnalisé"
-#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:666
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:256
+#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:690
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:203
msgctxt "@label"
msgid "Custom"
msgstr "Personnalisé"
-#: /home/ruben/Projects/Cura/cura/BuildVolume.py:81
+#: /home/ruben/Projects/Cura/cura/BuildVolume.py:89
msgctxt "@info:status"
msgid "The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from colliding with printed models."
msgstr "La hauteur du volume d'impression a été réduite en raison de la valeur du paramètre « Séquence d'impression » afin d'éviter que le portique ne heurte les modèles imprimés."
-#: /home/ruben/Projects/Cura/cura/BuildVolume.py:83
+#: /home/ruben/Projects/Cura/cura/BuildVolume.py:91
msgctxt "@info:title"
msgid "Build Volume"
msgstr "Volume d'impression"
@@ -1197,16 +1202,31 @@ msgctxt "@info:backup_failed"
msgid "Tried to restore a Cura backup without having proper data or meta data."
msgstr "A essayé de restaurer une sauvegarde Cura sans disposer de données ou de métadonnées appropriées."
-#: /home/ruben/Projects/Cura/cura/Backups/Backup.py:124
+#: /home/ruben/Projects/Cura/cura/Backups/Backup.py:125
msgctxt "@info:backup_failed"
-msgid "Tried to restore a Cura backup that does not match your current version."
-msgstr "A essayé de restaurer une sauvegarde Cura qui ne correspond pas à votre version actuelle."
+msgid "Tried to restore a Cura backup that is higher than the current version."
+msgstr "A essayé de restaurer une sauvegarde Cura supérieure à la version actuelle."
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationHelpers.py:79
+msgctxt "@message"
+msgid "Could not read response."
+msgstr "Impossible de lire la réponse."
+
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
msgstr "Impossible d’atteindre le serveur du compte Ultimaker."
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationRequestHandler.py:66
+msgctxt "@message"
+msgid "Please give the required permissions when authorizing this application."
+msgstr "Veuillez donner les permissions requises lors de l'autorisation de cette application."
+
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationRequestHandler.py:73
+msgctxt "@message"
+msgid "Something unexpected happened when trying to log in, please try again."
+msgstr "Une erreur s'est produite lors de la connexion, veuillez réessayer."
+
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
msgid "Multiplying and placing objects"
@@ -1219,7 +1239,7 @@ msgstr "Placement des objets"
#: /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
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:149
msgctxt "@info:status"
msgid "Unable to find a location within the build volume for all objects"
msgstr "Impossible de trouver un emplacement dans le volume d'impression pour tous les objets"
@@ -1230,19 +1250,19 @@ msgid "Placing Object"
msgstr "Placement de l'objet"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:30
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:67
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:66
msgctxt "@info:status"
msgid "Finding new location for objects"
msgstr "Recherche d'un nouvel emplacement pour les objets"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:34
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:71
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:70
msgctxt "@info:title"
msgid "Finding Location"
msgstr "Recherche d'emplacement"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:104
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:151
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:150
msgctxt "@info:title"
msgid "Can't Find Location"
msgstr "Impossible de trouver un emplacement"
@@ -1260,7 +1280,12 @@ 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.
\n"
+" "
#: /home/ruben/Projects/Cura/cura/CrashHandler.py:98
msgctxt "@action:button"
@@ -1293,7 +1318,10 @@ msgid ""
"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"
@@ -1365,242 +1393,195 @@ msgstr "Journaux"
#: /home/ruben/Projects/Cura/cura/CrashHandler.py:322
msgctxt "@title:groupbox"
-msgid "User description"
-msgstr "Description de l'utilisateur"
+msgid "User description (Note: Developers may not speak your language, please use English if possible)"
+msgstr "Description de l'utilisateur (Remarque : les développeurs peuvent ne pas partler votre langue. Veuillez utiliser l'anglais si possible)"
-#: /home/ruben/Projects/Cura/cura/CrashHandler.py:341
+#: /home/ruben/Projects/Cura/cura/CrashHandler.py:342
msgctxt "@action:button"
msgid "Send report"
msgstr "Envoyer rapport"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:480
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:504
msgctxt "@info:progress"
msgid "Loading machines..."
msgstr "Chargement des machines..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:781
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:819
msgctxt "@info:progress"
msgid "Setting up scene..."
msgstr "Préparation de la scène..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:817
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:854
msgctxt "@info:progress"
msgid "Loading interface..."
msgstr "Chargement de l'interface..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1059
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1133
#, python-format
msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm."
msgid "%(width).1f x %(depth).1f x %(height).1f mm"
msgstr "%(width).1f x %(depth).1f x %(height).1f mm"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1618
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1611
#, python-brace-format
msgctxt "@info:status"
msgid "Only one G-code file can be loaded at a time. Skipped importing {0}"
msgstr "Un seul fichier G-Code peut être chargé à la fois. Importation de {0} sautée"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1628
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1621
#, python-brace-format
msgctxt "@info:status"
msgid "Can't open any other file if G-code is loading. Skipped importing {0}"
msgstr "Impossible d'ouvrir un autre fichier si le G-Code est en cours de chargement. Importation de {0} sautée"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1718
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1711
msgctxt "@info:status"
msgid "The selected model was too small to load."
msgstr "Le modèle sélectionné était trop petit pour être chargé."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:62
-msgctxt "@title"
-msgid "Machine Settings"
-msgstr "Paramètres de la machine"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:81
-msgctxt "@title:tab"
-msgid "Printer"
-msgstr "Imprimante"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:100
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:58
+msgctxt "@title:label"
msgid "Printer Settings"
msgstr "Paramètres de l'imprimante"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:111
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:72
msgctxt "@label"
msgid "X (Width)"
msgstr "X (Largeur)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:112
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:122
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:132
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:238
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:387
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:403
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:429
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:441
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:897
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:76
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:90
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:104
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:194
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:213
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:232
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:253
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:272
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:79
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:93
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:109
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:124
msgctxt "@label"
msgid "mm"
msgstr "mm"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:121
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:86
msgctxt "@label"
msgid "Y (Depth)"
msgstr "Y (Profondeur)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:131
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:100
msgctxt "@label"
msgid "Z (Height)"
msgstr "Z (Hauteur)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:143
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:114
msgctxt "@label"
msgid "Build plate shape"
msgstr "Forme du plateau"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:152
-msgctxt "@option:check"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:127
+msgctxt "@label"
msgid "Origin at center"
msgstr "Origine au centre"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:160
-msgctxt "@option:check"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:139
+msgctxt "@label"
msgid "Heated bed"
msgstr "Plateau chauffant"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:171
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:151
msgctxt "@label"
msgid "G-code flavor"
msgstr "Parfum G-Code"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:184
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:176
+msgctxt "@title:label"
msgid "Printhead Settings"
msgstr "Paramètres de la tête d'impression"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:194
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:190
msgctxt "@label"
msgid "X min"
msgstr "X min"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:195
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Distance entre la gauche de la tête d'impression et le centre de la buse. Permet d'empêcher les collisions entre les impressions précédentes et la tête d'impression lors d'une impression « Un à la fois »."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:204
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:209
msgctxt "@label"
msgid "Y min"
msgstr "Y min"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:205
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Distance entre le devant de la tête d'impression et le centre de la buse. Permet d'empêcher les collisions entre les impressions précédentes et la tête d'impression lors d'une impression « Un à la fois »."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:214
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:228
msgctxt "@label"
msgid "X max"
msgstr "X max"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:215
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Distance entre la droite de la tête d'impression et le centre de la buse. Permet d'empêcher les collisions entre les impressions précédentes et la tête d'impression lors d'une impression « Un à la fois »."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:224
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:249
msgctxt "@label"
msgid "Y max"
msgstr "Y max"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:225
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Distance entre le dos de la tête d'impression et le centre de la buse. Permet d'empêcher les collisions entre les impressions précédentes et la tête d'impression lors d'une impression « Un à la fois »."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:237
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:268
msgctxt "@label"
-msgid "Gantry height"
+msgid "Gantry Height"
msgstr "Hauteur du portique"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:239
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "La différence de hauteur entre la pointe de la buse et le système de portique (axes X et Y). Permet d'empêcher les collisions entre les impressions précédentes et le portique lors d'une impression « Un à la fois »."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:258
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:282
msgctxt "@label"
msgid "Number of Extruders"
msgstr "Nombre d'extrudeuses"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:314
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:341
+msgctxt "@title:label"
msgid "Start G-code"
msgstr "G-Code de démarrage"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:324
-msgctxt "@tooltip"
-msgid "G-code commands to be executed at the very start."
-msgstr "Commandes G-Code à exécuter au tout début."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:333
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:355
+msgctxt "@title:label"
msgid "End G-code"
msgstr "G-Code de fin"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:343
-msgctxt "@tooltip"
-msgid "G-code commands to be executed at the very end."
-msgstr "Commandes G-Code à exécuter tout à la fin."
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:42
+msgctxt "@title:tab"
+msgid "Printer"
+msgstr "Imprimante"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:374
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:63
+msgctxt "@title:label"
msgid "Nozzle Settings"
msgstr "Paramètres de la buse"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:386
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:75
msgctxt "@label"
msgid "Nozzle size"
msgstr "Taille de la buse"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:402
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:89
msgctxt "@label"
msgid "Compatible material diameter"
msgstr "Diamètre du matériau compatible"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:404
-msgctxt "@tooltip"
-msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile."
-msgstr "Le diamètre nominal de filament pris en charge par l'imprimante. Le diamètre exact sera remplacé par le matériau et / ou le profil."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:428
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:105
msgctxt "@label"
msgid "Nozzle offset X"
msgstr "Décalage buse X"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:440
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:120
msgctxt "@label"
msgid "Nozzle offset Y"
msgstr "Décalage buse Y"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:452
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:135
msgctxt "@label"
msgid "Cooling Fan Number"
msgstr "Numéro du ventilateur de refroidissement"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:453
-msgctxt "@label"
-msgid ""
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:473
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:162
+msgctxt "@title:label"
msgid "Extruder Start G-code"
msgstr "Extrudeuse G-Code de démarrage"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:491
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:176
+msgctxt "@title:label"
msgid "Extruder End G-code"
msgstr "Extrudeuse G-Code de fin"
@@ -1610,7 +1591,7 @@ msgid "Install"
msgstr "Installer"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:20
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:44
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:46
msgctxt "@action:button"
msgid "Installed"
msgstr "Installé"
@@ -1626,15 +1607,15 @@ msgid "ratings"
msgstr "évaluations"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:30
msgctxt "@title:tab"
msgid "Plugins"
msgstr "Plug-ins"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:69
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:42
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:66
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:361
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:70
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:44
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:80
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:417
msgctxt "@title:tab"
msgid "Materials"
msgstr "Matériaux"
@@ -1644,52 +1625,49 @@ msgctxt "@label"
msgid "Your rating"
msgstr "Votre évaluation"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:99
msgctxt "@label"
msgid "Version"
msgstr "Version"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:105
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:106
msgctxt "@label"
msgid "Last updated"
msgstr "Dernière mise à jour"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:112
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:260
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:113
msgctxt "@label"
msgid "Author"
msgstr "Auteur"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:119
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:120
msgctxt "@label"
msgid "Downloads"
msgstr "Téléchargements"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:181
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:222
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:265
-msgctxt "@label"
-msgid "Unknown"
-msgstr "Inconnu"
-
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:56
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
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/ToolboxDetailTileActions.qml:80
+msgctxt "@label:The string between and is the highlighted link"
+msgid "Buy material spools"
+msgstr "Acheter des bobines de matériau"
+
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:96
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
msgctxt "@action:button"
msgid "Update"
msgstr "Mise à jour"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:74
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:97
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:35
msgctxt "@action:button"
msgid "Updating"
msgstr "Mise à jour"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:75
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:98
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:36
msgctxt "@action:button"
msgid "Updated"
@@ -1765,7 +1743,7 @@ msgctxt "@label"
msgid "Generic Materials"
msgstr "Matériaux génériques"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:56
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:59
msgctxt "@title:tab"
msgid "Installed"
msgstr "Installé"
@@ -1801,7 +1779,10 @@ 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.\nVous devez approuver cette licence pour installer ce plug-in.\nAcceptez-vous les clauses ci-dessous ?"
+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 ?"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxLicenseDialog.qml:55
msgctxt "@action:button"
@@ -1848,12 +1829,12 @@ msgctxt "@info"
msgid "Fetching packages..."
msgstr "Récupération des paquets..."
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:90
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:91
msgctxt "@label"
msgid "Website"
msgstr "Site Internet"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:97
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:98
msgctxt "@label"
msgid "Email"
msgstr "E-mail"
@@ -1863,22 +1844,6 @@ msgctxt "@info:tooltip"
msgid "Some things could be problematic in this print. Click to see tips for adjustment."
msgstr "Certains éléments pourraient causer des problèmes à cette impression. Cliquez pour voir les conseils d'ajustement."
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18
-msgctxt "@label"
-msgid "Changelog"
-msgstr "Récapitulatif des changements"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:185
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:85
-#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:482
-#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:508
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:168
-msgctxt "@action:button"
-msgid "Close"
-msgstr "Fermer"
-
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:31
msgctxt "@title"
msgid "Update Firmware"
@@ -1954,38 +1919,40 @@ msgctxt "@label"
msgid "Firmware update failed due to missing firmware."
msgstr "Échec de la mise à jour du firmware en raison du firmware manquant."
-#: /home/ruben/Projects/Cura/plugins/UserAgreement/UserAgreement.qml:16
-msgctxt "@title:window"
-msgid "User Agreement"
-msgstr "Accord utilisateur"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:144
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:181
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:153
+msgctxt "@label"
+msgid "Glass"
+msgstr "Verre"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:208
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:249
msgctxt "@info"
-msgid "These options are not available because you are monitoring a cloud printer."
-msgstr "Ces options ne sont pas disponibles car vous surveillez une imprimante cloud."
+msgid "Please update your printer's firmware to manage the queue remotely."
+msgstr "Veuillez mettre à jour le Firmware de votre imprimante pour gérer la file d'attente à distance."
#: /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 "La webcam n'est pas disponible car vous surveillez une imprimante cloud."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:300
msgctxt "@label:status"
msgid "Loading..."
msgstr "Chargement..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:304
msgctxt "@label:status"
msgid "Unavailable"
msgstr "Indisponible"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:308
msgctxt "@label:status"
msgid "Unreachable"
msgstr "Injoignable"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:312
msgctxt "@label:status"
msgid "Idle"
msgstr "Inactif"
@@ -1995,37 +1962,31 @@ msgctxt "@label"
msgid "Untitled"
msgstr "Sans titre"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:374
msgctxt "@label"
msgid "Anonymous"
msgstr "Anonyme"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:401
msgctxt "@label:status"
msgid "Requires configuration changes"
msgstr "Nécessite des modifications de configuration"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:439
msgctxt "@action:button"
msgid "Details"
msgstr "Détails"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:130
msgctxt "@label"
msgid "Unavailable printer"
msgstr "Imprimante indisponible"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "First available"
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
-msgctxt "@label"
-msgid "Glass"
-msgstr "Verre"
-
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:31
msgctxt "@label"
msgid "Queued"
@@ -2033,178 +1994,191 @@ 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 "Aller à Cura Connect"
+msgid "Manage in browser"
+msgstr "Gérer dans le navigateur"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:100
+msgctxt "@label"
+msgid "There are no print jobs in the queue. Slice and send a job to add one."
+msgstr "Il n'y a pas de travaux d'impression dans la file d'attente. Découpez et envoyez une tache pour en ajouter une."
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Print jobs"
msgstr "Tâches d'impression"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:132
msgctxt "@label"
msgid "Total print time"
msgstr "Temps total d'impression"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:148
msgctxt "@label"
msgid "Waiting for"
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 "Voir l'historique d'impression"
-
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:50
msgctxt "@window:title"
msgid "Existing Connection"
msgstr "Connexion existante"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:48
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:52
msgctxt "@message:text"
msgid "This printer/group is already added to Cura. Please select another printer/group."
msgstr "Ce groupe / cette imprimante a déjà été ajouté à Cura. Veuillez sélectionner un autre groupe / imprimante."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:65
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:69
msgctxt "@title:window"
msgid "Connect to Networked Printer"
msgstr "Connecter à l'imprimante en réseau"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:77
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:81
msgctxt "@label"
-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\nSélectionnez votre imprimante dans la liste ci-dessous :"
+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."
+msgstr "Pour imprimer directement sur votre imprimante via le réseau, assurez-vous que votre imprimante est connectée au réseau via un câble Ethernet 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."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44
-msgctxt "@action:button"
-msgid "Add"
-msgstr "Ajouter"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:81
+msgctxt "@label"
+msgid "Select your printer from the list below:"
+msgstr "Sélectionnez votre imprimante dans la liste ci-dessous :"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:97
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:101
msgctxt "@action:button"
msgid "Edit"
msgstr "Modifier"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:108
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:128
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:117
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:112
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:146
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:55
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:121
msgctxt "@action:button"
msgid "Remove"
msgstr "Supprimer"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:120
msgctxt "@action:button"
msgid "Refresh"
msgstr "Rafraîchir"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:211
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:215
msgctxt "@label"
msgid "If your printer is not listed, read the network printing troubleshooting guide"
msgstr "Si votre imprimante n'apparaît pas dans la liste, lisez le guide de dépannage de l'impression en réseau"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:240
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:244
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:258
msgctxt "@label"
msgid "Type"
msgstr "Type"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:279
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:283
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:274
msgctxt "@label"
msgid "Firmware version"
msgstr "Version du firmware"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:293
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:297
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:290
msgctxt "@label"
msgid "Address"
msgstr "Adresse"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:317
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
msgctxt "@label"
msgid "This printer is not set up to host a group of printers."
msgstr "Cette imprimante n'est pas configurée pour héberger un groupe d'imprimantes."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:325
msgctxt "@label"
msgid "This printer is the host for a group of %1 printers."
msgstr "Cette imprimante est l'hôte d'un groupe d'imprimantes %1."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:332
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:336
msgctxt "@label"
msgid "The printer at this address has not yet responded."
msgstr "L'imprimante à cette adresse n'a pas encore répondu."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:337
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:341
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:74
msgctxt "@action:button"
msgid "Connect"
msgstr "Connecter"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:351
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:354
+msgctxt "@title:window"
+msgid "Invalid IP address"
+msgstr "Adresse IP non valide"
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:355
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:146
+msgctxt "@text"
+msgid "Please enter a valid IP address."
+msgstr "Veuillez saisir une adresse IP valide."
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:366
msgctxt "@title:window"
msgid "Printer Address"
msgstr "Adresse de l'imprimante"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:374
-msgctxt "@alabel"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:389
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:102
+msgctxt "@label"
msgid "Enter the IP address or hostname of your printer on the network."
msgstr "Saisissez l'adresse IP ou le nom d'hôte de votre imprimante sur le réseau."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:404
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:132
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:419
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:138
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181
msgctxt "@action:button"
msgid "OK"
msgstr "OK"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:88
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:100
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:78
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:90
msgctxt "@label:status"
msgid "Aborted"
msgstr "Abandonné"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:90
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:92
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:80
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:82
msgctxt "@label:status"
msgid "Finished"
msgstr "Terminé"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:94
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:84
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:86
msgctxt "@label:status"
msgid "Preparing..."
msgstr "Préparation..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:88
msgctxt "@label:status"
msgid "Aborting..."
msgstr "Abandon..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:92
msgctxt "@label:status"
msgid "Pausing..."
msgstr "Mise en pause..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:94
msgctxt "@label:status"
msgid "Paused"
msgstr "En pause"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Resuming..."
msgstr "Reprise..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Action required"
msgstr "Action requise"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:100
msgctxt "@label:status"
msgid "Finishes %1 at %2"
msgstr "Finit %1 à %2"
@@ -2308,44 +2282,44 @@ msgctxt "@action:button"
msgid "Override"
msgstr "Remplacer"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:85
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] "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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:89
msgctxt "@label"
msgid "The printer %1 is assigned, but the job contains an unknown material configuration."
msgstr "L'imprimante %1 est assignée, mais le projet contient une configuration matérielle inconnue."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:78
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:99
msgctxt "@label"
msgid "Change material %1 from %2 to %3."
msgstr "Changer le matériau %1 de %2 à %3."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:81
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:102
msgctxt "@label"
msgid "Load %3 as material %1 (This cannot be overridden)."
msgstr "Charger %3 comme matériau %1 (Ceci ne peut pas être remplacé)."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:84
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:105
msgctxt "@label"
msgid "Change print core %1 from %2 to %3."
msgstr "Changer le print core %1 de %2 à %3."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:87
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:108
msgctxt "@label"
msgid "Change build plate to %1 (This cannot be overridden)."
msgstr "Changer le plateau en %1 (Ceci ne peut pas être remplacé)."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:115
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:156
msgctxt "@label"
msgid "Aluminum"
msgstr "Aluminium"
@@ -2355,107 +2329,109 @@ msgctxt "@info:tooltip"
msgid "Connect to a printer"
msgstr "Connecter à une imprimante"
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:92
+#: /home/ruben/Projects/Cura/plugins/SettingsGuide/resources/qml/SettingsGuide.qml:16
+msgctxt "@title"
+msgid "Cura Settings Guide"
+msgstr "Guide des paramètres de Cura"
+
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:100
msgctxt "@info"
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 "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."
+"- Check if the printer is connected to the network.\n"
+"- Check if you are signed in to discover cloud-connected printers."
+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.- Vérifiez"
+" si vous êtes connecté pour découvrir les imprimantes connectées au cloud."
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:117
msgctxt "@info"
-msgid "Please select a network connected printer to monitor."
-msgstr "Veuillez sélectionner une imprimante à surveiller qui est connectée au réseau."
+msgid "Please connect your printer to the network."
+msgstr "Veuillez connecter votre imprimante 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 "Veuillez connecter votre imprimante Ultimaker à votre réseau local."
-
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:156
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
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
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:20
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:49
msgctxt "@label"
msgid "Color scheme"
msgstr "Modèle de couleurs"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:105
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:107
msgctxt "@label:listbox"
msgid "Material Color"
msgstr "Couleur du matériau"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:109
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:111
msgctxt "@label:listbox"
msgid "Line Type"
msgstr "Type de ligne"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:113
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:115
msgctxt "@label:listbox"
msgid "Feedrate"
msgstr "Taux d'alimentation"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:117
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:119
msgctxt "@label:listbox"
msgid "Layer thickness"
msgstr "Épaisseur de la couche"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:154
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:156
msgctxt "@label"
msgid "Compatibility Mode"
msgstr "Mode de compatibilité"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:230
msgctxt "@label"
msgid "Travels"
msgstr "Déplacements"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:236
msgctxt "@label"
msgid "Helpers"
msgstr "Aides"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:242
msgctxt "@label"
msgid "Shell"
msgstr "Coque"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:248
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
msgctxt "@label"
msgid "Infill"
msgstr "Remplissage"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:297
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:298
msgctxt "@label"
msgid "Only Show Top Layers"
msgstr "Afficher uniquement les couches supérieures"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:307
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:308
msgctxt "@label"
msgid "Show 5 Detailed Layers On Top"
msgstr "Afficher 5 niveaux détaillés en haut"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:321
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:322
msgctxt "@label"
msgid "Top / Bottom"
msgstr "Haut / bas"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:325
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:326
msgctxt "@label"
msgid "Inner Wall"
msgstr "Paroi interne"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:383
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:384
msgctxt "@label"
msgid "min"
msgstr "min."
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:432
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:433
msgctxt "@label"
msgid "max"
msgstr "max."
@@ -2485,30 +2461,25 @@ msgctxt "@info:tooltip"
msgid "Change active post-processing scripts"
msgstr "Modifier les scripts de post-traitement actifs"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:16
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:17
msgctxt "@title:window"
msgid "More information on anonymous data collection"
msgstr "Plus d'informations sur la collecte de données anonymes"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:66
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:74
msgctxt "@text:window"
-msgid "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."
-msgstr "Cura envoie des données anonymes à Ultimaker afin d'améliorer la qualité d'impression et l'expérience utilisateur. Voici un exemple de toutes les données envoyées."
+msgid "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:"
+msgstr "Ultimaker Cura recueille des données anonymes afin d'améliorer la qualité d'impression et l'expérience utilisateur. Voici un exemple de toutes les données partagées :"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:109
msgctxt "@text:window"
-msgid "I don't want to send this data"
-msgstr "Je ne veux pas envoyer ces données"
+msgid "I don't want to send anonymous data"
+msgstr "Je ne veux pas envoyer de données anonymes"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:118
msgctxt "@text:window"
-msgid "Allow sending this data to Ultimaker and help us improve Cura"
-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 "Aucune impression sélectionnée"
+msgid "Allow sending anonymous data"
+msgstr "Autoriser l'envoi de données anonymes"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2557,19 +2528,19 @@ msgstr "Profondeur (mm)"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126
msgctxt "@info:tooltip"
-msgid "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."
-msgstr "Par défaut, les pixels blancs représentent les points hauts sur la maille tandis que les pixels noirs représentent les points bas sur la maille. Modifiez cette option pour inverser le comportement de manière à ce que les pixels noirs représentent les points hauts sur la maille et les pixels blancs les points bas."
-
-#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
-msgctxt "@item:inlistbox"
-msgid "Lighter is higher"
-msgstr "Le plus clair est plus haut"
+msgid "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."
+msgstr "Pour les lithophanies, les pixels foncés doivent correspondre à des emplacements plus épais afin d'empêcher la lumière de passer. Pour des cartes de hauteur, les pixels clairs signifient un terrain plus élevé, de sorte que les pixels clairs doivent correspondre à des emplacements plus épais dans le modèle 3D généré."
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
msgctxt "@item:inlistbox"
msgid "Darker is higher"
msgstr "Le plus foncé est plus haut"
+#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
+msgctxt "@item:inlistbox"
+msgid "Lighter is higher"
+msgstr "Le plus clair est plus haut"
+
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149
msgctxt "@info:tooltip"
msgid "The amount of smoothing to apply to the image."
@@ -2683,7 +2654,7 @@ msgid "Printer Group"
msgstr "Groupe d'imprimantes"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:180
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:197
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:226
msgctxt "@action:label"
msgid "Profile settings"
msgstr "Paramètres de profil"
@@ -2696,19 +2667,19 @@ msgstr "Comment le conflit du profil doit-il être résolu ?"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:121
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:221
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:250
msgctxt "@action:label"
msgid "Name"
msgstr "Nom"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:231
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:205
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:234
msgctxt "@action:label"
msgid "Not in profile"
msgstr "Absent du profil"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:236
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:210
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:239
msgctxt "@action:label"
msgid "%1 override"
msgid_plural "%1 overrides"
@@ -2789,6 +2760,7 @@ 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
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:138
msgctxt "@button"
msgid "Sign in"
msgstr "Se connecter"
@@ -2879,22 +2851,23 @@ msgid "Previous"
msgstr "Précédent"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:60
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:152
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:174
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:159
msgctxt "@action:button"
msgid "Export"
msgstr "Exporter"
-#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:62
-msgctxt "@action:button"
-msgid "Next"
-msgstr "Suivant"
-
-#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:169
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:209
msgctxt "@label"
msgid "Tip"
msgstr "Astuce"
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMaterialMenu.qml:20
+#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:66
+msgctxt "@label:category menu label"
+msgid "Generic"
+msgstr "Générique"
+
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:160
msgctxt "@label"
msgid "Print experiment"
@@ -2905,150 +2878,51 @@ msgctxt "@label"
msgid "Checklist"
msgstr "Liste de contrôle"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25
-msgctxt "@title"
-msgid "Select Printer Upgrades"
-msgstr "Sélectionner les mises à niveau de l'imprimante"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:38
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:30
msgctxt "@label"
msgid "Please select any upgrades made to this Ultimaker 2."
msgstr "Sélectionnez les mises à niveau disponibles pour cet Ultimaker 2."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:47
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:44
msgctxt "@label"
msgid "Olsson Block"
msgstr "Blocage Olsson"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:30
msgctxt "@title"
msgid "Build Plate Leveling"
msgstr "Nivellement du plateau"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:44
msgctxt "@label"
msgid "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."
msgstr "Pour obtenir des résultats d'impression optimaux, vous pouvez maintenant régler votre plateau. Quand vous cliquez sur 'Aller à la position suivante', la buse se déplacera vers les différentes positions pouvant être réglées."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:57
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 "Pour chacune des positions ; glissez un bout de papier sous la buse et ajustez la hauteur du plateau. La hauteur du plateau est juste lorsque la pointe de la buse gratte légèrement le papier."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:75
msgctxt "@action:button"
msgid "Start Build Plate Leveling"
msgstr "Démarrer le nivellement du plateau"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:87
msgctxt "@action:button"
msgid "Move to Next Position"
msgstr "Aller à la position suivante"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:30
msgctxt "@label"
msgid "Please select any upgrades made to this Ultimaker Original"
msgstr "Sélectionnez les mises à niveau disponibles pour cet Ultimaker Original"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:41
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"
@@ -3099,170 +2973,170 @@ msgctxt "@label"
msgid "Are you sure you want to abort the print?"
msgstr "Êtes-vous sûr(e) de vouloir abandonner l'impression ?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:71
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:73
msgctxt "@title"
msgid "Information"
msgstr "Informations"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:100
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:102
msgctxt "@title:window"
msgid "Confirm Diameter Change"
msgstr "Confirmer le changement de diamètre"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:101
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:103
msgctxt "@label (%1 is a number)"
msgid "The new filament diameter is set to %1 mm, which is not compatible with the current extruder. Do you wish to continue?"
msgstr "Le nouveau diamètre de filament est réglé sur %1 mm, ce qui n'est pas compatible avec l'extrudeuse actuelle. Souhaitez-vous poursuivre ?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:133
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:127
msgctxt "@label"
msgid "Display Name"
msgstr "Afficher le nom"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:143
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:137
msgctxt "@label"
msgid "Brand"
msgstr "Marque"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:153
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:147
msgctxt "@label"
msgid "Material Type"
msgstr "Type de matériau"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:162
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:157
msgctxt "@label"
msgid "Color"
msgstr "Couleur"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:212
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:207
msgctxt "@label"
msgid "Properties"
msgstr "Propriétés"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:214
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:209
msgctxt "@label"
msgid "Density"
msgstr "Densité"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:229
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:224
msgctxt "@label"
msgid "Diameter"
msgstr "Diamètre"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:263
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:258
msgctxt "@label"
msgid "Filament Cost"
msgstr "Coût du filament"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:280
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:275
msgctxt "@label"
msgid "Filament weight"
msgstr "Poids du filament"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:298
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:293
msgctxt "@label"
msgid "Filament length"
msgstr "Longueur du filament"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:307
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:302
msgctxt "@label"
msgid "Cost per Meter"
msgstr "Coût au mètre"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:321
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:316
msgctxt "@label"
msgid "This material is linked to %1 and shares some of its properties."
msgstr "Ce matériau est lié à %1 et partage certaines de ses propriétés."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:328
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:323
msgctxt "@label"
msgid "Unlink Material"
msgstr "Délier le matériau"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:339
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:334
msgctxt "@label"
msgid "Description"
msgstr "Description"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:352
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:347
msgctxt "@label"
msgid "Adhesion Information"
msgstr "Informations d'adhérence"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:378
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:17
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:373
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label"
msgid "Print settings"
msgstr "Paramètres d'impression"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:84
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:72
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:99
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:40
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:73
msgctxt "@action:button"
msgid "Activate"
msgstr "Activer"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:101
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:117
msgctxt "@action:button"
msgid "Create"
msgstr "Créer"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:114
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:131
msgctxt "@action:button"
msgid "Duplicate"
msgstr "Dupliquer"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:141
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:142
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:160
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:148
msgctxt "@action:button"
msgid "Import"
msgstr "Importer"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:203
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:223
msgctxt "@action:label"
msgid "Printer"
msgstr "Imprimante"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:262
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:246
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:287
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:253
msgctxt "@title:window"
msgid "Confirm Remove"
msgstr "Confirmer la suppression"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:263
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:247
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:254
msgctxt "@label (%1 is object name)"
msgid "Are you sure you wish to remove %1? This cannot be undone!"
msgstr "Êtes-vous sûr de vouloir supprimer l'objet %1 ? Vous ne pourrez pas revenir en arrière !"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:277
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:285
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:304
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:312
msgctxt "@title:window"
msgid "Import Material"
msgstr "Importer un matériau"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:286
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:313
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Could not import material %1: %2"
msgstr "Impossible d'importer le matériau %1 : %2"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:317
msgctxt "@info:status Don't translate the XML tag !"
msgid "Successfully imported material %1"
msgstr "Matériau %1 importé avec succès"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:308
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:316
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:335
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:343
msgctxt "@title:window"
msgid "Export Material"
msgstr "Exporter un matériau"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:320
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:347
msgctxt "@info:status Don't translate the XML tags and !"
msgid "Failed to export material to %1: %2"
msgstr "Échec de l'exportation de matériau vers %1 : %2"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:326
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:353
msgctxt "@info:status Don't translate the XML tag !"
msgid "Successfully exported material to %1"
msgstr "Matériau exporté avec succès vers %1"
@@ -3277,412 +3151,437 @@ msgctxt "@label:textbox"
msgid "Check all"
msgstr "Vérifier tout"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:47
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:48
msgctxt "@info:status"
msgid "Calculated"
msgstr "Calculer"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:61
msgctxt "@title:column"
msgid "Setting"
msgstr "Paramètre"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:68
msgctxt "@title:column"
msgid "Profile"
msgstr "Profil"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:74
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75
msgctxt "@title:column"
msgid "Current"
msgstr "Actuel"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:82
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:83
msgctxt "@title:column"
msgid "Unit"
msgstr "Unité"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:15
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:354
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:410
msgctxt "@title:tab"
msgid "General"
msgstr "Général"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:126
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:130
msgctxt "@label"
msgid "Interface"
msgstr "Interface"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:137
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:141
msgctxt "@label"
msgid "Language:"
msgstr "Langue :"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:204
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:208
msgctxt "@label"
msgid "Currency:"
msgstr "Devise :"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:217
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221
msgctxt "@label"
msgid "Theme:"
msgstr "Thème :"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:273
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:277
msgctxt "@label"
msgid "You will need to restart the application for these changes to have effect."
msgstr "Vous devez redémarrer l'application pour que ces changements prennent effet."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:294
msgctxt "@info:tooltip"
msgid "Slice automatically when changing settings."
msgstr "Découper automatiquement si les paramètres sont modifiés."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:302
msgctxt "@option:check"
msgid "Slice automatically"
msgstr "Découper automatiquement"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:312
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:316
msgctxt "@label"
msgid "Viewport behavior"
msgstr "Comportement Viewport"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:324
msgctxt "@info:tooltip"
msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly."
msgstr "Surligne les parties non supportées du modèle en rouge. Sans ajouter de support, ces zones ne s'imprimeront pas correctement."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:329
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:333
msgctxt "@option:check"
msgid "Display overhang"
msgstr "Mettre en surbrillance les porte-à-faux"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:336
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341
msgctxt "@info:tooltip"
msgid "Moves the camera so the model is in the center of the view when a model is selected"
msgstr "Déplace la caméra afin que le modèle sélectionné se trouve au centre de la vue"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:346
msgctxt "@action:button"
msgid "Center camera when item is selected"
msgstr "Centrer la caméra lorsqu'un élément est sélectionné"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:350
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356
msgctxt "@info:tooltip"
msgid "Should the default zoom behavior of cura be inverted?"
msgstr "Le comportement de zoom par défaut de Cura doit-il être inversé ?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:355
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361
msgctxt "@action:button"
msgid "Invert the direction of camera zoom."
msgstr "Inverser la direction du zoom de la caméra."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:365
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371
msgctxt "@info:tooltip"
msgid "Should zooming move in the direction of the mouse?"
msgstr "Le zoom doit-il se faire dans la direction de la souris ?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371
+msgctxt "@info:tooltip"
+msgid "Zooming towards the mouse is not supported in the orthogonal perspective."
+msgstr "Zoom vers la souris n'est pas pris en charge dans la perspective orthogonale."
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:376
msgctxt "@action:button"
msgid "Zoom toward mouse direction"
msgstr "Zoomer vers la direction de la souris"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:380
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402
msgctxt "@info:tooltip"
msgid "Should models on the platform be moved so that they no longer intersect?"
msgstr "Les modèles dans la zone d'impression doivent-ils être déplacés afin de ne plus se croiser ?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:385
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:407
msgctxt "@option:check"
msgid "Ensure models are kept apart"
msgstr "Veillez à ce que les modèles restent séparés"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:394
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416
msgctxt "@info:tooltip"
msgid "Should models on the platform be moved down to touch the build plate?"
msgstr "Les modèles dans la zone d'impression doivent-ils être abaissés afin de toucher le plateau ?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:421
msgctxt "@option:check"
msgid "Automatically drop models to the build plate"
msgstr "Abaisser automatiquement les modèles sur le plateau"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:411
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433
msgctxt "@info:tooltip"
msgid "Show caution message in g-code reader."
msgstr "Afficher le message d'avertissement dans le lecteur G-Code."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:420
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:442
msgctxt "@option:check"
msgid "Caution message in g-code reader"
msgstr "Message d'avertissement dans le lecteur G-Code"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:428
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:450
msgctxt "@info:tooltip"
msgid "Should layer be forced into compatibility mode?"
msgstr "La couche doit-elle être forcée en mode de compatibilité ?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:455
msgctxt "@option:check"
msgid "Force layer view compatibility mode (restart required)"
msgstr "Forcer l'affichage de la couche en mode de compatibilité (redémarrage requis)"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:449
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:465
+msgctxt "@info:tooltip"
+msgid "What type of camera rendering should be used?"
+msgstr "Quel type de rendu de la caméra doit-il être utilisé?"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:472
+msgctxt "@window:text"
+msgid "Camera rendering: "
+msgstr "Rendu caméra : "
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:483
+msgid "Perspective"
+msgstr "Perspective"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:484
+msgid "Orthogonal"
+msgstr "Orthogonale"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:515
msgctxt "@label"
msgid "Opening and saving files"
msgstr "Ouvrir et enregistrer des fichiers"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:456
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522
msgctxt "@info:tooltip"
msgid "Should models be scaled to the build volume if they are too large?"
msgstr "Les modèles doivent-ils être mis à l'échelle du volume d'impression s'ils sont trop grands ?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:461
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:527
msgctxt "@option:check"
msgid "Scale large models"
msgstr "Réduire la taille des modèles trop grands"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537
msgctxt "@info:tooltip"
msgid "An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be scaled up?"
msgstr "Un modèle peut apparaître en tout petit si son unité est par exemple en mètres plutôt qu'en millimètres. Ces modèles doivent-ils être agrandis ?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:542
msgctxt "@option:check"
msgid "Scale extremely small models"
msgstr "Mettre à l'échelle les modèles extrêmement petits"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:486
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:552
msgctxt "@info:tooltip"
msgid "Should models be selected after they are loaded?"
msgstr "Les modèles doivent-ils être sélectionnés après leur chargement ?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:491
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:557
msgctxt "@option:check"
msgid "Select models when loaded"
msgstr "Sélectionner les modèles lorsqu'ils sont chargés"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:567
msgctxt "@info:tooltip"
msgid "Should a prefix based on the printer name be added to the print job name automatically?"
msgstr "Un préfixe basé sur le nom de l'imprimante doit-il être automatiquement ajouté au nom de la tâche d'impression ?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:506
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:572
msgctxt "@option:check"
msgid "Add machine prefix to job name"
msgstr "Ajouter le préfixe de la machine au nom de la tâche"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:516
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582
msgctxt "@info:tooltip"
msgid "Should a summary be shown when saving a project file?"
msgstr "Un résumé doit-il être affiché lors de l'enregistrement d'un fichier de projet ?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:586
msgctxt "@option:check"
msgid "Show summary dialog when saving project"
msgstr "Afficher la boîte de dialogue du résumé lors de l'enregistrement du projet"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:530
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596
msgctxt "@info:tooltip"
msgid "Default behavior when opening a project file"
msgstr "Comportement par défaut lors de l'ouverture d'un fichier de projet"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:538
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:604
msgctxt "@window:text"
msgid "Default behavior when opening a project file: "
msgstr "Comportement par défaut lors de l'ouverture d'un fichier de projet : "
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:552
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:618
msgctxt "@option:openProject"
msgid "Always ask me this"
msgstr "Toujours me demander"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:553
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:619
msgctxt "@option:openProject"
msgid "Always open as a project"
msgstr "Toujours ouvrir comme projet"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:554
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620
msgctxt "@option:openProject"
msgid "Always import models"
msgstr "Toujours importer les modèles"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:590
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656
msgctxt "@info:tooltip"
msgid "When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want to keep your modifications or not, or you can choose a default behaviour and never show that dialog again."
msgstr "Lorsque vous apportez des modifications à un profil puis passez à un autre profil, une boîte de dialogue apparaît, vous demandant si vous souhaitez conserver les modifications. Vous pouvez aussi choisir une option par défaut, et le dialogue ne s'affichera plus."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:599
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:665
msgctxt "@label"
msgid "Profiles"
msgstr "Profils"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:604
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:670
msgctxt "@window:text"
msgid "Default behavior for changed setting values when switching to a different profile: "
msgstr "Comportement par défaut pour les valeurs de paramètres modifiées lors du passage à un profil différent : "
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:618
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:684
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:157
msgctxt "@option:discardOrKeep"
msgid "Always ask me this"
msgstr "Toujours me demander"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:619
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685
msgctxt "@option:discardOrKeep"
msgid "Always discard changed settings"
msgstr "Toujours rejeter les paramètres modifiés"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:686
msgctxt "@option:discardOrKeep"
msgid "Always transfer changed settings to new profile"
msgstr "Toujours transférer les paramètres modifiés dans le nouveau profil"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:654
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:720
msgctxt "@label"
msgid "Privacy"
msgstr "Confidentialité"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:661
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:727
msgctxt "@info:tooltip"
msgid "Should Cura check for updates when the program is started?"
msgstr "Cura doit-il vérifier les mises à jour au démarrage du programme ?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:666
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:732
msgctxt "@option:check"
msgid "Check for updates on start"
msgstr "Vérifier les mises à jour au démarrage"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:676
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:742
msgctxt "@info:tooltip"
msgid "Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored."
msgstr "Les données anonymes de votre impression doivent-elles être envoyées à Ultimaker ? Notez qu'aucun modèle, aucune adresse IP ni aucune autre information permettant de vous identifier personnellement ne seront envoyés ou stockés."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:681
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:747
msgctxt "@option:check"
msgid "Send (anonymous) print information"
msgstr "Envoyer des informations (anonymes) sur l'impression"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:690
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:756
msgctxt "@action:button"
msgid "More information"
msgstr "Plus d'informations"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:708
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:774
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:27
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ProfileMenu.qml:23
msgctxt "@label"
msgid "Experimental"
msgstr "Expérimental"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:715
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:781
msgctxt "@info:tooltip"
msgid "Use multi build plate functionality"
msgstr "Utiliser la fonctionnalité multi-plateau"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:720
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:786
msgctxt "@option:check"
msgid "Use multi build plate functionality (restart required)"
msgstr "Utiliser la fonctionnalité multi-plateau (redémarrage requis)"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:16
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:359
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:415
msgctxt "@title:tab"
msgid "Printers"
msgstr "Imprimantes"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:129
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:63
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:134
msgctxt "@action:button"
msgid "Rename"
msgstr "Renommer"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:36
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:363
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:419
msgctxt "@title:tab"
msgid "Profiles"
msgstr "Profils"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:87
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:89
msgctxt "@label"
msgid "Create"
msgstr "Créer"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:105
msgctxt "@label"
msgid "Duplicate"
msgstr "Dupliquer"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:174
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:181
msgctxt "@title:window"
msgid "Create Profile"
msgstr "Créer un profil"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:183
msgctxt "@info"
msgid "Please provide a name for this profile."
msgstr "Veuillez fournir un nom pour ce profil."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:239
msgctxt "@title:window"
msgid "Duplicate Profile"
msgstr "Dupliquer un profil"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:263
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:270
msgctxt "@title:window"
msgid "Rename Profile"
msgstr "Renommer le profil"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:276
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:283
msgctxt "@title:window"
msgid "Import Profile"
msgstr "Importer un profil"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:302
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:309
msgctxt "@title:window"
msgid "Export Profile"
msgstr "Exporter un profil"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:357
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:364
msgctxt "@label %1 is printer name"
msgid "Printer: %1"
msgstr "Imprimante : %1"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:420
msgctxt "@label"
msgid "Default profiles"
msgstr "Profils par défaut"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:420
msgctxt "@label"
msgid "Custom profiles"
msgstr "Personnaliser les profils"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:490
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:500
msgctxt "@action:button"
msgid "Update profile with current settings/overrides"
msgstr "Mettre à jour le profil à l'aide des paramètres / forçages actuels"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:497
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:507
msgctxt "@action:button"
msgid "Discard current changes"
msgstr "Ignorer les modifications actuelles"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:514
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:524
msgctxt "@action:label"
msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below."
msgstr "Ce profil utilise les paramètres par défaut spécifiés par l'imprimante, de sorte qu'aucun paramètre / forçage n'apparaît dans la liste ci-dessous."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:521
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:531
msgctxt "@action:label"
msgid "Your current settings match the selected profile."
msgstr "Vos paramètres actuels correspondent au profil sélectionné."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:540
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:550
msgctxt "@title:tab"
msgid "Global Settings"
msgstr "Paramètres généraux"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:89
msgctxt "@action:button"
msgid "Marketplace"
msgstr "Marché en ligne"
@@ -3725,12 +3624,12 @@ msgctxt "@title:menu menubar:toplevel"
msgid "&Help"
msgstr "&Aide"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:123
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:124
msgctxt "@title:window"
msgid "New project"
msgstr "Nouveau projet"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:124
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:125
msgctxt "@info:question"
msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings."
msgstr "Êtes-vous sûr(e) de souhaiter lancer un nouveau projet ? Cela supprimera les objets du plateau ainsi que tous paramètres non enregistrés."
@@ -3745,33 +3644,33 @@ msgctxt "@label:textbox"
msgid "search settings"
msgstr "paramètres de recherche"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:466
msgctxt "@action:menu"
msgid "Copy value to all extruders"
msgstr "Copier la valeur vers tous les extrudeurs"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:474
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:475
msgctxt "@action:menu"
msgid "Copy all changed values to all extruders"
msgstr "Copier toutes les valeurs modifiées vers toutes les extrudeuses"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512
msgctxt "@action:menu"
msgid "Hide this setting"
msgstr "Masquer ce paramètre"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:529
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:525
msgctxt "@action:menu"
msgid "Don't show this setting"
msgstr "Masquer ce paramètre"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:533
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:529
msgctxt "@action:menu"
msgid "Keep this setting visible"
msgstr "Afficher ce paramètre"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:557
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:548
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:434
msgctxt "@action:menu"
msgid "Configure setting visibility..."
msgstr "Configurer la visibilité des paramètres..."
@@ -3782,50 +3681,64 @@ 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\nCliquez pour rendre ces paramètres visibles."
+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."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:81
+msgctxt "@label"
+msgid "This setting is not used because all the settings that it influences are overridden."
+msgstr "Ce paramètre n'est pas utilisé car tous les paramètres qu'il influence sont remplacés."
+
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:86
msgctxt "@label Header for list of settings."
msgid "Affects"
msgstr "Touche"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:71
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:91
msgctxt "@label Header for list of settings."
msgid "Affected By"
msgstr "Touché par"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:166
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186
msgctxt "@label"
msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders."
msgstr "Ce paramètre est toujours partagé par toutes les extrudeuses. Le modifier ici entraînera la modification de la valeur pour toutes les extrudeuses."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:170
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190
msgctxt "@label"
msgid "The value is resolved from per-extruder values "
msgstr "La valeur est résolue à partir des valeurs par extrudeur "
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:208
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:228
msgctxt "@label"
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\nCliquez pour restaurer la valeur du profil."
+msgstr ""
+"Ce paramètre possède une valeur qui est différente du profil.\n"
+"\n"
+"Cliquez pour restaurer la valeur du profil."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:302
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:322
msgctxt "@label"
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\nCliquez pour restaurer la valeur calculée."
+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."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:144
msgctxt "@button"
msgid "Recommended"
msgstr "Recommandé"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:158
msgctxt "@button"
msgid "Custom"
msgstr "Personnalisé"
@@ -3840,27 +3753,22 @@ msgctxt "@label"
msgid "Gradual infill will gradually increase the amount of infill towards the top."
msgstr "Un remplissage graduel augmentera la quantité de remplissage vers le haut."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:30
msgctxt "@label"
msgid "Support"
msgstr "Support"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:71
msgctxt "@label"
msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing."
msgstr "Générer des structures pour soutenir les parties du modèle qui possèdent des porte-à-faux. Sans ces structures, ces parties s'effondreront durant l'impression."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:136
-msgctxt "@label"
-msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air."
-msgstr "Sélectionnez l'extrudeur à utiliser comme support. Cela créera des structures de support sous le modèle afin de l'empêcher de s'affaisser ou de s'imprimer dans les airs."
-
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:29
msgctxt "@label"
msgid "Adhesion"
msgstr "Adhérence"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:74
msgctxt "@label"
msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards."
msgstr "Activez l'impression d'une bordure ou plaquette (Brim/Raft). Cela ajoutera une zone plate autour de ou sous votre objet qui est facile à découper par la suite."
@@ -3877,7 +3785,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"
+msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile."
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
@@ -3906,11 +3814,14 @@ 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\nCliquez 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"
+"\n"
+"Cliquez pour ouvrir le gestionnaire de profils."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:21
msgctxt "@label shown when we load a Gcode file"
-msgid "Print setup disabled. G code file can not be modified."
+msgid "Print setup disabled. G-code file can not be modified."
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
@@ -3943,7 +3854,7 @@ msgctxt "@label"
msgid "Send G-code"
msgstr "Envoyer G-Code"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:364
+#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:365
msgctxt "@tooltip of G-code command input"
msgid "Send a custom G-code command to the connected printer. Press 'enter' to send the command."
msgstr "Envoyer une commande G-Code personnalisée à l'imprimante connectée. Appuyez sur « Entrée » pour envoyer la commande."
@@ -4040,11 +3951,6 @@ msgctxt "@label:category menu label"
msgid "Favorites"
msgstr "Favoris"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:66
-msgctxt "@label:category menu label"
-msgid "Generic"
-msgstr "Générique"
-
#: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25
msgctxt "@label:category menu label"
msgid "Network enabled printers"
@@ -4060,32 +3966,32 @@ msgctxt "@title:menu menubar:settings"
msgid "&Printer"
msgstr "Im&primante"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:26
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:32
msgctxt "@title:menu"
msgid "&Material"
msgstr "&Matériau"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:35
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:41
msgctxt "@action:inmenu"
msgid "Set as Active Extruder"
msgstr "Définir comme extrudeur actif"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:41
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:47
msgctxt "@action:inmenu"
msgid "Enable Extruder"
msgstr "Activer l'extrudeuse"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:48
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:54
msgctxt "@action:inmenu"
msgid "Disable Extruder"
msgstr "Désactiver l'extrudeuse"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:62
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:68
msgctxt "@title:menu"
msgid "&Build plate"
msgstr "Plateau"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:65
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:71
msgctxt "@title:settings"
msgid "&Profile"
msgstr "&Profil"
@@ -4095,7 +4001,22 @@ msgctxt "@action:inmenu menubar:view"
msgid "&Camera position"
msgstr "Position de la &caméra"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:35
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:44
+msgctxt "@action:inmenu menubar:view"
+msgid "Camera view"
+msgstr "Vue de la caméra"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:47
+msgctxt "@action:inmenu menubar:view"
+msgid "Perspective"
+msgstr "Perspective"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:59
+msgctxt "@action:inmenu menubar:view"
+msgid "Orthographic"
+msgstr "Orthographique"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:80
msgctxt "@action:inmenu menubar:view"
msgid "&Build plate"
msgstr "&Plateau"
@@ -4159,12 +4080,7 @@ msgctxt "@label"
msgid "Select configuration"
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 "Voir le tableau de compatibilité des matériaux"
-
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:221
msgctxt "@label"
msgid "Configurations"
msgstr "Configurations"
@@ -4189,17 +4105,17 @@ msgctxt "@label"
msgid "Printer"
msgstr "Imprimante"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:213
msgctxt "@label"
msgid "Enabled"
msgstr "Activé"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:250
msgctxt "@label"
msgid "Material"
msgstr "Matériau"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:375
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
msgstr "Utiliser de la colle pour une meilleure adhérence avec cette combinaison de matériaux."
@@ -4219,42 +4135,47 @@ msgctxt "@title:menu menubar:file"
msgid "Open &Recent"
msgstr "Ouvrir un fichier &récent"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:145
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:140
msgctxt "@label"
msgid "Active print"
msgstr "Activer l'impression"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:153
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:148
msgctxt "@label"
msgid "Job Name"
msgstr "Nom de la tâche"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:161
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:156
msgctxt "@label"
msgid "Printing Time"
msgstr "Durée d'impression"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:169
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:164
msgctxt "@label"
msgid "Estimated time left"
msgstr "Durée restante estimée"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
-msgid "View types"
-msgstr "Types d'affichages"
+msgid "View type"
+msgstr "Type d'affichage"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
+#: /home/ruben/Projects/Cura/resources/qml/ObjectSelector.qml:59
msgctxt "@label"
-msgid "Hi "
-msgstr "Bonjour "
+msgid "Object list"
+msgstr "Liste d'objets"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:22
+msgctxt "@label The argument is a username."
+msgid "Hi %1"
+msgstr "Bonjour %1"
+
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:33
msgctxt "@button"
msgid "Ultimaker account"
msgstr "Compte Ultimaker"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:42
msgctxt "@button"
msgid "Sign out"
msgstr "Déconnexion"
@@ -4264,11 +4185,6 @@ msgctxt "@action:button"
msgid "Sign in"
msgstr "Se connecter"
-#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
-msgctxt "@label"
-msgid "Ultimaker Cloud"
-msgstr "Ultimaker Cloud"
-
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
@@ -4279,8 +4195,11 @@ msgctxt "@text"
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 "- 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"
+"- Get exclusive access to print profiles from leading brands"
+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 d'impression des principales marques"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
@@ -4292,50 +4211,55 @@ msgctxt "@label"
msgid "No time estimation available"
msgstr "Aucune estimation de la durée n'est disponible"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:77
msgctxt "@label"
msgid "No cost estimation available"
msgstr "Aucune estimation des coûts n'est disponible"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:127
msgctxt "@button"
msgid "Preview"
msgstr "Aperçu"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:55
msgctxt "@label:PrintjobStatus"
msgid "Slicing..."
msgstr "Découpe en cours..."
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:61
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:67
msgctxt "@label:PrintjobStatus"
-msgid "Unable to Slice"
+msgid "Unable to slice"
msgstr "Impossible de découper"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:103
+msgctxt "@button"
+msgid "Processing"
+msgstr "Traitement"
+
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:103
msgctxt "@button"
msgid "Slice"
msgstr "Découper"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:104
msgctxt "@label"
msgid "Start the slicing process"
msgstr "Démarrer le processus de découpe"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:118
msgctxt "@button"
msgid "Cancel"
msgstr "Annuler"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
-msgid "Time specification"
-msgstr "Spécification de durée"
+msgid "Time estimation"
+msgstr "Estimation de durée"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
-msgid "Material specification"
-msgstr "Spécification des matériaux"
+msgid "Material estimation"
+msgstr "Estimation du matériau"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4357,285 +4281,299 @@ msgctxt "@label"
msgid "Preset printers"
msgstr "Imprimantes préréglées"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
+#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:166
msgctxt "@button"
msgid "Add printer"
msgstr "Ajouter une imprimante"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
+#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:182
msgctxt "@button"
msgid "Manage printers"
msgstr "Gérer les imprimantes"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:81
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
msgstr "Afficher le guide de dépannage en ligne"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:88
msgctxt "@action:inmenu"
msgid "Toggle Full Screen"
msgstr "Passer en Plein écran"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:92
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96
+msgctxt "@action:inmenu"
+msgid "Exit Full Screen"
+msgstr "Quitter le mode plein écran"
+
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:103
msgctxt "@action:inmenu menubar:edit"
msgid "&Undo"
msgstr "&Annuler"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:113
msgctxt "@action:inmenu menubar:edit"
msgid "&Redo"
msgstr "&Rétablir"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:112
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:123
msgctxt "@action:inmenu menubar:file"
msgid "&Quit"
msgstr "&Quitter"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:120
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:131
msgctxt "@action:inmenu menubar:view"
msgid "3D View"
msgstr "Vue 3D"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138
msgctxt "@action:inmenu menubar:view"
msgid "Front View"
msgstr "Vue de face"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:145
msgctxt "@action:inmenu menubar:view"
msgid "Top View"
msgstr "Vue du dessus"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:141
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:152
msgctxt "@action:inmenu menubar:view"
msgid "Left Side View"
msgstr "Vue latérale gauche"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:148
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:159
msgctxt "@action:inmenu menubar:view"
msgid "Right Side View"
msgstr "Vue latérale droite"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:155
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:166
msgctxt "@action:inmenu"
msgid "Configure Cura..."
msgstr "Configurer Cura..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:173
msgctxt "@action:inmenu menubar:printer"
msgid "&Add Printer..."
msgstr "&Ajouter une imprimante..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179
msgctxt "@action:inmenu menubar:printer"
msgid "Manage Pr&inters..."
msgstr "Gérer les &imprimantes..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186
msgctxt "@action:inmenu"
msgid "Manage Materials..."
msgstr "Gérer les matériaux..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:184
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:195
msgctxt "@action:inmenu menubar:profile"
msgid "&Update profile with current settings/overrides"
msgstr "&Mettre à jour le profil à l'aide des paramètres / forçages actuels"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:192
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203
msgctxt "@action:inmenu menubar:profile"
msgid "&Discard current changes"
msgstr "&Ignorer les modifications actuelles"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:204
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:215
msgctxt "@action:inmenu menubar:profile"
msgid "&Create profile from current settings/overrides..."
msgstr "&Créer un profil à partir des paramètres / forçages actuels..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:221
msgctxt "@action:inmenu menubar:profile"
msgid "Manage Profiles..."
msgstr "Gérer les profils..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:229
msgctxt "@action:inmenu menubar:help"
msgid "Show Online &Documentation"
msgstr "Afficher la &documentation en ligne"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:237
msgctxt "@action:inmenu menubar:help"
msgid "Report a &Bug"
msgstr "Notifier un &bug"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:245
+msgctxt "@action:inmenu menubar:help"
+msgid "What's New"
+msgstr "Quoi de neuf"
+
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:251
msgctxt "@action:inmenu menubar:help"
msgid "About..."
msgstr "À propos de..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:241
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258
msgctxt "@action:inmenu menubar:edit"
msgid "Delete Selected Model"
msgid_plural "Delete Selected Models"
msgstr[0] "Supprimer le modèle sélectionné"
msgstr[1] "Supprimer les modèles sélectionnés"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:251
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:268
msgctxt "@action:inmenu menubar:edit"
msgid "Center Selected Model"
msgid_plural "Center Selected Models"
msgstr[0] "Centrer le modèle sélectionné"
msgstr[1] "Centrer les modèles sélectionnés"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277
msgctxt "@action:inmenu menubar:edit"
msgid "Multiply Selected Model"
msgid_plural "Multiply Selected Models"
msgstr[0] "Multiplier le modèle sélectionné"
msgstr[1] "Multiplier les modèles sélectionnés"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:286
msgctxt "@action:inmenu"
msgid "Delete Model"
msgstr "Supprimer le modèle"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294
msgctxt "@action:inmenu"
msgid "Ce&nter Model on Platform"
msgstr "Ce&ntrer le modèle sur le plateau"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:283
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:300
msgctxt "@action:inmenu menubar:edit"
msgid "&Group Models"
msgstr "&Grouper les modèles"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:303
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:320
msgctxt "@action:inmenu menubar:edit"
msgid "Ungroup Models"
msgstr "Dégrouper les modèles"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:313
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:330
msgctxt "@action:inmenu menubar:edit"
msgid "&Merge Models"
msgstr "&Fusionner les modèles"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:340
msgctxt "@action:inmenu"
msgid "&Multiply Model..."
msgstr "&Multiplier le modèle..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:330
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:347
msgctxt "@action:inmenu menubar:edit"
msgid "Select All Models"
msgstr "Sélectionner tous les modèles"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:340
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:357
msgctxt "@action:inmenu menubar:edit"
msgid "Clear Build Plate"
msgstr "Supprimer les objets du plateau"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:367
msgctxt "@action:inmenu menubar:file"
msgid "Reload All Models"
msgstr "Recharger tous les modèles"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:359
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:376
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange All Models To All Build Plates"
msgstr "Réorganiser tous les modèles sur tous les plateaux"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:383
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange All Models"
msgstr "Réorganiser tous les modèles"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:374
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:391
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange Selection"
msgstr "Réorganiser la sélection"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:381
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:398
msgctxt "@action:inmenu menubar:edit"
msgid "Reset All Model Positions"
msgstr "Réinitialiser toutes les positions des modèles"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:388
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:405
msgctxt "@action:inmenu menubar:edit"
msgid "Reset All Model Transformations"
msgstr "Réinitialiser tous les modèles et transformations"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:412
msgctxt "@action:inmenu menubar:file"
msgid "&Open File(s)..."
msgstr "&Ouvrir le(s) fichier(s)..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:403
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:420
msgctxt "@action:inmenu menubar:file"
msgid "&New Project..."
msgstr "&Nouveau projet..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:427
msgctxt "@action:inmenu menubar:help"
msgid "Show Configuration Folder"
msgstr "Afficher le dossier de configuration"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:441
msgctxt "@action:menu"
msgid "&Marketplace"
msgstr "&Marché en ligne"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:24
msgctxt "@title:window"
msgid "Ultimaker Cura"
msgstr "Ultimaker Cura"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:181
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232
msgctxt "@label"
msgid "This package will be installed after restarting."
msgstr "Ce paquet sera installé après le redémarrage."
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:357
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:413
msgctxt "@title:tab"
msgid "Settings"
msgstr "Paramètres"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:486
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:539
msgctxt "@title:window"
msgid "Closing Cura"
msgstr "Fermeture de Cura"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:487
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:499
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:540
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:552
msgctxt "@label"
msgid "Are you sure you want to exit Cura?"
msgstr "Êtes-vous sûr de vouloir quitter Cura ?"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:531
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:590
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:19
msgctxt "@title:window"
msgid "Open file(s)"
msgstr "Ouvrir le(s) fichier(s)"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:632
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:691
msgctxt "@window:title"
msgid "Install Package"
msgstr "Installer le paquet"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:640
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:699
msgctxt "@title:window"
msgid "Open File(s)"
msgstr "Ouvrir le(s) fichier(s)"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:643
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:702
msgctxt "@text:window"
msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one."
msgstr "Nous avons trouvé au moins un fichier G-Code parmi les fichiers que vous avez sélectionné. Vous ne pouvez ouvrir qu'un seul fichier G-Code à la fois. Si vous souhaitez ouvrir un fichier G-Code, veuillez ne sélectionner qu'un seul fichier de ce type."
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:713
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:18
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:805
msgctxt "@title:window"
msgid "Add Printer"
msgstr "Ajouter une imprimante"
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:813
+msgctxt "@title:window"
+msgid "What's New"
+msgstr "Quoi de neuf"
+
#: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16
msgctxt "@label %1 is filled in with the name of an extruder"
msgid "Print Selected Model with %1"
@@ -4653,7 +4591,9 @@ 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.\nSouhaitez-vous conserver ces changements, ou les annuler ?"
+msgstr ""
+"Vous avez personnalisé certains paramètres du profil.\n"
+"Souhaitez-vous conserver ces changements, ou les annuler ?"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:110
msgctxt "@title:column"
@@ -4695,34 +4635,6 @@ msgctxt "@action:button"
msgid "Create New Profile"
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 "Ajouter une imprimante à Cura"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
-msgctxt "@title:tab"
-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 "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 "Fabricant"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
-msgctxt "@label"
-msgid "Printer Name"
-msgstr "Nom de l'imprimante"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
-msgctxt "@action:button"
-msgid "Add Printer"
-msgstr "Ajouter une imprimante"
-
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:15
msgctxt "@title:window"
msgid "About Cura"
@@ -4743,7 +4655,9 @@ 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.\nCura 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.\n"
+"Cura est fier d'utiliser les projets open source suivants :"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:134
msgctxt "@label"
@@ -4880,27 +4794,32 @@ msgctxt "@title:window"
msgid "Save Project"
msgstr "Enregistrer le projet"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:138
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:149
msgctxt "@action:label"
msgid "Build plate"
msgstr "Plateau"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:170
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:183
msgctxt "@action:label"
msgid "Extruder %1"
msgstr "Extrudeuse %1"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:180
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:198
msgctxt "@action:label"
msgid "%1 & material"
msgstr "%1 & matériau"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:243
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:200
+msgctxt "@action:label"
+msgid "Material"
+msgstr "Matériau"
+
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:272
msgctxt "@action:label"
msgid "Don't show project summary on save again"
msgstr "Ne pas afficher à nouveau le résumé du projet lors de l'enregistrement"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:262
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:291
msgctxt "@action:button"
msgid "Save"
msgstr "Enregistrer"
@@ -4930,30 +4849,1069 @@ msgctxt "@action:button"
msgid "Import models"
msgstr "Importer les modèles"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:210
-msgctxt "@option:check"
-msgid "See only current build plate"
-msgstr "Afficher uniquement le plateau actuel"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DropDownWidget.qml:93
+msgctxt "@label"
+msgid "Empty"
+msgstr "Vide"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:226
-msgctxt "@action:button"
-msgid "Arrange to all build plates"
-msgstr "Réorganiser sur tous les plateaux"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:24
+msgctxt "@label"
+msgid "Add a printer"
+msgstr "Ajouter une imprimante"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:246
-msgctxt "@action:button"
-msgid "Arrange current build plate"
-msgstr "Réorganiser le plateau actuel"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:39
+msgctxt "@label"
+msgid "Add a networked printer"
+msgstr "Ajouter une imprimante en réseau"
-#: X3GWriter/plugin.json
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:81
+msgctxt "@label"
+msgid "Add a non-networked printer"
+msgstr "Ajouter une imprimante hors réseau"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:70
+msgctxt "@label"
+msgid "Add printer by IP address"
+msgstr "Ajouter une imprimante par adresse IP"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:133
+msgctxt "@text"
+msgid "Place enter your printer's IP address."
+msgstr "Saisissez l'adresse IP de votre imprimante."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:158
+msgctxt "@button"
+msgid "Add"
+msgstr "Ajouter"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:204
+msgctxt "@label"
+msgid "Could not connect to device."
+msgstr "Impossible de se connecter à l'appareil."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:208
+msgctxt "@label"
+msgid "The printer at this address has not responded yet."
+msgstr "L'imprimante à cette adresse n'a pas encore répondu."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:240
+msgctxt "@label"
+msgid "This printer cannot be added because it's an unknown printer or it's not the host of a group."
+msgstr "Cette imprimante ne peut pas être ajoutée parce qu'il s'agit d'une imprimante inconnue ou de l'hôte d'un groupe."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:329
+msgctxt "@button"
+msgid "Back"
+msgstr "Précédent"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:342
+msgctxt "@button"
+msgid "Connect"
+msgstr "Se connecter"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/FirstStartMachineActionsContent.qml:77
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:123
+msgctxt "@button"
+msgid "Next"
+msgstr "Suivant"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:23
+msgctxt "@label"
+msgid "User Agreement"
+msgstr "Accord utilisateur"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:56
+msgctxt "@button"
+msgid "Agree"
+msgstr "Accepter"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:70
+msgctxt "@button"
+msgid "Decline and close"
+msgstr "Décliner et fermer"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:24
+msgctxt "@label"
+msgid "Help us to improve Ultimaker Cura"
+msgstr "Aidez-nous à améliorer Ultimaker Cura"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:57
+msgctxt "@text"
+msgid "Ultimaker Cura collects anonymous data to improve print quality and user experience, including:"
+msgstr "Ultimaker Cura recueille des données anonymes pour améliorer la qualité d'impression et l'expérience utilisateur, notamment :"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:71
+msgctxt "@text"
+msgid "Machine types"
+msgstr "Types de machines"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:77
+msgctxt "@text"
+msgid "Material usage"
+msgstr "Utilisation du matériau"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:83
+msgctxt "@text"
+msgid "Number of slices"
+msgstr "Nombre de découpes"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:89
+msgctxt "@text"
+msgid "Print settings"
+msgstr "Paramètres d'impression"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:102
+msgctxt "@text"
+msgid "Data collected by Ultimaker Cura will not contain any personal information."
+msgstr "Les données recueillies par Ultimaker Cura ne contiendront aucun renseignement personnel."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:103
+msgctxt "@text"
+msgid "More information"
+msgstr "Plus d'informations"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WhatsNewContent.qml:24
+msgctxt "@label"
+msgid "What's new in Ultimaker Cura"
+msgstr "Quoi de neuf dans Ultimaker Cura"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:42
+msgctxt "@label"
+msgid "There is no printer found over your network."
+msgstr "Aucune imprimante n'a été trouvée sur votre réseau."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:179
+msgctxt "@label"
+msgid "Refresh"
+msgstr "Rafraîchir"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:190
+msgctxt "@label"
+msgid "Add printer by IP"
+msgstr "Ajouter une imprimante par IP"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:223
+msgctxt "@label"
+msgid "Troubleshooting"
+msgstr "Dépannage"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:207
+msgctxt "@label"
+msgid "Printer name"
+msgstr "Nom de l'imprimante"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:220
+msgctxt "@text"
+msgid "Please give your printer a name"
+msgstr "Veuillez donner un nom à votre imprimante"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:36
+msgctxt "@label"
+msgid "Ultimaker Cloud"
+msgstr "Ultimaker Cloud"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:77
+msgctxt "@text"
+msgid "The next generation 3D printing workflow"
+msgstr "Le flux d'impression 3D de nouvelle génération"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:94
+msgctxt "@text"
+msgid "- Send print jobs to Ultimaker printers outside your local network"
+msgstr "- Envoyez des tâches d'impression à des imprimantes Ultimaker hors de votre réseau local"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:97
+msgctxt "@text"
+msgid "- Store your Ultimaker Cura settings in the cloud for use anywhere"
+msgstr "- Stockez vos paramètres Ultimaker Cura dans le cloud pour les utiliser où que vous soyez"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:100
+msgctxt "@text"
+msgid "- Get exclusive access to print profiles from leading brands"
+msgstr "- Accédez en exclusivité aux profils d'impression des plus grandes marques"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:119
+msgctxt "@button"
+msgid "Finish"
+msgstr "Fin"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:128
+msgctxt "@button"
+msgid "Create an account"
+msgstr "Créer un compte"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:29
+msgctxt "@label"
+msgid "Welcome to Ultimaker Cura"
+msgstr "Bienvenue dans Ultimaker Cura"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:47
+msgctxt "@text"
+msgid ""
+"Please follow these steps to set up\n"
+"Ultimaker Cura. This will only take a few moments."
+msgstr ""
+"Veuillez suivre ces étapes pour configurer\n"
+"Ultimaker Cura. Cela ne prendra que quelques instants."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:58
+msgctxt "@button"
+msgid "Get started"
+msgstr "Prise en main"
+
+#: MachineSettingsAction/plugin.json
msgctxt "description"
-msgid "Allows saving the resulting slice as an X3G file, to support printers that read this format (Malyan, Makerbot and other Sailfish-based printers)."
-msgstr "Permet de sauvegarder la tranche résultante sous forme de fichier X3G, pour prendre en charge les imprimantes qui lisent ce format (Malyan, Makerbot et autres imprimantes basées sur Sailfish)."
+msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)."
+msgstr "Permet de modifier les paramètres de la machine (tels que volume d'impression, taille de buse, etc.)"
-#: X3GWriter/plugin.json
+#: MachineSettingsAction/plugin.json
msgctxt "name"
-msgid "X3GWriter"
-msgstr "X3GWriter"
+msgid "Machine Settings action"
+msgstr "Action Paramètres de la machine"
+
+#: Toolbox/plugin.json
+msgctxt "description"
+msgid "Find, manage and install new Cura packages."
+msgstr "Rechercher, gérer et installer de nouveaux paquets Cura."
+
+#: Toolbox/plugin.json
+msgctxt "name"
+msgid "Toolbox"
+msgstr "Boîte à outils"
+
+#: XRayView/plugin.json
+msgctxt "description"
+msgid "Provides the X-Ray view."
+msgstr "Permet la vue Rayon-X."
+
+#: XRayView/plugin.json
+msgctxt "name"
+msgid "X-Ray View"
+msgstr "Vue Rayon-X"
+
+#: X3DReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading X3D files."
+msgstr "Fournit la prise en charge de la lecture de fichiers X3D."
+
+#: X3DReader/plugin.json
+msgctxt "name"
+msgid "X3D Reader"
+msgstr "Lecteur X3D"
+
+#: GCodeWriter/plugin.json
+msgctxt "description"
+msgid "Writes g-code to a file."
+msgstr "Enregistre le G-Code dans un fichier."
+
+#: GCodeWriter/plugin.json
+msgctxt "name"
+msgid "G-code Writer"
+msgstr "Générateur de G-Code"
+
+#: ModelChecker/plugin.json
+msgctxt "description"
+msgid "Checks models and print configuration for possible printing issues and give suggestions."
+msgstr "Vérifie les modèles et la configuration de l'impression pour déceler d'éventuels problèmes d'impression et donne des suggestions."
+
+#: ModelChecker/plugin.json
+msgctxt "name"
+msgid "Model Checker"
+msgstr "Contrôleur de modèle"
+
+#: cura-god-mode-plugin/src/GodMode/plugin.json
+msgctxt "description"
+msgid "Dump the contents of all settings to a HTML file."
+msgstr "Exporter les contenus de tous les paramètres vers un fichier HTML."
+
+#: cura-god-mode-plugin/src/GodMode/plugin.json
+msgctxt "name"
+msgid "God Mode"
+msgstr "Mode God"
+
+#: FirmwareUpdater/plugin.json
+msgctxt "description"
+msgid "Provides a machine actions for updating firmware."
+msgstr "Fournit à une machine des actions permettant la mise à jour du firmware."
+
+#: FirmwareUpdater/plugin.json
+msgctxt "name"
+msgid "Firmware Updater"
+msgstr "Programme de mise à jour du firmware"
+
+#: ProfileFlattener/plugin.json
+msgctxt "description"
+msgid "Create a flattened quality changes profile."
+msgstr "Créer un profil de changements de qualité aplati."
+
+#: ProfileFlattener/plugin.json
+msgctxt "name"
+msgid "Profile Flattener"
+msgstr "Aplatisseur de profil"
+
+#: AMFReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading AMF files."
+msgstr "Fournit la prise en charge de la lecture de fichiers AMF."
+
+#: AMFReader/plugin.json
+msgctxt "name"
+msgid "AMF Reader"
+msgstr "Lecteur AMF"
+
+#: USBPrinting/plugin.json
+msgctxt "description"
+msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware."
+msgstr "Accepte les G-Code et les envoie à une imprimante. Ce plugin peut aussi mettre à jour le firmware."
+
+#: USBPrinting/plugin.json
+msgctxt "name"
+msgid "USB printing"
+msgstr "Impression par USB"
+
+#: GCodeGzWriter/plugin.json
+msgctxt "description"
+msgid "Writes g-code to a compressed archive."
+msgstr "Enregistre le G-Code dans une archive compressée."
+
+#: GCodeGzWriter/plugin.json
+msgctxt "name"
+msgid "Compressed G-code Writer"
+msgstr "Générateur de G-Code compressé"
+
+#: UFPWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for writing Ultimaker Format Packages."
+msgstr "Permet l'écriture de fichiers Ultimaker Format Package."
+
+#: UFPWriter/plugin.json
+msgctxt "name"
+msgid "UFP Writer"
+msgstr "Générateur UFP"
+
+#: PrepareStage/plugin.json
+msgctxt "description"
+msgid "Provides a prepare stage in Cura."
+msgstr "Fournit une étape de préparation dans Cura."
+
+#: PrepareStage/plugin.json
+msgctxt "name"
+msgid "Prepare Stage"
+msgstr "Étape de préparation"
+
+#: RemovableDriveOutputDevice/plugin.json
+msgctxt "description"
+msgid "Provides removable drive hotplugging and writing support."
+msgstr "Permet le branchement hot-plug et l'écriture sur lecteur amovible."
+
+#: RemovableDriveOutputDevice/plugin.json
+msgctxt "name"
+msgid "Removable Drive Output Device Plugin"
+msgstr "Plugin de périphérique de sortie sur disque amovible"
+
+#: UM3NetworkPrinting/plugin.json
+msgctxt "description"
+msgid "Manages network connections to Ultimaker 3 printers."
+msgstr "Gère les connexions réseau vers les imprimantes Ultimaker 3."
+
+#: UM3NetworkPrinting/plugin.json
+msgctxt "name"
+msgid "UM3 Network Connection"
+msgstr "Connexion au réseau UM3"
+
+#: SettingsGuide/plugin.json
+msgctxt "description"
+msgid "Provides extra information and explanations about settings in Cura, with images and animations."
+msgstr "Fournit des informations et explications supplémentaires sur les paramètres de Cura, avec des images et des animations."
+
+#: SettingsGuide/plugin.json
+msgctxt "name"
+msgid "Settings Guide"
+msgstr "Guide des paramètres"
+
+#: MonitorStage/plugin.json
+msgctxt "description"
+msgid "Provides a monitor stage in Cura."
+msgstr "Fournit une étape de surveillance dans Cura."
+
+#: MonitorStage/plugin.json
+msgctxt "name"
+msgid "Monitor Stage"
+msgstr "Étape de surveillance"
+
+#: FirmwareUpdateChecker/plugin.json
+msgctxt "description"
+msgid "Checks for firmware updates."
+msgstr "Vérifie les mises à jour du firmware."
+
+#: FirmwareUpdateChecker/plugin.json
+msgctxt "name"
+msgid "Firmware Update Checker"
+msgstr "Vérificateur des mises à jour du firmware"
+
+#: SimulationView/plugin.json
+msgctxt "description"
+msgid "Provides the Simulation view."
+msgstr "Fournit la Vue simulation."
+
+#: SimulationView/plugin.json
+msgctxt "name"
+msgid "Simulation View"
+msgstr "Vue simulation"
+
+#: GCodeGzReader/plugin.json
+msgctxt "description"
+msgid "Reads g-code from a compressed archive."
+msgstr "Lit le G-Code à partir d'une archive compressée."
+
+#: GCodeGzReader/plugin.json
+msgctxt "name"
+msgid "Compressed G-code Reader"
+msgstr "Lecteur G-Code compressé"
+
+#: PostProcessingPlugin/plugin.json
+msgctxt "description"
+msgid "Extension that allows for user created scripts for post processing"
+msgstr "Extension qui permet le post-traitement des scripts créés par l'utilisateur"
+
+#: PostProcessingPlugin/plugin.json
+msgctxt "name"
+msgid "Post Processing"
+msgstr "Post-traitement"
+
+#: SupportEraser/plugin.json
+msgctxt "description"
+msgid "Creates an eraser mesh to block the printing of support in certain places"
+msgstr "Crée un maillage effaceur pour bloquer l'impression du support en certains endroits"
+
+#: SupportEraser/plugin.json
+msgctxt "name"
+msgid "Support Eraser"
+msgstr "Effaceur de support"
+
+#: UFPReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading Ultimaker Format Packages."
+msgstr "Fournit un support pour la lecture des paquets de format Ultimaker."
+
+#: UFPReader/plugin.json
+msgctxt "name"
+msgid "UFP Reader"
+msgstr "Lecteur UFP"
+
+#: SliceInfoPlugin/plugin.json
+msgctxt "description"
+msgid "Submits anonymous slice info. Can be disabled through preferences."
+msgstr "Envoie des informations anonymes sur le découpage. Peut être désactivé dans les préférences."
+
+#: SliceInfoPlugin/plugin.json
+msgctxt "name"
+msgid "Slice info"
+msgstr "Information sur le découpage"
+
+#: XmlMaterialProfile/plugin.json
+msgctxt "description"
+msgid "Provides capabilities to read and write XML-based material profiles."
+msgstr "Offre la possibilité de lire et d'écrire des profils matériels basés sur XML."
+
+#: XmlMaterialProfile/plugin.json
+msgctxt "name"
+msgid "Material Profiles"
+msgstr "Profils matériels"
+
+#: LegacyProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing profiles from legacy Cura versions."
+msgstr "Fournit la prise en charge de l'importation de profils à partir de versions Cura antérieures."
+
+#: LegacyProfileReader/plugin.json
+msgctxt "name"
+msgid "Legacy Cura Profile Reader"
+msgstr "Lecteur de profil Cura antérieur"
+
+#: GCodeProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing profiles from g-code files."
+msgstr "Fournit la prise en charge de l'importation de profils à partir de fichiers g-code."
+
+#: GCodeProfileReader/plugin.json
+msgctxt "name"
+msgid "G-code Profile Reader"
+msgstr "Lecteur de profil G-Code"
+
+#: VersionUpgrade/VersionUpgrade32to33/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.2 to Cura 3.3."
+msgstr "Configurations des mises à niveau de Cura 3.2 vers Cura 3.3."
+
+#: VersionUpgrade/VersionUpgrade32to33/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.2 to 3.3"
+msgstr "Mise à niveau de 3.2 vers 3.3"
+
+#: VersionUpgrade/VersionUpgrade33to34/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.3 to Cura 3.4."
+msgstr "Configurations des mises à niveau de Cura 3.3 vers Cura 3.4."
+
+#: VersionUpgrade/VersionUpgrade33to34/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.3 to 3.4"
+msgstr "Mise à niveau de 3.3 vers 3.4"
+
+#: VersionUpgrade/VersionUpgrade25to26/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
+msgstr "Configurations des mises à niveau de Cura 2.5 vers Cura 2.6."
+
+#: VersionUpgrade/VersionUpgrade25to26/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.5 to 2.6"
+msgstr "Mise à niveau de 2.5 vers 2.6"
+
+#: VersionUpgrade/VersionUpgrade27to30/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
+msgstr "Met à niveau les configurations, de Cura 2.7 vers Cura 3.0."
+
+#: VersionUpgrade/VersionUpgrade27to30/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.7 to 3.0"
+msgstr "Mise à niveau de version, de 2.7 vers 3.0"
+
+#: VersionUpgrade/VersionUpgrade35to40/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.5 to Cura 4.0."
+msgstr "Configurations des mises à niveau de Cura 3.5 vers Cura 4.0."
+
+#: VersionUpgrade/VersionUpgrade35to40/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.5 to 4.0"
+msgstr "Mise à niveau de 3.5 vers 4.0"
+
+#: VersionUpgrade/VersionUpgrade34to35/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.4 to Cura 3.5."
+msgstr "Configurations des mises à niveau de Cura 3.4 vers Cura 3.5."
+
+#: VersionUpgrade/VersionUpgrade34to35/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.4 to 3.5"
+msgstr "Mise à niveau de 3.4 vers 3.5"
+
+#: VersionUpgrade/VersionUpgrade40to41/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 4.0 to Cura 4.1."
+msgstr "Configurations des mises à niveau de Cura 4.0 vers Cura 4.1."
+
+#: VersionUpgrade/VersionUpgrade40to41/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 4.0 to 4.1"
+msgstr "Mise à niveau de 4.0 vers 4.1"
+
+#: VersionUpgrade/VersionUpgrade30to31/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.0 to Cura 3.1."
+msgstr "Met à niveau les configurations, de Cura 3.0 vers Cura 3.1."
+
+#: VersionUpgrade/VersionUpgrade30to31/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.0 to 3.1"
+msgstr "Mise à niveau de version, de 3.0 vers 3.1"
+
+#: VersionUpgrade/VersionUpgrade41to42/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 4.1 to Cura 4.2."
+msgstr "Configurations des mises à jour de Cura 4.1 vers Cura 4.2."
+
+#: VersionUpgrade/VersionUpgrade41to42/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 4.1 to 4.2"
+msgstr "Mise à jour de 4.1 vers 4.2"
+
+#: VersionUpgrade/VersionUpgrade26to27/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
+msgstr "Configurations des mises à niveau de Cura 2.6 vers Cura 2.7."
+
+#: VersionUpgrade/VersionUpgrade26to27/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.6 to 2.7"
+msgstr "Mise à niveau de 2.6 vers 2.7"
+
+#: VersionUpgrade/VersionUpgrade21to22/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
+msgstr "Configurations des mises à niveau de Cura 2.1 vers Cura 2.2."
+
+#: VersionUpgrade/VersionUpgrade21to22/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.1 to 2.2"
+msgstr "Mise à niveau vers 2.1 vers 2.2"
+
+#: VersionUpgrade/VersionUpgrade22to24/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
+msgstr "Configurations des mises à niveau de Cura 2.2 vers Cura 2.4."
+
+#: VersionUpgrade/VersionUpgrade22to24/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.2 to 2.4"
+msgstr "Mise à niveau de 2.2 vers 2.4"
+
+#: ImageReader/plugin.json
+msgctxt "description"
+msgid "Enables ability to generate printable geometry from 2D image files."
+msgstr "Permet de générer une géométrie imprimable à partir de fichiers d'image 2D."
+
+#: ImageReader/plugin.json
+msgctxt "name"
+msgid "Image Reader"
+msgstr "Lecteur d'images"
+
+#: CuraEngineBackend/plugin.json
+msgctxt "description"
+msgid "Provides the link to the CuraEngine slicing backend."
+msgstr "Fournit le lien vers l'arrière du système de découpage CuraEngine."
+
+#: CuraEngineBackend/plugin.json
+msgctxt "name"
+msgid "CuraEngine Backend"
+msgstr "Système CuraEngine"
+
+#: PerObjectSettingsTool/plugin.json
+msgctxt "description"
+msgid "Provides the Per Model Settings."
+msgstr "Fournit les paramètres par modèle."
+
+#: PerObjectSettingsTool/plugin.json
+msgctxt "name"
+msgid "Per Model Settings Tool"
+msgstr "Outil de paramètres par modèle"
+
+#: 3MFReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading 3MF files."
+msgstr "Fournit la prise en charge de la lecture de fichiers 3MF."
+
+#: 3MFReader/plugin.json
+msgctxt "name"
+msgid "3MF Reader"
+msgstr "Lecteur 3MF"
+
+#: SolidView/plugin.json
+msgctxt "description"
+msgid "Provides a normal solid mesh view."
+msgstr "Affiche une vue en maille solide normale."
+
+#: SolidView/plugin.json
+msgctxt "name"
+msgid "Solid View"
+msgstr "Vue solide"
+
+#: GCodeReader/plugin.json
+msgctxt "description"
+msgid "Allows loading and displaying G-code files."
+msgstr "Permet le chargement et l'affichage de fichiers G-Code."
+
+#: GCodeReader/plugin.json
+msgctxt "name"
+msgid "G-code Reader"
+msgstr "Lecteur G-Code"
+
+#: CuraDrive/plugin.json
+msgctxt "description"
+msgid "Backup and restore your configuration."
+msgstr "Sauvegardez et restaurez votre configuration."
+
+#: CuraDrive/plugin.json
+msgctxt "name"
+msgid "Cura Backups"
+msgstr "Sauvegardes Cura"
+
+#: CuraProfileWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for exporting Cura profiles."
+msgstr "Fournit la prise en charge de l'exportation de profils Cura."
+
+#: CuraProfileWriter/plugin.json
+msgctxt "name"
+msgid "Cura Profile Writer"
+msgstr "Générateur de profil Cura"
+
+#: CuraPrintProfileCreator/plugin.json
+msgctxt "description"
+msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI."
+msgstr "Permet aux fabricants de matériaux de créer de nouveaux matériaux et profils de qualité à l'aide d'une interface utilisateur ad hoc."
+
+#: CuraPrintProfileCreator/plugin.json
+msgctxt "name"
+msgid "Print Profile Assistant"
+msgstr "Assistant de profil d'impression"
+
+#: 3MFWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for writing 3MF files."
+msgstr "Permet l'écriture de fichiers 3MF."
+
+#: 3MFWriter/plugin.json
+msgctxt "name"
+msgid "3MF Writer"
+msgstr "Générateur 3MF"
+
+#: PreviewStage/plugin.json
+msgctxt "description"
+msgid "Provides a preview stage in Cura."
+msgstr "Fournit une étape de prévisualisation dans Cura."
+
+#: PreviewStage/plugin.json
+msgctxt "name"
+msgid "Preview Stage"
+msgstr "Étape de prévisualisation"
+
+#: UltimakerMachineActions/plugin.json
+msgctxt "description"
+msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)."
+msgstr "Fournit les actions de la machine pour les machines Ultimaker (telles que l'assistant de calibration du plateau, sélection des mises à niveau, etc.)"
+
+#: UltimakerMachineActions/plugin.json
+msgctxt "name"
+msgid "Ultimaker machine actions"
+msgstr "Actions de la machine Ultimaker"
+
+#: CuraProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing Cura profiles."
+msgstr "Fournit la prise en charge de l'importation de profils Cura."
+
+#: CuraProfileReader/plugin.json
+msgctxt "name"
+msgid "Cura Profile Reader"
+msgstr "Lecteur de profil Cura"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Cura Settings Guide"
+#~ msgstr "Guide des paramètres de Cura"
+
+#~ msgctxt "@info:generic"
+#~ msgid "Settings have been changed to match the current availability of extruders: [%s]"
+#~ msgstr "Les paramètres ont été modifiés pour correspondre aux extrudeuses actuellement disponibles : [%s]"
+
+#~ msgctxt "@title:groupbox"
+#~ msgid "User description"
+#~ msgstr "Description de l'utilisateur"
+
+#~ msgctxt "@info"
+#~ msgid "These options are not available because you are monitoring a cloud printer."
+#~ msgstr "Ces options ne sont pas disponibles car vous surveillez une imprimante cloud."
+
+#~ msgctxt "@label link to connect manager"
+#~ msgid "Go to Cura Connect"
+#~ msgstr "Aller à Cura Connect"
+
+#~ msgctxt "@info"
+#~ msgid "All jobs are printed."
+#~ msgstr "Toutes les tâches ont été imprimées."
+
+#~ msgctxt "@label link to connect manager"
+#~ msgid "View print history"
+#~ msgstr "Voir l'historique d'impression"
+
+#~ msgctxt "@label"
+#~ 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 :"
+
+#~ msgctxt "@info"
+#~ 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 ""
+#~ "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."
+
+#~ msgctxt "@option:check"
+#~ msgid "See only current build plate"
+#~ msgstr "Afficher uniquement le plateau actuel"
+
+#~ msgctxt "@action:button"
+#~ msgid "Arrange to all build plates"
+#~ msgstr "Réorganiser sur tous les plateaux"
+
+#~ msgctxt "@action:button"
+#~ msgid "Arrange current build plate"
+#~ msgstr "Réorganiser le plateau actuel"
+
+#~ msgctxt "description"
+#~ msgid "Allows saving the resulting slice as an X3G file, to support printers that read this format (Malyan, Makerbot and other Sailfish-based printers)."
+#~ msgstr "Permet de sauvegarder la tranche résultante sous forme de fichier X3G, pour prendre en charge les imprimantes qui lisent ce format (Malyan, Makerbot et autres imprimantes basées sur Sailfish)."
+
+#~ msgctxt "name"
+#~ msgid "X3GWriter"
+#~ msgstr "X3GWriter"
+
+#~ msgctxt "description"
+#~ msgid "Reads SVG files as toolpaths, for debugging printer movements."
+#~ msgstr "Lit les fichiers SVG comme des Toolpaths, pour déboguer les mouvements de l'imprimante."
+
+#~ msgctxt "name"
+#~ msgid "SVG Toolpath Reader"
+#~ msgstr "Lecteur de Toolpaths SVG"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Changelog"
+#~ msgstr "Récapitulatif des changements"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Show Changelog"
+#~ msgstr "Afficher le récapitulatif des changements"
+
+#~ msgctxt "@info:status"
+#~ msgid "Sending data to remote cluster"
+#~ msgstr "Envoi de données à un cluster distant"
+
+#~ msgctxt "@info:status"
+#~ msgid "Connect to Ultimaker Cloud"
+#~ msgstr "Se connecter à Ultimaker Cloud"
+
+#~ msgctxt "@info"
+#~ msgid "Cura collects anonymized usage statistics."
+#~ msgstr "Cura recueille des statistiques d'utilisation anonymes."
+
+#~ msgctxt "@info:title"
+#~ msgid "Collecting Data"
+#~ msgstr "Collecte des données"
+
+#~ msgctxt "@action:button"
+#~ msgid "More info"
+#~ msgstr "Plus d'informations"
+
+#~ msgctxt "@action:tooltip"
+#~ msgid "See more information on what data Cura sends."
+#~ msgstr "Voir plus d'informations sur les données envoyées par Cura."
+
+#~ msgctxt "@action:button"
+#~ msgid "Allow"
+#~ msgstr "Autoriser"
+
+#~ msgctxt "@action:tooltip"
+#~ msgid "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."
+#~ msgstr "Autoriser Cura à envoyer des statistiques d'utilisation anonymes pour mieux prioriser les améliorations futures apportées à Cura. Certaines de vos préférences et paramètres sont envoyés, ainsi que la version du logiciel Cura et un hachage des modèles que vous découpez."
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Evaluation"
+#~ msgstr "Évaluation"
+
+#~ msgctxt "@info:title"
+#~ msgid "Network enabled printers"
+#~ msgstr "Imprimantes réseau"
+
+#~ msgctxt "@info:title"
+#~ msgid "Local printers"
+#~ msgstr "Imprimantes locales"
+
+#~ msgctxt "@info:backup_failed"
+#~ msgid "Tried to restore a Cura backup that does not match your current version."
+#~ msgstr "A essayé de restaurer une sauvegarde Cura qui ne correspond pas à votre version actuelle."
+
+#~ msgctxt "@title"
+#~ msgid "Machine Settings"
+#~ msgstr "Paramètres de la machine"
+
+#~ msgctxt "@label"
+#~ msgid "Printer Settings"
+#~ msgstr "Paramètres de l'imprimante"
+
+#~ msgctxt "@option:check"
+#~ msgid "Origin at center"
+#~ msgstr "Origine au centre"
+
+#~ msgctxt "@option:check"
+#~ msgid "Heated bed"
+#~ msgstr "Plateau chauffant"
+
+#~ msgctxt "@label"
+#~ msgid "Printhead Settings"
+#~ msgstr "Paramètres de la tête d'impression"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Distance entre la gauche de la tête d'impression et le centre de la buse. Permet d'empêcher les collisions entre les impressions précédentes et la tête d'impression lors d'une impression « Un à la fois »."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Distance entre le devant de la tête d'impression et le centre de la buse. Permet d'empêcher les collisions entre les impressions précédentes et la tête d'impression lors d'une impression « Un à la fois »."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Distance entre la droite de la tête d'impression et le centre de la buse. Permet d'empêcher les collisions entre les impressions précédentes et la tête d'impression lors d'une impression « Un à la fois »."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Distance entre le dos de la tête d'impression et le centre de la buse. Permet d'empêcher les collisions entre les impressions précédentes et la tête d'impression lors d'une impression « Un à la fois »."
+
+#~ msgctxt "@label"
+#~ msgid "Gantry height"
+#~ msgstr "Hauteur du portique"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "La différence de hauteur entre la pointe de la buse et le système de portique (axes X et Y). Permet d'empêcher les collisions entre les impressions précédentes et le portique lors d'une impression « Un à la fois »."
+
+#~ msgctxt "@label"
+#~ msgid "Start G-code"
+#~ msgstr "G-Code de démarrage"
+
+#~ msgctxt "@tooltip"
+#~ msgid "G-code commands to be executed at the very start."
+#~ msgstr "Commandes G-Code à exécuter au tout début."
+
+#~ msgctxt "@label"
+#~ msgid "End G-code"
+#~ msgstr "G-Code de fin"
+
+#~ msgctxt "@tooltip"
+#~ msgid "G-code commands to be executed at the very end."
+#~ msgstr "Commandes G-Code à exécuter tout à la fin."
+
+#~ msgctxt "@label"
+#~ msgid "Nozzle Settings"
+#~ msgstr "Paramètres de la buse"
+
+#~ msgctxt "@tooltip"
+#~ msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile."
+#~ msgstr "Le diamètre nominal de filament pris en charge par l'imprimante. Le diamètre exact sera remplacé par le matériau et / ou le profil."
+
+#~ msgctxt "@label"
+#~ msgid "Extruder Start G-code"
+#~ msgstr "Extrudeuse G-Code de démarrage"
+
+#~ msgctxt "@label"
+#~ msgid "Extruder End G-code"
+#~ msgstr "Extrudeuse G-Code de fin"
+
+#~ msgctxt "@label"
+#~ msgid "Changelog"
+#~ msgstr "Récapitulatif des changements"
+
+#~ msgctxt "@title:window"
+#~ msgid "User Agreement"
+#~ msgstr "Accord utilisateur"
+
+#~ msgctxt "@alabel"
+#~ msgid "Enter the IP address or hostname of your printer on the network."
+#~ msgstr "Saisissez l'adresse IP ou le nom d'hôte de votre imprimante sur le réseau."
+
+#~ msgctxt "@info"
+#~ msgid "Please select a network connected printer to monitor."
+#~ msgstr "Veuillez sélectionner une imprimante à surveiller qui est connectée au réseau."
+
+#~ msgctxt "@info"
+#~ msgid "Please connect your Ultimaker printer to your local network."
+#~ msgstr "Veuillez connecter votre imprimante Ultimaker à votre réseau local."
+
+#~ msgctxt "@text:window"
+#~ msgid "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."
+#~ msgstr "Cura envoie des données anonymes à Ultimaker afin d'améliorer la qualité d'impression et l'expérience utilisateur. Voici un exemple de toutes les données envoyées."
+
+#~ msgctxt "@text:window"
+#~ msgid "I don't want to send this data"
+#~ msgstr "Je ne veux pas envoyer ces données"
+
+#~ msgctxt "@text:window"
+#~ msgid "Allow sending this data to Ultimaker and help us improve Cura"
+#~ msgstr "Permettre l'envoi de ces données à Ultimaker et nous aider à améliorer Cura"
+
+#~ msgctxt "@label"
+#~ msgid "No print selected"
+#~ msgstr "Aucune impression sélectionnée"
+
+#~ msgctxt "@info:tooltip"
+#~ msgid "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."
+#~ msgstr "Par défaut, les pixels blancs représentent les points hauts sur la maille tandis que les pixels noirs représentent les points bas sur la maille. Modifiez cette option pour inverser le comportement de manière à ce que les pixels noirs représentent les points hauts sur la maille et les pixels blancs les points bas."
+
+#~ msgctxt "@title"
+#~ msgid "Select Printer Upgrades"
+#~ msgstr "Sélectionner les mises à niveau de l'imprimante"
+
+#~ msgctxt "@label"
+#~ msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air."
+#~ msgstr "Sélectionnez l'extrudeur à utiliser comme support. Cela créera des structures de support sous le modèle afin de l'empêcher de s'affaisser ou de s'imprimer dans les airs."
+
+#~ 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 "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é."
+
+#~ msgctxt "@label shown when we load a Gcode file"
+#~ msgid "Print setup disabled. G code file can not be modified."
+#~ msgstr "Configuration d'impression désactivée. Le fichier G-Code ne peut pas être modifié."
+
+#~ msgctxt "@label"
+#~ msgid "See the material compatibility chart"
+#~ msgstr "Voir le tableau de compatibilité des matériaux"
+
+#~ msgctxt "@label"
+#~ msgid "View types"
+#~ msgstr "Types d'affichages"
+
+#~ msgctxt "@label"
+#~ msgid "Hi "
+#~ msgstr "Bonjour "
+
+#~ msgctxt "@text"
+#~ 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 ""
+#~ "- 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"
+
+#~ msgctxt "@label:PrintjobStatus"
+#~ msgid "Unable to Slice"
+#~ msgstr "Impossible de découper"
+
+#~ msgctxt "@label"
+#~ msgid "Time specification"
+#~ msgstr "Spécification de durée"
+
+#~ msgctxt "@label"
+#~ msgid "Material specification"
+#~ msgstr "Spécification des matériaux"
+
+#~ msgctxt "@title:tab"
+#~ msgid "Add a printer to Cura"
+#~ msgstr "Ajouter une imprimante à Cura"
+
+#~ msgctxt "@title:tab"
+#~ 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 ""
+#~ "Sélectionnez l'imprimante que vous voulez utiliser dans la liste ci-dessous.\n"
+#~ "\n"
+#~ "Si 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."
+
+#~ msgctxt "@label"
+#~ msgid "Manufacturer"
+#~ msgstr "Fabricant"
+
+#~ msgctxt "@label"
+#~ msgid "Printer Name"
+#~ msgstr "Nom de l'imprimante"
+
+#~ msgctxt "@action:button"
+#~ msgid "Add Printer"
+#~ msgstr "Ajouter une imprimante"
#~ msgid "Modify G-Code"
#~ msgstr "Modifier le G-Code"
@@ -5151,7 +6109,6 @@ 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"
@@ -5295,62 +6252,6 @@ msgstr "X3GWriter"
#~ msgid "Click to check the material compatibility on Ultimaker.com."
#~ msgstr "Cliquez ici pour vérifier la compatibilité des matériaux sur Ultimaker.com."
-#~ msgctxt "description"
-#~ msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)."
-#~ msgstr "Permet de modifier les paramètres de la machine (tels que volume d'impression, taille de buse, etc.)"
-
-#~ msgctxt "name"
-#~ msgid "Machine Settings action"
-#~ msgstr "Action Paramètres de la machine"
-
-#~ msgctxt "description"
-#~ msgid "Find, manage and install new Cura packages."
-#~ msgstr "Rechercher, gérer et installer de nouveaux paquets Cura."
-
-#~ msgctxt "name"
-#~ msgid "Toolbox"
-#~ msgstr "Boîte à outils"
-
-#~ msgctxt "description"
-#~ msgid "Provides the X-Ray view."
-#~ msgstr "Permet la vue Rayon-X."
-
-#~ msgctxt "name"
-#~ msgid "X-Ray View"
-#~ msgstr "Vue Rayon-X"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for reading X3D files."
-#~ msgstr "Fournit la prise en charge de la lecture de fichiers X3D."
-
-#~ msgctxt "name"
-#~ msgid "X3D Reader"
-#~ msgstr "Lecteur X3D"
-
-#~ msgctxt "description"
-#~ msgid "Writes g-code to a file."
-#~ msgstr "Enregistre le G-Code dans un fichier."
-
-#~ msgctxt "name"
-#~ msgid "G-code Writer"
-#~ msgstr "Générateur de G-Code"
-
-#~ msgctxt "description"
-#~ msgid "Checks models and print configuration for possible printing issues and give suggestions."
-#~ msgstr "Vérifie les modèles et la configuration de l'impression pour déceler d'éventuels problèmes d'impression et donne des suggestions."
-
-#~ msgctxt "name"
-#~ msgid "Model Checker"
-#~ msgstr "Contrôleur de modèle"
-
-#~ msgctxt "description"
-#~ msgid "Dump the contents of all settings to a HTML file."
-#~ msgstr "Exporter les contenus de tous les paramètres vers un fichier HTML."
-
-#~ msgctxt "name"
-#~ msgid "God Mode"
-#~ msgstr "Mode God"
-
#~ msgctxt "description"
#~ msgid "Shows changes since latest checked version."
#~ msgstr "Affiche les changements depuis la dernière version."
@@ -5359,14 +6260,6 @@ msgstr "X3GWriter"
#~ msgid "Changelog"
#~ msgstr "Récapitulatif des changements"
-#~ msgctxt "description"
-#~ msgid "Provides a machine actions for updating firmware."
-#~ msgstr "Fournit à une machine des actions permettant la mise à jour du firmware."
-
-#~ msgctxt "name"
-#~ msgid "Firmware Updater"
-#~ msgstr "Programme de mise à jour du firmware"
-
#~ msgctxt "description"
#~ msgid "Create a flattend quality changes profile."
#~ msgstr "Créer un profil de changements de qualité aplati."
@@ -5375,14 +6268,6 @@ msgstr "X3GWriter"
#~ msgid "Profile flatener"
#~ msgstr "Aplatisseur de profil"
-#~ msgctxt "description"
-#~ msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware."
-#~ msgstr "Accepte les G-Code et les envoie à une imprimante. Ce plugin peut aussi mettre à jour le firmware."
-
-#~ msgctxt "name"
-#~ msgid "USB printing"
-#~ msgstr "Impression par USB"
-
#~ msgctxt "description"
#~ msgid "Ask the user once if he/she agrees with our license."
#~ msgstr "Demander à l'utilisateur une fois s'il appose son accord à notre licence."
@@ -5391,278 +6276,6 @@ msgstr "X3GWriter"
#~ msgid "UserAgreement"
#~ msgstr "UserAgreement"
-#~ msgctxt "description"
-#~ msgid "Writes g-code to a compressed archive."
-#~ msgstr "Enregistre le G-Code dans une archive compressée."
-
-#~ msgctxt "name"
-#~ msgid "Compressed G-code Writer"
-#~ msgstr "Générateur de G-Code compressé"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for writing Ultimaker Format Packages."
-#~ msgstr "Permet l'écriture de fichiers Ultimaker Format Package."
-
-#~ msgctxt "name"
-#~ msgid "UFP Writer"
-#~ msgstr "Générateur UFP"
-
-#~ msgctxt "description"
-#~ msgid "Provides a prepare stage in Cura."
-#~ msgstr "Fournit une étape de préparation dans Cura."
-
-#~ msgctxt "name"
-#~ msgid "Prepare Stage"
-#~ msgstr "Étape de préparation"
-
-#~ msgctxt "description"
-#~ msgid "Provides removable drive hotplugging and writing support."
-#~ msgstr "Permet le branchement hot-plug et l'écriture sur lecteur amovible."
-
-#~ msgctxt "name"
-#~ msgid "Removable Drive Output Device Plugin"
-#~ msgstr "Plugin de périphérique de sortie sur disque amovible"
-
-#~ msgctxt "description"
-#~ msgid "Manages network connections to Ultimaker 3 printers."
-#~ msgstr "Gère les connexions réseau vers les imprimantes Ultimaker 3."
-
-#~ msgctxt "name"
-#~ msgid "UM3 Network Connection"
-#~ msgstr "Connexion au réseau UM3"
-
-#~ msgctxt "description"
-#~ msgid "Provides a monitor stage in Cura."
-#~ msgstr "Fournit une étape de surveillance dans Cura."
-
-#~ msgctxt "name"
-#~ msgid "Monitor Stage"
-#~ msgstr "Étape de surveillance"
-
-#~ msgctxt "description"
-#~ msgid "Checks for firmware updates."
-#~ msgstr "Vérifie les mises à jour du firmware."
-
-#~ msgctxt "name"
-#~ msgid "Firmware Update Checker"
-#~ msgstr "Vérificateur des mises à jour du firmware"
-
-#~ msgctxt "description"
-#~ msgid "Provides the Simulation view."
-#~ msgstr "Fournit la Vue simulation."
-
-#~ msgctxt "name"
-#~ msgid "Simulation View"
-#~ msgstr "Vue simulation"
-
-#~ msgctxt "description"
-#~ msgid "Reads g-code from a compressed archive."
-#~ msgstr "Lit le G-Code à partir d'une archive compressée."
-
-#~ msgctxt "name"
-#~ msgid "Compressed G-code Reader"
-#~ msgstr "Lecteur G-Code compressé"
-
-#~ msgctxt "description"
-#~ msgid "Extension that allows for user created scripts for post processing"
-#~ msgstr "Extension qui permet le post-traitement des scripts créés par l'utilisateur"
-
-#~ msgctxt "name"
-#~ msgid "Post Processing"
-#~ msgstr "Post-traitement"
-
-#~ msgctxt "description"
-#~ msgid "Creates an eraser mesh to block the printing of support in certain places"
-#~ msgstr "Crée un maillage effaceur pour bloquer l'impression du support en certains endroits"
-
-#~ msgctxt "name"
-#~ msgid "Support Eraser"
-#~ msgstr "Effaceur de support"
-
-#~ msgctxt "description"
-#~ msgid "Submits anonymous slice info. Can be disabled through preferences."
-#~ msgstr "Envoie des informations anonymes sur le découpage. Peut être désactivé dans les préférences."
-
-#~ msgctxt "name"
-#~ msgid "Slice info"
-#~ msgstr "Information sur le découpage"
-
-#~ msgctxt "description"
-#~ msgid "Provides capabilities to read and write XML-based material profiles."
-#~ msgstr "Offre la possibilité de lire et d'écrire des profils matériels basés sur XML."
-
-#~ msgctxt "name"
-#~ msgid "Material Profiles"
-#~ msgstr "Profils matériels"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing profiles from legacy Cura versions."
-#~ msgstr "Fournit la prise en charge de l'importation de profils à partir de versions Cura antérieures."
-
-#~ msgctxt "name"
-#~ msgid "Legacy Cura Profile Reader"
-#~ msgstr "Lecteur de profil Cura antérieur"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing profiles from g-code files."
-#~ msgstr "Fournit la prise en charge de l'importation de profils à partir de fichiers g-code."
-
-#~ msgctxt "name"
-#~ msgid "G-code Profile Reader"
-#~ msgstr "Lecteur de profil G-Code"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.2 to Cura 3.3."
-#~ msgstr "Configurations des mises à niveau de Cura 3.2 vers Cura 3.3."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.2 to 3.3"
-#~ msgstr "Mise à niveau de 3.2 vers 3.3"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.3 to Cura 3.4."
-#~ msgstr "Configurations des mises à niveau de Cura 3.3 vers Cura 3.4."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.3 to 3.4"
-#~ msgstr "Mise à niveau de 3.3 vers 3.4"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
-#~ msgstr "Configurations des mises à niveau de Cura 2.5 vers Cura 2.6."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.5 to 2.6"
-#~ msgstr "Mise à niveau de 2.5 vers 2.6"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
-#~ msgstr "Met à niveau les configurations, de Cura 2.7 vers Cura 3.0."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.7 to 3.0"
-#~ msgstr "Mise à niveau de version, de 2.7 vers 3.0"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.4 to Cura 3.5."
-#~ msgstr "Configurations des mises à niveau de Cura 3.4 vers Cura 3.5."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.4 to 3.5"
-#~ msgstr "Mise à niveau de 3.4 vers 3.5"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.0 to Cura 3.1."
-#~ msgstr "Met à niveau les configurations, de Cura 3.0 vers Cura 3.1."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.0 to 3.1"
-#~ msgstr "Mise à niveau de version, de 3.0 vers 3.1"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
-#~ msgstr "Configurations des mises à niveau de Cura 2.6 vers Cura 2.7."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.6 to 2.7"
-#~ msgstr "Mise à niveau de 2.6 vers 2.7"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
-#~ msgstr "Configurations des mises à niveau de Cura 2.1 vers Cura 2.2."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.1 to 2.2"
-#~ msgstr "Mise à niveau vers 2.1 vers 2.2"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
-#~ msgstr "Configurations des mises à niveau de Cura 2.2 vers Cura 2.4."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.2 to 2.4"
-#~ msgstr "Mise à niveau de 2.2 vers 2.4"
-
-#~ msgctxt "description"
-#~ msgid "Enables ability to generate printable geometry from 2D image files."
-#~ msgstr "Permet de générer une géométrie imprimable à partir de fichiers d'image 2D."
-
-#~ msgctxt "name"
-#~ msgid "Image Reader"
-#~ msgstr "Lecteur d'images"
-
-#~ msgctxt "description"
-#~ msgid "Provides the link to the CuraEngine slicing backend."
-#~ msgstr "Fournit le lien vers l'arrière du système de découpage CuraEngine."
-
-#~ msgctxt "name"
-#~ msgid "CuraEngine Backend"
-#~ msgstr "Système CuraEngine"
-
-#~ msgctxt "description"
-#~ msgid "Provides the Per Model Settings."
-#~ msgstr "Fournit les paramètres par modèle."
-
-#~ msgctxt "name"
-#~ msgid "Per Model Settings Tool"
-#~ msgstr "Outil de paramètres par modèle"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for reading 3MF files."
-#~ msgstr "Fournit la prise en charge de la lecture de fichiers 3MF."
-
-#~ msgctxt "name"
-#~ msgid "3MF Reader"
-#~ msgstr "Lecteur 3MF"
-
-#~ msgctxt "description"
-#~ msgid "Provides a normal solid mesh view."
-#~ msgstr "Affiche une vue en maille solide normale."
-
-#~ msgctxt "name"
-#~ msgid "Solid View"
-#~ msgstr "Vue solide"
-
-#~ msgctxt "description"
-#~ msgid "Allows loading and displaying G-code files."
-#~ msgstr "Permet le chargement et l'affichage de fichiers G-Code."
-
-#~ msgctxt "name"
-#~ msgid "G-code Reader"
-#~ msgstr "Lecteur G-Code"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for exporting Cura profiles."
-#~ msgstr "Fournit la prise en charge de l'exportation de profils Cura."
-
-#~ msgctxt "name"
-#~ msgid "Cura Profile Writer"
-#~ msgstr "Générateur de profil Cura"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for writing 3MF files."
-#~ msgstr "Permet l'écriture de fichiers 3MF."
-
-#~ msgctxt "name"
-#~ msgid "3MF Writer"
-#~ msgstr "Générateur 3MF"
-
-#~ msgctxt "description"
-#~ msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)."
-#~ msgstr "Fournit les actions de la machine pour les machines Ultimaker (telles que l'assistant de calibration du plateau, sélection des mises à niveau, etc.)"
-
-#~ msgctxt "name"
-#~ msgid "Ultimaker machine actions"
-#~ msgstr "Actions de la machine Ultimaker"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing Cura profiles."
-#~ msgstr "Fournit la prise en charge de l'importation de profils Cura."
-
-#~ msgctxt "name"
-#~ msgid "Cura Profile Reader"
-#~ msgstr "Lecteur de profil Cura"
-
#~ msgctxt "@warning:status"
#~ msgid "Please generate G-code before saving."
#~ msgstr "Veuillez générer le G-Code avant d'enregistrer."
@@ -5703,14 +6316,6 @@ msgstr "X3GWriter"
#~ msgid "Upgrade Firmware"
#~ msgstr "Mise à niveau du firmware"
-#~ msgctxt "description"
-#~ msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI."
-#~ msgstr "Permet aux fabricants de matériaux de créer de nouveaux matériaux et profils de qualité à l'aide d'une interface utilisateur ad hoc."
-
-#~ msgctxt "name"
-#~ msgid "Print Profile Assistant"
-#~ msgstr "Assistant de profil d'impression"
-
#~ msgctxt "@action:button"
#~ msgid "Print with Doodle3D WiFi-Box"
#~ msgstr "Imprimer avec Doodle3D WiFi-Box"
@@ -5756,7 +6361,6 @@ msgstr "X3GWriter"
#~ "Could not export using \"{}\" quality!\n"
#~ "Felt back to \"{}\"."
#~ msgstr ""
-
#~ "Impossible d'exporter avec la qualité \"{}\" !\n"
#~ "Qualité redéfinie sur \"{}\"."
@@ -5933,7 +6537,6 @@ 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"
@@ -5950,7 +6553,6 @@ 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 !"
@@ -5961,7 +6563,6 @@ 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é !"
@@ -5986,7 +6587,6 @@ 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"
@@ -6001,7 +6601,6 @@ 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"
@@ -6106,7 +6705,6 @@ msgstr "X3GWriter"
#~ "Open the directory\n"
#~ "with macro and icon"
#~ msgstr ""
-
#~ "Ouvrez le répertoire\n"
#~ "contenant la macro et l'icône"
@@ -6405,7 +7003,6 @@ 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 !"
@@ -6416,7 +7013,6 @@ 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é !"
@@ -6451,7 +7047,6 @@ 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"
#~ " "
@@ -6618,7 +7213,6 @@ msgstr "X3GWriter"
#~ " Please use the \"Send report\" button to post a bug report automatically to our servers
\n"
#~ " "
#~ msgstr ""
-
#~ "Une exception 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"
#~ " "
@@ -6765,7 +7359,6 @@ msgstr "X3GWriter"
#~ " Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues
\n"
#~ " "
#~ msgstr ""
-
#~ "Une erreur fatale que nous ne pouvons résoudre s'est produite !
\n"
#~ " Veuillez utiliser les informations ci-dessous pour envoyer un rapport d'erreur à http://github.com/Ultimaker/Cura/issues
\n"
#~ " "
@@ -6808,7 +7401,6 @@ 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 ?"
@@ -7336,7 +7928,6 @@ 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"
@@ -7366,7 +7957,6 @@ msgstr "X3GWriter"
#~ " Please use the information below to post a bug report at http://github.com/Ultimaker/Cura/issues
\n"
#~ " "
#~ msgstr ""
-
#~ "Une erreur fatale que nous ne pouvons résoudre s'est produite !
\n"
#~ " Nous espérons que cette image d'un chaton vous aidera à vous remettre du choc.
\n"
#~ " Veuillez utiliser les informations ci-dessous pour envoyer un rapport d'erreur à http://github.com/Ultimaker/Cura/issues
"
diff --git a/resources/i18n/fr_FR/fdmextruder.def.json.po b/resources/i18n/fr_FR/fdmextruder.def.json.po
index a2b3150f0d..da14c42d89 100644
--- a/resources/i18n/fr_FR/fdmextruder.def.json.po
+++ b/resources/i18n/fr_FR/fdmextruder.def.json.po
@@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0000\n"
+"POT-Creation-Date: 2019-07-16 14:38+0000\n"
"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: French\n"
diff --git a/resources/i18n/fr_FR/fdmprinter.def.json.po b/resources/i18n/fr_FR/fdmprinter.def.json.po
index 8e46a0175d..5e7190fc47 100644
--- a/resources/i18n/fr_FR/fdmprinter.def.json.po
+++ b/resources/i18n/fr_FR/fdmprinter.def.json.po
@@ -5,12 +5,12 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2019-03-13 14:00+0200\n"
-"Last-Translator: Bothof \n"
-"Language-Team: French\n"
+"POT-Creation-Date: 2019-07-16 14:38+0000\n"
+"PO-Revision-Date: 2019-07-29 15:51+0200\n"
+"Last-Translator: Lionbridge \n"
+"Language-Team: French , French \n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -57,7 +57,9 @@ 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"
@@ -69,7 +71,9 @@ 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"
@@ -233,7 +237,7 @@ msgstr "Nombre de trains d'extrudeuse. Un train d'extrudeuse est la combinaison
#: fdmprinter.def.json
msgctxt "extruders_enabled_count label"
-msgid "Number of Extruders that are enabled"
+msgid "Number of Extruders That Are Enabled"
msgstr "Nombre d'extrudeuses activées"
#: fdmprinter.def.json
@@ -243,7 +247,7 @@ msgstr "Nombre de trains d'extrusion activés ; automatiquement défini dans le
#: fdmprinter.def.json
msgctxt "machine_nozzle_tip_outer_diameter label"
-msgid "Outer nozzle diameter"
+msgid "Outer Nozzle Diameter"
msgstr "Diamètre extérieur de la buse"
#: fdmprinter.def.json
@@ -253,7 +257,7 @@ msgstr "Le diamètre extérieur de la pointe de la buse."
#: fdmprinter.def.json
msgctxt "machine_nozzle_head_distance label"
-msgid "Nozzle length"
+msgid "Nozzle Length"
msgstr "Longueur de la buse"
#: fdmprinter.def.json
@@ -263,7 +267,7 @@ msgstr "La différence de hauteur entre la pointe de la buse et la partie la plu
#: fdmprinter.def.json
msgctxt "machine_nozzle_expansion_angle label"
-msgid "Nozzle angle"
+msgid "Nozzle Angle"
msgstr "Angle de la buse"
#: fdmprinter.def.json
@@ -273,7 +277,7 @@ msgstr "L'angle entre le plan horizontal et la partie conique juste au-dessus de
#: fdmprinter.def.json
msgctxt "machine_heat_zone_length label"
-msgid "Heat zone length"
+msgid "Heat Zone Length"
msgstr "Longueur de la zone chauffée"
#: fdmprinter.def.json
@@ -303,7 +307,7 @@ msgstr "Contrôler ou non la température depuis Cura. Désactivez cette option
#: fdmprinter.def.json
msgctxt "machine_nozzle_heat_up_speed label"
-msgid "Heat up speed"
+msgid "Heat Up Speed"
msgstr "Vitesse de chauffage"
#: fdmprinter.def.json
@@ -313,7 +317,7 @@ msgstr "La vitesse (°C/s) à laquelle la buse chauffe, sur une moyenne de la pl
#: fdmprinter.def.json
msgctxt "machine_nozzle_cool_down_speed label"
-msgid "Cool down speed"
+msgid "Cool Down Speed"
msgstr "Vitesse de refroidissement"
#: fdmprinter.def.json
@@ -333,7 +337,7 @@ msgstr "La durée minimale pendant laquelle une extrudeuse doit être inactive a
#: fdmprinter.def.json
msgctxt "machine_gcode_flavor label"
-msgid "G-code flavour"
+msgid "G-code Flavor"
msgstr "Parfum G-Code"
#: fdmprinter.def.json
@@ -398,7 +402,7 @@ msgstr "S'il faut utiliser les commandes de rétraction du firmware (G10 / G11
#: fdmprinter.def.json
msgctxt "machine_disallowed_areas label"
-msgid "Disallowed areas"
+msgid "Disallowed Areas"
msgstr "Zones interdites"
#: fdmprinter.def.json
@@ -418,7 +422,7 @@ msgstr "Une liste de polygones comportant les zones dans lesquelles le bec n'a p
#: fdmprinter.def.json
msgctxt "machine_head_polygon label"
-msgid "Machine head polygon"
+msgid "Machine Head Polygon"
msgstr "Polygone de la tête de machine"
#: fdmprinter.def.json
@@ -428,8 +432,8 @@ msgstr "Une silhouette 2D de la tête d'impression (sans les capuchons du ventil
#: fdmprinter.def.json
msgctxt "machine_head_with_fans_polygon label"
-msgid "Machine head & Fan polygon"
-msgstr "Tête de la machine et polygone du ventilateur"
+msgid "Machine Head & Fan Polygon"
+msgstr "Polygone de la tête de la machine et du ventilateur"
#: fdmprinter.def.json
msgctxt "machine_head_with_fans_polygon description"
@@ -438,7 +442,7 @@ msgstr "Une silhouette 2D de la tête d'impression (avec les capuchons du ventil
#: fdmprinter.def.json
msgctxt "gantry_height label"
-msgid "Gantry height"
+msgid "Gantry Height"
msgstr "Hauteur du portique"
#: fdmprinter.def.json
@@ -468,7 +472,7 @@ msgstr "Le diamètre intérieur de la buse. Modifiez ce paramètre si vous utili
#: fdmprinter.def.json
msgctxt "machine_use_extruder_offset_to_offset_coords label"
-msgid "Offset With Extruder"
+msgid "Offset with Extruder"
msgstr "Décalage avec extrudeuse"
#: fdmprinter.def.json
@@ -1219,7 +1223,7 @@ msgstr "Imprimer les parties du modèle qui sont horizontalement plus fines que
#: fdmprinter.def.json
msgctxt "xy_offset label"
msgid "Horizontal Expansion"
-msgstr "Vitesse d’impression horizontale"
+msgstr "Expansion horizontale"
#: fdmprinter.def.json
msgctxt "xy_offset description"
@@ -1293,8 +1297,11 @@ msgstr "Préférence de jointure d'angle"
#: fdmprinter.def.json
msgctxt "z_seam_corner description"
-msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner."
-msgstr "Vérifie si les angles du contour du modèle influencent l'emplacement de la jointure. « Aucune » signifie que les angles n'ont aucune influence sur l'emplacement de la jointure. « Masquer jointure » génère généralement le positionnement de la jointure sur un angle intérieur. « Exposer jointure » génère généralement le positionnement de la jointure sur un angle extérieur. « Masquer ou exposer jointure » génère généralement le positionnement de la jointure sur un angle intérieur ou extérieur."
+msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner. Smart Hiding allows both inside and outside corners, but chooses inside corners more frequently, if appropriate."
+msgstr "Vérifie si les angles du contour du modèle influencent l'emplacement de la jointure. « Aucune » signifie que les angles n'ont aucune influence sur l'emplacement"
+" de la jointure. « Masquer la jointure » génère le positionnement de la jointure sur un angle intérieur. « Exposer la jointure » génère le positionnement"
+" de la jointure sur un angle extérieur. « Masquer ou exposer la jointure » génère le positionnement de la jointure sur un angle intérieur ou extérieur."
+" « Jointure intelligente » autorise les angles intérieurs et extérieurs, mais choisit plus fréquemment les angles intérieurs, le cas échéant."
#: fdmprinter.def.json
msgctxt "z_seam_corner option z_seam_corner_none"
@@ -1316,6 +1323,11 @@ msgctxt "z_seam_corner option z_seam_corner_any"
msgid "Hide or Expose Seam"
msgstr "Masquer ou exposer jointure"
+#: fdmprinter.def.json
+msgctxt "z_seam_corner option z_seam_corner_weighted"
+msgid "Smart Hiding"
+msgstr "Masquage intelligent"
+
#: fdmprinter.def.json
msgctxt "z_seam_relative label"
msgid "Z Seam Relative"
@@ -1328,13 +1340,15 @@ msgstr "Si cette option est activée, les coordonnées de la jointure z sont rel
#: fdmprinter.def.json
msgctxt "skin_no_small_gaps_heuristic label"
-msgid "Ignore Small Z Gaps"
-msgstr "Ignorer les petits trous en Z"
+msgid "No Skin in Z Gaps"
+msgstr "Aucune couche dans les trous en Z"
#: fdmprinter.def.json
msgctxt "skin_no_small_gaps_heuristic description"
-msgid "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting."
-msgstr "Quand le modèle présente de petits trous verticaux, environ 5 % de temps de calcul supplémentaire peut être alloué à la génération de couches du dessus et du dessous dans ces espaces étroits. Dans ce cas, désactivez ce paramètre."
+msgid "When the model has small vertical gaps of only a few layers, there should normally be skin around those layers in the narrow space. Enable this setting to not generate skin if the vertical gap is very small. This improves printing time and slicing time, but technically leaves infill exposed to the air."
+msgstr "Lorsque le modèle comporte de petits trous verticaux de quelques couches seulement, il doit normalement y avoir une couche autour de celles-ci dans l'espace"
+" étroit. Activez ce paramètre pour ne pas générer de couche si le trou vertical est très petit. Cela améliore le temps d'impression et le temps de découpage,"
+" mais laisse techniquement le remplissage exposé à l'air."
#: fdmprinter.def.json
msgctxt "skin_outline_count label"
@@ -1631,7 +1645,9 @@ 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.\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."
+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."
#: fdmprinter.def.json
msgctxt "sub_div_rad_add label"
@@ -1863,6 +1879,16 @@ msgctxt "default_material_print_temperature description"
msgid "The default temperature used for printing. This should be the \"base\" temperature of a material. All other print temperatures should use offsets based on this value"
msgstr "La température par défaut utilisée pour l'impression. Il doit s'agir de la température de « base » d'un matériau. Toutes les autres températures d'impression doivent utiliser des décalages basés sur cette valeur"
+#: fdmprinter.def.json
+msgctxt "build_volume_temperature label"
+msgid "Build Volume Temperature"
+msgstr "Température du volume d'impression"
+
+#: fdmprinter.def.json
+msgctxt "build_volume_temperature description"
+msgid "The temperature of the environment to print in. If this is 0, the build volume temperature will not be adjusted."
+msgstr "La température de l'environnement d'impression. Si cette valeur est 0, la température du volume d'impression ne sera pas ajustée."
+
#: fdmprinter.def.json
msgctxt "material_print_temperature label"
msgid "Printing Temperature"
@@ -1973,6 +1999,86 @@ msgctxt "material_shrinkage_percentage description"
msgid "Shrinkage ratio in percentage."
msgstr "Taux de contraction en pourcentage."
+#: fdmprinter.def.json
+msgctxt "material_crystallinity label"
+msgid "Crystalline Material"
+msgstr "Matériau cristallin"
+
+#: fdmprinter.def.json
+msgctxt "material_crystallinity description"
+msgid "Is this material the type that breaks off cleanly when heated (crystalline), or is it the type that produces long intertwined polymer chains (non-crystalline)?"
+msgstr "Ce matériau se casse-t-il proprement lorsqu'il est chauffé (cristallin) ou est-ce le type qui produit de longues chaînes polymères entrelacées (non cristallines) ?"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retracted_position label"
+msgid "Anti-ooze Retracted Position"
+msgstr "Position anti-suintage rétractée"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retracted_position description"
+msgid "How far the material needs to be retracted before it stops oozing."
+msgstr "Jusqu'où le matériau doit être rétracté avant qu'il cesse de suinter."
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retraction_speed label"
+msgid "Anti-ooze Retraction Speed"
+msgstr "Vitesse de rétraction de l'anti-suintage"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retraction_speed description"
+msgid "How fast the material needs to be retracted during a filament switch to prevent oozing."
+msgstr "À quelle vitesse le matériau doit-il être rétracté lors d'un changement de filament pour empêcher le suintage."
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_retracted_position label"
+msgid "Break Preparation Retracted Position"
+msgstr "Préparation de rupture Position rétractée"
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_retracted_position description"
+msgid "How far the filament can be stretched before it breaks, while heated."
+msgstr "Jusqu'où le filament peut être étiré avant qu'il ne se casse, pendant qu'il est chauffé."
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_speed label"
+msgid "Break Preparation Retraction Speed"
+msgstr "Vitesse de rétraction de préparation de rupture"
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_speed description"
+msgid "How fast the filament needs to be retracted just before breaking it off in a retraction."
+msgstr "La vitesse à laquelle le filament doit être rétracté juste avant de le briser dans une rétraction."
+
+#: fdmprinter.def.json
+msgctxt "material_break_retracted_position label"
+msgid "Break Retracted Position"
+msgstr "Position rétractée de rupture"
+
+#: fdmprinter.def.json
+msgctxt "material_break_retracted_position description"
+msgid "How far to retract the filament in order to break it cleanly."
+msgstr "Jusqu'où rétracter le filament afin de le casser proprement."
+
+#: fdmprinter.def.json
+msgctxt "material_break_speed label"
+msgid "Break Retraction Speed"
+msgstr "Vitesse de rétraction de rupture"
+
+#: fdmprinter.def.json
+msgctxt "material_break_speed description"
+msgid "The speed at which to retract the filament in order to break it cleanly."
+msgstr "La vitesse à laquelle rétracter le filament afin de le rompre proprement."
+
+#: fdmprinter.def.json
+msgctxt "material_break_temperature label"
+msgid "Break Temperature"
+msgstr "Température de rupture"
+
+#: fdmprinter.def.json
+msgctxt "material_break_temperature description"
+msgid "The temperature at which the filament is broken for a clean break."
+msgstr "La température à laquelle le filament est cassé pour une rupture propre."
+
#: fdmprinter.def.json
msgctxt "material_flow label"
msgid "Flow"
@@ -1983,6 +2089,126 @@ msgctxt "material_flow description"
msgid "Flow compensation: the amount of material extruded is multiplied by this value."
msgstr "Compensation du débit : la quantité de matériau extrudée est multipliée par cette valeur."
+#: fdmprinter.def.json
+msgctxt "wall_material_flow label"
+msgid "Wall Flow"
+msgstr "Débit de paroi"
+
+#: fdmprinter.def.json
+msgctxt "wall_material_flow description"
+msgid "Flow compensation on wall lines."
+msgstr "Compensation de débit sur les lignes de la paroi."
+
+#: fdmprinter.def.json
+msgctxt "wall_0_material_flow label"
+msgid "Outer Wall Flow"
+msgstr "Débit de paroi externe"
+
+#: fdmprinter.def.json
+msgctxt "wall_0_material_flow description"
+msgid "Flow compensation on the outermost wall line."
+msgstr "Compensation de débit sur la ligne de la paroi la plus à l'extérieur."
+
+#: fdmprinter.def.json
+msgctxt "wall_x_material_flow label"
+msgid "Inner Wall(s) Flow"
+msgstr "Débit de paroi(s) interne(s)"
+
+#: fdmprinter.def.json
+msgctxt "wall_x_material_flow description"
+msgid "Flow compensation on wall lines for all wall lines except the outermost one."
+msgstr "Compensation de débit sur les lignes de la paroi pour toutes les lignes de paroi, à l'exception de la ligne la plus externe."
+
+#: fdmprinter.def.json
+msgctxt "skin_material_flow label"
+msgid "Top/Bottom Flow"
+msgstr "Débit du dessus/dessous"
+
+#: fdmprinter.def.json
+msgctxt "skin_material_flow description"
+msgid "Flow compensation on top/bottom lines."
+msgstr "Compensation de débit sur les lignes du dessus/dessous."
+
+#: fdmprinter.def.json
+msgctxt "roofing_material_flow label"
+msgid "Top Surface Skin Flow"
+msgstr "Débit de la surface du dessus"
+
+#: fdmprinter.def.json
+msgctxt "roofing_material_flow description"
+msgid "Flow compensation on lines of the areas at the top of the print."
+msgstr "Compensation de débit sur les lignes des zones en haut de l'impression."
+
+#: fdmprinter.def.json
+msgctxt "infill_material_flow label"
+msgid "Infill Flow"
+msgstr "Débit de remplissage"
+
+#: fdmprinter.def.json
+msgctxt "infill_material_flow description"
+msgid "Flow compensation on infill lines."
+msgstr "Compensation de débit sur les lignes de remplissage."
+
+#: fdmprinter.def.json
+msgctxt "skirt_brim_material_flow label"
+msgid "Skirt/Brim Flow"
+msgstr "Débit de la jupe/bordure"
+
+#: fdmprinter.def.json
+msgctxt "skirt_brim_material_flow description"
+msgid "Flow compensation on skirt or brim lines."
+msgstr "Compensation de débit sur les lignes de jupe ou bordure."
+
+#: fdmprinter.def.json
+msgctxt "support_material_flow label"
+msgid "Support Flow"
+msgstr "Débit du support"
+
+#: fdmprinter.def.json
+msgctxt "support_material_flow description"
+msgid "Flow compensation on support structure lines."
+msgstr "Compensation de débit sur les lignes de support."
+
+#: fdmprinter.def.json
+msgctxt "support_interface_material_flow label"
+msgid "Support Interface Flow"
+msgstr "Débit de l'interface de support"
+
+#: fdmprinter.def.json
+msgctxt "support_interface_material_flow description"
+msgid "Flow compensation on lines of support roof or floor."
+msgstr "Compensation de débit sur les lignes de plafond ou de bas de support."
+
+#: fdmprinter.def.json
+msgctxt "support_roof_material_flow label"
+msgid "Support Roof Flow"
+msgstr "Débit du plafond de support"
+
+#: fdmprinter.def.json
+msgctxt "support_roof_material_flow description"
+msgid "Flow compensation on support roof lines."
+msgstr "Compensation de débit sur les lignes du plafond de support."
+
+#: fdmprinter.def.json
+msgctxt "support_bottom_material_flow label"
+msgid "Support Floor Flow"
+msgstr "Débit du bas de support"
+
+#: fdmprinter.def.json
+msgctxt "support_bottom_material_flow description"
+msgid "Flow compensation on support floor lines."
+msgstr "Compensation de débit sur les lignes de bas de support."
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_flow label"
+msgid "Prime Tower Flow"
+msgstr "Débit de la tour primaire"
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_flow description"
+msgid "Flow compensation on prime tower lines."
+msgstr "Compensation de débit sur les lignes de la tour primaire."
+
#: fdmprinter.def.json
msgctxt "material_flow_layer_0 label"
msgid "Initial Layer Flow"
@@ -2100,8 +2326,9 @@ msgstr "Limiter les rétractations du support"
#: fdmprinter.def.json
msgctxt "limit_support_retractions description"
-msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excesive stringing within the support structure."
-msgstr "Omettre la rétraction lors du passage entre supports en ligne droite. L'activation de ce paramètre permet de gagner du temps lors de l'impression, mais peut conduire à un cordage excessif à l'intérieur de la structure de support."
+msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excessive stringing within the support structure."
+msgstr "Omettre la rétraction lors du passage entre supports en ligne droite. L'activation de ce paramètre permet de gagner du temps lors de l'impression, mais"
+" peut conduire à un stringing excessif à l'intérieur de la structure de support."
#: fdmprinter.def.json
msgctxt "material_standby_temperature label"
@@ -2153,6 +2380,16 @@ msgctxt "switch_extruder_prime_speed description"
msgid "The speed at which the filament is pushed back after a nozzle switch retraction."
msgstr "La vitesse à laquelle le filament est poussé vers l'arrière après une rétraction de changement de buse."
+#: fdmprinter.def.json
+msgctxt "switch_extruder_extra_prime_amount label"
+msgid "Nozzle Switch Extra Prime Amount"
+msgstr "Montant de l'amorce supplémentaire lors d'un changement de buse"
+
+#: fdmprinter.def.json
+msgctxt "switch_extruder_extra_prime_amount description"
+msgid "Extra material to prime after nozzle switching."
+msgstr "Matériel supplémentaire à amorcer après le changement de buse."
+
#: fdmprinter.def.json
msgctxt "speed label"
msgid "Speed"
@@ -2344,14 +2581,15 @@ msgid "The speed at which the skirt and brim are printed. Normally this is done
msgstr "La vitesse à laquelle la jupe et la bordure sont imprimées. Normalement, cette vitesse est celle de la couche initiale, mais il est parfois nécessaire d’imprimer la jupe ou la bordure à une vitesse différente."
#: fdmprinter.def.json
-msgctxt "max_feedrate_z_override label"
-msgid "Maximum Z Speed"
-msgstr "Vitesse Z maximale"
+msgctxt "speed_z_hop label"
+msgid "Z Hop Speed"
+msgstr "Vitesse du décalage en Z"
#: fdmprinter.def.json
-msgctxt "max_feedrate_z_override description"
-msgid "The maximum speed with which the build plate is moved. Setting this to zero causes the print to use the firmware defaults for the maximum z speed."
-msgstr "La vitesse maximale à laquelle le plateau se déplace. Définir cette valeur sur zéro impose à l'impression d'utiliser les valeurs par défaut du firmware pour la vitesse z maximale."
+msgctxt "speed_z_hop description"
+msgid "The speed at which the vertical Z movement is made for Z Hops. This is typically lower than the print speed since the build plate or machine's gantry is harder to move."
+msgstr "La vitesse à laquelle le mouvement vertical en Z est effectué pour des décalages en Z. Cette vitesse est généralement inférieure à la vitesse d'impression"
+" car le plateau ou le portique de la machine est plus difficile à déplacer."
#: fdmprinter.def.json
msgctxt "speed_slowdown_layers label"
@@ -2923,6 +3161,16 @@ msgctxt "retraction_hop_after_extruder_switch description"
msgid "After the machine switched from one extruder to the other, the build plate is lowered to create clearance between the nozzle and the print. This prevents the nozzle from leaving oozed material on the outside of a print."
msgstr "Une fois que la machine est passée d'une extrudeuse à l'autre, le plateau s'abaisse pour créer un dégagement entre la buse et l'impression. Cela évite que la buse ne ressorte avec du matériau suintant sur l'extérieur d'une impression."
+#: fdmprinter.def.json
+msgctxt "retraction_hop_after_extruder_switch_height label"
+msgid "Z Hop After Extruder Switch Height"
+msgstr "Décalage en Z après changement de hauteur d'extrudeuse"
+
+#: fdmprinter.def.json
+msgctxt "retraction_hop_after_extruder_switch_height description"
+msgid "The height difference when performing a Z Hop after extruder switch."
+msgstr "La différence de hauteur lors de la réalisation d'un décalage en Z après changement d'extrudeuse."
+
#: fdmprinter.def.json
msgctxt "cooling label"
msgid "Cooling"
@@ -3193,6 +3441,11 @@ msgctxt "support_pattern option cross"
msgid "Cross"
msgstr "Entrecroisé"
+#: fdmprinter.def.json
+msgctxt "support_pattern option gyroid"
+msgid "Gyroid"
+msgstr "Gyroïde"
+
#: fdmprinter.def.json
msgctxt "support_wall_count label"
msgid "Support Wall Line Count"
@@ -3254,12 +3507,12 @@ msgid "Distance between the printed initial layer support structure lines. This
msgstr "Distance entre les lignes de la structure de support de la couche initiale imprimée. Ce paramètre est calculé en fonction de la densité du support."
#: fdmprinter.def.json
-msgctxt "support_infill_angle label"
-msgid "Support Infill Line Direction"
+msgctxt "support_infill_angles label"
+msgid "Support Infill Line Directions"
msgstr "Direction de ligne de remplissage du support"
#: fdmprinter.def.json
-msgctxt "support_infill_angle description"
+msgctxt "support_infill_angles description"
msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane."
msgstr "Orientation du motif de remplissage pour les supports. Le motif de remplissage du support pivote dans le plan horizontal."
@@ -3390,8 +3643,8 @@ msgstr "Distance de jointement des supports"
#: fdmprinter.def.json
msgctxt "support_join_distance description"
-msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one."
-msgstr "La distance maximale entre les supports dans les directions X/Y. Lorsque des supports séparés sont plus rapprochés que cette valeur, ils fusionnent."
+msgid "The maximum distance between support structures in the X/Y directions. When separate structures are closer together than this value, the structures merge into one."
+msgstr "La distance maximale entre les supports dans les directions X/Y. Lorsque des modèle séparés sont plus rapprochés que cette valeur, ils fusionnent."
#: fdmprinter.def.json
msgctxt "support_offset label"
@@ -3769,14 +4022,14 @@ msgid "The diameter of a special tower."
msgstr "Le diamètre d’une tour spéciale."
#: fdmprinter.def.json
-msgctxt "support_minimal_diameter label"
-msgid "Minimum Diameter"
-msgstr "Diamètre minimal"
+msgctxt "support_tower_maximum_supported_diameter label"
+msgid "Maximum Tower-Supported Diameter"
+msgstr "Diamètre maximal supporté par la tour"
#: fdmprinter.def.json
-msgctxt "support_minimal_diameter description"
-msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
-msgstr "Le diamètre minimal sur les axes X/Y d’une petite zone qui doit être soutenue par une tour de soutien spéciale."
+msgctxt "support_tower_maximum_supported_diameter description"
+msgid "Maximum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
+msgstr "Le diamètre maximal sur les axes X/Y d’une petite zone qui doit être soutenue par une tour de soutien spéciale."
#: fdmprinter.def.json
msgctxt "support_tower_roof_angle label"
@@ -3898,7 +4151,9 @@ 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.\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."
+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."
#: fdmprinter.def.json
msgctxt "skirt_brim_minimal_length label"
@@ -4270,16 +4525,6 @@ msgctxt "prime_tower_enable description"
msgid "Print a tower next to the print which serves to prime the material after each nozzle switch."
msgstr "Imprimer une tour à côté de l'impression qui sert à amorcer le matériau après chaque changement de buse."
-#: fdmprinter.def.json
-msgctxt "prime_tower_circular label"
-msgid "Circular Prime Tower"
-msgstr "Tour primaire circulaire"
-
-#: fdmprinter.def.json
-msgctxt "prime_tower_circular description"
-msgid "Make the prime tower as a circular shape."
-msgstr "Réaliser la tour primaire en forme circulaire."
-
#: fdmprinter.def.json
msgctxt "prime_tower_size label"
msgid "Prime Tower Size"
@@ -4320,16 +4565,6 @@ msgctxt "prime_tower_position_y description"
msgid "The y coordinate of the position of the prime tower."
msgstr "Les coordonnées Y de la position de la tour primaire."
-#: fdmprinter.def.json
-msgctxt "prime_tower_flow label"
-msgid "Prime Tower Flow"
-msgstr "Débit de la tour primaire"
-
-#: fdmprinter.def.json
-msgctxt "prime_tower_flow description"
-msgid "Flow compensation: the amount of material extruded is multiplied by this value."
-msgstr "Compensation du débit : la quantité de matériau extrudée est multipliée par cette valeur."
-
#: fdmprinter.def.json
msgctxt "prime_tower_wipe_enabled label"
msgid "Wipe Inactive Nozzle on Prime Tower"
@@ -4340,6 +4575,16 @@ msgctxt "prime_tower_wipe_enabled description"
msgid "After printing the prime tower with one nozzle, wipe the oozed material from the other nozzle off on the prime tower."
msgstr "Après l'impression de la tour primaire à l'aide d'une buse, nettoyer le matériau qui suinte de l'autre buse sur la tour primaire."
+#: fdmprinter.def.json
+msgctxt "prime_tower_brim_enable label"
+msgid "Prime Tower Brim"
+msgstr "Bordure de la tour primaire"
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_brim_enable description"
+msgid "Prime-towers might need the extra adhesion afforded by a brim even if the model doesn't. Presently can't be used with the 'Raft' adhesion-type."
+msgstr "Les tours primaires peuvent avoir besoin de l'adhérence supplémentaire d'une bordure, même si le modèle n'en a pas besoin. Ne peut actuellement pas être utilisé avec le type d'adhérence « Raft » (radeau)."
+
#: fdmprinter.def.json
msgctxt "ooze_shield_enabled label"
msgid "Enable Ooze Shield"
@@ -4622,8 +4867,9 @@ msgstr "Lisser les contours spiralisés"
#: fdmprinter.def.json
msgctxt "smooth_spiralized_contours description"
-msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
-msgstr "Lisser les contours spiralisés pour réduire la visibilité de la jointure en Z (la jointure en Z doit être à peine visible sur l'impression mais sera toujours visible dans la vue en couches). Veuillez remarquer que le lissage aura tendance à estomper les détails fins de la surface."
+msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
+msgstr "Lisser les contours spiralisés pour réduire la visibilité de la jointure en Z (la jointure en Z doit être à peine visible sur l'impression mais sera toujours"
+" visible dans la vue en couches). Veuillez remarquer que le lissage aura tendance à estomper les détails très fins de la surface."
#: fdmprinter.def.json
msgctxt "relative_extrusion label"
@@ -4855,6 +5101,16 @@ msgctxt "meshfix_maximum_travel_resolution description"
msgid "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."
msgstr "Taille minimale d'un segment de ligne de déplacement après la découpe. Si vous augmentez cette valeur, les mouvements de déplacement auront des coins moins lisses. Cela peut permettre à l'imprimante de suivre la vitesse à laquelle elle doit traiter le G-Code, mais cela peut réduire la précision de l'évitement du modèle."
+#: fdmprinter.def.json
+msgctxt "meshfix_maximum_deviation label"
+msgid "Maximum Deviation"
+msgstr "Écart maximum"
+
+#: fdmprinter.def.json
+msgctxt "meshfix_maximum_deviation description"
+msgid "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."
+msgstr "L'écart maximum autorisé lors de la réduction de la résolution pour le paramètre Résolution maximum. Si vous augmentez cette valeur, l'impression sera moins précise, mais le G-Code sera plus petit."
+
#: fdmprinter.def.json
msgctxt "support_skip_some_zags label"
msgid "Break Up Support In Chunks"
@@ -5112,8 +5368,8 @@ msgstr "Activer les supports coniques"
#: fdmprinter.def.json
msgctxt "support_conical_enabled description"
-msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang."
-msgstr "Fonctionnalité expérimentale : rendre les aires de support plus petites en bas qu'au niveau du porte-à-faux à supporter."
+msgid "Make support areas smaller at the bottom than at the overhang."
+msgstr "Rendre les aires de support plus petites en bas qu'au niveau du porte-à-faux à supporter."
#: fdmprinter.def.json
msgctxt "support_conical_angle label"
@@ -5345,7 +5601,9 @@ 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.\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."
+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."
#: fdmprinter.def.json
msgctxt "wireframe_top_jump label"
@@ -5454,7 +5712,7 @@ msgstr "Distance entre la buse et les lignes descendantes horizontalement. Un es
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_enabled label"
-msgid "Use adaptive layers"
+msgid "Use Adaptive Layers"
msgstr "Utiliser des couches adaptatives"
#: fdmprinter.def.json
@@ -5464,7 +5722,7 @@ msgstr "Cette option calcule la hauteur des couches en fonction de la forme du m
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_variation label"
-msgid "Adaptive layers maximum variation"
+msgid "Adaptive Layers Maximum Variation"
msgstr "Variation maximale des couches adaptatives"
#: fdmprinter.def.json
@@ -5474,7 +5732,7 @@ msgstr "Hauteur maximale autorisée par rapport à la couche de base."
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_variation_step label"
-msgid "Adaptive layers variation step size"
+msgid "Adaptive Layers Variation Step Size"
msgstr "Taille des étapes de variation des couches adaptatives"
#: fdmprinter.def.json
@@ -5484,7 +5742,7 @@ msgstr "Différence de hauteur de la couche suivante par rapport à la précéde
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_threshold label"
-msgid "Adaptive layers threshold"
+msgid "Adaptive Layers Threshold"
msgstr "Limite des couches adaptatives"
#: fdmprinter.def.json
@@ -5702,6 +5960,156 @@ msgctxt "bridge_fan_speed_3 description"
msgid "Percentage fan speed to use when printing the third bridge skin layer."
msgstr "Vitesse du ventilateur en pourcentage à utiliser pour l'impression de la troisième couche extérieure du pont."
+#: fdmprinter.def.json
+msgctxt "clean_between_layers label"
+msgid "Wipe Nozzle Between Layers"
+msgstr "Essuyer la buse entre les couches"
+
+#: fdmprinter.def.json
+msgctxt "clean_between_layers description"
+msgid "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."
+msgstr "Inclure ou non le G-Code d'essuyage de la buse entre les couches. L'activation de ce paramètre peut influencer le comportement de la rétraction lors du changement de couche. Veuillez utiliser les paramètres de rétraction d'essuyage pour contrôler la rétraction aux couches où le script d'essuyage sera exécuté."
+
+#: fdmprinter.def.json
+msgctxt "max_extrusion_before_wipe label"
+msgid "Material Volume Between Wipes"
+msgstr "Volume de matériau entre les essuyages"
+
+#: fdmprinter.def.json
+msgctxt "max_extrusion_before_wipe description"
+msgid "Maximum material, that can be extruded before another nozzle wipe is initiated."
+msgstr "Le volume maximum de matériau qui peut être extrudé avant qu'un autre essuyage de buse ne soit lancé."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_enable label"
+msgid "Wipe Retraction Enable"
+msgstr "Activation de la rétraction d'essuyage"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_enable description"
+msgid "Retract the filament when the nozzle is moving over a non-printed area."
+msgstr "Rétracte le filament quand la buse se déplace vers une zone non imprimée."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_amount label"
+msgid "Wipe Retraction Distance"
+msgstr "Distance de rétraction d'essuyage"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_amount description"
+msgid "Amount to retract the filament so it does not ooze during the wipe sequence."
+msgstr "La distance de rétraction du filament afin qu'il ne suinte pas pendant la séquence d'essuyage."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_extra_prime_amount label"
+msgid "Wipe Retraction Extra Prime Amount"
+msgstr "Degré supplémentaire de rétraction d'essuyage primaire"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_extra_prime_amount description"
+msgid "Some material can ooze away during a wipe travel moves, which can be compensated for here."
+msgstr "Du matériau peut suinter pendant un déplacement d'essuyage, ce qui peut être compensé ici."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_speed label"
+msgid "Wipe Retraction Speed"
+msgstr "Vitesse de rétraction d'essuyage"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_speed description"
+msgid "The speed at which the filament is retracted and primed during a wipe retraction move."
+msgstr "La vitesse à laquelle le filament est rétracté et préparé pendant un déplacement de rétraction d'essuyage."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_retract_speed label"
+msgid "Wipe Retraction Retract Speed"
+msgstr "Vitesse de rétraction d'essuyage"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_retract_speed description"
+msgid "The speed at which the filament is retracted during a wipe retraction move."
+msgstr "La vitesse à laquelle le filament est rétracté pendant un déplacement de rétraction d'essuyage."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_prime_speed label"
+msgid "Retraction Prime Speed"
+msgstr "Vitesse de rétraction primaire"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_prime_speed description"
+msgid "The speed at which the filament is primed during a wipe retraction move."
+msgstr "La vitesse à laquelle le filament est préparé pendant un déplacement de rétraction d'essuyage."
+
+#: fdmprinter.def.json
+msgctxt "wipe_pause label"
+msgid "Wipe Pause"
+msgstr "Pause d'essuyage"
+
+#: fdmprinter.def.json
+msgctxt "wipe_pause description"
+msgid "Pause after the unretract."
+msgstr "Pause après l'irrétraction."
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_enable label"
+msgid "Wipe Z Hop When Retracted"
+msgstr "Décalage en Z d'essuyage lors d’une rétraction"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_enable description"
+msgid "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."
+msgstr "À chaque rétraction, le plateau est abaissé pour créer un espace entre la buse et l'impression. Cela évite que la buse ne touche l'impression pendant les déplacements, réduisant ainsi le risque de heurter l'impression à partir du plateau."
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_amount label"
+msgid "Wipe Z Hop Height"
+msgstr "Hauteur du décalage en Z d'essuyage"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_amount description"
+msgid "The height difference when performing a Z Hop."
+msgstr "La différence de hauteur lors de la réalisation d'un décalage en Z."
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_speed label"
+msgid "Wipe Hop Speed"
+msgstr "Vitesse du décalage d'essuyage"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_speed description"
+msgid "Speed to move the z-axis during the hop."
+msgstr "Vitesse de déplacement de l'axe Z pendant le décalage."
+
+#: fdmprinter.def.json
+msgctxt "wipe_brush_pos_x label"
+msgid "Wipe Brush X Position"
+msgstr "Position X de la brosse d'essuyage"
+
+#: fdmprinter.def.json
+msgctxt "wipe_brush_pos_x description"
+msgid "X location where wipe script will start."
+msgstr "Emplacement X où le script d'essuyage démarrera."
+
+#: fdmprinter.def.json
+msgctxt "wipe_repeat_count label"
+msgid "Wipe Repeat Count"
+msgstr "Nombre de répétitions d'essuyage"
+
+#: fdmprinter.def.json
+msgctxt "wipe_repeat_count description"
+msgid "Number of times to move the nozzle across the brush."
+msgstr "Le nombre de déplacements de la buse à travers la brosse."
+
+#: fdmprinter.def.json
+msgctxt "wipe_move_distance label"
+msgid "Wipe Move Distance"
+msgstr "Distance de déplacement d'essuyage"
+
+#: fdmprinter.def.json
+msgctxt "wipe_move_distance description"
+msgid "The distance to move the head back and forth across the brush."
+msgstr "La distance de déplacement de la tête d'avant en arrière à travers la brosse."
+
#: fdmprinter.def.json
msgctxt "command_line_settings label"
msgid "Command Line Settings"
@@ -5762,6 +6170,138 @@ msgctxt "mesh_rotation_matrix description"
msgid "Transformation matrix to be applied to the model when loading it from file."
msgstr "Matrice de transformation à appliquer au modèle lors de son chargement depuis le fichier."
+#~ msgctxt "machine_gcode_flavor label"
+#~ msgid "G-code Flavour"
+#~ msgstr "Parfum G-Code"
+
+#~ msgctxt "z_seam_corner description"
+#~ msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner."
+#~ msgstr "Vérifie si les angles du contour du modèle influencent l'emplacement de la jointure. « Aucune » signifie que les angles n'ont aucune influence sur l'emplacement de la jointure. « Masquer jointure » génère généralement le positionnement de la jointure sur un angle intérieur. « Exposer jointure » génère généralement le positionnement de la jointure sur un angle extérieur. « Masquer ou exposer jointure » génère généralement le positionnement de la jointure sur un angle intérieur ou extérieur."
+
+#~ msgctxt "skin_no_small_gaps_heuristic label"
+#~ msgid "Ignore Small Z Gaps"
+#~ msgstr "Ignorer les petits trous en Z"
+
+#~ msgctxt "skin_no_small_gaps_heuristic description"
+#~ msgid "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting."
+#~ msgstr "Quand le modèle présente de petits trous verticaux, environ 5 % de temps de calcul supplémentaire peut être alloué à la génération de couches du dessus et du dessous dans ces espaces étroits. Dans ce cas, désactivez ce paramètre."
+
+#~ msgctxt "build_volume_temperature description"
+#~ msgid "The temperature used for build volume. If this is 0, the build volume temperature will not be adjusted."
+#~ msgstr "La température utilisée pour le volume d'impression. Si cette valeur est 0, la température du volume d'impression ne sera pas ajustée."
+
+#~ msgctxt "limit_support_retractions description"
+#~ msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excesive stringing within the support structure."
+#~ msgstr "Omettre la rétraction lors du passage entre supports en ligne droite. L'activation de ce paramètre permet de gagner du temps lors de l'impression, mais peut conduire à un cordage excessif à l'intérieur de la structure de support."
+
+#~ msgctxt "max_feedrate_z_override label"
+#~ msgid "Maximum Z Speed"
+#~ msgstr "Vitesse Z maximale"
+
+#~ msgctxt "max_feedrate_z_override description"
+#~ msgid "The maximum speed with which the build plate is moved. Setting this to zero causes the print to use the firmware defaults for the maximum z speed."
+#~ msgstr "La vitesse maximale à laquelle le plateau se déplace. Définir cette valeur sur zéro impose à l'impression d'utiliser les valeurs par défaut du firmware pour la vitesse z maximale."
+
+#~ msgctxt "support_join_distance description"
+#~ msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one."
+#~ msgstr "La distance maximale entre les supports dans les directions X/Y. Lorsque des supports séparés sont plus rapprochés que cette valeur, ils fusionnent."
+
+#~ msgctxt "support_minimal_diameter label"
+#~ msgid "Minimum Diameter"
+#~ msgstr "Diamètre minimal"
+
+#~ msgctxt "support_minimal_diameter description"
+#~ msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
+#~ msgstr "Le diamètre minimal sur les axes X/Y d’une petite zone qui doit être soutenue par une tour de soutien spéciale."
+
+#~ msgctxt "prime_tower_circular label"
+#~ msgid "Circular Prime Tower"
+#~ msgstr "Tour primaire circulaire"
+
+#~ msgctxt "prime_tower_circular description"
+#~ msgid "Make the prime tower as a circular shape."
+#~ msgstr "Réaliser la tour primaire en forme circulaire."
+
+#~ msgctxt "prime_tower_flow description"
+#~ msgid "Flow compensation: the amount of material extruded is multiplied by this value."
+#~ msgstr "Compensation du débit : la quantité de matériau extrudée est multipliée par cette valeur."
+
+#~ msgctxt "smooth_spiralized_contours description"
+#~ msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
+#~ msgstr "Lisser les contours spiralisés pour réduire la visibilité de la jointure en Z (la jointure en Z doit être à peine visible sur l'impression mais sera toujours visible dans la vue en couches). Veuillez remarquer que le lissage aura tendance à estomper les détails fins de la surface."
+
+#~ msgctxt "support_conical_enabled description"
+#~ msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang."
+#~ msgstr "Fonctionnalité expérimentale : rendre les aires de support plus petites en bas qu'au niveau du porte-à-faux à supporter."
+
+#~ msgctxt "extruders_enabled_count label"
+#~ msgid "Number of Extruders that are enabled"
+#~ msgstr "Nombre d'extrudeuses activées"
+
+#~ msgctxt "machine_nozzle_tip_outer_diameter label"
+#~ msgid "Outer nozzle diameter"
+#~ msgstr "Diamètre extérieur de la buse"
+
+#~ msgctxt "machine_nozzle_head_distance label"
+#~ msgid "Nozzle length"
+#~ msgstr "Longueur de la buse"
+
+#~ msgctxt "machine_nozzle_expansion_angle label"
+#~ msgid "Nozzle angle"
+#~ msgstr "Angle de la buse"
+
+#~ msgctxt "machine_heat_zone_length label"
+#~ msgid "Heat zone length"
+#~ msgstr "Longueur de la zone chauffée"
+
+#~ msgctxt "machine_nozzle_heat_up_speed label"
+#~ msgid "Heat up speed"
+#~ msgstr "Vitesse de chauffage"
+
+#~ msgctxt "machine_nozzle_cool_down_speed label"
+#~ msgid "Cool down speed"
+#~ msgstr "Vitesse de refroidissement"
+
+#~ msgctxt "machine_gcode_flavor label"
+#~ msgid "G-code flavour"
+#~ msgstr "Parfum G-Code"
+
+#~ msgctxt "machine_disallowed_areas label"
+#~ msgid "Disallowed areas"
+#~ msgstr "Zones interdites"
+
+#~ msgctxt "machine_head_polygon label"
+#~ msgid "Machine head polygon"
+#~ msgstr "Polygone de la tête de machine"
+
+#~ msgctxt "machine_head_with_fans_polygon label"
+#~ msgid "Machine head & Fan polygon"
+#~ msgstr "Tête de la machine et polygone du ventilateur"
+
+#~ msgctxt "gantry_height label"
+#~ msgid "Gantry height"
+#~ msgstr "Hauteur du portique"
+
+#~ msgctxt "machine_use_extruder_offset_to_offset_coords label"
+#~ msgid "Offset With Extruder"
+#~ msgstr "Décalage avec extrudeuse"
+
+#~ msgctxt "adaptive_layer_height_enabled label"
+#~ msgid "Use adaptive layers"
+#~ msgstr "Utiliser des couches adaptatives"
+
+#~ msgctxt "adaptive_layer_height_variation label"
+#~ msgid "Adaptive layers maximum variation"
+#~ msgstr "Variation maximale des couches adaptatives"
+
+#~ msgctxt "adaptive_layer_height_variation_step label"
+#~ msgid "Adaptive layers variation step size"
+#~ msgstr "Taille des étapes de variation des couches adaptatives"
+
+#~ msgctxt "adaptive_layer_height_threshold label"
+#~ msgid "Adaptive layers threshold"
+#~ msgstr "Limite des couches adaptatives"
+
#~ msgctxt "skin_overlap description"
#~ msgid "The amount of overlap between the skin and the walls as a percentage of the skin line width. A slight overlap allows the walls to connect firmly to the skin. This is a percentage of the average line widths of the skin lines and the innermost wall."
#~ msgstr "Le montant de chevauchement entre la couche extérieure et les parois en pourcentage de la largeur de ligne de couche extérieure. Un chevauchement faible permet aux parois de se connecter fermement à la couche extérieure. Ce montant est un pourcentage des largeurs moyennes des lignes de la couche extérieure et de la paroi la plus intérieure."
@@ -5899,7 +6439,6 @@ 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"
#~ "."
@@ -5912,7 +6451,6 @@ 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"
#~ "."
@@ -5969,7 +6507,6 @@ 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 4d2ea5070b..07a73aa191 100644
--- a/resources/i18n/it_IT/cura.po
+++ b/resources/i18n/it_IT/cura.po
@@ -5,12 +5,12 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2019-03-14 14:31+0100\n"
-"Last-Translator: Bothof \n"
-"Language-Team: Italian\n"
+"POT-Creation-Date: 2019-07-16 14:38+0200\n"
+"PO-Revision-Date: 2019-07-29 15:51+0100\n"
+"Last-Translator: Lionbridge \n"
+"Language-Team: Italian , Italian \n"
"Language: it_IT\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,7 +18,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.1.1\n"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:27
msgctxt "@action"
msgid "Machine Settings"
msgstr "Impostazioni macchina"
@@ -56,7 +56,7 @@ msgctxt "@info:title"
msgid "3D Model Assistant"
msgstr "Assistente modello 3D"
-#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:86
+#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:90
#, python-brace-format
msgctxt "@info:status"
msgid ""
@@ -70,16 +70,6 @@ msgstr ""
"Scopri come garantire la migliore qualità ed affidabilità di stampa.
\n"
"Visualizza la guida alla qualità di stampa
"
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
-msgctxt "@item:inmenu"
-msgid "Changelog"
-msgstr "Registro modifiche"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
-msgctxt "@item:inmenu"
-msgid "Show Changelog"
-msgstr "Visualizza registro modifiche"
-
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py:25
msgctxt "@action"
msgid "Update Firmware"
@@ -95,37 +85,36 @@ msgctxt "@info:status"
msgid "Profile has been flattened & activated."
msgstr "Il profilo è stato appiattito e attivato."
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:33
+#: /home/ruben/Projects/Cura/plugins/AMFReader/__init__.py:15
+msgctxt "@item:inlistbox"
+msgid "AMF File"
+msgstr "File AMF"
+
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:37
msgctxt "@item:inmenu"
msgid "USB printing"
msgstr "Stampa USB"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:34
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:38
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print via USB"
msgstr "Stampa tramite USB"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:35
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:39
msgctxt "@info:tooltip"
msgid "Print via USB"
msgstr "Stampa tramite USB"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:71
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:75
msgctxt "@info:status"
msgid "Connected via USB"
msgstr "Connesso tramite USB"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:96
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:100
msgctxt "@label"
msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?"
msgstr "Stampa tramite USB in corso, la chiusura di Cura interrompe la stampa. Confermare?"
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
-msgctxt "X3G Writer File Description"
-msgid "X3G File"
-msgstr "File X3G"
-
#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/GPX-prefix/src/GPX/slicerplugins/cura15.06/X3gWriter/__init__.py:16
msgctxt "X3g Writer Plugin Description"
msgid "Writes X3g to files"
@@ -136,6 +125,11 @@ msgctxt "X3g Writer File Description"
msgid "X3g File"
msgstr "File X3g"
+#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
+msgctxt "X3G Writer File Description"
+msgid "X3G File"
+msgstr "File X3G"
+
#: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/__init__.py:17
#: /home/ruben/Projects/Cura/plugins/GCodeGzReader/__init__.py:17
msgctxt "@item:inlistbox"
@@ -148,6 +142,7 @@ msgid "GCodeGzWriter does not support text mode."
msgstr "GCodeGzWriter non supporta la modalità di testo."
#: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:28
+#: /home/ruben/Projects/Cura/plugins/UFPReader/__init__.py:22
msgctxt "@item:inlistbox"
msgid "Ultimaker Format Package"
msgstr "Pacchetto formato Ultimaker"
@@ -206,10 +201,10 @@ msgid "Could not save to removable drive {0}: {1}"
msgstr "Impossibile salvare su unità rimovibile {0}: {1}"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:137
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:152
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:133
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:140
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1629
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:188
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:134
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:141
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1622
msgctxt "@info:title"
msgid "Error"
msgstr "Errore"
@@ -238,9 +233,9 @@ msgstr "Rimuovi il dispositivo rimovibile {0}"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:151
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:163
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1619
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1719
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1612
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1712
msgctxt "@info:title"
msgid "Warning"
msgstr "Avvertenza"
@@ -267,266 +262,267 @@ msgctxt "@item:intext"
msgid "Removable Drive"
msgstr "Unità rimovibile"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:74
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:93
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print over network"
msgstr "Stampa sulla rete"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:89
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:76
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:94
msgctxt "@properties:tooltip"
msgid "Print over network"
msgstr "Stampa sulla rete"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:95
msgctxt "@info:status"
msgid "Connected over the network."
msgstr "Collegato alla rete."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
msgctxt "@info:status"
msgid "Connected over the network. Please approve the access request on the printer."
msgstr "Collegato alla rete. Si prega di approvare la richiesta di accesso sulla stampante."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:93
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:100
msgctxt "@info:status"
msgid "Connected over the network. No access to control the printer."
msgstr "Collegato alla rete. Nessun accesso per controllare la stampante."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
msgctxt "@info:status"
msgid "Access to the printer requested. Please approve the request on the printer"
msgstr "Richiesto accesso alla stampante. Approvare la richiesta sulla stampante"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:101
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
msgctxt "@info:title"
msgid "Authentication status"
msgstr "Stato di autenticazione"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:103
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:109
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:113
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:120
msgctxt "@info:title"
msgid "Authentication Status"
msgstr "Stato di autenticazione"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:104
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:187
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:111
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:198
msgctxt "@action:button"
msgid "Retry"
msgstr "Riprova"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
msgctxt "@info:tooltip"
msgid "Re-send the access request"
msgstr "Invia nuovamente la richiesta di accesso"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:115
msgctxt "@info:status"
msgid "Access to the printer accepted"
msgstr "Accesso alla stampante accettato"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:119
msgctxt "@info:status"
msgid "No access to print with this printer. Unable to send print job."
msgstr "Nessun accesso per stampare con questa stampante. Impossibile inviare il processo di stampa."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:114
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:121
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:65
msgctxt "@action:button"
msgid "Request Access"
msgstr "Richiesta di accesso"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:123
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:66
msgctxt "@info:tooltip"
msgid "Send access request to the printer"
msgstr "Invia la richiesta di accesso alla stampante"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:201
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:208
msgctxt "@label"
msgid "Unable to start a new print job."
msgstr "Impossibile avviare un nuovo processo di stampa."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:203
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:210
msgctxt "@label"
msgid "There is an issue with the configuration of your Ultimaker, which makes it impossible to start the print. Please resolve this issues before continuing."
msgstr "È presente un problema di configurazione della stampante che rende impossibile l’avvio della stampa. Risolvere il problema prima di continuare."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:209
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:231
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:216
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:238
msgctxt "@window:title"
msgid "Mismatched configuration"
msgstr "Mancata corrispondenza della configurazione"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:230
msgctxt "@label"
msgid "Are you sure you wish to print with the selected configuration?"
msgstr "Sei sicuro di voler stampare con la configurazione selezionata?"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:225
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:232
msgctxt "@label"
msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer."
msgstr "Le configurazioni o la calibrazione della stampante e di Cura non corrispondono. Per ottenere i migliori risultati, sezionare sempre per i PrintCore e i materiali inseriti nella stampante utilizzata."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:252
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:162
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:162
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:176
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:181
msgctxt "@info:status"
msgid "Sending new jobs (temporarily) blocked, still sending the previous print job."
msgstr "Invio nuovi processi (temporaneamente) bloccato, invio in corso precedente processo di stampa."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:180
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:197
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:266
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:194
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:211
msgctxt "@info:status"
msgid "Sending data to printer"
msgstr "Invio dati alla stampante in corso"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:260
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:182
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:199
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:267
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:196
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:213
msgctxt "@info:title"
msgid "Sending Data"
msgstr "Invio dati"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:261
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:200
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:268
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:214
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:18
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:19
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:81
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:395
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:410
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:20
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:38
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:143
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:58
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:149
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:391
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:254
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:283
msgctxt "@action:button"
msgid "Cancel"
msgstr "Annulla"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:324
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:331
#, python-brace-format
msgctxt "@info:status"
msgid "No Printcore loaded in slot {slot_number}"
msgstr "Nessun PrintCore caricato nello slot {slot_number}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:337
#, python-brace-format
msgctxt "@info:status"
msgid "No material loaded in slot {slot_number}"
msgstr "Nessun materiale caricato nello slot {slot_number}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:353
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:360
#, python-brace-format
msgctxt "@label"
msgid "Different PrintCore (Cura: {cura_printcore_name}, Printer: {remote_printcore_name}) selected for extruder {extruder_id}"
msgstr "PrintCore diverso (Cura: {cura_printcore_name}, Stampante: {remote_printcore_name}) selezionata per estrusore {extruder_id}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:362
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:369
#, python-brace-format
msgctxt "@label"
msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "Materiale diverso (Cura: {0}, Stampante: {1}) selezionato per l’estrusore {2}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:548
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:555
msgctxt "@window:title"
msgid "Sync with your printer"
msgstr "Sincronizzazione con la stampante"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:550
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:557
msgctxt "@label"
msgid "Would you like to use your current printer configuration in Cura?"
msgstr "Desideri utilizzare la configurazione corrente della tua stampante in Cura?"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:552
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:559
msgctxt "@label"
msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer."
msgstr "I PrintCore e/o i materiali sulla stampante differiscono da quelli contenuti nel tuo attuale progetto. Per ottenere i risultati migliori, sezionare sempre per i PrintCore e i materiali inseriti nella stampante utilizzata."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:96
msgctxt "@info:status"
msgid "Connected over the network"
msgstr "Collegato alla rete"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:275
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:342
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:370
msgctxt "@info:status"
msgid "Print job was successfully sent to the printer."
msgstr "Processo di stampa inviato con successo alla stampante."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:277
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:343
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:291
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:371
msgctxt "@info:title"
msgid "Data Sent"
msgstr "Dati inviati"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:278
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:292
msgctxt "@action:button"
msgid "View in Monitor"
msgstr "Visualizzazione in Controlla"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:390
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:290
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:411
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Printer '{printer_name}' has finished printing '{job_name}'."
msgstr "La stampante '{printer_name}' ha finito di stampare '{job_name}'."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:392
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:294
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:413
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:322
#, python-brace-format
msgctxt "@info:status"
msgid "The print job '{job_name}' was finished."
msgstr "Il processo di stampa '{job_name}' è terminato."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:393
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:414
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:316
msgctxt "@info:status"
msgid "Print finished"
msgstr "Stampa finita"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:573
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:595
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:629
msgctxt "@label:material"
msgid "Empty"
msgstr "Vuoto"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:596
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:630
msgctxt "@label:material"
msgid "Unknown"
msgstr "Sconosciuto"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:169
msgctxt "@action:button"
msgid "Print via Cloud"
msgstr "Stampa tramite Cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:170
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
msgstr "Stampa tramite Cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:171
msgctxt "@info:status"
msgid "Connected via Cloud"
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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:182
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:359
msgctxt "@info:title"
msgid "Cloud error"
msgstr "Errore cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:199
msgctxt "@info:status"
msgid "Could not export print job."
msgstr "Impossibile esportare il processo di stampa."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:358
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
msgstr "Impossibile caricare i dati sulla stampante."
@@ -541,48 +537,52 @@ msgctxt "@info:status"
msgid "today"
msgstr "oggi"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:187
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
msgstr "Si è verificato un errore di collegamento al cloud."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
+msgctxt "@info:status"
+msgid "Sending Print Job"
+msgstr "Invio di un processo di stampa"
+
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
-msgid "Sending data to remote cluster"
-msgstr "Invio dati al cluster remoto"
+msgid "Uploading via Ultimaker Cloud"
+msgstr "Caricamento tramite Ultimaker Cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:621
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
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"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:627
+msgctxt "@info:status Ultimaker Cloud is a brand name and shouldn't be translated."
msgid "Connect to Ultimaker Cloud"
msgstr "Collegato a Ultimaker Cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:628
msgctxt "@action"
msgid "Don't ask me again for this printer."
msgstr "Non chiedere nuovamente per questa stampante."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:631
msgctxt "@action"
msgid "Get started"
msgstr "Per iniziare"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:637
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:643
msgctxt "@info:status"
msgid "Connected!"
msgstr "Collegato!"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:645
msgctxt "@action"
msgid "Review your connection"
msgstr "Controlla collegamento"
@@ -597,7 +597,7 @@ msgctxt "@item:inmenu"
msgid "Monitor"
msgstr "Controlla"
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:124
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:118
msgctxt "@info"
msgid "Could not access update information."
msgstr "Non è possibile accedere alle informazioni di aggiornamento."
@@ -654,46 +654,11 @@ msgctxt "@info:tooltip"
msgid "Create a volume in which supports are not printed."
msgstr "Crea un volume in cui i supporti non vengono stampati."
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:52
-msgctxt "@info"
-msgid "Cura collects anonymized usage statistics."
-msgstr "Cura raccoglie statistiche di utilizzo in forma anonima."
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:55
-msgctxt "@info:title"
-msgid "Collecting Data"
-msgstr "Acquisizione dati"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:57
-msgctxt "@action:button"
-msgid "More info"
-msgstr "Per saperne di più"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:58
-msgctxt "@action:tooltip"
-msgid "See more information on what data Cura sends."
-msgstr "Vedere ulteriori informazioni sui dati inviati da Cura."
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:60
-msgctxt "@action:button"
-msgid "Allow"
-msgstr "Consenti"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:61
-msgctxt "@action:tooltip"
-msgid "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."
-msgstr "Consente a Cura di inviare in forma anonima statistiche d’uso, riguardanti alcune delle preferenze e impostazioni, la versione cura e una serie di modelli in sezionamento, per aiutare a dare priorità a miglioramenti futuri in Cura."
-
#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "Cura 15.04 profiles"
msgstr "Profili Cura 15.04"
-#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
-msgctxt "@item:inmenu"
-msgid "Evaluation"
-msgstr "Valutazione"
-
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "JPG Image"
@@ -719,56 +684,56 @@ msgctxt "@item:inlistbox"
msgid "GIF Image"
msgstr "Immagine GIF"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
msgctxt "@info:status"
msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration."
msgstr "Impossibile eseguire il sezionamento con il materiale corrente in quanto incompatibile con la macchina o la configurazione selezionata."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:389
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:398
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:407
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:416
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:362
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:386
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:395
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:404
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:413
msgctxt "@info:title"
msgid "Unable to slice"
msgstr "Sezionamento impossibile"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:364
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:361
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to slice with the current settings. The following settings have errors: {0}"
msgstr "Impossibile eseguire il sezionamento con le impostazioni attuali. Le seguenti impostazioni presentano errori: {0}"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:388
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:385
#, 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 "Impossibile eseguire il sezionamento a causa di alcune impostazioni per modello. Le seguenti impostazioni presentano errori su uno o più modelli: {error_labels}"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:397
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:394
msgctxt "@info:status"
msgid "Unable to slice because the prime tower or prime position(s) are invalid."
msgstr "Impossibile eseguire il sezionamento perché la torre di innesco o la posizione di innesco non sono valide."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:406
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:403
#, python-format
msgctxt "@info:status"
msgid "Unable to slice because there are objects associated with disabled Extruder %s."
msgstr "Impossibile effettuare il sezionamento in quanto vi sono oggetti associati a Extruder %s disabilitato."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:412
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 "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
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:status"
msgid "Processing Layers"
msgstr "Elaborazione dei livelli"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:title"
msgid "Information"
msgstr "Informazioni"
@@ -799,19 +764,19 @@ msgctxt "@item:inlistbox"
msgid "3MF File"
msgstr "File 3MF"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:190
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:763
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:191
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:775
msgctxt "@label"
msgid "Nozzle"
msgstr "Ugello"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:469
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:474
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead."
msgstr "Il file di progetto {0} contiene un tipo di macchina sconosciuto {1}. Impossibile importare la macchina. Verranno invece importati i modelli."
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:472
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:477
msgctxt "@info:title"
msgid "Open Project File"
msgstr "Apri file progetto"
@@ -826,18 +791,18 @@ msgctxt "@item:inlistbox"
msgid "G File"
msgstr "File G"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:324
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:328
msgctxt "@info:status"
msgid "Parsing G-code"
msgstr "Parsing codice G"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:326
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:476
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:330
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:483
msgctxt "@info:title"
msgid "G-code Details"
msgstr "Dettagli codice G"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:474
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:481
msgctxt "@info:generic"
msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate."
msgstr "Verifica che il codice G sia idoneo alla tua stampante e alla sua configurazione prima di trasmettere il file. La rappresentazione del codice G potrebbe non essere accurata."
@@ -860,7 +825,7 @@ msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
msgstr "Si è verificato un errore nell’elenco dei backup."
-#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
+#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:132
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
msgstr "Si è verificato un errore cercando di ripristinare il backup."
@@ -921,243 +886,261 @@ msgctxt "@item:inmenu"
msgid "Preview"
msgstr "Anteprima"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:19
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
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"
msgstr "Livella piano di stampa"
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:81
-msgctxt "@tooltip"
-msgid "Outer Wall"
-msgstr "Parete esterna"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:82
-msgctxt "@tooltip"
-msgid "Inner Walls"
-msgstr "Pareti interne"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:83
-msgctxt "@tooltip"
-msgid "Skin"
-msgstr "Rivestimento esterno"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:84
-msgctxt "@tooltip"
-msgid "Infill"
-msgstr "Riempimento"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:85
-msgctxt "@tooltip"
-msgid "Support Infill"
-msgstr "Riempimento del supporto"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:86
-msgctxt "@tooltip"
-msgid "Support Interface"
-msgstr "Interfaccia supporto"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:87
-msgctxt "@tooltip"
-msgid "Support"
-msgstr "Supporto"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88
-msgctxt "@tooltip"
-msgid "Skirt"
-msgstr "Skirt"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89
-msgctxt "@tooltip"
-msgid "Travel"
-msgstr "Spostamenti"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90
-msgctxt "@tooltip"
-msgid "Retractions"
-msgstr "Retrazioni"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91
-msgctxt "@tooltip"
-msgid "Other"
-msgstr "Altro"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:309
-#, python-brace-format
-msgctxt "@label"
-msgid "Pre-sliced file {0}"
-msgstr "File pre-sezionato {0}"
-
-#: /home/ruben/Projects/Cura/cura/API/Account.py:77
+#: /home/ruben/Projects/Cura/cura/API/Account.py:82
msgctxt "@info:title"
msgid "Login failed"
msgstr "Login non riuscito"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:201
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121
+#: /home/ruben/Projects/Cura/cura/Settings/cura_empty_instance_containers.py:33
+msgctxt "@info:not supported profile"
+msgid "Not supported"
+msgstr "Non supportato"
+
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:203
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
msgctxt "@title:window"
msgid "File Already Exists"
msgstr "Il file esiste già"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:202
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:204
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:123
#, python-brace-format
msgctxt "@label Don't translate the XML tag !"
msgid "The file {0} already exists. Are you sure you want to overwrite it?"
msgstr "Il file {0} esiste già. Sei sicuro di volerlo sovrascrivere?"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:425
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:427
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:430
msgctxt "@info:status"
msgid "Invalid file URL:"
msgstr "File URL non valido:"
-#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
-msgctxt "@menuitem"
-msgid "Not overridden"
-msgstr "Non sottoposto a override"
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:925
+msgctxt "@info:message Followed by a list of settings."
+msgid "Settings have been changed to match the current availability of extruders:"
+msgstr "Le impostazioni sono state modificate in base all’attuale disponibilità di estrusori:"
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:915
-#, python-format
-msgctxt "@info:generic"
-msgid "Settings have been changed to match the current availability of extruders: [%s]"
-msgstr "Le impostazioni sono state modificate in base all’attuale disponibilità di estrusori: [%s]"
-
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:917
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:927
msgctxt "@info:title"
msgid "Settings updated"
msgstr "Impostazioni aggiornate"
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1481
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
msgstr "Estrusore disabilitato"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:132
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to export profile to {0}: {1}"
msgstr "Impossibile esportare il profilo su {0}: {1}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:138
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:139
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Failed to export profile to {0}: Writer plugin reported failure."
msgstr "Impossibile esportare il profilo su {0}: Rilevata anomalia durante scrittura plugin."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Exported profile to {0}"
msgstr "Profilo esportato su {0}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145
msgctxt "@info:title"
msgid "Export succeeded"
msgstr "Esportazione riuscita"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:170
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:172
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
msgstr "Impossibile importare il profilo da {0}: {1}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:176
#, 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 "Impossibile importare il profilo da {0} prima di aggiungere una stampante."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:192
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "No custom profile to import in file {0}"
msgstr "Nessun profilo personalizzato da importare nel file {0}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:194
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:196
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}:"
msgstr "Impossibile importare il profilo da {0}:"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:218
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:228
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:220
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "This profile {0} contains incorrect data, could not import it."
msgstr "Questo profilo {0} contiene dati errati, impossibile importarlo."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:241
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:243
#, 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 "La macchina definita nel profilo {0} ({1}) non corrisponde alla macchina corrente ({2}), impossibile importarla."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:315
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to import profile from {0}:"
msgstr "Impossibile importare il profilo da {0}:"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:316
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Successfully imported profile {0}"
msgstr "Profilo importato correttamente {0}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:319
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321
#, python-brace-format
msgctxt "@info:status"
msgid "File {0} does not contain any valid profile."
msgstr "Il file {0} non contiene nessun profilo valido."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:322
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:324
#, python-brace-format
msgctxt "@info:status"
msgid "Profile {0} has an unknown file type or is corrupted."
msgstr "Il profilo {0} ha un tipo di file sconosciuto o corrotto."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:340
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:359
msgctxt "@label"
msgid "Custom profile"
msgstr "Profilo personalizzato"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:356
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:375
msgctxt "@info:status"
msgid "Profile is missing a quality type."
msgstr "Il profilo è privo del tipo di qualità."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:370
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:389
#, python-brace-format
msgctxt "@info:status"
msgid "Could not find a quality type {0} for the current configuration."
msgstr "Impossibile trovare un tipo qualità {0} per la configurazione corrente."
-#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:69
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:76
+msgctxt "@tooltip"
+msgid "Outer Wall"
+msgstr "Parete esterna"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:77
+msgctxt "@tooltip"
+msgid "Inner Walls"
+msgstr "Pareti interne"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:78
+msgctxt "@tooltip"
+msgid "Skin"
+msgstr "Rivestimento esterno"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:79
+msgctxt "@tooltip"
+msgid "Infill"
+msgstr "Riempimento"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:80
+msgctxt "@tooltip"
+msgid "Support Infill"
+msgstr "Riempimento del supporto"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:81
+msgctxt "@tooltip"
+msgid "Support Interface"
+msgstr "Interfaccia supporto"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:82
+msgctxt "@tooltip"
+msgid "Support"
+msgstr "Supporto"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:83
+msgctxt "@tooltip"
+msgid "Skirt"
+msgstr "Skirt"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:84
+msgctxt "@tooltip"
+msgid "Prime Tower"
+msgstr "Torre di innesco"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:85
+msgctxt "@tooltip"
+msgid "Travel"
+msgstr "Spostamenti"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:86
+msgctxt "@tooltip"
+msgid "Retractions"
+msgstr "Retrazioni"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:87
+msgctxt "@tooltip"
+msgid "Other"
+msgstr "Altro"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:306
+#, python-brace-format
+msgctxt "@label"
+msgid "Pre-sliced file {0}"
+msgstr "File pre-sezionato {0}"
+
+#: /home/ruben/Projects/Cura/cura/UI/WelcomePagesModel.py:56
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:62
+msgctxt "@action:button"
+msgid "Next"
+msgstr "Avanti"
+
+#: /home/ruben/Projects/Cura/cura/UI/ObjectsModel.py:61
#, python-brace-format
msgctxt "@label"
msgid "Group #{group_nr}"
msgstr "Gruppo #{group_nr}"
-#: /home/ruben/Projects/Cura/cura/Machines/Models/MachineManagementModel.py:65
-msgctxt "@info:title"
-msgid "Network enabled printers"
-msgstr "Stampanti abilitate per la rete"
+#: /home/ruben/Projects/Cura/cura/UI/WhatsNewPagesModel.py:17
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:185
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:85
+#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:482
+#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:508
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:124
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:168
+msgctxt "@action:button"
+msgid "Close"
+msgstr "Chiudi"
-#: /home/ruben/Projects/Cura/cura/Machines/Models/MachineManagementModel.py:80
-msgctxt "@info:title"
-msgid "Local printers"
-msgstr "Stampanti locali"
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:17
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:91
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:48
+msgctxt "@action:button"
+msgid "Add"
+msgstr "Aggiungi"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/ExtrudersModel.py:208
+msgctxt "@menuitem"
+msgid "Not overridden"
+msgstr "Non sottoposto a override"
#: /home/ruben/Projects/Cura/cura/Machines/Models/QualityManagementModel.py:109
#, python-brace-format
@@ -1170,23 +1153,41 @@ msgctxt "@item:inlistbox"
msgid "All Files (*)"
msgstr "Tutti i file (*)"
-#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:665
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:86
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:182
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:269
+msgctxt "@label"
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:116
+msgctxt "@label"
+msgid "The printer(s) below cannot be connected because they are part of a group"
+msgstr "Le stampanti riportate di seguito non possono essere collegate perché fanno parte di un gruppo"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:118
+msgctxt "@label"
+msgid "Available networked printers"
+msgstr "Stampanti disponibili in rete"
+
+#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:689
msgctxt "@label"
msgid "Custom Material"
msgstr "Materiale personalizzato"
-#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:666
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:256
+#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:690
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:203
msgctxt "@label"
msgid "Custom"
msgstr "Personalizzata"
-#: /home/ruben/Projects/Cura/cura/BuildVolume.py:81
+#: /home/ruben/Projects/Cura/cura/BuildVolume.py:89
msgctxt "@info:status"
msgid "The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from colliding with printed models."
msgstr "L’altezza del volume di stampa è stata ridotta a causa del valore dell’impostazione \"Sequenza di stampa” per impedire la collisione del gantry con i modelli stampati."
-#: /home/ruben/Projects/Cura/cura/BuildVolume.py:83
+#: /home/ruben/Projects/Cura/cura/BuildVolume.py:91
msgctxt "@info:title"
msgid "Build Volume"
msgstr "Volume di stampa"
@@ -1201,16 +1202,31 @@ msgctxt "@info:backup_failed"
msgid "Tried to restore a Cura backup without having proper data or meta data."
msgstr "Tentativo di ripristinare un backup di Cura senza dati o metadati appropriati."
-#: /home/ruben/Projects/Cura/cura/Backups/Backup.py:124
+#: /home/ruben/Projects/Cura/cura/Backups/Backup.py:125
msgctxt "@info:backup_failed"
-msgid "Tried to restore a Cura backup that does not match your current version."
-msgstr "Tentativo di ripristinare un backup di Cura non corrispondente alla versione corrente."
+msgid "Tried to restore a Cura backup that is higher than the current version."
+msgstr "Tentativo di ripristinare un backup di Cura di versione superiore rispetto a quella corrente."
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationHelpers.py:79
+msgctxt "@message"
+msgid "Could not read response."
+msgstr "Impossibile leggere la risposta."
+
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
msgstr "Impossibile raggiungere il server account Ultimaker."
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationRequestHandler.py:66
+msgctxt "@message"
+msgid "Please give the required permissions when authorizing this application."
+msgstr "Fornire i permessi necessari al momento dell'autorizzazione di questa applicazione."
+
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationRequestHandler.py:73
+msgctxt "@message"
+msgid "Something unexpected happened when trying to log in, please try again."
+msgstr "Si è verificato qualcosa di inatteso durante il tentativo di accesso, riprovare."
+
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
msgid "Multiplying and placing objects"
@@ -1223,7 +1239,7 @@ msgstr "Sistemazione oggetti"
#: /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
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:149
msgctxt "@info:status"
msgid "Unable to find a location within the build volume for all objects"
msgstr "Impossibile individuare una posizione nel volume di stampa per tutti gli oggetti"
@@ -1234,19 +1250,19 @@ msgid "Placing Object"
msgstr "Sistemazione oggetto"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:30
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:67
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:66
msgctxt "@info:status"
msgid "Finding new location for objects"
msgstr "Ricerca nuova posizione per gli oggetti"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:34
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:71
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:70
msgctxt "@info:title"
msgid "Finding Location"
msgstr "Ricerca posizione"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:104
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:151
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:150
msgctxt "@info:title"
msgid "Can't Find Location"
msgstr "Impossibile individuare posizione"
@@ -1377,242 +1393,195 @@ msgstr "Registri"
#: /home/ruben/Projects/Cura/cura/CrashHandler.py:322
msgctxt "@title:groupbox"
-msgid "User description"
-msgstr "Descrizione utente"
+msgid "User description (Note: Developers may not speak your language, please use English if possible)"
+msgstr "Descrizione utente (Nota: gli sviluppatori potrebbero non parlare la lingua dell'utente. Se possibile, usare l'inglese)"
-#: /home/ruben/Projects/Cura/cura/CrashHandler.py:341
+#: /home/ruben/Projects/Cura/cura/CrashHandler.py:342
msgctxt "@action:button"
msgid "Send report"
msgstr "Invia report"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:480
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:504
msgctxt "@info:progress"
msgid "Loading machines..."
msgstr "Caricamento macchine in corso..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:781
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:819
msgctxt "@info:progress"
msgid "Setting up scene..."
msgstr "Impostazione scena in corso..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:817
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:854
msgctxt "@info:progress"
msgid "Loading interface..."
msgstr "Caricamento interfaccia in corso..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1059
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1133
#, python-format
msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm."
msgid "%(width).1f x %(depth).1f x %(height).1f mm"
msgstr "%(width).1f x %(depth).1f x %(height).1f mm"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1618
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1611
#, python-brace-format
msgctxt "@info:status"
msgid "Only one G-code file can be loaded at a time. Skipped importing {0}"
msgstr "È possibile caricare un solo file codice G per volta. Importazione saltata {0}"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1628
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1621
#, python-brace-format
msgctxt "@info:status"
msgid "Can't open any other file if G-code is loading. Skipped importing {0}"
msgstr "Impossibile aprire altri file durante il caricamento del codice G. Importazione saltata {0}"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1718
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1711
msgctxt "@info:status"
msgid "The selected model was too small to load."
msgstr "Il modello selezionato è troppo piccolo per il caricamento."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:62
-msgctxt "@title"
-msgid "Machine Settings"
-msgstr "Impostazioni macchina"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:81
-msgctxt "@title:tab"
-msgid "Printer"
-msgstr "Stampante"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:100
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:58
+msgctxt "@title:label"
msgid "Printer Settings"
msgstr "Impostazioni della stampante"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:111
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:72
msgctxt "@label"
msgid "X (Width)"
msgstr "X (Larghezza)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:112
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:122
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:132
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:238
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:387
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:403
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:429
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:441
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:897
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:76
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:90
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:104
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:194
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:213
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:232
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:253
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:272
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:79
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:93
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:109
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:124
msgctxt "@label"
msgid "mm"
msgstr "mm"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:121
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:86
msgctxt "@label"
msgid "Y (Depth)"
msgstr "Y (Profondità)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:131
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:100
msgctxt "@label"
msgid "Z (Height)"
msgstr "Z (Altezza)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:143
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:114
msgctxt "@label"
msgid "Build plate shape"
msgstr "Forma del piano di stampa"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:152
-msgctxt "@option:check"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:127
+msgctxt "@label"
msgid "Origin at center"
msgstr "Origine al centro"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:160
-msgctxt "@option:check"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:139
+msgctxt "@label"
msgid "Heated bed"
msgstr "Piano riscaldato"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:171
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:151
msgctxt "@label"
msgid "G-code flavor"
msgstr "Versione codice G"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:184
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:176
+msgctxt "@title:label"
msgid "Printhead Settings"
msgstr "Impostazioni della testina di stampa"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:194
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:190
msgctxt "@label"
msgid "X min"
msgstr "X min"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:195
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Distanza tra il lato sinistro della testina di stampa e il centro dell'ugello. Utilizzata per evitare collisioni tra le stampe precedenti e la testina di stampa durante la stampa \"Uno alla volta\"."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:204
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:209
msgctxt "@label"
msgid "Y min"
msgstr "Y min"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:205
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Distanza tra il lato anteriore della testina di stampa e il centro dell'ugello. Utilizzata per evitare collisioni tra le stampe precedenti e la testina di stampa durante la stampa \"Uno alla volta\"."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:214
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:228
msgctxt "@label"
msgid "X max"
msgstr "X max"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:215
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Distanza tra il lato destro della testina di stampa e il centro dell'ugello. Utilizzata per evitare collisioni tra le stampe precedenti e la testina di stampa durante la stampa \"Uno alla volta\"."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:224
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:249
msgctxt "@label"
msgid "Y max"
msgstr "Y max"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:225
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "Distanza tra il lato posteriore della testina di stampa e il centro dell'ugello. Utilizzata per evitare collisioni tra le stampe precedenti e la testina di stampa durante la stampa \"Uno alla volta\"."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:237
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:268
msgctxt "@label"
-msgid "Gantry height"
+msgid "Gantry Height"
msgstr "Altezza gantry"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:239
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "La differenza di altezza tra la punta dell’ugello e il sistema gantry (assi X e Y). Utilizzata per evitare collisioni tra le stampe precedenti e il gantry durante la stampa \"Uno alla volta\"."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:258
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:282
msgctxt "@label"
msgid "Number of Extruders"
msgstr "Numero di estrusori"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:314
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:341
+msgctxt "@title:label"
msgid "Start G-code"
msgstr "Codice G avvio"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:324
-msgctxt "@tooltip"
-msgid "G-code commands to be executed at the very start."
-msgstr "Comandi codice G da eseguire all’avvio."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:333
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:355
+msgctxt "@title:label"
msgid "End G-code"
msgstr "Codice G fine"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:343
-msgctxt "@tooltip"
-msgid "G-code commands to be executed at the very end."
-msgstr "Comandi codice G da eseguire alla fine."
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:42
+msgctxt "@title:tab"
+msgid "Printer"
+msgstr "Stampante"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:374
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:63
+msgctxt "@title:label"
msgid "Nozzle Settings"
msgstr "Impostazioni ugello"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:386
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:75
msgctxt "@label"
msgid "Nozzle size"
msgstr "Dimensione ugello"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:402
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:89
msgctxt "@label"
msgid "Compatible material diameter"
msgstr "Diametro del materiale compatibile"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:404
-msgctxt "@tooltip"
-msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile."
-msgstr "Diametro nominale del filamento supportato dalla stampante. Il diametro esatto verrà sovrapposto dal materiale e/o dal profilo."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:428
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:105
msgctxt "@label"
msgid "Nozzle offset X"
msgstr "Scostamento X ugello"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:440
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:120
msgctxt "@label"
msgid "Nozzle offset Y"
msgstr "Scostamento Y ugello"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:452
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:135
msgctxt "@label"
msgid "Cooling Fan Number"
msgstr "Numero ventola di raffreddamento"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:453
-msgctxt "@label"
-msgid ""
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:473
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:162
+msgctxt "@title:label"
msgid "Extruder Start G-code"
msgstr "Codice G avvio estrusore"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:491
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:176
+msgctxt "@title:label"
msgid "Extruder End G-code"
msgstr "Codice G fine estrusore"
@@ -1622,7 +1591,7 @@ msgid "Install"
msgstr "Installazione"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:20
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:44
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:46
msgctxt "@action:button"
msgid "Installed"
msgstr "Installa"
@@ -1638,15 +1607,15 @@ msgid "ratings"
msgstr "valori"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:30
msgctxt "@title:tab"
msgid "Plugins"
msgstr "Plugin"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:69
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:42
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:66
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:361
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:70
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:44
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:80
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:417
msgctxt "@title:tab"
msgid "Materials"
msgstr "Materiali"
@@ -1656,52 +1625,49 @@ msgctxt "@label"
msgid "Your rating"
msgstr "I tuoi valori"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:99
msgctxt "@label"
msgid "Version"
msgstr "Versione"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:105
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:106
msgctxt "@label"
msgid "Last updated"
msgstr "Ultimo aggiornamento"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:112
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:260
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:113
msgctxt "@label"
msgid "Author"
msgstr "Autore"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:119
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:120
msgctxt "@label"
msgid "Downloads"
msgstr "Download"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:181
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:222
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:265
-msgctxt "@label"
-msgid "Unknown"
-msgstr "Sconosciuto"
-
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:56
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
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/ToolboxDetailTileActions.qml:80
+msgctxt "@label:The string between and is the highlighted link"
+msgid "Buy material spools"
+msgstr "Acquista bobine di materiale"
+
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:96
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
msgctxt "@action:button"
msgid "Update"
msgstr "Aggiorna"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:74
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:97
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:35
msgctxt "@action:button"
msgid "Updating"
msgstr "Aggiornamento in corso"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:75
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:98
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:36
msgctxt "@action:button"
msgid "Updated"
@@ -1777,7 +1743,7 @@ msgctxt "@label"
msgid "Generic Materials"
msgstr "Materiali generici"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:56
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:59
msgctxt "@title:tab"
msgid "Installed"
msgstr "Installa"
@@ -1863,12 +1829,12 @@ msgctxt "@info"
msgid "Fetching packages..."
msgstr "Recupero dei pacchetti..."
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:90
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:91
msgctxt "@label"
msgid "Website"
msgstr "Sito web"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:97
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:98
msgctxt "@label"
msgid "Email"
msgstr "E-mail"
@@ -1878,22 +1844,6 @@ msgctxt "@info:tooltip"
msgid "Some things could be problematic in this print. Click to see tips for adjustment."
msgstr "Alcune parti potrebbero risultare problematiche in questa stampa. Fare click per visualizzare i suggerimenti per la regolazione."
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18
-msgctxt "@label"
-msgid "Changelog"
-msgstr "Registro modifiche"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:185
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:85
-#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:482
-#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:508
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:168
-msgctxt "@action:button"
-msgid "Close"
-msgstr "Chiudi"
-
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:31
msgctxt "@title"
msgid "Update Firmware"
@@ -1969,38 +1919,40 @@ msgctxt "@label"
msgid "Firmware update failed due to missing firmware."
msgstr "Aggiornamento firmware non riuscito per firmware mancante."
-#: /home/ruben/Projects/Cura/plugins/UserAgreement/UserAgreement.qml:16
-msgctxt "@title:window"
-msgid "User Agreement"
-msgstr "Contratto di licenza"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:144
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:181
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:153
+msgctxt "@label"
+msgid "Glass"
+msgstr "Vetro"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:208
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:249
msgctxt "@info"
-msgid "These options are not available because you are monitoring a cloud printer."
-msgstr "Queste opzioni non sono disponibili perché si sta controllando una stampante cloud."
+msgid "Please update your printer's firmware to manage the queue remotely."
+msgstr "Aggiornare il firmware della stampante per gestire la coda da remoto."
#: /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 "La webcam non è disponibile perché si sta controllando una stampante cloud."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:300
msgctxt "@label:status"
msgid "Loading..."
msgstr "Caricamento in corso..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:304
msgctxt "@label:status"
msgid "Unavailable"
msgstr "Non disponibile"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:308
msgctxt "@label:status"
msgid "Unreachable"
msgstr "Non raggiungibile"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:312
msgctxt "@label:status"
msgid "Idle"
msgstr "Ferma"
@@ -2010,37 +1962,31 @@ msgctxt "@label"
msgid "Untitled"
msgstr "Senza titolo"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:374
msgctxt "@label"
msgid "Anonymous"
msgstr "Anonimo"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:401
msgctxt "@label:status"
msgid "Requires configuration changes"
msgstr "Richiede modifiche di configurazione"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:439
msgctxt "@action:button"
msgid "Details"
msgstr "Dettagli"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:130
msgctxt "@label"
msgid "Unavailable printer"
msgstr "Stampante non disponibile"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "First available"
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
-msgctxt "@label"
-msgid "Glass"
-msgstr "Vetro"
-
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:31
msgctxt "@label"
msgid "Queued"
@@ -2048,181 +1994,191 @@ 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 "Vai a Cura Connect"
+msgid "Manage in browser"
+msgstr "Gestisci nel browser"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:100
+msgctxt "@label"
+msgid "There are no print jobs in the queue. Slice and send a job to add one."
+msgstr "Non sono presenti processi di stampa nella coda. Eseguire lo slicing e inviare un processo per aggiungerne uno."
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Print jobs"
msgstr "Processi di stampa"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:132
msgctxt "@label"
msgid "Total print time"
msgstr "Tempo di stampa totale"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:148
msgctxt "@label"
msgid "Waiting for"
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 "Visualizza cronologia di stampa"
-
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:50
msgctxt "@window:title"
msgid "Existing Connection"
msgstr "Collegamento esistente"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:48
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:52
msgctxt "@message:text"
msgid "This printer/group is already added to Cura. Please select another printer/group."
msgstr "Stampante/gruppo già aggiunto a Cura. Selezionare un’altra stampante o un altro gruppo."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:65
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:69
msgctxt "@title:window"
msgid "Connect to Networked Printer"
msgstr "Collega alla stampante in rete"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:77
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:81
msgctxt "@label"
-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 ""
-"Per stampare direttamente sulla stampante in rete, verificare che la stampante desiderata sia collegata alla rete mediante un cavo di rete o mediante collegamento alla rete WIFI. Se si collega Cura alla stampante, è comunque possibile utilizzare una chiavetta USB per trasferire i file codice G alla stampante.\n"
-"\n"
-"Selezionare la stampante dall’elenco seguente:"
+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."
+msgstr "Per stampare direttamente sulla stampante in rete, verificare che la stampante desiderata sia collegata alla rete mediante un cavo di rete o mediante collegamento"
+" alla rete WIFI. Se non si esegue il collegamento di Cura alla stampante, è comunque possibile utilizzare una chiavetta USB per trasferire i file codice"
+" G alla stampante."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44
-msgctxt "@action:button"
-msgid "Add"
-msgstr "Aggiungi"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:81
+msgctxt "@label"
+msgid "Select your printer from the list below:"
+msgstr "Selezionare la stampante dall’elenco seguente:"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:97
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:101
msgctxt "@action:button"
msgid "Edit"
msgstr "Modifica"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:108
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:128
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:117
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:112
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:146
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:55
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:121
msgctxt "@action:button"
msgid "Remove"
msgstr "Rimuovi"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:120
msgctxt "@action:button"
msgid "Refresh"
msgstr "Aggiorna"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:211
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:215
msgctxt "@label"
msgid "If your printer is not listed, read the network printing troubleshooting guide"
msgstr "Se la stampante non è nell’elenco, leggere la guida alla risoluzione dei problemi per la stampa in rete"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:240
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:244
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:258
msgctxt "@label"
msgid "Type"
msgstr "Tipo"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:279
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:283
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:274
msgctxt "@label"
msgid "Firmware version"
msgstr "Versione firmware"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:293
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:297
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:290
msgctxt "@label"
msgid "Address"
msgstr "Indirizzo"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:317
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
msgctxt "@label"
msgid "This printer is not set up to host a group of printers."
msgstr "Questa stampante non è predisposta per comandare un gruppo di stampanti."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:325
msgctxt "@label"
msgid "This printer is the host for a group of %1 printers."
msgstr "Questa stampante comanda un gruppo di %1 stampanti."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:332
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:336
msgctxt "@label"
msgid "The printer at this address has not yet responded."
msgstr "La stampante a questo indirizzo non ha ancora risposto."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:337
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:341
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:74
msgctxt "@action:button"
msgid "Connect"
msgstr "Collega"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:351
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:354
+msgctxt "@title:window"
+msgid "Invalid IP address"
+msgstr "Indirizzo IP non valido"
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:355
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:146
+msgctxt "@text"
+msgid "Please enter a valid IP address."
+msgstr "Inserire un indirizzo IP valido."
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:366
msgctxt "@title:window"
msgid "Printer Address"
msgstr "Indirizzo stampante"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:374
-msgctxt "@alabel"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:389
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:102
+msgctxt "@label"
msgid "Enter the IP address or hostname of your printer on the network."
msgstr "Inserire l’indirizzo IP o l’hostname della stampante sulla rete."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:404
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:132
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:419
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:138
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181
msgctxt "@action:button"
msgid "OK"
msgstr "OK"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:88
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:100
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:78
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:90
msgctxt "@label:status"
msgid "Aborted"
msgstr "Interrotto"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:90
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:92
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:80
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:82
msgctxt "@label:status"
msgid "Finished"
msgstr "Terminato"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:94
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:84
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:86
msgctxt "@label:status"
msgid "Preparing..."
msgstr "Preparazione in corso..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:88
msgctxt "@label:status"
msgid "Aborting..."
msgstr "Interr. in corso..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:92
msgctxt "@label:status"
msgid "Pausing..."
msgstr "Messa in pausa..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:94
msgctxt "@label:status"
msgid "Paused"
msgstr "In pausa"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Resuming..."
msgstr "Ripresa in corso..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Action required"
msgstr "Richiede un'azione"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:100
msgctxt "@label:status"
msgid "Finishes %1 at %2"
msgstr "Finisce %1 a %2"
@@ -2326,44 +2282,44 @@ msgctxt "@action:button"
msgid "Override"
msgstr "Override"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:85
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] "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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:89
msgctxt "@label"
msgid "The printer %1 is assigned, but the job contains an unknown material configuration."
msgstr "La stampante %1 è assegnata, ma il processo contiene una configurazione materiale sconosciuta."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:78
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:99
msgctxt "@label"
msgid "Change material %1 from %2 to %3."
msgstr "Cambia materiale %1 da %2 a %3."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:81
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:102
msgctxt "@label"
msgid "Load %3 as material %1 (This cannot be overridden)."
msgstr "Caricare %3 come materiale %1 (Operazione non annullabile)."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:84
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:105
msgctxt "@label"
msgid "Change print core %1 from %2 to %3."
msgstr "Cambia print core %1 da %2 a %3."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:87
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:108
msgctxt "@label"
msgid "Change build plate to %1 (This cannot be overridden)."
msgstr "Cambia piano di stampa a %1 (Operazione non annullabile)."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:115
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:156
msgctxt "@label"
msgid "Aluminum"
msgstr "Alluminio"
@@ -2373,110 +2329,109 @@ msgctxt "@info:tooltip"
msgid "Connect to a printer"
msgstr "Collega a una stampante"
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:92
+#: /home/ruben/Projects/Cura/plugins/SettingsGuide/resources/qml/SettingsGuide.qml:16
+msgctxt "@title"
+msgid "Cura Settings Guide"
+msgstr "Guida alle impostazioni Cura"
+
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:100
msgctxt "@info"
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 ""
-"Accertarsi che la stampante sia collegata:\n"
-"- Controllare se la stampante è accesa.\n"
-"- Controllare se la stampante è collegata alla rete."
+"- Check if the printer is connected to the network.\n"
+"- Check if you are signed in to discover cloud-connected printers."
+msgstr "Accertarsi che la stampante sia collegata:\n- Controllare se la stampante è accesa.\n- Controllare se la stampante è collegata alla rete.\n- Controllare"
+" se è stato effettuato l'accesso per rilevare le stampanti collegate al cloud."
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:117
msgctxt "@info"
-msgid "Please select a network connected printer to monitor."
-msgstr "Selezionare una stampante collegata alla rete per controllare."
+msgid "Please connect your printer to the network."
+msgstr "Collegare la stampante alla rete."
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
-msgctxt "@info"
-msgid "Please connect your Ultimaker printer to your local network."
-msgstr "Collegare la stampante Ultimaker alla rete locale."
-
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:156
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
msgstr "Visualizza i manuali utente online"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:20
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:49
msgctxt "@label"
msgid "Color scheme"
msgstr "Schema colori"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:105
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:107
msgctxt "@label:listbox"
msgid "Material Color"
msgstr "Colore materiale"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:109
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:111
msgctxt "@label:listbox"
msgid "Line Type"
msgstr "Tipo di linea"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:113
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:115
msgctxt "@label:listbox"
msgid "Feedrate"
msgstr "Velocità"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:117
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:119
msgctxt "@label:listbox"
msgid "Layer thickness"
msgstr "Spessore strato"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:154
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:156
msgctxt "@label"
msgid "Compatibility Mode"
msgstr "Modalità di compatibilità"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:230
msgctxt "@label"
msgid "Travels"
msgstr "Spostamenti"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:236
msgctxt "@label"
msgid "Helpers"
msgstr "Helper"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:242
msgctxt "@label"
msgid "Shell"
msgstr "Guscio"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:248
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
msgctxt "@label"
msgid "Infill"
msgstr "Riempimento"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:297
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:298
msgctxt "@label"
msgid "Only Show Top Layers"
msgstr "Mostra solo strati superiori"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:307
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:308
msgctxt "@label"
msgid "Show 5 Detailed Layers On Top"
msgstr "Mostra 5 strati superiori in dettaglio"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:321
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:322
msgctxt "@label"
msgid "Top / Bottom"
msgstr "Superiore / Inferiore"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:325
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:326
msgctxt "@label"
msgid "Inner Wall"
msgstr "Parete interna"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:383
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:384
msgctxt "@label"
msgid "min"
msgstr "min."
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:432
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:433
msgctxt "@label"
msgid "max"
msgstr "max."
@@ -2506,30 +2461,25 @@ msgctxt "@info:tooltip"
msgid "Change active post-processing scripts"
msgstr "Modifica script di post-elaborazione attivi"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:16
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:17
msgctxt "@title:window"
msgid "More information on anonymous data collection"
msgstr "Maggiori informazioni sulla raccolta di dati anonimi"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:66
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:74
msgctxt "@text:window"
-msgid "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."
-msgstr "Cura invia dati anonimi ad Ultimaker per migliorare la qualità di stampa e l'esperienza dell'utente. Di seguito è riportato un esempio dei dati inviati."
+msgid "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:"
+msgstr "Ultimaker Cura acquisisce dati anonimi per migliorare la qualità di stampa e l'esperienza dell'utente. Di seguito è riportato un esempio dei dati condivisi:"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:109
msgctxt "@text:window"
-msgid "I don't want to send this data"
-msgstr "Non desidero inviare questi dati"
+msgid "I don't want to send anonymous data"
+msgstr "Non desidero inviare dati anonimi"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:118
msgctxt "@text:window"
-msgid "Allow sending this data to Ultimaker and help us improve Cura"
-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 "Nessuna stampante selezionata"
+msgid "Allow sending anonymous data"
+msgstr "Consenti l'invio di dati anonimi"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2578,19 +2528,19 @@ msgstr "Profondità (mm)"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126
msgctxt "@info:tooltip"
-msgid "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."
-msgstr "Per impostazione predefinita, i pixel bianchi rappresentano i punti alti sulla griglia, mentre i pixel neri rappresentano i punti bassi sulla griglia. Modificare questa opzione per invertire la situazione in modo tale che i pixel neri rappresentino i punti alti sulla griglia e i pixel bianchi rappresentino i punti bassi."
-
-#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
-msgctxt "@item:inlistbox"
-msgid "Lighter is higher"
-msgstr "Più chiaro è più alto"
+msgid "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."
+msgstr "Per le litofanie, i pixel scuri devono corrispondere alle posizioni più spesse per bloccare maggiormente il passaggio della luce. Per le mappe con altezze superiori, i pixel più chiari indicano un terreno più elevato, quindi nel modello 3D generato i pixel più chiari devono corrispondere alle posizioni più spesse."
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
msgctxt "@item:inlistbox"
msgid "Darker is higher"
msgstr "Più scuro è più alto"
+#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
+msgctxt "@item:inlistbox"
+msgid "Lighter is higher"
+msgstr "Più chiaro è più alto"
+
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149
msgctxt "@info:tooltip"
msgid "The amount of smoothing to apply to the image."
@@ -2704,7 +2654,7 @@ msgid "Printer Group"
msgstr "Gruppo stampanti"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:180
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:197
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:226
msgctxt "@action:label"
msgid "Profile settings"
msgstr "Impostazioni profilo"
@@ -2717,19 +2667,19 @@ msgstr "Come può essere risolto il conflitto nel profilo?"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:121
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:221
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:250
msgctxt "@action:label"
msgid "Name"
msgstr "Nome"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:231
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:205
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:234
msgctxt "@action:label"
msgid "Not in profile"
msgstr "Non nel profilo"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:236
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:210
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:239
msgctxt "@action:label"
msgid "%1 override"
msgid_plural "%1 overrides"
@@ -2810,6 +2760,7 @@ 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
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:138
msgctxt "@button"
msgid "Sign in"
msgstr "Accedi"
@@ -2900,22 +2851,23 @@ msgid "Previous"
msgstr "Precedente"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:60
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:152
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:174
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:159
msgctxt "@action:button"
msgid "Export"
msgstr "Esporta"
-#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:62
-msgctxt "@action:button"
-msgid "Next"
-msgstr "Avanti"
-
-#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:169
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:209
msgctxt "@label"
msgid "Tip"
msgstr "Suggerimento"
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMaterialMenu.qml:20
+#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:66
+msgctxt "@label:category menu label"
+msgid "Generic"
+msgstr "Generale"
+
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:160
msgctxt "@label"
msgid "Print experiment"
@@ -2926,150 +2878,51 @@ msgctxt "@label"
msgid "Checklist"
msgstr "Lista di controllo"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25
-msgctxt "@title"
-msgid "Select Printer Upgrades"
-msgstr "Seleziona gli aggiornamenti della stampante"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:38
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:30
msgctxt "@label"
msgid "Please select any upgrades made to this Ultimaker 2."
msgstr "Seleziona qualsiasi aggiornamento realizzato per questa Ultimaker 2."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:47
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:44
msgctxt "@label"
msgid "Olsson Block"
msgstr "Blocco Olsson"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:30
msgctxt "@title"
msgid "Build Plate Leveling"
msgstr "Livellamento del piano di stampa"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:44
msgctxt "@label"
msgid "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."
msgstr "Per assicurarsi stampe di alta qualità, è ora possibile regolare il piano di stampa. Quando si fa clic su 'Spostamento alla posizione successiva' l'ugello si sposterà in diverse posizioni che è possibile regolare."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:57
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 "Per ciascuna posizione: inserire un pezzo di carta sotto l'ugello e regolare la stampa dell'altezza del piano di stampa. L'altezza del piano di stampa è corretta quando la carta sfiora la punta dell'ugello."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:75
msgctxt "@action:button"
msgid "Start Build Plate Leveling"
msgstr "Avvio livellamento del piano di stampa"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:87
msgctxt "@action:button"
msgid "Move to Next Position"
msgstr "Spostamento alla posizione successiva"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:30
msgctxt "@label"
msgid "Please select any upgrades made to this Ultimaker Original"
msgstr "Seleziona qualsiasi aggiornamento realizzato per questa Ultimaker Original"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:41
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"
@@ -3120,170 +2973,170 @@ msgctxt "@label"
msgid "Are you sure you want to abort the print?"
msgstr "Sei sicuro di voler interrompere la stampa?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:71
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:73
msgctxt "@title"
msgid "Information"
msgstr "Informazioni"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:100
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:102
msgctxt "@title:window"
msgid "Confirm Diameter Change"
msgstr "Conferma modifica diametro"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:101
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:103
msgctxt "@label (%1 is a number)"
msgid "The new filament diameter is set to %1 mm, which is not compatible with the current extruder. Do you wish to continue?"
msgstr "Il nuovo diametro del filamento impostato a %1 mm non è compatibile con l'attuale estrusore. Continuare?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:133
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:127
msgctxt "@label"
msgid "Display Name"
msgstr "Visualizza nome"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:143
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:137
msgctxt "@label"
msgid "Brand"
msgstr "Marchio"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:153
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:147
msgctxt "@label"
msgid "Material Type"
msgstr "Tipo di materiale"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:162
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:157
msgctxt "@label"
msgid "Color"
msgstr "Colore"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:212
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:207
msgctxt "@label"
msgid "Properties"
msgstr "Proprietà"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:214
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:209
msgctxt "@label"
msgid "Density"
msgstr "Densità"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:229
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:224
msgctxt "@label"
msgid "Diameter"
msgstr "Diametro"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:263
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:258
msgctxt "@label"
msgid "Filament Cost"
msgstr "Costo del filamento"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:280
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:275
msgctxt "@label"
msgid "Filament weight"
msgstr "Peso del filamento"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:298
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:293
msgctxt "@label"
msgid "Filament length"
msgstr "Lunghezza del filamento"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:307
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:302
msgctxt "@label"
msgid "Cost per Meter"
msgstr "Costo al metro"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:321
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:316
msgctxt "@label"
msgid "This material is linked to %1 and shares some of its properties."
msgstr "Questo materiale è collegato a %1 e condivide alcune delle sue proprietà."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:328
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:323
msgctxt "@label"
msgid "Unlink Material"
msgstr "Scollega materiale"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:339
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:334
msgctxt "@label"
msgid "Description"
msgstr "Descrizione"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:352
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:347
msgctxt "@label"
msgid "Adhesion Information"
msgstr "Informazioni sull’aderenza"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:378
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:17
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:373
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label"
msgid "Print settings"
msgstr "Impostazioni di stampa"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:84
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:72
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:99
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:40
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:73
msgctxt "@action:button"
msgid "Activate"
msgstr "Attiva"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:101
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:117
msgctxt "@action:button"
msgid "Create"
msgstr "Crea"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:114
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:131
msgctxt "@action:button"
msgid "Duplicate"
msgstr "Duplica"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:141
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:142
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:160
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:148
msgctxt "@action:button"
msgid "Import"
msgstr "Importa"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:203
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:223
msgctxt "@action:label"
msgid "Printer"
msgstr "Stampante"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:262
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:246
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:287
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:253
msgctxt "@title:window"
msgid "Confirm Remove"
msgstr "Conferma rimozione"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:263
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:247
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:254
msgctxt "@label (%1 is object name)"
msgid "Are you sure you wish to remove %1? This cannot be undone!"
msgstr "Sei sicuro di voler rimuovere %1? Questa operazione non può essere annullata!"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:277
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:285
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:304
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:312
msgctxt "@title:window"
msgid "Import Material"
msgstr "Importa materiale"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:286
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:313
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Could not import material %1: %2"
msgstr "Impossibile importare materiale {1}: %2"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:317
msgctxt "@info:status Don't translate the XML tag !"
msgid "Successfully imported material %1"
msgstr "Materiale importato correttamente %1"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:308
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:316
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:335
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:343
msgctxt "@title:window"
msgid "Export Material"
msgstr "Esporta materiale"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:320
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:347
msgctxt "@info:status Don't translate the XML tags and !"
msgid "Failed to export material to %1: %2"
msgstr "Impossibile esportare il materiale su %1: %2"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:326
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:353
msgctxt "@info:status Don't translate the XML tag !"
msgid "Successfully exported material to %1"
msgstr "Materiale esportato correttamente su %1"
@@ -3298,412 +3151,437 @@ msgctxt "@label:textbox"
msgid "Check all"
msgstr "Controlla tutto"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:47
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:48
msgctxt "@info:status"
msgid "Calculated"
msgstr "Calcolato"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:61
msgctxt "@title:column"
msgid "Setting"
msgstr "Impostazione"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:68
msgctxt "@title:column"
msgid "Profile"
msgstr "Profilo"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:74
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75
msgctxt "@title:column"
msgid "Current"
msgstr "Corrente"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:82
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:83
msgctxt "@title:column"
msgid "Unit"
msgstr "Unità"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:15
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:354
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:410
msgctxt "@title:tab"
msgid "General"
msgstr "Generale"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:126
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:130
msgctxt "@label"
msgid "Interface"
msgstr "Interfaccia"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:137
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:141
msgctxt "@label"
msgid "Language:"
msgstr "Lingua:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:204
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:208
msgctxt "@label"
msgid "Currency:"
msgstr "Valuta:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:217
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221
msgctxt "@label"
msgid "Theme:"
msgstr "Tema:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:273
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:277
msgctxt "@label"
msgid "You will need to restart the application for these changes to have effect."
msgstr "Riavviare l'applicazione per rendere effettive le modifiche."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:294
msgctxt "@info:tooltip"
msgid "Slice automatically when changing settings."
msgstr "Seziona automaticamente alla modifica delle impostazioni."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:302
msgctxt "@option:check"
msgid "Slice automatically"
msgstr "Seziona automaticamente"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:312
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:316
msgctxt "@label"
msgid "Viewport behavior"
msgstr "Comportamento del riquadro di visualizzazione"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:324
msgctxt "@info:tooltip"
msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly."
msgstr "Evidenzia in rosso le zone non supportate del modello. In assenza di supporto, queste aree non saranno stampate in modo corretto."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:329
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:333
msgctxt "@option:check"
msgid "Display overhang"
msgstr "Visualizza sbalzo"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:336
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341
msgctxt "@info:tooltip"
msgid "Moves the camera so the model is in the center of the view when a model is selected"
msgstr "Sposta la fotocamera in modo che il modello si trovi al centro della visualizzazione quando è selezionato"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:346
msgctxt "@action:button"
msgid "Center camera when item is selected"
msgstr "Centratura fotocamera alla selezione dell'elemento"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:350
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356
msgctxt "@info:tooltip"
msgid "Should the default zoom behavior of cura be inverted?"
msgstr "Il comportamento dello zoom predefinito di Cura dovrebbe essere invertito?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:355
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361
msgctxt "@action:button"
msgid "Invert the direction of camera zoom."
msgstr "Inverti la direzione dello zoom della fotocamera."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:365
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371
msgctxt "@info:tooltip"
msgid "Should zooming move in the direction of the mouse?"
msgstr "Lo zoom si muove nella direzione del mouse?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371
+msgctxt "@info:tooltip"
+msgid "Zooming towards the mouse is not supported in the orthogonal perspective."
+msgstr "Nella prospettiva ortogonale lo zoom verso la direzione del mouse non è supportato."
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:376
msgctxt "@action:button"
msgid "Zoom toward mouse direction"
msgstr "Zoom verso la direzione del mouse"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:380
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402
msgctxt "@info:tooltip"
msgid "Should models on the platform be moved so that they no longer intersect?"
msgstr "I modelli sull’area di stampa devono essere spostati per evitare intersezioni?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:385
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:407
msgctxt "@option:check"
msgid "Ensure models are kept apart"
msgstr "Assicurarsi che i modelli siano mantenuti separati"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:394
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416
msgctxt "@info:tooltip"
msgid "Should models on the platform be moved down to touch the build plate?"
msgstr "I modelli sull’area di stampa devono essere portati a contatto del piano di stampa?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:421
msgctxt "@option:check"
msgid "Automatically drop models to the build plate"
msgstr "Rilascia automaticamente i modelli sul piano di stampa"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:411
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433
msgctxt "@info:tooltip"
msgid "Show caution message in g-code reader."
msgstr "Visualizza il messaggio di avvertimento sul lettore codice G."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:420
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:442
msgctxt "@option:check"
msgid "Caution message in g-code reader"
msgstr "Messaggio di avvertimento sul lettore codice G"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:428
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:450
msgctxt "@info:tooltip"
msgid "Should layer be forced into compatibility mode?"
msgstr "Lo strato deve essere forzato in modalità di compatibilità?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:455
msgctxt "@option:check"
msgid "Force layer view compatibility mode (restart required)"
msgstr "Forzare la modalità di compatibilità visualizzazione strato (riavvio necessario)"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:449
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:465
+msgctxt "@info:tooltip"
+msgid "What type of camera rendering should be used?"
+msgstr "Quale tipo di rendering della fotocamera è necessario utilizzare?"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:472
+msgctxt "@window:text"
+msgid "Camera rendering: "
+msgstr "Rendering fotocamera: "
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:483
+msgid "Perspective"
+msgstr "Prospettiva"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:484
+msgid "Orthogonal"
+msgstr "Ortogonale"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:515
msgctxt "@label"
msgid "Opening and saving files"
msgstr "Apertura e salvataggio file"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:456
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522
msgctxt "@info:tooltip"
msgid "Should models be scaled to the build volume if they are too large?"
msgstr "I modelli devono essere ridimensionati al volume di stampa, se troppo grandi?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:461
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:527
msgctxt "@option:check"
msgid "Scale large models"
msgstr "Ridimensiona i modelli troppo grandi"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537
msgctxt "@info:tooltip"
msgid "An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be scaled up?"
msgstr "Un modello può apparire eccessivamente piccolo se la sua unità di misura è espressa in metri anziché in millimetri. Questi modelli devono essere aumentati?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:542
msgctxt "@option:check"
msgid "Scale extremely small models"
msgstr "Ridimensiona i modelli eccessivamente piccoli"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:486
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:552
msgctxt "@info:tooltip"
msgid "Should models be selected after they are loaded?"
msgstr "I modelli devono essere selezionati dopo essere stati caricati?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:491
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:557
msgctxt "@option:check"
msgid "Select models when loaded"
msgstr "Selezionare i modelli dopo il caricamento"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:567
msgctxt "@info:tooltip"
msgid "Should a prefix based on the printer name be added to the print job name automatically?"
msgstr "Al nome del processo di stampa deve essere aggiunto automaticamente un prefisso basato sul nome della stampante?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:506
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:572
msgctxt "@option:check"
msgid "Add machine prefix to job name"
msgstr "Aggiungi al nome del processo un prefisso macchina"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:516
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582
msgctxt "@info:tooltip"
msgid "Should a summary be shown when saving a project file?"
msgstr "Quando si salva un file di progetto deve essere visualizzato un riepilogo?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:586
msgctxt "@option:check"
msgid "Show summary dialog when saving project"
msgstr "Visualizza una finestra di riepilogo quando si salva un progetto"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:530
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596
msgctxt "@info:tooltip"
msgid "Default behavior when opening a project file"
msgstr "Comportamento predefinito all'apertura di un file progetto"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:538
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:604
msgctxt "@window:text"
msgid "Default behavior when opening a project file: "
msgstr "Comportamento predefinito all'apertura di un file progetto: "
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:552
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:618
msgctxt "@option:openProject"
msgid "Always ask me this"
msgstr "Chiedi sempre"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:553
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:619
msgctxt "@option:openProject"
msgid "Always open as a project"
msgstr "Apri sempre come progetto"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:554
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620
msgctxt "@option:openProject"
msgid "Always import models"
msgstr "Importa sempre i modelli"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:590
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656
msgctxt "@info:tooltip"
msgid "When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want to keep your modifications or not, or you can choose a default behaviour and never show that dialog again."
msgstr "Dopo aver modificato un profilo ed essere passati a un altro, si apre una finestra di dialogo che chiede se mantenere o eliminare le modifiche oppure se scegliere un comportamento predefinito e non visualizzare più tale finestra di dialogo."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:599
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:665
msgctxt "@label"
msgid "Profiles"
msgstr "Profili"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:604
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:670
msgctxt "@window:text"
msgid "Default behavior for changed setting values when switching to a different profile: "
msgstr "Comportamento predefinito per i valori di impostazione modificati al passaggio a un profilo diverso: "
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:618
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:684
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:157
msgctxt "@option:discardOrKeep"
msgid "Always ask me this"
msgstr "Chiedi sempre"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:619
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685
msgctxt "@option:discardOrKeep"
msgid "Always discard changed settings"
msgstr "Elimina sempre le impostazioni modificate"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:686
msgctxt "@option:discardOrKeep"
msgid "Always transfer changed settings to new profile"
msgstr "Trasferisci sempre le impostazioni modificate a un nuovo profilo"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:654
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:720
msgctxt "@label"
msgid "Privacy"
msgstr "Privacy"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:661
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:727
msgctxt "@info:tooltip"
msgid "Should Cura check for updates when the program is started?"
msgstr "Cura deve verificare la presenza di eventuali aggiornamenti all’avvio del programma?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:666
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:732
msgctxt "@option:check"
msgid "Check for updates on start"
msgstr "Controlla aggiornamenti all’avvio"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:676
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:742
msgctxt "@info:tooltip"
msgid "Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored."
msgstr "I dati anonimi sulla stampa devono essere inviati a Ultimaker? Nota, non sono trasmessi o memorizzati modelli, indirizzi IP o altre informazioni personali."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:681
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:747
msgctxt "@option:check"
msgid "Send (anonymous) print information"
msgstr "Invia informazioni di stampa (anonime)"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:690
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:756
msgctxt "@action:button"
msgid "More information"
msgstr "Ulteriori informazioni"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:708
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:774
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:27
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ProfileMenu.qml:23
msgctxt "@label"
msgid "Experimental"
msgstr "Sperimentale"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:715
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:781
msgctxt "@info:tooltip"
msgid "Use multi build plate functionality"
msgstr "Utilizzare la funzionalità piano di stampa multiplo"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:720
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:786
msgctxt "@option:check"
msgid "Use multi build plate functionality (restart required)"
msgstr "Utilizzare la funzionalità piano di stampa multiplo (necessario riavvio)"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:16
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:359
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:415
msgctxt "@title:tab"
msgid "Printers"
msgstr "Stampanti"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:129
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:63
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:134
msgctxt "@action:button"
msgid "Rename"
msgstr "Rinomina"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:36
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:363
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:419
msgctxt "@title:tab"
msgid "Profiles"
msgstr "Profili"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:87
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:89
msgctxt "@label"
msgid "Create"
msgstr "Crea"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:105
msgctxt "@label"
msgid "Duplicate"
msgstr "Duplica"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:174
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:181
msgctxt "@title:window"
msgid "Create Profile"
msgstr "Crea profilo"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:183
msgctxt "@info"
msgid "Please provide a name for this profile."
msgstr "Indica un nome per questo profilo."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:239
msgctxt "@title:window"
msgid "Duplicate Profile"
msgstr "Duplica profilo"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:263
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:270
msgctxt "@title:window"
msgid "Rename Profile"
msgstr "Rinomina profilo"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:276
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:283
msgctxt "@title:window"
msgid "Import Profile"
msgstr "Importa profilo"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:302
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:309
msgctxt "@title:window"
msgid "Export Profile"
msgstr "Esporta profilo"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:357
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:364
msgctxt "@label %1 is printer name"
msgid "Printer: %1"
msgstr "Stampante: %1"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:420
msgctxt "@label"
msgid "Default profiles"
msgstr "Profili predefiniti"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:420
msgctxt "@label"
msgid "Custom profiles"
msgstr "Profili personalizzati"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:490
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:500
msgctxt "@action:button"
msgid "Update profile with current settings/overrides"
msgstr "Aggiorna il profilo con le impostazioni/esclusioni correnti"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:497
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:507
msgctxt "@action:button"
msgid "Discard current changes"
msgstr "Elimina le modifiche correnti"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:514
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:524
msgctxt "@action:label"
msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below."
msgstr "Questo profilo utilizza le impostazioni predefinite dalla stampante, perciò non ci sono impostazioni/esclusioni nell’elenco riportato di seguito."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:521
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:531
msgctxt "@action:label"
msgid "Your current settings match the selected profile."
msgstr "Le impostazioni correnti corrispondono al profilo selezionato."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:540
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:550
msgctxt "@title:tab"
msgid "Global Settings"
msgstr "Impostazioni globali"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:89
msgctxt "@action:button"
msgid "Marketplace"
msgstr "Mercato"
@@ -3746,12 +3624,12 @@ msgctxt "@title:menu menubar:toplevel"
msgid "&Help"
msgstr "&Help"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:123
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:124
msgctxt "@title:window"
msgid "New project"
msgstr "Nuovo progetto"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:124
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:125
msgctxt "@info:question"
msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings."
msgstr "Sei sicuro di voler aprire un nuovo progetto? Questo cancellerà il piano di stampa e tutte le impostazioni non salvate."
@@ -3766,33 +3644,33 @@ msgctxt "@label:textbox"
msgid "search settings"
msgstr "impostazioni ricerca"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:466
msgctxt "@action:menu"
msgid "Copy value to all extruders"
msgstr "Copia valore su tutti gli estrusori"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:474
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:475
msgctxt "@action:menu"
msgid "Copy all changed values to all extruders"
msgstr "Copia tutti i valori modificati su tutti gli estrusori"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512
msgctxt "@action:menu"
msgid "Hide this setting"
msgstr "Nascondi questa impostazione"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:529
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:525
msgctxt "@action:menu"
msgid "Don't show this setting"
msgstr "Nascondi questa impostazione"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:533
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:529
msgctxt "@action:menu"
msgid "Keep this setting visible"
msgstr "Mantieni visibile questa impostazione"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:557
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:548
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:434
msgctxt "@action:menu"
msgid "Configure setting visibility..."
msgstr "Configura visibilità delle impostazioni..."
@@ -3808,27 +3686,32 @@ msgstr ""
"\n"
"Fare clic per rendere visibili queste impostazioni."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:81
+msgctxt "@label"
+msgid "This setting is not used because all the settings that it influences are overridden."
+msgstr "Questa impostazione non è utilizzata perché tutte le impostazioni che influenza sono sottoposte a override."
+
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:86
msgctxt "@label Header for list of settings."
msgid "Affects"
msgstr "Influisce su"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:71
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:91
msgctxt "@label Header for list of settings."
msgid "Affected By"
msgstr "Influenzato da"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:166
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186
msgctxt "@label"
msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders."
msgstr "Questa impostazione è sempre condivisa tra tutti gli estrusori. La sua modifica varierà il valore per tutti gli estrusori."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:170
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190
msgctxt "@label"
msgid "The value is resolved from per-extruder values "
msgstr "Questo valore è risolto da valori per estrusore "
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:208
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:228
msgctxt "@label"
msgid ""
"This setting has a value that is different from the profile.\n"
@@ -3839,7 +3722,7 @@ msgstr ""
"\n"
"Fare clic per ripristinare il valore del profilo."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:302
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:322
msgctxt "@label"
msgid ""
"This setting is normally calculated, but it currently has an absolute value set.\n"
@@ -3850,12 +3733,12 @@ msgstr ""
"\n"
"Fare clic per ripristinare il valore calcolato."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:144
msgctxt "@button"
msgid "Recommended"
msgstr "Consigliata"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:158
msgctxt "@button"
msgid "Custom"
msgstr "Personalizzata"
@@ -3870,27 +3753,22 @@ msgctxt "@label"
msgid "Gradual infill will gradually increase the amount of infill towards the top."
msgstr "Un riempimento graduale aumenterà gradualmente la quantità di riempimento verso l'alto."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:30
msgctxt "@label"
msgid "Support"
msgstr "Supporto"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:71
msgctxt "@label"
msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing."
msgstr "Genera strutture per supportare le parti del modello a sbalzo. Senza queste strutture, queste parti collasserebbero durante la stampa."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:136
-msgctxt "@label"
-msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air."
-msgstr "Seleziona l’estrusore da utilizzare per la stampa di strutture di supporto. Ciò consentirà di costruire strutture di supporto sotto il modello per evitare cedimenti del modello o di stampare a mezz'aria."
-
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:29
msgctxt "@label"
msgid "Adhesion"
msgstr "Adesione"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:74
msgctxt "@label"
msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards."
msgstr "Abilita stampa di brim o raft. Questa funzione aggiunge un’area piana attorno o sotto l’oggetto, facile da tagliare successivamente."
@@ -3907,8 +3785,8 @@ 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 "Questo profilo di qualità non è disponibile per il materiale e la configurazione ugello corrente. Modificarli per abilitare questo profilo di qualità"
+msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile."
+msgstr "Questo profilo di qualità non è disponibile per la configurazione attuale del materiale e degli ugelli. Modificare tali configurazioni per abilitare il profilo di qualità desiderato."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
msgctxt "@tooltip"
@@ -3941,10 +3819,10 @@ msgstr ""
"\n"
"Fare clic per aprire la gestione profili."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:21
msgctxt "@label shown when we load a Gcode file"
-msgid "Print setup disabled. G code file can not be modified."
-msgstr "Impostazione di stampa disabilitata. Impossibile modificare il file codice G."
+msgid "Print setup disabled. G-code file can not be modified."
+msgstr "Impostazione di stampa disabilitata. Il file G-code non può essere modificato."
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
msgctxt "@label"
@@ -3976,7 +3854,7 @@ msgctxt "@label"
msgid "Send G-code"
msgstr "Invia codice G"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:364
+#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:365
msgctxt "@tooltip of G-code command input"
msgid "Send a custom G-code command to the connected printer. Press 'enter' to send the command."
msgstr "Invia un comando codice G personalizzato alla stampante connessa. Premere ‘invio’ per inviare il comando."
@@ -4073,11 +3951,6 @@ msgctxt "@label:category menu label"
msgid "Favorites"
msgstr "Preferiti"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:66
-msgctxt "@label:category menu label"
-msgid "Generic"
-msgstr "Generale"
-
#: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25
msgctxt "@label:category menu label"
msgid "Network enabled printers"
@@ -4093,32 +3966,32 @@ msgctxt "@title:menu menubar:settings"
msgid "&Printer"
msgstr "S&tampante"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:26
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:32
msgctxt "@title:menu"
msgid "&Material"
msgstr "Ma&teriale"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:35
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:41
msgctxt "@action:inmenu"
msgid "Set as Active Extruder"
msgstr "Imposta come estrusore attivo"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:41
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:47
msgctxt "@action:inmenu"
msgid "Enable Extruder"
msgstr "Abilita estrusore"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:48
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:54
msgctxt "@action:inmenu"
msgid "Disable Extruder"
msgstr "Disabilita estrusore"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:62
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:68
msgctxt "@title:menu"
msgid "&Build plate"
msgstr "&Piano di stampa"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:65
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:71
msgctxt "@title:settings"
msgid "&Profile"
msgstr "&Profilo"
@@ -4128,7 +4001,22 @@ msgctxt "@action:inmenu menubar:view"
msgid "&Camera position"
msgstr "&Posizione fotocamera"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:35
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:44
+msgctxt "@action:inmenu menubar:view"
+msgid "Camera view"
+msgstr "Visualizzazione fotocamera"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:47
+msgctxt "@action:inmenu menubar:view"
+msgid "Perspective"
+msgstr "Prospettiva"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:59
+msgctxt "@action:inmenu menubar:view"
+msgid "Orthographic"
+msgstr "Ortogonale"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:80
msgctxt "@action:inmenu menubar:view"
msgid "&Build plate"
msgstr "P&iano di stampa"
@@ -4192,12 +4080,7 @@ msgctxt "@label"
msgid "Select configuration"
msgstr "Seleziona configurazione"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
-msgctxt "@label"
-msgid "See the material compatibility chart"
-msgstr "Vedere il grafico di compatibilità dei materiali"
-
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:221
msgctxt "@label"
msgid "Configurations"
msgstr "Configurazioni"
@@ -4222,17 +4105,17 @@ msgctxt "@label"
msgid "Printer"
msgstr "Stampante"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:213
msgctxt "@label"
msgid "Enabled"
msgstr "Abilitato"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:250
msgctxt "@label"
msgid "Material"
msgstr "Materiale"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:375
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
msgstr "Utilizzare la colla per una migliore adesione con questa combinazione di materiali."
@@ -4252,42 +4135,47 @@ msgctxt "@title:menu menubar:file"
msgid "Open &Recent"
msgstr "Ap&ri recenti"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:145
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:140
msgctxt "@label"
msgid "Active print"
msgstr "Stampa attiva"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:153
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:148
msgctxt "@label"
msgid "Job Name"
msgstr "Nome del processo"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:161
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:156
msgctxt "@label"
msgid "Printing Time"
msgstr "Tempo di stampa"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:169
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:164
msgctxt "@label"
msgid "Estimated time left"
msgstr "Tempo residuo stimato"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
-msgid "View types"
-msgstr "Visualizza tipi"
+msgid "View type"
+msgstr "Visualizza tipo"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
+#: /home/ruben/Projects/Cura/resources/qml/ObjectSelector.qml:59
msgctxt "@label"
-msgid "Hi "
-msgstr "Ciao "
+msgid "Object list"
+msgstr "Elenco oggetti"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:22
+msgctxt "@label The argument is a username."
+msgid "Hi %1"
+msgstr "Alto %1"
+
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:33
msgctxt "@button"
msgid "Ultimaker account"
msgstr "Account Ultimaker"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:42
msgctxt "@button"
msgid "Sign out"
msgstr "Esci"
@@ -4297,11 +4185,6 @@ msgctxt "@action:button"
msgid "Sign in"
msgstr "Accedi"
-#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
-msgctxt "@label"
-msgid "Ultimaker Cloud"
-msgstr "Ultimaker Cloud"
-
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
@@ -4312,11 +4195,11 @@ msgctxt "@text"
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"
+"- Get exclusive access to print 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"
+"- Ottieni l’accesso esclusivo ai profili di stampa dai principali marchi"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
@@ -4328,50 +4211,55 @@ msgctxt "@label"
msgid "No time estimation available"
msgstr "Nessuna stima di tempo disponibile"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:77
msgctxt "@label"
msgid "No cost estimation available"
msgstr "Nessuna stima di costo disponibile"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:127
msgctxt "@button"
msgid "Preview"
msgstr "Anteprima"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:55
msgctxt "@label:PrintjobStatus"
msgid "Slicing..."
msgstr "Sezionamento in corso..."
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:61
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:67
msgctxt "@label:PrintjobStatus"
-msgid "Unable to Slice"
+msgid "Unable to slice"
msgstr "Sezionamento impossibile"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:103
+msgctxt "@button"
+msgid "Processing"
+msgstr "Elaborazione in corso"
+
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:103
msgctxt "@button"
msgid "Slice"
msgstr "Sezionamento"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:104
msgctxt "@label"
msgid "Start the slicing process"
msgstr "Avvia il processo di sezionamento"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:118
msgctxt "@button"
msgid "Cancel"
msgstr "Annulla"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
-msgid "Time specification"
-msgstr "Indicazioni di tempo"
+msgid "Time estimation"
+msgstr "Stima del tempo"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
-msgid "Material specification"
-msgstr "Specifiche materiale"
+msgid "Material estimation"
+msgstr "Stima del materiale"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4393,285 +4281,299 @@ msgctxt "@label"
msgid "Preset printers"
msgstr "Stampanti preimpostate"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
+#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:166
msgctxt "@button"
msgid "Add printer"
msgstr "Aggiungi stampante"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
+#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:182
msgctxt "@button"
msgid "Manage printers"
msgstr "Gestione stampanti"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:81
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
msgstr "Mostra la Guida ricerca e riparazione dei guasti online"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:88
msgctxt "@action:inmenu"
msgid "Toggle Full Screen"
msgstr "Attiva/disattiva schermo intero"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:92
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96
+msgctxt "@action:inmenu"
+msgid "Exit Full Screen"
+msgstr "Esci da schermo intero"
+
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:103
msgctxt "@action:inmenu menubar:edit"
msgid "&Undo"
msgstr "&Annulla"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:113
msgctxt "@action:inmenu menubar:edit"
msgid "&Redo"
msgstr "Ri&peti"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:112
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:123
msgctxt "@action:inmenu menubar:file"
msgid "&Quit"
msgstr "&Esci"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:120
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:131
msgctxt "@action:inmenu menubar:view"
msgid "3D View"
msgstr "Visualizzazione 3D"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138
msgctxt "@action:inmenu menubar:view"
msgid "Front View"
msgstr "Visualizzazione frontale"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:145
msgctxt "@action:inmenu menubar:view"
msgid "Top View"
msgstr "Visualizzazione superiore"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:141
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:152
msgctxt "@action:inmenu menubar:view"
msgid "Left Side View"
msgstr "Visualizzazione lato sinistro"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:148
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:159
msgctxt "@action:inmenu menubar:view"
msgid "Right Side View"
msgstr "Visualizzazione lato destro"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:155
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:166
msgctxt "@action:inmenu"
msgid "Configure Cura..."
msgstr "Configura Cura..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:173
msgctxt "@action:inmenu menubar:printer"
msgid "&Add Printer..."
msgstr "&Aggiungi stampante..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179
msgctxt "@action:inmenu menubar:printer"
msgid "Manage Pr&inters..."
msgstr "Gestione stampanti..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186
msgctxt "@action:inmenu"
msgid "Manage Materials..."
msgstr "Gestione materiali..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:184
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:195
msgctxt "@action:inmenu menubar:profile"
msgid "&Update profile with current settings/overrides"
msgstr "&Aggiorna il profilo con le impostazioni/esclusioni correnti"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:192
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203
msgctxt "@action:inmenu menubar:profile"
msgid "&Discard current changes"
msgstr "&Elimina le modifiche correnti"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:204
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:215
msgctxt "@action:inmenu menubar:profile"
msgid "&Create profile from current settings/overrides..."
msgstr "&Crea profilo dalle impostazioni/esclusioni correnti..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:221
msgctxt "@action:inmenu menubar:profile"
msgid "Manage Profiles..."
msgstr "Gestione profili..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:229
msgctxt "@action:inmenu menubar:help"
msgid "Show Online &Documentation"
msgstr "Mostra documentazione &online"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:237
msgctxt "@action:inmenu menubar:help"
msgid "Report a &Bug"
msgstr "Se&gnala un errore"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:245
+msgctxt "@action:inmenu menubar:help"
+msgid "What's New"
+msgstr "Scopri le novità"
+
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:251
msgctxt "@action:inmenu menubar:help"
msgid "About..."
msgstr "Informazioni..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:241
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258
msgctxt "@action:inmenu menubar:edit"
msgid "Delete Selected Model"
msgid_plural "Delete Selected Models"
msgstr[0] "Cancella modello selezionato"
msgstr[1] "Cancella modelli selezionati"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:251
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:268
msgctxt "@action:inmenu menubar:edit"
msgid "Center Selected Model"
msgid_plural "Center Selected Models"
msgstr[0] "Centra modello selezionato"
msgstr[1] "Centra modelli selezionati"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277
msgctxt "@action:inmenu menubar:edit"
msgid "Multiply Selected Model"
msgid_plural "Multiply Selected Models"
msgstr[0] "Moltiplica modello selezionato"
msgstr[1] "Moltiplica modelli selezionati"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:286
msgctxt "@action:inmenu"
msgid "Delete Model"
msgstr "Elimina modello"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294
msgctxt "@action:inmenu"
msgid "Ce&nter Model on Platform"
msgstr "C&entra modello su piattaforma"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:283
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:300
msgctxt "@action:inmenu menubar:edit"
msgid "&Group Models"
msgstr "&Raggruppa modelli"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:303
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:320
msgctxt "@action:inmenu menubar:edit"
msgid "Ungroup Models"
msgstr "Separa modelli"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:313
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:330
msgctxt "@action:inmenu menubar:edit"
msgid "&Merge Models"
msgstr "&Unisci modelli"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:340
msgctxt "@action:inmenu"
msgid "&Multiply Model..."
msgstr "Mo<iplica modello..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:330
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:347
msgctxt "@action:inmenu menubar:edit"
msgid "Select All Models"
msgstr "Seleziona tutti i modelli"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:340
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:357
msgctxt "@action:inmenu menubar:edit"
msgid "Clear Build Plate"
msgstr "Cancellare piano di stampa"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:367
msgctxt "@action:inmenu menubar:file"
msgid "Reload All Models"
msgstr "Ricarica tutti i modelli"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:359
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:376
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange All Models To All Build Plates"
msgstr "Sistema tutti i modelli su tutti i piani di stampa"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:383
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange All Models"
msgstr "Sistema tutti i modelli"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:374
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:391
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange Selection"
msgstr "Sistema selezione"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:381
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:398
msgctxt "@action:inmenu menubar:edit"
msgid "Reset All Model Positions"
msgstr "Reimposta tutte le posizioni dei modelli"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:388
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:405
msgctxt "@action:inmenu menubar:edit"
msgid "Reset All Model Transformations"
msgstr "Reimposta tutte le trasformazioni dei modelli"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:412
msgctxt "@action:inmenu menubar:file"
msgid "&Open File(s)..."
msgstr "&Apri file..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:403
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:420
msgctxt "@action:inmenu menubar:file"
msgid "&New Project..."
msgstr "&Nuovo Progetto..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:427
msgctxt "@action:inmenu menubar:help"
msgid "Show Configuration Folder"
msgstr "Mostra cartella di configurazione"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:441
msgctxt "@action:menu"
msgid "&Marketplace"
msgstr "&Mercato"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:24
msgctxt "@title:window"
msgid "Ultimaker Cura"
msgstr "Ultimaker Cura"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:181
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232
msgctxt "@label"
msgid "This package will be installed after restarting."
msgstr "Questo pacchetto sarà installato dopo il riavvio."
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:357
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:413
msgctxt "@title:tab"
msgid "Settings"
msgstr "Impostazioni"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:486
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:539
msgctxt "@title:window"
msgid "Closing Cura"
msgstr "Chiusura di Cura"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:487
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:499
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:540
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:552
msgctxt "@label"
msgid "Are you sure you want to exit Cura?"
msgstr "Sei sicuro di voler uscire da Cura?"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:531
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:590
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:19
msgctxt "@title:window"
msgid "Open file(s)"
msgstr "Apri file"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:632
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:691
msgctxt "@window:title"
msgid "Install Package"
msgstr "Installa il pacchetto"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:640
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:699
msgctxt "@title:window"
msgid "Open File(s)"
msgstr "Apri file"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:643
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:702
msgctxt "@text:window"
msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one."
msgstr "Rilevata la presenza di uno o più file codice G tra i file selezionati. È possibile aprire solo un file codice G alla volta. Se desideri aprire un file codice G, selezionane uno solo."
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:713
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:18
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:805
msgctxt "@title:window"
msgid "Add Printer"
msgstr "Aggiungi stampante"
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:813
+msgctxt "@title:window"
+msgid "What's New"
+msgstr "Scopri le novità"
+
#: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16
msgctxt "@label %1 is filled in with the name of an extruder"
msgid "Print Selected Model with %1"
@@ -4733,37 +4635,6 @@ msgctxt "@action:button"
msgid "Create New Profile"
msgstr "Crea nuovo profilo"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
-msgctxt "@title:tab"
-msgid "Add a printer to Cura"
-msgstr "Aggiungi una stampante a Cura"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
-msgctxt "@title:tab"
-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 ""
-"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 "Produttore"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
-msgctxt "@label"
-msgid "Printer Name"
-msgstr "Nome stampante"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
-msgctxt "@action:button"
-msgid "Add Printer"
-msgstr "Aggiungi stampante"
-
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:15
msgctxt "@title:window"
msgid "About Cura"
@@ -4923,27 +4794,32 @@ msgctxt "@title:window"
msgid "Save Project"
msgstr "Salva progetto"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:138
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:149
msgctxt "@action:label"
msgid "Build plate"
msgstr "Piano di stampa"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:170
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:183
msgctxt "@action:label"
msgid "Extruder %1"
msgstr "Estrusore %1"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:180
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:198
msgctxt "@action:label"
msgid "%1 & material"
msgstr "%1 & materiale"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:243
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:200
+msgctxt "@action:label"
+msgid "Material"
+msgstr "Materiale"
+
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:272
msgctxt "@action:label"
msgid "Don't show project summary on save again"
msgstr "Non mostrare il riepilogo di progetto alla ripetizione di salva"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:262
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:291
msgctxt "@action:button"
msgid "Save"
msgstr "Salva"
@@ -4973,30 +4849,1069 @@ msgctxt "@action:button"
msgid "Import models"
msgstr "Importa i modelli"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:210
-msgctxt "@option:check"
-msgid "See only current build plate"
-msgstr "Vedi solo il piano di stampa corrente"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DropDownWidget.qml:93
+msgctxt "@label"
+msgid "Empty"
+msgstr "Vuoto"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:226
-msgctxt "@action:button"
-msgid "Arrange to all build plates"
-msgstr "Sistema su tutti i piani di stampa"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:24
+msgctxt "@label"
+msgid "Add a printer"
+msgstr "Aggiungi una stampante"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:246
-msgctxt "@action:button"
-msgid "Arrange current build plate"
-msgstr "Sistema il piano di stampa corrente"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:39
+msgctxt "@label"
+msgid "Add a networked printer"
+msgstr "Aggiungi una stampante in rete"
-#: X3GWriter/plugin.json
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:81
+msgctxt "@label"
+msgid "Add a non-networked printer"
+msgstr "Aggiungi una stampante non in rete"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:70
+msgctxt "@label"
+msgid "Add printer by IP address"
+msgstr "Aggiungi stampante per indirizzo IP"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:133
+msgctxt "@text"
+msgid "Place enter your printer's IP address."
+msgstr "Inserisci l'indirizzo IP della stampante."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:158
+msgctxt "@button"
+msgid "Add"
+msgstr "Aggiungi"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:204
+msgctxt "@label"
+msgid "Could not connect to device."
+msgstr "Impossibile connettersi al dispositivo."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:208
+msgctxt "@label"
+msgid "The printer at this address has not responded yet."
+msgstr "La stampante a questo indirizzo non ha ancora risposto."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:240
+msgctxt "@label"
+msgid "This printer cannot be added because it's an unknown printer or it's not the host of a group."
+msgstr "Questa stampante non può essere aggiunta perché è una stampante sconosciuta o non è l'host di un gruppo."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:329
+msgctxt "@button"
+msgid "Back"
+msgstr "Indietro"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:342
+msgctxt "@button"
+msgid "Connect"
+msgstr "Collega"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/FirstStartMachineActionsContent.qml:77
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:123
+msgctxt "@button"
+msgid "Next"
+msgstr "Avanti"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:23
+msgctxt "@label"
+msgid "User Agreement"
+msgstr "Contratto di licenza"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:56
+msgctxt "@button"
+msgid "Agree"
+msgstr "Accetta"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:70
+msgctxt "@button"
+msgid "Decline and close"
+msgstr "Rifiuta e chiudi"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:24
+msgctxt "@label"
+msgid "Help us to improve Ultimaker Cura"
+msgstr "Aiutaci a migliorare Ultimaker Cura"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:57
+msgctxt "@text"
+msgid "Ultimaker Cura collects anonymous data to improve print quality and user experience, including:"
+msgstr "Ultimaker Cura acquisisce dati anonimi per migliorare la qualità di stampa e l'esperienza dell'utente, tra cui:"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:71
+msgctxt "@text"
+msgid "Machine types"
+msgstr "Tipi di macchine"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:77
+msgctxt "@text"
+msgid "Material usage"
+msgstr "Utilizzo dei materiali"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:83
+msgctxt "@text"
+msgid "Number of slices"
+msgstr "Numero di sezionamenti"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:89
+msgctxt "@text"
+msgid "Print settings"
+msgstr "Impostazioni di stampa"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:102
+msgctxt "@text"
+msgid "Data collected by Ultimaker Cura will not contain any personal information."
+msgstr "I dati acquisiti da Ultimaker Cura non conterranno alcuna informazione personale."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:103
+msgctxt "@text"
+msgid "More information"
+msgstr "Ulteriori informazioni"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WhatsNewContent.qml:24
+msgctxt "@label"
+msgid "What's new in Ultimaker Cura"
+msgstr "Scopri le novità in Ultimaker Cura"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:42
+msgctxt "@label"
+msgid "There is no printer found over your network."
+msgstr "Non è stata trovata alcuna stampante sulla rete."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:179
+msgctxt "@label"
+msgid "Refresh"
+msgstr "Aggiorna"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:190
+msgctxt "@label"
+msgid "Add printer by IP"
+msgstr "Aggiungi stampante per IP"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:223
+msgctxt "@label"
+msgid "Troubleshooting"
+msgstr "Ricerca e riparazione dei guasti"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:207
+msgctxt "@label"
+msgid "Printer name"
+msgstr "Nome stampante"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:220
+msgctxt "@text"
+msgid "Please give your printer a name"
+msgstr "Assegna un nome alla stampante"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:36
+msgctxt "@label"
+msgid "Ultimaker Cloud"
+msgstr "Ultimaker Cloud"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:77
+msgctxt "@text"
+msgid "The next generation 3D printing workflow"
+msgstr "Flusso di stampa 3D di ultima generazione"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:94
+msgctxt "@text"
+msgid "- Send print jobs to Ultimaker printers outside your local network"
+msgstr "- Invia i processi di stampa alle stampanti Ultimaker esterne alla rete locale"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:97
+msgctxt "@text"
+msgid "- Store your Ultimaker Cura settings in the cloud for use anywhere"
+msgstr "- Memorizza le impostazioni Ultimaker Cura nel cloud per usarle ovunque"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:100
+msgctxt "@text"
+msgid "- Get exclusive access to print profiles from leading brands"
+msgstr "- Ottieni l'accesso esclusivo ai profili di stampa dai principali marchi"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:119
+msgctxt "@button"
+msgid "Finish"
+msgstr "Fine"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:128
+msgctxt "@button"
+msgid "Create an account"
+msgstr "Crea un account"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:29
+msgctxt "@label"
+msgid "Welcome to Ultimaker Cura"
+msgstr "Benvenuto in Ultimaker Cura"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:47
+msgctxt "@text"
+msgid ""
+"Please follow these steps to set up\n"
+"Ultimaker Cura. This will only take a few moments."
+msgstr ""
+"Segui questa procedura per configurare\n"
+"Ultimaker Cura. Questa operazione richiederà solo pochi istanti."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:58
+msgctxt "@button"
+msgid "Get started"
+msgstr "Per iniziare"
+
+#: MachineSettingsAction/plugin.json
msgctxt "description"
-msgid "Allows saving the resulting slice as an X3G file, to support printers that read this format (Malyan, Makerbot and other Sailfish-based printers)."
-msgstr "Consente di salvare il sezionamento risultante come un file X3G, per supportare le stampanti che leggono questo formato (Malyan, Makerbot ed altre stampanti basate su firmware Sailfish)."
+msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)."
+msgstr "Fornisce un modo per modificare le impostazioni della macchina (come il volume di stampa, la dimensione ugello, ecc.)"
-#: X3GWriter/plugin.json
+#: MachineSettingsAction/plugin.json
msgctxt "name"
-msgid "X3GWriter"
-msgstr "X3GWriter"
+msgid "Machine Settings action"
+msgstr "Azione Impostazioni macchina"
+
+#: Toolbox/plugin.json
+msgctxt "description"
+msgid "Find, manage and install new Cura packages."
+msgstr "Trova, gestisce ed installa nuovi pacchetti Cura."
+
+#: Toolbox/plugin.json
+msgctxt "name"
+msgid "Toolbox"
+msgstr "Casella degli strumenti"
+
+#: XRayView/plugin.json
+msgctxt "description"
+msgid "Provides the X-Ray view."
+msgstr "Fornisce la vista a raggi X."
+
+#: XRayView/plugin.json
+msgctxt "name"
+msgid "X-Ray View"
+msgstr "Vista ai raggi X"
+
+#: X3DReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading X3D files."
+msgstr "Fornisce il supporto per la lettura di file X3D."
+
+#: X3DReader/plugin.json
+msgctxt "name"
+msgid "X3D Reader"
+msgstr "Lettore X3D"
+
+#: GCodeWriter/plugin.json
+msgctxt "description"
+msgid "Writes g-code to a file."
+msgstr "Scrive il codice G in un file."
+
+#: GCodeWriter/plugin.json
+msgctxt "name"
+msgid "G-code Writer"
+msgstr "Writer codice G"
+
+#: ModelChecker/plugin.json
+msgctxt "description"
+msgid "Checks models and print configuration for possible printing issues and give suggestions."
+msgstr "Controlla i modelli e la configurazione di stampa per eventuali problematiche di stampa e suggerimenti."
+
+#: ModelChecker/plugin.json
+msgctxt "name"
+msgid "Model Checker"
+msgstr "Controllo modello"
+
+#: cura-god-mode-plugin/src/GodMode/plugin.json
+msgctxt "description"
+msgid "Dump the contents of all settings to a HTML file."
+msgstr "Scarica contenuto di tutte le impostazioni in un file HTML."
+
+#: cura-god-mode-plugin/src/GodMode/plugin.json
+msgctxt "name"
+msgid "God Mode"
+msgstr "Modalità God"
+
+#: FirmwareUpdater/plugin.json
+msgctxt "description"
+msgid "Provides a machine actions for updating firmware."
+msgstr "Fornisce azioni macchina per l’aggiornamento del firmware."
+
+#: FirmwareUpdater/plugin.json
+msgctxt "name"
+msgid "Firmware Updater"
+msgstr "Aggiornamento firmware"
+
+#: ProfileFlattener/plugin.json
+msgctxt "description"
+msgid "Create a flattened quality changes profile."
+msgstr "Crea un profilo appiattito di modifiche di qualità."
+
+#: ProfileFlattener/plugin.json
+msgctxt "name"
+msgid "Profile Flattener"
+msgstr "Appiattitore di profilo"
+
+#: AMFReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading AMF files."
+msgstr "Fornisce il supporto per la lettura di file 3MF."
+
+#: AMFReader/plugin.json
+msgctxt "name"
+msgid "AMF Reader"
+msgstr "Lettore 3MF"
+
+#: USBPrinting/plugin.json
+msgctxt "description"
+msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware."
+msgstr "Accetta i G-Code e li invia ad una stampante. I plugin possono anche aggiornare il firmware."
+
+#: USBPrinting/plugin.json
+msgctxt "name"
+msgid "USB printing"
+msgstr "Stampa USB"
+
+#: GCodeGzWriter/plugin.json
+msgctxt "description"
+msgid "Writes g-code to a compressed archive."
+msgstr "Scrive il codice G in un archivio compresso."
+
+#: GCodeGzWriter/plugin.json
+msgctxt "name"
+msgid "Compressed G-code Writer"
+msgstr "Writer codice G compresso"
+
+#: UFPWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for writing Ultimaker Format Packages."
+msgstr "Fornisce il supporto per la scrittura di pacchetti formato Ultimaker."
+
+#: UFPWriter/plugin.json
+msgctxt "name"
+msgid "UFP Writer"
+msgstr "Writer UFP"
+
+#: PrepareStage/plugin.json
+msgctxt "description"
+msgid "Provides a prepare stage in Cura."
+msgstr "Fornisce una fase di preparazione in Cura."
+
+#: PrepareStage/plugin.json
+msgctxt "name"
+msgid "Prepare Stage"
+msgstr "Fase di preparazione"
+
+#: RemovableDriveOutputDevice/plugin.json
+msgctxt "description"
+msgid "Provides removable drive hotplugging and writing support."
+msgstr "Fornisce il collegamento a caldo dell'unità rimovibile e il supporto per la scrittura."
+
+#: RemovableDriveOutputDevice/plugin.json
+msgctxt "name"
+msgid "Removable Drive Output Device Plugin"
+msgstr "Plugin dispositivo di output unità rimovibile"
+
+#: UM3NetworkPrinting/plugin.json
+msgctxt "description"
+msgid "Manages network connections to Ultimaker 3 printers."
+msgstr "Gestisce le connessioni di rete alle stampanti Ultimaker 3."
+
+#: UM3NetworkPrinting/plugin.json
+msgctxt "name"
+msgid "UM3 Network Connection"
+msgstr "Connessione di rete UM3"
+
+#: SettingsGuide/plugin.json
+msgctxt "description"
+msgid "Provides extra information and explanations about settings in Cura, with images and animations."
+msgstr "Fornisce informazioni e spiegazioni aggiuntive sulle impostazioni in Cura, con immagini e animazioni."
+
+#: SettingsGuide/plugin.json
+msgctxt "name"
+msgid "Settings Guide"
+msgstr "Guida alle impostazioni"
+
+#: MonitorStage/plugin.json
+msgctxt "description"
+msgid "Provides a monitor stage in Cura."
+msgstr "Fornisce una fase di controllo in Cura."
+
+#: MonitorStage/plugin.json
+msgctxt "name"
+msgid "Monitor Stage"
+msgstr "Fase di controllo"
+
+#: FirmwareUpdateChecker/plugin.json
+msgctxt "description"
+msgid "Checks for firmware updates."
+msgstr "Controlla disponibilità di aggiornamenti firmware."
+
+#: FirmwareUpdateChecker/plugin.json
+msgctxt "name"
+msgid "Firmware Update Checker"
+msgstr "Controllo aggiornamento firmware"
+
+#: SimulationView/plugin.json
+msgctxt "description"
+msgid "Provides the Simulation view."
+msgstr "Fornisce la vista di simulazione."
+
+#: SimulationView/plugin.json
+msgctxt "name"
+msgid "Simulation View"
+msgstr "Vista simulazione"
+
+#: GCodeGzReader/plugin.json
+msgctxt "description"
+msgid "Reads g-code from a compressed archive."
+msgstr "Legge il codice G da un archivio compresso."
+
+#: GCodeGzReader/plugin.json
+msgctxt "name"
+msgid "Compressed G-code Reader"
+msgstr "Lettore codice G compresso"
+
+#: PostProcessingPlugin/plugin.json
+msgctxt "description"
+msgid "Extension that allows for user created scripts for post processing"
+msgstr "Estensione che consente la post-elaborazione degli script creati da utente"
+
+#: PostProcessingPlugin/plugin.json
+msgctxt "name"
+msgid "Post Processing"
+msgstr "Post-elaborazione"
+
+#: SupportEraser/plugin.json
+msgctxt "description"
+msgid "Creates an eraser mesh to block the printing of support in certain places"
+msgstr "Crea una maglia di cancellazione per bloccare la stampa del supporto in alcune posizioni"
+
+#: SupportEraser/plugin.json
+msgctxt "name"
+msgid "Support Eraser"
+msgstr "Cancellazione supporto"
+
+#: UFPReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading Ultimaker Format Packages."
+msgstr "Fornisce il supporto per la lettura di pacchetti formato Ultimaker."
+
+#: UFPReader/plugin.json
+msgctxt "name"
+msgid "UFP Reader"
+msgstr "Lettore UFP"
+
+#: SliceInfoPlugin/plugin.json
+msgctxt "description"
+msgid "Submits anonymous slice info. Can be disabled through preferences."
+msgstr "Invia informazioni su sezionamento anonime Può essere disabilitato tramite le preferenze."
+
+#: SliceInfoPlugin/plugin.json
+msgctxt "name"
+msgid "Slice info"
+msgstr "Informazioni su sezionamento"
+
+#: XmlMaterialProfile/plugin.json
+msgctxt "description"
+msgid "Provides capabilities to read and write XML-based material profiles."
+msgstr "Offre la possibilità di leggere e scrivere profili di materiali basati su XML."
+
+#: XmlMaterialProfile/plugin.json
+msgctxt "name"
+msgid "Material Profiles"
+msgstr "Profili del materiale"
+
+#: LegacyProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing profiles from legacy Cura versions."
+msgstr "Fornisce supporto per l'importazione di profili dalle versioni legacy Cura."
+
+#: LegacyProfileReader/plugin.json
+msgctxt "name"
+msgid "Legacy Cura Profile Reader"
+msgstr "Lettore legacy profilo Cura"
+
+#: GCodeProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing profiles from g-code files."
+msgstr "Fornisce supporto per l'importazione di profili da file G-Code."
+
+#: GCodeProfileReader/plugin.json
+msgctxt "name"
+msgid "G-code Profile Reader"
+msgstr "Lettore profilo codice G"
+
+#: VersionUpgrade/VersionUpgrade32to33/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.2 to Cura 3.3."
+msgstr "Aggiorna le configurazioni da Cura 3.2 a Cura 3.3."
+
+#: VersionUpgrade/VersionUpgrade32to33/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.2 to 3.3"
+msgstr "Aggiornamento della versione da 3.2 a 3.3"
+
+#: VersionUpgrade/VersionUpgrade33to34/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.3 to Cura 3.4."
+msgstr "Aggiorna le configurazioni da Cura 3.3 a Cura 3.4."
+
+#: VersionUpgrade/VersionUpgrade33to34/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.3 to 3.4"
+msgstr "Aggiornamento della versione da 3.3 a 3.4"
+
+#: VersionUpgrade/VersionUpgrade25to26/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
+msgstr "Aggiorna le configurazioni da Cura 2.5 a Cura 2.6."
+
+#: VersionUpgrade/VersionUpgrade25to26/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.5 to 2.6"
+msgstr "Aggiornamento della versione da 2.5 a 2.6"
+
+#: VersionUpgrade/VersionUpgrade27to30/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
+msgstr "Aggiorna le configurazioni da Cura 2.7 a Cura 3.0."
+
+#: VersionUpgrade/VersionUpgrade27to30/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.7 to 3.0"
+msgstr "Aggiornamento della versione da 2.7 a 3.0"
+
+#: VersionUpgrade/VersionUpgrade35to40/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.5 to Cura 4.0."
+msgstr "Aggiorna le configurazioni da Cura 3.5 a Cura 4.0."
+
+#: VersionUpgrade/VersionUpgrade35to40/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.5 to 4.0"
+msgstr "Aggiornamento della versione da 3.5 a 4.0"
+
+#: VersionUpgrade/VersionUpgrade34to35/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.4 to Cura 3.5."
+msgstr "Aggiorna le configurazioni da Cura 3.4 a Cura 3.5."
+
+#: VersionUpgrade/VersionUpgrade34to35/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.4 to 3.5"
+msgstr "Aggiornamento della versione da 3.4 a 3.5"
+
+#: VersionUpgrade/VersionUpgrade40to41/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 4.0 to Cura 4.1."
+msgstr "Aggiorna le configurazioni da Cura 4.0 a Cura 4.1."
+
+#: VersionUpgrade/VersionUpgrade40to41/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 4.0 to 4.1"
+msgstr "Aggiornamento della versione da 4.0 a 4.1"
+
+#: VersionUpgrade/VersionUpgrade30to31/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.0 to Cura 3.1."
+msgstr "Aggiorna le configurazioni da Cura 3.0 a Cura 3.1."
+
+#: VersionUpgrade/VersionUpgrade30to31/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.0 to 3.1"
+msgstr "Aggiornamento della versione da 3.0 a 3.1"
+
+#: VersionUpgrade/VersionUpgrade41to42/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 4.1 to Cura 4.2."
+msgstr "Aggiorna le configurazioni da Cura 4.1 a Cura 4.2."
+
+#: VersionUpgrade/VersionUpgrade41to42/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 4.1 to 4.2"
+msgstr "Aggiornamento della versione da 4.1 a 4.2"
+
+#: VersionUpgrade/VersionUpgrade26to27/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
+msgstr "Aggiorna le configurazioni da Cura 2.6 a Cura 2.7."
+
+#: VersionUpgrade/VersionUpgrade26to27/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.6 to 2.7"
+msgstr "Aggiornamento della versione da 2.6 a 2.7"
+
+#: VersionUpgrade/VersionUpgrade21to22/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
+msgstr "Aggiorna le configurazioni da Cura 2.1 a Cura 2.2."
+
+#: VersionUpgrade/VersionUpgrade21to22/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.1 to 2.2"
+msgstr "Aggiornamento della versione da 2.1 a 2.2"
+
+#: VersionUpgrade/VersionUpgrade22to24/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
+msgstr "Aggiorna le configurazioni da Cura 2.2 a Cura 2.4."
+
+#: VersionUpgrade/VersionUpgrade22to24/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.2 to 2.4"
+msgstr "Aggiornamento della versione da 2.2 a 2.4"
+
+#: ImageReader/plugin.json
+msgctxt "description"
+msgid "Enables ability to generate printable geometry from 2D image files."
+msgstr "Abilita la possibilità di generare geometria stampabile da file immagine 2D."
+
+#: ImageReader/plugin.json
+msgctxt "name"
+msgid "Image Reader"
+msgstr "Lettore di immagine"
+
+#: CuraEngineBackend/plugin.json
+msgctxt "description"
+msgid "Provides the link to the CuraEngine slicing backend."
+msgstr "Fornisce il collegamento al back-end di sezionamento CuraEngine."
+
+#: CuraEngineBackend/plugin.json
+msgctxt "name"
+msgid "CuraEngine Backend"
+msgstr "Back-end CuraEngine"
+
+#: PerObjectSettingsTool/plugin.json
+msgctxt "description"
+msgid "Provides the Per Model Settings."
+msgstr "Fornisce le impostazioni per modello."
+
+#: PerObjectSettingsTool/plugin.json
+msgctxt "name"
+msgid "Per Model Settings Tool"
+msgstr "Utilità impostazioni per modello"
+
+#: 3MFReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading 3MF files."
+msgstr "Fornisce il supporto per la lettura di file 3MF."
+
+#: 3MFReader/plugin.json
+msgctxt "name"
+msgid "3MF Reader"
+msgstr "Lettore 3MF"
+
+#: SolidView/plugin.json
+msgctxt "description"
+msgid "Provides a normal solid mesh view."
+msgstr "Fornisce una normale visualizzazione a griglia compatta."
+
+#: SolidView/plugin.json
+msgctxt "name"
+msgid "Solid View"
+msgstr "Visualizzazione compatta"
+
+#: GCodeReader/plugin.json
+msgctxt "description"
+msgid "Allows loading and displaying G-code files."
+msgstr "Consente il caricamento e la visualizzazione dei file codice G."
+
+#: GCodeReader/plugin.json
+msgctxt "name"
+msgid "G-code Reader"
+msgstr "Lettore codice G"
+
+#: CuraDrive/plugin.json
+msgctxt "description"
+msgid "Backup and restore your configuration."
+msgstr "Effettua il backup o ripristina la configurazione."
+
+#: CuraDrive/plugin.json
+msgctxt "name"
+msgid "Cura Backups"
+msgstr "Backup Cura"
+
+#: CuraProfileWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for exporting Cura profiles."
+msgstr "Fornisce supporto per l'esportazione dei profili Cura."
+
+#: CuraProfileWriter/plugin.json
+msgctxt "name"
+msgid "Cura Profile Writer"
+msgstr "Writer profilo Cura"
+
+#: CuraPrintProfileCreator/plugin.json
+msgctxt "description"
+msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI."
+msgstr "Consente ai produttori di materiali di creare nuovi profili materiale e di qualità utilizzando una UI drop-in."
+
+#: CuraPrintProfileCreator/plugin.json
+msgctxt "name"
+msgid "Print Profile Assistant"
+msgstr "Assistente profilo di stampa"
+
+#: 3MFWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for writing 3MF files."
+msgstr "Fornisce il supporto per la scrittura di file 3MF."
+
+#: 3MFWriter/plugin.json
+msgctxt "name"
+msgid "3MF Writer"
+msgstr "Writer 3MF"
+
+#: PreviewStage/plugin.json
+msgctxt "description"
+msgid "Provides a preview stage in Cura."
+msgstr "Fornisce una fase di anteprima in Cura."
+
+#: PreviewStage/plugin.json
+msgctxt "name"
+msgid "Preview Stage"
+msgstr "Fase di anteprima"
+
+#: UltimakerMachineActions/plugin.json
+msgctxt "description"
+msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)."
+msgstr "Fornisce azioni macchina per le macchine Ultimaker (come la procedura guidata di livellamento del piano di stampa, la selezione degli aggiornamenti, ecc.)"
+
+#: UltimakerMachineActions/plugin.json
+msgctxt "name"
+msgid "Ultimaker machine actions"
+msgstr "Azioni della macchina Ultimaker"
+
+#: CuraProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing Cura profiles."
+msgstr "Fornisce supporto per l'importazione dei profili Cura."
+
+#: CuraProfileReader/plugin.json
+msgctxt "name"
+msgid "Cura Profile Reader"
+msgstr "Lettore profilo Cura"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Cura Settings Guide"
+#~ msgstr "Guida alle impostazioni Cura"
+
+#~ msgctxt "@info:generic"
+#~ msgid "Settings have been changed to match the current availability of extruders: [%s]"
+#~ msgstr "Le impostazioni sono state modificate in base all’attuale disponibilità di estrusori: [%s]"
+
+#~ msgctxt "@title:groupbox"
+#~ msgid "User description"
+#~ msgstr "Descrizione utente"
+
+#~ msgctxt "@info"
+#~ msgid "These options are not available because you are monitoring a cloud printer."
+#~ msgstr "Queste opzioni non sono disponibili perché si sta controllando una stampante cloud."
+
+#~ msgctxt "@label link to connect manager"
+#~ msgid "Go to Cura Connect"
+#~ msgstr "Vai a Cura Connect"
+
+#~ msgctxt "@info"
+#~ msgid "All jobs are printed."
+#~ msgstr "Tutti i processi sono stampati."
+
+#~ msgctxt "@label link to connect manager"
+#~ msgid "View print history"
+#~ msgstr "Visualizza cronologia di stampa"
+
+#~ msgctxt "@label"
+#~ 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 ""
+#~ "Per stampare direttamente sulla stampante in rete, verificare che la stampante desiderata sia collegata alla rete mediante un cavo di rete o mediante collegamento alla rete WIFI. Se si collega Cura alla stampante, è comunque possibile utilizzare una chiavetta USB per trasferire i file codice G alla stampante.\n"
+#~ "\n"
+#~ "Selezionare la stampante dall’elenco seguente:"
+
+#~ msgctxt "@info"
+#~ 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 ""
+#~ "Accertarsi che la stampante sia collegata:\n"
+#~ "- Controllare se la stampante è accesa.\n"
+#~ "- Controllare se la stampante è collegata alla rete."
+
+#~ msgctxt "@option:check"
+#~ msgid "See only current build plate"
+#~ msgstr "Vedi solo il piano di stampa corrente"
+
+#~ msgctxt "@action:button"
+#~ msgid "Arrange to all build plates"
+#~ msgstr "Sistema su tutti i piani di stampa"
+
+#~ msgctxt "@action:button"
+#~ msgid "Arrange current build plate"
+#~ msgstr "Sistema il piano di stampa corrente"
+
+#~ msgctxt "description"
+#~ msgid "Allows saving the resulting slice as an X3G file, to support printers that read this format (Malyan, Makerbot and other Sailfish-based printers)."
+#~ msgstr "Consente di salvare il sezionamento risultante come un file X3G, per supportare le stampanti che leggono questo formato (Malyan, Makerbot ed altre stampanti basate su firmware Sailfish)."
+
+#~ msgctxt "name"
+#~ msgid "X3GWriter"
+#~ msgstr "X3GWriter"
+
+#~ msgctxt "description"
+#~ msgid "Reads SVG files as toolpaths, for debugging printer movements."
+#~ msgstr "Legge i file SVG come toolpath (percorsi utensile), per eseguire il debug dei movimenti della stampante."
+
+#~ msgctxt "name"
+#~ msgid "SVG Toolpath Reader"
+#~ msgstr "Lettore di toolpath (percorso utensile) SVG"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Changelog"
+#~ msgstr "Registro modifiche"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Show Changelog"
+#~ msgstr "Visualizza registro modifiche"
+
+#~ msgctxt "@info:status"
+#~ msgid "Sending data to remote cluster"
+#~ msgstr "Invio dati al cluster remoto"
+
+#~ msgctxt "@info:status"
+#~ msgid "Connect to Ultimaker Cloud"
+#~ msgstr "Collegato a Ultimaker Cloud"
+
+#~ msgctxt "@info"
+#~ msgid "Cura collects anonymized usage statistics."
+#~ msgstr "Cura raccoglie statistiche di utilizzo in forma anonima."
+
+#~ msgctxt "@info:title"
+#~ msgid "Collecting Data"
+#~ msgstr "Acquisizione dati"
+
+#~ msgctxt "@action:button"
+#~ msgid "More info"
+#~ msgstr "Per saperne di più"
+
+#~ msgctxt "@action:tooltip"
+#~ msgid "See more information on what data Cura sends."
+#~ msgstr "Vedere ulteriori informazioni sui dati inviati da Cura."
+
+#~ msgctxt "@action:button"
+#~ msgid "Allow"
+#~ msgstr "Consenti"
+
+#~ msgctxt "@action:tooltip"
+#~ msgid "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."
+#~ msgstr "Consente a Cura di inviare in forma anonima statistiche d’uso, riguardanti alcune delle preferenze e impostazioni, la versione cura e una serie di modelli in sezionamento, per aiutare a dare priorità a miglioramenti futuri in Cura."
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Evaluation"
+#~ msgstr "Valutazione"
+
+#~ msgctxt "@info:title"
+#~ msgid "Network enabled printers"
+#~ msgstr "Stampanti abilitate per la rete"
+
+#~ msgctxt "@info:title"
+#~ msgid "Local printers"
+#~ msgstr "Stampanti locali"
+
+#~ msgctxt "@info:backup_failed"
+#~ msgid "Tried to restore a Cura backup that does not match your current version."
+#~ msgstr "Tentativo di ripristinare un backup di Cura non corrispondente alla versione corrente."
+
+#~ msgctxt "@title"
+#~ msgid "Machine Settings"
+#~ msgstr "Impostazioni macchina"
+
+#~ msgctxt "@label"
+#~ msgid "Printer Settings"
+#~ msgstr "Impostazioni della stampante"
+
+#~ msgctxt "@option:check"
+#~ msgid "Origin at center"
+#~ msgstr "Origine al centro"
+
+#~ msgctxt "@option:check"
+#~ msgid "Heated bed"
+#~ msgstr "Piano riscaldato"
+
+#~ msgctxt "@label"
+#~ msgid "Printhead Settings"
+#~ msgstr "Impostazioni della testina di stampa"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Distanza tra il lato sinistro della testina di stampa e il centro dell'ugello. Utilizzata per evitare collisioni tra le stampe precedenti e la testina di stampa durante la stampa \"Uno alla volta\"."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Distanza tra il lato anteriore della testina di stampa e il centro dell'ugello. Utilizzata per evitare collisioni tra le stampe precedenti e la testina di stampa durante la stampa \"Uno alla volta\"."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Distanza tra il lato destro della testina di stampa e il centro dell'ugello. Utilizzata per evitare collisioni tra le stampe precedenti e la testina di stampa durante la stampa \"Uno alla volta\"."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "Distanza tra il lato posteriore della testina di stampa e il centro dell'ugello. Utilizzata per evitare collisioni tra le stampe precedenti e la testina di stampa durante la stampa \"Uno alla volta\"."
+
+#~ msgctxt "@label"
+#~ msgid "Gantry height"
+#~ msgstr "Altezza gantry"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "La differenza di altezza tra la punta dell’ugello e il sistema gantry (assi X e Y). Utilizzata per evitare collisioni tra le stampe precedenti e il gantry durante la stampa \"Uno alla volta\"."
+
+#~ msgctxt "@label"
+#~ msgid "Start G-code"
+#~ msgstr "Codice G avvio"
+
+#~ msgctxt "@tooltip"
+#~ msgid "G-code commands to be executed at the very start."
+#~ msgstr "Comandi codice G da eseguire all’avvio."
+
+#~ msgctxt "@label"
+#~ msgid "End G-code"
+#~ msgstr "Codice G fine"
+
+#~ msgctxt "@tooltip"
+#~ msgid "G-code commands to be executed at the very end."
+#~ msgstr "Comandi codice G da eseguire alla fine."
+
+#~ msgctxt "@label"
+#~ msgid "Nozzle Settings"
+#~ msgstr "Impostazioni ugello"
+
+#~ msgctxt "@tooltip"
+#~ msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile."
+#~ msgstr "Diametro nominale del filamento supportato dalla stampante. Il diametro esatto verrà sovrapposto dal materiale e/o dal profilo."
+
+#~ msgctxt "@label"
+#~ msgid "Extruder Start G-code"
+#~ msgstr "Codice G avvio estrusore"
+
+#~ msgctxt "@label"
+#~ msgid "Extruder End G-code"
+#~ msgstr "Codice G fine estrusore"
+
+#~ msgctxt "@label"
+#~ msgid "Changelog"
+#~ msgstr "Registro modifiche"
+
+#~ msgctxt "@title:window"
+#~ msgid "User Agreement"
+#~ msgstr "Contratto di licenza"
+
+#~ msgctxt "@alabel"
+#~ msgid "Enter the IP address or hostname of your printer on the network."
+#~ msgstr "Inserire l’indirizzo IP o l’hostname della stampante sulla rete."
+
+#~ msgctxt "@info"
+#~ msgid "Please select a network connected printer to monitor."
+#~ msgstr "Selezionare una stampante collegata alla rete per controllare."
+
+#~ msgctxt "@info"
+#~ msgid "Please connect your Ultimaker printer to your local network."
+#~ msgstr "Collegare la stampante Ultimaker alla rete locale."
+
+#~ msgctxt "@text:window"
+#~ msgid "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."
+#~ msgstr "Cura invia dati anonimi ad Ultimaker per migliorare la qualità di stampa e l'esperienza dell'utente. Di seguito è riportato un esempio dei dati inviati."
+
+#~ msgctxt "@text:window"
+#~ msgid "I don't want to send this data"
+#~ msgstr "Non desidero inviare questi dati"
+
+#~ msgctxt "@text:window"
+#~ msgid "Allow sending this data to Ultimaker and help us improve Cura"
+#~ msgstr "Consenti l’invio di questi dati ad Ultimaker e aiutaci ad ottimizzare Cura"
+
+#~ msgctxt "@label"
+#~ msgid "No print selected"
+#~ msgstr "Nessuna stampante selezionata"
+
+#~ msgctxt "@info:tooltip"
+#~ msgid "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."
+#~ msgstr "Per impostazione predefinita, i pixel bianchi rappresentano i punti alti sulla griglia, mentre i pixel neri rappresentano i punti bassi sulla griglia. Modificare questa opzione per invertire la situazione in modo tale che i pixel neri rappresentino i punti alti sulla griglia e i pixel bianchi rappresentino i punti bassi."
+
+#~ msgctxt "@title"
+#~ msgid "Select Printer Upgrades"
+#~ msgstr "Seleziona gli aggiornamenti della stampante"
+
+#~ msgctxt "@label"
+#~ msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air."
+#~ msgstr "Seleziona l’estrusore da utilizzare per la stampa di strutture di supporto. Ciò consentirà di costruire strutture di supporto sotto il modello per evitare cedimenti del modello o di stampare a mezz'aria."
+
+#~ 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 "Questo profilo di qualità non è disponibile per il materiale e la configurazione ugello corrente. Modificarli per abilitare questo profilo di qualità"
+
+#~ msgctxt "@label shown when we load a Gcode file"
+#~ msgid "Print setup disabled. G code file can not be modified."
+#~ msgstr "Impostazione di stampa disabilitata. Impossibile modificare il file codice G."
+
+#~ msgctxt "@label"
+#~ msgid "See the material compatibility chart"
+#~ msgstr "Vedere il grafico di compatibilità dei materiali"
+
+#~ msgctxt "@label"
+#~ msgid "View types"
+#~ msgstr "Visualizza tipi"
+
+#~ msgctxt "@label"
+#~ msgid "Hi "
+#~ msgstr "Ciao "
+
+#~ msgctxt "@text"
+#~ 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 ""
+#~ "- 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"
+
+#~ msgctxt "@label:PrintjobStatus"
+#~ msgid "Unable to Slice"
+#~ msgstr "Sezionamento impossibile"
+
+#~ msgctxt "@label"
+#~ msgid "Time specification"
+#~ msgstr "Indicazioni di tempo"
+
+#~ msgctxt "@label"
+#~ msgid "Material specification"
+#~ msgstr "Specifiche materiale"
+
+#~ msgctxt "@title:tab"
+#~ msgid "Add a printer to Cura"
+#~ msgstr "Aggiungi una stampante a Cura"
+
+#~ msgctxt "@title:tab"
+#~ 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 ""
+#~ "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."
+
+#~ msgctxt "@label"
+#~ msgid "Manufacturer"
+#~ msgstr "Produttore"
+
+#~ msgctxt "@label"
+#~ msgid "Printer Name"
+#~ msgstr "Nome stampante"
+
+#~ msgctxt "@action:button"
+#~ msgid "Add Printer"
+#~ msgstr "Aggiungi stampante"
#~ msgid "Modify G-Code"
#~ msgstr "Modifica G-code"
@@ -5337,62 +6252,6 @@ msgstr "X3GWriter"
#~ msgid "Click to check the material compatibility on Ultimaker.com."
#~ msgstr "Fai clic per verificare la compatibilità del materiale su Ultimaker.com."
-#~ msgctxt "description"
-#~ msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)."
-#~ msgstr "Fornisce un modo per modificare le impostazioni della macchina (come il volume di stampa, la dimensione ugello, ecc.)"
-
-#~ msgctxt "name"
-#~ msgid "Machine Settings action"
-#~ msgstr "Azione Impostazioni macchina"
-
-#~ msgctxt "description"
-#~ msgid "Find, manage and install new Cura packages."
-#~ msgstr "Trova, gestisce ed installa nuovi pacchetti Cura."
-
-#~ msgctxt "name"
-#~ msgid "Toolbox"
-#~ msgstr "Casella degli strumenti"
-
-#~ msgctxt "description"
-#~ msgid "Provides the X-Ray view."
-#~ msgstr "Fornisce la vista a raggi X."
-
-#~ msgctxt "name"
-#~ msgid "X-Ray View"
-#~ msgstr "Vista ai raggi X"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for reading X3D files."
-#~ msgstr "Fornisce il supporto per la lettura di file X3D."
-
-#~ msgctxt "name"
-#~ msgid "X3D Reader"
-#~ msgstr "Lettore X3D"
-
-#~ msgctxt "description"
-#~ msgid "Writes g-code to a file."
-#~ msgstr "Scrive il codice G in un file."
-
-#~ msgctxt "name"
-#~ msgid "G-code Writer"
-#~ msgstr "Writer codice G"
-
-#~ msgctxt "description"
-#~ msgid "Checks models and print configuration for possible printing issues and give suggestions."
-#~ msgstr "Controlla i modelli e la configurazione di stampa per eventuali problematiche di stampa e suggerimenti."
-
-#~ msgctxt "name"
-#~ msgid "Model Checker"
-#~ msgstr "Controllo modello"
-
-#~ msgctxt "description"
-#~ msgid "Dump the contents of all settings to a HTML file."
-#~ msgstr "Scarica contenuto di tutte le impostazioni in un file HTML."
-
-#~ msgctxt "name"
-#~ msgid "God Mode"
-#~ msgstr "Modalità God"
-
#~ msgctxt "description"
#~ msgid "Shows changes since latest checked version."
#~ msgstr "Mostra le modifiche dall'ultima versione selezionata."
@@ -5401,14 +6260,6 @@ msgstr "X3GWriter"
#~ msgid "Changelog"
#~ msgstr "Registro modifiche"
-#~ msgctxt "description"
-#~ msgid "Provides a machine actions for updating firmware."
-#~ msgstr "Fornisce azioni macchina per l’aggiornamento del firmware."
-
-#~ msgctxt "name"
-#~ msgid "Firmware Updater"
-#~ msgstr "Aggiornamento firmware"
-
#~ msgctxt "description"
#~ msgid "Create a flattend quality changes profile."
#~ msgstr "Crea un profilo appiattito."
@@ -5417,14 +6268,6 @@ msgstr "X3GWriter"
#~ msgid "Profile flatener"
#~ msgstr "Appiattitore di profilo"
-#~ msgctxt "description"
-#~ msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware."
-#~ msgstr "Accetta i G-Code e li invia ad una stampante. I plugin possono anche aggiornare il firmware."
-
-#~ msgctxt "name"
-#~ msgid "USB printing"
-#~ msgstr "Stampa USB"
-
#~ msgctxt "description"
#~ msgid "Ask the user once if he/she agrees with our license."
#~ msgstr "Chiedere una volta all'utente se accetta la nostra licenza."
@@ -5433,278 +6276,6 @@ msgstr "X3GWriter"
#~ msgid "UserAgreement"
#~ msgstr "Contratto di licenza"
-#~ msgctxt "description"
-#~ msgid "Writes g-code to a compressed archive."
-#~ msgstr "Scrive il codice G in un archivio compresso."
-
-#~ msgctxt "name"
-#~ msgid "Compressed G-code Writer"
-#~ msgstr "Writer codice G compresso"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for writing Ultimaker Format Packages."
-#~ msgstr "Fornisce il supporto per la scrittura di pacchetti formato Ultimaker."
-
-#~ msgctxt "name"
-#~ msgid "UFP Writer"
-#~ msgstr "Writer UFP"
-
-#~ msgctxt "description"
-#~ msgid "Provides a prepare stage in Cura."
-#~ msgstr "Fornisce una fase di preparazione in Cura."
-
-#~ msgctxt "name"
-#~ msgid "Prepare Stage"
-#~ msgstr "Fase di preparazione"
-
-#~ msgctxt "description"
-#~ msgid "Provides removable drive hotplugging and writing support."
-#~ msgstr "Fornisce il collegamento a caldo dell'unità rimovibile e il supporto per la scrittura."
-
-#~ msgctxt "name"
-#~ msgid "Removable Drive Output Device Plugin"
-#~ msgstr "Plugin dispositivo di output unità rimovibile"
-
-#~ msgctxt "description"
-#~ msgid "Manages network connections to Ultimaker 3 printers."
-#~ msgstr "Gestisce le connessioni di rete alle stampanti Ultimaker 3."
-
-#~ msgctxt "name"
-#~ msgid "UM3 Network Connection"
-#~ msgstr "Connessione di rete UM3"
-
-#~ msgctxt "description"
-#~ msgid "Provides a monitor stage in Cura."
-#~ msgstr "Fornisce una fase di controllo in Cura."
-
-#~ msgctxt "name"
-#~ msgid "Monitor Stage"
-#~ msgstr "Fase di controllo"
-
-#~ msgctxt "description"
-#~ msgid "Checks for firmware updates."
-#~ msgstr "Controlla disponibilità di aggiornamenti firmware."
-
-#~ msgctxt "name"
-#~ msgid "Firmware Update Checker"
-#~ msgstr "Controllo aggiornamento firmware"
-
-#~ msgctxt "description"
-#~ msgid "Provides the Simulation view."
-#~ msgstr "Fornisce la vista di simulazione."
-
-#~ msgctxt "name"
-#~ msgid "Simulation View"
-#~ msgstr "Vista simulazione"
-
-#~ msgctxt "description"
-#~ msgid "Reads g-code from a compressed archive."
-#~ msgstr "Legge il codice G da un archivio compresso."
-
-#~ msgctxt "name"
-#~ msgid "Compressed G-code Reader"
-#~ msgstr "Lettore codice G compresso"
-
-#~ msgctxt "description"
-#~ msgid "Extension that allows for user created scripts for post processing"
-#~ msgstr "Estensione che consente la post-elaborazione degli script creati da utente"
-
-#~ msgctxt "name"
-#~ msgid "Post Processing"
-#~ msgstr "Post-elaborazione"
-
-#~ msgctxt "description"
-#~ msgid "Creates an eraser mesh to block the printing of support in certain places"
-#~ msgstr "Crea una maglia di cancellazione per bloccare la stampa del supporto in alcune posizioni"
-
-#~ msgctxt "name"
-#~ msgid "Support Eraser"
-#~ msgstr "Cancellazione supporto"
-
-#~ msgctxt "description"
-#~ msgid "Submits anonymous slice info. Can be disabled through preferences."
-#~ msgstr "Invia informazioni su sezionamento anonime Può essere disabilitato tramite le preferenze."
-
-#~ msgctxt "name"
-#~ msgid "Slice info"
-#~ msgstr "Informazioni su sezionamento"
-
-#~ msgctxt "description"
-#~ msgid "Provides capabilities to read and write XML-based material profiles."
-#~ msgstr "Offre la possibilità di leggere e scrivere profili di materiali basati su XML."
-
-#~ msgctxt "name"
-#~ msgid "Material Profiles"
-#~ msgstr "Profili del materiale"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing profiles from legacy Cura versions."
-#~ msgstr "Fornisce supporto per l'importazione di profili dalle versioni legacy Cura."
-
-#~ msgctxt "name"
-#~ msgid "Legacy Cura Profile Reader"
-#~ msgstr "Lettore legacy profilo Cura"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing profiles from g-code files."
-#~ msgstr "Fornisce supporto per l'importazione di profili da file G-Code."
-
-#~ msgctxt "name"
-#~ msgid "G-code Profile Reader"
-#~ msgstr "Lettore profilo codice G"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.2 to Cura 3.3."
-#~ msgstr "Aggiorna le configurazioni da Cura 3.2 a Cura 3.3."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.2 to 3.3"
-#~ msgstr "Aggiornamento della versione da 3.2 a 3.3"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.3 to Cura 3.4."
-#~ msgstr "Aggiorna le configurazioni da Cura 3.3 a Cura 3.4."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.3 to 3.4"
-#~ msgstr "Aggiornamento della versione da 3.3 a 3.4"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
-#~ msgstr "Aggiorna le configurazioni da Cura 2.5 a Cura 2.6."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.5 to 2.6"
-#~ msgstr "Aggiornamento della versione da 2.5 a 2.6"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
-#~ msgstr "Aggiorna le configurazioni da Cura 2.7 a Cura 3.0."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.7 to 3.0"
-#~ msgstr "Aggiornamento della versione da 2.7 a 3.0"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.4 to Cura 3.5."
-#~ msgstr "Aggiorna le configurazioni da Cura 3.4 a Cura 3.5."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.4 to 3.5"
-#~ msgstr "Aggiornamento della versione da 3.4 a 3.5"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.0 to Cura 3.1."
-#~ msgstr "Aggiorna le configurazioni da Cura 3.0 a Cura 3.1."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.0 to 3.1"
-#~ msgstr "Aggiornamento della versione da 3.0 a 3.1"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
-#~ msgstr "Aggiorna le configurazioni da Cura 2.6 a Cura 2.7."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.6 to 2.7"
-#~ msgstr "Aggiornamento della versione da 2.6 a 2.7"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
-#~ msgstr "Aggiorna le configurazioni da Cura 2.1 a Cura 2.2."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.1 to 2.2"
-#~ msgstr "Aggiornamento della versione da 2.1 a 2.2"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
-#~ msgstr "Aggiorna le configurazioni da Cura 2.2 a Cura 2.4."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.2 to 2.4"
-#~ msgstr "Aggiornamento della versione da 2.2 a 2.4"
-
-#~ msgctxt "description"
-#~ msgid "Enables ability to generate printable geometry from 2D image files."
-#~ msgstr "Abilita la possibilità di generare geometria stampabile da file immagine 2D."
-
-#~ msgctxt "name"
-#~ msgid "Image Reader"
-#~ msgstr "Lettore di immagine"
-
-#~ msgctxt "description"
-#~ msgid "Provides the link to the CuraEngine slicing backend."
-#~ msgstr "Fornisce il collegamento al back-end di sezionamento CuraEngine."
-
-#~ msgctxt "name"
-#~ msgid "CuraEngine Backend"
-#~ msgstr "Back-end CuraEngine"
-
-#~ msgctxt "description"
-#~ msgid "Provides the Per Model Settings."
-#~ msgstr "Fornisce le impostazioni per modello."
-
-#~ msgctxt "name"
-#~ msgid "Per Model Settings Tool"
-#~ msgstr "Utilità impostazioni per modello"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for reading 3MF files."
-#~ msgstr "Fornisce il supporto per la lettura di file 3MF."
-
-#~ msgctxt "name"
-#~ msgid "3MF Reader"
-#~ msgstr "Lettore 3MF"
-
-#~ msgctxt "description"
-#~ msgid "Provides a normal solid mesh view."
-#~ msgstr "Fornisce una normale visualizzazione a griglia compatta."
-
-#~ msgctxt "name"
-#~ msgid "Solid View"
-#~ msgstr "Visualizzazione compatta"
-
-#~ msgctxt "description"
-#~ msgid "Allows loading and displaying G-code files."
-#~ msgstr "Consente il caricamento e la visualizzazione dei file codice G."
-
-#~ msgctxt "name"
-#~ msgid "G-code Reader"
-#~ msgstr "Lettore codice G"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for exporting Cura profiles."
-#~ msgstr "Fornisce supporto per l'esportazione dei profili Cura."
-
-#~ msgctxt "name"
-#~ msgid "Cura Profile Writer"
-#~ msgstr "Writer profilo Cura"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for writing 3MF files."
-#~ msgstr "Fornisce il supporto per la scrittura di file 3MF."
-
-#~ msgctxt "name"
-#~ msgid "3MF Writer"
-#~ msgstr "Writer 3MF"
-
-#~ msgctxt "description"
-#~ msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)."
-#~ msgstr "Fornisce azioni macchina per le macchine Ultimaker (come la procedura guidata di livellamento del piano di stampa, la selezione degli aggiornamenti, ecc.)"
-
-#~ msgctxt "name"
-#~ msgid "Ultimaker machine actions"
-#~ msgstr "Azioni della macchina Ultimaker"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing Cura profiles."
-#~ msgstr "Fornisce supporto per l'importazione dei profili Cura."
-
-#~ msgctxt "name"
-#~ msgid "Cura Profile Reader"
-#~ msgstr "Lettore profilo Cura"
-
#~ msgctxt "@warning:status"
#~ msgid "Please generate G-code before saving."
#~ msgstr "Generare il codice G prima di salvare."
@@ -5745,14 +6316,6 @@ msgstr "X3GWriter"
#~ msgid "Upgrade Firmware"
#~ msgstr "Aggiorna firmware"
-#~ msgctxt "description"
-#~ msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI."
-#~ msgstr "Consente ai produttori di materiali di creare nuovi profili materiale e di qualità utilizzando una UI drop-in."
-
-#~ msgctxt "name"
-#~ msgid "Print Profile Assistant"
-#~ msgstr "Assistente profilo di stampa"
-
#~ msgctxt "@action:button"
#~ msgid "Print with Doodle3D WiFi-Box"
#~ msgstr "Stampa con Doodle3D WiFi-Box"
diff --git a/resources/i18n/it_IT/fdmextruder.def.json.po b/resources/i18n/it_IT/fdmextruder.def.json.po
index f3b5484cbf..79562add8e 100644
--- a/resources/i18n/it_IT/fdmextruder.def.json.po
+++ b/resources/i18n/it_IT/fdmextruder.def.json.po
@@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0000\n"
+"POT-Creation-Date: 2019-07-16 14:38+0000\n"
"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Italian\n"
diff --git a/resources/i18n/it_IT/fdmprinter.def.json.po b/resources/i18n/it_IT/fdmprinter.def.json.po
index 6a377af9a2..ace590cbfb 100644
--- a/resources/i18n/it_IT/fdmprinter.def.json.po
+++ b/resources/i18n/it_IT/fdmprinter.def.json.po
@@ -5,12 +5,12 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2019-03-13 14:00+0200\n"
-"Last-Translator: Bothof \n"
-"Language-Team: Italian\n"
+"POT-Creation-Date: 2019-07-16 14:38+0000\n"
+"PO-Revision-Date: 2019-07-29 15:51+0200\n"
+"Last-Translator: Lionbridge \n"
+"Language-Team: Italian , Italian \n"
"Language: it_IT\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -57,7 +57,9 @@ 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"
@@ -69,7 +71,9 @@ 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"
@@ -233,7 +237,7 @@ msgstr "Il numero di treni di estrusori. Un treno di estrusori è la combinazion
#: fdmprinter.def.json
msgctxt "extruders_enabled_count label"
-msgid "Number of Extruders that are enabled"
+msgid "Number of Extruders That Are Enabled"
msgstr "Numero di estrusori abilitati"
#: fdmprinter.def.json
@@ -243,7 +247,7 @@ msgstr "Numero di treni di estrusori abilitati; impostato automaticamente nel so
#: fdmprinter.def.json
msgctxt "machine_nozzle_tip_outer_diameter label"
-msgid "Outer nozzle diameter"
+msgid "Outer Nozzle Diameter"
msgstr "Diametro esterno ugello"
#: fdmprinter.def.json
@@ -253,7 +257,7 @@ msgstr "Il diametro esterno della punta dell'ugello."
#: fdmprinter.def.json
msgctxt "machine_nozzle_head_distance label"
-msgid "Nozzle length"
+msgid "Nozzle Length"
msgstr "Lunghezza ugello"
#: fdmprinter.def.json
@@ -263,7 +267,7 @@ msgstr "La differenza di altezza tra la punta dell’ugello e la parte inferiore
#: fdmprinter.def.json
msgctxt "machine_nozzle_expansion_angle label"
-msgid "Nozzle angle"
+msgid "Nozzle Angle"
msgstr "Angolo ugello"
#: fdmprinter.def.json
@@ -273,7 +277,7 @@ msgstr "L’angolo tra il piano orizzontale e la parte conica esattamente sopra
#: fdmprinter.def.json
msgctxt "machine_heat_zone_length label"
-msgid "Heat zone length"
+msgid "Heat Zone Length"
msgstr "Lunghezza della zona di riscaldamento"
#: fdmprinter.def.json
@@ -303,7 +307,7 @@ msgstr "Per controllare la temperatura da Cura. Disattivare per controllare la t
#: fdmprinter.def.json
msgctxt "machine_nozzle_heat_up_speed label"
-msgid "Heat up speed"
+msgid "Heat Up Speed"
msgstr "Velocità di riscaldamento"
#: fdmprinter.def.json
@@ -313,7 +317,7 @@ msgstr "La velocità (°C/s) alla quale l’ugello si riscalda calcolando la med
#: fdmprinter.def.json
msgctxt "machine_nozzle_cool_down_speed label"
-msgid "Cool down speed"
+msgid "Cool Down Speed"
msgstr "Velocità di raffreddamento"
#: fdmprinter.def.json
@@ -333,8 +337,8 @@ msgstr "Il tempo minimo in cui un estrusore deve essere inattivo prima che l’u
#: fdmprinter.def.json
msgctxt "machine_gcode_flavor label"
-msgid "G-code flavour"
-msgstr "Tipo di codice G"
+msgid "G-code Flavor"
+msgstr "Versione codice G"
#: fdmprinter.def.json
msgctxt "machine_gcode_flavor description"
@@ -398,7 +402,7 @@ msgstr "Specifica se usare comandi di retrazione firmware (G10/G11) anziché uti
#: fdmprinter.def.json
msgctxt "machine_disallowed_areas label"
-msgid "Disallowed areas"
+msgid "Disallowed Areas"
msgstr "Aree non consentite"
#: fdmprinter.def.json
@@ -418,7 +422,7 @@ msgstr "Un elenco di poligoni con aree alle quali l’ugello non può accedere."
#: fdmprinter.def.json
msgctxt "machine_head_polygon label"
-msgid "Machine head polygon"
+msgid "Machine Head Polygon"
msgstr "Poligono testina macchina"
#: fdmprinter.def.json
@@ -428,7 +432,7 @@ msgstr "Una silhouette 2D della testina di stampa (cappucci ventola esclusi)."
#: fdmprinter.def.json
msgctxt "machine_head_with_fans_polygon label"
-msgid "Machine head & Fan polygon"
+msgid "Machine Head & Fan Polygon"
msgstr "Poligono testina macchina e ventola"
#: fdmprinter.def.json
@@ -438,7 +442,7 @@ msgstr "Una silhouette 2D della testina di stampa (cappucci ventola inclusi)."
#: fdmprinter.def.json
msgctxt "gantry_height label"
-msgid "Gantry height"
+msgid "Gantry Height"
msgstr "Altezza gantry"
#: fdmprinter.def.json
@@ -468,7 +472,7 @@ msgstr "Il diametro interno dell’ugello. Modificare questa impostazione quando
#: fdmprinter.def.json
msgctxt "machine_use_extruder_offset_to_offset_coords label"
-msgid "Offset With Extruder"
+msgid "Offset with Extruder"
msgstr "Offset con estrusore"
#: fdmprinter.def.json
@@ -1293,8 +1297,11 @@ msgstr "Preferenze angolo giunzione"
#: fdmprinter.def.json
msgctxt "z_seam_corner description"
-msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner."
-msgstr "Controlla se gli angoli sul profilo del modello influenzano la posizione della giunzione. Nessuno significa che gli angoli non hanno alcuna influenza sulla posizione della giunzione. Nascondi giunzione favorisce la presenza della giunzione su un angolo interno. Esponi giunzione favorisce la presenza della giunzione su un angolo esterno. Nascondi o esponi giunzione favorisce la presenza della giunzione su un angolo interno o esterno."
+msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner. Smart Hiding allows both inside and outside corners, but chooses inside corners more frequently, if appropriate."
+msgstr "Controlla se gli angoli sul profilo del modello influenzano la posizione della giunzione. Nessuno significa che gli angoli non hanno alcuna influenza sulla"
+" posizione della giunzione. Nascondi giunzione favorisce la presenza della giunzione su un angolo interno. Esponi giunzione favorisce la presenza della"
+" giunzione su un angolo esterno. Nascondi o esponi giunzione favorisce la presenza della giunzione su un angolo interno o esterno. Smart Hiding consente"
+" sia gli angoli interni che quelli esterni ma sceglie con maggiore frequenza gli angoli interni, se opportuno."
#: fdmprinter.def.json
msgctxt "z_seam_corner option z_seam_corner_none"
@@ -1316,6 +1323,11 @@ msgctxt "z_seam_corner option z_seam_corner_any"
msgid "Hide or Expose Seam"
msgstr "Nascondi o esponi giunzione"
+#: fdmprinter.def.json
+msgctxt "z_seam_corner option z_seam_corner_weighted"
+msgid "Smart Hiding"
+msgstr "Occultamento intelligente"
+
#: fdmprinter.def.json
msgctxt "z_seam_relative label"
msgid "Z Seam Relative"
@@ -1328,13 +1340,15 @@ msgstr "Se abilitato, le coordinate della giunzione Z sono riferite al centro di
#: fdmprinter.def.json
msgctxt "skin_no_small_gaps_heuristic label"
-msgid "Ignore Small Z Gaps"
-msgstr "Ignora i piccoli interstizi a Z"
+msgid "No Skin in Z Gaps"
+msgstr "Nessun rivest. est. negli interstizi a Z"
#: fdmprinter.def.json
msgctxt "skin_no_small_gaps_heuristic description"
-msgid "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting."
-msgstr "Quando il modello presenta piccoli spazi vuoti verticali, circa il 5% del tempo di calcolo supplementare può essere utilizzato per la generazione di rivestimenti esterni superiori ed inferiori in questi interstizi. In questo caso disabilitare l’impostazione."
+msgid "When the model has small vertical gaps of only a few layers, there should normally be skin around those layers in the narrow space. Enable this setting to not generate skin if the vertical gap is very small. This improves printing time and slicing time, but technically leaves infill exposed to the air."
+msgstr "Quando il modello presenta piccoli spazi vuoti verticali composti da un numero ridotto di strati, intorno a questi strati di norma dovrebbe essere presente"
+" un rivestimento esterno nell'interstizio. Abilitare questa impostazione per non generare il rivestimento esterno se l'interstizio verticale è molto piccolo."
+" Ciò consente di migliorare il tempo di stampa e il tempo di sezionamento, ma dal punto di vista tecnico lascia il riempimento esposto all'aria."
#: fdmprinter.def.json
msgctxt "skin_outline_count label"
@@ -1631,7 +1645,9 @@ 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.\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."
+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."
#: fdmprinter.def.json
msgctxt "sub_div_rad_add label"
@@ -1863,6 +1879,16 @@ msgctxt "default_material_print_temperature description"
msgid "The default temperature used for printing. This should be the \"base\" temperature of a material. All other print temperatures should use offsets based on this value"
msgstr "La temperatura preimpostata utilizzata per la stampa. Deve essere la temperatura “base” di un materiale. Tutte le altre temperature di stampa devono usare scostamenti basati su questo valore"
+#: fdmprinter.def.json
+msgctxt "build_volume_temperature label"
+msgid "Build Volume Temperature"
+msgstr "Temperatura volume di stampa"
+
+#: fdmprinter.def.json
+msgctxt "build_volume_temperature description"
+msgid "The temperature of the environment to print in. If this is 0, the build volume temperature will not be adjusted."
+msgstr "La temperatura dell'ambiente in cui stampare. Se il valore è 0, la temperatura del volume di stampa non verrà regolata."
+
#: fdmprinter.def.json
msgctxt "material_print_temperature label"
msgid "Printing Temperature"
@@ -1973,6 +1999,87 @@ msgctxt "material_shrinkage_percentage description"
msgid "Shrinkage ratio in percentage."
msgstr "Il tasso di contrazione in percentuale."
+#: fdmprinter.def.json
+msgctxt "material_crystallinity label"
+msgid "Crystalline Material"
+msgstr "Materiale cristallino"
+
+#: fdmprinter.def.json
+msgctxt "material_crystallinity description"
+msgid "Is this material the type that breaks off cleanly when heated (crystalline), or is it the type that produces long intertwined polymer chains (non-crystalline)?"
+msgstr "Questo tipo di materiale è quello che si stacca in modo netto quando viene riscaldato (cristallino) oppure è il tipo che produce lunghe catene di polimeri"
+" intrecciati (non cristallino)?"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retracted_position label"
+msgid "Anti-ooze Retracted Position"
+msgstr "Posizione retratta anti fuoriuscita di materiale"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retracted_position description"
+msgid "How far the material needs to be retracted before it stops oozing."
+msgstr "La distanza alla quale deve essere retratto il materiale prima che smetta di fuoriuscire."
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retraction_speed label"
+msgid "Anti-ooze Retraction Speed"
+msgstr "Velocità di retrazione anti fuoriuscita del materiale"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retraction_speed description"
+msgid "How fast the material needs to be retracted during a filament switch to prevent oozing."
+msgstr "La velocità a cui deve essere retratto il materiale durante un cambio di filamento per evitare la fuoriuscita di materiale."
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_retracted_position label"
+msgid "Break Preparation Retracted Position"
+msgstr "Posizione di retrazione prima della rottura"
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_retracted_position description"
+msgid "How far the filament can be stretched before it breaks, while heated."
+msgstr "La lunghezza massima di estensione del filamento prima che si rompa durante il riscaldamento."
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_speed label"
+msgid "Break Preparation Retraction Speed"
+msgstr "Velocità di retrazione prima della rottura"
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_speed description"
+msgid "How fast the filament needs to be retracted just before breaking it off in a retraction."
+msgstr "La velocità massima di retrazione del filamento prima che si rompa durante questa operazione."
+
+#: fdmprinter.def.json
+msgctxt "material_break_retracted_position label"
+msgid "Break Retracted Position"
+msgstr "Posizione di retrazione per la rottura"
+
+#: fdmprinter.def.json
+msgctxt "material_break_retracted_position description"
+msgid "How far to retract the filament in order to break it cleanly."
+msgstr "La distanza di retrazione del filamento al fine di consentirne la rottura netta."
+
+#: fdmprinter.def.json
+msgctxt "material_break_speed label"
+msgid "Break Retraction Speed"
+msgstr "Velocità di retrazione per la rottura"
+
+#: fdmprinter.def.json
+msgctxt "material_break_speed description"
+msgid "The speed at which to retract the filament in order to break it cleanly."
+msgstr "La velocità alla quale retrarre il filamento al fine di romperlo in modo netto."
+
+#: fdmprinter.def.json
+msgctxt "material_break_temperature label"
+msgid "Break Temperature"
+msgstr "Temperatura di rottura"
+
+#: fdmprinter.def.json
+msgctxt "material_break_temperature description"
+msgid "The temperature at which the filament is broken for a clean break."
+msgstr "La temperatura a cui il filamento viene rotto, con una rottura netta."
+
#: fdmprinter.def.json
msgctxt "material_flow label"
msgid "Flow"
@@ -1983,6 +2090,126 @@ msgctxt "material_flow description"
msgid "Flow compensation: the amount of material extruded is multiplied by this value."
msgstr "Determina la compensazione del flusso: la quantità di materiale estruso viene moltiplicata per questo valore."
+#: fdmprinter.def.json
+msgctxt "wall_material_flow label"
+msgid "Wall Flow"
+msgstr "Flusso della parete"
+
+#: fdmprinter.def.json
+msgctxt "wall_material_flow description"
+msgid "Flow compensation on wall lines."
+msgstr "Compensazione del flusso sulle linee perimetrali."
+
+#: fdmprinter.def.json
+msgctxt "wall_0_material_flow label"
+msgid "Outer Wall Flow"
+msgstr "Flusso della parete esterna"
+
+#: fdmprinter.def.json
+msgctxt "wall_0_material_flow description"
+msgid "Flow compensation on the outermost wall line."
+msgstr "Compensazione del flusso sulla linea perimetrale più esterna."
+
+#: fdmprinter.def.json
+msgctxt "wall_x_material_flow label"
+msgid "Inner Wall(s) Flow"
+msgstr "Flusso pareti interne"
+
+#: fdmprinter.def.json
+msgctxt "wall_x_material_flow description"
+msgid "Flow compensation on wall lines for all wall lines except the outermost one."
+msgstr "Compensazione del flusso sulle linee perimetrali per tutte le linee perimetrali tranne quella più esterna."
+
+#: fdmprinter.def.json
+msgctxt "skin_material_flow label"
+msgid "Top/Bottom Flow"
+msgstr "Flusso superiore/inferiore"
+
+#: fdmprinter.def.json
+msgctxt "skin_material_flow description"
+msgid "Flow compensation on top/bottom lines."
+msgstr "Compensazione del flusso sulle linee superiore/inferiore."
+
+#: fdmprinter.def.json
+msgctxt "roofing_material_flow label"
+msgid "Top Surface Skin Flow"
+msgstr "Flusso rivestimento esterno superficie superiore"
+
+#: fdmprinter.def.json
+msgctxt "roofing_material_flow description"
+msgid "Flow compensation on lines of the areas at the top of the print."
+msgstr "Compensazione del flusso sulle linee delle aree nella parte superiore della stampa."
+
+#: fdmprinter.def.json
+msgctxt "infill_material_flow label"
+msgid "Infill Flow"
+msgstr "Flusso di riempimento"
+
+#: fdmprinter.def.json
+msgctxt "infill_material_flow description"
+msgid "Flow compensation on infill lines."
+msgstr "Compensazione del flusso sulle linee di riempimento."
+
+#: fdmprinter.def.json
+msgctxt "skirt_brim_material_flow label"
+msgid "Skirt/Brim Flow"
+msgstr "Flusso dello skirt/brim"
+
+#: fdmprinter.def.json
+msgctxt "skirt_brim_material_flow description"
+msgid "Flow compensation on skirt or brim lines."
+msgstr "Compensazione del flusso sulle linee dello skirt o del brim."
+
+#: fdmprinter.def.json
+msgctxt "support_material_flow label"
+msgid "Support Flow"
+msgstr "Flusso del supporto"
+
+#: fdmprinter.def.json
+msgctxt "support_material_flow description"
+msgid "Flow compensation on support structure lines."
+msgstr "Compensazione del flusso sulle linee di supporto."
+
+#: fdmprinter.def.json
+msgctxt "support_interface_material_flow label"
+msgid "Support Interface Flow"
+msgstr "Flusso interfaccia di supporto"
+
+#: fdmprinter.def.json
+msgctxt "support_interface_material_flow description"
+msgid "Flow compensation on lines of support roof or floor."
+msgstr "Compensazione del flusso sulle linee di supporto superiore o inferiore."
+
+#: fdmprinter.def.json
+msgctxt "support_roof_material_flow label"
+msgid "Support Roof Flow"
+msgstr "Flusso supporto superiore"
+
+#: fdmprinter.def.json
+msgctxt "support_roof_material_flow description"
+msgid "Flow compensation on support roof lines."
+msgstr "Compensazione del flusso sulle linee di supporto superiore."
+
+#: fdmprinter.def.json
+msgctxt "support_bottom_material_flow label"
+msgid "Support Floor Flow"
+msgstr "Flusso supporto inferiore"
+
+#: fdmprinter.def.json
+msgctxt "support_bottom_material_flow description"
+msgid "Flow compensation on support floor lines."
+msgstr "Compensazione del flusso sulle linee di supporto inferiore."
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_flow label"
+msgid "Prime Tower Flow"
+msgstr "Flusso torre di innesco"
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_flow description"
+msgid "Flow compensation on prime tower lines."
+msgstr "Compensazione del flusso sulle linee della torre di innesco."
+
#: fdmprinter.def.json
msgctxt "material_flow_layer_0 label"
msgid "Initial Layer Flow"
@@ -2100,8 +2327,9 @@ msgstr "Limitazione delle retrazioni del supporto"
#: fdmprinter.def.json
msgctxt "limit_support_retractions description"
-msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excesive stringing within the support structure."
-msgstr "Omettere la retrazione negli spostamenti da un supporto ad un altro in linea retta. L'abilitazione di questa impostazione riduce il tempo di stampa, ma può comportare un'eccessiva produzione di filamenti all'interno della struttura del supporto."
+msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excessive stringing within the support structure."
+msgstr "Omettere la retrazione negli spostamenti da un supporto ad un altro in linea retta. L'abilitazione di questa impostazione riduce il tempo di stampa, ma"
+" può comportare un'eccessiva produzione di filamenti all'interno della struttura del supporto."
#: fdmprinter.def.json
msgctxt "material_standby_temperature label"
@@ -2153,6 +2381,16 @@ msgctxt "switch_extruder_prime_speed description"
msgid "The speed at which the filament is pushed back after a nozzle switch retraction."
msgstr "Indica la velocità alla quale il filamento viene sospinto indietro dopo la retrazione per cambio ugello."
+#: fdmprinter.def.json
+msgctxt "switch_extruder_extra_prime_amount label"
+msgid "Nozzle Switch Extra Prime Amount"
+msgstr "Quantità di materiale extra della Prime Tower, al cambio ugello"
+
+#: fdmprinter.def.json
+msgctxt "switch_extruder_extra_prime_amount description"
+msgid "Extra material to prime after nozzle switching."
+msgstr "Materiale extra per l'innesco dopo il cambio dell'ugello."
+
#: fdmprinter.def.json
msgctxt "speed label"
msgid "Speed"
@@ -2344,14 +2582,15 @@ msgid "The speed at which the skirt and brim are printed. Normally this is done
msgstr "Indica la velocità a cui sono stampati lo skirt ed il brim. Normalmente questa operazione viene svolta alla velocità di stampa dello strato iniziale, ma a volte è possibile che si desideri stampare lo skirt o il brim ad una velocità diversa."
#: fdmprinter.def.json
-msgctxt "max_feedrate_z_override label"
-msgid "Maximum Z Speed"
-msgstr "Velocità massima Z"
+msgctxt "speed_z_hop label"
+msgid "Z Hop Speed"
+msgstr "Velocità di sollevamento Z"
#: fdmprinter.def.json
-msgctxt "max_feedrate_z_override description"
-msgid "The maximum speed with which the build plate is moved. Setting this to zero causes the print to use the firmware defaults for the maximum z speed."
-msgstr "Indica la velocità massima di spostamento del piano di stampa. L’impostazione di questo valore a zero causa l’utilizzo per la stampa dei valori preimpostati in fabbrica per la velocità massima Z."
+msgctxt "speed_z_hop description"
+msgid "The speed at which the vertical Z movement is made for Z Hops. This is typically lower than the print speed since the build plate or machine's gantry is harder to move."
+msgstr "Velocità alla quale viene eseguito il movimento Z verticale per i sollevamenti in Z. In genere è inferiore alla velocità di stampa, dal momento che il"
+" piano o il corpo di stampa della macchina sono più difficili da spostare."
#: fdmprinter.def.json
msgctxt "speed_slowdown_layers label"
@@ -2923,6 +3162,16 @@ msgctxt "retraction_hop_after_extruder_switch description"
msgid "After the machine switched from one extruder to the other, the build plate is lowered to create clearance between the nozzle and the print. This prevents the nozzle from leaving oozed material on the outside of a print."
msgstr "Dopo il passaggio della macchina da un estrusore all’altro, il piano di stampa viene abbassato per creare uno spazio tra l’ugello e la stampa. In tal modo si previene il rilascio di materiale fuoriuscito dall’ugello sull’esterno di una stampa."
+#: fdmprinter.def.json
+msgctxt "retraction_hop_after_extruder_switch_height label"
+msgid "Z Hop After Extruder Switch Height"
+msgstr "Z Hop dopo cambio altezza estrusore"
+
+#: fdmprinter.def.json
+msgctxt "retraction_hop_after_extruder_switch_height description"
+msgid "The height difference when performing a Z Hop after extruder switch."
+msgstr "La differenza di altezza durante l'esecuzione di uno Z Hop dopo il cambio dell'estrusore."
+
#: fdmprinter.def.json
msgctxt "cooling label"
msgid "Cooling"
@@ -3193,6 +3442,11 @@ msgctxt "support_pattern option cross"
msgid "Cross"
msgstr "Incrociata"
+#: fdmprinter.def.json
+msgctxt "support_pattern option gyroid"
+msgid "Gyroid"
+msgstr "Gyroid"
+
#: fdmprinter.def.json
msgctxt "support_wall_count label"
msgid "Support Wall Line Count"
@@ -3254,12 +3508,12 @@ msgid "Distance between the printed initial layer support structure lines. This
msgstr "Indica la distanza tra le linee della struttura di supporto dello strato iniziale stampato. Questa impostazione viene calcolata mediante la densità del supporto."
#: fdmprinter.def.json
-msgctxt "support_infill_angle label"
-msgid "Support Infill Line Direction"
+msgctxt "support_infill_angles label"
+msgid "Support Infill Line Directions"
msgstr "Direzione delle linee di riempimento supporto"
#: fdmprinter.def.json
-msgctxt "support_infill_angle description"
+msgctxt "support_infill_angles description"
msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane."
msgstr "Indica l’orientamento della configurazione del riempimento per i supporti. La configurazione del riempimento del supporto viene ruotata sul piano orizzontale."
@@ -3390,8 +3644,9 @@ msgstr "Distanza giunzione supporto"
#: fdmprinter.def.json
msgctxt "support_join_distance description"
-msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one."
-msgstr "Indica la distanza massima tra le strutture di supporto nelle direzioni X/Y. Quando la distanza tra le strutture è inferiore al valore indicato, le strutture convergono in una unica."
+msgid "The maximum distance between support structures in the X/Y directions. When separate structures are closer together than this value, the structures merge into one."
+msgstr "La distanza massima tra le strutture di supporto nelle direzioni X/Y. Quando la distanza tra le strutture è inferiore al valore indicato, le strutture"
+" convergono in una unica."
#: fdmprinter.def.json
msgctxt "support_offset label"
@@ -3769,14 +4024,14 @@ msgid "The diameter of a special tower."
msgstr "Corrisponde al diametro di una torre speciale."
#: fdmprinter.def.json
-msgctxt "support_minimal_diameter label"
-msgid "Minimum Diameter"
-msgstr "Diametro minimo"
+msgctxt "support_tower_maximum_supported_diameter label"
+msgid "Maximum Tower-Supported Diameter"
+msgstr "Diametro supportato dalla torre"
#: fdmprinter.def.json
-msgctxt "support_minimal_diameter description"
-msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
-msgstr "È il diametro minimo nelle direzioni X/Y di una piccola area, che deve essere sostenuta da una torre speciale."
+msgctxt "support_tower_maximum_supported_diameter description"
+msgid "Maximum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
+msgstr "È il diametro massimo nelle direzioni X/Y di una piccola area, che deve essere sostenuta da una torre speciale."
#: fdmprinter.def.json
msgctxt "support_tower_roof_angle label"
@@ -3898,7 +4153,9 @@ 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.\nQuesta è la distanza minima. Più linee di skirt aumenteranno tale distanza."
+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."
#: fdmprinter.def.json
msgctxt "skirt_brim_minimal_length label"
@@ -4270,16 +4527,6 @@ msgctxt "prime_tower_enable description"
msgid "Print a tower next to the print which serves to prime the material after each nozzle switch."
msgstr "Stampa una torre accanto alla stampa che serve per innescare il materiale dopo ogni cambio ugello."
-#: fdmprinter.def.json
-msgctxt "prime_tower_circular label"
-msgid "Circular Prime Tower"
-msgstr "Torre di innesco circolare"
-
-#: fdmprinter.def.json
-msgctxt "prime_tower_circular description"
-msgid "Make the prime tower as a circular shape."
-msgstr "Conferisce alla torre di innesco una forma circolare."
-
#: fdmprinter.def.json
msgctxt "prime_tower_size label"
msgid "Prime Tower Size"
@@ -4320,16 +4567,6 @@ msgctxt "prime_tower_position_y description"
msgid "The y coordinate of the position of the prime tower."
msgstr "Indica la coordinata Y della posizione della torre di innesco."
-#: fdmprinter.def.json
-msgctxt "prime_tower_flow label"
-msgid "Prime Tower Flow"
-msgstr "Flusso torre di innesco"
-
-#: fdmprinter.def.json
-msgctxt "prime_tower_flow description"
-msgid "Flow compensation: the amount of material extruded is multiplied by this value."
-msgstr "Determina la compensazione del flusso: la quantità di materiale estruso viene moltiplicata per questo valore."
-
#: fdmprinter.def.json
msgctxt "prime_tower_wipe_enabled label"
msgid "Wipe Inactive Nozzle on Prime Tower"
@@ -4340,6 +4577,16 @@ msgctxt "prime_tower_wipe_enabled description"
msgid "After printing the prime tower with one nozzle, wipe the oozed material from the other nozzle off on the prime tower."
msgstr "Dopo la stampa della torre di innesco con un ugello, pulisce il materiale fuoriuscito dall’altro ugello sulla torre di innesco."
+#: fdmprinter.def.json
+msgctxt "prime_tower_brim_enable label"
+msgid "Prime Tower Brim"
+msgstr "Brim torre di innesco"
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_brim_enable description"
+msgid "Prime-towers might need the extra adhesion afforded by a brim even if the model doesn't. Presently can't be used with the 'Raft' adhesion-type."
+msgstr "Le torri di innesco potrebbero richiedere un'adesione supplementare fornita da un bordo (brim), anche se il modello non lo prevede. Attualmente non può essere utilizzato con il tipo di adesione 'Raft'."
+
#: fdmprinter.def.json
msgctxt "ooze_shield_enabled label"
msgid "Enable Ooze Shield"
@@ -4622,8 +4869,9 @@ msgstr "Levigazione dei profili con movimento spiraliforme"
#: fdmprinter.def.json
msgctxt "smooth_spiralized_contours description"
-msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
-msgstr "Leviga i profili con movimento spiraliforme per ridurre la visibilità della giunzione Z (la giunzione Z dovrebbe essere appena visibile sulla stampa, ma rimane visibile nella vista dello strato). Notare che la levigatura tende a rimuovere le bavature fini della superficie."
+msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
+msgstr "Leviga i profili con movimento spiraliforme per ridurre la visibilità della giunzione Z (la giunzione Z dovrebbe essere appena visibile sulla stampa, ma"
+" rimane visibile nella visualizzazione a strati). Notare che la levigatura tende a rimuovere le bavature fini della superficie."
#: fdmprinter.def.json
msgctxt "relative_extrusion label"
@@ -4855,6 +5103,16 @@ msgctxt "meshfix_maximum_travel_resolution description"
msgid "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."
msgstr "La dimensione minima di un segmento lineare di spostamento dopo il sezionamento. Aumentando tale dimensione, le corse di spostamento avranno meno angoli arrotondati. La stampante può così mantenere la velocità per processare il g-code, ma si può verificare una riduzione della precisione di aggiramento del modello."
+#: fdmprinter.def.json
+msgctxt "meshfix_maximum_deviation label"
+msgid "Maximum Deviation"
+msgstr "Deviazione massima"
+
+#: fdmprinter.def.json
+msgctxt "meshfix_maximum_deviation description"
+msgid "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."
+msgstr "La deviazione massima consentita quando si riduce la risoluzione per l'impostazione di Risoluzione massima. Se si aumenta questo parametro, la stampa sarà meno precisa, ma il codice g sarà più piccolo."
+
#: fdmprinter.def.json
msgctxt "support_skip_some_zags label"
msgid "Break Up Support In Chunks"
@@ -5112,8 +5370,8 @@ msgstr "Abilitazione del supporto conico"
#: fdmprinter.def.json
msgctxt "support_conical_enabled description"
-msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang."
-msgstr "Funzione sperimentale: realizza aree di supporto più piccole nella parte inferiore che in corrispondenza dello sbalzo."
+msgid "Make support areas smaller at the bottom than at the overhang."
+msgstr "Realizza aree di supporto più piccole nella parte inferiore che in corrispondenza dello sbalzo."
#: fdmprinter.def.json
msgctxt "support_conical_angle label"
@@ -5345,7 +5603,9 @@ 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.\nCiò 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.\n"
+"Ciò 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"
@@ -5454,7 +5714,7 @@ msgstr "Indica la distanza tra l'ugello e le linee diagonali verso il basso. Un
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_enabled label"
-msgid "Use adaptive layers"
+msgid "Use Adaptive Layers"
msgstr "Uso di strati adattivi"
#: fdmprinter.def.json
@@ -5464,7 +5724,7 @@ msgstr "Gli strati adattivi calcolano l’altezza degli strati in base alla form
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_variation label"
-msgid "Adaptive layers maximum variation"
+msgid "Adaptive Layers Maximum Variation"
msgstr "Variazione massima strati adattivi"
#: fdmprinter.def.json
@@ -5474,7 +5734,7 @@ msgstr "La differenza di altezza massima rispetto all’altezza dello strato di
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_variation_step label"
-msgid "Adaptive layers variation step size"
+msgid "Adaptive Layers Variation Step Size"
msgstr "Dimensione variazione strati adattivi"
#: fdmprinter.def.json
@@ -5484,7 +5744,7 @@ msgstr "La differenza in altezza dello strato successivo rispetto al precedente.
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_threshold label"
-msgid "Adaptive layers threshold"
+msgid "Adaptive Layers Threshold"
msgstr "Soglia strati adattivi"
#: fdmprinter.def.json
@@ -5702,6 +5962,156 @@ msgctxt "bridge_fan_speed_3 description"
msgid "Percentage fan speed to use when printing the third bridge skin layer."
msgstr "La velocità della ventola in percentuale da usare per stampare il terzo strato del rivestimento esterno ponte."
+#: fdmprinter.def.json
+msgctxt "clean_between_layers label"
+msgid "Wipe Nozzle Between Layers"
+msgstr "Pulitura ugello tra gli strati"
+
+#: fdmprinter.def.json
+msgctxt "clean_between_layers description"
+msgid "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."
+msgstr "Se includere il codice G di pulitura ugello tra gli strati. Abilitare questa impostazione potrebbe influire sul comportamento di retrazione al cambio strato. Utilizzare le impostazioni di Retrazione per pulitura per controllare la retrazione in corrispondenza degli strati in cui lo script di pulitura sarà funzionante."
+
+#: fdmprinter.def.json
+msgctxt "max_extrusion_before_wipe label"
+msgid "Material Volume Between Wipes"
+msgstr "Volume di materiale tra le operazioni di pulitura"
+
+#: fdmprinter.def.json
+msgctxt "max_extrusion_before_wipe description"
+msgid "Maximum material, that can be extruded before another nozzle wipe is initiated."
+msgstr "Il massimo volume di materiale, che può essere estruso prima di iniziare la successiva operazione di pulitura ugello."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_enable label"
+msgid "Wipe Retraction Enable"
+msgstr "Retrazione per pulitura abilitata"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_enable description"
+msgid "Retract the filament when the nozzle is moving over a non-printed area."
+msgstr "Ritrae il filamento quando l'ugello si sta muovendo su un'area non stampata."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_amount label"
+msgid "Wipe Retraction Distance"
+msgstr "Distanza di retrazione per pulitura"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_amount description"
+msgid "Amount to retract the filament so it does not ooze during the wipe sequence."
+msgstr "L'entità di retrazione del filamento in modo che non fuoriesca durante la sequenza di pulitura."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_extra_prime_amount label"
+msgid "Wipe Retraction Extra Prime Amount"
+msgstr "Entità di innesco supplementare dopo retrazione per pulitura"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_extra_prime_amount description"
+msgid "Some material can ooze away during a wipe travel moves, which can be compensated for here."
+msgstr "Qui è possibile compensare l’eventuale trafilamento di materiale che può verificarsi nel corso della pulitura durante il movimento."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_speed label"
+msgid "Wipe Retraction Speed"
+msgstr "Velocità di retrazione per pulitura"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_speed description"
+msgid "The speed at which the filament is retracted and primed during a wipe retraction move."
+msgstr "Indica la velocità alla quale il filamento viene retratto e preparato durante un movimento di retrazione per pulitura."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_retract_speed label"
+msgid "Wipe Retraction Retract Speed"
+msgstr "Velocità di retrazione per pulitura"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_retract_speed description"
+msgid "The speed at which the filament is retracted during a wipe retraction move."
+msgstr "Indica la velocità alla quale il filamento viene retratto durante un movimento di retrazione per pulitura."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_prime_speed label"
+msgid "Retraction Prime Speed"
+msgstr "Velocità di innesco dopo la retrazione"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_prime_speed description"
+msgid "The speed at which the filament is primed during a wipe retraction move."
+msgstr "Indica la velocità alla quale il filamento viene preparato durante un movimento di retrazione per pulitura."
+
+#: fdmprinter.def.json
+msgctxt "wipe_pause label"
+msgid "Wipe Pause"
+msgstr "Pausa pulitura"
+
+#: fdmprinter.def.json
+msgctxt "wipe_pause description"
+msgid "Pause after the unretract."
+msgstr "Pausa dopo ripristino."
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_enable label"
+msgid "Wipe Z Hop When Retracted"
+msgstr "Z Hop pulitura durante retrazione"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_enable description"
+msgid "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."
+msgstr "Ogniqualvolta avviene una retrazione, il piano di stampa viene abbassato per creare uno spazio tra l’ugello e la stampa. Questo impedisce l'urto dell'ugello sulla stampa durante gli spostamenti, riducendo la possibilità di far cadere la stampa dal piano."
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_amount label"
+msgid "Wipe Z Hop Height"
+msgstr "Altezza Z Hop pulitura"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_amount description"
+msgid "The height difference when performing a Z Hop."
+msgstr "La differenza di altezza durante l’esecuzione di uno Z Hop."
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_speed label"
+msgid "Wipe Hop Speed"
+msgstr "Velocità di sollevamento (Hop) per pulitura"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_speed description"
+msgid "Speed to move the z-axis during the hop."
+msgstr "Velocità di spostamento dell'asse z durante il sollevamento (Hop)."
+
+#: fdmprinter.def.json
+msgctxt "wipe_brush_pos_x label"
+msgid "Wipe Brush X Position"
+msgstr "Posizione X spazzolino di pulitura"
+
+#: fdmprinter.def.json
+msgctxt "wipe_brush_pos_x description"
+msgid "X location where wipe script will start."
+msgstr "Posizione X in cui verrà avviato lo script di pulitura."
+
+#: fdmprinter.def.json
+msgctxt "wipe_repeat_count label"
+msgid "Wipe Repeat Count"
+msgstr "Conteggio ripetizioni operazioni di pulitura"
+
+#: fdmprinter.def.json
+msgctxt "wipe_repeat_count description"
+msgid "Number of times to move the nozzle across the brush."
+msgstr "Numero di passaggi dell'ugello attraverso lo spazzolino."
+
+#: fdmprinter.def.json
+msgctxt "wipe_move_distance label"
+msgid "Wipe Move Distance"
+msgstr "Distanza spostamento longitudinale di pulitura"
+
+#: fdmprinter.def.json
+msgctxt "wipe_move_distance description"
+msgid "The distance to move the head back and forth across the brush."
+msgstr "La distanza dello spostamento longitudinale eseguito dalla testina attraverso lo spazzolino."
+
#: fdmprinter.def.json
msgctxt "command_line_settings label"
msgid "Command Line Settings"
@@ -5762,6 +6172,138 @@ msgctxt "mesh_rotation_matrix description"
msgid "Transformation matrix to be applied to the model when loading it from file."
msgstr "Matrice di rotazione da applicare al modello quando caricato dal file."
+#~ msgctxt "machine_gcode_flavor label"
+#~ msgid "G-code Flavour"
+#~ msgstr "Tipo di codice G"
+
+#~ msgctxt "z_seam_corner description"
+#~ msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner."
+#~ msgstr "Controlla se gli angoli sul profilo del modello influenzano la posizione della giunzione. Nessuno significa che gli angoli non hanno alcuna influenza sulla posizione della giunzione. Nascondi giunzione favorisce la presenza della giunzione su un angolo interno. Esponi giunzione favorisce la presenza della giunzione su un angolo esterno. Nascondi o esponi giunzione favorisce la presenza della giunzione su un angolo interno o esterno."
+
+#~ msgctxt "skin_no_small_gaps_heuristic label"
+#~ msgid "Ignore Small Z Gaps"
+#~ msgstr "Ignora i piccoli interstizi a Z"
+
+#~ msgctxt "skin_no_small_gaps_heuristic description"
+#~ msgid "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting."
+#~ msgstr "Quando il modello presenta piccoli spazi vuoti verticali, circa il 5% del tempo di calcolo supplementare può essere utilizzato per la generazione di rivestimenti esterni superiori ed inferiori in questi interstizi. In questo caso disabilitare l’impostazione."
+
+#~ msgctxt "build_volume_temperature description"
+#~ msgid "The temperature used for build volume. If this is 0, the build volume temperature will not be adjusted."
+#~ msgstr "La temperatura utilizzata per il volume di stampa. Se il valore è 0, la temperatura del volume di stampa non verrà regolata."
+
+#~ msgctxt "limit_support_retractions description"
+#~ msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excesive stringing within the support structure."
+#~ msgstr "Omettere la retrazione negli spostamenti da un supporto ad un altro in linea retta. L'abilitazione di questa impostazione riduce il tempo di stampa, ma può comportare un'eccessiva produzione di filamenti all'interno della struttura del supporto."
+
+#~ msgctxt "max_feedrate_z_override label"
+#~ msgid "Maximum Z Speed"
+#~ msgstr "Velocità massima Z"
+
+#~ msgctxt "max_feedrate_z_override description"
+#~ msgid "The maximum speed with which the build plate is moved. Setting this to zero causes the print to use the firmware defaults for the maximum z speed."
+#~ msgstr "Indica la velocità massima di spostamento del piano di stampa. L’impostazione di questo valore a zero causa l’utilizzo per la stampa dei valori preimpostati in fabbrica per la velocità massima Z."
+
+#~ msgctxt "support_join_distance description"
+#~ msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one."
+#~ msgstr "Indica la distanza massima tra le strutture di supporto nelle direzioni X/Y. Quando la distanza tra le strutture è inferiore al valore indicato, le strutture convergono in una unica."
+
+#~ msgctxt "support_minimal_diameter label"
+#~ msgid "Minimum Diameter"
+#~ msgstr "Diametro minimo"
+
+#~ msgctxt "support_minimal_diameter description"
+#~ msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
+#~ msgstr "È il diametro minimo nelle direzioni X/Y di una piccola area, che deve essere sostenuta da una torre speciale."
+
+#~ msgctxt "prime_tower_circular label"
+#~ msgid "Circular Prime Tower"
+#~ msgstr "Torre di innesco circolare"
+
+#~ msgctxt "prime_tower_circular description"
+#~ msgid "Make the prime tower as a circular shape."
+#~ msgstr "Conferisce alla torre di innesco una forma circolare."
+
+#~ msgctxt "prime_tower_flow description"
+#~ msgid "Flow compensation: the amount of material extruded is multiplied by this value."
+#~ msgstr "Determina la compensazione del flusso: la quantità di materiale estruso viene moltiplicata per questo valore."
+
+#~ msgctxt "smooth_spiralized_contours description"
+#~ msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
+#~ msgstr "Leviga i profili con movimento spiraliforme per ridurre la visibilità della giunzione Z (la giunzione Z dovrebbe essere appena visibile sulla stampa, ma rimane visibile nella vista dello strato). Notare che la levigatura tende a rimuovere le bavature fini della superficie."
+
+#~ msgctxt "support_conical_enabled description"
+#~ msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang."
+#~ msgstr "Funzione sperimentale: realizza aree di supporto più piccole nella parte inferiore che in corrispondenza dello sbalzo."
+
+#~ msgctxt "extruders_enabled_count label"
+#~ msgid "Number of Extruders that are enabled"
+#~ msgstr "Numero di estrusori abilitati"
+
+#~ msgctxt "machine_nozzle_tip_outer_diameter label"
+#~ msgid "Outer nozzle diameter"
+#~ msgstr "Diametro esterno ugello"
+
+#~ msgctxt "machine_nozzle_head_distance label"
+#~ msgid "Nozzle length"
+#~ msgstr "Lunghezza ugello"
+
+#~ msgctxt "machine_nozzle_expansion_angle label"
+#~ msgid "Nozzle angle"
+#~ msgstr "Angolo ugello"
+
+#~ msgctxt "machine_heat_zone_length label"
+#~ msgid "Heat zone length"
+#~ msgstr "Lunghezza della zona di riscaldamento"
+
+#~ msgctxt "machine_nozzle_heat_up_speed label"
+#~ msgid "Heat up speed"
+#~ msgstr "Velocità di riscaldamento"
+
+#~ msgctxt "machine_nozzle_cool_down_speed label"
+#~ msgid "Cool down speed"
+#~ msgstr "Velocità di raffreddamento"
+
+#~ msgctxt "machine_gcode_flavor label"
+#~ msgid "G-code flavour"
+#~ msgstr "Tipo di codice G"
+
+#~ msgctxt "machine_disallowed_areas label"
+#~ msgid "Disallowed areas"
+#~ msgstr "Aree non consentite"
+
+#~ msgctxt "machine_head_polygon label"
+#~ msgid "Machine head polygon"
+#~ msgstr "Poligono testina macchina"
+
+#~ msgctxt "machine_head_with_fans_polygon label"
+#~ msgid "Machine head & Fan polygon"
+#~ msgstr "Poligono testina macchina e ventola"
+
+#~ msgctxt "gantry_height label"
+#~ msgid "Gantry height"
+#~ msgstr "Altezza gantry"
+
+#~ msgctxt "machine_use_extruder_offset_to_offset_coords label"
+#~ msgid "Offset With Extruder"
+#~ msgstr "Offset con estrusore"
+
+#~ msgctxt "adaptive_layer_height_enabled label"
+#~ msgid "Use adaptive layers"
+#~ msgstr "Uso di strati adattivi"
+
+#~ msgctxt "adaptive_layer_height_variation label"
+#~ msgid "Adaptive layers maximum variation"
+#~ msgstr "Variazione massima strati adattivi"
+
+#~ msgctxt "adaptive_layer_height_variation_step label"
+#~ msgid "Adaptive layers variation step size"
+#~ msgstr "Dimensione variazione strati adattivi"
+
+#~ msgctxt "adaptive_layer_height_threshold label"
+#~ msgid "Adaptive layers threshold"
+#~ msgstr "Soglia strati adattivi"
+
#~ msgctxt "skin_overlap description"
#~ msgid "The amount of overlap between the skin and the walls as a percentage of the skin line width. A slight overlap allows the walls to connect firmly to the skin. This is a percentage of the average line widths of the skin lines and the innermost wall."
#~ msgstr "Entità della sovrapposizione tra il rivestimento e le pareti espressa in percentuale della larghezza della linea del rivestimento esterno. Una leggera sovrapposizione consente alle pareti di essere saldamente collegate al rivestimento. È una percentuale delle larghezze medie delle linee del rivestimento e della parete più interna."
@@ -5899,7 +6441,6 @@ 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"
#~ "."
@@ -5912,7 +6453,6 @@ 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"
#~ "."
@@ -5969,7 +6509,6 @@ 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 80f7099e96..574fb89d7b 100644
--- a/resources/i18n/ja_JP/cura.po
+++ b/resources/i18n/ja_JP/cura.po
@@ -5,20 +5,20 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2019-03-14 14:39+0100\n"
-"Last-Translator: Bothof \n"
-"Language-Team: Japanese\n"
+"POT-Creation-Date: 2019-07-16 14:38+0200\n"
+"PO-Revision-Date: 2019-07-29 16:09+0200\n"
+"Last-Translator: Lionbridge \n"
+"Language-Team: Japanese , Japanese \n"
"Language: ja_JP\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.1.1\n"
+"X-Generator: Poedit 2.2.1\n"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:27
msgctxt "@action"
msgid "Machine Settings"
msgstr "プリンターの設定"
@@ -56,7 +56,7 @@ msgctxt "@info:title"
msgid "3D Model Assistant"
msgstr "3Dモデルアシスタント"
-#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:86
+#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:90
#, python-brace-format
msgctxt "@info:status"
msgid ""
@@ -70,16 +70,6 @@ msgstr ""
"可能な限り最高の品質および信頼性を得る方法をご覧ください。
\n"
"印字品質ガイドを見る
"
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
-msgctxt "@item:inmenu"
-msgid "Changelog"
-msgstr "Changelog"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
-msgctxt "@item:inmenu"
-msgid "Show Changelog"
-msgstr "Changelogの表示"
-
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py:25
msgctxt "@action"
msgid "Update Firmware"
@@ -96,37 +86,36 @@ msgctxt "@info:status"
msgid "Profile has been flattened & activated."
msgstr "プロファイルが平らになり、アクティベートされました。"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:33
+#: /home/ruben/Projects/Cura/plugins/AMFReader/__init__.py:15
+msgctxt "@item:inlistbox"
+msgid "AMF File"
+msgstr "AMF ファイル"
+
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:37
msgctxt "@item:inmenu"
msgid "USB printing"
msgstr "USBプリンティング"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:34
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:38
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print via USB"
msgstr "USBを使ってプリントする"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:35
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:39
msgctxt "@info:tooltip"
msgid "Print via USB"
msgstr "USBを使ってプリントする"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:71
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:75
msgctxt "@info:status"
msgid "Connected via USB"
msgstr "USBにて接続する"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:96
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:100
msgctxt "@label"
msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?"
msgstr "USBプリントを実行しています。Cura を閉じるとこのプリントも停止します。実行しますか?"
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
-msgctxt "X3G Writer File Description"
-msgid "X3G File"
-msgstr "X3Gファイル"
-
#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/GPX-prefix/src/GPX/slicerplugins/cura15.06/X3gWriter/__init__.py:16
msgctxt "X3g Writer Plugin Description"
msgid "Writes X3g to files"
@@ -137,6 +126,11 @@ msgctxt "X3g Writer File Description"
msgid "X3g File"
msgstr "X3Gファイル"
+#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
+msgctxt "X3G Writer File Description"
+msgid "X3G File"
+msgstr "X3Gファイル"
+
#: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/__init__.py:17
#: /home/ruben/Projects/Cura/plugins/GCodeGzReader/__init__.py:17
msgctxt "@item:inlistbox"
@@ -149,6 +143,7 @@ msgid "GCodeGzWriter does not support text mode."
msgstr "GCodeGzWriter はテキストモードをサポートしていません。"
#: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:28
+#: /home/ruben/Projects/Cura/plugins/UFPReader/__init__.py:22
msgctxt "@item:inlistbox"
msgid "Ultimaker Format Package"
msgstr "Ultimakerフォーマットパッケージ"
@@ -207,10 +202,10 @@ msgid "Could not save to removable drive {0}: {1}"
msgstr "リムーバブルドライブ{0}に保存することができませんでした: {1}"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:137
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:152
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:133
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:140
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1629
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:188
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:134
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:141
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1622
msgctxt "@info:title"
msgid "Error"
msgstr "エラー"
@@ -239,9 +234,9 @@ msgstr "リムーバブルデバイス{0}を取り出す"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:151
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:163
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1619
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1719
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1612
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1712
msgctxt "@info:title"
msgid "Warning"
msgstr "警告"
@@ -268,266 +263,267 @@ msgctxt "@item:intext"
msgid "Removable Drive"
msgstr "リムーバブルドライブ"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:74
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:93
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print over network"
msgstr "ネットワーク上のプリント"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:89
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:76
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:94
msgctxt "@properties:tooltip"
msgid "Print over network"
msgstr "ネットワークのプリント"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:95
msgctxt "@info:status"
msgid "Connected over the network."
msgstr "ネットワーク上で接続。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
msgctxt "@info:status"
msgid "Connected over the network. Please approve the access request on the printer."
msgstr "ネットワーク上で接続。プリンタへのリクエストを承認してください。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:93
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:100
msgctxt "@info:status"
msgid "Connected over the network. No access to control the printer."
msgstr "ネットワーク上で接続。プリントを操作するアクセス権がありません。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
msgctxt "@info:status"
msgid "Access to the printer requested. Please approve the request on the printer"
msgstr "プリンターへのアクセスが申請されました。プリンタへのリクエストを承認してください"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:101
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
msgctxt "@info:title"
msgid "Authentication status"
msgstr "認証ステータス"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:103
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:109
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:113
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:120
msgctxt "@info:title"
msgid "Authentication Status"
msgstr "認証ステータス"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:104
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:187
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:111
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:198
msgctxt "@action:button"
msgid "Retry"
msgstr "再試行"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
msgctxt "@info:tooltip"
msgid "Re-send the access request"
msgstr "アクセスリクエストを再送信"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:115
msgctxt "@info:status"
msgid "Access to the printer accepted"
msgstr "プリンターへのアクセスが承認されました"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:119
msgctxt "@info:status"
msgid "No access to print with this printer. Unable to send print job."
msgstr "このプリンターへのアクセスが許可されていないため、プリントジョブの送信ができませんでした。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:114
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:121
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:65
msgctxt "@action:button"
msgid "Request Access"
msgstr "アクセスのリクエスト"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:123
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:66
msgctxt "@info:tooltip"
msgid "Send access request to the printer"
msgstr "アクセスのリクエスト送信"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:201
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:208
msgctxt "@label"
msgid "Unable to start a new print job."
msgstr "新しいプリントジョブを開始できません。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:203
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:210
msgctxt "@label"
msgid "There is an issue with the configuration of your Ultimaker, which makes it impossible to start the print. Please resolve this issues before continuing."
msgstr "Ultimakerの設定に問題があるため、印刷が開始できません。問題を解消してからやり直してください。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:209
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:231
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:216
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:238
msgctxt "@window:title"
msgid "Mismatched configuration"
msgstr "ミスマッチの構成"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:230
msgctxt "@label"
msgid "Are you sure you wish to print with the selected configuration?"
-msgstr "選択された構成にてプリントを開始してもいいですか。"
+msgstr "選択された構成にてプリントを開始してもいいですか?"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:225
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:232
msgctxt "@label"
msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer."
msgstr "プリンターの設定、キャリブレーションとCuraの構成にミスマッチがあります。プリンターに設置されたプリントコア及びフィラメントを元にCuraをスライスすることで最良の印刷結果を出すことができます。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:252
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:162
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:162
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:176
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:181
msgctxt "@info:status"
msgid "Sending new jobs (temporarily) blocked, still sending the previous print job."
msgstr "新しいデータの送信 (temporarily) をブロックします、前のプリントジョブが送信中です。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:180
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:197
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:266
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:194
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:211
msgctxt "@info:status"
msgid "Sending data to printer"
msgstr "プリンターにプリントデータを送信中"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:260
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:182
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:199
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:267
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:196
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:213
msgctxt "@info:title"
msgid "Sending Data"
msgstr "プリントデータを送信中"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:261
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:200
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:268
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:214
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:18
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:19
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:81
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:395
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:410
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:20
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:38
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:143
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:58
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:149
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:391
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:254
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:283
msgctxt "@action:button"
msgid "Cancel"
msgstr "キャンセル"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:324
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:331
#, python-brace-format
msgctxt "@info:status"
msgid "No Printcore loaded in slot {slot_number}"
msgstr "プリントコアがスロット{slot_number}に入っていません。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:337
#, python-brace-format
msgctxt "@info:status"
msgid "No material loaded in slot {slot_number}"
msgstr "材料がスロット{slot_number}に入っていません。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:353
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:360
#, python-brace-format
msgctxt "@label"
msgid "Different PrintCore (Cura: {cura_printcore_name}, Printer: {remote_printcore_name}) selected for extruder {extruder_id}"
msgstr "エクストルーダー {extruder_id} に対して異なるプリントコア(Cura: {cura_printcore_name}, プリンター: {remote_printcore_name})が選択されています。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:362
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:369
#, python-brace-format
msgctxt "@label"
msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "異なるフィラメントが入っています(Cura:{0}, プリンター{1})エクストルーダー{2}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:548
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:555
msgctxt "@window:title"
msgid "Sync with your printer"
msgstr "プリンターと同期する"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:550
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:557
msgctxt "@label"
msgid "Would you like to use your current printer configuration in Cura?"
msgstr "Curaで設定しているプリンタ構成を使用されますか?"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:552
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:559
msgctxt "@label"
msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer."
msgstr "プリンターのプリントコア及びフィラメントが現在のプロジェクトと異なります。最善な印刷結果のために、プリンタに装着しているプリントコア、フィラメントに合わせてスライスして頂くことをお勧めします。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:96
msgctxt "@info:status"
msgid "Connected over the network"
msgstr "ネットワーク上で接続"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:275
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:342
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:370
msgctxt "@info:status"
msgid "Print job was successfully sent to the printer."
msgstr "プリントジョブは正常にプリンターに送信されました。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:277
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:343
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:291
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:371
msgctxt "@info:title"
msgid "Data Sent"
msgstr "データを送信しました"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:278
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:292
msgctxt "@action:button"
msgid "View in Monitor"
msgstr "モニター表示"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:390
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:290
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:411
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Printer '{printer_name}' has finished printing '{job_name}'."
msgstr "プリンター’{printer_name}’が’{job_name}’のプリントを終了しました。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:392
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:294
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:413
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:322
#, python-brace-format
msgctxt "@info:status"
msgid "The print job '{job_name}' was finished."
msgstr "プリントジョブ '{job_name}' は完了しました。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:393
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:414
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:316
msgctxt "@info:status"
msgid "Print finished"
msgstr "プリント終了"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:573
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:595
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:629
msgctxt "@label:material"
msgid "Empty"
msgstr "空にする"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:596
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:630
msgctxt "@label:material"
msgid "Unknown"
msgstr "不明"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:169
msgctxt "@action:button"
msgid "Print via Cloud"
msgstr "クラウドからプリントする"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:170
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
msgstr "クラウドからプリントする"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:171
msgctxt "@info:status"
msgid "Connected via Cloud"
msgstr "クラウドを使って接続しました"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:163
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:331
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:182
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:359
msgctxt "@info:title"
msgid "Cloud error"
msgstr "クラウドエラー"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:199
msgctxt "@info:status"
msgid "Could not export print job."
msgstr "印刷ジョブをエクスポートできませんでした。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:358
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
msgstr "データをプリンタにアップロードできませんでした。"
@@ -542,48 +538,52 @@ msgctxt "@info:status"
msgid "today"
msgstr "本日"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:187
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
msgstr "クラウドの接続時にエラーが発生しました。"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
+msgctxt "@info:status"
+msgid "Sending Print Job"
+msgstr "印刷ジョブ送信中"
+
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
-msgid "Sending data to remote cluster"
-msgstr "リモートクラスタにデータ送信中"
+msgid "Uploading via Ultimaker Cloud"
+msgstr "Ultimaker Cloud 経由でアップロード中"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:621
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
msgstr "Ultimaker のアカウントを使用して、どこからでも印刷ジョブを送信およびモニターします。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
-msgctxt "@info:status"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:627
+msgctxt "@info:status Ultimaker Cloud is a brand name and shouldn't be translated."
msgid "Connect to Ultimaker Cloud"
msgstr "Ultimaker Cloud に接続する"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:628
msgctxt "@action"
msgid "Don't ask me again for this printer."
msgstr "このプリンタでは次回から質問しない。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:631
msgctxt "@action"
msgid "Get started"
msgstr "はじめに"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:637
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
msgstr "Ultimaker のアカウントを使用して、どこからでも印刷ジョブを送信およびモニターできるようになりました。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:643
msgctxt "@info:status"
msgid "Connected!"
msgstr "接続しました!"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:645
msgctxt "@action"
msgid "Review your connection"
msgstr "接続の確認"
@@ -598,7 +598,7 @@ msgctxt "@item:inmenu"
msgid "Monitor"
msgstr "モニター"
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:124
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:118
msgctxt "@info"
msgid "Could not access update information."
msgstr "必要なアップデートの情報にアクセスできません。"
@@ -655,46 +655,11 @@ msgctxt "@info:tooltip"
msgid "Create a volume in which supports are not printed."
msgstr "サポートが印刷されないボリュームを作成します。"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:52
-msgctxt "@info"
-msgid "Cura collects anonymized usage statistics."
-msgstr "Curaは、匿名化した利用統計を収集します。"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:55
-msgctxt "@info:title"
-msgid "Collecting Data"
-msgstr "データを収集中"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:57
-msgctxt "@action:button"
-msgid "More info"
-msgstr "詳細"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:58
-msgctxt "@action:tooltip"
-msgid "See more information on what data Cura sends."
-msgstr "Curaが送信するデータについて詳しくご覧ください。"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:60
-msgctxt "@action:button"
-msgid "Allow"
-msgstr "許可"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:61
-msgctxt "@action:tooltip"
-msgid "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."
-msgstr "Curaが匿名化した利用統計を送信することを許可し、Curaの将来の改善を優先的に行うことに貢献します。プレファレンスと設定の一部、Curaのバージョン、スライスしているモデルのハッシュが送信されます。"
-
#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "Cura 15.04 profiles"
msgstr "Cura 15.04 プロファイル"
-#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
-msgctxt "@item:inmenu"
-msgid "Evaluation"
-msgstr "評価"
-
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "JPG Image"
@@ -720,56 +685,56 @@ msgctxt "@item:inlistbox"
msgid "GIF Image"
msgstr "GIF画像"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
msgctxt "@info:status"
msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration."
msgstr "選ばれたプリンターまたは選ばれたプリント構成が異なるため進行中の材料にてスライスを完了できません。"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:389
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:398
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:407
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:416
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:362
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:386
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:395
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:404
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:413
msgctxt "@info:title"
msgid "Unable to slice"
msgstr "スライスできません"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:364
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:361
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to slice with the current settings. The following settings have errors: {0}"
msgstr "現在の設定でスライスが完了できません。以下の設定にエラーがあります: {0}"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:388
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:385
#, 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 "モデル別の設定があるためスライスできません。1つまたは複数のモデルで以下の設定にエラーが発生しました:{error_labels}"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:397
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:394
msgctxt "@info:status"
msgid "Unable to slice because the prime tower or prime position(s) are invalid."
msgstr "プライムタワーまたはプライム位置が無効なためスライスできません。"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:406
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:403
#, python-format
msgctxt "@info:status"
msgid "Unable to slice because there are objects associated with disabled Extruder %s."
msgstr "無効な Extruder %s に関連付けられている造形物があるため、スライスできません。"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:412
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 "ビルドモジュールに合うモデルがない、または無効なエクストルーダーに割り当てられているため、スライスできるものがありません。モデルが合うように拡張または回転させるか、エクストルーダーを有効にしてください。"
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:status"
msgid "Processing Layers"
msgstr "レイヤーを処理しています"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:title"
msgid "Information"
msgstr "インフォメーション"
@@ -800,19 +765,19 @@ msgctxt "@item:inlistbox"
msgid "3MF File"
msgstr "3MF ファイル"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:190
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:763
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:191
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:775
msgctxt "@label"
msgid "Nozzle"
msgstr "ノズル"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:469
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:474
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead."
msgstr "プロジェクトファイル {0} に不明なマシンタイプ {1} があります。マシンをインポートできません。代わりにモデルをインポートします。"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:472
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:477
msgctxt "@info:title"
msgid "Open Project File"
msgstr "プロジェクトファイルを開く"
@@ -827,18 +792,18 @@ msgctxt "@item:inlistbox"
msgid "G File"
msgstr "Gファイル"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:324
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:328
msgctxt "@info:status"
msgid "Parsing G-code"
msgstr "G-codeを解析"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:326
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:476
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:330
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:483
msgctxt "@info:title"
msgid "G-code Details"
msgstr "G-codeの詳細"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:474
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:481
msgctxt "@info:generic"
msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate."
msgstr "データファイルを送信する前に、プリンターとプリンターの構成設定にそのG-codeが適応しているか確認してください。G-codeの表示が適切でない場合があります。"
@@ -861,7 +826,7 @@ msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
msgstr "バックアップのリスト作成時にエラーが発生しました。"
-#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
+#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:132
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
msgstr "バックアップのリストア中にエラーが発生しました。"
@@ -922,243 +887,261 @@ msgctxt "@item:inmenu"
msgid "Preview"
msgstr "プレビュー"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:19
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
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"
msgstr "ビルドプレートを調整する"
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:81
-msgctxt "@tooltip"
-msgid "Outer Wall"
-msgstr "アウターウォール"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:82
-msgctxt "@tooltip"
-msgid "Inner Walls"
-msgstr "インナーウォール"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:83
-msgctxt "@tooltip"
-msgid "Skin"
-msgstr "スキン"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:84
-msgctxt "@tooltip"
-msgid "Infill"
-msgstr "インフィル"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:85
-msgctxt "@tooltip"
-msgid "Support Infill"
-msgstr "サポートイルフィル"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:86
-msgctxt "@tooltip"
-msgid "Support Interface"
-msgstr "サポートインターフェイス"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:87
-msgctxt "@tooltip"
-msgid "Support"
-msgstr "サポート"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88
-msgctxt "@tooltip"
-msgid "Skirt"
-msgstr "スカート"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89
-msgctxt "@tooltip"
-msgid "Travel"
-msgstr "移動"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90
-msgctxt "@tooltip"
-msgid "Retractions"
-msgstr "退却"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91
-msgctxt "@tooltip"
-msgid "Other"
-msgstr "他"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:309
-#, python-brace-format
-msgctxt "@label"
-msgid "Pre-sliced file {0}"
-msgstr "スライス前ファイル {0}"
-
-#: /home/ruben/Projects/Cura/cura/API/Account.py:77
+#: /home/ruben/Projects/Cura/cura/API/Account.py:82
msgctxt "@info:title"
msgid "Login failed"
msgstr "ログインに失敗しました"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:201
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121
+#: /home/ruben/Projects/Cura/cura/Settings/cura_empty_instance_containers.py:33
+msgctxt "@info:not supported profile"
+msgid "Not supported"
+msgstr "サポート対象外"
+
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:203
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
msgctxt "@title:window"
msgid "File Already Exists"
msgstr "すでに存在するファイルです"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:202
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:204
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:123
#, python-brace-format
msgctxt "@label Don't translate the XML tag !"
msgid "The file {0} already exists. Are you sure you want to overwrite it?"
msgstr "{0} は既に存在します。ファイルを上書きしますか?"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:425
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:427
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:430
msgctxt "@info:status"
msgid "Invalid file URL:"
msgstr "無効なファイルのURL:"
-#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
-msgctxt "@menuitem"
-msgid "Not overridden"
-msgstr "上書きできません"
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:925
+msgctxt "@info:message Followed by a list of settings."
+msgid "Settings have been changed to match the current availability of extruders:"
+msgstr "現在利用可能な次のエクストルーダーに合わせて設定が変更されました:"
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:915
-#, python-format
-msgctxt "@info:generic"
-msgid "Settings have been changed to match the current availability of extruders: [%s]"
-msgstr "現在利用可能なエクストルーダー [%s] に合わせて設定が変更されました。"
-
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:917
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:927
msgctxt "@info:title"
msgid "Settings updated"
msgstr "設定が更新されました"
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1481
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
msgstr "エクストルーダーを無効にしました"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:132
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to export profile to {0}: {1}"
msgstr "{0}にプロファイルを書き出すのに失敗しました: {1}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:138
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:139
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Failed to export profile to {0}: Writer plugin reported failure."
msgstr "{0}にプロファイルを書き出すことに失敗しました。:ライタープラグイン失敗の報告。"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Exported profile to {0}"
msgstr "{0}にプロファイルを書き出しました"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145
msgctxt "@info:title"
msgid "Export succeeded"
msgstr "書き出し完了"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:170
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:172
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
msgstr "{0}からプロファイルの取り込に失敗しました:{1}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:176
#, 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 "プリンタを追加する前に、{0}からプロファイルの取り込はできません。"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:192
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "No custom profile to import in file {0}"
msgstr "ファイル{0}にはカスタムプロファイルがインポートされていません"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:194
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:196
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}:"
-msgstr "{0}からプロファイルの取り込に失敗しました。"
+msgstr "{0}からプロファイルの取り込に失敗しました:"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:218
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:228
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:220
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "This profile {0} contains incorrect data, could not import it."
msgstr "このプロファイル{0}には、正しくないデータが含まれているため、インポートできません。"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:241
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:243
#, 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 "プロファイル{0}の中で定義されているマシン({1})は、現在お使いのマシン({2})と一致しないため、インポートできませんでした。"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:315
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to import profile from {0}:"
-msgstr "{0}からプロファイルの取り込に失敗しました。"
+msgstr "{0}からプロファイルの取り込に失敗しました:"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:316
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Successfully imported profile {0}"
msgstr "プロファイル {0}の取り込み完了"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:319
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321
#, python-brace-format
msgctxt "@info:status"
msgid "File {0} does not contain any valid profile."
msgstr "ファイル{0}には、正しいプロファイルが含まれていません。"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:322
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:324
#, python-brace-format
msgctxt "@info:status"
msgid "Profile {0} has an unknown file type or is corrupted."
msgstr "プロファイル{0}は不特定なファイルまたは破損があります。"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:340
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:359
msgctxt "@label"
msgid "Custom profile"
msgstr "カスタムプロファイル"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:356
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:375
msgctxt "@info:status"
msgid "Profile is missing a quality type."
msgstr "プロファイルはクオリティータイプが不足しています。"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:370
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:389
#, python-brace-format
msgctxt "@info:status"
msgid "Could not find a quality type {0} for the current configuration."
msgstr "進行中のプリント構成にあったクオリティータイプ{0}が見つかりませんでした。"
-#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:69
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:76
+msgctxt "@tooltip"
+msgid "Outer Wall"
+msgstr "アウターウォール"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:77
+msgctxt "@tooltip"
+msgid "Inner Walls"
+msgstr "インナーウォール"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:78
+msgctxt "@tooltip"
+msgid "Skin"
+msgstr "スキン"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:79
+msgctxt "@tooltip"
+msgid "Infill"
+msgstr "インフィル"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:80
+msgctxt "@tooltip"
+msgid "Support Infill"
+msgstr "サポートイルフィル"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:81
+msgctxt "@tooltip"
+msgid "Support Interface"
+msgstr "サポートインターフェイス"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:82
+msgctxt "@tooltip"
+msgid "Support"
+msgstr "サポート"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:83
+msgctxt "@tooltip"
+msgid "Skirt"
+msgstr "スカート"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:84
+msgctxt "@tooltip"
+msgid "Prime Tower"
+msgstr "プライムタワー"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:85
+msgctxt "@tooltip"
+msgid "Travel"
+msgstr "移動"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:86
+msgctxt "@tooltip"
+msgid "Retractions"
+msgstr "退却"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:87
+msgctxt "@tooltip"
+msgid "Other"
+msgstr "他"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:306
+#, python-brace-format
+msgctxt "@label"
+msgid "Pre-sliced file {0}"
+msgstr "スライス前ファイル {0}"
+
+#: /home/ruben/Projects/Cura/cura/UI/WelcomePagesModel.py:56
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:62
+msgctxt "@action:button"
+msgid "Next"
+msgstr "次"
+
+#: /home/ruben/Projects/Cura/cura/UI/ObjectsModel.py:61
#, python-brace-format
msgctxt "@label"
msgid "Group #{group_nr}"
msgstr "グループ #{group_nr}"
-#: /home/ruben/Projects/Cura/cura/Machines/Models/MachineManagementModel.py:65
-msgctxt "@info:title"
-msgid "Network enabled printers"
-msgstr "ネットワーク対応プリンター"
+#: /home/ruben/Projects/Cura/cura/UI/WhatsNewPagesModel.py:17
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:185
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:85
+#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:482
+#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:508
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:124
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:168
+msgctxt "@action:button"
+msgid "Close"
+msgstr "閉める"
-#: /home/ruben/Projects/Cura/cura/Machines/Models/MachineManagementModel.py:80
-msgctxt "@info:title"
-msgid "Local printers"
-msgstr "ローカルプリンター"
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:17
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:91
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:48
+msgctxt "@action:button"
+msgid "Add"
+msgstr "追加"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/ExtrudersModel.py:208
+msgctxt "@menuitem"
+msgid "Not overridden"
+msgstr "上書きできません"
#: /home/ruben/Projects/Cura/cura/Machines/Models/QualityManagementModel.py:109
#, python-brace-format
@@ -1171,23 +1154,41 @@ msgctxt "@item:inlistbox"
msgid "All Files (*)"
msgstr "全てのファイル"
-#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:665
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:86
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:182
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:269
+msgctxt "@label"
+msgid "Unknown"
+msgstr "不明"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:116
+msgctxt "@label"
+msgid "The printer(s) below cannot be connected because they are part of a group"
+msgstr "下のプリンターはグループの一員であるため接続できません"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:118
+msgctxt "@label"
+msgid "Available networked printers"
+msgstr "ネットワークで利用可能なプリンター"
+
+#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:689
msgctxt "@label"
msgid "Custom Material"
msgstr "カスタムフィラメント"
-#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:666
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:256
+#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:690
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:203
msgctxt "@label"
msgid "Custom"
msgstr "カスタム"
-#: /home/ruben/Projects/Cura/cura/BuildVolume.py:81
+#: /home/ruben/Projects/Cura/cura/BuildVolume.py:89
msgctxt "@info:status"
msgid "The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from colliding with printed models."
msgstr "プリントシークエンス設定値により、ガントリーと造形物の衝突を避けるため印刷データの高さを低くしました。"
-#: /home/ruben/Projects/Cura/cura/BuildVolume.py:83
+#: /home/ruben/Projects/Cura/cura/BuildVolume.py:91
msgctxt "@info:title"
msgid "Build Volume"
msgstr "造形サイズ"
@@ -1202,16 +1203,31 @@ msgctxt "@info:backup_failed"
msgid "Tried to restore a Cura backup without having proper data or meta data."
msgstr "適切なデータまたはメタデータがないのにCuraバックアップをリストアしようとしました。"
-#: /home/ruben/Projects/Cura/cura/Backups/Backup.py:124
+#: /home/ruben/Projects/Cura/cura/Backups/Backup.py:125
msgctxt "@info:backup_failed"
-msgid "Tried to restore a Cura backup that does not match your current version."
-msgstr "現行バージョンと一致しないCuraバックアップをリストアしようとしました。"
+msgid "Tried to restore a Cura backup that is higher than the current version."
+msgstr "現行バージョンより上の Cura バックアップをリストアしようとしました。"
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationHelpers.py:79
+msgctxt "@message"
+msgid "Could not read response."
+msgstr "応答を読み取れません。"
+
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
msgstr "Ultimaker アカウントサーバーに到達できません。"
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationRequestHandler.py:66
+msgctxt "@message"
+msgid "Please give the required permissions when authorizing this application."
+msgstr "このアプリケーションの許可において必要な権限を与えてください。"
+
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationRequestHandler.py:73
+msgctxt "@message"
+msgid "Something unexpected happened when trying to log in, please try again."
+msgstr "ログイン時に予期しないエラーが発生しました。やり直してください。"
+
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
msgid "Multiplying and placing objects"
@@ -1224,7 +1240,7 @@ msgstr "造形データを配置"
#: /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
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:149
msgctxt "@info:status"
msgid "Unable to find a location within the build volume for all objects"
msgstr "全ての造形物の造形サイズに対し、適切な位置が確認できません"
@@ -1235,19 +1251,19 @@ msgid "Placing Object"
msgstr "造形データを配置"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:30
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:67
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:66
msgctxt "@info:status"
msgid "Finding new location for objects"
msgstr "造形物のために新しい位置を探索中"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:34
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:71
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:70
msgctxt "@info:title"
msgid "Finding Location"
msgstr "位置確認"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:104
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:151
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:150
msgctxt "@info:title"
msgid "Can't Find Location"
msgstr "位置を確保できません"
@@ -1378,242 +1394,195 @@ msgstr "ログ"
#: /home/ruben/Projects/Cura/cura/CrashHandler.py:322
msgctxt "@title:groupbox"
-msgid "User description"
-msgstr "ユーザー詳細"
+msgid "User description (Note: Developers may not speak your language, please use English if possible)"
+msgstr "ユーザー説明 (注: 開発者はユーザーの言語を理解できない場合があるため、可能な限り英語を使用してください)"
-#: /home/ruben/Projects/Cura/cura/CrashHandler.py:341
+#: /home/ruben/Projects/Cura/cura/CrashHandler.py:342
msgctxt "@action:button"
msgid "Send report"
msgstr "レポート送信"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:480
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:504
msgctxt "@info:progress"
msgid "Loading machines..."
msgstr "プリンターを読み込み中…"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:781
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:819
msgctxt "@info:progress"
msgid "Setting up scene..."
msgstr "シーンをセットアップ中…"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:817
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:854
msgctxt "@info:progress"
msgid "Loading interface..."
msgstr "インターフェイスを読み込み中…"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1059
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1133
#, python-format
msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm."
msgid "%(width).1f x %(depth).1f x %(height).1f mm"
msgstr "%(width).1f x %(depth).1f x %(height).1f mm"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1618
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1611
#, python-brace-format
msgctxt "@info:status"
msgid "Only one G-code file can be loaded at a time. Skipped importing {0}"
msgstr "一度に一つのG-codeしか読み取れません。{0}の取り込みをスキップしました。"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1628
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1621
#, python-brace-format
msgctxt "@info:status"
msgid "Can't open any other file if G-code is loading. Skipped importing {0}"
msgstr "G-codeを読み込み中は他のファイルを開くことができません。{0}の取り込みをスキップしました。"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1718
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1711
msgctxt "@info:status"
msgid "The selected model was too small to load."
msgstr "選択したモデルは読み込むのに小さすぎます。"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:62
-msgctxt "@title"
-msgid "Machine Settings"
-msgstr "プリンターの設定"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:81
-msgctxt "@title:tab"
-msgid "Printer"
-msgstr "プリンター"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:100
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:58
+msgctxt "@title:label"
msgid "Printer Settings"
msgstr "プリンターの設定"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:111
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:72
msgctxt "@label"
msgid "X (Width)"
msgstr "X(幅)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:112
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:122
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:132
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:238
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:387
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:403
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:429
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:441
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:897
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:76
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:90
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:104
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:194
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:213
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:232
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:253
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:272
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:79
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:93
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:109
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:124
msgctxt "@label"
msgid "mm"
msgstr "mm"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:121
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:86
msgctxt "@label"
msgid "Y (Depth)"
msgstr "Y (奥行き)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:131
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:100
msgctxt "@label"
msgid "Z (Height)"
msgstr "Z (高さ)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:143
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:114
msgctxt "@label"
msgid "Build plate shape"
msgstr "ビルドプレート形"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:152
-msgctxt "@option:check"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:127
+msgctxt "@label"
msgid "Origin at center"
msgstr "センターを出します"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:160
-msgctxt "@option:check"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:139
+msgctxt "@label"
msgid "Heated bed"
msgstr "ヒーテッドドベッド"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:171
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:151
msgctxt "@label"
msgid "G-code flavor"
msgstr "G-codeフレーバー"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:184
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:176
+msgctxt "@title:label"
msgid "Printhead Settings"
msgstr "プリントヘッド設定"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:194
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:190
msgctxt "@label"
msgid "X min"
msgstr "X分"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:195
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "プリントヘッド左側からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷を使用。"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:204
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:209
msgctxt "@label"
msgid "Y min"
msgstr "Y分"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:205
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "プリントヘッド前部からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷を使用。"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:214
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:228
msgctxt "@label"
msgid "X max"
msgstr "最大X"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:215
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "プリントヘッド右側からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷を使用。"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:224
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:249
msgctxt "@label"
msgid "Y max"
msgstr "最大Y"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:225
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "プリントヘッド後部からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷を使用。"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:237
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:268
msgctxt "@label"
-msgid "Gantry height"
+msgid "Gantry Height"
msgstr "ガントリーの高さ"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:239
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "(X 軸及びY軸)ノズルの先端とガントリーシステムの高さに相違があります。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷を使用。"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:258
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:282
msgctxt "@label"
msgid "Number of Extruders"
msgstr "エクストルーダーの数"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:314
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:341
+msgctxt "@title:label"
msgid "Start G-code"
msgstr "G-Codeの開始"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:324
-msgctxt "@tooltip"
-msgid "G-code commands to be executed at the very start."
-msgstr "G-codeコマンドが最初に実行されるようにします。"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:333
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:355
+msgctxt "@title:label"
msgid "End G-code"
msgstr "G-codeの終了"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:343
-msgctxt "@tooltip"
-msgid "G-code commands to be executed at the very end."
-msgstr "G-codeコマンドが最後に実行されるようにします。"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:42
+msgctxt "@title:tab"
+msgid "Printer"
+msgstr "プリンター"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:374
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:63
+msgctxt "@title:label"
msgid "Nozzle Settings"
msgstr "ノズル設定"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:386
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:75
msgctxt "@label"
msgid "Nozzle size"
msgstr "ノズルサイズ"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:402
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:89
msgctxt "@label"
msgid "Compatible material diameter"
msgstr "適合する材料直径"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:404
-msgctxt "@tooltip"
-msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile."
-msgstr "プリンターに対応したフィラメントの直径。正確な直径はフィラメント及びまたはプロファイルに変動します。"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:428
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:105
msgctxt "@label"
msgid "Nozzle offset X"
msgstr "ノズルオフセットX"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:440
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:120
msgctxt "@label"
msgid "Nozzle offset Y"
msgstr "ノズルオフセットY"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:452
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:135
msgctxt "@label"
msgid "Cooling Fan Number"
msgstr "冷却ファンの番号"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:453
-msgctxt "@label"
-msgid ""
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:473
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:162
+msgctxt "@title:label"
msgid "Extruder Start G-code"
msgstr "エクストルーダーがG-Codeを開始する"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:491
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:176
+msgctxt "@title:label"
msgid "Extruder End G-code"
msgstr "エクストルーダーがG-Codeを終了する"
@@ -1623,7 +1592,7 @@ msgid "Install"
msgstr "インストール"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:20
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:44
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:46
msgctxt "@action:button"
msgid "Installed"
msgstr "インストールした"
@@ -1639,15 +1608,15 @@ msgid "ratings"
msgstr "評価"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:30
msgctxt "@title:tab"
msgid "Plugins"
msgstr "プラグイン"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:69
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:42
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:66
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:361
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:70
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:44
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:80
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:417
msgctxt "@title:tab"
msgid "Materials"
msgstr "マテリアル"
@@ -1657,52 +1626,49 @@ msgctxt "@label"
msgid "Your rating"
msgstr "ユーザー評価"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:99
msgctxt "@label"
msgid "Version"
msgstr "バージョン"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:105
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:106
msgctxt "@label"
msgid "Last updated"
msgstr "最終更新日"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:112
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:260
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:113
msgctxt "@label"
msgid "Author"
msgstr "著者"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:119
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:120
msgctxt "@label"
msgid "Downloads"
msgstr "ダウンロード"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:181
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:222
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:265
-msgctxt "@label"
-msgid "Unknown"
-msgstr "不明"
-
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:56
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
msgstr "インストールまたはアップデートにはログインが必要です"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:73
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:80
+msgctxt "@label:The string between and is the highlighted link"
+msgid "Buy material spools"
+msgstr "材料スプールの購入"
+
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:96
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
msgctxt "@action:button"
msgid "Update"
msgstr "アップデート"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:74
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:97
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:35
msgctxt "@action:button"
msgid "Updating"
msgstr "更新中"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:75
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:98
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:36
msgctxt "@action:button"
msgid "Updated"
@@ -1778,7 +1744,7 @@ msgctxt "@label"
msgid "Generic Materials"
msgstr "汎用材料"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:56
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:59
msgctxt "@title:tab"
msgid "Installed"
msgstr "インストールした"
@@ -1864,12 +1830,12 @@ msgctxt "@info"
msgid "Fetching packages..."
msgstr "パッケージ取得中…"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:90
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:91
msgctxt "@label"
msgid "Website"
msgstr "ウェブサイト"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:97
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:98
msgctxt "@label"
msgid "Email"
msgstr "電子メール"
@@ -1879,22 +1845,6 @@ msgctxt "@info:tooltip"
msgid "Some things could be problematic in this print. Click to see tips for adjustment."
msgstr "このプリントの何かが問題です。クリックして調整のヒントをご覧ください。"
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18
-msgctxt "@label"
-msgid "Changelog"
-msgstr "Changelogの表示"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:185
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:85
-#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:482
-#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:508
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:168
-msgctxt "@action:button"
-msgid "Close"
-msgstr "閉める"
-
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:31
msgctxt "@title"
msgid "Update Firmware"
@@ -1970,38 +1920,40 @@ msgctxt "@label"
msgid "Firmware update failed due to missing firmware."
msgstr "ファームウェアが見つからず、ファームウェアアップデート失敗しました。"
-#: /home/ruben/Projects/Cura/plugins/UserAgreement/UserAgreement.qml:16
-msgctxt "@title:window"
-msgid "User Agreement"
-msgstr "ユーザー用使用許諾契約"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:144
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:181
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:153
+msgctxt "@label"
+msgid "Glass"
+msgstr "ガラス"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:208
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:249
msgctxt "@info"
-msgid "These options are not available because you are monitoring a cloud printer."
-msgstr "クラウドプリンタをモニタリングしている場合は、これらのオプションは利用できません。"
+msgid "Please update your printer's firmware to manage the queue remotely."
+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 "クラウドプリンタをモニタリングしている場合は、ウェブカムを利用できません。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:300
msgctxt "@label:status"
msgid "Loading..."
msgstr "読み込み中..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:304
msgctxt "@label:status"
msgid "Unavailable"
msgstr "利用不可"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:308
msgctxt "@label:status"
msgid "Unreachable"
msgstr "到達不能"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:312
msgctxt "@label:status"
msgid "Idle"
msgstr "アイドル"
@@ -2011,37 +1963,31 @@ msgctxt "@label"
msgid "Untitled"
msgstr "無題"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:374
msgctxt "@label"
msgid "Anonymous"
msgstr "匿名"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:401
msgctxt "@label:status"
msgid "Requires configuration changes"
msgstr "構成の変更が必要です"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:439
msgctxt "@action:button"
msgid "Details"
msgstr "詳細"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:130
msgctxt "@label"
msgid "Unavailable printer"
msgstr "利用できないプリンター"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "First available"
msgstr "次の空き"
-#: /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 "ガラス"
-
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:31
msgctxt "@label"
msgid "Queued"
@@ -2049,178 +1995,189 @@ msgstr "順番を待つ"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:67
msgctxt "@label link to connect manager"
-msgid "Go to Cura Connect"
-msgstr "Cura Connectに移動する"
+msgid "Manage in browser"
+msgstr "ブラウザで管理する"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:100
+msgctxt "@label"
+msgid "There are no print jobs in the queue. Slice and send a job to add one."
+msgstr "キューに印刷ジョブがありません。追加するには、スライスしてジョブを送信します。"
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Print jobs"
msgstr "プリントジョブ"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:132
msgctxt "@label"
msgid "Total print time"
msgstr "合計印刷時間"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:148
msgctxt "@label"
msgid "Waiting for"
msgstr "待ち時間"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:246
-msgctxt "@label link to connect manager"
-msgid "View print history"
-msgstr "印刷履歴の表示"
-
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:50
msgctxt "@window:title"
msgid "Existing Connection"
msgstr "既存の接続"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:48
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:52
msgctxt "@message:text"
msgid "This printer/group is already added to Cura. Please select another printer/group."
msgstr "このプリンター/グループはすでにCuraに追加されています。別のプリンター/グループを選択しえください。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:65
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:69
msgctxt "@title:window"
msgid "Connect to Networked Printer"
msgstr "ネットワーク上で繋がったプリンターに接続"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:77
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:81
msgctxt "@label"
-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 "ネットワーク接続にて直接プリントするためには、必ずケーブルまたはWifiネットワークにて繋がっていることを確認してください。Curaをプリンターに接続していない場合でも、USBメモリを使って直接プリンターにg-codeファイルをトランスファーできます。"
+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."
+msgstr "印刷ジョブをネットワークを介してプリンターに直接送信するには、ネットワークケーブルを使用してプリンターを確実にネットワークに接続するか、プリンターを WIFI ネットワークに接続します。Cura をプリンタに接続していない場合でも、USB ドライブを使用して g コードファイルをプリンターに転送することはできます。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44
-msgctxt "@action:button"
-msgid "Add"
-msgstr "追加"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:81
+msgctxt "@label"
+msgid "Select your printer from the list below:"
+msgstr "以下のリストからプリンタを選択します:"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:97
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:101
msgctxt "@action:button"
msgid "Edit"
msgstr "編集"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:108
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:128
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:117
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:112
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:146
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:55
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:121
msgctxt "@action:button"
msgid "Remove"
msgstr "取り除く"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:120
msgctxt "@action:button"
msgid "Refresh"
msgstr "更新"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:211
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:215
msgctxt "@label"
msgid "If your printer is not listed, read the network printing troubleshooting guide"
msgstr "お持ちのプリンターがリストにない場合、ネットワーク・プリンティング・トラブルシューティング・ガイドを読んでください"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:240
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:244
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:258
msgctxt "@label"
msgid "Type"
msgstr "タイプ"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:279
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:283
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:274
msgctxt "@label"
msgid "Firmware version"
msgstr "ファームウェアバージョン"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:293
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:297
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:290
msgctxt "@label"
msgid "Address"
msgstr "アドレス"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:317
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
msgctxt "@label"
msgid "This printer is not set up to host a group of printers."
msgstr "このプリンターは、プリンターのグループをホストするために設定されていません。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:325
msgctxt "@label"
msgid "This printer is the host for a group of %1 printers."
msgstr "このプリンターは %1 プリンターのループのホストプリンターです。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:332
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:336
msgctxt "@label"
msgid "The printer at this address has not yet responded."
msgstr "このアドレスのプリンターは応答していません。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:337
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:341
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:74
msgctxt "@action:button"
msgid "Connect"
msgstr "接続"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:351
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:354
+msgctxt "@title:window"
+msgid "Invalid IP address"
+msgstr "無効なIPアドレス"
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:355
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:146
+msgctxt "@text"
+msgid "Please enter a valid IP address."
+msgstr "有効なIPアドレスを入力してください。"
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:366
msgctxt "@title:window"
msgid "Printer Address"
msgstr "プリンターアドレス"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:374
-msgctxt "@alabel"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:389
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:102
+msgctxt "@label"
msgid "Enter the IP address or hostname of your printer on the network."
msgstr "ネットワーク内のプリンターのIPアドレスまたはホストネームを入力してください。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:404
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:132
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:419
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:138
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181
msgctxt "@action:button"
msgid "OK"
msgstr "OK"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:88
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:100
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:78
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:90
msgctxt "@label:status"
msgid "Aborted"
msgstr "中止しました"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:90
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:92
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:80
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:82
msgctxt "@label:status"
msgid "Finished"
msgstr "終了"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:94
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:84
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:86
msgctxt "@label:status"
msgid "Preparing..."
msgstr "準備中..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:88
msgctxt "@label:status"
msgid "Aborting..."
msgstr "中止しています..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:92
msgctxt "@label:status"
msgid "Pausing..."
msgstr "一時停止しています..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:94
msgctxt "@label:status"
msgid "Paused"
msgstr "一時停止"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Resuming..."
msgstr "再開しています…"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Action required"
msgstr "アクションが必要です"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:100
msgctxt "@label:status"
msgid "Finishes %1 at %2"
msgstr "%1 を %2 に終了します"
@@ -2324,43 +2281,43 @@ msgctxt "@action:button"
msgid "Override"
msgstr "上書き"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:85
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] "割り当てられたプリンター %1 には以下の構成変更が必要です。"
+msgstr[0] "割り当てられたプリンター %1 には以下の構成変更が必要です:"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:68
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:89
msgctxt "@label"
msgid "The printer %1 is assigned, but the job contains an unknown material configuration."
msgstr "プリンター %1 が割り当てられましたが、ジョブには不明な材料構成があります。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:78
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:99
msgctxt "@label"
msgid "Change material %1 from %2 to %3."
msgstr "材料 %1 を %2 から %3 に変更します。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:81
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:102
msgctxt "@label"
msgid "Load %3 as material %1 (This cannot be overridden)."
msgstr "%3 を 材料 %1 にロードします(これは上書きできません)。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:84
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:105
msgctxt "@label"
msgid "Change print core %1 from %2 to %3."
msgstr "プリントコア %1 を %2 から %3 に変更します。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:87
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:108
msgctxt "@label"
msgid "Change build plate to %1 (This cannot be overridden)."
msgstr "ビルドプレートを %1 に変更します(これは上書きできません)。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:115
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
msgstr "上書きは、既存のプリンタ構成で指定された設定を使用します。これにより、印刷が失敗する場合があります。"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:135
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:156
msgctxt "@label"
msgid "Aluminum"
msgstr "アルミニウム"
@@ -2370,110 +2327,111 @@ msgctxt "@info:tooltip"
msgid "Connect to a printer"
msgstr "プリンターにつなぐ"
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:92
+#: /home/ruben/Projects/Cura/plugins/SettingsGuide/resources/qml/SettingsGuide.qml:16
+msgctxt "@title"
+msgid "Cura Settings Guide"
+msgstr "Cura 設定ガイド"
+
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:100
msgctxt "@info"
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."
+"- Check if the printer is connected to the network.\n"
+"- Check if you are signed in to discover cloud-connected printers."
msgstr ""
-"プリンタが接続されていること確認してください:\n"
-"- プリンタの電源が入っていることを確認してください。\n"
-"- プリンタがネットワークに接続されているか確認してください。"
+"プリンタが接続されているか確認し、以下を行います。\n"
+"- プリンタの電源が入っているか確認します。\n"
+"- プリンタがネットワークに接続されているかどうかを確認します。- クラウドに接続されたプリンタを検出するためにサインインしているかどうかを確認します。"
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:117
msgctxt "@info"
-msgid "Please select a network connected printer to monitor."
-msgstr "モニターするプリンタが接続されているネットワークを選択してください。"
+msgid "Please connect your printer to the network."
+msgstr "プリンターをネットワークに接続してください。"
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
-msgctxt "@info"
-msgid "Please connect your Ultimaker printer to your local network."
-msgstr "Ultimaker プリンタをローカルネットワークに接続してください。"
-
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:156
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
msgstr "ユーザーマニュアルをオンラインで見る"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:20
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:49
msgctxt "@label"
msgid "Color scheme"
msgstr "カラースキーム"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:105
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:107
msgctxt "@label:listbox"
msgid "Material Color"
msgstr "フィラメントの色"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:109
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:111
msgctxt "@label:listbox"
msgid "Line Type"
msgstr "ラインタイプ"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:113
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:115
msgctxt "@label:listbox"
msgid "Feedrate"
msgstr "送り速度"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:117
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:119
msgctxt "@label:listbox"
msgid "Layer thickness"
msgstr "レイヤーの厚さ"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:154
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:156
msgctxt "@label"
msgid "Compatibility Mode"
msgstr "コンパティビリティモード"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:230
msgctxt "@label"
msgid "Travels"
msgstr "移動"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:236
msgctxt "@label"
msgid "Helpers"
msgstr "ヘルプ"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:242
msgctxt "@label"
msgid "Shell"
msgstr "外郭"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:248
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
msgctxt "@label"
msgid "Infill"
msgstr "インフィル"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:297
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:298
msgctxt "@label"
msgid "Only Show Top Layers"
msgstr "トップのレイヤーを表示する"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:307
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:308
msgctxt "@label"
msgid "Show 5 Detailed Layers On Top"
msgstr "トップの5レイヤーの詳細を表示する"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:321
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:322
msgctxt "@label"
msgid "Top / Bottom"
msgstr "トップ/ボトム"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:325
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:326
msgctxt "@label"
msgid "Inner Wall"
msgstr "インナーウォール"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:383
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:384
msgctxt "@label"
msgid "min"
msgstr "最小"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:432
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:433
msgctxt "@label"
msgid "max"
msgstr "最大"
@@ -2503,30 +2461,25 @@ msgctxt "@info:tooltip"
msgid "Change active post-processing scripts"
msgstr "処理したスクリプトを変更する"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:16
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:17
msgctxt "@title:window"
msgid "More information on anonymous data collection"
msgstr "匿名データの収集に関する詳細"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:66
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:74
msgctxt "@text:window"
-msgid "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."
-msgstr "Curaは印刷の品質とユーザー体験を向上させるために匿名のデータをUltimakerに送信します。以下は送信される全テータの例です。"
+msgid "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:"
+msgstr "Ultimaker Cura は、印刷品質とユーザーエクスペリエンスを向上させるために匿名データを収集します。以下は、共有されるすべてのデータの例です:"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:109
msgctxt "@text:window"
-msgid "I don't want to send this data"
-msgstr "このデータは送信しない"
+msgid "I don't want to send anonymous data"
+msgstr "匿名データは送信しない"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:118
msgctxt "@text:window"
-msgid "Allow sending this data to Ultimaker and help us improve Cura"
-msgstr "Ultimakerへのデータ送信を許可し、Curaの改善を手助けする"
-
-#: /home/ruben/Projects/Cura/plugins/R2D2/EvaluationSidebar.qml:49
-msgctxt "@label"
-msgid "No print selected"
-msgstr "プリンタが選択されていません"
+msgid "Allow sending anonymous data"
+msgstr "匿名データの送信を許可する"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2575,19 +2528,19 @@ msgstr "深さ(mm)"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126
msgctxt "@info:tooltip"
-msgid "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."
-msgstr "デフォルトで、白ピクセルはメッシュの高いポイントを表し、黒ピクセルはメッシュの低いポイントを表します。このオプションをリバースするために変更し、黒ピクセルがメッシュの高いポイントを表し、白ピクセルがメッシュの低いポイントを表すようにする。"
-
-#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
-msgctxt "@item:inlistbox"
-msgid "Lighter is higher"
-msgstr "薄いほうを高く"
+msgid "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."
+msgstr "リトフェインの場合、暗いピクセルは、より多くの光を通すために厚い場所に対応する必要があります。高さマップの場合、明るいピクセルは高い地形を表しているため、明るいピクセルは生成された3D モデルの厚い位置に対応する必要があります。"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
msgctxt "@item:inlistbox"
msgid "Darker is higher"
msgstr "暗いほうを高く"
+#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
+msgctxt "@item:inlistbox"
+msgid "Lighter is higher"
+msgstr "薄いほうを高く"
+
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149
msgctxt "@info:tooltip"
msgid "The amount of smoothing to apply to the image."
@@ -2701,7 +2654,7 @@ msgid "Printer Group"
msgstr "プリンターグループ"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:180
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:197
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:226
msgctxt "@action:label"
msgid "Profile settings"
msgstr "プロファイル設定"
@@ -2714,20 +2667,20 @@ msgstr "このプロファイルの問題をどのように解決すればいい
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:121
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:221
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:250
msgctxt "@action:label"
msgid "Name"
msgstr "ネーム"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:231
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:205
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:234
msgctxt "@action:label"
msgid "Not in profile"
msgstr "プロファイル内にない"
# Can’t edit the Japanese text
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:236
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:210
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:239
msgctxt "@action:label"
msgid "%1 override"
msgid_plural "%1 overrides"
@@ -2809,6 +2762,7 @@ msgstr "Cura のバックアップおよび同期を設定します。"
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:51
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:68
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:138
msgctxt "@button"
msgid "Sign in"
msgstr "サインイン"
@@ -2899,22 +2853,23 @@ msgid "Previous"
msgstr "前"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:60
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:152
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:174
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:159
msgctxt "@action:button"
msgid "Export"
msgstr "書き出す"
-#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:62
-msgctxt "@action:button"
-msgid "Next"
-msgstr "次"
-
-#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:169
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:209
msgctxt "@label"
msgid "Tip"
msgstr "ヒント"
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMaterialMenu.qml:20
+#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:66
+msgctxt "@label:category menu label"
+msgid "Generic"
+msgstr "汎用"
+
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:160
msgctxt "@label"
msgid "Print experiment"
@@ -2925,150 +2880,51 @@ msgctxt "@label"
msgid "Checklist"
msgstr "チェックリスト"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25
-msgctxt "@title"
-msgid "Select Printer Upgrades"
-msgstr "プリンターアップグレードを選択する"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:38
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:30
msgctxt "@label"
msgid "Please select any upgrades made to this Ultimaker 2."
msgstr "このUltimaker2に施したアップグレードを選択してください。"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:47
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:44
msgctxt "@label"
msgid "Olsson Block"
msgstr "Olsson Block"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:30
msgctxt "@title"
msgid "Build Plate Leveling"
msgstr "ビルドプレートのレベリング"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:44
msgctxt "@label"
msgid "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."
msgstr "プリントの成功率を上げるために、ビルドプレートを今調整できます。’次のポジションに移動’をクリックすると。"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:57
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 "すべてのポジションに。"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:75
msgctxt "@action:button"
msgid "Start Build Plate Leveling"
msgstr "ビルドプレートのレベリングを開始する"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:87
msgctxt "@action:button"
msgid "Move to Next Position"
msgstr "次のポジションに移動"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:30
msgctxt "@label"
msgid "Please select any upgrades made to this Ultimaker Original"
msgstr "このUltimaker Originalに施されたアップグレートを選択する"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:41
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"
@@ -3117,172 +2973,172 @@ msgstr "プリント中止"
#: /home/ruben/Projects/Cura/resources/qml/MonitorButton.qml:337
msgctxt "@label"
msgid "Are you sure you want to abort the print?"
-msgstr "本当にプリントを中止してもいいですか。"
+msgstr "本当にプリントを中止してもいいですか?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:71
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:73
msgctxt "@title"
msgid "Information"
msgstr "インフォメーション"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:100
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:102
msgctxt "@title:window"
msgid "Confirm Diameter Change"
msgstr "直径変更の確認"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:101
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:103
msgctxt "@label (%1 is a number)"
msgid "The new filament diameter is set to %1 mm, which is not compatible with the current extruder. Do you wish to continue?"
msgstr "新しいフィラメントの直径は %1 mm に設定されています。これは現在のエクストルーダーに適応していません。続行しますか?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:133
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:127
msgctxt "@label"
msgid "Display Name"
msgstr "ディスプレイ名"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:143
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:137
msgctxt "@label"
msgid "Brand"
msgstr "ブランド"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:153
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:147
msgctxt "@label"
msgid "Material Type"
msgstr "フィラメントタイプ"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:162
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:157
msgctxt "@label"
msgid "Color"
msgstr "色"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:212
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:207
msgctxt "@label"
msgid "Properties"
msgstr "プロパティ"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:214
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:209
msgctxt "@label"
msgid "Density"
msgstr "密度"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:229
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:224
msgctxt "@label"
msgid "Diameter"
msgstr "直径"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:263
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:258
msgctxt "@label"
msgid "Filament Cost"
msgstr "フィラメントコスト"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:280
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:275
msgctxt "@label"
msgid "Filament weight"
msgstr "フィラメントの重さ"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:298
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:293
msgctxt "@label"
msgid "Filament length"
msgstr "フィラメントの長さ"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:307
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:302
msgctxt "@label"
msgid "Cost per Meter"
msgstr "毎メーターコスト"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:321
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:316
msgctxt "@label"
msgid "This material is linked to %1 and shares some of its properties."
msgstr "このフィラメントは %1にリンクすプロパティーを共有する。"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:328
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:323
msgctxt "@label"
msgid "Unlink Material"
msgstr "フィラメントをリンクを外す"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:339
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:334
msgctxt "@label"
msgid "Description"
msgstr "記述"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:352
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:347
msgctxt "@label"
msgid "Adhesion Information"
msgstr "接着のインフォメーション"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:378
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:17
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:373
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label"
msgid "Print settings"
msgstr "プリント設定"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:84
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:72
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:99
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:40
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:73
msgctxt "@action:button"
msgid "Activate"
msgstr "アクティベート"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:101
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:117
msgctxt "@action:button"
msgid "Create"
msgstr "作成する"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:114
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:131
msgctxt "@action:button"
msgid "Duplicate"
msgstr "複製"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:141
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:142
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:160
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:148
msgctxt "@action:button"
msgid "Import"
msgstr "取り込む"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:203
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:223
msgctxt "@action:label"
msgid "Printer"
msgstr "プリンター"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:262
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:246
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:287
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:253
msgctxt "@title:window"
msgid "Confirm Remove"
msgstr "モデルを取り除きました"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:263
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:247
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:254
msgctxt "@label (%1 is object name)"
msgid "Are you sure you wish to remove %1? This cannot be undone!"
-msgstr "%1を取り外しますか?この作業はやり直しが効きません。"
+msgstr "%1を取り外しますか?この作業はやり直しが効きません!"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:277
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:285
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:304
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:312
msgctxt "@title:window"
msgid "Import Material"
msgstr "フィラメントを取り込む"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:286
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:313
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Could not import material %1: %2"
msgstr "%1フィラメントを取り込むことができない: %2"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:317
msgctxt "@info:status Don't translate the XML tag !"
msgid "Successfully imported material %1"
msgstr "フィラメント%1の取り込みに成功しました"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:308
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:316
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:335
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:343
msgctxt "@title:window"
msgid "Export Material"
msgstr "フィラメントを書き出す"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:320
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:347
msgctxt "@info:status Don't translate the XML tags and !"
msgid "Failed to export material to %1: %2"
msgstr "フィラメントの書き出しに失敗しました %1: %2"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:326
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:353
msgctxt "@info:status Don't translate the XML tag !"
msgid "Successfully exported material to %1"
msgstr "フィラメントの%1への書き出しが完了ました"
@@ -3297,412 +3153,437 @@ msgctxt "@label:textbox"
msgid "Check all"
msgstr "全てを調べる"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:47
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:48
msgctxt "@info:status"
msgid "Calculated"
msgstr "計算された"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:61
msgctxt "@title:column"
msgid "Setting"
msgstr "設定"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:68
msgctxt "@title:column"
msgid "Profile"
msgstr "プロファイル"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:74
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75
msgctxt "@title:column"
msgid "Current"
msgstr "現在"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:82
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:83
msgctxt "@title:column"
msgid "Unit"
msgstr "ユニット"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:15
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:354
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:410
msgctxt "@title:tab"
msgid "General"
msgstr "一般"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:126
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:130
msgctxt "@label"
msgid "Interface"
msgstr "インターフェイス"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:137
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:141
msgctxt "@label"
msgid "Language:"
msgstr "言語:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:204
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:208
msgctxt "@label"
msgid "Currency:"
msgstr "通貨:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:217
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221
msgctxt "@label"
msgid "Theme:"
msgstr "テーマ:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:273
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:277
msgctxt "@label"
msgid "You will need to restart the application for these changes to have effect."
msgstr "それらの変更を有効にするためにはアプリケーションを再起動しなけらばなりません。"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:294
msgctxt "@info:tooltip"
msgid "Slice automatically when changing settings."
msgstr "セッティングを変更すると自動にスライスします。"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:302
msgctxt "@option:check"
msgid "Slice automatically"
msgstr "自動的にスライスする"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:312
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:316
msgctxt "@label"
msgid "Viewport behavior"
msgstr "ビューポイント機能"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:324
msgctxt "@info:tooltip"
msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly."
msgstr "赤でサポートができないエリアをハイライトしてください。サポートがない場合、正確にプリントができない場合があります。"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:329
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:333
msgctxt "@option:check"
msgid "Display overhang"
msgstr "ディスプレイオーバーハング"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:336
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341
msgctxt "@info:tooltip"
msgid "Moves the camera so the model is in the center of the view when a model is selected"
msgstr "モデルの選択時にモデルがカメラの中心に見えるようにカメラを移動する"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:346
msgctxt "@action:button"
msgid "Center camera when item is selected"
msgstr "アイテムを選択するとカメラが中心にきます"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:350
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356
msgctxt "@info:tooltip"
msgid "Should the default zoom behavior of cura be inverted?"
msgstr "Curaのデフォルトのズーム機能は変更できるべきか?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:355
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361
msgctxt "@action:button"
msgid "Invert the direction of camera zoom."
msgstr "カメラのズーム方向を反転する。"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:365
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371
msgctxt "@info:tooltip"
msgid "Should zooming move in the direction of the mouse?"
msgstr "ズームはマウスの方向に動くべきか?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371
+msgctxt "@info:tooltip"
+msgid "Zooming towards the mouse is not supported in the orthogonal perspective."
+msgstr "平行投影表示では、マウスの方向にズームする操作がサポートされていません。"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:376
msgctxt "@action:button"
msgid "Zoom toward mouse direction"
msgstr "マウスの方向にズームする"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:380
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402
msgctxt "@info:tooltip"
msgid "Should models on the platform be moved so that they no longer intersect?"
msgstr "交差を避けるためにプラットホーム上のモデルを移動するべきですか?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:385
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:407
msgctxt "@option:check"
msgid "Ensure models are kept apart"
msgstr "モデルの距離が離れているように確認する"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:394
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416
msgctxt "@info:tooltip"
msgid "Should models on the platform be moved down to touch the build plate?"
msgstr "プラットホーム上のモデルはブルドプレートに触れるように下げるべきか?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:421
msgctxt "@option:check"
msgid "Automatically drop models to the build plate"
msgstr "自動的にモデルをビルドプレートに落とす"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:411
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433
msgctxt "@info:tooltip"
msgid "Show caution message in g-code reader."
msgstr "G-codeリーダーに注意メッセージを表示します。"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:420
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:442
msgctxt "@option:check"
msgid "Caution message in g-code reader"
msgstr "G-codeリーダーに注意メッセージ"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:428
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:450
msgctxt "@info:tooltip"
msgid "Should layer be forced into compatibility mode?"
msgstr "レイヤーはコンパティビリティモードに強制されるべきか?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:455
msgctxt "@option:check"
msgid "Force layer view compatibility mode (restart required)"
msgstr "レイヤービューコンパティビリティモードを強制する。(再起動が必要)"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:449
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:465
+msgctxt "@info:tooltip"
+msgid "What type of camera rendering should be used?"
+msgstr "どのような種類のカメラレンダリングを使用する必要がありますか?"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:472
+msgctxt "@window:text"
+msgid "Camera rendering: "
+msgstr "カメラレンダリング: "
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:483
+msgid "Perspective"
+msgstr "パースペクティブ表示"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:484
+msgid "Orthogonal"
+msgstr "平行投影表示"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:515
msgctxt "@label"
msgid "Opening and saving files"
msgstr "ファイルを開くまた保存"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:456
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522
msgctxt "@info:tooltip"
msgid "Should models be scaled to the build volume if they are too large?"
msgstr "モデルがビルドボリュームに対して大きすぎる場合はスケールされるべきか?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:461
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:527
msgctxt "@option:check"
msgid "Scale large models"
msgstr "大きなモデルをスケールする"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537
msgctxt "@info:tooltip"
msgid "An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be scaled up?"
msgstr "ユニット値がミリメートルではなくメートルの場合、モデルが極端に小さく現れる場合があります。モデルはスケールアップされるべきですか?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:542
msgctxt "@option:check"
msgid "Scale extremely small models"
msgstr "極端に小さなモデルをスケールアップする"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:486
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:552
msgctxt "@info:tooltip"
msgid "Should models be selected after they are loaded?"
msgstr "モデルはロード後に選択しますか?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:491
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:557
msgctxt "@option:check"
msgid "Select models when loaded"
msgstr "ロード後にモデルを選択"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:567
msgctxt "@info:tooltip"
msgid "Should a prefix based on the printer name be added to the print job name automatically?"
msgstr "プリンター名の敬称はプリントジョブの名前に自動的に加えられるべきか?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:506
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:572
msgctxt "@option:check"
msgid "Add machine prefix to job name"
msgstr "プリンターの敬称をジョブネームに加える"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:516
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582
msgctxt "@info:tooltip"
msgid "Should a summary be shown when saving a project file?"
msgstr "プロジェクトファイルを保存時にサマリーを表示するべきか?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:586
msgctxt "@option:check"
msgid "Show summary dialog when saving project"
msgstr "プロジェクトを保存時にダイアログサマリーを表示する"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:530
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596
msgctxt "@info:tooltip"
msgid "Default behavior when opening a project file"
msgstr "プロジェクトファイルを開く際のデフォルト機能"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:538
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:604
msgctxt "@window:text"
msgid "Default behavior when opening a project file: "
msgstr "プロジェクトファイル開く際のデフォルト機能: "
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:552
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:618
msgctxt "@option:openProject"
msgid "Always ask me this"
msgstr "毎回確認する"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:553
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:619
msgctxt "@option:openProject"
msgid "Always open as a project"
msgstr "常にプロジェクトとして開く"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:554
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620
msgctxt "@option:openProject"
msgid "Always import models"
msgstr "常にモデルを取り込む"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:590
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656
msgctxt "@info:tooltip"
msgid "When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want to keep your modifications or not, or you can choose a default behaviour and never show that dialog again."
msgstr "プロファイル内を変更し異なるプロファイルにしました、どこの変更点を保持、破棄したいのダイアログが表示されます、また何度もダイアログが表示されないようにデフォルト機能を選ぶことができます。"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:599
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:665
msgctxt "@label"
msgid "Profiles"
msgstr "プロファイル"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:604
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:670
msgctxt "@window:text"
msgid "Default behavior for changed setting values when switching to a different profile: "
msgstr "プロファイル交換時に設定値を変更するためのデフォルト処理: "
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:618
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:684
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:157
msgctxt "@option:discardOrKeep"
msgid "Always ask me this"
msgstr "毎回確認する"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:619
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685
msgctxt "@option:discardOrKeep"
msgid "Always discard changed settings"
msgstr "常に変更した設定を廃棄する"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:686
msgctxt "@option:discardOrKeep"
msgid "Always transfer changed settings to new profile"
msgstr "常に変更した設定を新しいプロファイルに送信する"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:654
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:720
msgctxt "@label"
msgid "Privacy"
msgstr "プライバシー"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:661
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:727
msgctxt "@info:tooltip"
msgid "Should Cura check for updates when the program is started?"
msgstr "Curaのプログラム開始時にアップデートがあるかチェックしますか?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:666
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:732
msgctxt "@option:check"
msgid "Check for updates on start"
msgstr "スタート時にアップデートあるかどうかのチェック"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:676
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:742
msgctxt "@info:tooltip"
msgid "Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored."
msgstr "プリンターの不明なデータをUltimakerにおくりますか?メモ、モデル、IPアドレス、個人的な情報は送信されたり保存されたりはしません。"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:681
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:747
msgctxt "@option:check"
msgid "Send (anonymous) print information"
msgstr "(不特定な) プリントインフォメーションを送信"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:690
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:756
msgctxt "@action:button"
msgid "More information"
msgstr "詳細"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:708
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:774
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:27
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ProfileMenu.qml:23
msgctxt "@label"
msgid "Experimental"
msgstr "実験"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:715
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:781
msgctxt "@info:tooltip"
msgid "Use multi build plate functionality"
msgstr "マルチビルドプレート機能を使用"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:720
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:786
msgctxt "@option:check"
msgid "Use multi build plate functionality (restart required)"
msgstr "マルチビルドプレート機能を使用 (再起動が必要)"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:16
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:359
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:415
msgctxt "@title:tab"
msgid "Printers"
msgstr "プリンター"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:129
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:63
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:134
msgctxt "@action:button"
msgid "Rename"
msgstr "名を変える"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:36
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:363
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:419
msgctxt "@title:tab"
msgid "Profiles"
msgstr "プロファイル"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:87
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:89
msgctxt "@label"
msgid "Create"
msgstr "作成する"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:105
msgctxt "@label"
msgid "Duplicate"
msgstr "複製"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:174
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:181
msgctxt "@title:window"
msgid "Create Profile"
msgstr "プロファイルを作る"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:183
msgctxt "@info"
msgid "Please provide a name for this profile."
msgstr "このプロファイルの名前を指定してください。"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:239
msgctxt "@title:window"
msgid "Duplicate Profile"
msgstr "プロファイルを複製する"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:263
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:270
msgctxt "@title:window"
msgid "Rename Profile"
msgstr "プロファイル名を変える"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:276
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:283
msgctxt "@title:window"
msgid "Import Profile"
msgstr "プロファイルを取り込む"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:302
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:309
msgctxt "@title:window"
msgid "Export Profile"
msgstr "プロファイルを書き出す"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:357
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:364
msgctxt "@label %1 is printer name"
msgid "Printer: %1"
msgstr "プリンター:%1"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:420
msgctxt "@label"
msgid "Default profiles"
msgstr "デフォルトプロファイル"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:420
msgctxt "@label"
msgid "Custom profiles"
msgstr "カスタムプロファイル"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:490
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:500
msgctxt "@action:button"
msgid "Update profile with current settings/overrides"
-msgstr "プロファイルを現在のセッティング/"
+msgstr "プロファイルを現在のセッティング"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:497
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:507
msgctxt "@action:button"
msgid "Discard current changes"
msgstr "今の変更を破棄する"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:514
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:524
msgctxt "@action:label"
msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below."
msgstr "このプロファイルはプリンターによりデフォルトを使用、従いこのプロファイルはセッティング/書き換えが以下のリストにありません。"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:521
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:531
msgctxt "@action:label"
msgid "Your current settings match the selected profile."
msgstr "設定は選択したプロファイルにマッチしています。"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:540
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:550
msgctxt "@title:tab"
msgid "Global Settings"
msgstr "グローバル設定"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:89
msgctxt "@action:button"
msgid "Marketplace"
msgstr "マーケットプレース"
@@ -3745,12 +3626,12 @@ msgctxt "@title:menu menubar:toplevel"
msgid "&Help"
msgstr "ヘルプ"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:123
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:124
msgctxt "@title:window"
msgid "New project"
msgstr "新しいプロジェクト"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:124
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:125
msgctxt "@info:question"
msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings."
msgstr "新しいプロジェクトを開始しますか?この作業では保存していない設定やビルドプレートをクリアします。"
@@ -3765,33 +3646,33 @@ msgctxt "@label:textbox"
msgid "search settings"
msgstr "検索設定"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:466
msgctxt "@action:menu"
msgid "Copy value to all extruders"
msgstr "すべてのエクストルーダーの値をコピーする"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:474
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:475
msgctxt "@action:menu"
msgid "Copy all changed values to all extruders"
msgstr "すべてのエクストルーダーに対して変更された値をコピーする"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512
msgctxt "@action:menu"
msgid "Hide this setting"
msgstr "この設定を非表示にする"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:529
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:525
msgctxt "@action:menu"
msgid "Don't show this setting"
msgstr "この設定を表示しない"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:533
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:529
msgctxt "@action:menu"
msgid "Keep this setting visible"
msgstr "常に見えるように設定する"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:557
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:548
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:434
msgctxt "@action:menu"
msgid "Configure setting visibility..."
msgstr "視野のセッティングを構成する…"
@@ -3806,27 +3687,32 @@ msgstr ""
"いくらかの非表示設定は通常の計算された値と異なる値を使用します。\n"
"表示されるようにクリックしてください。"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:81
+msgctxt "@label"
+msgid "This setting is not used because all the settings that it influences are overridden."
+msgstr "影響を与えるすべての設定がオーバーライドされるため、この設定は使用されません。"
+
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:86
msgctxt "@label Header for list of settings."
msgid "Affects"
msgstr "影響"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:71
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:91
msgctxt "@label Header for list of settings."
msgid "Affected By"
msgstr "次によって影響を受ける"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:166
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186
msgctxt "@label"
msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders."
msgstr "この設定は常に全てのエクストルーダーに共有されています。ここですべてのエクストルーダーの数値を変更できます。"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:170
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190
msgctxt "@label"
msgid "The value is resolved from per-extruder values "
msgstr "この値は各エクストルーダーの値から取得します "
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:208
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:228
msgctxt "@label"
msgid ""
"This setting has a value that is different from the profile.\n"
@@ -3836,7 +3722,7 @@ msgstr ""
"この設定にプロファイルと異なった値があります。\n"
"プロファイルの値を戻すためにクリックしてください。"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:302
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:322
msgctxt "@label"
msgid ""
"This setting is normally calculated, but it currently has an absolute value set.\n"
@@ -3846,12 +3732,12 @@ msgstr ""
"このセッティングは通常計算されます、今は絶対値に固定されています。\n"
"計算された値に変更するためにクリックを押してください。"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:144
msgctxt "@button"
msgid "Recommended"
msgstr "推奨"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:158
msgctxt "@button"
msgid "Custom"
msgstr "カスタム"
@@ -3866,27 +3752,22 @@ msgctxt "@label"
msgid "Gradual infill will gradually increase the amount of infill towards the top."
msgstr "グラデュアルインフィルはトップに向かうに従ってインフィルの量を増やします。"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:30
msgctxt "@label"
msgid "Support"
msgstr "サポート"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:71
msgctxt "@label"
msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing."
msgstr "オーバーハングがあるモデルにサポートを生成します。このサポート構造なしでは、プリント中にオーバーハングのパーツが崩壊してしまいます。"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:136
-msgctxt "@label"
-msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air."
-msgstr "サポートに使うエクストルーダーを選択してください。モデルの垂れや中空プリントを避けるためにモデルの下にサポート構造を生成します。"
-
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:29
msgctxt "@label"
msgid "Adhesion"
msgstr "密着性"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:74
msgctxt "@label"
msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards."
msgstr "ブリムまたはラフトのプリントの有効化。それぞれ、プリントの周り、また造形物の下に底面を加え切り取りやすくします。"
@@ -3903,8 +3784,8 @@ 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 "この品質プロファイルは現在の材料およびノズル構成では使用できません。この品質プロファイルを使用できるように変更してください"
+msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile."
+msgstr "この品質プロファイルは、現在の材料およびノズル構成では使用できません。この品質プロファイルを有効にするには、これらを変更してください。"
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
msgctxt "@tooltip"
@@ -3936,10 +3817,10 @@ msgstr ""
"いくらかの設定プロファイルにある値とことなる場合無効にします。\n"
"プロファイルマネージャーをクリックして開いてください。"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:21
msgctxt "@label shown when we load a Gcode file"
-msgid "Print setup disabled. G code file can not be modified."
-msgstr "印刷の設定を無効にしました。G コードファイルは変更できません。"
+msgid "Print setup disabled. G-code file can not be modified."
+msgstr "印刷設定は無効にされました。G-code ファイルは変更できません。"
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
msgctxt "@label"
@@ -3971,7 +3852,7 @@ msgctxt "@label"
msgid "Send G-code"
msgstr "G-codeの送信"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:364
+#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:365
msgctxt "@tooltip of G-code command input"
msgid "Send a custom G-code command to the connected printer. Press 'enter' to send the command."
msgstr "カスタムG-codeコマンドを接続されているプリンターに送信します。「Enter」を押してコマンドを送信します。"
@@ -4068,11 +3949,6 @@ msgctxt "@label:category menu label"
msgid "Favorites"
msgstr "お気に入り"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:66
-msgctxt "@label:category menu label"
-msgid "Generic"
-msgstr "汎用"
-
#: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25
msgctxt "@label:category menu label"
msgid "Network enabled printers"
@@ -4088,32 +3964,32 @@ msgctxt "@title:menu menubar:settings"
msgid "&Printer"
msgstr "&プリンター"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:26
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:32
msgctxt "@title:menu"
msgid "&Material"
msgstr "&フィラメント"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:35
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:41
msgctxt "@action:inmenu"
msgid "Set as Active Extruder"
msgstr "アクティブエクストルーダーとしてセットする"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:41
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:47
msgctxt "@action:inmenu"
msgid "Enable Extruder"
msgstr "エクストルーダーを有効にする"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:48
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:54
msgctxt "@action:inmenu"
msgid "Disable Extruder"
msgstr "エクストルーダーを無効にする"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:62
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:68
msgctxt "@title:menu"
msgid "&Build plate"
msgstr "ビルドプレート (&B)"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:65
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:71
msgctxt "@title:settings"
msgid "&Profile"
msgstr "&プロファイル"
@@ -4123,7 +3999,22 @@ msgctxt "@action:inmenu menubar:view"
msgid "&Camera position"
msgstr "カメラ位置 (&C)"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:35
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:44
+msgctxt "@action:inmenu menubar:view"
+msgid "Camera view"
+msgstr "カメラビュー"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:47
+msgctxt "@action:inmenu menubar:view"
+msgid "Perspective"
+msgstr "パースペクティブ表示"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:59
+msgctxt "@action:inmenu menubar:view"
+msgid "Orthographic"
+msgstr "平行投影表示"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:80
msgctxt "@action:inmenu menubar:view"
msgid "&Build plate"
msgstr "ビルドプレート (&B)"
@@ -4187,12 +4078,7 @@ msgctxt "@label"
msgid "Select configuration"
msgstr "構成の選択"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
-msgctxt "@label"
-msgid "See the material compatibility chart"
-msgstr "材料の適合性チャートをご覧ください"
-
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:221
msgctxt "@label"
msgid "Configurations"
msgstr "構成"
@@ -4217,17 +4103,17 @@ msgctxt "@label"
msgid "Printer"
msgstr "プリンター"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:213
msgctxt "@label"
msgid "Enabled"
msgstr "有効"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:250
msgctxt "@label"
msgid "Material"
msgstr "フィラメント"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:375
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
msgstr "この材料の組み合わせの接着に接着材を使用する。"
@@ -4247,42 +4133,47 @@ msgctxt "@title:menu menubar:file"
msgid "Open &Recent"
msgstr "最近開いたファイルを開く"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:145
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:140
msgctxt "@label"
msgid "Active print"
msgstr "プリントをアクティベートする"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:153
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:148
msgctxt "@label"
msgid "Job Name"
msgstr "ジョブネーム"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:161
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:156
msgctxt "@label"
msgid "Printing Time"
msgstr "プリント時間"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:169
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:164
msgctxt "@label"
msgid "Estimated time left"
msgstr "残り時間"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
-msgid "View types"
+msgid "View type"
msgstr "タイプ表示"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
+#: /home/ruben/Projects/Cura/resources/qml/ObjectSelector.qml:59
msgctxt "@label"
-msgid "Hi "
-msgstr "こんにちわ "
+msgid "Object list"
+msgstr "オブジェクトリスト"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:22
+msgctxt "@label The argument is a username."
+msgid "Hi %1"
+msgstr "高 %1"
+
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:33
msgctxt "@button"
msgid "Ultimaker account"
msgstr "Ultimaker アカウント"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:42
msgctxt "@button"
msgid "Sign out"
msgstr "サインアウト"
@@ -4292,11 +4183,6 @@ msgctxt "@action:button"
msgid "Sign in"
msgstr "サインイン"
-#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
-msgctxt "@label"
-msgid "Ultimaker Cloud"
-msgstr "Ultimaker Cloud"
-
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
@@ -4307,11 +4193,11 @@ msgctxt "@text"
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"
+"- Get exclusive access to print profiles from leading brands"
msgstr ""
-"- 印刷ジョブをローカルネットワークの外の Ultimaker プリンタに送信します\n"
+"印刷ジョブをローカルネットワークの外の Ultimaker プリンタに送信します\n"
"- Ultimaker Cura の設定をクラウドに保管してどこからでも利用できるようにします\n"
-"- 有名ブランドから材料プロファイルへの例外アクセスを取得します"
+"- 有名ブランドから印刷プロファイルへの例外アクセスを取得します"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
@@ -4323,50 +4209,55 @@ msgctxt "@label"
msgid "No time estimation available"
msgstr "時間予測がありません"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:77
msgctxt "@label"
msgid "No cost estimation available"
msgstr "コスト予測がありません"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:127
msgctxt "@button"
msgid "Preview"
msgstr "プレビュー"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:55
msgctxt "@label:PrintjobStatus"
msgid "Slicing..."
msgstr "スライス中…"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:61
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:67
msgctxt "@label:PrintjobStatus"
-msgid "Unable to Slice"
+msgid "Unable to slice"
msgstr "スライスできません"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:103
+msgctxt "@button"
+msgid "Processing"
+msgstr "処理"
+
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:103
msgctxt "@button"
msgid "Slice"
msgstr "スライス"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:104
msgctxt "@label"
msgid "Start the slicing process"
msgstr "スライス処理の開始"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:118
msgctxt "@button"
msgid "Cancel"
msgstr "キャンセル"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
-msgid "Time specification"
-msgstr "時間仕様"
+msgid "Time estimation"
+msgstr "時間予測"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
-msgid "Material specification"
-msgstr "材料仕様"
+msgid "Material estimation"
+msgstr "材料予測"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4388,285 +4279,299 @@ msgctxt "@label"
msgid "Preset printers"
msgstr "プリンターのプリセット"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
+#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:166
msgctxt "@button"
msgid "Add printer"
msgstr "プリンターの追加"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
+#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:182
msgctxt "@button"
msgid "Manage printers"
msgstr "プリンター管理"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:81
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
msgstr "オンラインでトラブルシューティングガイドを表示する"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:88
msgctxt "@action:inmenu"
msgid "Toggle Full Screen"
msgstr "留め金 フルスクリーン"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:92
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96
+msgctxt "@action:inmenu"
+msgid "Exit Full Screen"
+msgstr "全画面表示を終了する"
+
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:103
msgctxt "@action:inmenu menubar:edit"
msgid "&Undo"
msgstr "&取り消す"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:113
msgctxt "@action:inmenu menubar:edit"
msgid "&Redo"
msgstr "&やりなおす"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:112
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:123
msgctxt "@action:inmenu menubar:file"
msgid "&Quit"
msgstr "&やめる"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:120
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:131
msgctxt "@action:inmenu menubar:view"
msgid "3D View"
msgstr "3Dビュー"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138
msgctxt "@action:inmenu menubar:view"
msgid "Front View"
msgstr "フロントビュー"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:145
msgctxt "@action:inmenu menubar:view"
msgid "Top View"
msgstr "トップビュー"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:141
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:152
msgctxt "@action:inmenu menubar:view"
msgid "Left Side View"
msgstr "左サイドビュー"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:148
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:159
msgctxt "@action:inmenu menubar:view"
msgid "Right Side View"
msgstr "右サイドビュー"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:155
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:166
msgctxt "@action:inmenu"
msgid "Configure Cura..."
msgstr "Curaを構成する…"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:173
msgctxt "@action:inmenu menubar:printer"
msgid "&Add Printer..."
msgstr "&プリンターを追加する…"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179
msgctxt "@action:inmenu menubar:printer"
msgid "Manage Pr&inters..."
msgstr "プリンターを管理する…"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186
msgctxt "@action:inmenu"
msgid "Manage Materials..."
msgstr "フィラメントを管理する…"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:184
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:195
msgctxt "@action:inmenu menubar:profile"
msgid "&Update profile with current settings/overrides"
msgstr "&現在の設定/無効にプロファイルをアップデートする"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:192
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203
msgctxt "@action:inmenu menubar:profile"
msgid "&Discard current changes"
msgstr "&変更を破棄する"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:204
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:215
msgctxt "@action:inmenu menubar:profile"
msgid "&Create profile from current settings/overrides..."
msgstr "&今の設定/無効からプロファイルを作成する…"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:221
msgctxt "@action:inmenu menubar:profile"
msgid "Manage Profiles..."
msgstr "プロファイルを管理する…"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:229
msgctxt "@action:inmenu menubar:help"
msgid "Show Online &Documentation"
msgstr "オンラインドキュメントを表示する"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:237
msgctxt "@action:inmenu menubar:help"
msgid "Report a &Bug"
msgstr "報告&バグ"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:245
+msgctxt "@action:inmenu menubar:help"
+msgid "What's New"
+msgstr "新情報"
+
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:251
msgctxt "@action:inmenu menubar:help"
msgid "About..."
msgstr "アバウト..."
# can’t enter japanese text
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:241
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258
msgctxt "@action:inmenu menubar:edit"
msgid "Delete Selected Model"
msgid_plural "Delete Selected Models"
msgstr[0] "&選択したモデルを削除"
# can’t enter japanese text
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:251
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:268
msgctxt "@action:inmenu menubar:edit"
msgid "Center Selected Model"
msgid_plural "Center Selected Models"
msgstr[0] "選択したモデルを中央に移動"
# can’t edit japanese text
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277
msgctxt "@action:inmenu menubar:edit"
msgid "Multiply Selected Model"
msgid_plural "Multiply Selected Models"
msgstr[0] "選択した複数のモデル"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:286
msgctxt "@action:inmenu"
msgid "Delete Model"
msgstr "モデルを消去する"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294
msgctxt "@action:inmenu"
msgid "Ce&nter Model on Platform"
msgstr "プラットホームの中心にモデルを配置"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:283
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:300
msgctxt "@action:inmenu menubar:edit"
msgid "&Group Models"
msgstr "&モデルグループ"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:303
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:320
msgctxt "@action:inmenu menubar:edit"
msgid "Ungroup Models"
msgstr "モデルを非グループ化"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:313
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:330
msgctxt "@action:inmenu menubar:edit"
msgid "&Merge Models"
msgstr "モ&デルの合体"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:340
msgctxt "@action:inmenu"
msgid "&Multiply Model..."
msgstr "&モデルを増倍する…"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:330
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:347
msgctxt "@action:inmenu menubar:edit"
msgid "Select All Models"
msgstr "すべてのモデル選択"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:340
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:357
msgctxt "@action:inmenu menubar:edit"
msgid "Clear Build Plate"
msgstr "ビルドプレート上のクリア"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:367
msgctxt "@action:inmenu menubar:file"
msgid "Reload All Models"
msgstr "すべてのモデルを読み込む"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:359
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:376
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange All Models To All Build Plates"
msgstr "すべてのモデルをすべてのビルドプレートに配置"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:383
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange All Models"
msgstr "すべてのモデルをアレンジする"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:374
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:391
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange Selection"
msgstr "選択をアレンジする"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:381
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:398
msgctxt "@action:inmenu menubar:edit"
msgid "Reset All Model Positions"
msgstr "すべてのモデルのポジションをリセットする"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:388
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:405
msgctxt "@action:inmenu menubar:edit"
msgid "Reset All Model Transformations"
msgstr "すべてのモデル&変更点をリセットする"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:412
msgctxt "@action:inmenu menubar:file"
msgid "&Open File(s)..."
msgstr "&ファイルを開く(s)…"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:403
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:420
msgctxt "@action:inmenu menubar:file"
msgid "&New Project..."
msgstr "&新しいプロジェクト…"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:427
msgctxt "@action:inmenu menubar:help"
msgid "Show Configuration Folder"
msgstr "コンフィグレーションのフォルダーを表示する"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:441
msgctxt "@action:menu"
msgid "&Marketplace"
msgstr "&マーケットプレース"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:24
msgctxt "@title:window"
msgid "Ultimaker Cura"
msgstr "Ultimaker Cura"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:181
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232
msgctxt "@label"
msgid "This package will be installed after restarting."
msgstr "このパッケージは再起動後にインストールされます。"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:357
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:413
msgctxt "@title:tab"
msgid "Settings"
msgstr "設定"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:486
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:539
msgctxt "@title:window"
msgid "Closing Cura"
msgstr "Cura を閉じる"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:487
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:499
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:540
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:552
msgctxt "@label"
msgid "Are you sure you want to exit Cura?"
msgstr "Cura を終了しますか?"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:531
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:590
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:19
msgctxt "@title:window"
msgid "Open file(s)"
msgstr "ファイルを開く"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:632
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:691
msgctxt "@window:title"
msgid "Install Package"
msgstr "パッケージをインストール"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:640
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:699
msgctxt "@title:window"
msgid "Open File(s)"
msgstr "ファイルを開く(s)"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:643
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:702
msgctxt "@text:window"
msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one."
msgstr "選択したファイルの中に複数のG-codeが存在します。1つのG-codeのみ一度に開けます。G-codeファイルを開く場合は、1点のみ選んでください。"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:713
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:18
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:805
msgctxt "@title:window"
msgid "Add Printer"
msgstr "プリンターを追加する"
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:813
+msgctxt "@title:window"
+msgid "What's New"
+msgstr "新情報"
+
# can’t enter japanese
#: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16
msgctxt "@label %1 is filled in with the name of an extruder"
@@ -4684,7 +4589,7 @@ msgctxt "@text:window"
msgid ""
"You have customized some profile settings.\n"
"Would you like to keep or discard those settings?"
-msgstr "プロファイル設定をカスタマイズしました。この設定をキープしますか、キャンセルしますか。"
+msgstr "プロファイル設定をカスタマイズしました。この設定をキープしますか、キャンセルしますか?"
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:110
msgctxt "@title:column"
@@ -4726,37 +4631,6 @@ msgctxt "@action:button"
msgid "Create New Profile"
msgstr "新しいプロファイルを作る"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
-msgctxt "@title:tab"
-msgid "Add a printer to Cura"
-msgstr "プリンターを Cura に追加"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
-msgctxt "@title:tab"
-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 ""
-"下のリストから使用するプリンターを選択します。\n"
-"\n"
-"プリンターがリストにない場合は、「カスタム」カテゴリの「カスタムFFFプリンター」を使用して、次のダイアログでプリンターに合う設定に調整します。"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:249
-msgctxt "@label"
-msgid "Manufacturer"
-msgstr "製造元"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
-msgctxt "@label"
-msgid "Printer Name"
-msgstr "プリンター名"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
-msgctxt "@action:button"
-msgid "Add Printer"
-msgstr "プリンターについて"
-
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:15
msgctxt "@title:window"
msgid "About Cura"
@@ -4914,27 +4788,32 @@ msgctxt "@title:window"
msgid "Save Project"
msgstr "プロジェクトを保存"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:138
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:149
msgctxt "@action:label"
msgid "Build plate"
msgstr "ビルドプレート"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:170
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:183
msgctxt "@action:label"
msgid "Extruder %1"
msgstr "エクストルーダー%1"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:180
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:198
msgctxt "@action:label"
msgid "%1 & material"
msgstr "%1とフィラメント"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:243
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:200
+msgctxt "@action:label"
+msgid "Material"
+msgstr "材料"
+
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:272
msgctxt "@action:label"
msgid "Don't show project summary on save again"
msgstr "保存中のプロジェクトサマリーを非表示にする"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:262
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:291
msgctxt "@action:button"
msgid "Save"
msgstr "保存"
@@ -4964,30 +4843,1069 @@ msgctxt "@action:button"
msgid "Import models"
msgstr "モデルを取り込む"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:210
-msgctxt "@option:check"
-msgid "See only current build plate"
-msgstr "現在のビルドプレートのみを表示"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DropDownWidget.qml:93
+msgctxt "@label"
+msgid "Empty"
+msgstr "空にする"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:226
-msgctxt "@action:button"
-msgid "Arrange to all build plates"
-msgstr "すべてのビルドプレートに配置"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:24
+msgctxt "@label"
+msgid "Add a printer"
+msgstr "プリンターの追加"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:246
-msgctxt "@action:button"
-msgid "Arrange current build plate"
-msgstr "現在のビルドプレートを配置"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:39
+msgctxt "@label"
+msgid "Add a networked printer"
+msgstr "ネットワークプリンターの追加"
-#: X3GWriter/plugin.json
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:81
+msgctxt "@label"
+msgid "Add a non-networked printer"
+msgstr "非ネットワークプリンターの追加"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:70
+msgctxt "@label"
+msgid "Add printer by IP address"
+msgstr "IP アドレスでプリンターを追加"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:133
+msgctxt "@text"
+msgid "Place enter your printer's IP address."
+msgstr "プリンターの IP アドレスを入力してください。"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:158
+msgctxt "@button"
+msgid "Add"
+msgstr "追加"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:204
+msgctxt "@label"
+msgid "Could not connect to device."
+msgstr "デバイスに接続できません。"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:208
+msgctxt "@label"
+msgid "The printer at this address has not responded yet."
+msgstr "このアドレスのプリンターは応答していません。"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:240
+msgctxt "@label"
+msgid "This printer cannot be added because it's an unknown printer or it's not the host of a group."
+msgstr "このプリンタは不明なプリンタであるか、またはグループのホストではないため、追加できません。"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:329
+msgctxt "@button"
+msgid "Back"
+msgstr "戻る"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:342
+msgctxt "@button"
+msgid "Connect"
+msgstr "接続"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/FirstStartMachineActionsContent.qml:77
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:123
+msgctxt "@button"
+msgid "Next"
+msgstr "次"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:23
+msgctxt "@label"
+msgid "User Agreement"
+msgstr "ユーザー用使用許諾契約"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:56
+msgctxt "@button"
+msgid "Agree"
+msgstr "同意する"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:70
+msgctxt "@button"
+msgid "Decline and close"
+msgstr "拒否して閉じる"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:24
+msgctxt "@label"
+msgid "Help us to improve Ultimaker Cura"
+msgstr "Ultimaker Cura の改善にご協力ください"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:57
+msgctxt "@text"
+msgid "Ultimaker Cura collects anonymous data to improve print quality and user experience, including:"
+msgstr "Ultimaker Cura は、印刷品質とユーザーエクスペリエンスを向上させるために以下の匿名データを収集します:"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:71
+msgctxt "@text"
+msgid "Machine types"
+msgstr "プリンターのタイプ"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:77
+msgctxt "@text"
+msgid "Material usage"
+msgstr "材料の利用状況"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:83
+msgctxt "@text"
+msgid "Number of slices"
+msgstr "スライスの数"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:89
+msgctxt "@text"
+msgid "Print settings"
+msgstr "プリント設定"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:102
+msgctxt "@text"
+msgid "Data collected by Ultimaker Cura will not contain any personal information."
+msgstr "Ultimaker Cura が収集したデータには個人データは含まれません。"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:103
+msgctxt "@text"
+msgid "More information"
+msgstr "詳細"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WhatsNewContent.qml:24
+msgctxt "@label"
+msgid "What's new in Ultimaker Cura"
+msgstr "Ultimaker Cura の新機能"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:42
+msgctxt "@label"
+msgid "There is no printer found over your network."
+msgstr "ネットワークにプリンターはありません。"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:179
+msgctxt "@label"
+msgid "Refresh"
+msgstr "更新"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:190
+msgctxt "@label"
+msgid "Add printer by IP"
+msgstr "IP でプリンターを追加"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:223
+msgctxt "@label"
+msgid "Troubleshooting"
+msgstr "トラブルシューティング"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:207
+msgctxt "@label"
+msgid "Printer name"
+msgstr "プリンター名"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:220
+msgctxt "@text"
+msgid "Please give your printer a name"
+msgstr "プリンター名を入力してください"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:36
+msgctxt "@label"
+msgid "Ultimaker Cloud"
+msgstr "Ultimaker Cloud"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:77
+msgctxt "@text"
+msgid "The next generation 3D printing workflow"
+msgstr "次世代 3D 印刷ワークフロー"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:94
+msgctxt "@text"
+msgid "- Send print jobs to Ultimaker printers outside your local network"
+msgstr "- 印刷ジョブをローカルネットワークの外から Ultimaker プリンターに送信します"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:97
+msgctxt "@text"
+msgid "- Store your Ultimaker Cura settings in the cloud for use anywhere"
+msgstr "- Ultimaker Cura の設定をクラウドに保管してどこらでも利用でいるようにします"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:100
+msgctxt "@text"
+msgid "- Get exclusive access to print profiles from leading brands"
+msgstr "- 有名ブランドから材料プロファイルへの例外アクセスを取得します"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:119
+msgctxt "@button"
+msgid "Finish"
+msgstr "終わる"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:128
+msgctxt "@button"
+msgid "Create an account"
+msgstr "アカウント作成"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:29
+msgctxt "@label"
+msgid "Welcome to Ultimaker Cura"
+msgstr "Ultimaker Cura にようこそ"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:47
+msgctxt "@text"
+msgid ""
+"Please follow these steps to set up\n"
+"Ultimaker Cura. This will only take a few moments."
+msgstr ""
+"以下の手順で\n"
+"Ultimaker Cura を設定してください。数秒で完了します。"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:58
+msgctxt "@button"
+msgid "Get started"
+msgstr "はじめに"
+
+#: MachineSettingsAction/plugin.json
msgctxt "description"
-msgid "Allows saving the resulting slice as an X3G file, to support printers that read this format (Malyan, Makerbot and other Sailfish-based printers)."
-msgstr "結果スライスをX3Gファイルとして保存して、このフォーマット(Malyan、Makerbot、およびその他のSailfishベースのプリンター)を読むプリンターをサポートできるようにします。"
+msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)."
+msgstr "プリンターの設定を変更(印刷ボリューム、ノズルサイズ、その他)"
-#: X3GWriter/plugin.json
+#: MachineSettingsAction/plugin.json
msgctxt "name"
-msgid "X3GWriter"
-msgstr "X3GWriter"
+msgid "Machine Settings action"
+msgstr "プリンターの設定アクション"
+
+#: Toolbox/plugin.json
+msgctxt "description"
+msgid "Find, manage and install new Cura packages."
+msgstr "新しいCuraパッケージを検索、管理、インストールします。"
+
+#: Toolbox/plugin.json
+msgctxt "name"
+msgid "Toolbox"
+msgstr "ツールボックス"
+
+#: XRayView/plugin.json
+msgctxt "description"
+msgid "Provides the X-Ray view."
+msgstr "透視ビューイング。"
+
+#: XRayView/plugin.json
+msgctxt "name"
+msgid "X-Ray View"
+msgstr "透視ビュー"
+
+#: X3DReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading X3D files."
+msgstr "X3Dファイルを読むこむためのサポートを供給する。"
+
+#: X3DReader/plugin.json
+msgctxt "name"
+msgid "X3D Reader"
+msgstr "X3Dリーダー"
+
+#: GCodeWriter/plugin.json
+msgctxt "description"
+msgid "Writes g-code to a file."
+msgstr "ファイルにG-codeを書き込みます。"
+
+#: GCodeWriter/plugin.json
+msgctxt "name"
+msgid "G-code Writer"
+msgstr "G-codeライター"
+
+#: ModelChecker/plugin.json
+msgctxt "description"
+msgid "Checks models and print configuration for possible printing issues and give suggestions."
+msgstr "プリント問題の可能性のあるモデルをプリント構成を確認し、解決案を提示してください。"
+
+#: ModelChecker/plugin.json
+msgctxt "name"
+msgid "Model Checker"
+msgstr "モデルチェッカー"
+
+#: cura-god-mode-plugin/src/GodMode/plugin.json
+msgctxt "description"
+msgid "Dump the contents of all settings to a HTML file."
+msgstr "HTMLファイルに設定内容を放置する。"
+
+#: cura-god-mode-plugin/src/GodMode/plugin.json
+msgctxt "name"
+msgid "God Mode"
+msgstr "Godモード"
+
+#: FirmwareUpdater/plugin.json
+msgctxt "description"
+msgid "Provides a machine actions for updating firmware."
+msgstr "ファームウェアアップデートのためのマシン操作を提供します。"
+
+#: FirmwareUpdater/plugin.json
+msgctxt "name"
+msgid "Firmware Updater"
+msgstr "ファームウェアアップデーター"
+
+#: ProfileFlattener/plugin.json
+msgctxt "description"
+msgid "Create a flattened quality changes profile."
+msgstr "プロファイルを変更するフラットエンドクオリティーを作成する。"
+
+#: ProfileFlattener/plugin.json
+msgctxt "name"
+msgid "Profile Flattener"
+msgstr "プロファイルフラッター"
+
+#: AMFReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading AMF files."
+msgstr "AMFファイルの読込みをサポートしています。"
+
+#: AMFReader/plugin.json
+msgctxt "name"
+msgid "AMF Reader"
+msgstr "AMFリーダー"
+
+#: USBPrinting/plugin.json
+msgctxt "description"
+msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware."
+msgstr "G-codeを承認し、プリンターに送信する。またプラグインはファームウェアをアップデートできます。"
+
+#: USBPrinting/plugin.json
+msgctxt "name"
+msgid "USB printing"
+msgstr "USBプリンティング"
+
+#: GCodeGzWriter/plugin.json
+msgctxt "description"
+msgid "Writes g-code to a compressed archive."
+msgstr "圧縮ファイルにG-codeを書き込みます。"
+
+#: GCodeGzWriter/plugin.json
+msgctxt "name"
+msgid "Compressed G-code Writer"
+msgstr "圧縮G-codeライター"
+
+#: UFPWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for writing Ultimaker Format Packages."
+msgstr "Ultimakerフォーマットパッケージへの書き込みをサポートします。"
+
+#: UFPWriter/plugin.json
+msgctxt "name"
+msgid "UFP Writer"
+msgstr "UFPライター"
+
+#: PrepareStage/plugin.json
+msgctxt "description"
+msgid "Provides a prepare stage in Cura."
+msgstr "Curaで準備ステージを提供します。"
+
+#: PrepareStage/plugin.json
+msgctxt "name"
+msgid "Prepare Stage"
+msgstr "ステージの準備"
+
+#: RemovableDriveOutputDevice/plugin.json
+msgctxt "description"
+msgid "Provides removable drive hotplugging and writing support."
+msgstr "取り外し可能なドライブホットプラギング及びサポートの書き出しの供給。"
+
+#: RemovableDriveOutputDevice/plugin.json
+msgctxt "name"
+msgid "Removable Drive Output Device Plugin"
+msgstr "取り外し可能なドライブアウトプットデバイスプラグイン"
+
+#: UM3NetworkPrinting/plugin.json
+msgctxt "description"
+msgid "Manages network connections to Ultimaker 3 printers."
+msgstr "Ultimaker3のプリンターのネットワーク接続を管理する。"
+
+#: UM3NetworkPrinting/plugin.json
+msgctxt "name"
+msgid "UM3 Network Connection"
+msgstr "UM3ネットワークコネクション"
+
+#: SettingsGuide/plugin.json
+msgctxt "description"
+msgid "Provides extra information and explanations about settings in Cura, with images and animations."
+msgstr "画像とアニメーションで、Cura の設定に関する追加情報と説明を提供します。"
+
+#: SettingsGuide/plugin.json
+msgctxt "name"
+msgid "Settings Guide"
+msgstr "設定ガイド"
+
+#: MonitorStage/plugin.json
+msgctxt "description"
+msgid "Provides a monitor stage in Cura."
+msgstr "Curaでモニターステージを提供します。"
+
+#: MonitorStage/plugin.json
+msgctxt "name"
+msgid "Monitor Stage"
+msgstr "モニターステージ"
+
+#: FirmwareUpdateChecker/plugin.json
+msgctxt "description"
+msgid "Checks for firmware updates."
+msgstr "ファームウェアアップデートをチェックする。"
+
+#: FirmwareUpdateChecker/plugin.json
+msgctxt "name"
+msgid "Firmware Update Checker"
+msgstr "ファームウェアアップデートチェッカー"
+
+#: SimulationView/plugin.json
+msgctxt "description"
+msgid "Provides the Simulation view."
+msgstr "シミュレーションビューを提供します。"
+
+#: SimulationView/plugin.json
+msgctxt "name"
+msgid "Simulation View"
+msgstr "シミュレーションビュー"
+
+#: GCodeGzReader/plugin.json
+msgctxt "description"
+msgid "Reads g-code from a compressed archive."
+msgstr "圧縮ファイルからG-codeを読み取ります。"
+
+#: GCodeGzReader/plugin.json
+msgctxt "name"
+msgid "Compressed G-code Reader"
+msgstr "圧縮G-codeリーダー"
+
+#: PostProcessingPlugin/plugin.json
+msgctxt "description"
+msgid "Extension that allows for user created scripts for post processing"
+msgstr "後処理のためにユーザーが作成したスクリプト用拡張子"
+
+#: PostProcessingPlugin/plugin.json
+msgctxt "name"
+msgid "Post Processing"
+msgstr "後処理"
+
+#: SupportEraser/plugin.json
+msgctxt "description"
+msgid "Creates an eraser mesh to block the printing of support in certain places"
+msgstr "特定箇所のサポートを印刷するブロックを消去するメッシュを作成する"
+
+#: SupportEraser/plugin.json
+msgctxt "name"
+msgid "Support Eraser"
+msgstr "サポート消去機能"
+
+#: UFPReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading Ultimaker Format Packages."
+msgstr "Ultimakerフォーマットパッケージの読み込みをサポートします。"
+
+#: UFPReader/plugin.json
+msgctxt "name"
+msgid "UFP Reader"
+msgstr "UFP リーダー"
+
+#: SliceInfoPlugin/plugin.json
+msgctxt "description"
+msgid "Submits anonymous slice info. Can be disabled through preferences."
+msgstr "不特定なスライス情報を提出。プレファレンスの中で無効になる可能性もある。"
+
+#: SliceInfoPlugin/plugin.json
+msgctxt "name"
+msgid "Slice info"
+msgstr "スライスインフォメーション"
+
+#: XmlMaterialProfile/plugin.json
+msgctxt "description"
+msgid "Provides capabilities to read and write XML-based material profiles."
+msgstr "XMLベースフィラメントのプロファイルを読み書きするための機能を供給する。"
+
+#: XmlMaterialProfile/plugin.json
+msgctxt "name"
+msgid "Material Profiles"
+msgstr "フィラメントプロファイル"
+
+#: LegacyProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing profiles from legacy Cura versions."
+msgstr "レガシーCura Versionsからプロファイルを取り込むためのサポートを供給する。"
+
+#: LegacyProfileReader/plugin.json
+msgctxt "name"
+msgid "Legacy Cura Profile Reader"
+msgstr "レガシーCuraプロファイルリーダー"
+
+#: GCodeProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing profiles from g-code files."
+msgstr "g-codeファイルからプロファイルを読み込むサポートを供給する。"
+
+#: GCodeProfileReader/plugin.json
+msgctxt "name"
+msgid "G-code Profile Reader"
+msgstr "G-codeプロファイルリーダー"
+
+#: VersionUpgrade/VersionUpgrade32to33/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.2 to Cura 3.3."
+msgstr "Cura 3.2からCura 3.3のコンフィグレーションアップグレート。"
+
+#: VersionUpgrade/VersionUpgrade32to33/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.2 to 3.3"
+msgstr "3.2から3.3にバージョンアップグレート"
+
+#: VersionUpgrade/VersionUpgrade33to34/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.3 to Cura 3.4."
+msgstr "Cura 3.3からCura 3.4のコンフィグレーションアップグレート。"
+
+#: VersionUpgrade/VersionUpgrade33to34/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.3 to 3.4"
+msgstr "3.3から3.4にバージョンアップグレート"
+
+#: VersionUpgrade/VersionUpgrade25to26/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
+msgstr "Cura 2.5 からCura 2.6のコンフィグレーションアップグレート。"
+
+#: VersionUpgrade/VersionUpgrade25to26/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.5 to 2.6"
+msgstr "2.5から2.6にバージョンアップグレート"
+
+#: VersionUpgrade/VersionUpgrade27to30/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
+msgstr "Cura 2.7からCura 3.0のコンフィグレーションアップグレート。"
+
+#: VersionUpgrade/VersionUpgrade27to30/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.7 to 3.0"
+msgstr "2.7から3.0にバージョンアップグレート"
+
+#: VersionUpgrade/VersionUpgrade35to40/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.5 to Cura 4.0."
+msgstr "Cura 3.5 から Cura 4.0 のコンフィグレーションアップグレート。"
+
+#: VersionUpgrade/VersionUpgrade35to40/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.5 to 4.0"
+msgstr "3.5 から 4.0 にバージョンアップグレート"
+
+#: VersionUpgrade/VersionUpgrade34to35/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.4 to Cura 3.5."
+msgstr "Cura 3.4 から Cura 3.5 のコンフィグレーションアップグレート。"
+
+#: VersionUpgrade/VersionUpgrade34to35/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.4 to 3.5"
+msgstr "3.4 から 3.5 にバージョンアップグレート"
+
+#: VersionUpgrade/VersionUpgrade40to41/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 4.0 to Cura 4.1."
+msgstr "Cura 4.0 から Cura 4.1 のコンフィグレーションアップグレート。"
+
+#: VersionUpgrade/VersionUpgrade40to41/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 4.0 to 4.1"
+msgstr "4.0 から 4.1 にバージョンアップグレート"
+
+#: VersionUpgrade/VersionUpgrade30to31/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.0 to Cura 3.1."
+msgstr "Cura 3.0からCura 3.1のコンフィグレーションアップグレート。"
+
+#: VersionUpgrade/VersionUpgrade30to31/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.0 to 3.1"
+msgstr "3.0から3.1にバージョンアップグレート"
+
+#: VersionUpgrade/VersionUpgrade41to42/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 4.1 to Cura 4.2."
+msgstr "コンフィギュレーションを Cura 4.1 から Cura 4.2 にアップグレートする。"
+
+#: VersionUpgrade/VersionUpgrade41to42/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 4.1 to 4.2"
+msgstr "4.0 から 4.1 にバージョンアップグレート"
+
+#: VersionUpgrade/VersionUpgrade26to27/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
+msgstr "Cura 2.6 からCura 2.7のコンフィグレーションアップグレート。"
+
+#: VersionUpgrade/VersionUpgrade26to27/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.6 to 2.7"
+msgstr "2.6から2.7にバージョンアップグレート"
+
+#: VersionUpgrade/VersionUpgrade21to22/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
+msgstr "Cura 2.1 からCura 2.2のコンフィグレーションアップグレート。"
+
+#: VersionUpgrade/VersionUpgrade21to22/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.1 to 2.2"
+msgstr "2.1 から2.2にバージョンアップグレート"
+
+#: VersionUpgrade/VersionUpgrade22to24/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
+msgstr "Cura 2.2 からCura 2.4のコンフィグレーションアップグレート。"
+
+#: VersionUpgrade/VersionUpgrade22to24/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.2 to 2.4"
+msgstr "2.2 から2.4にバージョンアップグレート"
+
+#: ImageReader/plugin.json
+msgctxt "description"
+msgid "Enables ability to generate printable geometry from 2D image files."
+msgstr "2Dの画像ファイルからプリント可能なジオメトリーを生成を可能にする。"
+
+#: ImageReader/plugin.json
+msgctxt "name"
+msgid "Image Reader"
+msgstr "画像リーダー"
+
+#: CuraEngineBackend/plugin.json
+msgctxt "description"
+msgid "Provides the link to the CuraEngine slicing backend."
+msgstr "CuraEngineスライシングバックエンドにリンクを供給する。"
+
+#: CuraEngineBackend/plugin.json
+msgctxt "name"
+msgid "CuraEngine Backend"
+msgstr "Curaエンジンバックエンド"
+
+#: PerObjectSettingsTool/plugin.json
+msgctxt "description"
+msgid "Provides the Per Model Settings."
+msgstr "各モデル設定を与える。"
+
+#: PerObjectSettingsTool/plugin.json
+msgctxt "name"
+msgid "Per Model Settings Tool"
+msgstr "各モデル設定ツール"
+
+#: 3MFReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading 3MF files."
+msgstr "3MFファイルを読むこむためのサポートを供給する。"
+
+#: 3MFReader/plugin.json
+msgctxt "name"
+msgid "3MF Reader"
+msgstr "3MFリーダー"
+
+#: SolidView/plugin.json
+msgctxt "description"
+msgid "Provides a normal solid mesh view."
+msgstr "ノーマルなソリットメッシュビューを供給する。"
+
+#: SolidView/plugin.json
+msgctxt "name"
+msgid "Solid View"
+msgstr "ソリッドビュー"
+
+#: GCodeReader/plugin.json
+msgctxt "description"
+msgid "Allows loading and displaying G-code files."
+msgstr "G-codeファイルの読み込み、表示を許可する。"
+
+#: GCodeReader/plugin.json
+msgctxt "name"
+msgid "G-code Reader"
+msgstr "G-codeリーダー"
+
+#: CuraDrive/plugin.json
+msgctxt "description"
+msgid "Backup and restore your configuration."
+msgstr "構成をバックアップしてリストアします。"
+
+#: CuraDrive/plugin.json
+msgctxt "name"
+msgid "Cura Backups"
+msgstr "Cura バックアップ"
+
+#: CuraProfileWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for exporting Cura profiles."
+msgstr "Curaプロファイルを書き出すためのサポートを供給する。"
+
+#: CuraProfileWriter/plugin.json
+msgctxt "name"
+msgid "Cura Profile Writer"
+msgstr "Curaプロファイルライター"
+
+#: CuraPrintProfileCreator/plugin.json
+msgctxt "description"
+msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI."
+msgstr "材料メーカーがドロップインUIを使用して新しい材料と品質のプロファイルを作成できるようにします。"
+
+#: CuraPrintProfileCreator/plugin.json
+msgctxt "name"
+msgid "Print Profile Assistant"
+msgstr "プリントプロファイルアシスタント"
+
+#: 3MFWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for writing 3MF files."
+msgstr "3MFファイルを読むこむためのサポートを供給する。"
+
+#: 3MFWriter/plugin.json
+msgctxt "name"
+msgid "3MF Writer"
+msgstr "3MFリーダー"
+
+#: PreviewStage/plugin.json
+msgctxt "description"
+msgid "Provides a preview stage in Cura."
+msgstr "Curaでプレビューステージを提供します。"
+
+#: PreviewStage/plugin.json
+msgctxt "name"
+msgid "Preview Stage"
+msgstr "プレビューステージ"
+
+#: UltimakerMachineActions/plugin.json
+msgctxt "description"
+msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)."
+msgstr "Ultimakerのプリンターのアクションを供給する(ベッドレベリングウィザード、アップグレードの選択、他)"
+
+#: UltimakerMachineActions/plugin.json
+msgctxt "name"
+msgid "Ultimaker machine actions"
+msgstr "Ultimkerプリンターのアクション"
+
+#: CuraProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing Cura profiles."
+msgstr "Curaプロファイルを取り込むためのサポートを供給する。"
+
+#: CuraProfileReader/plugin.json
+msgctxt "name"
+msgid "Cura Profile Reader"
+msgstr "Curaプロファイルリーダー"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Cura Settings Guide"
+#~ msgstr "Cura 設定ガイド"
+
+#~ msgctxt "@info:generic"
+#~ msgid "Settings have been changed to match the current availability of extruders: [%s]"
+#~ msgstr "現在利用可能なエクストルーダー [%s] に合わせて設定が変更されました。"
+
+#~ msgctxt "@title:groupbox"
+#~ msgid "User description"
+#~ msgstr "ユーザー詳細"
+
+#~ msgctxt "@info"
+#~ msgid "These options are not available because you are monitoring a cloud printer."
+#~ msgstr "クラウドプリンタをモニタリングしている場合は、これらのオプションは利用できません。"
+
+#~ msgctxt "@label link to connect manager"
+#~ msgid "Go to Cura Connect"
+#~ msgstr "Cura Connectに移動する"
+
+#~ msgctxt "@info"
+#~ msgid "All jobs are printed."
+#~ msgstr "すべてのジョブが印刷されます。"
+
+#~ msgctxt "@label link to connect manager"
+#~ msgid "View print history"
+#~ msgstr "印刷履歴の表示"
+
+#~ msgctxt "@label"
+#~ 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 ""
+#~ "ネットワーク接続にて直接プリントするためには、必ずケーブルまたはWifiネットワークにて繋がっていることを確認してください。Curaをプリンターに接続していない場合でも、USBメモリを使って直接プリンターにg-codeファイルをトランスファーできます。\n"
+#~ "\n"
+#~ "下のリストからプリンターを選択してください:"
+
+#~ msgctxt "@info"
+#~ 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 ""
+#~ "プリンタが接続されていること確認してください:\n"
+#~ "- プリンタの電源が入っていることを確認してください。\n"
+#~ "- プリンタがネットワークに接続されているか確認してください。"
+
+#~ msgctxt "@option:check"
+#~ msgid "See only current build plate"
+#~ msgstr "現在のビルドプレートのみを表示"
+
+#~ msgctxt "@action:button"
+#~ msgid "Arrange to all build plates"
+#~ msgstr "すべてのビルドプレートに配置"
+
+#~ msgctxt "@action:button"
+#~ msgid "Arrange current build plate"
+#~ msgstr "現在のビルドプレートを配置"
+
+#~ msgctxt "description"
+#~ msgid "Allows saving the resulting slice as an X3G file, to support printers that read this format (Malyan, Makerbot and other Sailfish-based printers)."
+#~ msgstr "結果スライスをX3Gファイルとして保存して、このフォーマット(Malyan、Makerbot、およびその他のSailfishベースのプリンター)を読むプリンターをサポートできるようにします。"
+
+#~ msgctxt "name"
+#~ msgid "X3GWriter"
+#~ msgstr "X3GWriter"
+
+#~ msgctxt "description"
+#~ msgid "Reads SVG files as toolpaths, for debugging printer movements."
+#~ msgstr "プリンターの動きをデバッグするためのツールパスとして SVG ファイルを読み込みます。"
+
+#~ msgctxt "name"
+#~ msgid "SVG Toolpath Reader"
+#~ msgstr "SVG ツールパスリーダー"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Changelog"
+#~ msgstr "Changelog"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Show Changelog"
+#~ msgstr "Changelogの表示"
+
+#~ msgctxt "@info:status"
+#~ msgid "Sending data to remote cluster"
+#~ msgstr "リモートクラスタにデータ送信中"
+
+#~ msgctxt "@info:status"
+#~ msgid "Connect to Ultimaker Cloud"
+#~ msgstr "Ultimaker Cloud に接続する"
+
+#~ msgctxt "@info"
+#~ msgid "Cura collects anonymized usage statistics."
+#~ msgstr "Curaは、匿名化した利用統計を収集します。"
+
+#~ msgctxt "@info:title"
+#~ msgid "Collecting Data"
+#~ msgstr "データを収集中"
+
+#~ msgctxt "@action:button"
+#~ msgid "More info"
+#~ msgstr "詳細"
+
+#~ msgctxt "@action:tooltip"
+#~ msgid "See more information on what data Cura sends."
+#~ msgstr "Curaが送信するデータについて詳しくご覧ください。"
+
+#~ msgctxt "@action:button"
+#~ msgid "Allow"
+#~ msgstr "許可"
+
+#~ msgctxt "@action:tooltip"
+#~ msgid "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."
+#~ msgstr "Curaが匿名化した利用統計を送信することを許可し、Curaの将来の改善を優先的に行うことに貢献します。プレファレンスと設定の一部、Curaのバージョン、スライスしているモデルのハッシュが送信されます。"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Evaluation"
+#~ msgstr "評価"
+
+#~ msgctxt "@info:title"
+#~ msgid "Network enabled printers"
+#~ msgstr "ネットワーク対応プリンター"
+
+#~ msgctxt "@info:title"
+#~ msgid "Local printers"
+#~ msgstr "ローカルプリンター"
+
+#~ msgctxt "@info:backup_failed"
+#~ msgid "Tried to restore a Cura backup that does not match your current version."
+#~ msgstr "現行バージョンと一致しないCuraバックアップをリストアしようとしました。"
+
+#~ msgctxt "@title"
+#~ msgid "Machine Settings"
+#~ msgstr "プリンターの設定"
+
+#~ msgctxt "@label"
+#~ msgid "Printer Settings"
+#~ msgstr "プリンターの設定"
+
+#~ msgctxt "@option:check"
+#~ msgid "Origin at center"
+#~ msgstr "センターを出します"
+
+#~ msgctxt "@option:check"
+#~ msgid "Heated bed"
+#~ msgstr "ヒーテッドドベッド"
+
+#~ msgctxt "@label"
+#~ msgid "Printhead Settings"
+#~ msgstr "プリントヘッド設定"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "プリントヘッド左側からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷を使用。"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "プリントヘッド前部からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷を使用。"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "プリントヘッド右側からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷を使用。"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "プリントヘッド後部からノズルの中心までの距離。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷を使用。"
+
+#~ msgctxt "@label"
+#~ msgid "Gantry height"
+#~ msgstr "ガントリーの高さ"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "(X 軸及びY軸)ノズルの先端とガントリーシステムの高さに相違があります。印刷時に前の造形物とプリントヘッドとの衝突を避けるために “1プリントづつ”印刷を使用。"
+
+#~ msgctxt "@label"
+#~ msgid "Start G-code"
+#~ msgstr "G-Codeの開始"
+
+#~ msgctxt "@tooltip"
+#~ msgid "G-code commands to be executed at the very start."
+#~ msgstr "G-codeコマンドが最初に実行されるようにします。"
+
+#~ msgctxt "@label"
+#~ msgid "End G-code"
+#~ msgstr "G-codeの終了"
+
+#~ msgctxt "@tooltip"
+#~ msgid "G-code commands to be executed at the very end."
+#~ msgstr "G-codeコマンドが最後に実行されるようにします。"
+
+#~ msgctxt "@label"
+#~ msgid "Nozzle Settings"
+#~ msgstr "ノズル設定"
+
+#~ msgctxt "@tooltip"
+#~ msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile."
+#~ msgstr "プリンターに対応したフィラメントの直径。正確な直径はフィラメント及びまたはプロファイルに変動します。"
+
+#~ msgctxt "@label"
+#~ msgid "Extruder Start G-code"
+#~ msgstr "エクストルーダーがG-Codeを開始する"
+
+#~ msgctxt "@label"
+#~ msgid "Extruder End G-code"
+#~ msgstr "エクストルーダーがG-Codeを終了する"
+
+#~ msgctxt "@label"
+#~ msgid "Changelog"
+#~ msgstr "Changelogの表示"
+
+#~ msgctxt "@title:window"
+#~ msgid "User Agreement"
+#~ msgstr "ユーザー用使用許諾契約"
+
+#~ msgctxt "@alabel"
+#~ msgid "Enter the IP address or hostname of your printer on the network."
+#~ msgstr "ネットワーク内のプリンターのIPアドレスまたはホストネームを入力してください。"
+
+#~ msgctxt "@info"
+#~ msgid "Please select a network connected printer to monitor."
+#~ msgstr "モニターするプリンタが接続されているネットワークを選択してください。"
+
+#~ msgctxt "@info"
+#~ msgid "Please connect your Ultimaker printer to your local network."
+#~ msgstr "Ultimaker プリンタをローカルネットワークに接続してください。"
+
+#~ msgctxt "@text:window"
+#~ msgid "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."
+#~ msgstr "Curaは印刷の品質とユーザー体験を向上させるために匿名のデータをUltimakerに送信します。以下は送信される全テータの例です。"
+
+#~ msgctxt "@text:window"
+#~ msgid "I don't want to send this data"
+#~ msgstr "このデータは送信しない"
+
+#~ msgctxt "@text:window"
+#~ msgid "Allow sending this data to Ultimaker and help us improve Cura"
+#~ msgstr "Ultimakerへのデータ送信を許可し、Curaの改善を手助けする"
+
+#~ msgctxt "@label"
+#~ msgid "No print selected"
+#~ msgstr "プリンタが選択されていません"
+
+#~ msgctxt "@info:tooltip"
+#~ msgid "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."
+#~ msgstr "デフォルトで、白ピクセルはメッシュの高いポイントを表し、黒ピクセルはメッシュの低いポイントを表します。このオプションをリバースするために変更し、黒ピクセルがメッシュの高いポイントを表し、白ピクセルがメッシュの低いポイントを表すようにする。"
+
+#~ msgctxt "@title"
+#~ msgid "Select Printer Upgrades"
+#~ msgstr "プリンターアップグレードを選択する"
+
+#~ msgctxt "@label"
+#~ msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air."
+#~ msgstr "サポートに使うエクストルーダーを選択してください。モデルの垂れや中空プリントを避けるためにモデルの下にサポート構造を生成します。"
+
+#~ 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 "この品質プロファイルは現在の材料およびノズル構成では使用できません。この品質プロファイルを使用できるように変更してください"
+
+#~ msgctxt "@label shown when we load a Gcode file"
+#~ msgid "Print setup disabled. G code file can not be modified."
+#~ msgstr "印刷の設定を無効にしました。G コードファイルは変更できません。"
+
+#~ msgctxt "@label"
+#~ msgid "See the material compatibility chart"
+#~ msgstr "材料の適合性チャートをご覧ください"
+
+#~ msgctxt "@label"
+#~ msgid "View types"
+#~ msgstr "タイプ表示"
+
+#~ msgctxt "@label"
+#~ msgid "Hi "
+#~ msgstr "こんにちわ "
+
+#~ msgctxt "@text"
+#~ 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 ""
+#~ "- 印刷ジョブをローカルネットワークの外の Ultimaker プリンタに送信します\n"
+#~ "- Ultimaker Cura の設定をクラウドに保管してどこからでも利用できるようにします\n"
+#~ "- 有名ブランドから材料プロファイルへの例外アクセスを取得します"
+
+#~ msgctxt "@label:PrintjobStatus"
+#~ msgid "Unable to Slice"
+#~ msgstr "スライスできません"
+
+#~ msgctxt "@label"
+#~ msgid "Time specification"
+#~ msgstr "時間仕様"
+
+#~ msgctxt "@label"
+#~ msgid "Material specification"
+#~ msgstr "材料仕様"
+
+#~ msgctxt "@title:tab"
+#~ msgid "Add a printer to Cura"
+#~ msgstr "プリンターを Cura に追加"
+
+#~ msgctxt "@title:tab"
+#~ 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 ""
+#~ "下のリストから使用するプリンターを選択します。\n"
+#~ "\n"
+#~ "プリンターがリストにない場合は、「カスタム」カテゴリの「カスタムFFFプリンター」を使用して、次のダイアログでプリンターに合う設定に調整します。"
+
+#~ msgctxt "@label"
+#~ msgid "Manufacturer"
+#~ msgstr "製造元"
+
+#~ msgctxt "@label"
+#~ msgid "Printer Name"
+#~ msgstr "プリンター名"
+
+#~ msgctxt "@action:button"
+#~ msgid "Add Printer"
+#~ msgstr "プリンターについて"
#~ msgid "Modify G-Code"
#~ msgstr "G-codeを修正"
@@ -5328,62 +6246,6 @@ msgstr "X3GWriter"
#~ msgid "Click to check the material compatibility on Ultimaker.com."
#~ msgstr "Ultimaker.comにてマテリアルのコンパティビリティを調べるためにクリック。"
-#~ msgctxt "description"
-#~ msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)."
-#~ msgstr "プリンターの設定を変更(印刷ボリューム、ノズルサイズ、その他)"
-
-#~ msgctxt "name"
-#~ msgid "Machine Settings action"
-#~ msgstr "プリンターの設定アクション"
-
-#~ msgctxt "description"
-#~ msgid "Find, manage and install new Cura packages."
-#~ msgstr "新しいCuraパッケージを検索、管理、インストールします。"
-
-#~ msgctxt "name"
-#~ msgid "Toolbox"
-#~ msgstr "ツールボックス"
-
-#~ msgctxt "description"
-#~ msgid "Provides the X-Ray view."
-#~ msgstr "透視ビューイング。"
-
-#~ msgctxt "name"
-#~ msgid "X-Ray View"
-#~ msgstr "透視ビュー"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for reading X3D files."
-#~ msgstr "X3Dファイルを読むこむためのサポートを供給する。"
-
-#~ msgctxt "name"
-#~ msgid "X3D Reader"
-#~ msgstr "X3Dリーダー"
-
-#~ msgctxt "description"
-#~ msgid "Writes g-code to a file."
-#~ msgstr "ファイルにG-codeを書き込みます。"
-
-#~ msgctxt "name"
-#~ msgid "G-code Writer"
-#~ msgstr "G-codeライター"
-
-#~ msgctxt "description"
-#~ msgid "Checks models and print configuration for possible printing issues and give suggestions."
-#~ msgstr "プリント問題の可能性のあるモデルをプリント構成を確認し、解決案を提示してください。"
-
-#~ msgctxt "name"
-#~ msgid "Model Checker"
-#~ msgstr "モデルチェッカー"
-
-#~ msgctxt "description"
-#~ msgid "Dump the contents of all settings to a HTML file."
-#~ msgstr "HTMLファイルに設定内容を放置する。"
-
-#~ msgctxt "name"
-#~ msgid "God Mode"
-#~ msgstr "Godモード"
-
#~ msgctxt "description"
#~ msgid "Shows changes since latest checked version."
#~ msgstr "最新の更新バージョンの変更点を表示する。"
@@ -5392,14 +6254,6 @@ msgstr "X3GWriter"
#~ msgid "Changelog"
#~ msgstr "Changelog"
-#~ msgctxt "description"
-#~ msgid "Provides a machine actions for updating firmware."
-#~ msgstr "ファームウェアアップデートのためのマシン操作を提供します。"
-
-#~ msgctxt "name"
-#~ msgid "Firmware Updater"
-#~ msgstr "ファームウェアアップデーター"
-
#~ msgctxt "description"
#~ msgid "Create a flattend quality changes profile."
#~ msgstr "プロファイルを変更するフラットエンドクオリティーを作成する。"
@@ -5408,14 +6262,6 @@ msgstr "X3GWriter"
#~ msgid "Profile flatener"
#~ msgstr "プロファイルフラットナー"
-#~ msgctxt "description"
-#~ msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware."
-#~ msgstr "G-codeを承認し、プリンターに送信する。またプラグインはファームウェアをアップデートできます。"
-
-#~ msgctxt "name"
-#~ msgid "USB printing"
-#~ msgstr "USBプリンティング"
-
#~ msgctxt "description"
#~ msgid "Ask the user once if he/she agrees with our license."
#~ msgstr "ライセンスに同意するかどうかユーザーに1回だけ確認する。"
@@ -5424,278 +6270,6 @@ msgstr "X3GWriter"
#~ msgid "UserAgreement"
#~ msgstr "UserAgreement"
-#~ msgctxt "description"
-#~ msgid "Writes g-code to a compressed archive."
-#~ msgstr "圧縮ファイルにG-codeを書き込みます。"
-
-#~ msgctxt "name"
-#~ msgid "Compressed G-code Writer"
-#~ msgstr "圧縮G-codeライター"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for writing Ultimaker Format Packages."
-#~ msgstr "Ultimakerフォーマットパッケージへの書き込みをサポートします。"
-
-#~ msgctxt "name"
-#~ msgid "UFP Writer"
-#~ msgstr "UFPライター"
-
-#~ msgctxt "description"
-#~ msgid "Provides a prepare stage in Cura."
-#~ msgstr "Curaで準備ステージを提供します。"
-
-#~ msgctxt "name"
-#~ msgid "Prepare Stage"
-#~ msgstr "ステージの準備"
-
-#~ msgctxt "description"
-#~ msgid "Provides removable drive hotplugging and writing support."
-#~ msgstr "取り外し可能なドライブホットプラギング及びサポートの書き出しの供給。"
-
-#~ msgctxt "name"
-#~ msgid "Removable Drive Output Device Plugin"
-#~ msgstr "取り外し可能なドライブアウトプットデバイスプラグイン"
-
-#~ msgctxt "description"
-#~ msgid "Manages network connections to Ultimaker 3 printers."
-#~ msgstr "Ultimaker3のプリンターのネットワーク接続を管理する。"
-
-#~ msgctxt "name"
-#~ msgid "UM3 Network Connection"
-#~ msgstr "UM3ネットワークコネクション"
-
-#~ msgctxt "description"
-#~ msgid "Provides a monitor stage in Cura."
-#~ msgstr "Curaでモニターステージを提供します。"
-
-#~ msgctxt "name"
-#~ msgid "Monitor Stage"
-#~ msgstr "モニターステージ"
-
-#~ msgctxt "description"
-#~ msgid "Checks for firmware updates."
-#~ msgstr "ファームウェアアップデートをチェックする。"
-
-#~ msgctxt "name"
-#~ msgid "Firmware Update Checker"
-#~ msgstr "ファームウェアアップデートチェッカー"
-
-#~ msgctxt "description"
-#~ msgid "Provides the Simulation view."
-#~ msgstr "シミュレーションビューを提供します。"
-
-#~ msgctxt "name"
-#~ msgid "Simulation View"
-#~ msgstr "シミュレーションビュー"
-
-#~ msgctxt "description"
-#~ msgid "Reads g-code from a compressed archive."
-#~ msgstr "圧縮ファイルからG-codeを読み取ります。"
-
-#~ msgctxt "name"
-#~ msgid "Compressed G-code Reader"
-#~ msgstr "圧縮G-codeリーダー"
-
-#~ msgctxt "description"
-#~ msgid "Extension that allows for user created scripts for post processing"
-#~ msgstr "後処理のためにユーザーが作成したスクリプト用拡張子"
-
-#~ msgctxt "name"
-#~ msgid "Post Processing"
-#~ msgstr "後処理"
-
-#~ msgctxt "description"
-#~ msgid "Creates an eraser mesh to block the printing of support in certain places"
-#~ msgstr "特定箇所のサポートを印刷するブロックを消去するメッシュを作成する"
-
-#~ msgctxt "name"
-#~ msgid "Support Eraser"
-#~ msgstr "サポート消去機能"
-
-#~ msgctxt "description"
-#~ msgid "Submits anonymous slice info. Can be disabled through preferences."
-#~ msgstr "不特定なスライス情報を提出。プレファレンスの中で無効になる可能性もある。"
-
-#~ msgctxt "name"
-#~ msgid "Slice info"
-#~ msgstr "スライスインフォメーション"
-
-#~ msgctxt "description"
-#~ msgid "Provides capabilities to read and write XML-based material profiles."
-#~ msgstr "XMLベースフィラメントのプロファイルを読み書きするための機能を供給する。"
-
-#~ msgctxt "name"
-#~ msgid "Material Profiles"
-#~ msgstr "フィラメントプロファイル"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing profiles from legacy Cura versions."
-#~ msgstr "レガシーCura Versionsからプロファイルを取り込むためのサポートを供給する。"
-
-#~ msgctxt "name"
-#~ msgid "Legacy Cura Profile Reader"
-#~ msgstr "レガシーCuraプロファイルリーダー"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing profiles from g-code files."
-#~ msgstr "g-codeファイルからプロファイルを読み込むサポートを供給する。"
-
-#~ msgctxt "name"
-#~ msgid "G-code Profile Reader"
-#~ msgstr "G-codeプロファイルリーダー"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.2 to Cura 3.3."
-#~ msgstr "Cura 3.2からCura 3.3のコンフィグレーションアップグレート。"
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.2 to 3.3"
-#~ msgstr "3.2から3.3にバージョンアップグレート"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.3 to Cura 3.4."
-#~ msgstr "Cura 3.3からCura 3.4のコンフィグレーションアップグレート。"
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.3 to 3.4"
-#~ msgstr "3.3から3.4にバージョンアップグレート"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
-#~ msgstr "Cura 2.5 からCura 2.6のコンフィグレーションアップグレート。"
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.5 to 2.6"
-#~ msgstr "2.5から2.6にバージョンアップグレート"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
-#~ msgstr "Cura 2.7からCura 3.0のコンフィグレーションアップグレート。"
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.7 to 3.0"
-#~ msgstr "2.7から3.0にバージョンアップグレート"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.4 to Cura 3.5."
-#~ msgstr "Cura 3.4 から Cura 3.5 のコンフィグレーションアップグレート。"
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.4 to 3.5"
-#~ msgstr "3.4 から 3.5 にバージョンアップグレート"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.0 to Cura 3.1."
-#~ msgstr "Cura 3.0からCura 3.1のコンフィグレーションアップグレート。"
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.0 to 3.1"
-#~ msgstr "3.0から3.1にバージョンアップグレート"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
-#~ msgstr "Cura 2.6 からCura 2.7のコンフィグレーションアップグレート。"
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.6 to 2.7"
-#~ msgstr "2.6から2.7にバージョンアップグレート"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
-#~ msgstr "Cura 2.1 からCura 2.2のコンフィグレーションアップグレート。"
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.1 to 2.2"
-#~ msgstr "2.1 から2.2にバージョンアップグレート"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
-#~ msgstr "Cura 2.2 からCura 2.4のコンフィグレーションアップグレート。"
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.2 to 2.4"
-#~ msgstr "2.2 から2.4にバージョンアップグレート"
-
-#~ msgctxt "description"
-#~ msgid "Enables ability to generate printable geometry from 2D image files."
-#~ msgstr "2Dの画像ファイルからプリント可能なジオメトリーを生成を可能にする。"
-
-#~ msgctxt "name"
-#~ msgid "Image Reader"
-#~ msgstr "画像リーダー"
-
-#~ msgctxt "description"
-#~ msgid "Provides the link to the CuraEngine slicing backend."
-#~ msgstr "CuraEngineスライシングバックエンドにリンクを供給する。"
-
-#~ msgctxt "name"
-#~ msgid "CuraEngine Backend"
-#~ msgstr "Curaエンジンバックエンド"
-
-#~ msgctxt "description"
-#~ msgid "Provides the Per Model Settings."
-#~ msgstr "各モデル設定を与える。"
-
-#~ msgctxt "name"
-#~ msgid "Per Model Settings Tool"
-#~ msgstr "各モデル設定ツール"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for reading 3MF files."
-#~ msgstr "3MFファイルを読むこむためのサポートを供給する。"
-
-#~ msgctxt "name"
-#~ msgid "3MF Reader"
-#~ msgstr "3MFリーダー"
-
-#~ msgctxt "description"
-#~ msgid "Provides a normal solid mesh view."
-#~ msgstr "ノーマルなソリットメッシュビューを供給する。"
-
-#~ msgctxt "name"
-#~ msgid "Solid View"
-#~ msgstr "ソリッドビュー"
-
-#~ msgctxt "description"
-#~ msgid "Allows loading and displaying G-code files."
-#~ msgstr "G-codeファイルの読み込み、表示を許可する。"
-
-#~ msgctxt "name"
-#~ msgid "G-code Reader"
-#~ msgstr "G-codeリーダー"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for exporting Cura profiles."
-#~ msgstr "Curaプロファイルを書き出すためのサポートを供給する。"
-
-#~ msgctxt "name"
-#~ msgid "Cura Profile Writer"
-#~ msgstr "Curaプロファイルライター"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for writing 3MF files."
-#~ msgstr "3MFファイルを読むこむためのサポートを供給する。"
-
-#~ msgctxt "name"
-#~ msgid "3MF Writer"
-#~ msgstr "3MFリーダー"
-
-#~ msgctxt "description"
-#~ msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)."
-#~ msgstr "Ultimakerのプリンターのアクションを供給する(ベッドレベリングウィザード、アップグレードの選択、他)"
-
-#~ msgctxt "name"
-#~ msgid "Ultimaker machine actions"
-#~ msgstr "Ultimkerプリンターのアクション"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing Cura profiles."
-#~ msgstr "Curaプロファイルを取り込むためのサポートを供給する。"
-
-#~ msgctxt "name"
-#~ msgid "Cura Profile Reader"
-#~ msgstr "Curaプロファイルリーダー"
-
#~ msgctxt "@warning:status"
#~ msgid "Please generate G-code before saving."
#~ msgstr "保存する前に G-code を生成してください。"
@@ -5736,14 +6310,6 @@ msgstr "X3GWriter"
#~ msgid "Upgrade Firmware"
#~ msgstr "ファームウェアをアップグレード"
-#~ msgctxt "description"
-#~ msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI."
-#~ msgstr "材料メーカーがドロップインUIを使用して新しい材料と品質のプロファイルを作成できるようにします。"
-
-#~ msgctxt "name"
-#~ msgid "Print Profile Assistant"
-#~ msgstr "プリントプロファイルアシスタント"
-
#~ msgctxt "@action:button"
#~ msgid "Print with Doodle3D WiFi-Box"
#~ msgstr "Doodle3D WiFi-Boxでプリントする"
diff --git a/resources/i18n/ja_JP/fdmextruder.def.json.po b/resources/i18n/ja_JP/fdmextruder.def.json.po
index 83cbdd0515..3454139715 100644
--- a/resources/i18n/ja_JP/fdmextruder.def.json.po
+++ b/resources/i18n/ja_JP/fdmextruder.def.json.po
@@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0000\n"
+"POT-Creation-Date: 2019-07-16 14:38+0000\n"
"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Bothof \n"
"Language-Team: Japanese\n"
diff --git a/resources/i18n/ja_JP/fdmprinter.def.json.po b/resources/i18n/ja_JP/fdmprinter.def.json.po
index 05cda76519..a99e608a93 100644
--- a/resources/i18n/ja_JP/fdmprinter.def.json.po
+++ b/resources/i18n/ja_JP/fdmprinter.def.json.po
@@ -5,18 +5,18 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2019-03-13 14:00+0200\n"
-"Last-Translator: Bothof \n"
-"Language-Team: Japanese\n"
+"POT-Creation-Date: 2019-07-16 14:38+0000\n"
+"PO-Revision-Date: 2019-07-29 15:51+0200\n"
+"Last-Translator: Lionbridge \n"
+"Language-Team: Japanese , Japanese \n"
"Language: ja_JP\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.2.3\n"
#: fdmprinter.def.json
msgctxt "machine_settings label"
@@ -61,7 +61,9 @@ 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"
@@ -73,7 +75,9 @@ 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"
@@ -251,7 +255,7 @@ msgstr "エクストルーダーの数。エクストルーダーの単位は、
#: fdmprinter.def.json
msgctxt "extruders_enabled_count label"
-msgid "Number of Extruders that are enabled"
+msgid "Number of Extruders That Are Enabled"
msgstr "有効なエクストルーダーの数"
#: fdmprinter.def.json
@@ -261,7 +265,7 @@ msgstr "有効なエクストルーダートレインの数(ソフトウェア
#: fdmprinter.def.json
msgctxt "machine_nozzle_tip_outer_diameter label"
-msgid "Outer nozzle diameter"
+msgid "Outer Nozzle Diameter"
msgstr "ノズル外径"
# msgstr "ノズル外径"
@@ -272,7 +276,7 @@ msgstr "ノズルの外径。"
#: fdmprinter.def.json
msgctxt "machine_nozzle_head_distance label"
-msgid "Nozzle length"
+msgid "Nozzle Length"
msgstr "ノズル長さ"
# msgstr "ノズルの長さ"
@@ -283,7 +287,7 @@ msgstr "ノズル先端とプリントヘッドの最下部との高さの差。
#: fdmprinter.def.json
msgctxt "machine_nozzle_expansion_angle label"
-msgid "Nozzle angle"
+msgid "Nozzle Angle"
msgstr "ノズル角度"
# msgstr "ノズル角度"
@@ -294,7 +298,7 @@ msgstr "水平面とノズル直上の円錐部分との間の角度。"
#: fdmprinter.def.json
msgctxt "machine_heat_zone_length label"
-msgid "Heat zone length"
+msgid "Heat Zone Length"
msgstr "ノズル加熱長さ"
# msgstr "加熱範囲"
@@ -325,7 +329,7 @@ msgstr "Curaから温度を制御するかどうか。これをオフにして
#: fdmprinter.def.json
msgctxt "machine_nozzle_heat_up_speed label"
-msgid "Heat up speed"
+msgid "Heat Up Speed"
msgstr "加熱速度"
#: fdmprinter.def.json
@@ -335,7 +339,7 @@ msgstr "ノズルが加熱する速度(℃/ s)は、通常の印刷時温度
#: fdmprinter.def.json
msgctxt "machine_nozzle_cool_down_speed label"
-msgid "Cool down speed"
+msgid "Cool Down Speed"
msgstr "冷却速度"
#: fdmprinter.def.json
@@ -355,7 +359,7 @@ msgstr "ノズルが冷却される前にエクストルーダーが静止しな
#: fdmprinter.def.json
msgctxt "machine_gcode_flavor label"
-msgid "G-code flavour"
+msgid "G-code Flavor"
msgstr "G-codeフレーバー"
#: fdmprinter.def.json
@@ -425,10 +429,9 @@ msgctxt "machine_firmware_retract description"
msgid "Whether to use firmware retract commands (G10/G11) instead of using the E property in G1 commands to retract the material."
msgstr "材料を引き戻すためにG1コマンドのEプロパティーを使用する代わりにファームウェア引き戻しコマンド (G10/G11) を使用するかどうか。"
-# msgstr "Repetier"
#: fdmprinter.def.json
msgctxt "machine_disallowed_areas label"
-msgid "Disallowed areas"
+msgid "Disallowed Areas"
msgstr "拒否エリア"
#: fdmprinter.def.json
@@ -448,7 +451,7 @@ msgstr "ノズルが入ることができない領域を持つポリゴンのリ
#: fdmprinter.def.json
msgctxt "machine_head_polygon label"
-msgid "Machine head polygon"
+msgid "Machine Head Polygon"
msgstr "プリントヘッドポリゴン"
#: fdmprinter.def.json
@@ -458,7 +461,7 @@ msgstr "プリントヘッドの2Dシルエット(ファンキャップは除
#: fdmprinter.def.json
msgctxt "machine_head_with_fans_polygon label"
-msgid "Machine head & Fan polygon"
+msgid "Machine Head & Fan Polygon"
msgstr "プリントヘッドとファンポリゴン"
#: fdmprinter.def.json
@@ -468,8 +471,8 @@ msgstr "プリントヘッドの2Dシルエット(ファンキャップが含
#: fdmprinter.def.json
msgctxt "gantry_height label"
-msgid "Gantry height"
-msgstr "ガントリー高さ"
+msgid "Gantry Height"
+msgstr "ガントリーの高さ"
#: fdmprinter.def.json
msgctxt "gantry_height description"
@@ -499,7 +502,7 @@ msgstr "ノズルの内径。標準以外のノズルを使用する場合は、
#: fdmprinter.def.json
msgctxt "machine_use_extruder_offset_to_offset_coords label"
-msgid "Offset With Extruder"
+msgid "Offset with Extruder"
msgstr "エクストルーダーのオフセット"
#: fdmprinter.def.json
@@ -1322,7 +1325,9 @@ 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"
@@ -1339,11 +1344,10 @@ msgctxt "z_seam_corner label"
msgid "Seam Corner Preference"
msgstr "シームコーナー設定"
-# msgstr "薄層のプレファレンス"
#: fdmprinter.def.json
msgctxt "z_seam_corner description"
-msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner."
-msgstr "モデル輪郭のコーナーがシーム(縫い目)の位置に影響するかどうかを制御します。 Noneはコーナーがシームの位置に影響を与えないことを意味します。 Seam(縫い目)を非表示にすると、内側のコーナーでシームが発生しやすくなります。 Seamを表示すると、外側の角にシームが発生する可能性が高くなります。 シームを隠す、または表示するを選択することにより、内側または外側コーナーでシームを発生させる可能性が高くなります。"
+msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner. Smart Hiding allows both inside and outside corners, but chooses inside corners more frequently, if appropriate."
+msgstr "モデル輪郭の角がシームの位置に影響を及ぼすかどうかを制御します。[なし] は、角がシームの位置に影響を及ぼさないことを意味します。シームを隠すにすると、シームが内側の角に生じる可能性が高くなります。シームを外側にすると、シームが外側の角に生じる可能性が高くなります。シームを隠す/外側に出すは、シームが内側または外側の角に生じる可能性が高くなります。スマート・シームを使用すると、内外両側の角を使用できますが、適切な場合には内側の角が選択される頻度が高まります。"
#: fdmprinter.def.json
msgctxt "z_seam_corner option z_seam_corner_none"
@@ -1368,6 +1372,11 @@ msgctxt "z_seam_corner option z_seam_corner_any"
msgid "Hide or Expose Seam"
msgstr "シーム表示/非表示"
+#: fdmprinter.def.json
+msgctxt "z_seam_corner option z_seam_corner_weighted"
+msgid "Smart Hiding"
+msgstr "スマート・シーム"
+
# msgstr "シームを非表示または表示する"
#: fdmprinter.def.json
msgctxt "z_seam_relative label"
@@ -1382,14 +1391,13 @@ msgstr "有効時は、Zシームは各パーツの真ん中に設定されま
#: fdmprinter.def.json
msgctxt "skin_no_small_gaps_heuristic label"
-msgid "Ignore Small Z Gaps"
-msgstr "小さいZギャップは無視"
+msgid "No Skin in Z Gaps"
+msgstr "Z 軸ギャップにスキンなし"
-# msgstr "小さなZギャップを無視する"
#: fdmprinter.def.json
msgctxt "skin_no_small_gaps_heuristic description"
-msgid "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting."
-msgstr "モデルに垂直方向のギャップが小さくある場合、これらの狭いスペースにおいて上部および下部スキンを生成するために、約5%の計算時間が追加されます。そのような場合は、設定を無効にしてください。"
+msgid "When the model has small vertical gaps of only a few layers, there should normally be skin around those layers in the narrow space. Enable this setting to not generate skin if the vertical gap is very small. This improves printing time and slicing time, but technically leaves infill exposed to the air."
+msgstr "モデルの垂直方向に少数層のみの小さなギャップがある場合、通常は、その狭いスペース内にある層の周囲にスキンが存在する必要があります。垂直方向のギャップが非常に小さい場合は、この設定を有効にしてスキンが生成されないようにします。これにより、印刷時間とスライス時間が向上しますが、技術的には空気にさらされたインフィルを残します。"
#: fdmprinter.def.json
msgctxt "skin_outline_count label"
@@ -1705,7 +1713,9 @@ 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"
@@ -1807,7 +1817,9 @@ 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"
@@ -1944,6 +1956,16 @@ msgctxt "default_material_print_temperature description"
msgid "The default temperature used for printing. This should be the \"base\" temperature of a material. All other print temperatures should use offsets based on this value"
msgstr "印刷中のデフォルトの温度。これはマテリアルの基本温度となります。他のすべての造形温度はこの値に基づいてオフセットする必要があります"
+#: fdmprinter.def.json
+msgctxt "build_volume_temperature label"
+msgid "Build Volume Temperature"
+msgstr "造形温度"
+
+#: fdmprinter.def.json
+msgctxt "build_volume_temperature description"
+msgid "The temperature of the environment to print in. If this is 0, the build volume temperature will not be adjusted."
+msgstr "印刷するプリンタ内の温度。これがゼロ (0) の場合、造形温度は調整できません。"
+
#: fdmprinter.def.json
msgctxt "material_print_temperature label"
msgid "Printing Temperature"
@@ -2054,6 +2076,86 @@ msgctxt "material_shrinkage_percentage description"
msgid "Shrinkage ratio in percentage."
msgstr "収縮率をパーセントで示す。"
+#: fdmprinter.def.json
+msgctxt "material_crystallinity label"
+msgid "Crystalline Material"
+msgstr "結晶性材料"
+
+#: fdmprinter.def.json
+msgctxt "material_crystallinity description"
+msgid "Is this material the type that breaks off cleanly when heated (crystalline), or is it the type that produces long intertwined polymer chains (non-crystalline)?"
+msgstr "この材料は加熱時にきれいに分解するタイプ (結晶性) または長く絡み合ったポリマー鎖 (非結晶) を作り出すタイプのいずれですか?"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retracted_position label"
+msgid "Anti-ooze Retracted Position"
+msgstr "滲出防止引戻し位置"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retracted_position description"
+msgid "How far the material needs to be retracted before it stops oozing."
+msgstr "滲出を止めるには材料をどこまで引き戻す必要があるか。"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retraction_speed label"
+msgid "Anti-ooze Retraction Speed"
+msgstr "滲出防止引戻し速度"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retraction_speed description"
+msgid "How fast the material needs to be retracted during a filament switch to prevent oozing."
+msgstr "滲出を防止するにはフィラメントスイッチ中に材料をどの程度速く引き戻す必要があるか。"
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_retracted_position label"
+msgid "Break Preparation Retracted Position"
+msgstr "フィラメントの引き出し準備引戻し位置"
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_retracted_position description"
+msgid "How far the filament can be stretched before it breaks, while heated."
+msgstr "加熱中にフィラメントの引き出しが生じる距離。"
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_speed label"
+msgid "Break Preparation Retraction Speed"
+msgstr "フィラメント引き出し準備引戻し速度"
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_speed description"
+msgid "How fast the filament needs to be retracted just before breaking it off in a retraction."
+msgstr "フィラメントの引き出しが起こるための引き戻しの距離。"
+
+#: fdmprinter.def.json
+msgctxt "material_break_retracted_position label"
+msgid "Break Retracted Position"
+msgstr "フィラメント引き出しの引戻し位置"
+
+#: fdmprinter.def.json
+msgctxt "material_break_retracted_position description"
+msgid "How far to retract the filament in order to break it cleanly."
+msgstr "フィラメントをきれいに引き出すにはフィラメントをどこまで引き戻すか。"
+
+#: fdmprinter.def.json
+msgctxt "material_break_speed label"
+msgid "Break Retraction Speed"
+msgstr "フィラメント引き出しの引戻し速度"
+
+#: fdmprinter.def.json
+msgctxt "material_break_speed description"
+msgid "The speed at which to retract the filament in order to break it cleanly."
+msgstr "フィラメントをきれいに引き出すために維持すべきフィラメントの引戻し速度。"
+
+#: fdmprinter.def.json
+msgctxt "material_break_temperature label"
+msgid "Break Temperature"
+msgstr "フィラメント引き出し温度"
+
+#: fdmprinter.def.json
+msgctxt "material_break_temperature description"
+msgid "The temperature at which the filament is broken for a clean break."
+msgstr "フィラメントがきれいに引き出される温度。"
+
#: fdmprinter.def.json
msgctxt "material_flow label"
msgid "Flow"
@@ -2064,6 +2166,126 @@ msgctxt "material_flow description"
msgid "Flow compensation: the amount of material extruded is multiplied by this value."
msgstr "流れの補修: 押出されるマテリアルの量は、この値から乗算されます。"
+#: fdmprinter.def.json
+msgctxt "wall_material_flow label"
+msgid "Wall Flow"
+msgstr "壁のフロー"
+
+#: fdmprinter.def.json
+msgctxt "wall_material_flow description"
+msgid "Flow compensation on wall lines."
+msgstr "壁のフロー補正。"
+
+#: fdmprinter.def.json
+msgctxt "wall_0_material_flow label"
+msgid "Outer Wall Flow"
+msgstr "外壁のフロー"
+
+#: fdmprinter.def.json
+msgctxt "wall_0_material_flow description"
+msgid "Flow compensation on the outermost wall line."
+msgstr "最外壁のフロー補正。"
+
+#: fdmprinter.def.json
+msgctxt "wall_x_material_flow label"
+msgid "Inner Wall(s) Flow"
+msgstr "内壁のフロー"
+
+#: fdmprinter.def.json
+msgctxt "wall_x_material_flow description"
+msgid "Flow compensation on wall lines for all wall lines except the outermost one."
+msgstr "最外壁以外の壁のフロー補正。"
+
+#: fdmprinter.def.json
+msgctxt "skin_material_flow label"
+msgid "Top/Bottom Flow"
+msgstr "上面/下面フロー"
+
+#: fdmprinter.def.json
+msgctxt "skin_material_flow description"
+msgid "Flow compensation on top/bottom lines."
+msgstr "上面/下面のフロー補正。"
+
+#: fdmprinter.def.json
+msgctxt "roofing_material_flow label"
+msgid "Top Surface Skin Flow"
+msgstr "上部表面スキンフロー"
+
+#: fdmprinter.def.json
+msgctxt "roofing_material_flow description"
+msgid "Flow compensation on lines of the areas at the top of the print."
+msgstr "印刷物の上部表面のフロー補正。"
+
+#: fdmprinter.def.json
+msgctxt "infill_material_flow label"
+msgid "Infill Flow"
+msgstr "インフィルフロー"
+
+#: fdmprinter.def.json
+msgctxt "infill_material_flow description"
+msgid "Flow compensation on infill lines."
+msgstr "インフィルのフロー補正。"
+
+#: fdmprinter.def.json
+msgctxt "skirt_brim_material_flow label"
+msgid "Skirt/Brim Flow"
+msgstr "スカート/ブリムのフロー"
+
+#: fdmprinter.def.json
+msgctxt "skirt_brim_material_flow description"
+msgid "Flow compensation on skirt or brim lines."
+msgstr "スカートまたはブリムのフロー補正。"
+
+#: fdmprinter.def.json
+msgctxt "support_material_flow label"
+msgid "Support Flow"
+msgstr "支持材のフロー"
+
+#: fdmprinter.def.json
+msgctxt "support_material_flow description"
+msgid "Flow compensation on support structure lines."
+msgstr "支持材のフロー補正。"
+
+#: fdmprinter.def.json
+msgctxt "support_interface_material_flow label"
+msgid "Support Interface Flow"
+msgstr "支持材界面フロー"
+
+#: fdmprinter.def.json
+msgctxt "support_interface_material_flow description"
+msgid "Flow compensation on lines of support roof or floor."
+msgstr "支持材の天井面または床面のフロー補正。"
+
+#: fdmprinter.def.json
+msgctxt "support_roof_material_flow label"
+msgid "Support Roof Flow"
+msgstr "支持材天井面フロー"
+
+#: fdmprinter.def.json
+msgctxt "support_roof_material_flow description"
+msgid "Flow compensation on support roof lines."
+msgstr "支持材天井面のフロー補正。"
+
+#: fdmprinter.def.json
+msgctxt "support_bottom_material_flow label"
+msgid "Support Floor Flow"
+msgstr "支持材床面フロー"
+
+#: fdmprinter.def.json
+msgctxt "support_bottom_material_flow description"
+msgid "Flow compensation on support floor lines."
+msgstr "支持材床面のフロー補正。"
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_flow label"
+msgid "Prime Tower Flow"
+msgstr "プライムタワーのフロー"
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_flow description"
+msgid "Flow compensation on prime tower lines."
+msgstr "プライムタワーのフロー補正。"
+
#: fdmprinter.def.json
msgctxt "material_flow_layer_0 label"
msgid "Initial Layer Flow"
@@ -2181,8 +2403,8 @@ msgstr "サポート引き戻し限界"
#: fdmprinter.def.json
msgctxt "limit_support_retractions description"
-msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excesive stringing within the support structure."
-msgstr "サポートからサポートに直線移動する場合は、引き戻しを省略します。この設定を有効にすると、印刷時間が短縮されますが、サポート構造内部の糸引きが多くなります。"
+msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excessive stringing within the support structure."
+msgstr "支持材から支持材に直線移動する場合は、引戻しを省略します。この設定を有効にすると、印刷時間は節約できますが、支持材内で過剰な糸引きが発生する可能性があります。"
#: fdmprinter.def.json
msgctxt "material_standby_temperature label"
@@ -2234,6 +2456,16 @@ msgctxt "switch_extruder_prime_speed description"
msgid "The speed at which the filament is pushed back after a nozzle switch retraction."
msgstr "ノズル スイッチ後にフィラメントが押し戻される速度。"
+#: fdmprinter.def.json
+msgctxt "switch_extruder_extra_prime_amount label"
+msgid "Nozzle Switch Extra Prime Amount"
+msgstr "ノズル切替え後のプライムに必要な余剰量"
+
+#: fdmprinter.def.json
+msgctxt "switch_extruder_extra_prime_amount description"
+msgid "Extra material to prime after nozzle switching."
+msgstr "ノズル切替え後のプライムに必要な余剰材料。"
+
#: fdmprinter.def.json
msgctxt "speed label"
msgid "Speed"
@@ -2428,14 +2660,14 @@ msgid "The speed at which the skirt and brim are printed. Normally this is done
msgstr "スカートとブリムのプリント速度 通常は一層目のスピードと同じですが、異なる速度でスカートやブリムをプリントしたい場合に設定してください。"
#: fdmprinter.def.json
-msgctxt "max_feedrate_z_override label"
-msgid "Maximum Z Speed"
-msgstr "最大Z速度"
+msgctxt "speed_z_hop label"
+msgid "Z Hop Speed"
+msgstr "Z 軸ホップ速度"
#: fdmprinter.def.json
-msgctxt "max_feedrate_z_override description"
-msgid "The maximum speed with which the build plate is moved. Setting this to zero causes the print to use the firmware defaults for the maximum z speed."
-msgstr "ビルトプレートが移動する最高速度 この値を0に設定すると、ファームウェアのデフォルト値のZの最高速度が適用されます。"
+msgctxt "speed_z_hop description"
+msgid "The speed at which the vertical Z movement is made for Z Hops. This is typically lower than the print speed since the build plate or machine's gantry is harder to move."
+msgstr "Z 軸ホップに対して垂直 Z 軸方向の動きが行われる速度。これは通常、ビルドプレートまたはマシンのガントリーが動きにくいため、印刷速度よりも低くなります。"
#: fdmprinter.def.json
msgctxt "speed_slowdown_layers label"
@@ -3014,6 +3246,16 @@ msgctxt "retraction_hop_after_extruder_switch description"
msgid "After the machine switched from one extruder to the other, the build plate is lowered to create clearance between the nozzle and the print. This prevents the nozzle from leaving oozed material on the outside of a print."
msgstr "マシーンが1つのエクストルーダーからもう一つのエクストルーダーに切り替えられた際、ビルドプレートが下降して、ノズルと印刷物との間に隙間が形成される。これによりノズルが造形物の外側にはみ出たマテリアルを残さないためである。"
+#: fdmprinter.def.json
+msgctxt "retraction_hop_after_extruder_switch_height label"
+msgid "Z Hop After Extruder Switch Height"
+msgstr "エクストルーダースイッチ高さ後のZホップ"
+
+#: fdmprinter.def.json
+msgctxt "retraction_hop_after_extruder_switch_height description"
+msgid "The height difference when performing a Z Hop after extruder switch."
+msgstr "エクストルーダースイッチ後のZホップを実行するときの高さの違い。"
+
#: fdmprinter.def.json
msgctxt "cooling label"
msgid "Cooling"
@@ -3289,6 +3531,11 @@ msgctxt "support_pattern option cross"
msgid "Cross"
msgstr "クロス"
+#: fdmprinter.def.json
+msgctxt "support_pattern option gyroid"
+msgid "Gyroid"
+msgstr "ジャイロイド"
+
#: fdmprinter.def.json
msgctxt "support_wall_count label"
msgid "Support Wall Line Count"
@@ -3351,12 +3598,12 @@ msgid "Distance between the printed initial layer support structure lines. This
msgstr "印刷した初期層間の距離が構造ライをサポートします。この設定は、対応濃度で算出されます。"
#: fdmprinter.def.json
-msgctxt "support_infill_angle label"
-msgid "Support Infill Line Direction"
+msgctxt "support_infill_angles label"
+msgid "Support Infill Line Directions"
msgstr "サポートインフィルラインの向き"
#: fdmprinter.def.json
-msgctxt "support_infill_angle description"
+msgctxt "support_infill_angles description"
msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane."
msgstr "対応するインフィルラインの向きです。サポートインフィルパターンは平面で回転します。"
@@ -3488,8 +3735,8 @@ msgstr "サポート接合距離"
#: fdmprinter.def.json
msgctxt "support_join_distance description"
-msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one."
-msgstr "X/Y方向のサポート構造間の最大距離。別の構造がこの値より近づいた場合、構造は 1 つにマージします。"
+msgid "The maximum distance between support structures in the X/Y directions. When separate structures are closer together than this value, the structures merge into one."
+msgstr "支持材間における X/Y 軸方向の最大距離。個別の支持材間の距離がこの値よりも近い場合、支持材は 1 つにマージされます。"
#: fdmprinter.def.json
msgctxt "support_offset label"
@@ -3888,14 +4135,14 @@ msgid "The diameter of a special tower."
msgstr "特別な塔の直径。"
#: fdmprinter.def.json
-msgctxt "support_minimal_diameter label"
-msgid "Minimum Diameter"
-msgstr "最小直径"
+msgctxt "support_tower_maximum_supported_diameter label"
+msgid "Maximum Tower-Supported Diameter"
+msgstr "最大タワーサポート直径"
#: fdmprinter.def.json
-msgctxt "support_minimal_diameter description"
-msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
-msgstr "特殊なサポート塔によって支持される小さな領域のX / Y方向の最小直径。"
+msgctxt "support_tower_maximum_supported_diameter description"
+msgid "Maximum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
+msgstr "特殊なサポートタワーにより支持される小さな領域のX / Y方向の最小直径。"
#: fdmprinter.def.json
msgctxt "support_tower_roof_angle label"
@@ -4023,7 +4270,9 @@ 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"
@@ -4395,16 +4644,6 @@ msgctxt "prime_tower_enable description"
msgid "Print a tower next to the print which serves to prime the material after each nozzle switch."
msgstr "印刷物の横にタワーを造形して、ノズル交換後にフィラメントの調整をします。"
-#: fdmprinter.def.json
-msgctxt "prime_tower_circular label"
-msgid "Circular Prime Tower"
-msgstr "円形プライムタワー"
-
-#: fdmprinter.def.json
-msgctxt "prime_tower_circular description"
-msgid "Make the prime tower as a circular shape."
-msgstr "プライムタワーを円形にします。"
-
#: fdmprinter.def.json
msgctxt "prime_tower_size label"
msgid "Prime Tower Size"
@@ -4445,16 +4684,6 @@ msgctxt "prime_tower_position_y description"
msgid "The y coordinate of the position of the prime tower."
msgstr "プライムタワーの位置のy座標。"
-#: fdmprinter.def.json
-msgctxt "prime_tower_flow label"
-msgid "Prime Tower Flow"
-msgstr "プライムタワーのフロー"
-
-#: fdmprinter.def.json
-msgctxt "prime_tower_flow description"
-msgid "Flow compensation: the amount of material extruded is multiplied by this value."
-msgstr "吐出量: マテリアルの吐出量はこの値の乗算で計算されます。"
-
#: fdmprinter.def.json
msgctxt "prime_tower_wipe_enabled label"
msgid "Wipe Inactive Nozzle on Prime Tower"
@@ -4465,6 +4694,16 @@ msgctxt "prime_tower_wipe_enabled description"
msgid "After printing the prime tower with one nozzle, wipe the oozed material from the other nozzle off on the prime tower."
msgstr "1本のノズルでプライムタワーを印刷した後、もう片方のノズルから滲み出した材料をプライムタワーが拭き取ります。"
+#: fdmprinter.def.json
+msgctxt "prime_tower_brim_enable label"
+msgid "Prime Tower Brim"
+msgstr "プライムタワーブリム"
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_brim_enable description"
+msgid "Prime-towers might need the extra adhesion afforded by a brim even if the model doesn't. Presently can't be used with the 'Raft' adhesion-type."
+msgstr "モデルがない場合でも、プライムタワーには、ブリムによって与えられる追加の付着が必要なことがあります。現在は「ラフト」密着型では使用できません。"
+
#: fdmprinter.def.json
msgctxt "ooze_shield_enabled label"
msgid "Enable Ooze Shield"
@@ -4750,11 +4989,10 @@ msgctxt "smooth_spiralized_contours label"
msgid "Smooth Spiralized Contours"
msgstr "滑らかな輪郭"
-# msgstr "滑らかならせん状の輪郭"
#: fdmprinter.def.json
msgctxt "smooth_spiralized_contours description"
-msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
-msgstr "らせん状の輪郭を滑らかにしてZシームの視認性を低下させます(Zシームは印刷物上でほとんどみえませんが、レイヤービューでは確認できます。)スムージングは細かいサーフェスの詳細をぼかす傾向があることに注意してください。"
+msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
+msgstr "らせん状の輪郭を滑らかにしてZシームの視認性を低下させます (Zシームは印刷物上でほとんどみえませんが、層ビューでは確認できます)。スムージングは、細かい表面の詳細をぼかす傾向があることに注意してください。"
#: fdmprinter.def.json
msgctxt "relative_extrusion label"
@@ -4774,7 +5012,7 @@ msgstr "実験"
#: fdmprinter.def.json
msgctxt "experimental description"
msgid "experimental!"
-msgstr "実験的"
+msgstr "実験的!"
#: fdmprinter.def.json
msgctxt "support_tree_enable label"
@@ -4992,6 +5230,16 @@ msgctxt "meshfix_maximum_travel_resolution description"
msgid "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."
msgstr "スライス後の移動線分の最小サイズ。これを増やすと、移動の跡が滑らかでなくなります。これにより、プリンタが g コードの処理速度に追いつくことができますが、精度が低下します。"
+#: fdmprinter.def.json
+msgctxt "meshfix_maximum_deviation label"
+msgid "Maximum Deviation"
+msgstr "最大偏差"
+
+#: fdmprinter.def.json
+msgctxt "meshfix_maximum_deviation description"
+msgid "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."
+msgstr "最大解像度設定の解像度を下げるときに許容される最大偏差です。これを大きくすると、印刷の精度は低くなりますが、g-code は小さくなります。"
+
#: fdmprinter.def.json
msgctxt "support_skip_some_zags label"
msgid "Break Up Support In Chunks"
@@ -5260,8 +5508,8 @@ msgstr "円錐サポートを有効にする"
#: fdmprinter.def.json
msgctxt "support_conical_enabled description"
-msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang."
-msgstr "実験的機能:オーバーハング部分よりも底面のサポート領域を小さくする。"
+msgid "Make support areas smaller at the bottom than at the overhang."
+msgstr "オーバーハング部分よりも底面の支持領域を小さくする。"
#: fdmprinter.def.json
msgctxt "support_conical_angle label"
@@ -5602,7 +5850,7 @@ msgstr "ノズルと水平方向に下向きの線間の距離。大きな隙間
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_enabled label"
-msgid "Use adaptive layers"
+msgid "Use Adaptive Layers"
msgstr "適応レイヤーの使用"
#: fdmprinter.def.json
@@ -5612,7 +5860,7 @@ msgstr "適応レイヤーは、レイヤーの高さをモデルの形状に合
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_variation label"
-msgid "Adaptive layers maximum variation"
+msgid "Adaptive Layers Maximum Variation"
msgstr "適応レイヤー最大差分"
#: fdmprinter.def.json
@@ -5622,7 +5870,7 @@ msgstr "基準レイヤー高さと比較して許容される最大の高さ。
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_variation_step label"
-msgid "Adaptive layers variation step size"
+msgid "Adaptive Layers Variation Step Size"
msgstr "適応レイヤー差分ステップサイズ"
#: fdmprinter.def.json
@@ -5632,8 +5880,8 @@ msgstr "次のレイヤーの高さを前のレイヤーの高さと比べた差
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_threshold label"
-msgid "Adaptive layers threshold"
-msgstr "適応レイヤー閾値"
+msgid "Adaptive Layers Threshold"
+msgstr "適応レイヤーしきい値"
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_threshold description"
@@ -5850,6 +6098,156 @@ msgctxt "bridge_fan_speed_3 description"
msgid "Percentage fan speed to use when printing the third bridge skin layer."
msgstr "サードブリッジのスキンレイヤーを印刷する際に使用するファン速度の割合。"
+#: fdmprinter.def.json
+msgctxt "clean_between_layers label"
+msgid "Wipe Nozzle Between Layers"
+msgstr "レイヤー間のノズル拭き取り"
+
+#: fdmprinter.def.json
+msgctxt "clean_between_layers description"
+msgid "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."
+msgstr "レイヤー間にノズル拭き取り G-Code を含むかどうか指定します。この設定を有効にすると、レイヤ変更時の引き戻し動作に影響する可能性があります。拭き取りスクリプトが動作するレイヤでの押し戻しを制御するには、ワイプリトラクト設定を使用してください。"
+
+#: fdmprinter.def.json
+msgctxt "max_extrusion_before_wipe label"
+msgid "Material Volume Between Wipes"
+msgstr "ワイプ間の材料の量"
+
+#: fdmprinter.def.json
+msgctxt "max_extrusion_before_wipe description"
+msgid "Maximum material, that can be extruded before another nozzle wipe is initiated."
+msgstr "別のノズル拭き取りを行う前に押し出せる材料の最大量。"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_enable label"
+msgid "Wipe Retraction Enable"
+msgstr "ワイプリトラクト有効"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_enable description"
+msgid "Retract the filament when the nozzle is moving over a non-printed area."
+msgstr "ノズルが印刷しないで良い領域を移動する際にフィラメントを引き戻す。"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_amount label"
+msgid "Wipe Retraction Distance"
+msgstr "ワイプリトラクト無効"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_amount description"
+msgid "Amount to retract the filament so it does not ooze during the wipe sequence."
+msgstr "拭き取りシーケンス中に出ないように押し戻すフィラメントの量。"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_extra_prime_amount label"
+msgid "Wipe Retraction Extra Prime Amount"
+msgstr "ワイプ引き戻し時の余分押し戻し量"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_extra_prime_amount description"
+msgid "Some material can ooze away during a wipe travel moves, which can be compensated for here."
+msgstr "いくつかの材料は、ワイプ移動中ににじみ出るためここで補償することができます。"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_speed label"
+msgid "Wipe Retraction Speed"
+msgstr "ワイプリトラクト速度"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_speed description"
+msgid "The speed at which the filament is retracted and primed during a wipe retraction move."
+msgstr "ワイプ引き戻し中にフィラメントが引き戻される時の速度。"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_retract_speed label"
+msgid "Wipe Retraction Retract Speed"
+msgstr "ワイプ引き戻し速度"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_retract_speed description"
+msgid "The speed at which the filament is retracted during a wipe retraction move."
+msgstr "ワイプ引き戻し移動時にフィラメントが引き戻される速度。"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_prime_speed label"
+msgid "Retraction Prime Speed"
+msgstr "押し戻し速度の取り消し"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_prime_speed description"
+msgid "The speed at which the filament is primed during a wipe retraction move."
+msgstr "ワイプ引き戻し移動時にフィラメントが押し戻されるスピード。"
+
+#: fdmprinter.def.json
+msgctxt "wipe_pause label"
+msgid "Wipe Pause"
+msgstr "ワイプ一時停止"
+
+#: fdmprinter.def.json
+msgctxt "wipe_pause description"
+msgid "Pause after the unretract."
+msgstr "引き戻し前に一時停止します。"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_enable label"
+msgid "Wipe Z Hop When Retracted"
+msgstr "引き戻し時のワイプZホップ"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_enable description"
+msgid "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."
+msgstr "引き戻しが完了すると、ビルドプレートが下降してノズルとプリントの間に隙間ができます。ノズルの走行中に造形物に当たるのを防ぎ、造形物をビルドプレートから剥がしてしまう現象を減らします。"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_amount label"
+msgid "Wipe Z Hop Height"
+msgstr "ワイプZホップ高さ"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_amount description"
+msgid "The height difference when performing a Z Hop."
+msgstr "Zホップを実行するときの高さ。"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_speed label"
+msgid "Wipe Hop Speed"
+msgstr "ワイプホップ速度"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_speed description"
+msgid "Speed to move the z-axis during the hop."
+msgstr "ホップ中に z 軸を移動する速度。"
+
+#: fdmprinter.def.json
+msgctxt "wipe_brush_pos_x label"
+msgid "Wipe Brush X Position"
+msgstr "ワイプブラシXの位置"
+
+#: fdmprinter.def.json
+msgctxt "wipe_brush_pos_x description"
+msgid "X location where wipe script will start."
+msgstr "ワイプスクリプトを開始するX位置。"
+
+#: fdmprinter.def.json
+msgctxt "wipe_repeat_count label"
+msgid "Wipe Repeat Count"
+msgstr "ワイプ繰り返し回数"
+
+#: fdmprinter.def.json
+msgctxt "wipe_repeat_count description"
+msgid "Number of times to move the nozzle across the brush."
+msgstr "ブラシ全体をノズルが移動する回数。"
+
+#: fdmprinter.def.json
+msgctxt "wipe_move_distance label"
+msgid "Wipe Move Distance"
+msgstr "ワイプ移動距離"
+
+#: fdmprinter.def.json
+msgctxt "wipe_move_distance description"
+msgid "The distance to move the head back and forth across the brush."
+msgstr "ブラシ全体でヘッド前後に動かす距離。"
+
#: fdmprinter.def.json
msgctxt "command_line_settings label"
msgid "Command Line Settings"
@@ -5910,6 +6308,142 @@ msgctxt "mesh_rotation_matrix description"
msgid "Transformation matrix to be applied to the model when loading it from file."
msgstr "ファイルから読み込むときに、モデルに適用するトランスフォーメーションマトリックス。"
+#~ msgctxt "machine_gcode_flavor label"
+#~ msgid "G-code Flavour"
+#~ msgstr "G-codeフレーバー"
+
+# msgstr "薄層のプレファレンス"
+#~ msgctxt "z_seam_corner description"
+#~ msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner."
+#~ msgstr "モデル輪郭のコーナーがシーム(縫い目)の位置に影響するかどうかを制御します。 Noneはコーナーがシームの位置に影響を与えないことを意味します。 Seam(縫い目)を非表示にすると、内側のコーナーでシームが発生しやすくなります。 Seamを表示すると、外側の角にシームが発生する可能性が高くなります。 シームを隠す、または表示するを選択することにより、内側または外側コーナーでシームを発生させる可能性が高くなります。"
+
+#~ msgctxt "skin_no_small_gaps_heuristic label"
+#~ msgid "Ignore Small Z Gaps"
+#~ msgstr "小さいZギャップは無視"
+
+# msgstr "小さなZギャップを無視する"
+#~ msgctxt "skin_no_small_gaps_heuristic description"
+#~ msgid "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting."
+#~ msgstr "モデルに垂直方向のギャップが小さくある場合、これらの狭いスペースにおいて上部および下部スキンを生成するために、約5%の計算時間が追加されます。そのような場合は、設定を無効にしてください。"
+
+#~ msgctxt "build_volume_temperature description"
+#~ msgid "The temperature used for build volume. If this is 0, the build volume temperature will not be adjusted."
+#~ msgstr "造形に使用した温度。これがゼロ (0) の場合、造形温度は調整できません。"
+
+#~ msgctxt "limit_support_retractions description"
+#~ msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excesive stringing within the support structure."
+#~ msgstr "サポートからサポートに直線移動する場合は、引き戻しを省略します。この設定を有効にすると、印刷時間が短縮されますが、サポート構造内部の糸引きが多くなります。"
+
+#~ msgctxt "max_feedrate_z_override label"
+#~ msgid "Maximum Z Speed"
+#~ msgstr "最大Z速度"
+
+#~ msgctxt "max_feedrate_z_override description"
+#~ msgid "The maximum speed with which the build plate is moved. Setting this to zero causes the print to use the firmware defaults for the maximum z speed."
+#~ msgstr "ビルトプレートが移動する最高速度 この値を0に設定すると、ファームウェアのデフォルト値のZの最高速度が適用されます。"
+
+#~ msgctxt "support_join_distance description"
+#~ msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one."
+#~ msgstr "X/Y方向のサポート構造間の最大距離。別の構造がこの値より近づいた場合、構造は 1 つにマージします。"
+
+#~ msgctxt "support_minimal_diameter label"
+#~ msgid "Minimum Diameter"
+#~ msgstr "最小直径"
+
+#~ msgctxt "support_minimal_diameter description"
+#~ msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
+#~ msgstr "特殊なサポート塔によって支持される小さな領域のX / Y方向の最小直径。"
+
+#~ msgctxt "prime_tower_circular label"
+#~ msgid "Circular Prime Tower"
+#~ msgstr "円形プライムタワー"
+
+#~ msgctxt "prime_tower_circular description"
+#~ msgid "Make the prime tower as a circular shape."
+#~ msgstr "プライムタワーを円形にします。"
+
+#~ msgctxt "prime_tower_flow description"
+#~ msgid "Flow compensation: the amount of material extruded is multiplied by this value."
+#~ msgstr "吐出量: マテリアルの吐出量はこの値の乗算で計算されます。"
+
+# msgstr "滑らかならせん状の輪郭"
+#~ msgctxt "smooth_spiralized_contours description"
+#~ msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
+#~ msgstr "らせん状の輪郭を滑らかにしてZシームの視認性を低下させます(Zシームは印刷物上でほとんどみえませんが、レイヤービューでは確認できます。)スムージングは細かいサーフェスの詳細をぼかす傾向があることに注意してください。"
+
+#~ msgctxt "support_conical_enabled description"
+#~ msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang."
+#~ msgstr "実験的機能:オーバーハング部分よりも底面のサポート領域を小さくする。"
+
+#~ msgctxt "extruders_enabled_count label"
+#~ msgid "Number of Extruders that are enabled"
+#~ msgstr "有効なエクストルーダーの数"
+
+#~ msgctxt "machine_nozzle_tip_outer_diameter label"
+#~ msgid "Outer nozzle diameter"
+#~ msgstr "ノズル外径"
+
+#~ msgctxt "machine_nozzle_head_distance label"
+#~ msgid "Nozzle length"
+#~ msgstr "ノズル長さ"
+
+#~ msgctxt "machine_nozzle_expansion_angle label"
+#~ msgid "Nozzle angle"
+#~ msgstr "ノズル角度"
+
+#~ msgctxt "machine_heat_zone_length label"
+#~ msgid "Heat zone length"
+#~ msgstr "ノズル加熱長さ"
+
+#~ msgctxt "machine_nozzle_heat_up_speed label"
+#~ msgid "Heat up speed"
+#~ msgstr "加熱速度"
+
+#~ msgctxt "machine_nozzle_cool_down_speed label"
+#~ msgid "Cool down speed"
+#~ msgstr "冷却速度"
+
+#~ msgctxt "machine_gcode_flavor label"
+#~ msgid "G-code flavour"
+#~ msgstr "G-codeフレーバー"
+
+# msgstr "Repetier"
+#~ msgctxt "machine_disallowed_areas label"
+#~ msgid "Disallowed areas"
+#~ msgstr "拒否エリア"
+
+#~ msgctxt "machine_head_polygon label"
+#~ msgid "Machine head polygon"
+#~ msgstr "プリントヘッドポリゴン"
+
+#~ msgctxt "machine_head_with_fans_polygon label"
+#~ msgid "Machine head & Fan polygon"
+#~ msgstr "プリントヘッドとファンポリゴン"
+
+#~ msgctxt "gantry_height label"
+#~ msgid "Gantry height"
+#~ msgstr "ガントリー高さ"
+
+#~ msgctxt "machine_use_extruder_offset_to_offset_coords label"
+#~ msgid "Offset With Extruder"
+#~ msgstr "エクストルーダーのオフセット"
+
+#~ msgctxt "adaptive_layer_height_enabled label"
+#~ msgid "Use adaptive layers"
+#~ msgstr "適応レイヤーの使用"
+
+#~ msgctxt "adaptive_layer_height_variation label"
+#~ msgid "Adaptive layers maximum variation"
+#~ msgstr "適応レイヤー最大差分"
+
+#~ msgctxt "adaptive_layer_height_variation_step label"
+#~ msgid "Adaptive layers variation step size"
+#~ msgstr "適応レイヤー差分ステップサイズ"
+
+#~ msgctxt "adaptive_layer_height_threshold label"
+#~ msgid "Adaptive layers threshold"
+#~ msgstr "適応レイヤー閾値"
+
#~ msgctxt "skin_overlap description"
#~ msgid "The amount of overlap between the skin and the walls as a percentage of the skin line width. A slight overlap allows the walls to connect firmly to the skin. This is a percentage of the average line widths of the skin lines and the innermost wall."
#~ msgstr "スキンと壁のオーバーラップ量 (スキンライン幅に対する%)。少しのオーバーラップによって壁がスキンにしっかりつながります。これは、スキンライン幅の平均ライン幅と最内壁の%です。"
@@ -6055,7 +6589,6 @@ msgstr "ファイルから読み込むときに、モデルに適用するトラ
#~ "Gcode commands to be executed at the very start - separated by \n"
#~ "."
#~ msgstr ""
-
#~ "Gcodeのコマンドは −で始まり\n"
#~ "で区切られます。"
@@ -6069,7 +6602,6 @@ 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 e27a6a05c6..2c2a37ad1b 100644
--- a/resources/i18n/ko_KR/cura.po
+++ b/resources/i18n/ko_KR/cura.po
@@ -5,20 +5,20 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2019-03-14 14:40+0100\n"
-"Last-Translator: Korean \n"
-"Language-Team: Jinbum Kim , Korean \n"
+"POT-Creation-Date: 2019-07-16 14:38+0200\n"
+"PO-Revision-Date: 2019-07-29 16:09+0200\n"
+"Last-Translator: Lionbridge \n"
+"Language-Team: Korean , 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.1.1\n"
+"X-Generator: Poedit 2.2.1\n"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:27
msgctxt "@action"
msgid "Machine Settings"
msgstr "기기 설정"
@@ -56,7 +56,7 @@ msgctxt "@info:title"
msgid "3D Model Assistant"
msgstr "3D 모델 도우미"
-#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:86
+#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:90
#, python-brace-format
msgctxt "@info:status"
msgid ""
@@ -70,16 +70,6 @@ msgstr ""
"인쇄 품질 및 안정성을 최고로 높이는 방법을 알아보십시오.
\n"
"인쇄 품질 가이드 보기
"
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
-msgctxt "@item:inmenu"
-msgid "Changelog"
-msgstr "변경 내역"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
-msgctxt "@item:inmenu"
-msgid "Show Changelog"
-msgstr "변경 내역 표시"
-
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py:25
msgctxt "@action"
msgid "Update Firmware"
@@ -95,37 +85,36 @@ msgctxt "@info:status"
msgid "Profile has been flattened & activated."
msgstr "프로파일이 병합되고 활성화되었습니다."
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:33
+#: /home/ruben/Projects/Cura/plugins/AMFReader/__init__.py:15
+msgctxt "@item:inlistbox"
+msgid "AMF File"
+msgstr "AMF 파일"
+
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:37
msgctxt "@item:inmenu"
msgid "USB printing"
msgstr "USB 프린팅"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:34
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:38
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print via USB"
msgstr "USB를 통해 프린팅"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:35
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:39
msgctxt "@info:tooltip"
msgid "Print via USB"
msgstr "USB를 통해 프린팅"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:71
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:75
msgctxt "@info:status"
msgid "Connected via USB"
msgstr "USB를 통해 연결"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:96
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:100
msgctxt "@label"
msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?"
msgstr "USB 인쇄가 진행 중입니다. Cura를 닫으면 인쇄도 중단됩니다. 계속하시겠습니까?"
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
-msgctxt "X3G Writer File Description"
-msgid "X3G File"
-msgstr "X3G 파일"
-
#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/GPX-prefix/src/GPX/slicerplugins/cura15.06/X3gWriter/__init__.py:16
msgctxt "X3g Writer Plugin Description"
msgid "Writes X3g to files"
@@ -136,6 +125,11 @@ msgctxt "X3g Writer File Description"
msgid "X3g File"
msgstr "X3g 파일"
+#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
+msgctxt "X3G Writer File Description"
+msgid "X3G File"
+msgstr "X3G 파일"
+
#: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/__init__.py:17
#: /home/ruben/Projects/Cura/plugins/GCodeGzReader/__init__.py:17
msgctxt "@item:inlistbox"
@@ -148,6 +142,7 @@ msgid "GCodeGzWriter does not support text mode."
msgstr "GCodeGzWriter는 텍스트 모드는 지원하지 않습니다."
#: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:28
+#: /home/ruben/Projects/Cura/plugins/UFPReader/__init__.py:22
msgctxt "@item:inlistbox"
msgid "Ultimaker Format Package"
msgstr "Ultimaker 포맷 패키지"
@@ -206,10 +201,10 @@ msgid "Could not save to removable drive {0}: {1}"
msgstr "이동식 드라이브 {0}: {1} 에 저장할 수 없습니다 :"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:137
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:152
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:133
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:140
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1629
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:188
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:134
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:141
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1622
msgctxt "@info:title"
msgid "Error"
msgstr "오류"
@@ -238,9 +233,9 @@ msgstr "이동식 장치 {0} 꺼내기"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:151
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:163
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1619
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1719
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1612
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1712
msgctxt "@info:title"
msgid "Warning"
msgstr "경고"
@@ -267,266 +262,267 @@ msgctxt "@item:intext"
msgid "Removable Drive"
msgstr "이동식 드라이브"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:74
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:93
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print over network"
msgstr "네트워크를 통해 프린팅"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:89
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:76
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:94
msgctxt "@properties:tooltip"
msgid "Print over network"
msgstr "네트워크를 통해 프린팅"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:95
msgctxt "@info:status"
msgid "Connected over the network."
msgstr "네트워크를 통해 연결됨."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
msgctxt "@info:status"
msgid "Connected over the network. Please approve the access request on the printer."
msgstr "네트워크를 통해 연결되었습니다. 프린터의 접근 요청을 승인하십시오."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:93
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:100
msgctxt "@info:status"
msgid "Connected over the network. No access to control the printer."
msgstr "네트워크를 통해 연결되었습니다. 프린터를 제어할 수 있는 권한이 없습니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
msgctxt "@info:status"
msgid "Access to the printer requested. Please approve the request on the printer"
msgstr "요청된 프린터에 대한 액세스. 프린터에서 요청을 승인하십시오"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:101
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
msgctxt "@info:title"
msgid "Authentication status"
msgstr "인증 상태"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:103
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:109
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:113
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:120
msgctxt "@info:title"
msgid "Authentication Status"
msgstr "인증 상태"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:104
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:187
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:111
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:198
msgctxt "@action:button"
msgid "Retry"
msgstr "재시도"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
msgctxt "@info:tooltip"
msgid "Re-send the access request"
msgstr "접근 요청 다시 보내기"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:115
msgctxt "@info:status"
msgid "Access to the printer accepted"
msgstr "허용 된 프린터에 대한 접근 허용"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:119
msgctxt "@info:status"
msgid "No access to print with this printer. Unable to send print job."
msgstr "이 프린터로 프린팅 할 수 없습니다. 프린팅 작업을 보낼 수 없습니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:114
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:121
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:65
msgctxt "@action:button"
msgid "Request Access"
msgstr "접근 요청"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:123
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:66
msgctxt "@info:tooltip"
msgid "Send access request to the printer"
msgstr "프린터에 접근 요청 보내기"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:201
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:208
msgctxt "@label"
msgid "Unable to start a new print job."
msgstr "새 프린팅 작업을 시작할 수 없습니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:203
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:210
msgctxt "@label"
msgid "There is an issue with the configuration of your Ultimaker, which makes it impossible to start the print. Please resolve this issues before continuing."
msgstr "Ultimaker의 설정에 문제가 있어 프린팅을 시작할 수 없습니다. 계속하기 전에 이 문제를 해결하십시오."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:209
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:231
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:216
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:238
msgctxt "@window:title"
msgid "Mismatched configuration"
msgstr "일치하지 않는 구성"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:230
msgctxt "@label"
msgid "Are you sure you wish to print with the selected configuration?"
msgstr "선택한 구성으로 프린팅 하시겠습니까?"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:225
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:232
msgctxt "@label"
msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer."
msgstr "프린터와 Cura의 설정이 일치하지 않습니다. 최상의 결과를 얻으려면 프린터에 삽입 된 PrintCores 및 재료로 슬라이싱을 하십시오."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:252
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:162
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:162
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:176
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:181
msgctxt "@info:status"
msgid "Sending new jobs (temporarily) blocked, still sending the previous print job."
msgstr "새로운 작업 전송 (일시적)이 차단되어 이전 프린팅 작업을 계속 보냅니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:180
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:197
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:266
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:194
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:211
msgctxt "@info:status"
msgid "Sending data to printer"
msgstr "프린터로 데이터 보내기"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:260
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:182
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:199
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:267
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:196
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:213
msgctxt "@info:title"
msgid "Sending Data"
msgstr "데이터 전송 중"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:261
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:200
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:268
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:214
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:18
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:19
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:81
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:395
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:410
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:20
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:38
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:143
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:58
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:149
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:391
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:254
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:283
msgctxt "@action:button"
msgid "Cancel"
msgstr "취소"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:324
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:331
#, python-brace-format
msgctxt "@info:status"
msgid "No Printcore loaded in slot {slot_number}"
msgstr "{slot_number} 슬롯에 로드 된 프린터코어가 없음"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:337
#, python-brace-format
msgctxt "@info:status"
msgid "No material loaded in slot {slot_number}"
msgstr "{slot_number}에 로드 된 재료가 없음"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:353
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:360
#, python-brace-format
msgctxt "@label"
msgid "Different PrintCore (Cura: {cura_printcore_name}, Printer: {remote_printcore_name}) selected for extruder {extruder_id}"
msgstr "익스트루더 {extruder_id}에 대해 다른 프린터코어 (Cura : {cura_printcore_name}, 프린터 : {remote_printcore_name})가 선택되었습니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:362
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:369
#, python-brace-format
msgctxt "@label"
msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "익스트루더 {2}에 다른 재료 (Cura : {0}, Printer : {1})가 선택됨"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:548
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:555
msgctxt "@window:title"
msgid "Sync with your printer"
msgstr "프린터와 동기화"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:550
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:557
msgctxt "@label"
msgid "Would you like to use your current printer configuration in Cura?"
msgstr "Cura에서 현재 프린터 구성을 사용 하시겠습니까?"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:552
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:559
msgctxt "@label"
msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer."
msgstr "프린터의 PrintCores와 재료는 현재 프로젝트 내의 재료와 다릅니다. 최상의 결과를 얻으려면 프린터에 삽입 된 PrintCores 및 재료로 슬라이싱 하십시오."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:96
msgctxt "@info:status"
msgid "Connected over the network"
msgstr "네트워크를 통해 연결됨"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:275
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:342
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:370
msgctxt "@info:status"
msgid "Print job was successfully sent to the printer."
msgstr "출력 작업이 프린터에 성공적으로 보내졌습니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:277
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:343
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:291
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:371
msgctxt "@info:title"
msgid "Data Sent"
msgstr "데이터 전송 됨"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:278
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:292
msgctxt "@action:button"
msgid "View in Monitor"
msgstr "모니터에서 보기"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:390
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:290
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:411
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Printer '{printer_name}' has finished printing '{job_name}'."
msgstr "'{printer_name} 프린터가 '{job_name}' 프린팅을 완료했습니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:392
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:294
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:413
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:322
#, python-brace-format
msgctxt "@info:status"
msgid "The print job '{job_name}' was finished."
msgstr "인쇄 작업 ‘{job_name}’이 완료되었습니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:393
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:414
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:316
msgctxt "@info:status"
msgid "Print finished"
msgstr "프린팅이 완료됨"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:573
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:595
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:629
msgctxt "@label:material"
msgid "Empty"
msgstr "비어 있음"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:596
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:630
msgctxt "@label:material"
msgid "Unknown"
msgstr "알 수 없음"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:169
msgctxt "@action:button"
msgid "Print via Cloud"
msgstr "Cloud를 통해 인쇄"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:170
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
msgstr "Cloud를 통해 인쇄"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:171
msgctxt "@info:status"
msgid "Connected via Cloud"
msgstr "Cloud를 통해 연결됨"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:163
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:331
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:182
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:359
msgctxt "@info:title"
msgid "Cloud error"
msgstr "Cloud 오류"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:199
msgctxt "@info:status"
msgid "Could not export print job."
msgstr "인쇄 작업을 내보낼 수 없음."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:358
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
msgstr "데이터를 프린터로 업로드할 수 없음."
@@ -541,48 +537,52 @@ msgctxt "@info:status"
msgid "today"
msgstr "오늘"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:187
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
msgstr "Cloud 연결 시 오류가 있었습니다."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
+msgctxt "@info:status"
+msgid "Sending Print Job"
+msgstr "인쇄 작업 전송"
+
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
-msgid "Sending data to remote cluster"
-msgstr "원격 클러스터로 데이터 전송 중"
+msgid "Uploading via Ultimaker Cloud"
+msgstr "Ultimaker Cloud를 통해 업로드하는 중"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:621
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
msgstr "Ultimaker 계정을 사용하여 어디에서든 인쇄 작업을 전송하고 모니터링하십시오."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
-msgctxt "@info:status"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:627
+msgctxt "@info:status Ultimaker Cloud is a brand name and shouldn't be translated."
msgid "Connect to Ultimaker Cloud"
msgstr "Ultimaker Cloud에 연결"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:628
msgctxt "@action"
msgid "Don't ask me again for this printer."
msgstr "이 프린터에 대해 다시 물어보지 마십시오."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:631
msgctxt "@action"
msgid "Get started"
msgstr "시작하기"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:637
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
msgstr "이제 Ultimaker 계정을 사용하여 어디에서든 인쇄 작업을 전송하고 모니터링할 수 있습니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:643
msgctxt "@info:status"
msgid "Connected!"
msgstr "연결됨!"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:645
msgctxt "@action"
msgid "Review your connection"
msgstr "연결 검토"
@@ -597,7 +597,7 @@ msgctxt "@item:inmenu"
msgid "Monitor"
msgstr "모니터"
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:124
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:118
msgctxt "@info"
msgid "Could not access update information."
msgstr "업데이트 정보에 액세스 할 수 없습니다."
@@ -654,46 +654,11 @@ msgctxt "@info:tooltip"
msgid "Create a volume in which supports are not printed."
msgstr "서포트가 프린팅되지 않는 볼륨을 만듭니다."
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:52
-msgctxt "@info"
-msgid "Cura collects anonymized usage statistics."
-msgstr "Cura는 익명의 사용 통계를 수집합니다."
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:55
-msgctxt "@info:title"
-msgid "Collecting Data"
-msgstr "데이터 수집"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:57
-msgctxt "@action:button"
-msgid "More info"
-msgstr "추가 정보"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:58
-msgctxt "@action:tooltip"
-msgid "See more information on what data Cura sends."
-msgstr "Cura가 전송하는 데이터에 대한 추가 정보를 확인하십시오."
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:60
-msgctxt "@action:button"
-msgid "Allow"
-msgstr "허용"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:61
-msgctxt "@action:tooltip"
-msgid "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."
-msgstr "Cura가 익명의 사용 통계를 보내 Cura에 대한 향후 개선을 우선화하는 데 도움을 줍니다. Cura 버전과 슬라이싱하는 모델의 해쉬 등 일부 환경설정 값이 발송됩니다."
-
#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "Cura 15.04 profiles"
msgstr "Cura 15.04 프로파일"
-#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
-msgctxt "@item:inmenu"
-msgid "Evaluation"
-msgstr "평가"
-
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "JPG Image"
@@ -719,56 +684,56 @@ msgctxt "@item:inlistbox"
msgid "GIF Image"
msgstr "GIF 이미지"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
msgctxt "@info:status"
msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration."
msgstr "선택한 소재 또는 구성과 호환되지 않기 때문에 현재 소재로 슬라이스 할 수 없습니다."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:389
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:398
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:407
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:416
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:362
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:386
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:395
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:404
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:413
msgctxt "@info:title"
msgid "Unable to slice"
msgstr "슬라이스 할 수 없습니다"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:364
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:361
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to slice with the current settings. The following settings have errors: {0}"
msgstr "현재 설정으로 슬라이스 할 수 없습니다. 다음 설정에는 오류가 있습니다 : {0}"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:388
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:385
#, 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 "일부 모델별 설정으로 인해 슬라이스할 수 없습니다. 하나 이상의 모델에서 다음 설정에 오류가 있습니다. {error_labels}"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:397
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:394
msgctxt "@info:status"
msgid "Unable to slice because the prime tower or prime position(s) are invalid."
msgstr "프라임 타워 또는 위치가 유효하지 않아 슬라이스 할 수 없습니다."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:406
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:403
#, python-format
msgctxt "@info:status"
msgid "Unable to slice because there are objects associated with disabled Extruder %s."
msgstr "비활성화된 익스트루더 %s(와)과 연결된 개체가 있기 때문에 슬라이스할 수 없습니다."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:412
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 "어떤 모델도 빌드 볼륨에 맞지 않으므로 슬라이스 할 수 없습니다. 크기에 맞게 모델을 위치시키거나 회전하거나, 또는 익스트루더를 활성화하십시오."
#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:50
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:status"
msgid "Processing Layers"
msgstr "레이어 처리 중"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:title"
msgid "Information"
msgstr "정보"
@@ -799,19 +764,19 @@ msgctxt "@item:inlistbox"
msgid "3MF File"
msgstr "3MF 파일"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:190
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:763
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:191
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:775
msgctxt "@label"
msgid "Nozzle"
msgstr "노즐"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:469
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:474
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead."
msgstr "프로젝트 파일 {0}에 알 수 없는 기기 유형 {1}이(가) 포함되어 있습니다. 기기를 가져올 수 없습니다. 대신 모델을 가져옵니다."
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:472
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:477
msgctxt "@info:title"
msgid "Open Project File"
msgstr "프로젝트 파일 열기"
@@ -826,18 +791,18 @@ msgctxt "@item:inlistbox"
msgid "G File"
msgstr "G 파일"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:324
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:328
msgctxt "@info:status"
msgid "Parsing G-code"
msgstr "G 코드 파싱"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:326
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:476
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:330
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:483
msgctxt "@info:title"
msgid "G-code Details"
msgstr "G-코드 세부 정보"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:474
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:481
msgctxt "@info:generic"
msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate."
msgstr "파일을 보내기 전에 g-코드가 프린터 및 프린터 구성에 적합한 지 확인하십시오. g-코드가 정확하지 않을 수 있습니다."
@@ -860,7 +825,7 @@ msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
msgstr "백업 열거 중 오류가 있었습니다."
-#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
+#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:132
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
msgstr "백업 복원 시도 중 오류가 있었습니다."
@@ -921,243 +886,261 @@ msgctxt "@item:inmenu"
msgid "Preview"
msgstr "미리 보기"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:19
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
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"
msgstr "레벨 빌드 플레이트"
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:81
-msgctxt "@tooltip"
-msgid "Outer Wall"
-msgstr "외벽"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:82
-msgctxt "@tooltip"
-msgid "Inner Walls"
-msgstr "내벽"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:83
-msgctxt "@tooltip"
-msgid "Skin"
-msgstr "스킨"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:84
-msgctxt "@tooltip"
-msgid "Infill"
-msgstr "내부채움"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:85
-msgctxt "@tooltip"
-msgid "Support Infill"
-msgstr "내부채움 서포트"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:86
-msgctxt "@tooltip"
-msgid "Support Interface"
-msgstr "지원하는 인터페이스"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:87
-msgctxt "@tooltip"
-msgid "Support"
-msgstr "서포트"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88
-msgctxt "@tooltip"
-msgid "Skirt"
-msgstr "스커트"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89
-msgctxt "@tooltip"
-msgid "Travel"
-msgstr "움직임 경로"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90
-msgctxt "@tooltip"
-msgid "Retractions"
-msgstr "리트랙션"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91
-msgctxt "@tooltip"
-msgid "Other"
-msgstr "다른"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:309
-#, python-brace-format
-msgctxt "@label"
-msgid "Pre-sliced file {0}"
-msgstr "미리 슬라이싱한 파일 {0}"
-
-#: /home/ruben/Projects/Cura/cura/API/Account.py:77
+#: /home/ruben/Projects/Cura/cura/API/Account.py:82
msgctxt "@info:title"
msgid "Login failed"
msgstr "로그인 실패"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:201
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121
+#: /home/ruben/Projects/Cura/cura/Settings/cura_empty_instance_containers.py:33
+msgctxt "@info:not supported profile"
+msgid "Not supported"
+msgstr "지원되지 않음"
+
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:203
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
msgctxt "@title:window"
msgid "File Already Exists"
msgstr "파일이 이미 있습니다"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:202
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:204
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:123
#, python-brace-format
msgctxt "@label Don't translate the XML tag !"
msgid "The file {0} already exists. Are you sure you want to overwrite it?"
msgstr "파일 {0}이 이미 있습니다. 덮어 쓰시겠습니까?"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:425
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:427
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:430
msgctxt "@info:status"
msgid "Invalid file URL:"
msgstr "유효하지 않은 파일 URL:"
-#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
-msgctxt "@menuitem"
-msgid "Not overridden"
-msgstr "재정의되지 않음"
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:925
+msgctxt "@info:message Followed by a list of settings."
+msgid "Settings have been changed to match the current availability of extruders:"
+msgstr "익스트루더의 현재 가용성과 일치하도록 설정이 변경되었습니다:"
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:915
-#, python-format
-msgctxt "@info:generic"
-msgid "Settings have been changed to match the current availability of extruders: [%s]"
-msgstr "현재 사용가능한 익스트루더: [% s]에 맞도록 설정이 변경되었습니다"
-
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:917
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:927
msgctxt "@info:title"
msgid "Settings updated"
msgstr "설정이 업데이트되었습니다"
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1481
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
msgstr "익스트루더 비활성화됨"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:132
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to export profile to {0}: {1}"
msgstr "프로파일을 {0}: {1}로 내보내는데 실패했습니다"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:138
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:139
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Failed to export profile to {0}: Writer plugin reported failure."
msgstr "프로파일을 {0}로 내보내지 못했습니다. Writer 플러그인이 오류를 보고했습니다."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Exported profile to {0}"
msgstr "프로파일을 {0} 에 내보냅니다"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145
msgctxt "@info:title"
msgid "Export succeeded"
msgstr "내보내기 완료"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:170
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:172
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
msgstr "{0}에서 프로파일을 가져오지 못했습니다 {1}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:176
#, 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 "프린터가 추가되기 전 {0}에서 프로파일을 가져올 수 없습니다."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:192
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "No custom profile to import in file {0}"
msgstr "{0}(으)로 가져올 사용자 정의 프로파일이 없습니다"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:194
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:196
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}:"
msgstr "{0}에서 프로파일을 가져오지 못했습니다:"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:218
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:228
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:220
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "This profile {0} contains incorrect data, could not import it."
msgstr "프로파일 {0}에는 정확하지 않은 데이터가 포함되어 있으므로, 불러올 수 없습니다."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:241
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:243
#, 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 "프로필 {0}({1})에 정의된 제품이 현재 제품({2})과 일치하지 않으므로, 불러올 수 없습니다."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:315
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to import profile from {0}:"
msgstr "{0}에서 프로파일을 가져오지 못했습니다:"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:316
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Successfully imported profile {0}"
msgstr "프로파일 {0}을 성공적으로 가져 왔습니다."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:319
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:321
#, python-brace-format
msgctxt "@info:status"
msgid "File {0} does not contain any valid profile."
msgstr "파일 {0}에 유효한 프로파일이 포함되어 있지 않습니다."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:322
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:324
#, python-brace-format
msgctxt "@info:status"
msgid "Profile {0} has an unknown file type or is corrupted."
msgstr "프로파일 {0}에 알 수 없는 파일 유형이 있거나 손상되었습니다."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:340
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:359
msgctxt "@label"
msgid "Custom profile"
msgstr "사용자 정의 프로파일"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:356
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:375
msgctxt "@info:status"
msgid "Profile is missing a quality type."
msgstr "프로파일에 품질 타입이 누락되었습니다."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:370
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:389
#, python-brace-format
msgctxt "@info:status"
msgid "Could not find a quality type {0} for the current configuration."
msgstr "현재 구성에 대해 품질 타입 {0}을 찾을 수 없습니다."
-#: /home/ruben/Projects/Cura/cura/ObjectsModel.py:69
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:76
+msgctxt "@tooltip"
+msgid "Outer Wall"
+msgstr "외벽"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:77
+msgctxt "@tooltip"
+msgid "Inner Walls"
+msgstr "내벽"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:78
+msgctxt "@tooltip"
+msgid "Skin"
+msgstr "스킨"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:79
+msgctxt "@tooltip"
+msgid "Infill"
+msgstr "내부채움"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:80
+msgctxt "@tooltip"
+msgid "Support Infill"
+msgstr "내부채움 서포트"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:81
+msgctxt "@tooltip"
+msgid "Support Interface"
+msgstr "지원하는 인터페이스"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:82
+msgctxt "@tooltip"
+msgid "Support"
+msgstr "서포트"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:83
+msgctxt "@tooltip"
+msgid "Skirt"
+msgstr "스커트"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:84
+msgctxt "@tooltip"
+msgid "Prime Tower"
+msgstr "프라임 타워"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:85
+msgctxt "@tooltip"
+msgid "Travel"
+msgstr "움직임 경로"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:86
+msgctxt "@tooltip"
+msgid "Retractions"
+msgstr "리트랙션"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:87
+msgctxt "@tooltip"
+msgid "Other"
+msgstr "다른"
+
+#: /home/ruben/Projects/Cura/cura/UI/PrintInformation.py:306
+#, python-brace-format
+msgctxt "@label"
+msgid "Pre-sliced file {0}"
+msgstr "미리 슬라이싱한 파일 {0}"
+
+#: /home/ruben/Projects/Cura/cura/UI/WelcomePagesModel.py:56
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:62
+msgctxt "@action:button"
+msgid "Next"
+msgstr "다음"
+
+#: /home/ruben/Projects/Cura/cura/UI/ObjectsModel.py:61
#, python-brace-format
msgctxt "@label"
msgid "Group #{group_nr}"
msgstr "그룹 #{group_nr}"
-#: /home/ruben/Projects/Cura/cura/Machines/Models/MachineManagementModel.py:65
-msgctxt "@info:title"
-msgid "Network enabled printers"
-msgstr "네트워크 프린터"
+#: /home/ruben/Projects/Cura/cura/UI/WhatsNewPagesModel.py:17
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:185
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:85
+#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:482
+#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:508
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:124
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:168
+msgctxt "@action:button"
+msgid "Close"
+msgstr "닫기"
-#: /home/ruben/Projects/Cura/cura/Machines/Models/MachineManagementModel.py:80
-msgctxt "@info:title"
-msgid "Local printers"
-msgstr "로컬 프린터"
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:17
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:91
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:48
+msgctxt "@action:button"
+msgid "Add"
+msgstr "추가"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/ExtrudersModel.py:208
+msgctxt "@menuitem"
+msgid "Not overridden"
+msgstr "재정의되지 않음"
#: /home/ruben/Projects/Cura/cura/Machines/Models/QualityManagementModel.py:109
#, python-brace-format
@@ -1170,23 +1153,41 @@ msgctxt "@item:inlistbox"
msgid "All Files (*)"
msgstr "모든 파일 (*)"
-#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:665
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:86
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:182
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:269
+msgctxt "@label"
+msgid "Unknown"
+msgstr "알 수 없는"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:116
+msgctxt "@label"
+msgid "The printer(s) below cannot be connected because they are part of a group"
+msgstr "아래 프린터는 그룹에 속해 있기 때문에 연결할 수 없습니다"
+
+#: /home/ruben/Projects/Cura/cura/Machines/Models/DiscoveredPrintersModel.py:118
+msgctxt "@label"
+msgid "Available networked printers"
+msgstr "사용 가능한 네트워크 프린터"
+
+#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:689
msgctxt "@label"
msgid "Custom Material"
msgstr "사용자 정의 소재"
-#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:666
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:256
+#: /home/ruben/Projects/Cura/cura/Machines/MaterialManager.py:690
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:203
msgctxt "@label"
msgid "Custom"
msgstr "사용자 정의"
-#: /home/ruben/Projects/Cura/cura/BuildVolume.py:81
+#: /home/ruben/Projects/Cura/cura/BuildVolume.py:89
msgctxt "@info:status"
msgid "The build volume height has been reduced due to the value of the \"Print Sequence\" setting to prevent the gantry from colliding with printed models."
msgstr "\"프린팅 순서\"설정 값으로 인해 갠트리가 프린팅 된 모델과 충돌하지 않도록 출력물 높이가 줄어 들었습니다."
-#: /home/ruben/Projects/Cura/cura/BuildVolume.py:83
+#: /home/ruben/Projects/Cura/cura/BuildVolume.py:91
msgctxt "@info:title"
msgid "Build Volume"
msgstr "출력물 크기"
@@ -1201,16 +1202,31 @@ msgctxt "@info:backup_failed"
msgid "Tried to restore a Cura backup without having proper data or meta data."
msgstr "적절한 데이터 또는 메타 데이터 없이 Cura 백업을 복원하려고 시도했습니다."
-#: /home/ruben/Projects/Cura/cura/Backups/Backup.py:124
+#: /home/ruben/Projects/Cura/cura/Backups/Backup.py:125
msgctxt "@info:backup_failed"
-msgid "Tried to restore a Cura backup that does not match your current version."
-msgstr "현재 버전과 일치하지 않는 Cura 백업을 복원하려고 시도했습니다."
+msgid "Tried to restore a Cura backup that is higher than the current version."
+msgstr "현재 버전보다 높은 Cura 백업을 복원하려고 시도했습니다."
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationHelpers.py:79
+msgctxt "@message"
+msgid "Could not read response."
+msgstr "응답을 읽을 수 없습니다."
+
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
msgctxt "@info"
msgid "Unable to reach the Ultimaker account server."
msgstr "Ultimaker 계정 서버에 도달할 수 없음."
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationRequestHandler.py:66
+msgctxt "@message"
+msgid "Please give the required permissions when authorizing this application."
+msgstr "이 응용 프로그램을 인증할 때 필요한 권한을 제공하십시오."
+
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationRequestHandler.py:73
+msgctxt "@message"
+msgid "Something unexpected happened when trying to log in, please try again."
+msgstr "로그인을 시도할 때 예기치 못한 문제가 발생했습니다. 다시 시도하십시오."
+
#: /home/ruben/Projects/Cura/cura/MultiplyObjectsJob.py:27
msgctxt "@info:status"
msgid "Multiplying and placing objects"
@@ -1223,7 +1239,7 @@ msgstr "개체 배치 중"
#: /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
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:149
msgctxt "@info:status"
msgid "Unable to find a location within the build volume for all objects"
msgstr "모든 개체가 출력할 수 있는 최대 사이즈 내에 위치할 수 없습니다"
@@ -1234,19 +1250,19 @@ msgid "Placing Object"
msgstr "개체 배치 중"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:30
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:67
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:66
msgctxt "@info:status"
msgid "Finding new location for objects"
msgstr "객체의 새 위치 찾기"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:34
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:71
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:70
msgctxt "@info:title"
msgid "Finding Location"
msgstr "위치 찾기"
#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsJob.py:104
-#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:151
+#: /home/ruben/Projects/Cura/cura/Arranging/ArrangeObjectsAllBuildPlatesJob.py:150
msgctxt "@info:title"
msgid "Can't Find Location"
msgstr "위치를 찾을 수 없음"
@@ -1377,242 +1393,195 @@ msgstr "로그"
#: /home/ruben/Projects/Cura/cura/CrashHandler.py:322
msgctxt "@title:groupbox"
-msgid "User description"
-msgstr "사용자 설명"
+msgid "User description (Note: Developers may not speak your language, please use English if possible)"
+msgstr "사용자 설명(참고: 개발자가 다른 언어 사용자일 수 있으므로 가능하면 영어를 사용하십시오.)"
-#: /home/ruben/Projects/Cura/cura/CrashHandler.py:341
+#: /home/ruben/Projects/Cura/cura/CrashHandler.py:342
msgctxt "@action:button"
msgid "Send report"
msgstr "보고서 전송"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:480
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:504
msgctxt "@info:progress"
msgid "Loading machines..."
msgstr "기기로드 중 ..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:781
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:819
msgctxt "@info:progress"
msgid "Setting up scene..."
msgstr "장면 설정 중..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:817
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:854
msgctxt "@info:progress"
msgid "Loading interface..."
msgstr "인터페이스 로드 중 ..."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1059
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1133
#, python-format
msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be translated; just translate the format of ##x##x## mm."
msgid "%(width).1f x %(depth).1f x %(height).1f mm"
msgstr "%(width).1f x %(depth).1f x %(height).1f mm"
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1618
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1611
#, python-brace-format
msgctxt "@info:status"
msgid "Only one G-code file can be loaded at a time. Skipped importing {0}"
msgstr "한 번에 하나의 G-코드 파일만 로드 할 수 있습니다. {0} 가져 오기를 건너 뛰었습니다."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1628
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1621
#, python-brace-format
msgctxt "@info:status"
msgid "Can't open any other file if G-code is loading. Skipped importing {0}"
msgstr "G-코드가 로드되어 있으면 다른 파일을 열 수 없습니다. {0} 가져 오기를 건너 뛰었습니다."
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1718
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1711
msgctxt "@info:status"
msgid "The selected model was too small to load."
msgstr "선택한 모델이 너무 작아서 로드할 수 없습니다."
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:62
-msgctxt "@title"
-msgid "Machine Settings"
-msgstr "기기 설정"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:81
-msgctxt "@title:tab"
-msgid "Printer"
-msgstr "프린터"
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:100
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:58
+msgctxt "@title:label"
msgid "Printer Settings"
msgstr "프린터 설정"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:111
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:72
msgctxt "@label"
msgid "X (Width)"
msgstr "X (너비)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:112
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:122
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:132
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:238
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:387
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:403
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:429
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:441
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:897
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:76
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:90
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:104
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:194
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:213
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:232
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:253
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:272
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:79
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:93
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:109
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:124
msgctxt "@label"
msgid "mm"
msgstr "mm"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:121
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:86
msgctxt "@label"
msgid "Y (Depth)"
msgstr "Y (깊이)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:131
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:100
msgctxt "@label"
msgid "Z (Height)"
msgstr "Z (높이)"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:143
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:114
msgctxt "@label"
msgid "Build plate shape"
msgstr "빌드 플레이트 모양"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:152
-msgctxt "@option:check"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:127
+msgctxt "@label"
msgid "Origin at center"
msgstr "중앙이 원점"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:160
-msgctxt "@option:check"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:139
+msgctxt "@label"
msgid "Heated bed"
msgstr "히트 베드"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:171
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:151
msgctxt "@label"
msgid "G-code flavor"
msgstr "Gcode 유형"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:184
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:176
+msgctxt "@title:label"
msgid "Printhead Settings"
msgstr "프린트헤드 설정"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:194
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:190
msgctxt "@label"
msgid "X min"
msgstr "X 최소값"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:195
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "프린트 헤드 왼쪽에서 노즐 중심까지의 거리. \"한 번에 하나\"를 프린팅 할 때 이전 프린팅물과 프린팅 헤드 사이의 충돌을 방지하는 데 사용됩니다."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:204
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:209
msgctxt "@label"
msgid "Y min"
msgstr "Y 최소값"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:205
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "프린트 헤드 전면에서 노즐 중앙까지의 거리. \"한 번에 하나\"를 프린팅 할 때 이전 프린팅물과 프린팅 헤드 사이의 충돌을 방지하는 데 사용됩니다."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:214
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:228
msgctxt "@label"
msgid "X max"
msgstr "X 최대값"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:215
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "프린트 헤드의 오른쪽에서 노즐 중앙까지의 거리. \"한 번에 하나\"를 프린팅 할 때 이전 프린팅물과 프린팅 헤드 사이의 충돌을 방지하는 데 사용됩니다."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:224
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:249
msgctxt "@label"
msgid "Y max"
msgstr "Y 최대값"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:225
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "프린트 헤드의 뒤쪽에서 노즐 중심까지의 거리. \"한 번에 하나\"를 프린팅 할 때 이전 프린팅물과 프린팅 헤드 사이의 충돌을 방지하는 데 사용됩니다."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:237
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:268
msgctxt "@label"
-msgid "Gantry height"
+msgid "Gantry Height"
msgstr "갠트리 높이"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:239
-msgctxt "@tooltip"
-msgid "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\"."
-msgstr "노즐 끝과 갠트리 시스템 사이의 높이 차이 (X 및 Y 축). \"한 번에 하나\"를 프린팅 할 때 이전 프린팅물과 갠트리 사이의 충돌을 방지하는 데 사용됩니다."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:258
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:282
msgctxt "@label"
msgid "Number of Extruders"
msgstr "익스트루더의 수"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:314
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:341
+msgctxt "@title:label"
msgid "Start G-code"
-msgstr "시작 Gcode"
+msgstr "시작 GCode"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:324
-msgctxt "@tooltip"
-msgid "G-code commands to be executed at the very start."
-msgstr "시작시 Gcode 명령이 실행됩니다."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:333
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml:355
+msgctxt "@title:label"
msgid "End G-code"
-msgstr "종료 Gcode"
+msgstr "End GCode"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:343
-msgctxt "@tooltip"
-msgid "G-code commands to be executed at the very end."
-msgstr "Gcode 명령어가 맨 마지막에 실행됩니다."
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:42
+msgctxt "@title:tab"
+msgid "Printer"
+msgstr "프린터"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:374
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:63
+msgctxt "@title:label"
msgid "Nozzle Settings"
msgstr "노즐 설정"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:386
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:75
msgctxt "@label"
msgid "Nozzle size"
msgstr "노즐 크기"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:402
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:89
msgctxt "@label"
msgid "Compatible material diameter"
msgstr "호환되는 재료의 직경"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:404
-msgctxt "@tooltip"
-msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile."
-msgstr "프린터가 지원하는 필라멘트의 직경. 정확한 직경은 소재 및 / 또는 프로파일에 의해 덮어써집니다."
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:428
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:105
msgctxt "@label"
msgid "Nozzle offset X"
msgstr "노즐 오프셋 X"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:440
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:120
msgctxt "@label"
msgid "Nozzle offset Y"
msgstr "노즐 오프셋 Y"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:452
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:135
msgctxt "@label"
msgid "Cooling Fan Number"
msgstr "냉각 팬 번호"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:453
-msgctxt "@label"
-msgid ""
-msgstr ""
-
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:473
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:162
+msgctxt "@title:label"
msgid "Extruder Start G-code"
msgstr "익스트루더 시작 Gcode"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.qml:491
-msgctxt "@label"
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml:176
+msgctxt "@title:label"
msgid "Extruder End G-code"
msgstr "익스트루더 종료 Gcode"
@@ -1622,7 +1591,7 @@ msgid "Install"
msgstr "설치"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:20
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:44
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:46
msgctxt "@action:button"
msgid "Installed"
msgstr "설치됨"
@@ -1638,15 +1607,15 @@ msgid "ratings"
msgstr "평가"
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:38
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:28
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:30
msgctxt "@title:tab"
msgid "Plugins"
msgstr "플러그인"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:69
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:42
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:66
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:361
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledPage.qml:70
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:44
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:80
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:417
msgctxt "@title:tab"
msgid "Materials"
msgstr "재료"
@@ -1656,52 +1625,49 @@ msgctxt "@label"
msgid "Your rating"
msgstr "귀하의 평가"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:98
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:99
msgctxt "@label"
msgid "Version"
msgstr "버전"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:105
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:106
msgctxt "@label"
msgid "Last updated"
msgstr "마지막으로 업데이트한 날짜"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:112
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:260
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:113
msgctxt "@label"
msgid "Author"
msgstr "원작자"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:119
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:120
msgctxt "@label"
msgid "Downloads"
msgstr "다운로드"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:181
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailPage.qml:222
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:265
-msgctxt "@label"
-msgid "Unknown"
-msgstr "알 수 없는"
-
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:54
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:56
msgctxt "@label:The string between and is the highlighted link"
msgid "Log in is required to install or update"
msgstr "설치 또는 업데이트에 로그인 필요"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:73
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:80
+msgctxt "@label:The string between and is the highlighted link"
+msgid "Buy material spools"
+msgstr "재료 스플 구입"
+
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:96
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:34
msgctxt "@action:button"
msgid "Update"
msgstr "업데이트"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:74
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:97
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:35
msgctxt "@action:button"
msgid "Updating"
msgstr "업데이트 중"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:75
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxDetailTileActions.qml:98
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml:36
msgctxt "@action:button"
msgid "Updated"
@@ -1777,7 +1743,7 @@ msgctxt "@label"
msgid "Generic Materials"
msgstr "일반 재료"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:56
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxHeader.qml:59
msgctxt "@title:tab"
msgid "Installed"
msgstr "설치됨"
@@ -1863,12 +1829,12 @@ msgctxt "@info"
msgid "Fetching packages..."
msgstr "패키지 가져오는 중..."
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:90
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:91
msgctxt "@label"
msgid "Website"
msgstr "웹 사이트"
-#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:97
+#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxAuthorPage.qml:98
msgctxt "@label"
msgid "Email"
msgstr "이메일"
@@ -1878,22 +1844,6 @@ msgctxt "@info:tooltip"
msgid "Some things could be problematic in this print. Click to see tips for adjustment."
msgstr "이 출력물에는 문제가있을 수 있습니다. 조정을 위한 도움말을 보려면 클릭하십시오."
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:18
-msgctxt "@label"
-msgid "Changelog"
-msgstr "변경 내역"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.qml:37
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:185
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:85
-#: /home/ruben/Projects/Cura/plugins/PostProcessingPlugin/PostProcessingPlugin.qml:482
-#: /home/ruben/Projects/Cura/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml:508
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:123
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:168
-msgctxt "@action:button"
-msgid "Close"
-msgstr "닫기"
-
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.qml:31
msgctxt "@title"
msgid "Update Firmware"
@@ -1969,38 +1919,40 @@ msgctxt "@label"
msgid "Firmware update failed due to missing firmware."
msgstr "펌웨어 누락으로 인해 펌웨어 업데이트에 실패했습니다."
-#: /home/ruben/Projects/Cura/plugins/UserAgreement/UserAgreement.qml:16
-msgctxt "@title:window"
-msgid "User Agreement"
-msgstr "사용자 계약"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:144
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:181
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:153
+msgctxt "@label"
+msgid "Glass"
+msgstr "유리"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:208
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:254
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:249
msgctxt "@info"
-msgid "These options are not available because you are monitoring a cloud printer."
-msgstr "Cloud 프린터를 모니터링하고 있기 때문에 이 옵션을 사용할 수 없습니다."
+msgid "Please update your printer's firmware to manage the queue remotely."
+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 "Cloud 프린터를 모니터링하고 있기 때문에 웹캠을 사용할 수 없습니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:301
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:300
msgctxt "@label:status"
msgid "Loading..."
msgstr "로딩 중..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:305
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:304
msgctxt "@label:status"
msgid "Unavailable"
msgstr "사용불가"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:309
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:308
msgctxt "@label:status"
msgid "Unreachable"
msgstr "연결할 수 없음"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:313
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:312
msgctxt "@label:status"
msgid "Idle"
msgstr "대기 상태"
@@ -2010,37 +1962,31 @@ msgctxt "@label"
msgid "Untitled"
msgstr "제목 없음"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:373
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:374
msgctxt "@label"
msgid "Anonymous"
msgstr "익명"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:399
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:401
msgctxt "@label:status"
msgid "Requires configuration changes"
msgstr "구성 변경 필요"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:436
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrinterCard.qml:439
msgctxt "@action:button"
msgid "Details"
msgstr "세부 사항"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:130
msgctxt "@label"
msgid "Unavailable printer"
msgstr "사용할 수 없는 프린터"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:134
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobCard.qml:132
msgctxt "@label"
msgid "First available"
msgstr "첫 번째로 사용 가능"
-#: /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 "유리"
-
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:31
msgctxt "@label"
msgid "Queued"
@@ -2048,181 +1994,189 @@ msgstr "대기 중"
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:67
msgctxt "@label link to connect manager"
-msgid "Go to Cura Connect"
-msgstr "Cura Connect로 이동"
+msgid "Manage in browser"
+msgstr "브라우저에서 관리"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:102
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:100
+msgctxt "@label"
+msgid "There are no print jobs in the queue. Slice and send a job to add one."
+msgstr "대기열에 프린팅 작업이 없습니다. 작업을 추가하려면 슬라이스하여 전송하십시오."
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
msgctxt "@label"
msgid "Print jobs"
msgstr "인쇄 작업"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:132
msgctxt "@label"
msgid "Total print time"
msgstr "총 인쇄 시간"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:130
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:148
msgctxt "@label"
msgid "Waiting for"
msgstr "대기"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorQueue.qml:246
-msgctxt "@label link to connect manager"
-msgid "View print history"
-msgstr "인쇄 내역 보기"
-
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:46
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:50
msgctxt "@window:title"
msgid "Existing Connection"
msgstr "기존 연결"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:48
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:52
msgctxt "@message:text"
msgid "This printer/group is already added to Cura. Please select another printer/group."
msgstr "이 프린터/그룹은 이미 Cura에 추가되었습니다. 다른 프린터/그룹을 선택하십시오."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:65
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:69
msgctxt "@title:window"
msgid "Connect to Networked Printer"
msgstr "네트워크 프린터에 연결"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:77
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:81
msgctxt "@label"
-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 ""
-"네트워크를 통해 프린터로 직접 프린팅하려면 네트워크 케이블을 사용하거나 프린터를 WIFI 네트워크에 연결하여 프린터가 네트워크에 연결되어 있는지 확인하십시오. Cura를 프린터에 연결하지 않은 경우에도 USB 드라이브를 사용하여 g 코드 파일을 프린터로 전송할 수 있습니다\n"
-"\n"
-"아래 목록에서 프린터를 선택하십시오:"
+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."
+msgstr "네트워크를 통해 프린터로 직접 프린팅하려면 네트워크 케이블을 사용하거나 프린터를 WIFI 네트워크에 연결하여 프린터가 네트워크에 연결되어 있는지 확인하십시오. Cura를 프린터에 연결하지 않은 경우에도 USB 드라이브를 사용하여 g-코드 파일을 프린터로 전송할 수 있습니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:44
-msgctxt "@action:button"
-msgid "Add"
-msgstr "추가"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:81
+msgctxt "@label"
+msgid "Select your printer from the list below:"
+msgstr "아래 목록에서 프린터를 선택하십시오:"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:97
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:101
msgctxt "@action:button"
msgid "Edit"
msgstr "편집"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:108
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:128
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:50
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:117
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:112
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:146
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:55
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:121
msgctxt "@action:button"
msgid "Remove"
msgstr "제거"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:120
msgctxt "@action:button"
msgid "Refresh"
msgstr "새로고침"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:211
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:215
msgctxt "@label"
msgid "If your printer is not listed, read the network printing troubleshooting guide"
msgstr "프린터가 목록에 없으면 네트워크 프린팅 문제 해결 가이드를 읽어보십시오"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:240
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:244
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:258
msgctxt "@label"
msgid "Type"
msgstr "유형"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:279
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:283
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:274
msgctxt "@label"
msgid "Firmware version"
msgstr "펌웨어 버전"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:293
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:297
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:290
msgctxt "@label"
msgid "Address"
msgstr "주소"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:317
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
msgctxt "@label"
msgid "This printer is not set up to host a group of printers."
msgstr "이 프린터는 프린터 그룹을 호스트하도록 설정되어 있지 않습니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:321
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:325
msgctxt "@label"
msgid "This printer is the host for a group of %1 printers."
msgstr "이 프린터는 %1개 프린터 그룹의 호스트입니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:332
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:336
msgctxt "@label"
msgid "The printer at this address has not yet responded."
msgstr "이 주소의 프린터가 아직 응답하지 않았습니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:337
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:341
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:74
msgctxt "@action:button"
msgid "Connect"
msgstr "연결"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:351
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:354
+msgctxt "@title:window"
+msgid "Invalid IP address"
+msgstr "잘못된 IP 주소"
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:355
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:146
+msgctxt "@text"
+msgid "Please enter a valid IP address."
+msgstr "유효한 IP 주소를 입력하십시오."
+
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:366
msgctxt "@title:window"
msgid "Printer Address"
msgstr "프린터 주소"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:374
-msgctxt "@alabel"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:389
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:102
+msgctxt "@label"
msgid "Enter the IP address or hostname of your printer on the network."
msgstr "네트워크에 프린터의 IP 주소 또는 호스트 이름을 입력하십시오."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:404
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:132
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:419
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:138
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:181
msgctxt "@action:button"
msgid "OK"
msgstr "확인"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:88
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:100
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:78
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:90
msgctxt "@label:status"
msgid "Aborted"
msgstr "중단됨"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:90
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:92
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:80
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:82
msgctxt "@label:status"
msgid "Finished"
msgstr "끝마친"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:94
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:84
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:86
msgctxt "@label:status"
msgid "Preparing..."
msgstr "준비 중..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:88
msgctxt "@label:status"
msgid "Aborting..."
msgstr "중지 중…"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:102
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:92
msgctxt "@label:status"
msgid "Pausing..."
msgstr "일시 정지 중…"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:104
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:94
msgctxt "@label:status"
msgid "Paused"
msgstr "일시 중지됨"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:106
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:96
msgctxt "@label:status"
msgid "Resuming..."
msgstr "다시 시작..."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:98
msgctxt "@label:status"
msgid "Action required"
msgstr "조치가 필요함"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorPrintJobProgressBar.qml:100
msgctxt "@label:status"
msgid "Finishes %1 at %2"
msgstr "%2에서 %1 완료"
@@ -2326,43 +2280,43 @@ msgctxt "@action:button"
msgid "Override"
msgstr "무시하기"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:64
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:85
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] "할당된 프린터 %1의 구성을 다음과 같이 변경해야 합니다."
+msgstr[0] "할당된 프린터 %1의 구성을 다음과 같이 변경해야 합니다:"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:68
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:89
msgctxt "@label"
msgid "The printer %1 is assigned, but the job contains an unknown material configuration."
msgstr "프린터 %1이(가) 할당되었으나 작업에 알 수 없는 재료 구성이 포함되어 있습니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:78
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:99
msgctxt "@label"
msgid "Change material %1 from %2 to %3."
msgstr "재료 %1을(를) %2에서 %3(으)로 변경합니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:81
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:102
msgctxt "@label"
msgid "Load %3 as material %1 (This cannot be overridden)."
msgstr "%3을(를) 재료 %1(으)로 로드합니다(이 작업은 무효화할 수 없음)."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:84
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:105
msgctxt "@label"
msgid "Change print core %1 from %2 to %3."
msgstr "PrintCore %1을(를) %2에서 %3(으)로 변경합니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:87
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:108
msgctxt "@label"
msgid "Change build plate to %1 (This cannot be overridden)."
msgstr "빌드 플레이트를 %1(으)로 변경합니다(이 작업은 무효화할 수 없음)."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:94
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:115
msgctxt "@label"
msgid "Override will use the specified settings with the existing printer configuration. This may result in a failed print."
msgstr "무시하기는 기존 프린터 구성과 함께 지정된 설정을 사용하게 됩니다. 이는 인쇄 실패로 이어질 수 있습니다."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:135
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:156
msgctxt "@label"
msgid "Aluminum"
msgstr "알루미늄"
@@ -2372,110 +2326,110 @@ msgctxt "@info:tooltip"
msgid "Connect to a printer"
msgstr "프린터에 연결"
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:92
+#: /home/ruben/Projects/Cura/plugins/SettingsGuide/resources/qml/SettingsGuide.qml:16
+msgctxt "@title"
+msgid "Cura Settings Guide"
+msgstr "Cura 설정 가이드"
+
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:100
msgctxt "@info"
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."
+"- Check if the printer is connected to the network.\n"
+"- Check if you are signed in to discover cloud-connected printers."
msgstr ""
-"프린터에 연결이 있는지 확인하십시오.\n"
-"- 프린터가 켜져 있는지 확인하십시오.\n"
-"- 프린터가 네트워크에 연결되어 있는지 확인하십시오."
+"프린터에 연결이 있는지 확인하십시오.⏎- 프린터가 켜져 있는지 확인하십시오.\n"
+"- 프린터가 네트워크에 연결되어 있는지 확인하십시오.⏎- 클라우드로 연결된 프린터를 탐색할 수 있도록 로그인되어 있는지 확인하십시오."
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:110
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:117
msgctxt "@info"
-msgid "Please select a network connected printer to monitor."
-msgstr "네트워크 연결 프린터를 선택하여 모니터링하십시오."
+msgid "Please connect your printer to the network."
+msgstr "프린터를 네트워크에 연결하십시오."
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:126
-msgctxt "@info"
-msgid "Please connect your Ultimaker printer to your local network."
-msgstr "Ultimaker 프린터를 로컬 네트워크에 연결하십시오."
-
-#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:165
+#: /home/ruben/Projects/Cura/plugins/MonitorStage/MonitorMain.qml:156
msgctxt "@label link to technical assistance"
msgid "View user manuals online"
msgstr "사용자 매뉴얼 온라인 보기"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:18
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:47
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:20
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:49
msgctxt "@label"
msgid "Color scheme"
msgstr "색 구성표"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:105
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:107
msgctxt "@label:listbox"
msgid "Material Color"
msgstr "재료 색상"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:109
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:111
msgctxt "@label:listbox"
msgid "Line Type"
msgstr "라인 유형"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:113
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:115
msgctxt "@label:listbox"
msgid "Feedrate"
msgstr "이송 속도"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:117
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:119
msgctxt "@label:listbox"
msgid "Layer thickness"
msgstr "레이어 두께"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:154
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:156
msgctxt "@label"
msgid "Compatibility Mode"
msgstr "호환 모드"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:229
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:230
msgctxt "@label"
msgid "Travels"
msgstr "이동"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:235
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:236
msgctxt "@label"
msgid "Helpers"
msgstr "도움말"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:241
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:242
msgctxt "@label"
msgid "Shell"
msgstr "외곽"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:247
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:248
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedInfillDensitySelector.qml:65
msgctxt "@label"
msgid "Infill"
msgstr "내부채움"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:297
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:298
msgctxt "@label"
msgid "Only Show Top Layers"
msgstr "상단 레이어 만 표시"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:307
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:308
msgctxt "@label"
msgid "Show 5 Detailed Layers On Top"
msgstr "상단에 5 개의 세부 레이어 표시"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:321
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:322
msgctxt "@label"
msgid "Top / Bottom"
msgstr "위 / 아래"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:325
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:326
msgctxt "@label"
msgid "Inner Wall"
msgstr "내벽"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:383
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:384
msgctxt "@label"
msgid "min"
msgstr "최소"
-#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:432
+#: /home/ruben/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:433
msgctxt "@label"
msgid "max"
msgstr "최대"
@@ -2505,30 +2459,25 @@ msgctxt "@info:tooltip"
msgid "Change active post-processing scripts"
msgstr "활성 사후 처리 스크립트 변경"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:16
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:17
msgctxt "@title:window"
msgid "More information on anonymous data collection"
msgstr "익명 데이터 수집에 대한 추가 정보"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:66
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:74
msgctxt "@text:window"
-msgid "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."
-msgstr "Cura는 인쇄 품질 및 사용자 환경을 개선하기 위해 익명 데이터를 Ultimaker로 전송합니다. 전송되는 모든 데이터에 대한 예는 다음과 같습니다."
+msgid "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:"
+msgstr "Ultimaker Cura는 인쇄 품질과 사용자 경험을 개선하기 위해 익명 데이터를 수집합니다. 공유되는 모든 데이터의 예는 다음과 같습니다:"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:101
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:109
msgctxt "@text:window"
-msgid "I don't want to send this data"
-msgstr "이 데이터 전송을 원하지 않습니다"
+msgid "I don't want to send anonymous data"
+msgstr "익명 데이터 전송을 원하지 않습니다"
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:111
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:118
msgctxt "@text:window"
-msgid "Allow sending this data to Ultimaker and help us improve Cura"
-msgstr "이 데이터를 Ultimaker에 전송해 Cura 개선에 도움을 주고 싶습니다"
-
-#: /home/ruben/Projects/Cura/plugins/R2D2/EvaluationSidebar.qml:49
-msgctxt "@label"
-msgid "No print selected"
-msgstr "선택한 인쇄 없음"
+msgid "Allow sending anonymous data"
+msgstr "익명 데이터 전송 허용"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:19
msgctxt "@title:window"
@@ -2577,19 +2526,19 @@ msgstr "깊이 (mm)"
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:126
msgctxt "@info:tooltip"
-msgid "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."
-msgstr "기본적으로 흰색 픽셀은 메쉬에서 높은 점을 나타내고 검정색 픽셀은 메쉬에서 낮은 점을 나타냅니다. 이 옵션을 변경하면 검은 픽셀이 메쉬의 높은 점을 나타내고 흰색 픽셀은 메쉬의 낮은 점을 나타냅니다."
-
-#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
-msgctxt "@item:inlistbox"
-msgid "Lighter is higher"
-msgstr "밝을수록 높음"
+msgid "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."
+msgstr "리쏘페인(투각)의 경우 들어오는 더 많은 빛을 차단하기 위해서는 다크 픽셀이 더 두꺼운 위치에 해당해야 합니다. 높이 지도의 경우 더 밝은 픽셀이 더 높은 지역을 나타냅니다. 따라서 생성된 3D 모델에서 더 밝은 픽셀이 더 두꺼운 위치에 해당해야 합니다."
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
msgctxt "@item:inlistbox"
msgid "Darker is higher"
msgstr "어두울수록 높음"
+#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:139
+msgctxt "@item:inlistbox"
+msgid "Lighter is higher"
+msgstr "밝을수록 높음"
+
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:149
msgctxt "@info:tooltip"
msgid "The amount of smoothing to apply to the image."
@@ -2703,7 +2652,7 @@ msgid "Printer Group"
msgstr "프린터 그룹"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:180
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:197
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:226
msgctxt "@action:label"
msgid "Profile settings"
msgstr "프로파일 설정"
@@ -2716,19 +2665,19 @@ msgstr "프로파일의 충돌을 어떻게 해결해야합니까?"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:216
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:308
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:121
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:221
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:250
msgctxt "@action:label"
msgid "Name"
msgstr "이름"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:231
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:205
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:234
msgctxt "@action:label"
msgid "Not in profile"
msgstr "프로파일에 없음"
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:236
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:210
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:239
msgctxt "@action:label"
msgid "%1 override"
msgid_plural "%1 overrides"
@@ -2807,6 +2756,7 @@ msgstr "Cura 설정을 백업, 동기화하십시오."
#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/qml/pages/WelcomePage.qml:51
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:68
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:138
msgctxt "@button"
msgid "Sign in"
msgstr "로그인"
@@ -2897,22 +2847,23 @@ msgid "Previous"
msgstr "이전"
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:60
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:154
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:152
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:174
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:159
msgctxt "@action:button"
msgid "Export"
msgstr "내보내기"
-#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorTabControls.qml:62
-msgctxt "@action:button"
-msgid "Next"
-msgstr "다음"
-
-#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:169
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPageCategoryView.qml:209
msgctxt "@label"
msgid "Tip"
msgstr "팁"
+#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorMaterialMenu.qml:20
+#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:66
+msgctxt "@label:category menu label"
+msgid "Generic"
+msgstr "일반"
+
#: /home/ruben/Projects/Cura/plugins/CuraPrintProfileCreator/components/ProfileCreatorPage.qml:160
msgctxt "@label"
msgid "Print experiment"
@@ -2923,150 +2874,51 @@ msgctxt "@label"
msgid "Checklist"
msgstr "체크리스트"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:26
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:25
-msgctxt "@title"
-msgid "Select Printer Upgrades"
-msgstr "프린터 업그레이드 선택"
-
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:38
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:30
msgctxt "@label"
msgid "Please select any upgrades made to this Ultimaker 2."
msgstr "이 Ultimaker 2 업그레이드를 선택하십시오."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:47
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelectionMachineAction.qml:44
msgctxt "@label"
msgid "Olsson Block"
msgstr "Olsson Block"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:27
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:30
msgctxt "@title"
msgid "Build Plate Leveling"
msgstr "빌드 플레이트 레벨링"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:38
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:44
msgctxt "@label"
msgid "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."
msgstr "프린팅이 잘 되도록 빌드 플레이트를 조정할 수 있습니다. '다음 위치로 이동'을 클릭하면 노즐이 조정할 수있는 다른 위치로 이동합니다."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:47
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:57
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 "모든 자리에; 노즐 아래에 종이 한 장을 넣고 프린팅 빌드 플레이트 높이를 조정하십시오. 빌드플레이드의 높이는 종이의 끝 부분이 노즐의 끝부분으로 살짝 닿을 때의 높이입니다."
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:62
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:75
msgctxt "@action:button"
msgid "Start Build Plate Leveling"
msgstr "빌드플레이트 레벨링 시작하기"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:74
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.qml:87
msgctxt "@action:button"
msgid "Move to Next Position"
msgstr "다음 위치로 이동"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:37
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:30
msgctxt "@label"
msgid "Please select any upgrades made to this Ultimaker Original"
msgstr "이 Ultimaker Original에 업그레이드 할 항목을 선택하십시오"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:45
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelectionMachineAction.qml:41
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"
@@ -3117,170 +2969,170 @@ msgctxt "@label"
msgid "Are you sure you want to abort the print?"
msgstr "프린팅를 중단 하시겠습니까?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:71
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:73
msgctxt "@title"
msgid "Information"
msgstr "정보"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:100
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:102
msgctxt "@title:window"
msgid "Confirm Diameter Change"
msgstr "직경 변경 확인"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:101
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:103
msgctxt "@label (%1 is a number)"
msgid "The new filament diameter is set to %1 mm, which is not compatible with the current extruder. Do you wish to continue?"
msgstr "새 필라멘트의 직경은 %1 mm로 설정되었으며, 현재 압출기와 호환되지 않습니다. 계속하시겠습니까?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:133
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:127
msgctxt "@label"
msgid "Display Name"
msgstr "표시 이름"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:143
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:137
msgctxt "@label"
msgid "Brand"
msgstr "상표"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:153
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:147
msgctxt "@label"
msgid "Material Type"
msgstr "재료 유형"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:162
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:157
msgctxt "@label"
msgid "Color"
msgstr "색깔"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:212
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:207
msgctxt "@label"
msgid "Properties"
msgstr "속성"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:214
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:209
msgctxt "@label"
msgid "Density"
msgstr "밀도"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:229
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:224
msgctxt "@label"
msgid "Diameter"
msgstr "직경"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:263
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:258
msgctxt "@label"
msgid "Filament Cost"
msgstr "필라멘트 비용"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:280
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:275
msgctxt "@label"
msgid "Filament weight"
msgstr "필라멘트 무게"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:298
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:293
msgctxt "@label"
msgid "Filament length"
msgstr "필라멘트 길이"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:307
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:302
msgctxt "@label"
msgid "Cost per Meter"
msgstr "미터 당 비용"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:321
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:316
msgctxt "@label"
msgid "This material is linked to %1 and shares some of its properties."
msgstr "이 재료는 %1에 연결되어 있으며 일부 속성을 공유합니다."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:328
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:323
msgctxt "@label"
msgid "Unlink Material"
msgstr "재료 연결 해제"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:339
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:334
msgctxt "@label"
msgid "Description"
msgstr "설명"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:352
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:347
msgctxt "@label"
msgid "Adhesion Information"
msgstr "접착 정보"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:378
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:17
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsView.qml:373
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
msgctxt "@label"
msgid "Print settings"
msgstr "프린팅 설정"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:84
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:37
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:72
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:99
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:40
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:73
msgctxt "@action:button"
msgid "Activate"
msgstr "활성화"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:101
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:117
msgctxt "@action:button"
msgid "Create"
msgstr "생성"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:114
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:131
msgctxt "@action:button"
msgid "Duplicate"
msgstr "복제"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:141
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:142
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:160
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:148
msgctxt "@action:button"
msgid "Import"
msgstr "가져오기"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:203
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:223
msgctxt "@action:label"
msgid "Printer"
msgstr "프린터"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:262
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:246
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:287
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:253
msgctxt "@title:window"
msgid "Confirm Remove"
msgstr "제거 확인"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:263
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:247
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:254
msgctxt "@label (%1 is object name)"
msgid "Are you sure you wish to remove %1? This cannot be undone!"
msgstr "%1을 제거 하시겠습니까? 이것은 취소 할 수 없습니다!"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:277
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:285
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:304
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:312
msgctxt "@title:window"
msgid "Import Material"
msgstr "재료 가져 오기"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:286
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:313
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Could not import material %1: %2"
msgstr "재료를 가져올 수 없습니다"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:317
msgctxt "@info:status Don't translate the XML tag !"
msgid "Successfully imported material %1"
msgstr "재료를 성공적으로 가져왔습니다"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:308
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:316
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:335
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:343
msgctxt "@title:window"
msgid "Export Material"
msgstr "재료 내보내기"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:320
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:347
msgctxt "@info:status Don't translate the XML tags and !"
msgid "Failed to export material to %1: %2"
msgstr "재료를 내보내는데 실패했습니다"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:326
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/Materials/MaterialsPage.qml:353
msgctxt "@info:status Don't translate the XML tag !"
msgid "Successfully exported material to %1"
msgstr "재료를 성공적으로 내보냈습니다"
@@ -3295,412 +3147,437 @@ msgctxt "@label:textbox"
msgid "Check all"
msgstr "모두 확인"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:47
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:48
msgctxt "@info:status"
msgid "Calculated"
msgstr "계산된"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:60
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:61
msgctxt "@title:column"
msgid "Setting"
msgstr "설정"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:67
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:68
msgctxt "@title:column"
msgid "Profile"
msgstr "프로파일"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:74
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:75
msgctxt "@title:column"
msgid "Current"
msgstr "현재 설정"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:82
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfileTab.qml:83
msgctxt "@title:column"
msgid "Unit"
msgstr "단위"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:15
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:354
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:410
msgctxt "@title:tab"
msgid "General"
msgstr "일반"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:126
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:130
msgctxt "@label"
msgid "Interface"
msgstr "인터페이스"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:137
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:141
msgctxt "@label"
msgid "Language:"
msgstr "언어:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:204
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:208
msgctxt "@label"
msgid "Currency:"
msgstr "통화:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:217
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:221
msgctxt "@label"
msgid "Theme:"
msgstr "테마:"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:273
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:277
msgctxt "@label"
msgid "You will need to restart the application for these changes to have effect."
msgstr "이러한 변경 사항을 적용하려면 응용 프로그램을 다시 시작해야합니다."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:290
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:294
msgctxt "@info:tooltip"
msgid "Slice automatically when changing settings."
msgstr "설정이 변경되면 자동으로 슬라이싱 합니다."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:298
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:302
msgctxt "@option:check"
msgid "Slice automatically"
msgstr "자동으로 슬라이싱"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:312
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:316
msgctxt "@label"
msgid "Viewport behavior"
msgstr "뷰포트 동작"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:320
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:324
msgctxt "@info:tooltip"
msgid "Highlight unsupported areas of the model in red. Without support these areas will not print properly."
msgstr "지원되지 않는 모델 영역을 빨간색으로 강조 표시하십시오. 서포트가 없으면 이 영역이 제대로 프린팅되지 않습니다."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:329
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:333
msgctxt "@option:check"
msgid "Display overhang"
msgstr "오버행 표시"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:336
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341
msgctxt "@info:tooltip"
msgid "Moves the camera so the model is in the center of the view when a model is selected"
msgstr "모델을 선택하면 모델이 뷰의 가운데에 오도록 카메라를 이동합니다"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:341
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:346
msgctxt "@action:button"
msgid "Center camera when item is selected"
msgstr "항목을 선택하면 카메라를 중앙에 위치"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:350
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:356
msgctxt "@info:tooltip"
msgid "Should the default zoom behavior of cura be inverted?"
msgstr "큐라의 기본 확대 동작을 반전시켜야 합니까?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:355
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:361
msgctxt "@action:button"
msgid "Invert the direction of camera zoom."
msgstr "카메라 줌의 방향을 반전시키기."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:365
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371
msgctxt "@info:tooltip"
msgid "Should zooming move in the direction of the mouse?"
msgstr "확대가 마우스 방향으로 이동해야 합니까?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:370
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:371
+msgctxt "@info:tooltip"
+msgid "Zooming towards the mouse is not supported in the orthogonal perspective."
+msgstr "직교 시점에서는 마우스 방향으로 확대가 지원되지 않습니다."
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:376
msgctxt "@action:button"
msgid "Zoom toward mouse direction"
msgstr "마우스 방향으로 확대"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:380
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:402
msgctxt "@info:tooltip"
msgid "Should models on the platform be moved so that they no longer intersect?"
msgstr "모델을 더 이상 교차시키지 않도록 이동해야합니까?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:385
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:407
msgctxt "@option:check"
msgid "Ensure models are kept apart"
msgstr "모델이 분리되어 있는지 확인"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:394
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:416
msgctxt "@info:tooltip"
msgid "Should models on the platform be moved down to touch the build plate?"
msgstr "모델을 빌드 플레이트에 닿도록 아래로 움직여야합니까?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:399
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:421
msgctxt "@option:check"
msgid "Automatically drop models to the build plate"
msgstr "모델을 빌드 플레이트에 자동으로 놓기"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:411
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433
msgctxt "@info:tooltip"
msgid "Show caution message in g-code reader."
msgstr "g-code 리더에 주의 메시지를 표시하기."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:420
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:442
msgctxt "@option:check"
msgid "Caution message in g-code reader"
msgstr "g-code 리더의 주의 메시지"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:428
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:450
msgctxt "@info:tooltip"
msgid "Should layer be forced into compatibility mode?"
msgstr "레이어가 호환 모드로 강제 설정되어야합니까?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:433
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:455
msgctxt "@option:check"
msgid "Force layer view compatibility mode (restart required)"
msgstr "레이어 뷰 호환성 모드로 전환 (다시 시작해야 함)"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:449
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:465
+msgctxt "@info:tooltip"
+msgid "What type of camera rendering should be used?"
+msgstr "어떤 유형의 카메라 렌더링을 사용해야 합니까?"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:472
+msgctxt "@window:text"
+msgid "Camera rendering: "
+msgstr "카메라 렌더링: "
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:483
+msgid "Perspective"
+msgstr "원근"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:484
+msgid "Orthogonal"
+msgstr "직교"
+
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:515
msgctxt "@label"
msgid "Opening and saving files"
msgstr "파일 열기 및 저장"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:456
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:522
msgctxt "@info:tooltip"
msgid "Should models be scaled to the build volume if they are too large?"
msgstr "크기가 너무 큰 경우 모델을 빌드 볼륨에 맞게 조정해야합니까?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:461
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:527
msgctxt "@option:check"
msgid "Scale large models"
msgstr "큰 모델의 사이즈 수정"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:471
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:537
msgctxt "@info:tooltip"
msgid "An model may appear extremely small if its unit is for example in meters rather than millimeters. Should these models be scaled up?"
msgstr "단위가 밀리미터가 아닌 미터 단위 인 경우 모델이 매우 작게 나타날 수 있습니다. 이 모델을 확대할까요?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:476
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:542
msgctxt "@option:check"
msgid "Scale extremely small models"
msgstr "매우 작은 모델의 크기 조정"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:486
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:552
msgctxt "@info:tooltip"
msgid "Should models be selected after they are loaded?"
msgstr "모델을 로드한 후에 선택해야 합니까?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:491
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:557
msgctxt "@option:check"
msgid "Select models when loaded"
msgstr "로드된 경우 모델 선택"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:501
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:567
msgctxt "@info:tooltip"
msgid "Should a prefix based on the printer name be added to the print job name automatically?"
msgstr "프린터 이름에 기반한 접두어가 프린팅 작업 이름에 자동으로 추가되어야합니까?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:506
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:572
msgctxt "@option:check"
msgid "Add machine prefix to job name"
msgstr "작업 이름에 기기 접두어 추가"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:516
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:582
msgctxt "@info:tooltip"
msgid "Should a summary be shown when saving a project file?"
msgstr "프로젝트 파일을 저장할 때 요약이 표시되어야합니까?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:520
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:586
msgctxt "@option:check"
msgid "Show summary dialog when saving project"
msgstr "프로젝트 저장시 요약 대화 상자 표시"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:530
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:596
msgctxt "@info:tooltip"
msgid "Default behavior when opening a project file"
msgstr "프로젝트 파일을 열 때 기본 동작"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:538
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:604
msgctxt "@window:text"
msgid "Default behavior when opening a project file: "
msgstr "프로젝트 파일을 열 때 기본 동작 "
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:552
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:618
msgctxt "@option:openProject"
msgid "Always ask me this"
msgstr "항상 묻기"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:553
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:619
msgctxt "@option:openProject"
msgid "Always open as a project"
msgstr "항상 프로젝트로 열기"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:554
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620
msgctxt "@option:openProject"
msgid "Always import models"
msgstr "항상 모델 가져 오기"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:590
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:656
msgctxt "@info:tooltip"
msgid "When you have made changes to a profile and switched to a different one, a dialog will be shown asking whether you want to keep your modifications or not, or you can choose a default behaviour and never show that dialog again."
msgstr "프로파일을 변경하고 다른 프로파일로 전환하면 수정 사항을 유지할지 여부를 묻는 대화 상자가 표시됩니다. 기본 행동을 선택하면 해당 대화 상자를 다시 표시 하지 않을 수 있습니다."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:599
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:665
msgctxt "@label"
msgid "Profiles"
msgstr "프로파일"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:604
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:670
msgctxt "@window:text"
msgid "Default behavior for changed setting values when switching to a different profile: "
msgstr "다른 프로파일로 변경하는 경우 변경된 설정값에 대한 기본 동작 "
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:618
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:684
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:157
msgctxt "@option:discardOrKeep"
msgid "Always ask me this"
msgstr "항상 묻기"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:619
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:685
msgctxt "@option:discardOrKeep"
msgid "Always discard changed settings"
msgstr "항상 변경된 설정 삭제"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:620
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:686
msgctxt "@option:discardOrKeep"
msgid "Always transfer changed settings to new profile"
msgstr "항상 변경된 설정을 새 프로파일로 전송"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:654
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:720
msgctxt "@label"
msgid "Privacy"
msgstr "보안"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:661
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:727
msgctxt "@info:tooltip"
msgid "Should Cura check for updates when the program is started?"
msgstr "Cura가 프로그램이 시작될 때 업데이트를 확인할까요?"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:666
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:732
msgctxt "@option:check"
msgid "Check for updates on start"
msgstr "시작시 업데이트 확인"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:676
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:742
msgctxt "@info:tooltip"
msgid "Should anonymous data about your print be sent to Ultimaker? Note, no models, IP addresses or other personally identifiable information is sent or stored."
msgstr "프린터에 대한 익명의 데이터를 Ultimaker로 보낼까요? 모델, IP 주소 또는 기타 개인 식별 정보는 전송되거나 저장되지 않습니다."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:681
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:747
msgctxt "@option:check"
msgid "Send (anonymous) print information"
msgstr "(익명) 프린터 정보 보내기"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:690
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:756
msgctxt "@action:button"
msgid "More information"
msgstr "추가 정보"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:708
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:774
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorHeader.qml:27
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ProfileMenu.qml:23
msgctxt "@label"
msgid "Experimental"
msgstr "실험적 설정"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:715
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:781
msgctxt "@info:tooltip"
msgid "Use multi build plate functionality"
msgstr "다수의 빌드 플레이트 사용하기"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:720
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:786
msgctxt "@option:check"
msgid "Use multi build plate functionality (restart required)"
msgstr "다수의 빌드 플레이트 사용하기(다시 시작해야 합니다)"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:16
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:359
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:415
msgctxt "@title:tab"
msgid "Printers"
msgstr "프린터"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:57
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:129
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/MachinesPage.qml:63
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:134
msgctxt "@action:button"
msgid "Rename"
msgstr "이름 바꾸기"
#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:36
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:363
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:419
msgctxt "@title:tab"
msgid "Profiles"
msgstr "프로파일"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:87
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:89
msgctxt "@label"
msgid "Create"
msgstr "생성"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:102
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:105
msgctxt "@label"
msgid "Duplicate"
msgstr "복제"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:174
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:181
msgctxt "@title:window"
msgid "Create Profile"
msgstr "프로파일 생성하기"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:176
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:183
msgctxt "@info"
msgid "Please provide a name for this profile."
msgstr "이 프로파일에 대한 이름을 제공하십시오."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:232
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:239
msgctxt "@title:window"
msgid "Duplicate Profile"
msgstr "프로파일 복제하기"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:263
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:270
msgctxt "@title:window"
msgid "Rename Profile"
msgstr "프로파일 이름 바꾸기"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:276
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:283
msgctxt "@title:window"
msgid "Import Profile"
msgstr "프로파일 가져 오기"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:302
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:309
msgctxt "@title:window"
msgid "Export Profile"
msgstr "프로파일 내보내기"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:357
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:364
msgctxt "@label %1 is printer name"
msgid "Printer: %1"
msgstr "프린터: %1"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:420
msgctxt "@label"
msgid "Default profiles"
msgstr "기본 프로파일"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:413
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:420
msgctxt "@label"
msgid "Custom profiles"
msgstr "사용자 정의 프로파일"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:490
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:500
msgctxt "@action:button"
msgid "Update profile with current settings/overrides"
msgstr "현재 설정 / 재정의 프로파일 업데이트"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:497
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:507
msgctxt "@action:button"
msgid "Discard current changes"
msgstr "현재 변경 사항 삭제"
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:514
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:524
msgctxt "@action:label"
msgid "This profile uses the defaults specified by the printer, so it has no settings/overrides in the list below."
msgstr "이 프로파일은 프린터에서 지정한 기본값을 사용하므로 아래 목록에 아무런 설정/재정의가 없습니다."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:521
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:531
msgctxt "@action:label"
msgid "Your current settings match the selected profile."
msgstr "현재 설정이 선택한 프로파일과 일치합니다."
-#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:540
+#: /home/ruben/Projects/Cura/resources/qml/Preferences/ProfilesPage.qml:550
msgctxt "@title:tab"
msgid "Global Settings"
msgstr "전역 설정"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:87
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/MainWindowHeader.qml:89
msgctxt "@action:button"
msgid "Marketplace"
msgstr "시장"
@@ -3743,12 +3620,12 @@ msgctxt "@title:menu menubar:toplevel"
msgid "&Help"
msgstr "도움말(&H)"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:123
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:124
msgctxt "@title:window"
msgid "New project"
msgstr "새 프로젝트"
-#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:124
+#: /home/ruben/Projects/Cura/resources/qml/MainWindow/ApplicationMenu.qml:125
msgctxt "@info:question"
msgid "Are you sure you want to start a new project? This will clear the build plate and any unsaved settings."
msgstr "새 프로젝트를 시작 하시겠습니까? 빌드 플레이트 및 저장하지 않은 설정이 지워집니다."
@@ -3763,33 +3640,33 @@ msgctxt "@label:textbox"
msgid "search settings"
msgstr "검색 설정"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:465
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:466
msgctxt "@action:menu"
msgid "Copy value to all extruders"
msgstr "모든 익스트루더에 값 복사"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:474
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:475
msgctxt "@action:menu"
msgid "Copy all changed values to all extruders"
msgstr "변경된 사항을 모든 익스트루더에 복사"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:511
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:512
msgctxt "@action:menu"
msgid "Hide this setting"
msgstr "이 설정 숨기기"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:529
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:525
msgctxt "@action:menu"
msgid "Don't show this setting"
msgstr "이 설정을 표시하지 않음"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:533
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:529
msgctxt "@action:menu"
msgid "Keep this setting visible"
msgstr "이 설정을 계속 표시하십시오"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:557
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:417
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingView.qml:548
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:434
msgctxt "@action:menu"
msgid "Configure setting visibility..."
msgstr "설정 보기..."
@@ -3805,27 +3682,32 @@ msgstr ""
"\n"
"이 설정을 표시하려면 클릭하십시오."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:66
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:81
+msgctxt "@label"
+msgid "This setting is not used because all the settings that it influences are overridden."
+msgstr "영향을 미치는 모든 설정이 무효화되기 때문에 이 설정을 사용하지 않습니다."
+
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:86
msgctxt "@label Header for list of settings."
msgid "Affects"
msgstr "영향"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:71
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:91
msgctxt "@label Header for list of settings."
msgid "Affected By"
msgstr "영향을 받다"
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:166
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:186
msgctxt "@label"
msgid "This setting is always shared between all extruders. Changing it here will change the value for all extruders."
msgstr "이 설정은 항상 모든 익스트루더 사이에 공유됩니다. 여기서 변경하면 모든 익스트루더에 대한 값이 변경됩니다."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:170
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:190
msgctxt "@label"
msgid "The value is resolved from per-extruder values "
msgstr "이 값은 익스트루더마다 결정됩니다 "
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:208
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:228
msgctxt "@label"
msgid ""
"This setting has a value that is different from the profile.\n"
@@ -3836,7 +3718,7 @@ msgstr ""
"\n"
"프로파일 값을 복원하려면 클릭하십시오."
-#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:302
+#: /home/ruben/Projects/Cura/resources/qml/Settings/SettingItem.qml:322
msgctxt "@label"
msgid ""
"This setting is normally calculated, but it currently has an absolute value set.\n"
@@ -3847,12 +3729,12 @@ msgstr ""
"\n"
"계산 된 값을 복원하려면 클릭하십시오."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:129
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:144
msgctxt "@button"
msgid "Recommended"
msgstr "추천"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:142
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelectorContents.qml:158
msgctxt "@button"
msgid "Custom"
msgstr "사용자 정의"
@@ -3867,27 +3749,22 @@ msgctxt "@label"
msgid "Gradual infill will gradually increase the amount of infill towards the top."
msgstr "점차적인 내부채움은 점차적으로 빈 공간 채우기의 양을 증가시킵니다."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:29
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:30
msgctxt "@label"
msgid "Support"
msgstr "서포트"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:70
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:71
msgctxt "@label"
msgid "Generate structures to support parts of the model which have overhangs. Without these structures, such parts would collapse during printing."
msgstr "오버행이 있는 모델 서포트를 생성합니다. 이러한 구조가 없으면 이러한 부분이 프린팅 중에 붕괴됩니다."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedSupportSelector.qml:136
-msgctxt "@label"
-msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air."
-msgstr "서포트에 사용할 익스트루더를 선택하십시오. 이렇게 하면 모형 아래에 지지 구조가 만들어져 모델이 중간 공기에서 처지거나 프린팅되는 것을 방지합니다."
-
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:28
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:29
msgctxt "@label"
msgid "Adhesion"
msgstr "부착"
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:85
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedAdhesionSelector.qml:74
msgctxt "@label"
msgid "Enable printing a brim or raft. This will add a flat area around or under your object which is easy to cut off afterwards."
msgstr "브림이나 라프트를 사용합니다. 이렇게하면 출력물 주변이나 아래에 평평한 영역이 추가되어 나중에 쉽게 자를 수 있습니다."
@@ -3904,8 +3781,8 @@ 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 "현재 재료 및 노즐 구성에 대해 이 품질 프로파일을 사용할 수 없습니다. 이 품질 프로파일을 활성화하려면 이를 변경하십시오"
+msgid "This quality profile is not available for your current material and nozzle configuration. Please change these to enable this quality profile."
+msgstr "현재 재료 및 노즐 구성에 대해 이 품질 프로파일을 사용할 수 없습니다. 이 품질 프로파일을 활성화하려면 이를 변경하십시오."
#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/Recommended/RecommendedQualityProfileSelector.qml:449
msgctxt "@tooltip"
@@ -3938,9 +3815,9 @@ msgstr ""
"\n"
"프로파일 매니저를 열려면 클릭하십시오."
-#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:19
+#: /home/ruben/Projects/Cura/resources/qml/PrintSetupSelector/PrintSetupSelector.qml:21
msgctxt "@label shown when we load a Gcode file"
-msgid "Print setup disabled. G code file can not be modified."
+msgid "Print setup disabled. G-code file can not be modified."
msgstr "인쇄 설정 비활성화됨. G 코드 파일을 수정할 수 없습니다."
#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:52
@@ -3973,7 +3850,7 @@ msgctxt "@label"
msgid "Send G-code"
msgstr "Gcode 보내기"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:364
+#: /home/ruben/Projects/Cura/resources/qml/PrinterOutput/ManualPrinterControl.qml:365
msgctxt "@tooltip of G-code command input"
msgid "Send a custom G-code command to the connected printer. Press 'enter' to send the command."
msgstr "연결된 프린터에 사용자 정의 G 코드 명령을 보냅니다. ‘Enter’키를 눌러 명령을 전송하십시오."
@@ -4070,11 +3947,6 @@ msgctxt "@label:category menu label"
msgid "Favorites"
msgstr "즐겨찾기"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/MaterialMenu.qml:66
-msgctxt "@label:category menu label"
-msgid "Generic"
-msgstr "일반"
-
#: /home/ruben/Projects/Cura/resources/qml/Menus/PrinterMenu.qml:25
msgctxt "@label:category menu label"
msgid "Network enabled printers"
@@ -4090,32 +3962,32 @@ msgctxt "@title:menu menubar:settings"
msgid "&Printer"
msgstr "프린터(&P)"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:26
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:32
msgctxt "@title:menu"
msgid "&Material"
msgstr "재료(&M)"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:35
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:41
msgctxt "@action:inmenu"
msgid "Set as Active Extruder"
msgstr "활성 익스트루더로 설정"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:41
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:47
msgctxt "@action:inmenu"
msgid "Enable Extruder"
msgstr "익스트루더 사용"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:48
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:54
msgctxt "@action:inmenu"
msgid "Disable Extruder"
msgstr "익스트루더 사용하지 않음"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:62
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:68
msgctxt "@title:menu"
msgid "&Build plate"
msgstr "빌드 플레이트(&B)"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:65
+#: /home/ruben/Projects/Cura/resources/qml/Menus/SettingsMenu.qml:71
msgctxt "@title:settings"
msgid "&Profile"
msgstr "프로파일(&P)"
@@ -4125,7 +3997,22 @@ msgctxt "@action:inmenu menubar:view"
msgid "&Camera position"
msgstr "카메라 위치(&C)"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:35
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:44
+msgctxt "@action:inmenu menubar:view"
+msgid "Camera view"
+msgstr "카메라 뷰"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:47
+msgctxt "@action:inmenu menubar:view"
+msgid "Perspective"
+msgstr "원근"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:59
+msgctxt "@action:inmenu menubar:view"
+msgid "Orthographic"
+msgstr "직교"
+
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ViewMenu.qml:80
msgctxt "@action:inmenu menubar:view"
msgid "&Build plate"
msgstr "빌드 플레이트(&B)"
@@ -4187,12 +4074,7 @@ msgctxt "@label"
msgid "Select configuration"
msgstr "구성 선택"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:201
-msgctxt "@label"
-msgid "See the material compatibility chart"
-msgstr "재료 호환성 차트 보기"
-
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:274
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/ConfigurationMenu.qml:221
msgctxt "@label"
msgid "Configurations"
msgstr "구성"
@@ -4217,17 +4099,17 @@ msgctxt "@label"
msgid "Printer"
msgstr "프린터"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:202
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:213
msgctxt "@label"
msgid "Enabled"
msgstr "실행됨"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:239
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:250
msgctxt "@label"
msgid "Material"
msgstr "재료"
-#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:344
+#: /home/ruben/Projects/Cura/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml:375
msgctxt "@label"
msgid "Use glue for better adhesion with this material combination."
msgstr "더 나은 접착력을 위해 이 재료 조합과 함께 접착제를 사용하십시오.."
@@ -4247,42 +4129,47 @@ msgctxt "@title:menu menubar:file"
msgid "Open &Recent"
msgstr "최근 열어본 파일 열기"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:145
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:140
msgctxt "@label"
msgid "Active print"
msgstr "활성화된 프린트"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:153
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:148
msgctxt "@label"
msgid "Job Name"
msgstr "작업 이름"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:161
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:156
msgctxt "@label"
msgid "Printing Time"
msgstr "프린팅 시간"
-#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:169
+#: /home/ruben/Projects/Cura/resources/qml/PrintMonitor.qml:164
msgctxt "@label"
msgid "Estimated time left"
msgstr "예상 남은 시간"
#: /home/ruben/Projects/Cura/resources/qml/ViewsSelector.qml:50
msgctxt "@label"
-msgid "View types"
+msgid "View type"
msgstr "유형 보기"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:23
+#: /home/ruben/Projects/Cura/resources/qml/ObjectSelector.qml:59
msgctxt "@label"
-msgid "Hi "
-msgstr "안녕하세요 "
+msgid "Object list"
+msgstr "개체 목록"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:40
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:22
+msgctxt "@label The argument is a username."
+msgid "Hi %1"
+msgstr "안녕하세요 %1"
+
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:33
msgctxt "@button"
msgid "Ultimaker account"
msgstr "Ultimaker 계정"
-#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:49
+#: /home/ruben/Projects/Cura/resources/qml/Account/UserOperations.qml:42
msgctxt "@button"
msgid "Sign out"
msgstr "로그아웃"
@@ -4292,11 +4179,6 @@ msgctxt "@action:button"
msgid "Sign in"
msgstr "로그인"
-#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:29
-msgctxt "@label"
-msgid "Ultimaker Cloud"
-msgstr "Ultimaker Cloud"
-
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:40
msgctxt "@label"
msgid "The next generation 3D printing workflow"
@@ -4307,11 +4189,11 @@ msgctxt "@text"
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"
+"- Get exclusive access to print profiles from leading brands"
msgstr ""
"- 인쇄 작업을 로컬 네트워크 외부의 Ultimaker 프린터로 전송하십시오\n"
"- Ultimaker Cura 설정을 어디에서든 사용할 수 있도록 Cloud에 저장하십시오\n"
-"- 유수 브랜드의 재료 프로파일에 대한 독점적 액세스 권한을 얻으십시오"
+"- 유수 브랜드의 인쇄 프로파일에 대한 독점적 액세스 권한을 얻으십시오"
#: /home/ruben/Projects/Cura/resources/qml/Account/GeneralOperations.qml:78
msgctxt "@button"
@@ -4323,50 +4205,55 @@ msgctxt "@label"
msgid "No time estimation available"
msgstr "시간 추산 이용 불가"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:76
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:77
msgctxt "@label"
msgid "No cost estimation available"
msgstr "비용 추산 이용 불가"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:117
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:127
msgctxt "@button"
msgid "Preview"
msgstr "미리 보기"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:49
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:55
msgctxt "@label:PrintjobStatus"
msgid "Slicing..."
msgstr "슬라이싱..."
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:61
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:67
msgctxt "@label:PrintjobStatus"
-msgid "Unable to Slice"
-msgstr "슬라이스 할 수 없음"
+msgid "Unable to slice"
+msgstr "슬라이스 할 수 없습니다"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:116
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:103
+msgctxt "@button"
+msgid "Processing"
+msgstr "처리"
+
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:103
msgctxt "@button"
msgid "Slice"
msgstr "슬라이스"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:117
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:104
msgctxt "@label"
msgid "Start the slicing process"
msgstr "슬라이싱 프로세스 시작"
-#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:131
+#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/SliceProcessWidget.qml:118
msgctxt "@button"
msgid "Cancel"
msgstr "취소"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:31
msgctxt "@label"
-msgid "Time specification"
-msgstr "시간 사양"
+msgid "Time estimation"
+msgstr "시간 추산"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:114
msgctxt "@label"
-msgid "Material specification"
-msgstr "재료 사양"
+msgid "Material estimation"
+msgstr "재료 추산"
#: /home/ruben/Projects/Cura/resources/qml/ActionPanel/PrintJobInformation.qml:164
msgctxt "@label m for meter"
@@ -4388,282 +4275,296 @@ msgctxt "@label"
msgid "Preset printers"
msgstr "프린터 사전 설정"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:161
+#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:166
msgctxt "@button"
msgid "Add printer"
msgstr "프린터 추가"
-#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:173
+#: /home/ruben/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:182
msgctxt "@button"
msgid "Manage printers"
msgstr "프린터 관리"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:78
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:81
msgctxt "@action:inmenu"
msgid "Show Online Troubleshooting Guide"
msgstr "온라인 문제 해결 가이드 표시"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:85
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:88
msgctxt "@action:inmenu"
msgid "Toggle Full Screen"
msgstr "전채 화면 전환"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:92
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:96
+msgctxt "@action:inmenu"
+msgid "Exit Full Screen"
+msgstr "전체 화면 종료"
+
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:103
msgctxt "@action:inmenu menubar:edit"
msgid "&Undo"
msgstr "되돌리기(&U)"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:102
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:113
msgctxt "@action:inmenu menubar:edit"
msgid "&Redo"
msgstr "다시하기(&R)"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:112
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:123
msgctxt "@action:inmenu menubar:file"
msgid "&Quit"
msgstr "종료(&Q)"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:120
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:131
msgctxt "@action:inmenu menubar:view"
msgid "3D View"
msgstr "3D 보기"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:127
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:138
msgctxt "@action:inmenu menubar:view"
msgid "Front View"
msgstr "앞에서 보기"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:134
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:145
msgctxt "@action:inmenu menubar:view"
msgid "Top View"
msgstr "위에서 보기"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:141
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:152
msgctxt "@action:inmenu menubar:view"
msgid "Left Side View"
msgstr "왼쪽에서 보기"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:148
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:159
msgctxt "@action:inmenu menubar:view"
msgid "Right Side View"
msgstr "오른쪽에서 보기"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:155
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:166
msgctxt "@action:inmenu"
msgid "Configure Cura..."
msgstr "Cura 구성 ..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:162
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:173
msgctxt "@action:inmenu menubar:printer"
msgid "&Add Printer..."
msgstr "프린터 추가..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:168
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:179
msgctxt "@action:inmenu menubar:printer"
msgid "Manage Pr&inters..."
msgstr "프린터 관리 ..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:175
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:186
msgctxt "@action:inmenu"
msgid "Manage Materials..."
msgstr "재료 관리..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:184
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:195
msgctxt "@action:inmenu menubar:profile"
msgid "&Update profile with current settings/overrides"
msgstr "현재 설정으로로 프로파일 업데이트"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:192
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:203
msgctxt "@action:inmenu menubar:profile"
msgid "&Discard current changes"
msgstr "현재 변경 사항 무시"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:204
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:215
msgctxt "@action:inmenu menubar:profile"
msgid "&Create profile from current settings/overrides..."
msgstr "현재 설정으로 프로파일 생성..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:210
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:221
msgctxt "@action:inmenu menubar:profile"
msgid "Manage Profiles..."
msgstr "프로파일 관리..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:218
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:229
msgctxt "@action:inmenu menubar:help"
msgid "Show Online &Documentation"
msgstr "온라인 문서 표시"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:226
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:237
msgctxt "@action:inmenu menubar:help"
msgid "Report a &Bug"
msgstr "버그 리포트"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:234
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:245
+msgctxt "@action:inmenu menubar:help"
+msgid "What's New"
+msgstr "새로운 기능"
+
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:251
msgctxt "@action:inmenu menubar:help"
msgid "About..."
msgstr "소개..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:241
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:258
msgctxt "@action:inmenu menubar:edit"
msgid "Delete Selected Model"
msgid_plural "Delete Selected Models"
msgstr[0] "선택한 모델 삭제"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:251
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:268
msgctxt "@action:inmenu menubar:edit"
msgid "Center Selected Model"
msgid_plural "Center Selected Models"
msgstr[0] "선택한 모델 중심에 놓기"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:260
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277
msgctxt "@action:inmenu menubar:edit"
msgid "Multiply Selected Model"
msgid_plural "Multiply Selected Models"
msgstr[0] "선택한 모델 복제"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:269
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:286
msgctxt "@action:inmenu"
msgid "Delete Model"
msgstr "모델 삭제"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:277
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:294
msgctxt "@action:inmenu"
msgid "Ce&nter Model on Platform"
msgstr "플랫폼중심에 모델 위치하기"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:283
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:300
msgctxt "@action:inmenu menubar:edit"
msgid "&Group Models"
msgstr "모델 그룹화"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:303
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:320
msgctxt "@action:inmenu menubar:edit"
msgid "Ungroup Models"
msgstr "모델 그룹 해제"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:313
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:330
msgctxt "@action:inmenu menubar:edit"
msgid "&Merge Models"
msgstr "모델 합치기"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:323
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:340
msgctxt "@action:inmenu"
msgid "&Multiply Model..."
msgstr "모델 복제..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:330
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:347
msgctxt "@action:inmenu menubar:edit"
msgid "Select All Models"
msgstr "모든 모델 선택"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:340
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:357
msgctxt "@action:inmenu menubar:edit"
msgid "Clear Build Plate"
msgstr "빌드 플레이트 지우기"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:350
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:367
msgctxt "@action:inmenu menubar:file"
msgid "Reload All Models"
msgstr "모든 모델 다시 로드"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:359
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:376
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange All Models To All Build Plates"
msgstr "모든 모델을 모든 빌드 플레이트에 정렬"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:366
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:383
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange All Models"
msgstr "모든 모델 정렬"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:374
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:391
msgctxt "@action:inmenu menubar:edit"
msgid "Arrange Selection"
msgstr "선택한 모델 정렬"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:381
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:398
msgctxt "@action:inmenu menubar:edit"
msgid "Reset All Model Positions"
msgstr "모든 모델의 위치 재설정"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:388
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:405
msgctxt "@action:inmenu menubar:edit"
msgid "Reset All Model Transformations"
msgstr "모든 모델의 변환 재설정"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:395
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:412
msgctxt "@action:inmenu menubar:file"
msgid "&Open File(s)..."
msgstr "파일 열기..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:403
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:420
msgctxt "@action:inmenu menubar:file"
msgid "&New Project..."
msgstr "새로운 프로젝트..."
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:410
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:427
msgctxt "@action:inmenu menubar:help"
msgid "Show Configuration Folder"
msgstr "설정 폴더 표시"
-#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:424
+#: /home/ruben/Projects/Cura/resources/qml/Actions.qml:441
msgctxt "@action:menu"
msgid "&Marketplace"
msgstr "&시장"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:23
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:24
msgctxt "@title:window"
msgid "Ultimaker Cura"
msgstr "Ultimaker Cura"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:181
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:232
msgctxt "@label"
msgid "This package will be installed after restarting."
msgstr "다시 시작한 후에 이 패키지가 설치됩니다."
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:357
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:413
msgctxt "@title:tab"
msgid "Settings"
msgstr "설정"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:486
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:539
msgctxt "@title:window"
msgid "Closing Cura"
msgstr "Cura 닫기"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:487
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:499
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:540
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:552
msgctxt "@label"
msgid "Are you sure you want to exit Cura?"
msgstr "Cura를 정말로 종료하시겠습니까?"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:531
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:590
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:19
msgctxt "@title:window"
msgid "Open file(s)"
msgstr "파일 열기"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:632
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:691
msgctxt "@window:title"
msgid "Install Package"
msgstr "패키지 설치"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:640
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:699
msgctxt "@title:window"
msgid "Open File(s)"
msgstr "파일 열기"
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:643
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:702
msgctxt "@text:window"
msgid "We have found one or more G-Code files within the files you have selected. You can only open one G-Code file at a time. If you want to open a G-Code file, please just select only one."
msgstr "선택한 파일 내에 하나 이상의 G-코드 파일이 있습니다. 한 번에 하나의 G-코드 파일 만 열 수 있습니다. G-코드 파일을 열려면 하나만 선택하십시오."
-#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:713
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:18
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:805
msgctxt "@title:window"
msgid "Add Printer"
msgstr "프린터 추가"
+#: /home/ruben/Projects/Cura/resources/qml/Cura.qml:813
+msgctxt "@title:window"
+msgid "What's New"
+msgstr "새로운 기능"
+
#: /home/ruben/Projects/Cura/resources/qml/ExtruderButton.qml:16
msgctxt "@label %1 is filled in with the name of an extruder"
msgid "Print Selected Model with %1"
@@ -4724,37 +4625,6 @@ msgctxt "@action:button"
msgid "Create New Profile"
msgstr "새 프로파일 만들기"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:78
-msgctxt "@title:tab"
-msgid "Add a printer to Cura"
-msgstr "Cura에 프린터 추가"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:92
-msgctxt "@title:tab"
-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 ""
-"아래 목록에서 사용하고자 하는 프린터를 선택하십시오.\n"
-"\n"
-"프린터가 목록에 없을 경우 “사용자 정의” 범주에서 “사용자 정의 FFF 프린터\"를 사용하고 다음 대화 상자의 프린터와 일치하도록 설정을 조정하십시오."
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:249
-msgctxt "@label"
-msgid "Manufacturer"
-msgstr "제조업체"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:271
-msgctxt "@label"
-msgid "Printer Name"
-msgstr "프린터 이름"
-
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AddMachineDialog.qml:294
-msgctxt "@action:button"
-msgid "Add Printer"
-msgstr "프린터 추가"
-
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:15
msgctxt "@title:window"
msgid "About Cura"
@@ -4914,27 +4784,32 @@ msgctxt "@title:window"
msgid "Save Project"
msgstr "프로젝트 저장"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:138
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:149
msgctxt "@action:label"
msgid "Build plate"
msgstr "빌드 플레이트"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:170
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:183
msgctxt "@action:label"
msgid "Extruder %1"
msgstr "%1익스트루더"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:180
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:198
msgctxt "@action:label"
msgid "%1 & material"
msgstr "%1 & 재료"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:243
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:200
+msgctxt "@action:label"
+msgid "Material"
+msgstr "재료"
+
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:272
msgctxt "@action:label"
msgid "Don't show project summary on save again"
msgstr "프로젝트 요약을 다시 저장하지 마십시오"
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:262
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:291
msgctxt "@action:button"
msgid "Save"
msgstr "저장"
@@ -4964,30 +4839,1067 @@ msgctxt "@action:button"
msgid "Import models"
msgstr "모델 가져 오기"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:210
-msgctxt "@option:check"
-msgid "See only current build plate"
-msgstr "현재의 빌드 플레이트만 보기"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DropDownWidget.qml:93
+msgctxt "@label"
+msgid "Empty"
+msgstr "비어 있음"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:226
-msgctxt "@action:button"
-msgid "Arrange to all build plates"
-msgstr "모든 빌드 플레이트 정렬"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:24
+msgctxt "@label"
+msgid "Add a printer"
+msgstr "프린터 추가"
-#: /home/ruben/Projects/Cura/resources/qml/ObjectsList.qml:246
-msgctxt "@action:button"
-msgid "Arrange current build plate"
-msgstr "현재의 빌드 플레이트 정렬"
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:39
+msgctxt "@label"
+msgid "Add a networked printer"
+msgstr "네트워크 프린터 추가"
-#: X3GWriter/plugin.json
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkOrLocalPrinterContent.qml:81
+msgctxt "@label"
+msgid "Add a non-networked printer"
+msgstr "비 네트워크 프린터 추가"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:70
+msgctxt "@label"
+msgid "Add printer by IP address"
+msgstr "IP 주소로 프린터 추가"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:133
+msgctxt "@text"
+msgid "Place enter your printer's IP address."
+msgstr "프린터의 IP 주소를 입력하십시오."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:158
+msgctxt "@button"
+msgid "Add"
+msgstr "추가"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:204
+msgctxt "@label"
+msgid "Could not connect to device."
+msgstr "장치에 연결할 수 없습니다."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:208
+msgctxt "@label"
+msgid "The printer at this address has not responded yet."
+msgstr "이 주소의 프린터가 아직 응답하지 않았습니다."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:240
+msgctxt "@label"
+msgid "This printer cannot be added because it's an unknown printer or it's not the host of a group."
+msgstr "알 수 없는 프린터이거나 그룹의 호스트가 아니기 때문에 이 프린터를 추가할 수 없습니다."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:329
+msgctxt "@button"
+msgid "Back"
+msgstr "뒤로"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:342
+msgctxt "@button"
+msgid "Connect"
+msgstr "연결"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/FirstStartMachineActionsContent.qml:77
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:123
+msgctxt "@button"
+msgid "Next"
+msgstr "다음 것"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:23
+msgctxt "@label"
+msgid "User Agreement"
+msgstr "사용자 계약"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:56
+msgctxt "@button"
+msgid "Agree"
+msgstr "동의"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/UserAgreementContent.qml:70
+msgctxt "@button"
+msgid "Decline and close"
+msgstr "거절 및 닫기"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:24
+msgctxt "@label"
+msgid "Help us to improve Ultimaker Cura"
+msgstr "Ultimaker Cura를 개선하는 데 도움을 주십시오"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:57
+msgctxt "@text"
+msgid "Ultimaker Cura collects anonymous data to improve print quality and user experience, including:"
+msgstr "Ultimaker Cura는 인쇄 품질과 사용자 경험을 개선하기 위해 다음과 같은 익명 데이터를 수집합니다:"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:71
+msgctxt "@text"
+msgid "Machine types"
+msgstr "기기 유형"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:77
+msgctxt "@text"
+msgid "Material usage"
+msgstr "재료 사용"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:83
+msgctxt "@text"
+msgid "Number of slices"
+msgstr "슬라이드 수"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:89
+msgctxt "@text"
+msgid "Print settings"
+msgstr "인쇄 설정"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:102
+msgctxt "@text"
+msgid "Data collected by Ultimaker Cura will not contain any personal information."
+msgstr "Ultimaker Cura가 수집하는 데이터에는 개인 정보가 포함되어 있지 않습니다."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:103
+msgctxt "@text"
+msgid "More information"
+msgstr "추가 정보"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WhatsNewContent.qml:24
+msgctxt "@label"
+msgid "What's new in Ultimaker Cura"
+msgstr "Ultimaker Cura의 새로운 기능"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:42
+msgctxt "@label"
+msgid "There is no printer found over your network."
+msgstr "네트워크에서 검색된 프린터가 없습니다."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:179
+msgctxt "@label"
+msgid "Refresh"
+msgstr "새로고침"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:190
+msgctxt "@label"
+msgid "Add printer by IP"
+msgstr "IP로 프린터 추가"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:223
+msgctxt "@label"
+msgid "Troubleshooting"
+msgstr "문제 해결"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:207
+msgctxt "@label"
+msgid "Printer name"
+msgstr "프린터 이름"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:220
+msgctxt "@text"
+msgid "Please give your printer a name"
+msgstr "프린터의 이름을 설정하십시오"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:36
+msgctxt "@label"
+msgid "Ultimaker Cloud"
+msgstr "Ultimaker Cloud"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:77
+msgctxt "@text"
+msgid "The next generation 3D printing workflow"
+msgstr "차세대 3D 인쇄 워크플로"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:94
+msgctxt "@text"
+msgid "- Send print jobs to Ultimaker printers outside your local network"
+msgstr "- 로컬 네트워크 외부의 Ultimaker 프린터로 인쇄 작업 전송"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:97
+msgctxt "@text"
+msgid "- Store your Ultimaker Cura settings in the cloud for use anywhere"
+msgstr "- 어디에서든 사용할 수 있도록 클라우드에 Ultimaker Cura 설정 저장"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:100
+msgctxt "@text"
+msgid "- Get exclusive access to print profiles from leading brands"
+msgstr "- 유수 브랜드의 인쇄 프로파일에 대한 독점적인 액세스 권한 얻기"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:119
+msgctxt "@button"
+msgid "Finish"
+msgstr "종료"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:128
+msgctxt "@button"
+msgid "Create an account"
+msgstr "계정 생성"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:29
+msgctxt "@label"
+msgid "Welcome to Ultimaker Cura"
+msgstr "Ultimaker Cura에 오신 것을 환영합니다"
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:47
+msgctxt "@text"
+msgid ""
+"Please follow these steps to set up\n"
+"Ultimaker Cura. This will only take a few moments."
+msgstr "Ultimaker Cura를 설정하려면 다음 단계를 따르십시오. 오래 걸리지 않습니다."
+
+#: /home/ruben/Projects/Cura/resources/qml/WelcomePages/WelcomeContent.qml:58
+msgctxt "@button"
+msgid "Get started"
+msgstr "시작하기"
+
+#: MachineSettingsAction/plugin.json
msgctxt "description"
-msgid "Allows saving the resulting slice as an X3G file, to support printers that read this format (Malyan, Makerbot and other Sailfish-based printers)."
-msgstr "결과로 생성된 슬라이스를 X3G 파일로 저장해, 이 형식을 읽는 프린터를 지원합니다(Malyan, Makerbot 및 다른 Sailfish 기반 프린터)."
+msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)."
+msgstr "기계 설정 (예 : 빌드 볼륨, 노즐 크기 등)을 변경하는 방법을 제공합니다."
-#: X3GWriter/plugin.json
+#: MachineSettingsAction/plugin.json
msgctxt "name"
-msgid "X3GWriter"
-msgstr "X3GWriter"
+msgid "Machine Settings action"
+msgstr "컴퓨터 설정 작업"
+
+#: Toolbox/plugin.json
+msgctxt "description"
+msgid "Find, manage and install new Cura packages."
+msgstr "새 Cura 패키지를 찾고, 관리하고 설치하십시오."
+
+#: Toolbox/plugin.json
+msgctxt "name"
+msgid "Toolbox"
+msgstr "도구 상자"
+
+#: XRayView/plugin.json
+msgctxt "description"
+msgid "Provides the X-Ray view."
+msgstr "엑스레이 뷰를 제공합니다."
+
+#: XRayView/plugin.json
+msgctxt "name"
+msgid "X-Ray View"
+msgstr "엑스레이 뷰"
+
+#: X3DReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading X3D files."
+msgstr "X3D 파일을 읽을 수 있도록 지원합니다."
+
+#: X3DReader/plugin.json
+msgctxt "name"
+msgid "X3D Reader"
+msgstr "X3D 리더"
+
+#: GCodeWriter/plugin.json
+msgctxt "description"
+msgid "Writes g-code to a file."
+msgstr "G Code를 파일에 씁니다."
+
+#: GCodeWriter/plugin.json
+msgctxt "name"
+msgid "G-code Writer"
+msgstr "GCode 작성자"
+
+#: ModelChecker/plugin.json
+msgctxt "description"
+msgid "Checks models and print configuration for possible printing issues and give suggestions."
+msgstr "가능한 프린팅 문제를 위해 모델 및 인쇄 구성을 확인하고 제안합니다."
+
+#: ModelChecker/plugin.json
+msgctxt "name"
+msgid "Model Checker"
+msgstr "모델 검사기"
+
+#: cura-god-mode-plugin/src/GodMode/plugin.json
+msgctxt "description"
+msgid "Dump the contents of all settings to a HTML file."
+msgstr "모든 설정의 내용을 HTML 파일로 덤프하십시오."
+
+#: cura-god-mode-plugin/src/GodMode/plugin.json
+msgctxt "name"
+msgid "God Mode"
+msgstr "God 모드"
+
+#: FirmwareUpdater/plugin.json
+msgctxt "description"
+msgid "Provides a machine actions for updating firmware."
+msgstr "펌웨어 업데이트를 위한 기계 동작을 제공합니다."
+
+#: FirmwareUpdater/plugin.json
+msgctxt "name"
+msgid "Firmware Updater"
+msgstr "펌웨어 업데이터"
+
+#: ProfileFlattener/plugin.json
+msgctxt "description"
+msgid "Create a flattened quality changes profile."
+msgstr "평평한 품질 변경 프로필을 만듭니다."
+
+#: ProfileFlattener/plugin.json
+msgctxt "name"
+msgid "Profile Flattener"
+msgstr "프로필 플래트너"
+
+#: AMFReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading AMF files."
+msgstr "AMF 파일 읽기가 지원됩니다."
+
+#: AMFReader/plugin.json
+msgctxt "name"
+msgid "AMF Reader"
+msgstr "AMF 리더"
+
+#: USBPrinting/plugin.json
+msgctxt "description"
+msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware."
+msgstr "G-코드를 수신하고 프린터로 보냅니다. 플러그인은 또한 펌웨어를 업데이트 할 수 있습니다."
+
+#: USBPrinting/plugin.json
+msgctxt "name"
+msgid "USB printing"
+msgstr "USB 프린팅"
+
+#: GCodeGzWriter/plugin.json
+msgctxt "description"
+msgid "Writes g-code to a compressed archive."
+msgstr "압축 된 아카이브에 g-code를 씁니다."
+
+#: GCodeGzWriter/plugin.json
+msgctxt "name"
+msgid "Compressed G-code Writer"
+msgstr "압축 된 G 코드 작성기"
+
+#: UFPWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for writing Ultimaker Format Packages."
+msgstr "Ultimaker 포맷 패키지 작성을 지원합니다."
+
+#: UFPWriter/plugin.json
+msgctxt "name"
+msgid "UFP Writer"
+msgstr "UFP 작성자"
+
+#: PrepareStage/plugin.json
+msgctxt "description"
+msgid "Provides a prepare stage in Cura."
+msgstr "Cura에서 준비 단계 제공."
+
+#: PrepareStage/plugin.json
+msgctxt "name"
+msgid "Prepare Stage"
+msgstr "준비 단계"
+
+#: RemovableDriveOutputDevice/plugin.json
+msgctxt "description"
+msgid "Provides removable drive hotplugging and writing support."
+msgstr "이동식 드라이브를 제공합니다."
+
+#: RemovableDriveOutputDevice/plugin.json
+msgctxt "name"
+msgid "Removable Drive Output Device Plugin"
+msgstr "이동식 드라이브 출력 장치 플러그인"
+
+#: UM3NetworkPrinting/plugin.json
+msgctxt "description"
+msgid "Manages network connections to Ultimaker 3 printers."
+msgstr "Ultimaker 3 프린터에 대한 네트워크 연결을 관리합니다."
+
+#: UM3NetworkPrinting/plugin.json
+msgctxt "name"
+msgid "UM3 Network Connection"
+msgstr "UM3 네트워크 연결"
+
+#: SettingsGuide/plugin.json
+msgctxt "description"
+msgid "Provides extra information and explanations about settings in Cura, with images and animations."
+msgstr "이미지 및 애니메이션과 함께 Cura 설정에 대한 추가 정보와 설명을 제공합니다."
+
+#: SettingsGuide/plugin.json
+msgctxt "name"
+msgid "Settings Guide"
+msgstr "설정 가이드"
+
+#: MonitorStage/plugin.json
+msgctxt "description"
+msgid "Provides a monitor stage in Cura."
+msgstr "Cura에서 모니터 단계 제공."
+
+#: MonitorStage/plugin.json
+msgctxt "name"
+msgid "Monitor Stage"
+msgstr "모니터 단계"
+
+#: FirmwareUpdateChecker/plugin.json
+msgctxt "description"
+msgid "Checks for firmware updates."
+msgstr "펌웨어 업데이트를 확인합니다."
+
+#: FirmwareUpdateChecker/plugin.json
+msgctxt "name"
+msgid "Firmware Update Checker"
+msgstr "펌웨어 업데이트 검사기"
+
+#: SimulationView/plugin.json
+msgctxt "description"
+msgid "Provides the Simulation view."
+msgstr "시뮬레이션 뷰를 제공합니다."
+
+#: SimulationView/plugin.json
+msgctxt "name"
+msgid "Simulation View"
+msgstr "시뮬레이션 뷰"
+
+#: GCodeGzReader/plugin.json
+msgctxt "description"
+msgid "Reads g-code from a compressed archive."
+msgstr "압축 된 아카이브로 부터 g-code를 읽습니다."
+
+#: GCodeGzReader/plugin.json
+msgctxt "name"
+msgid "Compressed G-code Reader"
+msgstr "압축 된 G 코드 리더기"
+
+#: PostProcessingPlugin/plugin.json
+msgctxt "description"
+msgid "Extension that allows for user created scripts for post processing"
+msgstr "후처리를 위해 사용자가 만든 스크립트를 허용하는 확장 프로그램"
+
+#: PostProcessingPlugin/plugin.json
+msgctxt "name"
+msgid "Post Processing"
+msgstr "후처리"
+
+#: SupportEraser/plugin.json
+msgctxt "description"
+msgid "Creates an eraser mesh to block the printing of support in certain places"
+msgstr "특정 장소에서 서포트 프린팅을 막는 지우개 메쉬(eraser mesh)를 만듭니다"
+
+#: SupportEraser/plugin.json
+msgctxt "name"
+msgid "Support Eraser"
+msgstr "Support Eraser"
+
+#: UFPReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading Ultimaker Format Packages."
+msgstr "Ultimaker 포맷 패키지 읽기를 지원합니다."
+
+#: UFPReader/plugin.json
+msgctxt "name"
+msgid "UFP Reader"
+msgstr "UFP 리더기"
+
+#: SliceInfoPlugin/plugin.json
+msgctxt "description"
+msgid "Submits anonymous slice info. Can be disabled through preferences."
+msgstr "익명의 슬라이스 정보를 제출하십시오. 환경 설정을 통해 비활성화 할 수 있습니다."
+
+#: SliceInfoPlugin/plugin.json
+msgctxt "name"
+msgid "Slice info"
+msgstr "슬라이스 정보"
+
+#: XmlMaterialProfile/plugin.json
+msgctxt "description"
+msgid "Provides capabilities to read and write XML-based material profiles."
+msgstr "XML 기반 재료 프로파일을 읽고 쓸 수있는 기능을 제공합니다."
+
+#: XmlMaterialProfile/plugin.json
+msgctxt "name"
+msgid "Material Profiles"
+msgstr "재료 프로파일"
+
+#: LegacyProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing profiles from legacy Cura versions."
+msgstr "레거시 Cura 버전에서 프로파일 가져 오기를 지원합니다."
+
+#: LegacyProfileReader/plugin.json
+msgctxt "name"
+msgid "Legacy Cura Profile Reader"
+msgstr "레거시 Cura 프로파일 리더"
+
+#: GCodeProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing profiles from g-code files."
+msgstr "G-코드 파일에서 프로파일 가져 오기를 지원합니다."
+
+#: GCodeProfileReader/plugin.json
+msgctxt "name"
+msgid "G-code Profile Reader"
+msgstr "GCode 프로파일 리더기"
+
+#: VersionUpgrade/VersionUpgrade32to33/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.2 to Cura 3.3."
+msgstr "Cura 3.2에서 Cura 3.3으로 구성을 업그레이드합니다."
+
+#: VersionUpgrade/VersionUpgrade32to33/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.2 to 3.3"
+msgstr "3.2에서 3.3으로 버전 업그레이드"
+
+#: VersionUpgrade/VersionUpgrade33to34/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.3 to Cura 3.4."
+msgstr "Cura 3.3에서 Cura 3.4로 구성을 업그레이드합니다."
+
+#: VersionUpgrade/VersionUpgrade33to34/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.3 to 3.4"
+msgstr "버전 업그레이드 3.3에서 3.4"
+
+#: VersionUpgrade/VersionUpgrade25to26/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
+msgstr "Cura 2.5에서 Cura 2.6으로 구성을 업그레이드합니다."
+
+#: VersionUpgrade/VersionUpgrade25to26/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.5 to 2.6"
+msgstr "2.5에서 2.6으로 버전 업그레이드"
+
+#: VersionUpgrade/VersionUpgrade27to30/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
+msgstr "Cura 2.7에서 Cura 3.0으로 구성을 업그레이드합니다."
+
+#: VersionUpgrade/VersionUpgrade27to30/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.7 to 3.0"
+msgstr "2.7에서 3.0으로 버전 업그레이드"
+
+#: VersionUpgrade/VersionUpgrade35to40/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.5 to Cura 4.0."
+msgstr "Cura 3.5에서 Cura 4.0으로 구성을 업그레이드합니다."
+
+#: VersionUpgrade/VersionUpgrade35to40/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.5 to 4.0"
+msgstr "버전 업그레이드 3.5에서 4.0"
+
+#: VersionUpgrade/VersionUpgrade34to35/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.4 to Cura 3.5."
+msgstr "Cura 3.4에서 Cura 3.5로 구성을 업그레이드합니다."
+
+#: VersionUpgrade/VersionUpgrade34to35/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.4 to 3.5"
+msgstr "3.4에서 3.5로 버전 업그레이드"
+
+#: VersionUpgrade/VersionUpgrade40to41/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 4.0 to Cura 4.1."
+msgstr "Cura 4.0에서 Cura 4.1로 구성을 업그레이드합니다."
+
+#: VersionUpgrade/VersionUpgrade40to41/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 4.0 to 4.1"
+msgstr "버전 업그레이드 4.0에서 4.1"
+
+#: VersionUpgrade/VersionUpgrade30to31/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 3.0 to Cura 3.1."
+msgstr "Cura 3.0에서 Cura 3.1로 구성을 업그레이드합니다."
+
+#: VersionUpgrade/VersionUpgrade30to31/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 3.0 to 3.1"
+msgstr "3.0에서 3.1로 버전 업그레이드"
+
+#: VersionUpgrade/VersionUpgrade41to42/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 4.1 to Cura 4.2."
+msgstr "Cura 4.1에서 Cura 4.2로 구성을 업그레이드합니다."
+
+#: VersionUpgrade/VersionUpgrade41to42/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 4.1 to 4.2"
+msgstr "4.1에서 4.2로 버전 업그레이드"
+
+#: VersionUpgrade/VersionUpgrade26to27/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
+msgstr "Cura 2.6에서 Cura 2.7로 구성을 업그레이드합니다."
+
+#: VersionUpgrade/VersionUpgrade26to27/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.6 to 2.7"
+msgstr "2.6에서 2.7으로 버전 업그레이드"
+
+#: VersionUpgrade/VersionUpgrade21to22/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
+msgstr "Cura 2.1에서 Cura 2.2로 구성을 업그레이드합니다."
+
+#: VersionUpgrade/VersionUpgrade21to22/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.1 to 2.2"
+msgstr "2.1에서 2.2로 버전 업그레이드"
+
+#: VersionUpgrade/VersionUpgrade22to24/plugin.json
+msgctxt "description"
+msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
+msgstr "Cura 2.2에서 Cura 2.4로 구성을 업그레이드합니다."
+
+#: VersionUpgrade/VersionUpgrade22to24/plugin.json
+msgctxt "name"
+msgid "Version Upgrade 2.2 to 2.4"
+msgstr "2.2에서 2.4로 버전 업그레이드"
+
+#: ImageReader/plugin.json
+msgctxt "description"
+msgid "Enables ability to generate printable geometry from 2D image files."
+msgstr "2D 이미지 파일에서 프린팅 가능한 지오메트리를 생성 할 수 있습니다."
+
+#: ImageReader/plugin.json
+msgctxt "name"
+msgid "Image Reader"
+msgstr "이미지 리더"
+
+#: CuraEngineBackend/plugin.json
+msgctxt "description"
+msgid "Provides the link to the CuraEngine slicing backend."
+msgstr "CuraEngine 슬라이스 백엔드 링크를 제공합니다."
+
+#: CuraEngineBackend/plugin.json
+msgctxt "name"
+msgid "CuraEngine Backend"
+msgstr "CuraEngine 백엔드"
+
+#: PerObjectSettingsTool/plugin.json
+msgctxt "description"
+msgid "Provides the Per Model Settings."
+msgstr "모델 별 설정을 제공합니다."
+
+#: PerObjectSettingsTool/plugin.json
+msgctxt "name"
+msgid "Per Model Settings Tool"
+msgstr "모델 별 설정 도구"
+
+#: 3MFReader/plugin.json
+msgctxt "description"
+msgid "Provides support for reading 3MF files."
+msgstr "3MF 파일 읽기 지원."
+
+#: 3MFReader/plugin.json
+msgctxt "name"
+msgid "3MF Reader"
+msgstr "3MF 리더"
+
+#: SolidView/plugin.json
+msgctxt "description"
+msgid "Provides a normal solid mesh view."
+msgstr "일반 솔리드 메쉬보기를 제공합니다."
+
+#: SolidView/plugin.json
+msgctxt "name"
+msgid "Solid View"
+msgstr "솔리드 뷰"
+
+#: GCodeReader/plugin.json
+msgctxt "description"
+msgid "Allows loading and displaying G-code files."
+msgstr "G-코드 파일을 로드하고 표시 할 수 있습니다."
+
+#: GCodeReader/plugin.json
+msgctxt "name"
+msgid "G-code Reader"
+msgstr "G-코드 리더"
+
+#: CuraDrive/plugin.json
+msgctxt "description"
+msgid "Backup and restore your configuration."
+msgstr "구성을 백업하고 복원합니다."
+
+#: CuraDrive/plugin.json
+msgctxt "name"
+msgid "Cura Backups"
+msgstr "Cura 백업"
+
+#: CuraProfileWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for exporting Cura profiles."
+msgstr "Cura 프로파일 내보내기 지원을 제공합니다."
+
+#: CuraProfileWriter/plugin.json
+msgctxt "name"
+msgid "Cura Profile Writer"
+msgstr "Cura 프로파일 작성자"
+
+#: CuraPrintProfileCreator/plugin.json
+msgctxt "description"
+msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI."
+msgstr "재료 제조사가 드롭 인 UI를 사용하여 새로운 재료와 품질 프로파일을 만들 수 있게 합니다."
+
+#: CuraPrintProfileCreator/plugin.json
+msgctxt "name"
+msgid "Print Profile Assistant"
+msgstr "프린트 프로파일 어시스턴트"
+
+#: 3MFWriter/plugin.json
+msgctxt "description"
+msgid "Provides support for writing 3MF files."
+msgstr "3MF 파일 작성 지원을 제공합니다."
+
+#: 3MFWriter/plugin.json
+msgctxt "name"
+msgid "3MF Writer"
+msgstr "3MF 기록기"
+
+#: PreviewStage/plugin.json
+msgctxt "description"
+msgid "Provides a preview stage in Cura."
+msgstr "Cura에서 미리 보기 단계를 제공합니다."
+
+#: PreviewStage/plugin.json
+msgctxt "name"
+msgid "Preview Stage"
+msgstr "미리 보기 단계"
+
+#: UltimakerMachineActions/plugin.json
+msgctxt "description"
+msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)."
+msgstr "Ultimaker 기계에 대한 기계 작동 제공(예 : 침대 수평 조정 마법사, 업그레이드 선택 등)"
+
+#: UltimakerMachineActions/plugin.json
+msgctxt "name"
+msgid "Ultimaker machine actions"
+msgstr "Ultimaker 기기 동작"
+
+#: CuraProfileReader/plugin.json
+msgctxt "description"
+msgid "Provides support for importing Cura profiles."
+msgstr "Cura 프로파일 가져 오기 지원을 제공합니다."
+
+#: CuraProfileReader/plugin.json
+msgctxt "name"
+msgid "Cura Profile Reader"
+msgstr "Cura 프로파일 리더"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Cura Settings Guide"
+#~ msgstr "Cura 설정 가이드"
+
+#~ msgctxt "@info:generic"
+#~ msgid "Settings have been changed to match the current availability of extruders: [%s]"
+#~ msgstr "현재 사용가능한 익스트루더: [% s]에 맞도록 설정이 변경되었습니다"
+
+#~ msgctxt "@title:groupbox"
+#~ msgid "User description"
+#~ msgstr "사용자 설명"
+
+#~ msgctxt "@info"
+#~ msgid "These options are not available because you are monitoring a cloud printer."
+#~ msgstr "Cloud 프린터를 모니터링하고 있기 때문에 이 옵션을 사용할 수 없습니다."
+
+#~ msgctxt "@label link to connect manager"
+#~ msgid "Go to Cura Connect"
+#~ msgstr "Cura Connect로 이동"
+
+#~ msgctxt "@info"
+#~ msgid "All jobs are printed."
+#~ msgstr "모든 작업이 인쇄됩니다."
+
+#~ msgctxt "@label link to connect manager"
+#~ msgid "View print history"
+#~ msgstr "인쇄 내역 보기"
+
+#~ msgctxt "@label"
+#~ 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 ""
+#~ "네트워크를 통해 프린터로 직접 프린팅하려면 네트워크 케이블을 사용하거나 프린터를 WIFI 네트워크에 연결하여 프린터가 네트워크에 연결되어 있는지 확인하십시오. Cura를 프린터에 연결하지 않은 경우에도 USB 드라이브를 사용하여 g 코드 파일을 프린터로 전송할 수 있습니다\n"
+#~ "\n"
+#~ "아래 목록에서 프린터를 선택하십시오:"
+
+#~ msgctxt "@info"
+#~ 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 ""
+#~ "프린터에 연결이 있는지 확인하십시오.\n"
+#~ "- 프린터가 켜져 있는지 확인하십시오.\n"
+#~ "- 프린터가 네트워크에 연결되어 있는지 확인하십시오."
+
+#~ msgctxt "@option:check"
+#~ msgid "See only current build plate"
+#~ msgstr "현재의 빌드 플레이트만 보기"
+
+#~ msgctxt "@action:button"
+#~ msgid "Arrange to all build plates"
+#~ msgstr "모든 빌드 플레이트 정렬"
+
+#~ msgctxt "@action:button"
+#~ msgid "Arrange current build plate"
+#~ msgstr "현재의 빌드 플레이트 정렬"
+
+#~ msgctxt "description"
+#~ msgid "Allows saving the resulting slice as an X3G file, to support printers that read this format (Malyan, Makerbot and other Sailfish-based printers)."
+#~ msgstr "결과로 생성된 슬라이스를 X3G 파일로 저장해, 이 형식을 읽는 프린터를 지원합니다(Malyan, Makerbot 및 다른 Sailfish 기반 프린터)."
+
+#~ msgctxt "name"
+#~ msgid "X3GWriter"
+#~ msgstr "X3GWriter"
+
+#~ msgctxt "description"
+#~ msgid "Reads SVG files as toolpaths, for debugging printer movements."
+#~ msgstr "프린터 이동 디버깅을 위해 Toolpath로 SVG 파일을 읽습니다."
+
+#~ msgctxt "name"
+#~ msgid "SVG Toolpath Reader"
+#~ msgstr "SVG Toolpath 리더기"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Changelog"
+#~ msgstr "변경 내역"
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Show Changelog"
+#~ msgstr "변경 내역 표시"
+
+#~ msgctxt "@info:status"
+#~ msgid "Sending data to remote cluster"
+#~ msgstr "원격 클러스터로 데이터 전송 중"
+
+#~ msgctxt "@info:status"
+#~ msgid "Connect to Ultimaker Cloud"
+#~ msgstr "Ultimaker Cloud에 연결"
+
+#~ msgctxt "@info"
+#~ msgid "Cura collects anonymized usage statistics."
+#~ msgstr "Cura는 익명의 사용 통계를 수집합니다."
+
+#~ msgctxt "@info:title"
+#~ msgid "Collecting Data"
+#~ msgstr "데이터 수집"
+
+#~ msgctxt "@action:button"
+#~ msgid "More info"
+#~ msgstr "추가 정보"
+
+#~ msgctxt "@action:tooltip"
+#~ msgid "See more information on what data Cura sends."
+#~ msgstr "Cura가 전송하는 데이터에 대한 추가 정보를 확인하십시오."
+
+#~ msgctxt "@action:button"
+#~ msgid "Allow"
+#~ msgstr "허용"
+
+#~ msgctxt "@action:tooltip"
+#~ msgid "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."
+#~ msgstr "Cura가 익명의 사용 통계를 보내 Cura에 대한 향후 개선을 우선화하는 데 도움을 줍니다. Cura 버전과 슬라이싱하는 모델의 해쉬 등 일부 환경설정 값이 발송됩니다."
+
+#~ msgctxt "@item:inmenu"
+#~ msgid "Evaluation"
+#~ msgstr "평가"
+
+#~ msgctxt "@info:title"
+#~ msgid "Network enabled printers"
+#~ msgstr "네트워크 프린터"
+
+#~ msgctxt "@info:title"
+#~ msgid "Local printers"
+#~ msgstr "로컬 프린터"
+
+#~ msgctxt "@info:backup_failed"
+#~ msgid "Tried to restore a Cura backup that does not match your current version."
+#~ msgstr "현재 버전과 일치하지 않는 Cura 백업을 복원하려고 시도했습니다."
+
+#~ msgctxt "@title"
+#~ msgid "Machine Settings"
+#~ msgstr "기기 설정"
+
+#~ msgctxt "@label"
+#~ msgid "Printer Settings"
+#~ msgstr "프린터 설정"
+
+#~ msgctxt "@option:check"
+#~ msgid "Origin at center"
+#~ msgstr "중앙이 원점"
+
+#~ msgctxt "@option:check"
+#~ msgid "Heated bed"
+#~ msgstr "히트 베드"
+
+#~ msgctxt "@label"
+#~ msgid "Printhead Settings"
+#~ msgstr "프린트헤드 설정"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "프린트 헤드 왼쪽에서 노즐 중심까지의 거리. \"한 번에 하나\"를 프린팅 할 때 이전 프린팅물과 프린팅 헤드 사이의 충돌을 방지하는 데 사용됩니다."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "프린트 헤드 전면에서 노즐 중앙까지의 거리. \"한 번에 하나\"를 프린팅 할 때 이전 프린팅물과 프린팅 헤드 사이의 충돌을 방지하는 데 사용됩니다."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "프린트 헤드의 오른쪽에서 노즐 중앙까지의 거리. \"한 번에 하나\"를 프린팅 할 때 이전 프린팅물과 프린팅 헤드 사이의 충돌을 방지하는 데 사용됩니다."
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "프린트 헤드의 뒤쪽에서 노즐 중심까지의 거리. \"한 번에 하나\"를 프린팅 할 때 이전 프린팅물과 프린팅 헤드 사이의 충돌을 방지하는 데 사용됩니다."
+
+#~ msgctxt "@label"
+#~ msgid "Gantry height"
+#~ msgstr "갠트리 높이"
+
+#~ msgctxt "@tooltip"
+#~ msgid "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\"."
+#~ msgstr "노즐 끝과 갠트리 시스템 사이의 높이 차이 (X 및 Y 축). \"한 번에 하나\"를 프린팅 할 때 이전 프린팅물과 갠트리 사이의 충돌을 방지하는 데 사용됩니다."
+
+#~ msgctxt "@label"
+#~ msgid "Start G-code"
+#~ msgstr "시작 Gcode"
+
+#~ msgctxt "@tooltip"
+#~ msgid "G-code commands to be executed at the very start."
+#~ msgstr "시작시 Gcode 명령이 실행됩니다."
+
+#~ msgctxt "@label"
+#~ msgid "End G-code"
+#~ msgstr "종료 Gcode"
+
+#~ msgctxt "@tooltip"
+#~ msgid "G-code commands to be executed at the very end."
+#~ msgstr "Gcode 명령어가 맨 마지막에 실행됩니다."
+
+#~ msgctxt "@label"
+#~ msgid "Nozzle Settings"
+#~ msgstr "노즐 설정"
+
+#~ msgctxt "@tooltip"
+#~ msgid "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile."
+#~ msgstr "프린터가 지원하는 필라멘트의 직경. 정확한 직경은 소재 및 / 또는 프로파일에 의해 덮어써집니다."
+
+#~ msgctxt "@label"
+#~ msgid "Extruder Start G-code"
+#~ msgstr "익스트루더 시작 Gcode"
+
+#~ msgctxt "@label"
+#~ msgid "Extruder End G-code"
+#~ msgstr "익스트루더 종료 Gcode"
+
+#~ msgctxt "@label"
+#~ msgid "Changelog"
+#~ msgstr "변경 내역"
+
+#~ msgctxt "@title:window"
+#~ msgid "User Agreement"
+#~ msgstr "사용자 계약"
+
+#~ msgctxt "@alabel"
+#~ msgid "Enter the IP address or hostname of your printer on the network."
+#~ msgstr "네트워크에 프린터의 IP 주소 또는 호스트 이름을 입력하십시오."
+
+#~ msgctxt "@info"
+#~ msgid "Please select a network connected printer to monitor."
+#~ msgstr "네트워크 연결 프린터를 선택하여 모니터링하십시오."
+
+#~ msgctxt "@info"
+#~ msgid "Please connect your Ultimaker printer to your local network."
+#~ msgstr "Ultimaker 프린터를 로컬 네트워크에 연결하십시오."
+
+#~ msgctxt "@text:window"
+#~ msgid "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."
+#~ msgstr "Cura는 인쇄 품질 및 사용자 환경을 개선하기 위해 익명 데이터를 Ultimaker로 전송합니다. 전송되는 모든 데이터에 대한 예는 다음과 같습니다."
+
+#~ msgctxt "@text:window"
+#~ msgid "I don't want to send this data"
+#~ msgstr "이 데이터 전송을 원하지 않습니다"
+
+#~ msgctxt "@text:window"
+#~ msgid "Allow sending this data to Ultimaker and help us improve Cura"
+#~ msgstr "이 데이터를 Ultimaker에 전송해 Cura 개선에 도움을 주고 싶습니다"
+
+#~ msgctxt "@label"
+#~ msgid "No print selected"
+#~ msgstr "선택한 인쇄 없음"
+
+#~ msgctxt "@info:tooltip"
+#~ msgid "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."
+#~ msgstr "기본적으로 흰색 픽셀은 메쉬에서 높은 점을 나타내고 검정색 픽셀은 메쉬에서 낮은 점을 나타냅니다. 이 옵션을 변경하면 검은 픽셀이 메쉬의 높은 점을 나타내고 흰색 픽셀은 메쉬의 낮은 점을 나타냅니다."
+
+#~ msgctxt "@title"
+#~ msgid "Select Printer Upgrades"
+#~ msgstr "프린터 업그레이드 선택"
+
+#~ msgctxt "@label"
+#~ msgid "Select which extruder to use for support. This will build up supporting structures below the model to prevent the model from sagging or printing in mid air."
+#~ msgstr "서포트에 사용할 익스트루더를 선택하십시오. 이렇게 하면 모형 아래에 지지 구조가 만들어져 모델이 중간 공기에서 처지거나 프린팅되는 것을 방지합니다."
+
+#~ 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 "현재 재료 및 노즐 구성에 대해 이 품질 프로파일을 사용할 수 없습니다. 이 품질 프로파일을 활성화하려면 이를 변경하십시오"
+
+#~ msgctxt "@label shown when we load a Gcode file"
+#~ msgid "Print setup disabled. G code file can not be modified."
+#~ msgstr "인쇄 설정 비활성화됨. G 코드 파일을 수정할 수 없습니다."
+
+#~ msgctxt "@label"
+#~ msgid "See the material compatibility chart"
+#~ msgstr "재료 호환성 차트 보기"
+
+#~ msgctxt "@label"
+#~ msgid "View types"
+#~ msgstr "유형 보기"
+
+#~ msgctxt "@label"
+#~ msgid "Hi "
+#~ msgstr "안녕하세요 "
+
+#~ msgctxt "@text"
+#~ 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 ""
+#~ "- 인쇄 작업을 로컬 네트워크 외부의 Ultimaker 프린터로 전송하십시오\n"
+#~ "- Ultimaker Cura 설정을 어디에서든 사용할 수 있도록 Cloud에 저장하십시오\n"
+#~ "- 유수 브랜드의 재료 프로파일에 대한 독점적 액세스 권한을 얻으십시오"
+
+#~ msgctxt "@label:PrintjobStatus"
+#~ msgid "Unable to Slice"
+#~ msgstr "슬라이스 할 수 없음"
+
+#~ msgctxt "@label"
+#~ msgid "Time specification"
+#~ msgstr "시간 사양"
+
+#~ msgctxt "@label"
+#~ msgid "Material specification"
+#~ msgstr "재료 사양"
+
+#~ msgctxt "@title:tab"
+#~ msgid "Add a printer to Cura"
+#~ msgstr "Cura에 프린터 추가"
+
+#~ msgctxt "@title:tab"
+#~ 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 ""
+#~ "아래 목록에서 사용하고자 하는 프린터를 선택하십시오.\n"
+#~ "\n"
+#~ "프린터가 목록에 없을 경우 “사용자 정의” 범주에서 “사용자 정의 FFF 프린터\"를 사용하고 다음 대화 상자의 프린터와 일치하도록 설정을 조정하십시오."
+
+#~ msgctxt "@label"
+#~ msgid "Manufacturer"
+#~ msgstr "제조업체"
+
+#~ msgctxt "@label"
+#~ msgid "Printer Name"
+#~ msgstr "프린터 이름"
+
+#~ msgctxt "@action:button"
+#~ msgid "Add Printer"
+#~ msgstr "프린터 추가"
#~ msgid "Modify G-Code"
#~ msgstr "G 코드 수정"
@@ -5328,62 +6240,6 @@ msgstr "X3GWriter"
#~ msgid "Click to check the material compatibility on Ultimaker.com."
#~ msgstr "Ultimaker.com의 재료 호환성을 확인하려면 클릭하십시오."
-#~ msgctxt "description"
-#~ msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)."
-#~ msgstr "기계 설정 (예 : 빌드 볼륨, 노즐 크기 등)을 변경하는 방법을 제공합니다."
-
-#~ msgctxt "name"
-#~ msgid "Machine Settings action"
-#~ msgstr "컴퓨터 설정 작업"
-
-#~ msgctxt "description"
-#~ msgid "Find, manage and install new Cura packages."
-#~ msgstr "새 Cura 패키지를 찾고, 관리하고 설치하십시오."
-
-#~ msgctxt "name"
-#~ msgid "Toolbox"
-#~ msgstr "도구 상자"
-
-#~ msgctxt "description"
-#~ msgid "Provides the X-Ray view."
-#~ msgstr "엑스레이 뷰를 제공합니다."
-
-#~ msgctxt "name"
-#~ msgid "X-Ray View"
-#~ msgstr "엑스레이 뷰"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for reading X3D files."
-#~ msgstr "X3D 파일을 읽을 수 있도록 지원합니다."
-
-#~ msgctxt "name"
-#~ msgid "X3D Reader"
-#~ msgstr "X3D 리더"
-
-#~ msgctxt "description"
-#~ msgid "Writes g-code to a file."
-#~ msgstr "G Code를 파일에 씁니다."
-
-#~ msgctxt "name"
-#~ msgid "G-code Writer"
-#~ msgstr "GCode 작성자"
-
-#~ msgctxt "description"
-#~ msgid "Checks models and print configuration for possible printing issues and give suggestions."
-#~ msgstr "가능한 프린팅 문제를 위해 모델 및 인쇄 구성을 확인하고 제안합니다."
-
-#~ msgctxt "name"
-#~ msgid "Model Checker"
-#~ msgstr "모델 검사기"
-
-#~ msgctxt "description"
-#~ msgid "Dump the contents of all settings to a HTML file."
-#~ msgstr "모든 설정의 내용을 HTML 파일로 덤프하십시오."
-
-#~ msgctxt "name"
-#~ msgid "God Mode"
-#~ msgstr "God 모드"
-
#~ msgctxt "description"
#~ msgid "Shows changes since latest checked version."
#~ msgstr "최신 체크 버전 이후로 변경 사항을 표시합니다."
@@ -5392,14 +6248,6 @@ msgstr "X3GWriter"
#~ msgid "Changelog"
#~ msgstr "변경 내역"
-#~ msgctxt "description"
-#~ msgid "Provides a machine actions for updating firmware."
-#~ msgstr "펌웨어 업데이트를 위한 기계 동작을 제공합니다."
-
-#~ msgctxt "name"
-#~ msgid "Firmware Updater"
-#~ msgstr "펌웨어 업데이터"
-
#~ msgctxt "description"
#~ msgid "Create a flattend quality changes profile."
#~ msgstr "Create a flattend quality changes profile."
@@ -5408,14 +6256,6 @@ msgstr "X3GWriter"
#~ msgid "Profile flatener"
#~ msgstr "Profile flatener"
-#~ msgctxt "description"
-#~ msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware."
-#~ msgstr "G-코드를 수신하고 프린터로 보냅니다. 플러그인은 또한 펌웨어를 업데이트 할 수 있습니다."
-
-#~ msgctxt "name"
-#~ msgid "USB printing"
-#~ msgstr "USB 프린팅"
-
#~ msgctxt "description"
#~ msgid "Ask the user once if he/she agrees with our license."
#~ msgstr "사용자에게 라이선스에 동의하는지 한 번 묻습니다."
@@ -5424,278 +6264,6 @@ msgstr "X3GWriter"
#~ msgid "UserAgreement"
#~ msgstr "사용자 계약"
-#~ msgctxt "description"
-#~ msgid "Writes g-code to a compressed archive."
-#~ msgstr "압축 된 아카이브에 g-code를 씁니다."
-
-#~ msgctxt "name"
-#~ msgid "Compressed G-code Writer"
-#~ msgstr "압축 된 G 코드 작성기"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for writing Ultimaker Format Packages."
-#~ msgstr "Ultimaker 포맷 패키지 작성을 지원합니다."
-
-#~ msgctxt "name"
-#~ msgid "UFP Writer"
-#~ msgstr "UFP 작성자"
-
-#~ msgctxt "description"
-#~ msgid "Provides a prepare stage in Cura."
-#~ msgstr "Cura에서 준비 단계 제공."
-
-#~ msgctxt "name"
-#~ msgid "Prepare Stage"
-#~ msgstr "준비 단계"
-
-#~ msgctxt "description"
-#~ msgid "Provides removable drive hotplugging and writing support."
-#~ msgstr "이동식 드라이브를 제공합니다."
-
-#~ msgctxt "name"
-#~ msgid "Removable Drive Output Device Plugin"
-#~ msgstr "이동식 드라이브 출력 장치 플러그인"
-
-#~ msgctxt "description"
-#~ msgid "Manages network connections to Ultimaker 3 printers."
-#~ msgstr "Ultimaker 3 프린터에 대한 네트워크 연결을 관리합니다."
-
-#~ msgctxt "name"
-#~ msgid "UM3 Network Connection"
-#~ msgstr "UM3 네트워크 연결"
-
-#~ msgctxt "description"
-#~ msgid "Provides a monitor stage in Cura."
-#~ msgstr "Cura에서 모니터 단계 제공."
-
-#~ msgctxt "name"
-#~ msgid "Monitor Stage"
-#~ msgstr "모니터 단계"
-
-#~ msgctxt "description"
-#~ msgid "Checks for firmware updates."
-#~ msgstr "펌웨어 업데이트를 확인합니다."
-
-#~ msgctxt "name"
-#~ msgid "Firmware Update Checker"
-#~ msgstr "펌웨어 업데이트 검사기"
-
-#~ msgctxt "description"
-#~ msgid "Provides the Simulation view."
-#~ msgstr "시뮬레이션 뷰를 제공합니다."
-
-#~ msgctxt "name"
-#~ msgid "Simulation View"
-#~ msgstr "시뮬레이션 뷰"
-
-#~ msgctxt "description"
-#~ msgid "Reads g-code from a compressed archive."
-#~ msgstr "압축 된 아카이브로 부터 g-code를 읽습니다."
-
-#~ msgctxt "name"
-#~ msgid "Compressed G-code Reader"
-#~ msgstr "압축 된 G 코드 리더기"
-
-#~ msgctxt "description"
-#~ msgid "Extension that allows for user created scripts for post processing"
-#~ msgstr "후처리를 위해 사용자가 만든 스크립트를 허용하는 확장 프로그램"
-
-#~ msgctxt "name"
-#~ msgid "Post Processing"
-#~ msgstr "후처리"
-
-#~ msgctxt "description"
-#~ msgid "Creates an eraser mesh to block the printing of support in certain places"
-#~ msgstr "특정 장소에서 서포트 프린팅을 막는 지우개 메쉬(eraser mesh)를 만듭니다"
-
-#~ msgctxt "name"
-#~ msgid "Support Eraser"
-#~ msgstr "Support Eraser"
-
-#~ msgctxt "description"
-#~ msgid "Submits anonymous slice info. Can be disabled through preferences."
-#~ msgstr "익명의 슬라이스 정보를 제출하십시오. 환경 설정을 통해 비활성화 할 수 있습니다."
-
-#~ msgctxt "name"
-#~ msgid "Slice info"
-#~ msgstr "슬라이스 정보"
-
-#~ msgctxt "description"
-#~ msgid "Provides capabilities to read and write XML-based material profiles."
-#~ msgstr "XML 기반 재료 프로파일을 읽고 쓸 수있는 기능을 제공합니다."
-
-#~ msgctxt "name"
-#~ msgid "Material Profiles"
-#~ msgstr "재료 프로파일"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing profiles from legacy Cura versions."
-#~ msgstr "레거시 Cura 버전에서 프로파일 가져 오기를 지원합니다."
-
-#~ msgctxt "name"
-#~ msgid "Legacy Cura Profile Reader"
-#~ msgstr "레거시 Cura 프로파일 리더"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing profiles from g-code files."
-#~ msgstr "G-코드 파일에서 프로파일 가져 오기를 지원합니다."
-
-#~ msgctxt "name"
-#~ msgid "G-code Profile Reader"
-#~ msgstr "GCode 프로파일 리더기"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.2 to Cura 3.3."
-#~ msgstr "Cura 3.2에서 Cura 3.3으로 구성을 업그레이드합니다."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.2 to 3.3"
-#~ msgstr "3.2에서 3.3으로 버전 업그레이드"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.3 to Cura 3.4."
-#~ msgstr "Cura 3.3에서 Cura 3.4로 구성을 업그레이드합니다."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.3 to 3.4"
-#~ msgstr "버전 업그레이드 3.3에서 3.4"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.5 to Cura 2.6."
-#~ msgstr "Cura 2.5에서 Cura 2.6으로 구성을 업그레이드합니다."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.5 to 2.6"
-#~ msgstr "2.5에서 2.6으로 버전 업그레이드"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.7 to Cura 3.0."
-#~ msgstr "Cura 2.7에서 Cura 3.0으로 구성을 업그레이드합니다."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.7 to 3.0"
-#~ msgstr "2.7에서 3.0으로 버전 업그레이드"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.4 to Cura 3.5."
-#~ msgstr "Cura 3.4에서 Cura 3.5로 구성을 업그레이드합니다."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.4 to 3.5"
-#~ msgstr "3.4에서 3.5로 버전 업그레이드"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 3.0 to Cura 3.1."
-#~ msgstr "Cura 3.0에서 Cura 3.1로 구성을 업그레이드합니다."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 3.0 to 3.1"
-#~ msgstr "3.0에서 3.1로 버전 업그레이드"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.6 to Cura 2.7."
-#~ msgstr "Cura 2.6에서 Cura 2.7로 구성을 업그레이드합니다."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.6 to 2.7"
-#~ msgstr "2.6에서 2.7으로 버전 업그레이드"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.1 to Cura 2.2."
-#~ msgstr "Cura 2.1에서 Cura 2.2로 구성을 업그레이드합니다."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.1 to 2.2"
-#~ msgstr "2.1에서 2.2로 버전 업그레이드"
-
-#~ msgctxt "description"
-#~ msgid "Upgrades configurations from Cura 2.2 to Cura 2.4."
-#~ msgstr "Cura 2.2에서 Cura 2.4로 구성을 업그레이드합니다."
-
-#~ msgctxt "name"
-#~ msgid "Version Upgrade 2.2 to 2.4"
-#~ msgstr "2.2에서 2.4로 버전 업그레이드"
-
-#~ msgctxt "description"
-#~ msgid "Enables ability to generate printable geometry from 2D image files."
-#~ msgstr "2D 이미지 파일에서 프린팅 가능한 지오메트리를 생성 할 수 있습니다."
-
-#~ msgctxt "name"
-#~ msgid "Image Reader"
-#~ msgstr "이미지 리더"
-
-#~ msgctxt "description"
-#~ msgid "Provides the link to the CuraEngine slicing backend."
-#~ msgstr "CuraEngine 슬라이스 백엔드 링크를 제공합니다."
-
-#~ msgctxt "name"
-#~ msgid "CuraEngine Backend"
-#~ msgstr "CuraEngine 백엔드"
-
-#~ msgctxt "description"
-#~ msgid "Provides the Per Model Settings."
-#~ msgstr "모델 별 설정을 제공합니다."
-
-#~ msgctxt "name"
-#~ msgid "Per Model Settings Tool"
-#~ msgstr "모델 별 설정 도구"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for reading 3MF files."
-#~ msgstr "3MF 파일 읽기 지원."
-
-#~ msgctxt "name"
-#~ msgid "3MF Reader"
-#~ msgstr "3MF 리더"
-
-#~ msgctxt "description"
-#~ msgid "Provides a normal solid mesh view."
-#~ msgstr "일반 솔리드 메쉬보기를 제공합니다."
-
-#~ msgctxt "name"
-#~ msgid "Solid View"
-#~ msgstr "솔리드 뷰"
-
-#~ msgctxt "description"
-#~ msgid "Allows loading and displaying G-code files."
-#~ msgstr "G-코드 파일을 로드하고 표시 할 수 있습니다."
-
-#~ msgctxt "name"
-#~ msgid "G-code Reader"
-#~ msgstr "G-코드 리더"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for exporting Cura profiles."
-#~ msgstr "Cura 프로파일 내보내기 지원을 제공합니다."
-
-#~ msgctxt "name"
-#~ msgid "Cura Profile Writer"
-#~ msgstr "Cura 프로파일 작성자"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for writing 3MF files."
-#~ msgstr "3MF 파일 작성 지원을 제공합니다."
-
-#~ msgctxt "name"
-#~ msgid "3MF Writer"
-#~ msgstr "3MF 기록기"
-
-#~ msgctxt "description"
-#~ msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)."
-#~ msgstr "Ultimaker 기계에 대한 기계 작동 제공(예 : 침대 수평 조정 마법사, 업그레이드 선택 등)"
-
-#~ msgctxt "name"
-#~ msgid "Ultimaker machine actions"
-#~ msgstr "Ultimaker 기기 동작"
-
-#~ msgctxt "description"
-#~ msgid "Provides support for importing Cura profiles."
-#~ msgstr "Cura 프로파일 가져 오기 지원을 제공합니다."
-
-#~ msgctxt "name"
-#~ msgid "Cura Profile Reader"
-#~ msgstr "Cura 프로파일 리더"
-
#~ msgctxt "@warning:status"
#~ msgid "Please generate G-code before saving."
#~ msgstr "저장하기 전에 G-code를 생성하십시오."
@@ -5736,14 +6304,6 @@ msgstr "X3GWriter"
#~ msgid "Upgrade Firmware"
#~ msgstr "펌웨어 업그레이드"
-#~ msgctxt "description"
-#~ msgid "Allows material manufacturers to create new material and quality profiles using a drop-in UI."
-#~ msgstr "재료 제조사가 드롭 인 UI를 사용하여 새로운 재료와 품질 프로파일을 만들 수 있게 합니다."
-
-#~ msgctxt "name"
-#~ msgid "Print Profile Assistant"
-#~ msgstr "프린트 프로파일 어시스턴트"
-
#~ msgctxt "@action:button"
#~ msgid "Print with Doodle3D WiFi-Box"
#~ msgstr "Doodle3D WiFi-Box로 프린팅"
diff --git a/resources/i18n/ko_KR/fdmextruder.def.json.po b/resources/i18n/ko_KR/fdmextruder.def.json.po
index 8dc825e5e2..193031e1ae 100644
--- a/resources/i18n/ko_KR/fdmextruder.def.json.po
+++ b/resources/i18n/ko_KR/fdmextruder.def.json.po
@@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0000\n"
+"POT-Creation-Date: 2019-07-16 14:38+0000\n"
"PO-Revision-Date: 2019-03-13 14:00+0200\n"
"Last-Translator: Korean \n"
"Language-Team: Jinbum Kim , Korean \n"
diff --git a/resources/i18n/ko_KR/fdmprinter.def.json.po b/resources/i18n/ko_KR/fdmprinter.def.json.po
index b254d7da57..fa2b0c5314 100644
--- a/resources/i18n/ko_KR/fdmprinter.def.json.po
+++ b/resources/i18n/ko_KR/fdmprinter.def.json.po
@@ -5,12 +5,12 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0000\n"
-"PO-Revision-Date: 2019-03-13 14:00+0200\n"
-"Last-Translator: Korean \n"
-"Language-Team: Jinbum Kim , Korean \n"
+"POT-Creation-Date: 2019-07-16 14:38+0000\n"
+"PO-Revision-Date: 2019-07-29 15:51+0200\n"
+"Last-Translator: Lionbridge \n"
+"Language-Team: Korean , Jinbum Kim , Korean \n"
"Language: ko_KR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -58,7 +58,9 @@ 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"
@@ -70,7 +72,9 @@ 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"
@@ -234,7 +238,7 @@ msgstr "익스트루더의 수. 익스트루더는 피더, 보우 덴 튜브 및
#: fdmprinter.def.json
msgctxt "extruders_enabled_count label"
-msgid "Number of Extruders that are enabled"
+msgid "Number of Extruders That Are Enabled"
msgstr "활성화된 익스트루더의 수"
#: fdmprinter.def.json
@@ -244,8 +248,8 @@ msgstr "사용 가능한 익스트루더 수; 소프트웨어로 자동 설정"
#: fdmprinter.def.json
msgctxt "machine_nozzle_tip_outer_diameter label"
-msgid "Outer nozzle diameter"
-msgstr "노즐의 외경"
+msgid "Outer Nozzle Diameter"
+msgstr "외부 노즐의 외경"
#: fdmprinter.def.json
msgctxt "machine_nozzle_tip_outer_diameter description"
@@ -254,7 +258,7 @@ msgstr "노즐 끝의 외경."
#: fdmprinter.def.json
msgctxt "machine_nozzle_head_distance label"
-msgid "Nozzle length"
+msgid "Nozzle Length"
msgstr "노즐 길이"
#: fdmprinter.def.json
@@ -264,7 +268,7 @@ msgstr "노즐의 끝과 프린트 헤드의 가장 낮은 부분 사이의 높
#: fdmprinter.def.json
msgctxt "machine_nozzle_expansion_angle label"
-msgid "Nozzle angle"
+msgid "Nozzle Angle"
msgstr "노즐 각도"
#: fdmprinter.def.json
@@ -274,7 +278,7 @@ msgstr "노즐 끝 바로 위의 수평면과 원뿔 부분 사이의 각도입
#: fdmprinter.def.json
msgctxt "machine_heat_zone_length label"
-msgid "Heat zone length"
+msgid "Heat Zone Length"
msgstr "가열 영역 길이"
#: fdmprinter.def.json
@@ -304,7 +308,7 @@ msgstr "Cura에서 온도를 제어할지 여부. Cura 외부에서 노즐 온
#: fdmprinter.def.json
msgctxt "machine_nozzle_heat_up_speed label"
-msgid "Heat up speed"
+msgid "Heat Up Speed"
msgstr "가열 속도"
#: fdmprinter.def.json
@@ -314,7 +318,7 @@ msgstr "노즐이 가열되는 속도 (°C/s)는 일반적인 프린팅 온도
#: fdmprinter.def.json
msgctxt "machine_nozzle_cool_down_speed label"
-msgid "Cool down speed"
+msgid "Cool Down Speed"
msgstr "냉각 속도"
#: fdmprinter.def.json
@@ -334,7 +338,7 @@ msgstr "노즐이 냉각되기 전에 익스트루더가 비활성이어야하
#: fdmprinter.def.json
msgctxt "machine_gcode_flavor label"
-msgid "G-code flavour"
+msgid "G-code Flavor"
msgstr "Gcode 유형"
#: fdmprinter.def.json
@@ -399,7 +403,7 @@ msgstr "재료를 리트렉션하는 G1 명령어에서 E 속성을 사용하는
#: fdmprinter.def.json
msgctxt "machine_disallowed_areas label"
-msgid "Disallowed areas"
+msgid "Disallowed Areas"
msgstr "허용되지 않는 지역"
#: fdmprinter.def.json
@@ -419,7 +423,7 @@ msgstr "노즐이 위치할 수 없는 구역의 목록입니다."
#: fdmprinter.def.json
msgctxt "machine_head_polygon label"
-msgid "Machine head polygon"
+msgid "Machine Head Polygon"
msgstr "머신 헤드 폴리곤"
#: fdmprinter.def.json
@@ -429,7 +433,7 @@ msgstr "프린트 헤드의 2D 실루엣 (팬 캡 제외)."
#: fdmprinter.def.json
msgctxt "machine_head_with_fans_polygon label"
-msgid "Machine head & Fan polygon"
+msgid "Machine Head & Fan Polygon"
msgstr "머신 헤드 및 팬 폴리곤"
#: fdmprinter.def.json
@@ -439,7 +443,7 @@ msgstr "프린트 헤드의 2D 실루엣 (팬 뚜껑 포함)."
#: fdmprinter.def.json
msgctxt "gantry_height label"
-msgid "Gantry height"
+msgid "Gantry Height"
msgstr "갠트리 높이"
#: fdmprinter.def.json
@@ -469,7 +473,7 @@ msgstr "노즐의 내경. 비표준 노즐 크기를 사용할 때 이 설정을
#: fdmprinter.def.json
msgctxt "machine_use_extruder_offset_to_offset_coords label"
-msgid "Offset With Extruder"
+msgid "Offset with Extruder"
msgstr "익스트루더로 오프셋"
#: fdmprinter.def.json
@@ -1294,8 +1298,9 @@ msgstr "솔기 코너 환경 설정"
#: fdmprinter.def.json
msgctxt "z_seam_corner description"
-msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner."
-msgstr "모델 외곽선의 모서리가 솔기의 위치에 영향을 줄지 여부를 제어합니다. 이것은 코너가 솔기 위치에 영향을 미치지 않는다는 것을 의미하지 않습니다. 솔기 숨기기는 이음새가 안쪽 모서리에서 발생할 가능성을 높입니다. 솔기 노출은 솔기이 외부 모서리에서 발생할 가능성을 높입니다. 솔기 숨기기 또는 노출은 솔기이 내부나 외부 모서리에서 발생할 가능성을 높입니다."
+msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner. Smart Hiding allows both inside and outside corners, but chooses inside corners more frequently, if appropriate."
+msgstr "모델 외곽선의 모서리가 이음선의 위치에 영향을 주는지 여부를 제어합니다. 이것은 모서리가 이음선 위치에 영향을 미치지 않는다는 것을 의미하지 않습니다. 이음선 숨김은 이음선이 안쪽 모서리에서 발생할 가능성을 높입니다. 이음선 노출은 이음선이 외부 모서리에서 발생할 가능성을"
+" 높입니다. 이음선 숨김 또는 노출은 이음선이 내부나 외부 모서리에서 발생할 가능성을 높입니다. 스마트 숨김은 내외부 모서리 모두 가능하지만, 적절하다면 내부 모서리를 더욱 빈번하게 선택합니다."
#: fdmprinter.def.json
msgctxt "z_seam_corner option z_seam_corner_none"
@@ -1317,6 +1322,11 @@ msgctxt "z_seam_corner option z_seam_corner_any"
msgid "Hide or Expose Seam"
msgstr "솔기 숨기기 또는 노출"
+#: fdmprinter.def.json
+msgctxt "z_seam_corner option z_seam_corner_weighted"
+msgid "Smart Hiding"
+msgstr "스마트 숨김"
+
#: fdmprinter.def.json
msgctxt "z_seam_relative label"
msgid "Z Seam Relative"
@@ -1329,13 +1339,14 @@ msgstr "활성화 된 경우 z 솔기 좌표는 각 부품의 중심을 기준
#: fdmprinter.def.json
msgctxt "skin_no_small_gaps_heuristic label"
-msgid "Ignore Small Z Gaps"
-msgstr "작은 Z 간격 무시"
+msgid "No Skin in Z Gaps"
+msgstr "Z 간격에 스킨 없음"
#: fdmprinter.def.json
msgctxt "skin_no_small_gaps_heuristic description"
-msgid "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting."
-msgstr "모델에 수직 간격이 작으면 이 좁은 공간에서 상단 및 하단 스킨을 생성하는 데 약 5%의 추가적인 계산시간을 소비 할 수 있습니다. 이 경우 설정을 해제하십시오."
+msgid "When the model has small vertical gaps of only a few layers, there should normally be skin around those layers in the narrow space. Enable this setting to not generate skin if the vertical gap is very small. This improves printing time and slicing time, but technically leaves infill exposed to the air."
+msgstr "모델의 몇 가지 레이어에만 수직 간격이 작을 경우 보통 좁은 공간의 본 레이어 주위에도 스킨이 있어야 합니다. 수직 간격이 매우 작을 경우 스킨을 생성하지 않도록 이 설정을 활성화합니다. 이렇게 하면 프린팅 시간과 슬라이싱 시간은 개선되지만 기술적으로 내부채움이 공기 중에"
+" 노출된 상태로 남게 됩니다."
#: fdmprinter.def.json
msgctxt "skin_outline_count label"
@@ -1632,7 +1643,9 @@ 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"
@@ -1864,6 +1877,16 @@ msgctxt "default_material_print_temperature description"
msgid "The default temperature used for printing. This should be the \"base\" temperature of a material. All other print temperatures should use offsets based on this value"
msgstr "프린팅에 사용되는 기본 온도입니다. 이것은 재료의 \"기본\"온도 이여야 합니다. 다른 모든 프린팅 온도는 이 값을 기준으로 오프셋을 사용해야합니다"
+#: fdmprinter.def.json
+msgctxt "build_volume_temperature label"
+msgid "Build Volume Temperature"
+msgstr "빌드 볼륨 온도"
+
+#: fdmprinter.def.json
+msgctxt "build_volume_temperature description"
+msgid "The temperature of the environment to print in. If this is 0, the build volume temperature will not be adjusted."
+msgstr "프린팅되는 환경의 온도입니다. 이 값이 0인 경우 빌드 볼륨 온도는 조정되지 않습니다."
+
#: fdmprinter.def.json
msgctxt "material_print_temperature label"
msgid "Printing Temperature"
@@ -1974,6 +1997,86 @@ msgctxt "material_shrinkage_percentage description"
msgid "Shrinkage ratio in percentage."
msgstr "수축 비율 퍼센트."
+#: fdmprinter.def.json
+msgctxt "material_crystallinity label"
+msgid "Crystalline Material"
+msgstr "결정형 소재"
+
+#: fdmprinter.def.json
+msgctxt "material_crystallinity description"
+msgid "Is this material the type that breaks off cleanly when heated (crystalline), or is it the type that produces long intertwined polymer chains (non-crystalline)?"
+msgstr "이 소재는 가열 시 깔끔하게 분리되는 유형(결정형)입니까? 아니면 길게 얽힌 폴리머 체인을 생성하는 유형(비결정형)입니까?"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retracted_position label"
+msgid "Anti-ooze Retracted Position"
+msgstr "흐름 방지 리트랙션 위치"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retracted_position description"
+msgid "How far the material needs to be retracted before it stops oozing."
+msgstr "흐름이 멈추기 전에 소재가 후퇴해야 하는 거리입니다."
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retraction_speed label"
+msgid "Anti-ooze Retraction Speed"
+msgstr "흐름 방지 리트랙션 속도"
+
+#: fdmprinter.def.json
+msgctxt "material_anti_ooze_retraction_speed description"
+msgid "How fast the material needs to be retracted during a filament switch to prevent oozing."
+msgstr "흐름을 방지하기 위해 필라멘트 스위치 중 소재가 후퇴해야 하는 속도입니다."
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_retracted_position label"
+msgid "Break Preparation Retracted Position"
+msgstr "파단 준비 리트랙션 위치"
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_retracted_position description"
+msgid "How far the filament can be stretched before it breaks, while heated."
+msgstr "가열 시 파단되기 전까지 필라멘트가 늘어날 수 있는 거리입니다."
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_speed label"
+msgid "Break Preparation Retraction Speed"
+msgstr "파단 준비 리트랙션 속도"
+
+#: fdmprinter.def.json
+msgctxt "material_break_preparation_speed description"
+msgid "How fast the filament needs to be retracted just before breaking it off in a retraction."
+msgstr "리트랙션 시 파단되기 직전까지 필라멘트가 후퇴해야 하는 속도입니다."
+
+#: fdmprinter.def.json
+msgctxt "material_break_retracted_position label"
+msgid "Break Retracted Position"
+msgstr "파단 리트랙션 위치"
+
+#: fdmprinter.def.json
+msgctxt "material_break_retracted_position description"
+msgid "How far to retract the filament in order to break it cleanly."
+msgstr "필라멘트가 깔끔하게 파단되기 위해 후퇴해야 하는 거리입니다."
+
+#: fdmprinter.def.json
+msgctxt "material_break_speed label"
+msgid "Break Retraction Speed"
+msgstr "파단 리트랙션 속도"
+
+#: fdmprinter.def.json
+msgctxt "material_break_speed description"
+msgid "The speed at which to retract the filament in order to break it cleanly."
+msgstr "필라멘트가 깔끔하게 파단되기 위해 후퇴해야 하는 속도입니다."
+
+#: fdmprinter.def.json
+msgctxt "material_break_temperature label"
+msgid "Break Temperature"
+msgstr "파단 온도"
+
+#: fdmprinter.def.json
+msgctxt "material_break_temperature description"
+msgid "The temperature at which the filament is broken for a clean break."
+msgstr "필라멘트가 깔끔하게 파단되는 온도입니다."
+
#: fdmprinter.def.json
msgctxt "material_flow label"
msgid "Flow"
@@ -1984,6 +2087,126 @@ msgctxt "material_flow description"
msgid "Flow compensation: the amount of material extruded is multiplied by this value."
msgstr "압출량 보상: 압출 된 재료의 양에 이 값을 곱합니다."
+#: fdmprinter.def.json
+msgctxt "wall_material_flow label"
+msgid "Wall Flow"
+msgstr "벽 압출량"
+
+#: fdmprinter.def.json
+msgctxt "wall_material_flow description"
+msgid "Flow compensation on wall lines."
+msgstr "벽 라인의 압출 보상입니다."
+
+#: fdmprinter.def.json
+msgctxt "wall_0_material_flow label"
+msgid "Outer Wall Flow"
+msgstr "외벽 압출량"
+
+#: fdmprinter.def.json
+msgctxt "wall_0_material_flow description"
+msgid "Flow compensation on the outermost wall line."
+msgstr "가장 외측 벽 라인의 압출 보상입니다."
+
+#: fdmprinter.def.json
+msgctxt "wall_x_material_flow label"
+msgid "Inner Wall(s) Flow"
+msgstr "내벽 압출량"
+
+#: fdmprinter.def.json
+msgctxt "wall_x_material_flow description"
+msgid "Flow compensation on wall lines for all wall lines except the outermost one."
+msgstr "가장 외측 벽을 제외한 모든 벽 라인의 압출 보상입니다."
+
+#: fdmprinter.def.json
+msgctxt "skin_material_flow label"
+msgid "Top/Bottom Flow"
+msgstr "상단/하단 압출량"
+
+#: fdmprinter.def.json
+msgctxt "skin_material_flow description"
+msgid "Flow compensation on top/bottom lines."
+msgstr "상단/하단 라인의 압출 보상입니다."
+
+#: fdmprinter.def.json
+msgctxt "roofing_material_flow label"
+msgid "Top Surface Skin Flow"
+msgstr "상단 표면 스킨 압출량"
+
+#: fdmprinter.def.json
+msgctxt "roofing_material_flow description"
+msgid "Flow compensation on lines of the areas at the top of the print."
+msgstr "프린트 상단 부분 라인의 압출 보상입니다."
+
+#: fdmprinter.def.json
+msgctxt "infill_material_flow label"
+msgid "Infill Flow"
+msgstr "내부채움 압출량"
+
+#: fdmprinter.def.json
+msgctxt "infill_material_flow description"
+msgid "Flow compensation on infill lines."
+msgstr "내부채움 라인의 압출 보상입니다."
+
+#: fdmprinter.def.json
+msgctxt "skirt_brim_material_flow label"
+msgid "Skirt/Brim Flow"
+msgstr "스커트/브림 압출량"
+
+#: fdmprinter.def.json
+msgctxt "skirt_brim_material_flow description"
+msgid "Flow compensation on skirt or brim lines."
+msgstr "스커트 또는 브림 라인의 압출 보상입니다."
+
+#: fdmprinter.def.json
+msgctxt "support_material_flow label"
+msgid "Support Flow"
+msgstr "지지대 압출량"
+
+#: fdmprinter.def.json
+msgctxt "support_material_flow description"
+msgid "Flow compensation on support structure lines."
+msgstr "지지대 구조 라인의 압출 보상입니다."
+
+#: fdmprinter.def.json
+msgctxt "support_interface_material_flow label"
+msgid "Support Interface Flow"
+msgstr "지지대 인터페이스 압출량"
+
+#: fdmprinter.def.json
+msgctxt "support_interface_material_flow description"
+msgid "Flow compensation on lines of support roof or floor."
+msgstr "지지대 지붕 또는 바닥 라인의 압출 보상입니다."
+
+#: fdmprinter.def.json
+msgctxt "support_roof_material_flow label"
+msgid "Support Roof Flow"
+msgstr "지지대 지붕 압출량"
+
+#: fdmprinter.def.json
+msgctxt "support_roof_material_flow description"
+msgid "Flow compensation on support roof lines."
+msgstr "지지대 지붕 라인의 압출 보상입니다."
+
+#: fdmprinter.def.json
+msgctxt "support_bottom_material_flow label"
+msgid "Support Floor Flow"
+msgstr "지지대 바닥 압출량"
+
+#: fdmprinter.def.json
+msgctxt "support_bottom_material_flow description"
+msgid "Flow compensation on support floor lines."
+msgstr "지지대 바닥 라인의 압출 보상입니다."
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_flow label"
+msgid "Prime Tower Flow"
+msgstr "프라임 타워 압출량"
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_flow description"
+msgid "Flow compensation on prime tower lines."
+msgstr "프라임 타워 라인의 압출 보상입니다."
+
#: fdmprinter.def.json
msgctxt "material_flow_layer_0 label"
msgid "Initial Layer Flow"
@@ -2101,8 +2324,8 @@ msgstr "지지대 후퇴 제한"
#: fdmprinter.def.json
msgctxt "limit_support_retractions description"
-msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excesive stringing within the support structure."
-msgstr "직선으로 지지대 사이를 이동하는 경우 후퇴는 불가능합니다. 이 설정을 사용하면 인쇄 시간은 절약할 수 있지만, 지지 구조물 내에 스트링이 과도하게 증가할 수 있습니다."
+msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excessive stringing within the support structure."
+msgstr "직선으로 지지대 사이를 이동하는 경우 리트랙션은 생략합니다. 이 설정을 사용하면 프린팅 시간은 절약할 수 있지만, 지지대 구조물 내에 스트링이 과도하게 증가할 수 있습니다."
#: fdmprinter.def.json
msgctxt "material_standby_temperature label"
@@ -2154,6 +2377,16 @@ msgctxt "switch_extruder_prime_speed description"
msgid "The speed at which the filament is pushed back after a nozzle switch retraction."
msgstr "노즐 스위치 리트렉션 후 필라멘트가 뒤로 밀리는 속도."
+#: fdmprinter.def.json
+msgctxt "switch_extruder_extra_prime_amount label"
+msgid "Nozzle Switch Extra Prime Amount"
+msgstr "노즐 스위치 엑스트라 프라임 양"
+
+#: fdmprinter.def.json
+msgctxt "switch_extruder_extra_prime_amount description"
+msgid "Extra material to prime after nozzle switching."
+msgstr "노즐 스위치 후 프라이밍하는 추가 소재의 양입니다."
+
#: fdmprinter.def.json
msgctxt "speed label"
msgid "Speed"
@@ -2345,14 +2578,14 @@ msgid "The speed at which the skirt and brim are printed. Normally this is done
msgstr "스커트와 브림이 프린팅되는 속도입니다. 일반적으로 이것은 초기 레이어 속도에서 수행되지만 때로는 스커트나 브림을 다른 속도로 프린팅하려고 할 수 있습니다."
#: fdmprinter.def.json
-msgctxt "max_feedrate_z_override label"
-msgid "Maximum Z Speed"
-msgstr "최대 Z 속도"
+msgctxt "speed_z_hop label"
+msgid "Z Hop Speed"
+msgstr "Z 홉 속도"
#: fdmprinter.def.json
-msgctxt "max_feedrate_z_override description"
-msgid "The maximum speed with which the build plate is moved. Setting this to zero causes the print to use the firmware defaults for the maximum z speed."
-msgstr "빌드 플레이트가 움직이는 최대 속도. 이 값을 0으로 설정하면 프린팅시 최대 z 속도의 펌웨어 기본값이 사용됩니다."
+msgctxt "speed_z_hop description"
+msgid "The speed at which the vertical Z movement is made for Z Hops. This is typically lower than the print speed since the build plate or machine's gantry is harder to move."
+msgstr "Z 홉을 위해 수직 Z 이동이 이루어지는 속도입니다. 빌드 플레이트 또는 기기의 갠트리를 움직이기가 더 어렵기 때문에 프린트 속도보다 낮은 것이 일반적입니다."
#: fdmprinter.def.json
msgctxt "speed_slowdown_layers label"
@@ -2924,6 +3157,16 @@ msgctxt "retraction_hop_after_extruder_switch description"
msgid "After the machine switched from one extruder to the other, the build plate is lowered to create clearance between the nozzle and the print. This prevents the nozzle from leaving oozed material on the outside of a print."
msgstr "기기가 하나의 익스트루더에서 다른 익스트루더로 전환 된 후, 빌드 플레이트가 내려가 노즐과 출력물 사이에 간격이 생깁니다. 이렇게 하면 프린트 물 바깥쪽에서 노즐로 부터 필라멘트가 흐르는 것을 방지합니다."
+#: fdmprinter.def.json
+msgctxt "retraction_hop_after_extruder_switch_height label"
+msgid "Z Hop After Extruder Switch Height"
+msgstr "익스트루더 스위치 높이 후 Z 홉"
+
+#: fdmprinter.def.json
+msgctxt "retraction_hop_after_extruder_switch_height description"
+msgid "The height difference when performing a Z Hop after extruder switch."
+msgstr "익스트루더 스위치 후 Z 홉을 수행할 때의 높이 차이."
+
#: fdmprinter.def.json
msgctxt "cooling label"
msgid "Cooling"
@@ -3194,6 +3437,11 @@ msgctxt "support_pattern option cross"
msgid "Cross"
msgstr "십자"
+#: fdmprinter.def.json
+msgctxt "support_pattern option gyroid"
+msgid "Gyroid"
+msgstr "자이로이드"
+
#: fdmprinter.def.json
msgctxt "support_wall_count label"
msgid "Support Wall Line Count"
@@ -3255,12 +3503,12 @@ msgid "Distance between the printed initial layer support structure lines. This
msgstr "인쇄된 초기 레이어 서포트 구조 선 사이의 거리. 이 설정은 서포트 밀도로 계산됩니다."
#: fdmprinter.def.json
-msgctxt "support_infill_angle label"
-msgid "Support Infill Line Direction"
+msgctxt "support_infill_angles label"
+msgid "Support Infill Line Directions"
msgstr "서포트 내부채움 선 방향"
#: fdmprinter.def.json
-msgctxt "support_infill_angle description"
+msgctxt "support_infill_angles description"
msgid "Orientation of the infill pattern for supports. The support infill pattern is rotated in the horizontal plane."
msgstr "서포트에 대한 내부채움 패턴 방향. 서포트 내부채움 패턴은 수평면에서 회전합니다."
@@ -3391,8 +3639,8 @@ msgstr "서포트 Join 거리"
#: fdmprinter.def.json
msgctxt "support_join_distance description"
-msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one."
-msgstr "X/Y 방향으로서포트 구조물 사이의 최대 거리. 별도의 구조가 이 값보다 가깝게 있으면 구조가 하나로 합쳐집니다."
+msgid "The maximum distance between support structures in the X/Y directions. When separate structures are closer together than this value, the structures merge into one."
+msgstr "X/Y 방향으로 지지대 구조물 사이의 최대 거리입니다. 별도의 구조가 이 값보다 가깝게 있으면 구조가 하나로 합쳐집니다."
#: fdmprinter.def.json
msgctxt "support_offset label"
@@ -3770,14 +4018,14 @@ msgid "The diameter of a special tower."
msgstr "특수 타워의 지름."
#: fdmprinter.def.json
-msgctxt "support_minimal_diameter label"
-msgid "Minimum Diameter"
-msgstr "최소 지름"
+msgctxt "support_tower_maximum_supported_diameter label"
+msgid "Maximum Tower-Supported Diameter"
+msgstr "최대 타워 지지 직경"
#: fdmprinter.def.json
-msgctxt "support_minimal_diameter description"
-msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
-msgstr "특수 서포트 타워에 의해서 서포트 될 작은 영역의 X/Y 방향의 최소 직경."
+msgctxt "support_tower_maximum_supported_diameter description"
+msgid "Maximum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
+msgstr "특수 지지대 타워에 의해서 지지될 작은 영역의 X/Y 방향의 최대 직경입니다."
#: fdmprinter.def.json
msgctxt "support_tower_roof_angle label"
@@ -3899,7 +4147,9 @@ 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"
@@ -4271,16 +4521,6 @@ msgctxt "prime_tower_enable description"
msgid "Print a tower next to the print which serves to prime the material after each nozzle switch."
msgstr "각 노즐을 교체 한 후에 재료를 프라이밍(Priming)하는 프린팅 옆에 타워를 프린팅하십시오."
-#: fdmprinter.def.json
-msgctxt "prime_tower_circular label"
-msgid "Circular Prime Tower"
-msgstr "원형 프라임 타워"
-
-#: fdmprinter.def.json
-msgctxt "prime_tower_circular description"
-msgid "Make the prime tower as a circular shape."
-msgstr "프라임 타워를 원형으로 만들기."
-
#: fdmprinter.def.json
msgctxt "prime_tower_size label"
msgid "Prime Tower Size"
@@ -4321,16 +4561,6 @@ msgctxt "prime_tower_position_y description"
msgid "The y coordinate of the position of the prime tower."
msgstr "프라임 타워 위치의 y 좌표입니다."
-#: fdmprinter.def.json
-msgctxt "prime_tower_flow label"
-msgid "Prime Tower Flow"
-msgstr "프라임 타워 압출량"
-
-#: fdmprinter.def.json
-msgctxt "prime_tower_flow description"
-msgid "Flow compensation: the amount of material extruded is multiplied by this value."
-msgstr "압출량 보정 : 압출된 재료의 양에 이 값을 곱합니다."
-
#: fdmprinter.def.json
msgctxt "prime_tower_wipe_enabled label"
msgid "Wipe Inactive Nozzle on Prime Tower"
@@ -4341,6 +4571,16 @@ msgctxt "prime_tower_wipe_enabled description"
msgid "After printing the prime tower with one nozzle, wipe the oozed material from the other nozzle off on the prime tower."
msgstr "하나의 노즐로 프라임 타워를 프린팅 한 후, 다른 타워의 이물질을 프라임 타워에서 닦아냅니다."
+#: fdmprinter.def.json
+msgctxt "prime_tower_brim_enable label"
+msgid "Prime Tower Brim"
+msgstr "프라임 타워 브림"
+
+#: fdmprinter.def.json
+msgctxt "prime_tower_brim_enable description"
+msgid "Prime-towers might need the extra adhesion afforded by a brim even if the model doesn't. Presently can't be used with the 'Raft' adhesion-type."
+msgstr "프라임 타워는 모델이 제공하지 않더라도 브림이 제공하는 추가 접착이 필요할 수 있습니다. 현재 '래프트' 접착 유형을 사용할 수 없습니다."
+
#: fdmprinter.def.json
msgctxt "ooze_shield_enabled label"
msgid "Enable Ooze Shield"
@@ -4623,8 +4863,8 @@ msgstr "부드러운 나선형 윤곽"
#: fdmprinter.def.json
msgctxt "smooth_spiralized_contours description"
-msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
-msgstr "나선형 윤곽선을 부드럽게하여 Z 솔기의 가시성을 줄입니다. (Z- 솔기는 출력물에서는 거의 보이지 않지만 레이어 뷰에서는 여전히 보임). 매끄러움은 표면의 세부 묘사를 흐릿하게하는 경향이 있습니다."
+msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
+msgstr "나선형 윤곽선을 부드럽게 하여 Z 이음선이 잘 보이지 않도록 합니다(Z- 이음선은 출력물에서는 거의 보이지 않지만 레이어 뷰에서는 여전히 보임). 매끄러움은 표면의 세부 묘사를 흐릿하게 만드는 경향이 있습니다."
#: fdmprinter.def.json
msgctxt "relative_extrusion label"
@@ -4856,6 +5096,16 @@ msgctxt "meshfix_maximum_travel_resolution description"
msgid "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."
msgstr "슬라이딩 후의 이동 선분의 최소 크기입니다. 이 값을 높이면 코너에서 매끄럽게 이동하는 정도가 감소합니다. 프린터가 G 코드를 처리하는 데 필요한 속도를 유지할 수 있지만, 모델을 피하기 때문에 정확도가 감소합니다."
+#: fdmprinter.def.json
+msgctxt "meshfix_maximum_deviation label"
+msgid "Maximum Deviation"
+msgstr "최대 편차"
+
+#: fdmprinter.def.json
+msgctxt "meshfix_maximum_deviation description"
+msgid "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."
+msgstr "최대 해상도 설정에 대한 해상도를 낮추면 최대 편차를 사용할 수 있습니다. 최대 편차를 높이면 프린트의 정확도는 감소하지만, G 코드도 감소합니다."
+
#: fdmprinter.def.json
msgctxt "support_skip_some_zags label"
msgid "Break Up Support In Chunks"
@@ -5113,8 +5363,8 @@ msgstr "원추형 서포트 사용"
#: fdmprinter.def.json
msgctxt "support_conical_enabled description"
-msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang."
-msgstr "실험적 기능 : 오버행보다 하단에서 서포트 영역을 작게 만듭니다."
+msgid "Make support areas smaller at the bottom than at the overhang."
+msgstr "오버행보다 하단에서 지지대 영역을 작게 만듭니다."
#: fdmprinter.def.json
msgctxt "support_conical_angle label"
@@ -5455,7 +5705,7 @@ msgstr "노즐과 수평 아래쪽 라인 사이의 거리. 거리가 클수록
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_enabled label"
-msgid "Use adaptive layers"
+msgid "Use Adaptive Layers"
msgstr "어댑티브 레이어 사용"
#: fdmprinter.def.json
@@ -5465,7 +5715,7 @@ msgstr "어댑티브 레이어는 모델의 모양에 따라 레이어의 높이
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_variation label"
-msgid "Adaptive layers maximum variation"
+msgid "Adaptive Layers Maximum Variation"
msgstr "어댑티브 레이어 최대 변화"
#: fdmprinter.def.json
@@ -5475,7 +5725,7 @@ msgstr "기본 레이어 높이와 다른 최대 허용 높이."
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_variation_step label"
-msgid "Adaptive layers variation step size"
+msgid "Adaptive Layers Variation Step Size"
msgstr "어댑티브 레이어 변화 단계 크기"
#: fdmprinter.def.json
@@ -5485,7 +5735,7 @@ msgstr "이전 높이와 비교되는 다음 레이어 높이의 차이."
#: fdmprinter.def.json
msgctxt "adaptive_layer_height_threshold label"
-msgid "Adaptive layers threshold"
+msgid "Adaptive Layers Threshold"
msgstr "어댑티브 레이어 임계 값"
#: fdmprinter.def.json
@@ -5703,6 +5953,156 @@ msgctxt "bridge_fan_speed_3 description"
msgid "Percentage fan speed to use when printing the third bridge skin layer."
msgstr "세번째 브리지 벽과 스킨을 인쇄 할 때 사용하는 팬 속도 백분율."
+#: fdmprinter.def.json
+msgctxt "clean_between_layers label"
+msgid "Wipe Nozzle Between Layers"
+msgstr "레이어 사이의 와이프 노즐"
+
+#: fdmprinter.def.json
+msgctxt "clean_between_layers description"
+msgid "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."
+msgstr "레이어 사이에 노즐 와이프 G 코드를 포함할지 여부를 결정합니다. 이 설정을 활성화하면 레이어 변경 시 리트렉트 동작에 영향을 줄 수 있습니다. 와이프 스크립트가 작동하는 레이어에서 리트랙션을 제어하려면 와이프 리트렉션 설정을 사용하십시오."
+
+#: fdmprinter.def.json
+msgctxt "max_extrusion_before_wipe label"
+msgid "Material Volume Between Wipes"
+msgstr "와이프 사이의 재료 볼륨"
+
+#: fdmprinter.def.json
+msgctxt "max_extrusion_before_wipe description"
+msgid "Maximum material, that can be extruded before another nozzle wipe is initiated."
+msgstr "다른 노즐 와이프를 시작하기 전에 압출할 수 있는 최대 재료입니다."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_enable label"
+msgid "Wipe Retraction Enable"
+msgstr "와이프 리트랙션 활성화"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_enable description"
+msgid "Retract the filament when the nozzle is moving over a non-printed area."
+msgstr "노즐이 프린팅되지 않은 영역 위로 움직일 때 필라멘트를 리트렉션합니다."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_amount label"
+msgid "Wipe Retraction Distance"
+msgstr "와이프 리트랙션 거리"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_amount description"
+msgid "Amount to retract the filament so it does not ooze during the wipe sequence."
+msgstr "필라멘트를 리트렉션하는 양으로 와이프 순서 동안 새어 나오지 않습니다."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_extra_prime_amount label"
+msgid "Wipe Retraction Extra Prime Amount"
+msgstr "와이프 리트랙션 추가 초기 양"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_extra_prime_amount description"
+msgid "Some material can ooze away during a wipe travel moves, which can be compensated for here."
+msgstr "와이프 이동 중에 재료가 새어 나올 수 있습니다. 이 재료는 여기에서 보상받을 수 있습니다."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_speed label"
+msgid "Wipe Retraction Speed"
+msgstr "와이프 리트랙션 속도"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_speed description"
+msgid "The speed at which the filament is retracted and primed during a wipe retraction move."
+msgstr "와이프 리트랙션 이동 중에 필라멘트가 리트렉션 및 준비되는 속도입니다."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_retract_speed label"
+msgid "Wipe Retraction Retract Speed"
+msgstr "와이프 리트랙션 리트렉트 속도"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_retract_speed description"
+msgid "The speed at which the filament is retracted during a wipe retraction move."
+msgstr "와이프 리트랙션 이동 중에 필라멘트가 리트렉트되는 속도입니다."
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_prime_speed label"
+msgid "Retraction Prime Speed"
+msgstr "리트렉션 초기 속도"
+
+#: fdmprinter.def.json
+msgctxt "wipe_retraction_prime_speed description"
+msgid "The speed at which the filament is primed during a wipe retraction move."
+msgstr "와이프 리트랙션 이동 중에 필라멘트가 초기화되는 속도입니다."
+
+#: fdmprinter.def.json
+msgctxt "wipe_pause label"
+msgid "Wipe Pause"
+msgstr "와이프 일시 정지"
+
+#: fdmprinter.def.json
+msgctxt "wipe_pause description"
+msgid "Pause after the unretract."
+msgstr "리트랙트를 실행 취소한 후 일시 정지합니다."
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_enable label"
+msgid "Wipe Z Hop When Retracted"
+msgstr "리트렉션했을 때의 와이프 Z 홉"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_enable description"
+msgid "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."
+msgstr "리트렉션이 일어날 때마다 빌드 플레이트가 낮아져 노즐과 출력물 사이에 여유 공간이 생깁니다. 이동 중에 노즐이 인쇄물에 부딪치지 않도록 하여 인쇄물이 빌드 플레이트와 부딪힐 가능성을 줄여줍니다."
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_amount label"
+msgid "Wipe Z Hop Height"
+msgstr "화이프 Z 홉 높이"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_amount description"
+msgid "The height difference when performing a Z Hop."
+msgstr "Z 홉을 수행할 때의 높이 차이."
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_speed label"
+msgid "Wipe Hop Speed"
+msgstr "와이프 홉 속도"
+
+#: fdmprinter.def.json
+msgctxt "wipe_hop_speed description"
+msgid "Speed to move the z-axis during the hop."
+msgstr "홉 중에 z축을 이동하는 속도입니다."
+
+#: fdmprinter.def.json
+msgctxt "wipe_brush_pos_x label"
+msgid "Wipe Brush X Position"
+msgstr "와이프 브러시 X 위치"
+
+#: fdmprinter.def.json
+msgctxt "wipe_brush_pos_x description"
+msgid "X location where wipe script will start."
+msgstr "와이프 스크립트가 시작되는 X 위치입니다."
+
+#: fdmprinter.def.json
+msgctxt "wipe_repeat_count label"
+msgid "Wipe Repeat Count"
+msgstr "와이프 반복 횟수"
+
+#: fdmprinter.def.json
+msgctxt "wipe_repeat_count description"
+msgid "Number of times to move the nozzle across the brush."
+msgstr "브러시 전체에 노즐을 이동하는 횟수입니다."
+
+#: fdmprinter.def.json
+msgctxt "wipe_move_distance label"
+msgid "Wipe Move Distance"
+msgstr "와이프 이동 거리"
+
+#: fdmprinter.def.json
+msgctxt "wipe_move_distance description"
+msgid "The distance to move the head back and forth across the brush."
+msgstr "브러시 전체에 헤드를 앞뒤로 이동하는 거리입니다."
+
#: fdmprinter.def.json
msgctxt "command_line_settings label"
msgid "Command Line Settings"
@@ -5763,6 +6163,138 @@ msgctxt "mesh_rotation_matrix description"
msgid "Transformation matrix to be applied to the model when loading it from file."
msgstr "파일로부터 로드 하는 경유, 모델에 적용될 변환 행렬입니다."
+#~ msgctxt "machine_gcode_flavor label"
+#~ msgid "G-code Flavour"
+#~ msgstr "G-code Flavour"
+
+#~ msgctxt "z_seam_corner description"
+#~ msgid "Control whether corners on the model outline influence the position of the seam. None means that corners have no influence on the seam position. Hide Seam makes the seam more likely to occur on an inside corner. Expose Seam makes the seam more likely to occur on an outside corner. Hide or Expose Seam makes the seam more likely to occur at an inside or outside corner."
+#~ msgstr "모델 외곽선의 모서리가 솔기의 위치에 영향을 줄지 여부를 제어합니다. 이것은 코너가 솔기 위치에 영향을 미치지 않는다는 것을 의미하지 않습니다. 솔기 숨기기는 이음새가 안쪽 모서리에서 발생할 가능성을 높입니다. 솔기 노출은 솔기이 외부 모서리에서 발생할 가능성을 높입니다. 솔기 숨기기 또는 노출은 솔기이 내부나 외부 모서리에서 발생할 가능성을 높입니다."
+
+#~ msgctxt "skin_no_small_gaps_heuristic label"
+#~ msgid "Ignore Small Z Gaps"
+#~ msgstr "작은 Z 간격 무시"
+
+#~ msgctxt "skin_no_small_gaps_heuristic description"
+#~ msgid "When the model has small vertical gaps, about 5% extra computation time can be spent on generating top and bottom skin in these narrow spaces. In such case, disable the setting."
+#~ msgstr "모델에 수직 간격이 작으면 이 좁은 공간에서 상단 및 하단 스킨을 생성하는 데 약 5%의 추가적인 계산시간을 소비 할 수 있습니다. 이 경우 설정을 해제하십시오."
+
+#~ msgctxt "build_volume_temperature description"
+#~ msgid "The temperature used for build volume. If this is 0, the build volume temperature will not be adjusted."
+#~ msgstr "빌드 볼륨에 사용되는 온도입니다. 0인 경우 빌드 볼륨 온도는 조정되지 않습니다."
+
+#~ msgctxt "limit_support_retractions description"
+#~ msgid "Omit retraction when moving from support to support in a straight line. Enabling this setting saves print time, but can lead to excesive stringing within the support structure."
+#~ msgstr "직선으로 지지대 사이를 이동하는 경우 후퇴는 불가능합니다. 이 설정을 사용하면 인쇄 시간은 절약할 수 있지만, 지지 구조물 내에 스트링이 과도하게 증가할 수 있습니다."
+
+#~ msgctxt "max_feedrate_z_override label"
+#~ msgid "Maximum Z Speed"
+#~ msgstr "최대 Z 속도"
+
+#~ msgctxt "max_feedrate_z_override description"
+#~ msgid "The maximum speed with which the build plate is moved. Setting this to zero causes the print to use the firmware defaults for the maximum z speed."
+#~ msgstr "빌드 플레이트가 움직이는 최대 속도. 이 값을 0으로 설정하면 프린팅시 최대 z 속도의 펌웨어 기본값이 사용됩니다."
+
+#~ msgctxt "support_join_distance description"
+#~ msgid "The maximum distance between support structures in the X/Y directions. When seperate structures are closer together than this value, the structures merge into one."
+#~ msgstr "X/Y 방향으로서포트 구조물 사이의 최대 거리. 별도의 구조가 이 값보다 가깝게 있으면 구조가 하나로 합쳐집니다."
+
+#~ msgctxt "support_minimal_diameter label"
+#~ msgid "Minimum Diameter"
+#~ msgstr "최소 지름"
+
+#~ msgctxt "support_minimal_diameter description"
+#~ msgid "Minimum diameter in the X/Y directions of a small area which is to be supported by a specialized support tower."
+#~ msgstr "특수 서포트 타워에 의해서 서포트 될 작은 영역의 X/Y 방향의 최소 직경."
+
+#~ msgctxt "prime_tower_circular label"
+#~ msgid "Circular Prime Tower"
+#~ msgstr "원형 프라임 타워"
+
+#~ msgctxt "prime_tower_circular description"
+#~ msgid "Make the prime tower as a circular shape."
+#~ msgstr "프라임 타워를 원형으로 만들기."
+
+#~ msgctxt "prime_tower_flow description"
+#~ msgid "Flow compensation: the amount of material extruded is multiplied by this value."
+#~ msgstr "압출량 보정 : 압출된 재료의 양에 이 값을 곱합니다."
+
+#~ msgctxt "smooth_spiralized_contours description"
+#~ msgid "Smooth the spiralized contours to reduce the visibility of the Z seam (the Z-seam should be barely visible on the print but will still be visible in the layer view). Note that smoothing will tend to blur fine surface details."
+#~ msgstr "나선형 윤곽선을 부드럽게하여 Z 솔기의 가시성을 줄입니다. (Z- 솔기는 출력물에서는 거의 보이지 않지만 레이어 뷰에서는 여전히 보임). 매끄러움은 표면의 세부 묘사를 흐릿하게하는 경향이 있습니다."
+
+#~ msgctxt "support_conical_enabled description"
+#~ msgid "Experimental feature: Make support areas smaller at the bottom than at the overhang."
+#~ msgstr "실험적 기능 : 오버행보다 하단에서 서포트 영역을 작게 만듭니다."
+
+#~ msgctxt "extruders_enabled_count label"
+#~ msgid "Number of Extruders that are enabled"
+#~ msgstr "활성화된 익스트루더의 수"
+
+#~ msgctxt "machine_nozzle_tip_outer_diameter label"
+#~ msgid "Outer nozzle diameter"
+#~ msgstr "노즐의 외경"
+
+#~ msgctxt "machine_nozzle_head_distance label"
+#~ msgid "Nozzle length"
+#~ msgstr "노즐 길이"
+
+#~ msgctxt "machine_nozzle_expansion_angle label"
+#~ msgid "Nozzle angle"
+#~ msgstr "노즐 각도"
+
+#~ msgctxt "machine_heat_zone_length label"
+#~ msgid "Heat zone length"
+#~ msgstr "가열 영역 길이"
+
+#~ msgctxt "machine_nozzle_heat_up_speed label"
+#~ msgid "Heat up speed"
+#~ msgstr "가열 속도"
+
+#~ msgctxt "machine_nozzle_cool_down_speed label"
+#~ msgid "Cool down speed"
+#~ msgstr "냉각 속도"
+
+#~ msgctxt "machine_gcode_flavor label"
+#~ msgid "G-code flavour"
+#~ msgstr "Gcode 유형"
+
+#~ msgctxt "machine_disallowed_areas label"
+#~ msgid "Disallowed areas"
+#~ msgstr "허용되지 않는 지역"
+
+#~ msgctxt "machine_head_polygon label"
+#~ msgid "Machine head polygon"
+#~ msgstr "머신 헤드 폴리곤"
+
+#~ msgctxt "machine_head_with_fans_polygon label"
+#~ msgid "Machine head & Fan polygon"
+#~ msgstr "머신 헤드 및 팬 폴리곤"
+
+#~ msgctxt "gantry_height label"
+#~ msgid "Gantry height"
+#~ msgstr "갠트리 높이"
+
+#~ msgctxt "machine_use_extruder_offset_to_offset_coords label"
+#~ msgid "Offset With Extruder"
+#~ msgstr "익스트루더로 오프셋"
+
+#~ msgctxt "adaptive_layer_height_enabled label"
+#~ msgid "Use adaptive layers"
+#~ msgstr "어댑티브 레이어 사용"
+
+#~ msgctxt "adaptive_layer_height_variation label"
+#~ msgid "Adaptive layers maximum variation"
+#~ msgstr "어댑티브 레이어 최대 변화"
+
+#~ msgctxt "adaptive_layer_height_variation_step label"
+#~ msgid "Adaptive layers variation step size"
+#~ msgstr "어댑티브 레이어 변화 단계 크기"
+
+#~ msgctxt "adaptive_layer_height_threshold label"
+#~ msgid "Adaptive layers threshold"
+#~ msgstr "어댑티브 레이어 임계 값"
+
#~ msgctxt "skin_overlap description"
#~ msgid "The amount of overlap between the skin and the walls as a percentage of the skin line width. A slight overlap allows the walls to connect firmly to the skin. This is a percentage of the average line widths of the skin lines and the innermost wall."
#~ msgstr "스킨 라인 폭의 비율인 스킨과 벽 사이의 오버랩 양. 약간의 오버랩으로 벽이 스킨과 확실하게 체결됩니다. 이것은 스킨 라인과 가장 안쪽 벽과의 평균 라인 폭의 비율입니다."
@@ -5900,7 +6432,6 @@ msgstr "파일로부터 로드 하는 경유, 모델에 적용될 변환 행렬
#~ "Gcode commands to be executed at the very start - separated by \n"
#~ "."
#~ msgstr ""
-
#~ "시작과 동시에 실행될 G 코드 명령어 \n"
#~ "."
@@ -5913,7 +6444,6 @@ 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 22c9ee4857..943c792aea 100644
--- a/resources/i18n/nl_NL/cura.po
+++ b/resources/i18n/nl_NL/cura.po
@@ -5,12 +5,12 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: Cura 4.0\n"
+"Project-Id-Version: Cura 4.2\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
-"POT-Creation-Date: 2019-02-26 16:36+0100\n"
-"PO-Revision-Date: 2019-03-13 14:00+0200\n"
-"Last-Translator: Bothof \n"
-"Language-Team: Dutch\n"
+"POT-Creation-Date: 2019-07-16 14:38+0200\n"
+"PO-Revision-Date: 2019-07-29 15:51+0200\n"
+"Last-Translator: Lionbridge \n"
+"Language-Team: Dutch , Dutch \n"
"Language: nl_NL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -18,7 +18,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: Poedit 2.0.6\n"
-#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:22
+#: /home/ruben/Projects/Cura/plugins/MachineSettingsAction/MachineSettingsAction.py:27
msgctxt "@action"
msgid "Machine Settings"
msgstr "Machine-instellingen"
@@ -56,7 +56,7 @@ msgctxt "@info:title"
msgid "3D Model Assistant"
msgstr "3D-modelassistent"
-#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:86
+#: /home/ruben/Projects/Cura/plugins/ModelChecker/ModelChecker.py:90
#, python-brace-format
msgctxt "@info:status"
msgid ""
@@ -64,17 +64,11 @@ msgid ""
"{model_names}
\n"
"Find out how to ensure the best possible print quality and reliability.
\n"
"View print quality guide
"
-msgstr "Een of meer 3D-modellen worden mogelijk niet optimaal geprint vanwege het modelformaat en de materiaalconfiguratie:
\n{model_names}
\nOntdek hoe u de best mogelijke printkwaliteit en betrouwbaarheid verkrijgt.
\nHandleiding printkwaliteit bekijken
"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:32
-msgctxt "@item:inmenu"
-msgid "Changelog"
-msgstr "Wijzigingenlogboek"
-
-#: /home/ruben/Projects/Cura/plugins/ChangeLogPlugin/ChangeLog.py:33
-msgctxt "@item:inmenu"
-msgid "Show Changelog"
-msgstr "Wijzigingenlogboek Weergeven"
+msgstr ""
+"Een of meer 3D-modellen worden mogelijk niet optimaal geprint vanwege het modelformaat en de materiaalconfiguratie:
\n"
+"{model_names}
\n"
+"Ontdek hoe u de best mogelijke printkwaliteit en betrouwbaarheid verkrijgt.
\n"
+"Handleiding printkwaliteit bekijken
"
#: /home/ruben/Projects/Cura/plugins/FirmwareUpdater/FirmwareUpdaterMachineAction.py:25
msgctxt "@action"
@@ -91,37 +85,36 @@ msgctxt "@info:status"
msgid "Profile has been flattened & activated."
msgstr "Profiel is platgemaakt en geactiveerd."
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:33
+#: /home/ruben/Projects/Cura/plugins/AMFReader/__init__.py:15
+msgctxt "@item:inlistbox"
+msgid "AMF File"
+msgstr "AMF-bestand"
+
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:37
msgctxt "@item:inmenu"
msgid "USB printing"
msgstr "USB-printen"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:34
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:38
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print via USB"
msgstr "Printen via USB"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:35
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:39
msgctxt "@info:tooltip"
msgid "Print via USB"
msgstr "Via USB Printen"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:71
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:75
msgctxt "@info:status"
msgid "Connected via USB"
msgstr "Aangesloten via USB"
-#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:96
+#: /home/ruben/Projects/Cura/plugins/USBPrinting/USBPrinterOutputDevice.py:100
msgctxt "@label"
msgid "A USB print is in progress, closing Cura will stop this print. Are you sure?"
msgstr "Er wordt momenteel via USB geprint. Wanneer u Cura afsluit, wordt het printen gestopt. Weet u zeker dat u wilt afsluiten?"
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/install/X3GWriter/__init__.py:15
-#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
-msgctxt "X3G Writer File Description"
-msgid "X3G File"
-msgstr "X3G-bestand"
-
#: /home/ruben/Projects/Cura/plugins/X3GWriter/build/GPX-prefix/src/GPX/slicerplugins/cura15.06/X3gWriter/__init__.py:16
msgctxt "X3g Writer Plugin Description"
msgid "Writes X3g to files"
@@ -132,6 +125,11 @@ msgctxt "X3g Writer File Description"
msgid "X3g File"
msgstr "X3g-bestand"
+#: /home/ruben/Projects/Cura/plugins/X3GWriter/__init__.py:15
+msgctxt "X3G Writer File Description"
+msgid "X3G File"
+msgstr "X3G-bestand"
+
#: /home/ruben/Projects/Cura/plugins/GCodeGzWriter/__init__.py:17
#: /home/ruben/Projects/Cura/plugins/GCodeGzReader/__init__.py:17
msgctxt "@item:inlistbox"
@@ -144,6 +142,7 @@ msgid "GCodeGzWriter does not support text mode."
msgstr "GCodeGzWriter ondersteunt geen tekstmodus."
#: /home/ruben/Projects/Cura/plugins/UFPWriter/__init__.py:28
+#: /home/ruben/Projects/Cura/plugins/UFPReader/__init__.py:22
msgctxt "@item:inlistbox"
msgid "Ultimaker Format Package"
msgstr "Ultimaker Format Package"
@@ -202,10 +201,10 @@ msgid "Could not save to removable drive {0}: {1}"
msgstr "Kan niet opslaan op verwisselbaar station {0}: {1}"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:137
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:152
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:133
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:140
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1629
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:188
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:134
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:141
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1622
msgctxt "@info:title"
msgid "Error"
msgstr "Fout"
@@ -234,9 +233,9 @@ msgstr "Verwisselbaar station {0} uitwerpen"
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:151
#: /home/ruben/Projects/Cura/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:163
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:186
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1619
-#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1719
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:197
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1612
+#: /home/ruben/Projects/Cura/cura/CuraApplication.py:1712
msgctxt "@info:title"
msgid "Warning"
msgstr "Waarschuwing"
@@ -263,266 +262,267 @@ msgctxt "@item:intext"
msgid "Removable Drive"
msgstr "Verwisselbaar Station"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:74
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:93
msgctxt "@action:button Preceded by 'Ready to'."
msgid "Print over network"
msgstr "Printen via netwerk"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:75
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:89
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:76
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:94
msgctxt "@properties:tooltip"
msgid "Print over network"
msgstr "Printen via netwerk"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:88
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:95
msgctxt "@info:status"
msgid "Connected over the network."
msgstr "Via het netwerk verbonden."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
msgctxt "@info:status"
msgid "Connected over the network. Please approve the access request on the printer."
msgstr "Via het netwerk verbonden. Keur de aanvraag goed op de printer."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:93
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:100
msgctxt "@info:status"
msgid "Connected over the network. No access to control the printer."
msgstr "Via het netwerk verbonden. Kan de printer niet beheren."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:98
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
msgctxt "@info:status"
msgid "Access to the printer requested. Please approve the request on the printer"
msgstr "Er is een toegangsaanvraag voor de printer verstuurd. Keur de aanvraag goed op de printer"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:101
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
msgctxt "@info:title"
msgid "Authentication status"
msgstr "Verificatiestatus"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:103
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:109
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:113
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:110
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:120
msgctxt "@info:title"
msgid "Authentication Status"
msgstr "Verificatiestatus"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:104
-#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:187
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:111
+#: /home/ruben/Projects/Cura/cura/OAuth2/AuthorizationService.py:198
msgctxt "@action:button"
msgid "Retry"
msgstr "Opnieuw proberen"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:105
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
msgctxt "@info:tooltip"
msgid "Re-send the access request"
msgstr "De toegangsaanvraag opnieuw verzenden"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:108
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:115
msgctxt "@info:status"
msgid "Access to the printer accepted"
msgstr "Toegang tot de printer is geaccepteerd"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:112
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:119
msgctxt "@info:status"
msgid "No access to print with this printer. Unable to send print job."
msgstr "Kan geen toegang verkrijgen om met deze printer te printen. Kan de printtaak niet verzenden."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:114
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:121
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:65
msgctxt "@action:button"
msgid "Request Access"
msgstr "Toegang aanvragen"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:116
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:123
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/UM3InfoComponents.qml:66
msgctxt "@info:tooltip"
msgid "Send access request to the printer"
msgstr "Toegangsaanvraag naar de printer verzenden"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:201
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:208
msgctxt "@label"
msgid "Unable to start a new print job."
msgstr "Er kan geen nieuwe taak worden gestart."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:203
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:210
msgctxt "@label"
msgid "There is an issue with the configuration of your Ultimaker, which makes it impossible to start the print. Please resolve this issues before continuing."
msgstr "Er is een probleem met de configuratie van de Ultimaker waardoor het niet mogelijk is het printen te starten. Los het probleem op voordat u verder gaat."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:209
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:231
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:216
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:238
msgctxt "@window:title"
msgid "Mismatched configuration"
msgstr "De configuratie komt niet overeen"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:223
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:230
msgctxt "@label"
msgid "Are you sure you wish to print with the selected configuration?"
msgstr "Weet u zeker dat u met de geselecteerde configuratie wilt printen?"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:225
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:232
msgctxt "@label"
msgid "There is a mismatch between the configuration or calibration of the printer and Cura. For the best result, always slice for the PrintCores and materials that are inserted in your printer."
msgstr "De configuratie of kalibratie van de printer komt niet overeen met de configuratie van Cura. Slice voor het beste resultaat altijd voor de PrintCores en materialen die in de printer zijn ingevoerd."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:252
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:162
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:162
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:176
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:181
msgctxt "@info:status"
msgid "Sending new jobs (temporarily) blocked, still sending the previous print job."
msgstr "Het verzenden van nieuwe taken is (tijdelijk) geblokkeerd. Nog bezig met het verzenden van de vorige printtaak."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:259
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:180
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:197
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:266
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:194
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:211
msgctxt "@info:status"
msgid "Sending data to printer"
msgstr "De gegevens worden naar de printer verzonden"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:260
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:182
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:199
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:267
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:196
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:213
msgctxt "@info:title"
msgid "Sending Data"
msgstr "Gegevens Verzenden"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:261
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:200
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:268
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:214
+#: /home/ruben/Projects/Cura/cura/UI/AddPrinterPagesModel.py:18
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml:19
#: /home/ruben/Projects/Cura/plugins/Toolbox/resources/qml/ToolboxConfirmUninstallResetDialog.qml:81
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:395
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/DiscoverUM3Action.qml:410
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/PrintWindow.qml:20
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:38
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:143
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/resources/qml/MonitorConfigOverrideDialog.qml:58
+#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/MoreInfoWindow.qml:149
#: /home/ruben/Projects/Cura/plugins/ImageReader/ConfigUI.qml:188
#: /home/ruben/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:391
#: /home/ruben/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:87
-#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:254
+#: /home/ruben/Projects/Cura/resources/qml/Dialogs/WorkspaceSummaryDialog.qml:283
msgctxt "@action:button"
msgid "Cancel"
msgstr "Annuleren"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:324
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:331
#, python-brace-format
msgctxt "@info:status"
msgid "No Printcore loaded in slot {slot_number}"
msgstr "Er is geen PrintCore geladen in de sleuf {slot_number}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:337
#, python-brace-format
msgctxt "@info:status"
msgid "No material loaded in slot {slot_number}"
msgstr "Er is geen materiaal geladen in de sleuf {slot_number}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:353
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:360
#, python-brace-format
msgctxt "@label"
msgid "Different PrintCore (Cura: {cura_printcore_name}, Printer: {remote_printcore_name}) selected for extruder {extruder_id}"
msgstr "Er is een afwijkende PrintCore (Cura: {cura_printcore_name}, printer: {remote_printcore_name}) geselecteerd voor de extruder {extruder_id}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:362
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:369
#, python-brace-format
msgctxt "@label"
msgid "Different material (Cura: {0}, Printer: {1}) selected for extruder {2}"
msgstr "Afwijkend materiaal (Cura: {0}, Printer: {1}) geselecteerd voor de extruder {2}"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:548
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:555
msgctxt "@window:title"
msgid "Sync with your printer"
msgstr "Synchroniseren met de printer"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:550
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:557
msgctxt "@label"
msgid "Would you like to use your current printer configuration in Cura?"
msgstr "Wilt u uw huidige printerconfiguratie gebruiken in Cura?"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:552
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/LegacyUM3OutputDevice.py:559
msgctxt "@label"
msgid "The PrintCores and/or materials on your printer differ from those within your current project. For the best result, always slice for the PrintCores and materials that are inserted in your printer."
msgstr "De PrintCores en/of materialen in de printer wijken af van de PrintCores en/of materialen in uw huidige project. Slice voor het beste resultaat altijd voor de PrintCores en materialen die in de printer zijn ingevoerd."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:91
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:96
msgctxt "@info:status"
msgid "Connected over the network"
msgstr "Via het netwerk verbonden"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:275
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:342
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:370
msgctxt "@info:status"
msgid "Print job was successfully sent to the printer."
msgstr "De printtaak is naar de printer verzonden."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:277
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:343
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:291
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:371
msgctxt "@info:title"
msgid "Data Sent"
msgstr "Gegevens verzonden"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:278
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:292
msgctxt "@action:button"
msgid "View in Monitor"
msgstr "In monitor weergeven"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:390
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:290
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:411
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:318
#, python-brace-format
msgctxt "@info:status"
msgid "Printer '{printer_name}' has finished printing '{job_name}'."
msgstr "Printer '{printer_name}' is klaar met het printen van '{job_name}'."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:392
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:294
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:413
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:322
#, python-brace-format
msgctxt "@info:status"
msgid "The print job '{job_name}' was finished."
msgstr "De printtaak '{job_name}' is voltooid."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:393
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:289
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:414
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:316
msgctxt "@info:status"
msgid "Print finished"
msgstr "Print klaar"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:573
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:607
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:595
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:629
msgctxt "@label:material"
msgid "Empty"
msgstr "Leeg"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:574
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:608
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:596
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/ClusterUM3OutputDevice.py:630
msgctxt "@label:material"
msgid "Unknown"
msgstr "Onbekend"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:169
msgctxt "@action:button"
msgid "Print via Cloud"
msgstr "Printen via Cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:152
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:170
msgctxt "@properties:tooltip"
msgid "Print via Cloud"
msgstr "Printen via Cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:153
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:171
msgctxt "@info:status"
msgid "Connected via Cloud"
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
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:182
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:359
msgctxt "@info:title"
msgid "Cloud error"
msgstr "Cloud-fout"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:180
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:199
msgctxt "@info:status"
msgid "Could not export print job."
msgstr "Kan de printtaak niet exporteren."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:330
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:358
msgctxt "@info:text"
msgid "Could not upload the data to the printer."
msgstr "Kan de gegevens niet uploaden naar de printer."
@@ -537,48 +537,52 @@ msgctxt "@info:status"
msgid "today"
msgstr "vandaag"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:151
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:187
msgctxt "@info:description"
msgid "There was an error connecting to the cloud."
msgstr "Er is een fout opgetreden tijdens het verbinden met de cloud."
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:14
+msgctxt "@info:status"
+msgid "Sending Print Job"
+msgstr "Printtaak verzenden"
+
#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudProgressMessage.py:15
msgctxt "@info:status"
-msgid "Sending data to remote cluster"
-msgstr "Gegevens naar een extern cluster verzenden"
+msgid "Uploading via Ultimaker Cloud"
+msgstr "Uploaden via Ultimaker Cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:456
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:621
msgctxt "@info:status"
msgid "Send and monitor print jobs from anywhere using your Ultimaker account."
msgstr "Verzend en controleer overal printtaken met uw Ultimaker-account."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:460
-msgctxt "@info:status"
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:627
+msgctxt "@info:status Ultimaker Cloud is a brand name and shouldn't be translated."
msgid "Connect to Ultimaker Cloud"
msgstr "Verbinden met Ultimaker Cloud"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:461
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:628
msgctxt "@action"
msgid "Don't ask me again for this printer."
msgstr "Niet opnieuw vragen voor deze printer."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:464
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:631
msgctxt "@action"
msgid "Get started"
msgstr "Aan de slag"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:478
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:637
msgctxt "@info:status"
msgid "You can now send and monitor print jobs from anywhere using your Ultimaker account."
msgstr "U kunt nu overal vandaan printtaken verzenden en controleren met uw Ultimaker-account."
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:482
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:643
msgctxt "@info:status"
msgid "Connected!"
msgstr "Verbonden!"
-#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:486
+#: /home/ruben/Projects/Cura/plugins/UM3NetworkPrinting/src/UM3OutputDevicePlugin.py:645
msgctxt "@action"
msgid "Review your connection"
msgstr "Uw verbinding controleren"
@@ -593,7 +597,7 @@ msgctxt "@item:inmenu"
msgid "Monitor"
msgstr "Controleren"
-#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:124
+#: /home/ruben/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py:118
msgctxt "@info"
msgid "Could not access update information."
msgstr "Geen toegang tot update-informatie."
@@ -650,46 +654,11 @@ msgctxt "@info:tooltip"
msgid "Create a volume in which supports are not printed."
msgstr "Maak een volume waarin supportstructuren niet worden geprint."
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:52
-msgctxt "@info"
-msgid "Cura collects anonymized usage statistics."
-msgstr "Cura verzamelt geanonimiseerde gebruiksstatistieken."
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:55
-msgctxt "@info:title"
-msgid "Collecting Data"
-msgstr "Gegevens verzamelen"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:57
-msgctxt "@action:button"
-msgid "More info"
-msgstr "Meer informatie"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:58
-msgctxt "@action:tooltip"
-msgid "See more information on what data Cura sends."
-msgstr "Lees meer over welke gegevens Cura verzendt."
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:60
-msgctxt "@action:button"
-msgid "Allow"
-msgstr "Toestaan"
-
-#: /home/ruben/Projects/Cura/plugins/SliceInfoPlugin/SliceInfo.py:61
-msgctxt "@action:tooltip"
-msgid "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."
-msgstr "Cura toestaan geanonimiseerde gebruiksstatistieken te verzenden om toekomstige verbeteringen aan Cura te helpen prioriteren. Onder de verzonden gegevens bevindt zich informatie over uw voorkeuren en instellingen, de Cura-versie en een selectie van de modellen die u slicet."
-
#: /home/ruben/Projects/Cura/plugins/LegacyProfileReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "Cura 15.04 profiles"
msgstr "Cura 15.04-profielen"
-#: /home/ruben/Projects/Cura/plugins/R2D2/__init__.py:17
-msgctxt "@item:inmenu"
-msgid "Evaluation"
-msgstr "Evaluatie"
-
#: /home/ruben/Projects/Cura/plugins/ImageReader/__init__.py:14
msgctxt "@item:inlistbox"
msgid "JPG Image"
@@ -715,56 +684,56 @@ msgctxt "@item:inlistbox"
msgid "GIF Image"
msgstr "GIF-afbeelding"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
msgctxt "@info:status"
msgid "Unable to slice with the current material as it is incompatible with the selected machine or configuration."
msgstr "Met het huidige materiaal is slicen niet mogelijk, omdat het materiaal niet compatibel is met de geselecteerde machine of configuratie."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:334
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:365
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:389
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:398
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:407
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:416
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:331
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:362
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:386
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:395
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:404
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:413
msgctxt "@info:title"
msgid "Unable to slice"
msgstr "Kan niet slicen"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:364
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:361
#, python-brace-format
msgctxt "@info:status"
msgid "Unable to slice with the current settings. The following settings have errors: {0}"
msgstr "Met de huidige instellingen is slicing niet mogelijk. De volgende instellingen bevatten fouten: {0}"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:388
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:385
#, 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 "Slicing is niet mogelijk vanwege enkele instellingen per model. De volgende instellingen bevatten fouten voor een of meer modellen: {error_labels}"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:397
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:394
msgctxt "@info:status"
msgid "Unable to slice because the prime tower or prime position(s) are invalid."
msgstr "Slicen is niet mogelijk omdat de terugduwpijler of terugduwpositie(s) ongeldig zijn."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:406
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:403
#, python-format
msgctxt "@info:status"
msgid "Unable to slice because there are objects associated with disabled Extruder %s."
msgstr "Slicen is niet mogelijk omdat er objecten gekoppeld zijn aan uitgeschakelde Extruder %s."
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:415
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/CuraEngineBackend.py:412
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 "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
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:status"
msgid "Processing Layers"
msgstr "Lagen verwerken"
-#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:255
+#: /home/ruben/Projects/Cura/plugins/CuraEngineBackend/ProcessSlicedLayersJob.py:256
msgctxt "@info:title"
msgid "Information"
msgstr "Informatie"
@@ -795,19 +764,19 @@ msgctxt "@item:inlistbox"
msgid "3MF File"
msgstr "3MF-bestand"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:190
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:763
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:191
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:775
msgctxt "@label"
msgid "Nozzle"
msgstr "Nozzle"
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:469
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:474
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Project file {0} contains an unknown machine type {1}. Cannot import the machine. Models will be imported instead."
msgstr "Projectbestand {0} bevat een onbekend type machine {1}. Kan de machine niet importeren. In plaats daarvan worden er modellen geïmporteerd."
-#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:472
+#: /home/ruben/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:477
msgctxt "@info:title"
msgid "Open Project File"
msgstr "Projectbestand Openen"
@@ -822,18 +791,18 @@ msgctxt "@item:inlistbox"
msgid "G File"
msgstr "G-bestand"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:324
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:328
msgctxt "@info:status"
msgid "Parsing G-code"
msgstr "G-code parseren"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:326
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:476
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:330
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:483
msgctxt "@info:title"
msgid "G-code Details"
msgstr "Details van de G-code"
-#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:474
+#: /home/ruben/Projects/Cura/plugins/GCodeReader/FlavorParser.py:481
msgctxt "@info:generic"
msgid "Make sure the g-code is suitable for your printer and printer configuration before sending the file to it. The g-code representation may not be accurate."
msgstr "Zorg ervoor dat de G-code geschikt is voor uw printer en de printerconfiguratie voordat u het bestand verzendt. Mogelijk is de weergave van de G-code niet nauwkeurig."
@@ -856,7 +825,7 @@ msgctxt "@info:backup_status"
msgid "There was an error listing your backups."
msgstr "Er is een fout opgetreden tijdens het vermelden van uw back-ups."
-#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:121
+#: /home/ruben/Projects/Cura/plugins/CuraDrive/src/DriveApiService.py:132
msgctxt "@info:backup_status"
msgid "There was an error trying to restore your backup."
msgstr "Er is een fout opgetreden tijdens het herstellen van uw back-up."
@@ -917,243 +886,261 @@ msgctxt "@item:inmenu"
msgid "Preview"
msgstr "Voorbeeld"
-#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:17
+#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UM2UpgradeSelection.py:19
#: /home/ruben/Projects/Cura/plugins/UltimakerMachineActions/UMOUpgradeSelection.py:18
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"
msgstr "Platform kalibreren"
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:81
-msgctxt "@tooltip"
-msgid "Outer Wall"
-msgstr "Buitenwand"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:82
-msgctxt "@tooltip"
-msgid "Inner Walls"
-msgstr "Binnenwanden"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:83
-msgctxt "@tooltip"
-msgid "Skin"
-msgstr "Skin"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:84
-msgctxt "@tooltip"
-msgid "Infill"
-msgstr "Vulling"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:85
-msgctxt "@tooltip"
-msgid "Support Infill"
-msgstr "Supportvulling"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:86
-msgctxt "@tooltip"
-msgid "Support Interface"
-msgstr "Verbindingsstructuur"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:87
-msgctxt "@tooltip"
-msgid "Support"
-msgstr "Supportstructuur"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:88
-msgctxt "@tooltip"
-msgid "Skirt"
-msgstr "Skirt"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:89
-msgctxt "@tooltip"
-msgid "Travel"
-msgstr "Beweging"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:90
-msgctxt "@tooltip"
-msgid "Retractions"
-msgstr "Intrekkingen"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:91
-msgctxt "@tooltip"
-msgid "Other"
-msgstr "Overig(e)"
-
-#: /home/ruben/Projects/Cura/cura/PrintInformation.py:309
-#, python-brace-format
-msgctxt "@label"
-msgid "Pre-sliced file {0}"
-msgstr "Vooraf geslicet bestand {0}"
-
-#: /home/ruben/Projects/Cura/cura/API/Account.py:77
+#: /home/ruben/Projects/Cura/cura/API/Account.py:82
msgctxt "@info:title"
msgid "Login failed"
msgstr "Inloggen mislukt"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:201
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:121
+#: /home/ruben/Projects/Cura/cura/Settings/cura_empty_instance_containers.py:33
+msgctxt "@info:not supported profile"
+msgid "Not supported"
+msgstr "Niet ondersteund"
+
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:203
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
msgctxt "@title:window"
msgid "File Already Exists"
msgstr "Het Bestand Bestaat Al"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:202
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:122
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:204
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:123
#, python-brace-format
msgctxt "@label Don't translate the XML tag !"
msgid "The file {0} already exists. Are you sure you want to overwrite it?"
msgstr "Het bestand {0} bestaat al. Weet u zeker dat u dit bestand wilt overschrijven?"
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:425
-#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:428
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:427
+#: /home/ruben/Projects/Cura/cura/Settings/ContainerManager.py:430
msgctxt "@info:status"
msgid "Invalid file URL:"
msgstr "Ongeldige bestands-URL:"
-#: /home/ruben/Projects/Cura/cura/Settings/ExtrudersModel.py:206
-msgctxt "@menuitem"
-msgid "Not overridden"
-msgstr "Niet overschreven"
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:925
+msgctxt "@info:message Followed by a list of settings."
+msgid "Settings have been changed to match the current availability of extruders:"
+msgstr "De instellingen zijn gewijzigd zodat deze overeenkomen met de huidige beschikbaarheid van extruders:"
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:915
-#, python-format
-msgctxt "@info:generic"
-msgid "Settings have been changed to match the current availability of extruders: [%s]"
-msgstr "De instellingen zijn gewijzigd zodat deze overeenkomen met de huidige beschikbaarheid van de extruders: [%s]"
-
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:917
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:927
msgctxt "@info:title"
msgid "Settings updated"
msgstr "De instellingen zijn bijgewerkt"
-#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1458
+#: /home/ruben/Projects/Cura/cura/Settings/MachineManager.py:1481
msgctxt "@info:title"
msgid "Extruder(s) Disabled"
msgstr "Extruder(s) uitgeschakeld"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:131
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:132
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or !"
msgid "Failed to export profile to {0}: {1}"
msgstr "Kan het profiel niet exporteren als {0}: {1}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:138
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:139
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Failed to export profile to {0}: Writer plugin reported failure."
msgstr "Kan het profiel niet exporteren als {0}: Invoegtoepassing voor de schrijver heeft een fout gerapporteerd."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:143
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
#, python-brace-format
msgctxt "@info:status Don't translate the XML tag !"
msgid "Exported profile to {0}"
msgstr "Het profiel is geëxporteerd als {0}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:144
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:145
msgctxt "@info:title"
msgid "Export succeeded"
msgstr "De export is voltooid"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:170
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:172
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}: {1}"
msgstr "Kan het profiel niet importeren uit {0}: {1}"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:177
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:176
#, 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 "Kan het profiel niet importeren uit {0} voordat een printer toegevoegd is."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:190
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:192
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "No custom profile to import in file {0}"
msgstr "Er is geen aangepast profiel om in het bestand {0} te importeren"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:194
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:196
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "Failed to import profile from {0}:"
msgstr "Kan het profiel niet importeren uit {0}:"
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:218
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:228
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:220
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:230
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags !"
msgid "This profile {0} contains incorrect data, could not import it."
msgstr "Dit profiel {0} bevat incorrecte gegevens. Kan het profiel niet importeren."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:241
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:243
#, 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 "De machine die is vastgelegd in het profiel {0} ({1}), komt niet overeen met uw huidige machine ({2}). Kan het profiel niet importeren."
-#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:313
+#: /home/ruben/Projects/Cura/cura/Settings/CuraContainerRegistry.py:315
#, python-brace-format
msgctxt "@info:status Don't translate the XML tags or