mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-08-14 00:36:25 +08:00
Merge remote-tracking branch 'upstream/master'
Updating branch
This commit is contained in:
commit
0ce53cbf08
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
name: CI/CD
|
name: CI
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches:
|
branches:
|
||||||
@ -10,11 +10,12 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
name: Build and test
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
container: ultimaker/cura-build-environment
|
container: ultimaker/cura-build-environment
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Cura
|
- name: Checkout Cura
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
- name: Build and test
|
- name: Build
|
||||||
run: docker/build.sh
|
run: docker/build.sh
|
||||||
|
- name: Test
|
||||||
|
run: docker/test.sh
|
@ -16,6 +16,8 @@ if(CURA_DEBUGMODE)
|
|||||||
set(_cura_debugmode "ON")
|
set(_cura_debugmode "ON")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
option(GENERATE_TRANSLATIONS "Should the translations be generated?" ON)
|
||||||
|
|
||||||
set(CURA_APP_NAME "cura" CACHE STRING "Short name of Cura, used for configuration folder")
|
set(CURA_APP_NAME "cura" CACHE STRING "Short name of Cura, used for configuration folder")
|
||||||
set(CURA_APP_DISPLAY_NAME "Ultimaker Cura" CACHE STRING "Display name of Cura")
|
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_VERSION "master" CACHE STRING "Version name of Cura")
|
||||||
@ -30,24 +32,16 @@ configure_file(${CMAKE_SOURCE_DIR}/cura.desktop.in ${CMAKE_BINARY_DIR}/cura.desk
|
|||||||
configure_file(cura/CuraVersion.py.in CuraVersion.py @ONLY)
|
configure_file(cura/CuraVersion.py.in CuraVersion.py @ONLY)
|
||||||
|
|
||||||
|
|
||||||
# FIXME: Remove the code for CMake <3.12 once we have switched over completely.
|
# FIXME: The new FindPython3 finds the system's Python3.6 reather than the Python3.5 that we built for Cura's environment.
|
||||||
# FindPython3 is a new module since CMake 3.12. It deprecates FindPythonInterp and FindPythonLibs. The FindPython3
|
# So we're using the old method here, with FindPythonInterp for now.
|
||||||
# module is copied from the CMake repository here so in CMake <3.12 we can still use it.
|
find_package(PythonInterp 3 REQUIRED)
|
||||||
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_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()
|
|
||||||
|
|
||||||
|
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})
|
||||||
|
|
||||||
if(NOT ${URANIUM_DIR} STREQUAL "")
|
if(NOT ${URANIUM_DIR} STREQUAL "")
|
||||||
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${URANIUM_DIR}/cmake")
|
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH};${URANIUM_DIR}/cmake")
|
||||||
@ -58,7 +52,9 @@ if(NOT ${URANIUM_SCRIPTS_DIR} STREQUAL "")
|
|||||||
# Extract Strings
|
# Extract Strings
|
||||||
add_custom_target(extract-messages ${URANIUM_SCRIPTS_DIR}/extract-messages ${CMAKE_SOURCE_DIR} cura)
|
add_custom_target(extract-messages ${URANIUM_SCRIPTS_DIR}/extract-messages ${CMAKE_SOURCE_DIR} cura)
|
||||||
# Build Translations
|
# Build Translations
|
||||||
CREATE_TRANSLATION_TARGETS()
|
if(${GENERATE_TRANSLATIONS})
|
||||||
|
CREATE_TRANSLATION_TARGETS()
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
# form of "a;b;c" or "a,b,c". By default all plugins will be installed.
|
# form of "a;b;c" or "a,b,c". By default all plugins will be installed.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
option(PRINT_PLUGIN_LIST "Should the list of plugins that are installed be printed?" ON)
|
||||||
|
|
||||||
# FIXME: Remove the code for CMake <3.12 once we have switched over completely.
|
# 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
|
# 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.
|
# module is copied from the CMake repository here so in CMake <3.12 we can still use it.
|
||||||
@ -81,7 +83,9 @@ foreach(_plugin_json_path ${_plugin_json_list})
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(_add_plugin)
|
if(_add_plugin)
|
||||||
message(STATUS "[+] PLUGIN TO INSTALL: ${_rel_plugin_dir}")
|
if(${PRINT_PLUGIN_LIST})
|
||||||
|
message(STATUS "[+] PLUGIN TO INSTALL: ${_rel_plugin_dir}")
|
||||||
|
endif()
|
||||||
get_filename_component(_rel_plugin_parent_dir ${_rel_plugin_dir} DIRECTORY)
|
get_filename_component(_rel_plugin_parent_dir ${_rel_plugin_dir} DIRECTORY)
|
||||||
install(DIRECTORY ${_rel_plugin_dir}
|
install(DIRECTORY ${_rel_plugin_dir}
|
||||||
DESTINATION lib${LIB_SUFFIX}/cura/${_rel_plugin_parent_dir}
|
DESTINATION lib${LIB_SUFFIX}/cura/${_rel_plugin_parent_dir}
|
||||||
@ -90,7 +94,9 @@ foreach(_plugin_json_path ${_plugin_json_list})
|
|||||||
)
|
)
|
||||||
list(APPEND _install_plugin_list ${_plugin_dir})
|
list(APPEND _install_plugin_list ${_plugin_dir})
|
||||||
elseif(_is_no_install_plugin)
|
elseif(_is_no_install_plugin)
|
||||||
message(STATUS "[-] PLUGIN TO REMOVE : ${_rel_plugin_dir}")
|
if(${PRINT_PLUGIN_LIST})
|
||||||
|
message(STATUS "[-] PLUGIN TO REMOVE : ${_rel_plugin_dir}")
|
||||||
|
endif()
|
||||||
execute_process(COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/mod_bundled_packages_json.py
|
execute_process(COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/mod_bundled_packages_json.py
|
||||||
-d ${CMAKE_CURRENT_SOURCE_DIR}/resources/bundled_packages
|
-d ${CMAKE_CURRENT_SOURCE_DIR}/resources/bundled_packages
|
||||||
${_plugin_dir_name}
|
${_plugin_dir_name}
|
||||||
|
@ -4,18 +4,11 @@
|
|||||||
include(CTest)
|
include(CTest)
|
||||||
include(CMakeParseArguments)
|
include(CMakeParseArguments)
|
||||||
|
|
||||||
# FIXME: Remove the code for CMake <3.12 once we have switched over completely.
|
# FIXME: The new FindPython3 finds the system's Python3.6 reather than the Python3.5 that we built for Cura's environment.
|
||||||
# FindPython3 is a new module since CMake 3.12. It deprecates FindPythonInterp and FindPythonLibs. The FindPython3
|
# So we're using the old method here, with FindPythonInterp for now.
|
||||||
# module is copied from the CMake repository here so in CMake <3.12 we can still use it.
|
find_package(PythonInterp 3 REQUIRED)
|
||||||
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_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)
|
add_custom_target(test-verbose COMMAND ${CMAKE_CTEST_COMMAND} --verbose)
|
||||||
|
|
||||||
@ -56,6 +49,14 @@ function(cura_add_test)
|
|||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
|
||||||
|
#Add code style test.
|
||||||
|
add_test(
|
||||||
|
NAME "code-style"
|
||||||
|
COMMAND ${Python3_EXECUTABLE} run_mypy.py
|
||||||
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
#Add test for import statements which are not compatible with all builds
|
#Add test for import statements which are not compatible with all builds
|
||||||
add_test(
|
add_test(
|
||||||
NAME "invalid-imports"
|
NAME "invalid-imports"
|
||||||
@ -74,13 +75,6 @@ foreach(_plugin ${_plugins})
|
|||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
|
|
||||||
#Add code style test.
|
|
||||||
add_test(
|
|
||||||
NAME "code-style"
|
|
||||||
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 for whether the shortcut alt-keys are unique in every translation.
|
||||||
add_test(
|
add_test(
|
||||||
NAME "shortcut-keys"
|
NAME "shortcut-keys"
|
||||||
|
@ -13,7 +13,7 @@ DEFAULT_CURA_DEBUG_MODE = False
|
|||||||
# Each release has a fixed SDK version coupled with it. It doesn't make sense to make it configurable because, for
|
# 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
|
# 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.
|
# CuraVersion.py.in template.
|
||||||
CuraSDKVersion = "7.2.0"
|
CuraSDKVersion = "7.3.0"
|
||||||
|
|
||||||
try:
|
try:
|
||||||
from cura.CuraVersion import CuraAppName # type: ignore
|
from cura.CuraVersion import CuraAppName # type: ignore
|
||||||
|
@ -40,7 +40,7 @@ class CuraActions(QObject):
|
|||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def openBugReportPage(self) -> None:
|
def openBugReportPage(self) -> None:
|
||||||
event = CallFunctionEvent(self._openUrl, [QUrl("https://github.com/Ultimaker/Cura/issues")], {})
|
event = CallFunctionEvent(self._openUrl, [QUrl("https://github.com/Ultimaker/Cura/issues/new/choose")], {})
|
||||||
cura.CuraApplication.CuraApplication.getInstance().functionEvent(event)
|
cura.CuraApplication.CuraApplication.getInstance().functionEvent(event)
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
|
@ -1725,7 +1725,7 @@ class CuraApplication(QtApplication):
|
|||||||
:param project_mode: How to handle project files. Either None(default): Follow user preference, "open_as_model"
|
:param project_mode: How to handle project files. Either None(default): Follow user preference, "open_as_model"
|
||||||
or "open_as_project". This parameter is only considered if the file is a project file.
|
or "open_as_project". This parameter is only considered if the file is a project file.
|
||||||
"""
|
"""
|
||||||
|
Logger.log("i", "Attempting to read file %s", file.toString())
|
||||||
if not file.isValid():
|
if not file.isValid():
|
||||||
return
|
return
|
||||||
|
|
||||||
@ -1799,6 +1799,9 @@ class CuraApplication(QtApplication):
|
|||||||
return
|
return
|
||||||
|
|
||||||
nodes = job.getResult()
|
nodes = job.getResult()
|
||||||
|
if nodes is None:
|
||||||
|
Logger.error("Read mesh job returned None. Mesh loading must have failed.")
|
||||||
|
return
|
||||||
file_name = job.getFileName()
|
file_name = job.getFileName()
|
||||||
file_name_lower = file_name.lower()
|
file_name_lower = file_name.lower()
|
||||||
file_extension = file_name_lower.split(".")[-1]
|
file_extension = file_name_lower.split(".")[-1]
|
||||||
|
@ -135,9 +135,7 @@ class MachineNode(ContainerNode):
|
|||||||
groups_by_name[name] = QualityChangesGroup(name, quality_type = quality_changes["quality_type"],
|
groups_by_name[name] = QualityChangesGroup(name, quality_type = quality_changes["quality_type"],
|
||||||
intent_category = quality_changes.get("intent_category", "default"),
|
intent_category = quality_changes.get("intent_category", "default"),
|
||||||
parent = CuraApplication.getInstance())
|
parent = CuraApplication.getInstance())
|
||||||
# CURA-6882
|
|
||||||
# Custom qualities are always available, even if they are based on the "not supported" profile.
|
|
||||||
groups_by_name[name].is_available = True
|
|
||||||
elif groups_by_name[name].intent_category == "default": # Intent category should be stored as "default" if everything is default or as the intent if any of the extruder have an actual intent.
|
elif groups_by_name[name].intent_category == "default": # Intent category should be stored as "default" if everything is default or as the intent if any of the extruder have an actual intent.
|
||||||
groups_by_name[name].intent_category = quality_changes.get("intent_category", "default")
|
groups_by_name[name].intent_category = quality_changes.get("intent_category", "default")
|
||||||
|
|
||||||
@ -146,6 +144,18 @@ class MachineNode(ContainerNode):
|
|||||||
else: # Global profile.
|
else: # Global profile.
|
||||||
groups_by_name[name].metadata_for_global = quality_changes
|
groups_by_name[name].metadata_for_global = quality_changes
|
||||||
|
|
||||||
|
quality_groups = self.getQualityGroups(variant_names, material_bases, extruder_enabled)
|
||||||
|
for quality_changes_group in groups_by_name.values():
|
||||||
|
if quality_changes_group.quality_type not in quality_groups:
|
||||||
|
if quality_changes_group.quality_type == "not_supported":
|
||||||
|
# Quality changes based on an empty profile are always available.
|
||||||
|
quality_changes_group.is_available = True
|
||||||
|
else:
|
||||||
|
quality_changes_group.is_available = False
|
||||||
|
else:
|
||||||
|
# Quality changes group is available iff the quality group it depends on is available. Irrespective of whether the intent category is available.
|
||||||
|
quality_changes_group.is_available = quality_groups[quality_changes_group.quality_type].is_available
|
||||||
|
|
||||||
return list(groups_by_name.values())
|
return list(groups_by_name.values())
|
||||||
|
|
||||||
def preferredGlobalQuality(self) -> "QualityNode":
|
def preferredGlobalQuality(self) -> "QualityNode":
|
||||||
|
@ -72,8 +72,8 @@ class GlobalStacksModel(ListModel):
|
|||||||
section_name = self._catalog.i18nc("@info:title", section_name)
|
section_name = self._catalog.i18nc("@info:title", section_name)
|
||||||
|
|
||||||
default_removal_warning = self._catalog.i18nc(
|
default_removal_warning = self._catalog.i18nc(
|
||||||
"@label ({} is object name)",
|
"@label {0} is the name of a printer that's about to be deleted.",
|
||||||
"Are you sure you wish to remove {}? This cannot be undone!", device_name
|
"Are you sure you wish to remove {0}? This cannot be undone!", device_name
|
||||||
)
|
)
|
||||||
removal_warning = container_stack.getMetaDataEntry("removal_warning", default_removal_warning)
|
removal_warning = container_stack.getMetaDataEntry("removal_warning", default_removal_warning)
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2019 Ultimaker B.V.
|
# Copyright (c) 2020 Ultimaker B.V.
|
||||||
# Cura is released under the terms of the LGPLv3 or higher.
|
# Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
from typing import Any, cast, Dict, Optional, TYPE_CHECKING
|
from typing import Any, cast, Dict, Optional, TYPE_CHECKING
|
||||||
@ -132,7 +132,7 @@ class QualityManagementModel(ListModel):
|
|||||||
for metadata in quality_changes_group.metadata_per_extruder.values():
|
for metadata in quality_changes_group.metadata_per_extruder.values():
|
||||||
extruder_container = cast(InstanceContainer, container_registry.findContainers(id = metadata["id"])[0])
|
extruder_container = cast(InstanceContainer, container_registry.findContainers(id = metadata["id"])[0])
|
||||||
extruder_container.setName(new_name)
|
extruder_container.setName(new_name)
|
||||||
global_container = cast(InstanceContainer, container_registry.findContainers(id=quality_changes_group.metadata_for_global["id"])[0])
|
global_container = cast(InstanceContainer, container_registry.findContainers(id = quality_changes_group.metadata_for_global["id"])[0])
|
||||||
global_container.setName(new_name)
|
global_container.setName(new_name)
|
||||||
|
|
||||||
quality_changes_group.name = new_name
|
quality_changes_group.name = new_name
|
||||||
@ -164,10 +164,16 @@ class QualityManagementModel(ListModel):
|
|||||||
quality_group = quality_model_item["quality_group"]
|
quality_group = quality_model_item["quality_group"]
|
||||||
quality_changes_group = quality_model_item["quality_changes_group"]
|
quality_changes_group = quality_model_item["quality_changes_group"]
|
||||||
if quality_changes_group is None:
|
if quality_changes_group is None:
|
||||||
# Create global quality changes only.
|
|
||||||
new_quality_changes = self._createQualityChanges(quality_group.quality_type, intent_category, new_name,
|
new_quality_changes = self._createQualityChanges(quality_group.quality_type, intent_category, new_name,
|
||||||
global_stack, extruder_stack = None)
|
global_stack, extruder_stack = None)
|
||||||
container_registry.addContainer(new_quality_changes)
|
container_registry.addContainer(new_quality_changes)
|
||||||
|
|
||||||
|
for extruder in global_stack.extruderList:
|
||||||
|
new_extruder_quality_changes = self._createQualityChanges(quality_group.quality_type, intent_category,
|
||||||
|
new_name,
|
||||||
|
global_stack, extruder_stack = extruder)
|
||||||
|
|
||||||
|
container_registry.addContainer(new_extruder_quality_changes)
|
||||||
else:
|
else:
|
||||||
for metadata in [quality_changes_group.metadata_for_global] + list(quality_changes_group.metadata_per_extruder.values()):
|
for metadata in [quality_changes_group.metadata_for_global] + list(quality_changes_group.metadata_per_extruder.values()):
|
||||||
containers = container_registry.findContainers(id = metadata["id"])
|
containers = container_registry.findContainers(id = metadata["id"])
|
||||||
@ -333,6 +339,7 @@ class QualityManagementModel(ListModel):
|
|||||||
"layer_height": layer_height, # layer_height is only used for sorting
|
"layer_height": layer_height, # layer_height is only used for sorting
|
||||||
}
|
}
|
||||||
item_list.append(item)
|
item_list.append(item)
|
||||||
|
|
||||||
# Sort by layer_height for built-in qualities
|
# Sort by layer_height for built-in qualities
|
||||||
item_list = sorted(item_list, key = lambda x: x["layer_height"])
|
item_list = sorted(item_list, key = lambda x: x["layer_height"])
|
||||||
|
|
||||||
@ -341,6 +348,9 @@ class QualityManagementModel(ListModel):
|
|||||||
available_intent_list = [i for i in available_intent_list if i[0] != "default"]
|
available_intent_list = [i for i in available_intent_list if i[0] != "default"]
|
||||||
result = []
|
result = []
|
||||||
for intent_category, quality_type in available_intent_list:
|
for intent_category, quality_type in available_intent_list:
|
||||||
|
if not quality_group_dict[quality_type].is_available:
|
||||||
|
continue
|
||||||
|
|
||||||
result.append({
|
result.append({
|
||||||
"name": quality_group_dict[quality_type].name, # Use the quality name as the display name
|
"name": quality_group_dict[quality_type].name, # Use the quality name as the display name
|
||||||
"is_read_only": True,
|
"is_read_only": True,
|
||||||
@ -361,6 +371,9 @@ class QualityManagementModel(ListModel):
|
|||||||
# CURA-6913 Note that custom qualities can be based on "not supported", so the quality group can be None.
|
# CURA-6913 Note that custom qualities can be based on "not supported", so the quality group can be None.
|
||||||
quality_group = quality_group_dict.get(quality_changes_group.quality_type)
|
quality_group = quality_group_dict.get(quality_changes_group.quality_type)
|
||||||
quality_type = quality_changes_group.quality_type
|
quality_type = quality_changes_group.quality_type
|
||||||
|
|
||||||
|
if not quality_changes_group.is_available:
|
||||||
|
continue
|
||||||
item = {"name": quality_changes_group.name,
|
item = {"name": quality_changes_group.name,
|
||||||
"is_read_only": False,
|
"is_read_only": False,
|
||||||
"quality_group": quality_group,
|
"quality_group": quality_group,
|
||||||
|
@ -76,8 +76,8 @@ class PreviewPass(RenderPass):
|
|||||||
Logger.error("Unable to compile shader program: overhang.shader")
|
Logger.error("Unable to compile shader program: overhang.shader")
|
||||||
|
|
||||||
if not self._non_printing_shader:
|
if not self._non_printing_shader:
|
||||||
|
self._non_printing_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "transparent_object.shader"))
|
||||||
if self._non_printing_shader:
|
if self._non_printing_shader:
|
||||||
self._non_printing_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "transparent_object.shader"))
|
|
||||||
self._non_printing_shader.setUniformValue("u_diffuseColor", [0.5, 0.5, 0.5, 0.5])
|
self._non_printing_shader.setUniformValue("u_diffuseColor", [0.5, 0.5, 0.5, 0.5])
|
||||||
self._non_printing_shader.setUniformValue("u_opacity", 0.6)
|
self._non_printing_shader.setUniformValue("u_opacity", 0.6)
|
||||||
|
|
||||||
|
@ -122,6 +122,8 @@ class ContainerManager(QObject):
|
|||||||
root_material.setMetaDataEntry(entry_name, entry_value)
|
root_material.setMetaDataEntry(entry_name, entry_value)
|
||||||
if sub_item_changed: #If it was only a sub-item that has changed then the setMetaDataEntry won't correctly notice that something changed, and we must manually signal that the metadata changed.
|
if sub_item_changed: #If it was only a sub-item that has changed then the setMetaDataEntry won't correctly notice that something changed, and we must manually signal that the metadata changed.
|
||||||
root_material.metaDataChanged.emit(root_material)
|
root_material.metaDataChanged.emit(root_material)
|
||||||
|
|
||||||
|
cura.CuraApplication.CuraApplication.getInstance().getMachineManager().updateUponMaterialMetadataChange()
|
||||||
return True
|
return True
|
||||||
|
|
||||||
@pyqtSlot(str, result = str)
|
@pyqtSlot(str, result = str)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# Copyright (c) 2018 Ultimaker B.V.
|
# Copyright (c) 2018 Ultimaker B.V.
|
||||||
# Cura is released under the terms of the LGPLv3 or higher.
|
# Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
from typing import Any, cast, List, Optional
|
from typing import Any, cast, List, Optional, Dict
|
||||||
from PyQt5.QtCore import pyqtProperty, pyqtSignal, QObject
|
from PyQt5.QtCore import pyqtProperty, pyqtSignal, QObject
|
||||||
|
|
||||||
from UM.Application import Application
|
from UM.Application import Application
|
||||||
@ -60,6 +60,8 @@ class CuraContainerStack(ContainerStack):
|
|||||||
import cura.CuraApplication #Here to prevent circular imports.
|
import cura.CuraApplication #Here to prevent circular imports.
|
||||||
self.setMetaDataEntry("setting_version", cura.CuraApplication.CuraApplication.SettingVersion)
|
self.setMetaDataEntry("setting_version", cura.CuraApplication.CuraApplication.SettingVersion)
|
||||||
|
|
||||||
|
self._settable_per_extruder_cache = {} # type: Dict[str, Any]
|
||||||
|
|
||||||
self.setDirty(False)
|
self.setDirty(False)
|
||||||
|
|
||||||
# This is emitted whenever the containersChanged signal from the ContainerStack base class is emitted.
|
# This is emitted whenever the containersChanged signal from the ContainerStack base class is emitted.
|
||||||
@ -387,6 +389,18 @@ class CuraContainerStack(ContainerStack):
|
|||||||
value = int(Application.getInstance().getMachineManager().defaultExtruderPosition)
|
value = int(Application.getInstance().getMachineManager().defaultExtruderPosition)
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
def getProperty(self, key: str, property_name: str, context = None) -> Any:
|
||||||
|
if property_name == "settable_per_extruder":
|
||||||
|
# Setable per extruder isn't a value that can ever change. So once we requested it once, we can just keep
|
||||||
|
# that in memory.
|
||||||
|
try:
|
||||||
|
return self._settable_per_extruder_cache[key]
|
||||||
|
except KeyError:
|
||||||
|
self._settable_per_extruder_cache[key] = super().getProperty(key, property_name, context)
|
||||||
|
return self._settable_per_extruder_cache[key]
|
||||||
|
|
||||||
|
return super().getProperty(key, property_name, context)
|
||||||
|
|
||||||
|
|
||||||
class _ContainerIndexes:
|
class _ContainerIndexes:
|
||||||
"""Private helper class to keep track of container positions and their types."""
|
"""Private helper class to keep track of container positions and their types."""
|
||||||
|
@ -16,13 +16,13 @@ from .ExtruderStack import ExtruderStack
|
|||||||
class CuraStackBuilder:
|
class CuraStackBuilder:
|
||||||
"""Contains helper functions to create new machines."""
|
"""Contains helper functions to create new machines."""
|
||||||
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def createMachine(cls, name: str, definition_id: str) -> Optional[GlobalStack]:
|
def createMachine(cls, name: str, definition_id: str, machine_extruder_count: Optional[int] = None) -> Optional[GlobalStack]:
|
||||||
"""Create a new instance of a machine.
|
"""Create a new instance of a machine.
|
||||||
|
|
||||||
:param name: The name of the new machine.
|
:param name: The name of the new machine.
|
||||||
:param definition_id: The ID of the machine definition to use.
|
:param definition_id: The ID of the machine definition to use.
|
||||||
|
:param machine_extruder_count: The number of extruders in the machine.
|
||||||
|
|
||||||
:return: The new global stack or None if an error occurred.
|
:return: The new global stack or None if an error occurred.
|
||||||
"""
|
"""
|
||||||
@ -62,10 +62,18 @@ class CuraStackBuilder:
|
|||||||
for position in extruder_dict:
|
for position in extruder_dict:
|
||||||
try:
|
try:
|
||||||
cls.createExtruderStackWithDefaultSetup(new_global_stack, position)
|
cls.createExtruderStackWithDefaultSetup(new_global_stack, position)
|
||||||
except IndexError:
|
except IndexError as e:
|
||||||
|
Logger.logException("e", "Failed to create an extruder stack for position {pos}: {err}".format(pos = position, err = str(e)))
|
||||||
return None
|
return None
|
||||||
|
|
||||||
for new_extruder in new_global_stack.extruderList: # Only register the extruders if we're sure that all of them are correct.
|
# If given, set the machine_extruder_count when creating the machine, or else the extruderList used bellow will
|
||||||
|
# not return the correct extruder list (since by default, the machine_extruder_count is 1) in machines with
|
||||||
|
# settable number of extruders.
|
||||||
|
if machine_extruder_count and 0 <= machine_extruder_count <= len(extruder_dict):
|
||||||
|
new_global_stack.setProperty("machine_extruder_count", "value", machine_extruder_count)
|
||||||
|
|
||||||
|
# Only register the extruders if we're sure that all of them are correct.
|
||||||
|
for new_extruder in new_global_stack.extruderList:
|
||||||
registry.addContainer(new_extruder)
|
registry.addContainer(new_extruder)
|
||||||
|
|
||||||
# Register the global stack after the extruder stacks are created. This prevents the registry from adding another
|
# Register the global stack after the extruder stacks are created. This prevents the registry from adding another
|
||||||
|
@ -131,13 +131,13 @@ class ExtruderStack(CuraContainerStack):
|
|||||||
if not self._next_stack:
|
if not self._next_stack:
|
||||||
raise Exceptions.NoGlobalStackError("Extruder {id} is missing the next stack!".format(id = self.id))
|
raise Exceptions.NoGlobalStackError("Extruder {id} is missing the next stack!".format(id = self.id))
|
||||||
|
|
||||||
if context is None:
|
if context:
|
||||||
context = PropertyEvaluationContext()
|
context.pushContainer(self)
|
||||||
context.pushContainer(self)
|
|
||||||
|
|
||||||
if not super().getProperty(key, "settable_per_extruder", context):
|
if not super().getProperty(key, "settable_per_extruder", context):
|
||||||
result = self.getNextStack().getProperty(key, property_name, context)
|
result = self.getNextStack().getProperty(key, property_name, context)
|
||||||
context.popContainer()
|
if context:
|
||||||
|
context.popContainer()
|
||||||
return result
|
return result
|
||||||
|
|
||||||
limit_to_extruder = super().getProperty(key, "limit_to_extruder", context)
|
limit_to_extruder = super().getProperty(key, "limit_to_extruder", context)
|
||||||
@ -150,13 +150,15 @@ class ExtruderStack(CuraContainerStack):
|
|||||||
try:
|
try:
|
||||||
result = self.getNextStack().extruderList[int(limit_to_extruder)].getProperty(key, property_name, context)
|
result = self.getNextStack().extruderList[int(limit_to_extruder)].getProperty(key, property_name, context)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
context.popContainer()
|
if context:
|
||||||
|
context.popContainer()
|
||||||
return result
|
return result
|
||||||
except IndexError:
|
except IndexError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
result = super().getProperty(key, property_name, context)
|
result = super().getProperty(key, property_name, context)
|
||||||
context.popContainer()
|
if context:
|
||||||
|
context.popContainer()
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@override(CuraContainerStack)
|
@override(CuraContainerStack)
|
||||||
|
@ -211,9 +211,8 @@ class GlobalStack(CuraContainerStack):
|
|||||||
if not self.definition.findDefinitions(key = key):
|
if not self.definition.findDefinitions(key = key):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if context is None:
|
if context:
|
||||||
context = PropertyEvaluationContext()
|
context.pushContainer(self)
|
||||||
context.pushContainer(self)
|
|
||||||
|
|
||||||
# Handle the "resolve" property.
|
# Handle the "resolve" property.
|
||||||
#TODO: Why the hell does this involve threading?
|
#TODO: Why the hell does this involve threading?
|
||||||
@ -238,13 +237,15 @@ class GlobalStack(CuraContainerStack):
|
|||||||
if super().getProperty(key, "settable_per_extruder", context):
|
if super().getProperty(key, "settable_per_extruder", context):
|
||||||
result = self._extruders[str(limit_to_extruder)].getProperty(key, property_name, context)
|
result = self._extruders[str(limit_to_extruder)].getProperty(key, property_name, context)
|
||||||
if result is not None:
|
if result is not None:
|
||||||
context.popContainer()
|
if context:
|
||||||
|
context.popContainer()
|
||||||
return result
|
return result
|
||||||
else:
|
else:
|
||||||
Logger.log("e", "Setting {setting} has limit_to_extruder but is not settable per extruder!", setting = key)
|
Logger.log("e", "Setting {setting} has limit_to_extruder but is not settable per extruder!", setting = key)
|
||||||
|
|
||||||
result = super().getProperty(key, property_name, context)
|
result = super().getProperty(key, property_name, context)
|
||||||
context.popContainer()
|
if context:
|
||||||
|
context.popContainer()
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@override(ContainerStack)
|
@override(ContainerStack)
|
||||||
@ -256,8 +257,6 @@ class GlobalStack(CuraContainerStack):
|
|||||||
|
|
||||||
raise Exceptions.InvalidOperationError("Global stack cannot have a next stack!")
|
raise Exceptions.InvalidOperationError("Global stack cannot have a next stack!")
|
||||||
|
|
||||||
# protected:
|
|
||||||
|
|
||||||
# Determine whether or not we should try to get the "resolve" property instead of the
|
# Determine whether or not we should try to get the "resolve" property instead of the
|
||||||
# requested property.
|
# requested property.
|
||||||
def _shouldResolve(self, key: str, property_name: str, context: Optional[PropertyEvaluationContext] = None) -> bool:
|
def _shouldResolve(self, key: str, property_name: str, context: Optional[PropertyEvaluationContext] = None) -> bool:
|
||||||
@ -265,6 +264,10 @@ class GlobalStack(CuraContainerStack):
|
|||||||
# Do not try to resolve anything but the "value" property
|
# Do not try to resolve anything but the "value" property
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
if not self.definition.getProperty(key, "resolve"):
|
||||||
|
# If there isn't a resolve set for this setting, there isn't anything to do here.
|
||||||
|
return False
|
||||||
|
|
||||||
current_thread = threading.current_thread()
|
current_thread = threading.current_thread()
|
||||||
if key in self._resolving_settings[current_thread.name]:
|
if key in self._resolving_settings[current_thread.name]:
|
||||||
# To prevent infinite recursion, if getProperty is called with the same key as
|
# To prevent infinite recursion, if getProperty is called with the same key as
|
||||||
@ -273,10 +276,8 @@ class GlobalStack(CuraContainerStack):
|
|||||||
# track all settings that are being resolved.
|
# track all settings that are being resolved.
|
||||||
return False
|
return False
|
||||||
|
|
||||||
setting_state = super().getProperty(key, "state", context = context)
|
if self.hasUserValue(key):
|
||||||
if setting_state is not None and setting_state != InstanceState.Default:
|
# When the user has explicitly set a value, we should ignore any resolve and just return that value.
|
||||||
# When the user has explicitly set a value, we should ignore any resolve and
|
|
||||||
# just return that value.
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
@ -329,11 +329,16 @@ class MachineManager(QObject):
|
|||||||
# This signal might not have been emitted yet (if it didn't change) but we still want the models to update that depend on it because we changed the contents of the containers too.
|
# This signal might not have been emitted yet (if it didn't change) but we still want the models to update that depend on it because we changed the contents of the containers too.
|
||||||
extruder_manager.activeExtruderChanged.emit()
|
extruder_manager.activeExtruderChanged.emit()
|
||||||
|
|
||||||
|
self._validateVariantsAndMaterials(global_stack)
|
||||||
|
|
||||||
|
def _validateVariantsAndMaterials(self, global_stack) -> None:
|
||||||
# Validate if the machine has the correct variants and materials.
|
# Validate if the machine has the correct variants and materials.
|
||||||
# It can happen that a variant or material is empty, even though the machine has them. This will ensure that
|
# It can happen that a variant or material is empty, even though the machine has them. This will ensure that
|
||||||
# that situation will be fixed (and not occur again, since it switches it out to the preferred variant or
|
# that situation will be fixed (and not occur again, since it switches it out to the preferred variant or
|
||||||
# variant instead!)
|
# variant instead!)
|
||||||
machine_node = ContainerTree.getInstance().machines[global_stack.definition.getId()]
|
machine_node = ContainerTree.getInstance().machines[global_stack.definition.getId()]
|
||||||
|
if not self._global_container_stack:
|
||||||
|
return
|
||||||
for extruder in self._global_container_stack.extruderList:
|
for extruder in self._global_container_stack.extruderList:
|
||||||
variant_name = extruder.variant.getName()
|
variant_name = extruder.variant.getName()
|
||||||
variant_node = machine_node.variants.get(variant_name)
|
variant_node = machine_node.variants.get(variant_name)
|
||||||
@ -347,6 +352,7 @@ class MachineManager(QObject):
|
|||||||
Logger.log("w", "An extruder has an unknown material, switching it to the preferred material")
|
Logger.log("w", "An extruder has an unknown material, switching it to the preferred material")
|
||||||
self.setMaterialById(extruder.getMetaDataEntry("position"), machine_node.preferred_material)
|
self.setMaterialById(extruder.getMetaDataEntry("position"), machine_node.preferred_material)
|
||||||
|
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def getMachine(definition_id: str, metadata_filter: Optional[Dict[str, str]] = None) -> Optional["GlobalStack"]:
|
def getMachine(definition_id: str, metadata_filter: Optional[Dict[str, str]] = None) -> Optional["GlobalStack"]:
|
||||||
"""Given a definition id, return the machine with this id.
|
"""Given a definition id, return the machine with this id.
|
||||||
@ -584,14 +590,14 @@ class MachineManager(QObject):
|
|||||||
|
|
||||||
@pyqtProperty(str, notify = activeQualityGroupChanged)
|
@pyqtProperty(str, notify = activeQualityGroupChanged)
|
||||||
def activeQualityType(self) -> str:
|
def activeQualityType(self) -> str:
|
||||||
global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
global_stack = self._application.getGlobalContainerStack()
|
||||||
if not global_stack:
|
if not global_stack:
|
||||||
return ""
|
return ""
|
||||||
return global_stack.quality.getMetaDataEntry("quality_type")
|
return global_stack.quality.getMetaDataEntry("quality_type")
|
||||||
|
|
||||||
@pyqtProperty(bool, notify = activeQualityGroupChanged)
|
@pyqtProperty(bool, notify = activeQualityGroupChanged)
|
||||||
def isActiveQualitySupported(self) -> bool:
|
def isActiveQualitySupported(self) -> bool:
|
||||||
global_container_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
global_container_stack = self._application.getGlobalContainerStack()
|
||||||
if not global_container_stack:
|
if not global_container_stack:
|
||||||
return False
|
return False
|
||||||
active_quality_group = self.activeQualityGroup()
|
active_quality_group = self.activeQualityGroup()
|
||||||
@ -599,9 +605,10 @@ class MachineManager(QObject):
|
|||||||
return False
|
return False
|
||||||
return active_quality_group.is_available
|
return active_quality_group.is_available
|
||||||
|
|
||||||
|
|
||||||
@pyqtProperty(bool, notify = activeQualityGroupChanged)
|
@pyqtProperty(bool, notify = activeQualityGroupChanged)
|
||||||
def isActiveQualityExperimental(self) -> bool:
|
def isActiveQualityExperimental(self) -> bool:
|
||||||
global_container_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
global_container_stack = self._application.getGlobalContainerStack()
|
||||||
if not global_container_stack:
|
if not global_container_stack:
|
||||||
return False
|
return False
|
||||||
active_quality_group = self.activeQualityGroup()
|
active_quality_group = self.activeQualityGroup()
|
||||||
@ -611,7 +618,7 @@ class MachineManager(QObject):
|
|||||||
|
|
||||||
@pyqtProperty(str, notify = activeIntentChanged)
|
@pyqtProperty(str, notify = activeIntentChanged)
|
||||||
def activeIntentCategory(self) -> str:
|
def activeIntentCategory(self) -> str:
|
||||||
global_container_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
global_container_stack = self._application.getGlobalContainerStack()
|
||||||
|
|
||||||
if not global_container_stack:
|
if not global_container_stack:
|
||||||
return ""
|
return ""
|
||||||
@ -620,7 +627,7 @@ class MachineManager(QObject):
|
|||||||
# Provies a list of extruder positions that have a different intent from the active one.
|
# Provies a list of extruder positions that have a different intent from the active one.
|
||||||
@pyqtProperty("QStringList", notify=activeIntentChanged)
|
@pyqtProperty("QStringList", notify=activeIntentChanged)
|
||||||
def extruderPositionsWithNonActiveIntent(self):
|
def extruderPositionsWithNonActiveIntent(self):
|
||||||
global_container_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
global_container_stack = self._application.getGlobalContainerStack()
|
||||||
|
|
||||||
if not global_container_stack:
|
if not global_container_stack:
|
||||||
return []
|
return []
|
||||||
@ -689,7 +696,7 @@ class MachineManager(QObject):
|
|||||||
|
|
||||||
:returns: DefinitionID (string) if found, empty string otherwise
|
:returns: DefinitionID (string) if found, empty string otherwise
|
||||||
"""
|
"""
|
||||||
global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
global_stack = self._application.getGlobalContainerStack()
|
||||||
if not global_stack:
|
if not global_stack:
|
||||||
return ""
|
return ""
|
||||||
return ContainerTree.getInstance().machines[global_stack.definition.getId()].quality_definition
|
return ContainerTree.getInstance().machines[global_stack.definition.getId()].quality_definition
|
||||||
@ -1114,7 +1121,7 @@ class MachineManager(QObject):
|
|||||||
if quality_group is None:
|
if quality_group is None:
|
||||||
self._fixQualityChangesGroupToNotSupported(quality_changes_group)
|
self._fixQualityChangesGroupToNotSupported(quality_changes_group)
|
||||||
|
|
||||||
container_registry = cura.CuraApplication.CuraApplication.getInstance().getContainerRegistry()
|
container_registry = self._application.getContainerRegistry()
|
||||||
quality_changes_container = empty_quality_changes_container
|
quality_changes_container = empty_quality_changes_container
|
||||||
quality_container = empty_quality_container # type: InstanceContainer
|
quality_container = empty_quality_container # type: InstanceContainer
|
||||||
if quality_changes_group.metadata_for_global:
|
if quality_changes_group.metadata_for_global:
|
||||||
@ -1196,7 +1203,7 @@ class MachineManager(QObject):
|
|||||||
def _updateQualityWithMaterial(self, *args: Any) -> None:
|
def _updateQualityWithMaterial(self, *args: Any) -> None:
|
||||||
"""Update current quality type and machine after setting material"""
|
"""Update current quality type and machine after setting material"""
|
||||||
|
|
||||||
global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
global_stack = self._application.getGlobalContainerStack()
|
||||||
if global_stack is None:
|
if global_stack is None:
|
||||||
return
|
return
|
||||||
Logger.log("d", "Updating quality/quality_changes due to material change")
|
Logger.log("d", "Updating quality/quality_changes due to material change")
|
||||||
@ -1212,9 +1219,8 @@ class MachineManager(QObject):
|
|||||||
return
|
return
|
||||||
|
|
||||||
if not available_quality_types:
|
if not available_quality_types:
|
||||||
if global_stack.qualityChanges == empty_quality_changes_container:
|
Logger.log("i", "No available quality types found, setting all qualities to empty (Not Supported).")
|
||||||
Logger.log("i", "No available quality types found, setting all qualities to empty (Not Supported).")
|
self._setEmptyQuality()
|
||||||
self._setEmptyQuality()
|
|
||||||
return
|
return
|
||||||
|
|
||||||
if current_quality_type in available_quality_types:
|
if current_quality_type in available_quality_types:
|
||||||
@ -1239,7 +1245,7 @@ class MachineManager(QObject):
|
|||||||
def _updateIntentWithQuality(self):
|
def _updateIntentWithQuality(self):
|
||||||
"""Update the current intent after the quality changed"""
|
"""Update the current intent after the quality changed"""
|
||||||
|
|
||||||
global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
global_stack = self._application.getGlobalContainerStack()
|
||||||
if global_stack is None:
|
if global_stack is None:
|
||||||
return
|
return
|
||||||
Logger.log("d", "Updating intent due to quality change")
|
Logger.log("d", "Updating intent due to quality change")
|
||||||
@ -1552,7 +1558,7 @@ class MachineManager(QObject):
|
|||||||
# - "my_profile - Engineering - Fine" (based on an intent)
|
# - "my_profile - Engineering - Fine" (based on an intent)
|
||||||
@pyqtProperty("QVariantMap", notify = activeQualityDisplayNameChanged)
|
@pyqtProperty("QVariantMap", notify = activeQualityDisplayNameChanged)
|
||||||
def activeQualityDisplayNameMap(self) -> Dict[str, str]:
|
def activeQualityDisplayNameMap(self) -> Dict[str, str]:
|
||||||
global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
global_stack = self._application.getGlobalContainerStack()
|
||||||
if global_stack is None:
|
if global_stack is None:
|
||||||
return {"main": "",
|
return {"main": "",
|
||||||
"suffix": ""}
|
"suffix": ""}
|
||||||
@ -1589,7 +1595,7 @@ class MachineManager(QObject):
|
|||||||
:param intent_category: The intent category to change to.
|
:param intent_category: The intent category to change to.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
global_stack = self._application.getGlobalContainerStack()
|
||||||
if global_stack is None:
|
if global_stack is None:
|
||||||
return
|
return
|
||||||
container_tree = ContainerTree.getInstance()
|
container_tree = ContainerTree.getInstance()
|
||||||
@ -1628,7 +1634,7 @@ class MachineManager(QObject):
|
|||||||
:return: The currently active quality group.
|
:return: The currently active quality group.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
global_stack = self._application.getGlobalContainerStack()
|
||||||
if not global_stack or global_stack.quality == empty_quality_container:
|
if not global_stack or global_stack.quality == empty_quality_container:
|
||||||
return None
|
return None
|
||||||
return ContainerTree.getInstance().getCurrentQualityGroups().get(self.activeQualityType)
|
return ContainerTree.getInstance().getCurrentQualityGroups().get(self.activeQualityType)
|
||||||
@ -1665,7 +1671,7 @@ class MachineManager(QObject):
|
|||||||
|
|
||||||
@pyqtProperty(QObject, fset = setQualityChangesGroup, notify = activeQualityChangesGroupChanged)
|
@pyqtProperty(QObject, fset = setQualityChangesGroup, notify = activeQualityChangesGroupChanged)
|
||||||
def activeQualityChangesGroup(self) -> Optional["QualityChangesGroup"]:
|
def activeQualityChangesGroup(self) -> Optional["QualityChangesGroup"]:
|
||||||
global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
global_stack = self._application.getGlobalContainerStack()
|
||||||
if global_stack is None or global_stack.qualityChanges == empty_quality_changes_container:
|
if global_stack is None or global_stack.qualityChanges == empty_quality_changes_container:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@ -1680,12 +1686,12 @@ class MachineManager(QObject):
|
|||||||
|
|
||||||
@pyqtProperty(bool, notify = activeQualityChangesGroupChanged)
|
@pyqtProperty(bool, notify = activeQualityChangesGroupChanged)
|
||||||
def hasCustomQuality(self) -> bool:
|
def hasCustomQuality(self) -> bool:
|
||||||
global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
global_stack = self._application.getGlobalContainerStack()
|
||||||
return global_stack is None or global_stack.qualityChanges != empty_quality_changes_container
|
return global_stack is None or global_stack.qualityChanges != empty_quality_changes_container
|
||||||
|
|
||||||
@pyqtProperty(str, notify = activeQualityGroupChanged)
|
@pyqtProperty(str, notify = activeQualityGroupChanged)
|
||||||
def activeQualityOrQualityChangesName(self) -> str:
|
def activeQualityOrQualityChangesName(self) -> str:
|
||||||
global_container_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
global_container_stack = self._application.getGlobalContainerStack()
|
||||||
if not global_container_stack:
|
if not global_container_stack:
|
||||||
return empty_quality_container.getName()
|
return empty_quality_container.getName()
|
||||||
if global_container_stack.qualityChanges != empty_quality_changes_container:
|
if global_container_stack.qualityChanges != empty_quality_changes_container:
|
||||||
@ -1694,17 +1700,17 @@ class MachineManager(QObject):
|
|||||||
|
|
||||||
@pyqtProperty(bool, notify = activeQualityGroupChanged)
|
@pyqtProperty(bool, notify = activeQualityGroupChanged)
|
||||||
def hasNotSupportedQuality(self) -> bool:
|
def hasNotSupportedQuality(self) -> bool:
|
||||||
global_container_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
global_container_stack = self._application.getGlobalContainerStack()
|
||||||
return (not global_container_stack is None) and global_container_stack.quality == empty_quality_container and global_container_stack.qualityChanges == empty_quality_changes_container
|
return (not global_container_stack is None) and global_container_stack.quality == empty_quality_container and global_container_stack.qualityChanges == empty_quality_changes_container
|
||||||
|
|
||||||
@pyqtProperty(bool, notify = activeQualityGroupChanged)
|
@pyqtProperty(bool, notify = activeQualityGroupChanged)
|
||||||
def isActiveQualityCustom(self) -> bool:
|
def isActiveQualityCustom(self) -> bool:
|
||||||
global_stack = cura.CuraApplication.CuraApplication.getInstance().getGlobalContainerStack()
|
global_stack = self._application.getGlobalContainerStack()
|
||||||
if global_stack is None:
|
if global_stack is None:
|
||||||
return False
|
return False
|
||||||
return global_stack.qualityChanges != empty_quality_changes_container
|
return global_stack.qualityChanges != empty_quality_changes_container
|
||||||
|
|
||||||
def _updateUponMaterialMetadataChange(self) -> None:
|
def updateUponMaterialMetadataChange(self) -> None:
|
||||||
if self._global_container_stack is None:
|
if self._global_container_stack is None:
|
||||||
return
|
return
|
||||||
with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue):
|
with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue):
|
||||||
|
@ -65,6 +65,7 @@ cmake3 \
|
|||||||
-DCMAKE_PREFIX_PATH="${CURA_BUILD_ENV_PATH}" \
|
-DCMAKE_PREFIX_PATH="${CURA_BUILD_ENV_PATH}" \
|
||||||
-DURANIUM_DIR="${PROJECT_DIR}/Uranium" \
|
-DURANIUM_DIR="${PROJECT_DIR}/Uranium" \
|
||||||
-DBUILD_TESTS=ON \
|
-DBUILD_TESTS=ON \
|
||||||
|
-DPRINT_PLUGIN_LIST=OFF \
|
||||||
|
-DGENERATE_TRANSLATIONS=OFF \
|
||||||
..
|
..
|
||||||
make
|
make
|
||||||
ctest3 -j4 --output-on-failure -T Test
|
|
||||||
|
3
docker/test.sh
Executable file
3
docker/test.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
cd build
|
||||||
|
ctest3 -j4 --output-on-failure -T Test
|
@ -133,12 +133,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||||||
# In Cura 2.5 and 2.6, the empty profiles used to have those long names
|
# In Cura 2.5 and 2.6, the empty profiles used to have those long names
|
||||||
self._old_empty_profile_id_dict = {"empty_%s" % k: "empty" for k in ["material", "variant"]}
|
self._old_empty_profile_id_dict = {"empty_%s" % k: "empty" for k in ["material", "variant"]}
|
||||||
|
|
||||||
self._is_same_machine_type = False
|
|
||||||
self._old_new_materials = {} # type: Dict[str, str]
|
self._old_new_materials = {} # type: Dict[str, str]
|
||||||
self._machine_info = None
|
self._machine_info = None
|
||||||
|
|
||||||
def _clearState(self):
|
def _clearState(self):
|
||||||
self._is_same_machine_type = False
|
|
||||||
self._id_mapping = {}
|
self._id_mapping = {}
|
||||||
self._old_new_materials = {}
|
self._old_new_materials = {}
|
||||||
self._machine_info = None
|
self._machine_info = None
|
||||||
@ -229,6 +227,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||||||
# Read definition containers
|
# Read definition containers
|
||||||
#
|
#
|
||||||
machine_definition_id = None
|
machine_definition_id = None
|
||||||
|
updatable_machines = []
|
||||||
machine_definition_container_count = 0
|
machine_definition_container_count = 0
|
||||||
extruder_definition_container_count = 0
|
extruder_definition_container_count = 0
|
||||||
definition_container_files = [name for name in cura_file_names if name.endswith(self._definition_container_suffix)]
|
definition_container_files = [name for name in cura_file_names if name.endswith(self._definition_container_suffix)]
|
||||||
@ -245,6 +244,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||||||
definition_container_type = definition_container.get("type")
|
definition_container_type = definition_container.get("type")
|
||||||
if definition_container_type == "machine":
|
if definition_container_type == "machine":
|
||||||
machine_definition_id = container_id
|
machine_definition_id = container_id
|
||||||
|
machine_definition_containers = self._container_registry.findDefinitionContainers(id = machine_definition_id)
|
||||||
|
if machine_definition_containers:
|
||||||
|
updatable_machines = [machine for machine in self._container_registry.findContainerStacks(type = "machine") if machine.definition == machine_definition_containers[0]]
|
||||||
machine_type = definition_container["name"]
|
machine_type = definition_container["name"]
|
||||||
variant_type_name = definition_container.get("variants_name", variant_type_name)
|
variant_type_name = definition_container.get("variants_name", variant_type_name)
|
||||||
|
|
||||||
@ -386,8 +388,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||||||
machine_definition_id = id_list[7]
|
machine_definition_id = id_list[7]
|
||||||
|
|
||||||
stacks = self._container_registry.findContainerStacks(name = machine_name, type = "machine")
|
stacks = self._container_registry.findContainerStacks(name = machine_name, type = "machine")
|
||||||
self._is_same_machine_type = True
|
|
||||||
existing_global_stack = None
|
existing_global_stack = None
|
||||||
|
global_stack = None
|
||||||
|
|
||||||
if stacks:
|
if stacks:
|
||||||
global_stack = stacks[0]
|
global_stack = stacks[0]
|
||||||
@ -400,7 +402,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||||||
if global_stack.getContainer(index).getId() != container_id:
|
if global_stack.getContainer(index).getId() != container_id:
|
||||||
machine_conflict = True
|
machine_conflict = True
|
||||||
break
|
break
|
||||||
self._is_same_machine_type = global_stack.definition.getId() == machine_definition_id
|
|
||||||
|
if updatable_machines and not containers_found_dict["machine"]:
|
||||||
|
containers_found_dict["machine"] = True
|
||||||
|
|
||||||
# Get quality type
|
# Get quality type
|
||||||
parser = ConfigParser(interpolation = None)
|
parser = ConfigParser(interpolation = None)
|
||||||
@ -485,7 +489,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||||||
if intent_id not in ("empty", "empty_intent"):
|
if intent_id not in ("empty", "empty_intent"):
|
||||||
extruder_info.intent_info = instance_container_info_dict[intent_id]
|
extruder_info.intent_info = instance_container_info_dict[intent_id]
|
||||||
|
|
||||||
if not machine_conflict and containers_found_dict["machine"]:
|
if not machine_conflict and containers_found_dict["machine"] and global_stack:
|
||||||
if int(position) >= len(global_stack.extruderList):
|
if int(position) >= len(global_stack.extruderList):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@ -502,6 +506,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||||||
# Now we know which material is in which extruder. Let's use that to sort the material_labels according to
|
# Now we know which material is in which extruder. Let's use that to sort the material_labels according to
|
||||||
# their extruder position
|
# their extruder position
|
||||||
material_labels = [material_name for pos, material_name in sorted(materials_in_extruders_dict.items())]
|
material_labels = [material_name for pos, material_name in sorted(materials_in_extruders_dict.items())]
|
||||||
|
machine_extruder_count = self._getMachineExtruderCount()
|
||||||
|
if machine_extruder_count:
|
||||||
|
material_labels = material_labels[:machine_extruder_count]
|
||||||
|
|
||||||
num_visible_settings = 0
|
num_visible_settings = 0
|
||||||
try:
|
try:
|
||||||
@ -555,9 +562,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||||||
self._machine_info.custom_quality_name = quality_name
|
self._machine_info.custom_quality_name = quality_name
|
||||||
self._machine_info.intent_category = intent_category
|
self._machine_info.intent_category = intent_category
|
||||||
|
|
||||||
if machine_conflict and not self._is_same_machine_type:
|
|
||||||
machine_conflict = False
|
|
||||||
|
|
||||||
is_printer_group = False
|
is_printer_group = False
|
||||||
if machine_conflict:
|
if machine_conflict:
|
||||||
group_name = existing_global_stack.getMetaDataEntry("group_name")
|
group_name = existing_global_stack.getMetaDataEntry("group_name")
|
||||||
@ -578,6 +582,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||||||
self._dialog.setNumSettingsOverriddenByQualityChanges(num_settings_overridden_by_quality_changes)
|
self._dialog.setNumSettingsOverriddenByQualityChanges(num_settings_overridden_by_quality_changes)
|
||||||
self._dialog.setNumUserSettings(num_user_settings)
|
self._dialog.setNumUserSettings(num_user_settings)
|
||||||
self._dialog.setActiveMode(active_mode)
|
self._dialog.setActiveMode(active_mode)
|
||||||
|
self._dialog.setUpdatableMachines(updatable_machines)
|
||||||
self._dialog.setMachineName(machine_name)
|
self._dialog.setMachineName(machine_name)
|
||||||
self._dialog.setMaterialLabels(material_labels)
|
self._dialog.setMaterialLabels(material_labels)
|
||||||
self._dialog.setMachineType(machine_type)
|
self._dialog.setMachineType(machine_type)
|
||||||
@ -658,21 +663,28 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||||||
|
|
||||||
application.expandedCategoriesChanged.emit() # Notify the GUI of the change
|
application.expandedCategoriesChanged.emit() # Notify the GUI of the change
|
||||||
|
|
||||||
# If a machine with the same name is of a different type, always create a new one.
|
# If there are no machines of the same type, create a new machine.
|
||||||
if not self._is_same_machine_type or self._resolve_strategies["machine"] != "override":
|
if self._resolve_strategies["machine"] != "override" or self._dialog.updatableMachinesModel.count <= 1:
|
||||||
# We need to create a new machine
|
# We need to create a new machine
|
||||||
machine_name = self._container_registry.uniqueName(self._machine_info.name)
|
machine_name = self._container_registry.uniqueName(self._machine_info.name)
|
||||||
|
|
||||||
global_stack = CuraStackBuilder.createMachine(machine_name, self._machine_info.definition_id)
|
# Printers with modifiable number of extruders (such as CFFF) will specify a machine_extruder_count in their
|
||||||
|
# quality_changes file. If that's the case, take the extruder count into account when creating the machine
|
||||||
|
# or else the extruderList will return only the first extruder, leading to missing non-global settings in
|
||||||
|
# the other extruders.
|
||||||
|
machine_extruder_count = self._getMachineExtruderCount() # type: Optional[int]
|
||||||
|
global_stack = CuraStackBuilder.createMachine(machine_name, self._machine_info.definition_id, machine_extruder_count)
|
||||||
if global_stack: # Only switch if creating the machine was successful.
|
if global_stack: # Only switch if creating the machine was successful.
|
||||||
extruder_stack_dict = {str(position): extruder for position, extruder in enumerate(global_stack.extruderList)}
|
extruder_stack_dict = {str(position): extruder for position, extruder in enumerate(global_stack.extruderList)}
|
||||||
|
|
||||||
self._container_registry.addContainer(global_stack)
|
self._container_registry.addContainer(global_stack)
|
||||||
else:
|
else:
|
||||||
# Find the machine
|
# Find the machine which will be overridden
|
||||||
global_stacks = self._container_registry.findContainerStacks(name = self._machine_info.name, type = "machine")
|
global_stacks = self._container_registry.findContainerStacks(id = self._dialog.getMachineToOverride(), type = "machine")
|
||||||
if not global_stacks:
|
if not global_stacks:
|
||||||
message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tag <filename>!", "Project file <filename>{0}</filename> is made using profiles that are unknown to this version of Ultimaker Cura.", file_name))
|
message = Message(i18n_catalog.i18nc("@info:error Don't translate the XML tag <filename>!",
|
||||||
|
"Project file <filename>{0}</filename> is made using profiles that"
|
||||||
|
" are unknown to this version of Ultimaker Cura.", file_name))
|
||||||
message.show()
|
message.show()
|
||||||
self.setWorkspaceName("")
|
self.setWorkspaceName("")
|
||||||
return [], {}
|
return [], {}
|
||||||
@ -758,21 +770,22 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||||||
Job.yieldThread()
|
Job.yieldThread()
|
||||||
QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
|
QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
|
||||||
|
|
||||||
# Handle quality changes if any
|
if global_stack:
|
||||||
self._processQualityChanges(global_stack)
|
# Handle quality changes if any
|
||||||
|
self._processQualityChanges(global_stack)
|
||||||
|
|
||||||
# Prepare the machine
|
# Prepare the machine
|
||||||
self._applyChangesToMachine(global_stack, extruder_stack_dict)
|
self._applyChangesToMachine(global_stack, extruder_stack_dict)
|
||||||
|
|
||||||
Logger.log("d", "Workspace loading is notifying rest of the code of changes...")
|
Logger.log("d", "Workspace loading is notifying rest of the code of changes...")
|
||||||
# Actually change the active machine.
|
# Actually change the active machine.
|
||||||
#
|
#
|
||||||
# This is scheduled for later is because it depends on the Variant/Material/Qualitiy Managers to have the latest
|
# This is scheduled for later is because it depends on the Variant/Material/Qualitiy Managers to have the latest
|
||||||
# data, but those managers will only update upon a container/container metadata changed signal. Because this
|
# data, but those managers will only update upon a container/container metadata changed signal. Because this
|
||||||
# function is running on the main thread (Qt thread), although those "changed" signals have been emitted, but
|
# function is running on the main thread (Qt thread), although those "changed" signals have been emitted, but
|
||||||
# they won't take effect until this function is done.
|
# they won't take effect until this function is done.
|
||||||
# To solve this, we schedule _updateActiveMachine() for later so it will have the latest data.
|
# To solve this, we schedule _updateActiveMachine() for later so it will have the latest data.
|
||||||
self._updateActiveMachine(global_stack)
|
self._updateActiveMachine(global_stack)
|
||||||
|
|
||||||
# Load all the nodes / mesh data of the workspace
|
# Load all the nodes / mesh data of the workspace
|
||||||
nodes = self._3mf_mesh_reader.read(file_name)
|
nodes = self._3mf_mesh_reader.read(file_name)
|
||||||
@ -917,6 +930,29 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
|
|||||||
|
|
||||||
self._machine_info.quality_changes_info.name = quality_changes_name
|
self._machine_info.quality_changes_info.name = quality_changes_name
|
||||||
|
|
||||||
|
def _getMachineExtruderCount(self) -> Optional[int]:
|
||||||
|
"""
|
||||||
|
Extracts the machine extruder count from the definition_changes file of the printer. If it is not specified in
|
||||||
|
the file, None is returned instead.
|
||||||
|
|
||||||
|
:return: The count of the machine's extruders
|
||||||
|
"""
|
||||||
|
machine_extruder_count = None
|
||||||
|
if self._machine_info \
|
||||||
|
and self._machine_info.definition_changes_info \
|
||||||
|
and "values" in self._machine_info.definition_changes_info.parser \
|
||||||
|
and "machine_extruder_count" in self._machine_info.definition_changes_info.parser["values"]:
|
||||||
|
try:
|
||||||
|
# Theoretically, if the machine_extruder_count is a setting formula (e.g. "=3"), this will produce a
|
||||||
|
# value error and the project file loading will load the settings in the first extruder only.
|
||||||
|
# This is not expected to happen though, since all machine definitions define the machine_extruder_count
|
||||||
|
# as an integer.
|
||||||
|
machine_extruder_count = int(self._machine_info.definition_changes_info.parser["values"]["machine_extruder_count"])
|
||||||
|
except ValueError:
|
||||||
|
Logger.log("w", "'machine_extruder_count' in file '{file_name}' is not a number."
|
||||||
|
.format(file_name = self._machine_info.definition_changes_info.file_name))
|
||||||
|
return machine_extruder_count
|
||||||
|
|
||||||
def _createNewQualityChanges(self, quality_type: str, intent_category: Optional[str], name: str, global_stack: GlobalStack, extruder_stack: Optional[ExtruderStack]) -> InstanceContainer:
|
def _createNewQualityChanges(self, quality_type: str, intent_category: Optional[str], name: str, global_stack: GlobalStack, extruder_stack: Optional[ExtruderStack]) -> InstanceContainer:
|
||||||
"""Helper class to create a new quality changes profile.
|
"""Helper class to create a new quality changes profile.
|
||||||
|
|
||||||
|
43
plugins/3MFReader/UpdatableMachinesModel.py
Normal file
43
plugins/3MFReader/UpdatableMachinesModel.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# Copyright (c) 2020 Ultimaker B.V.
|
||||||
|
# Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
|
from typing import Dict, List
|
||||||
|
|
||||||
|
from PyQt5.QtCore import Qt
|
||||||
|
|
||||||
|
from UM.Qt.ListModel import ListModel
|
||||||
|
from cura.Settings.GlobalStack import GlobalStack
|
||||||
|
|
||||||
|
create_new_list_item = {
|
||||||
|
"id": "new",
|
||||||
|
"name": "Create new",
|
||||||
|
"displayName": "Create new",
|
||||||
|
"type": "default_option" # to make sure we are not mixing the "Create new" option with a printer with id "new"
|
||||||
|
} # type: Dict[str, str]
|
||||||
|
|
||||||
|
|
||||||
|
class UpdatableMachinesModel(ListModel):
|
||||||
|
"""Model that holds cura packages.
|
||||||
|
|
||||||
|
By setting the filter property the instances held by this model can be changed.
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, parent = None) -> None:
|
||||||
|
super().__init__(parent)
|
||||||
|
|
||||||
|
self.addRoleName(Qt.UserRole + 1, "id")
|
||||||
|
self.addRoleName(Qt.UserRole + 2, "name")
|
||||||
|
self.addRoleName(Qt.UserRole + 3, "displayName")
|
||||||
|
self.addRoleName(Qt.UserRole + 4, "type") # Either "default_option" or "machine"
|
||||||
|
|
||||||
|
def update(self, machines: List[GlobalStack]) -> None:
|
||||||
|
items = [create_new_list_item] # type: List[Dict[str, str]]
|
||||||
|
|
||||||
|
for machine in sorted(machines, key = lambda printer: printer.name):
|
||||||
|
items.append({
|
||||||
|
"id": machine.id,
|
||||||
|
"name": machine.name,
|
||||||
|
"displayName": "Update " + machine.name,
|
||||||
|
"type": "machine"
|
||||||
|
})
|
||||||
|
self.setItems(items)
|
@ -1,5 +1,6 @@
|
|||||||
# Copyright (c) 2016 Ultimaker B.V.
|
# Copyright (c) 2020 Ultimaker B.V.
|
||||||
# Cura is released under the terms of the LGPLv3 or higher.
|
# Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
from typing import List, Optional, Dict, cast
|
||||||
|
|
||||||
from PyQt5.QtCore import pyqtSignal, QObject, pyqtProperty, QCoreApplication
|
from PyQt5.QtCore import pyqtSignal, QObject, pyqtProperty, QCoreApplication
|
||||||
from UM.FlameProfiler import pyqtSlot
|
from UM.FlameProfiler import pyqtSlot
|
||||||
@ -7,10 +8,15 @@ from UM.PluginRegistry import PluginRegistry
|
|||||||
from UM.Application import Application
|
from UM.Application import Application
|
||||||
from UM.i18n import i18nCatalog
|
from UM.i18n import i18nCatalog
|
||||||
from UM.Settings.ContainerRegistry import ContainerRegistry
|
from UM.Settings.ContainerRegistry import ContainerRegistry
|
||||||
|
from cura.Settings.GlobalStack import GlobalStack
|
||||||
|
from .UpdatableMachinesModel import UpdatableMachinesModel
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import threading
|
import threading
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
from cura.CuraApplication import CuraApplication
|
||||||
|
|
||||||
i18n_catalog = i18nCatalog("cura")
|
i18n_catalog = i18nCatalog("cura")
|
||||||
|
|
||||||
|
|
||||||
@ -29,6 +35,7 @@ class WorkspaceDialog(QObject):
|
|||||||
"quality_changes": self._default_strategy,
|
"quality_changes": self._default_strategy,
|
||||||
"definition_changes": self._default_strategy,
|
"definition_changes": self._default_strategy,
|
||||||
"material": self._default_strategy}
|
"material": self._default_strategy}
|
||||||
|
self._override_machine = None
|
||||||
self._visible = False
|
self._visible = False
|
||||||
self.showDialogSignal.connect(self.__show)
|
self.showDialogSignal.connect(self.__show)
|
||||||
|
|
||||||
@ -51,6 +58,7 @@ class WorkspaceDialog(QObject):
|
|||||||
self._extruders = []
|
self._extruders = []
|
||||||
self._objects_on_plate = False
|
self._objects_on_plate = False
|
||||||
self._is_printer_group = False
|
self._is_printer_group = False
|
||||||
|
self._updatable_machines_model = UpdatableMachinesModel(self)
|
||||||
|
|
||||||
machineConflictChanged = pyqtSignal()
|
machineConflictChanged = pyqtSignal()
|
||||||
qualityChangesConflictChanged = pyqtSignal()
|
qualityChangesConflictChanged = pyqtSignal()
|
||||||
@ -63,6 +71,7 @@ class WorkspaceDialog(QObject):
|
|||||||
qualityTypeChanged = pyqtSignal()
|
qualityTypeChanged = pyqtSignal()
|
||||||
intentNameChanged = pyqtSignal()
|
intentNameChanged = pyqtSignal()
|
||||||
machineNameChanged = pyqtSignal()
|
machineNameChanged = pyqtSignal()
|
||||||
|
updatableMachinesChanged = pyqtSignal()
|
||||||
materialLabelsChanged = pyqtSignal()
|
materialLabelsChanged = pyqtSignal()
|
||||||
objectsOnPlateChanged = pyqtSignal()
|
objectsOnPlateChanged = pyqtSignal()
|
||||||
numUserSettingsChanged = pyqtSignal()
|
numUserSettingsChanged = pyqtSignal()
|
||||||
@ -81,33 +90,33 @@ class WorkspaceDialog(QObject):
|
|||||||
self.isPrinterGroupChanged.emit()
|
self.isPrinterGroupChanged.emit()
|
||||||
|
|
||||||
@pyqtProperty(str, notify=variantTypeChanged)
|
@pyqtProperty(str, notify=variantTypeChanged)
|
||||||
def variantType(self):
|
def variantType(self) -> str:
|
||||||
return self._variant_type
|
return self._variant_type
|
||||||
|
|
||||||
def setVariantType(self, variant_type):
|
def setVariantType(self, variant_type: str) -> None:
|
||||||
if self._variant_type != variant_type:
|
if self._variant_type != variant_type:
|
||||||
self._variant_type = variant_type
|
self._variant_type = variant_type
|
||||||
self.variantTypeChanged.emit()
|
self.variantTypeChanged.emit()
|
||||||
|
|
||||||
@pyqtProperty(str, notify=machineTypeChanged)
|
@pyqtProperty(str, notify=machineTypeChanged)
|
||||||
def machineType(self):
|
def machineType(self) -> str:
|
||||||
return self._machine_type
|
return self._machine_type
|
||||||
|
|
||||||
def setMachineType(self, machine_type):
|
def setMachineType(self, machine_type: str) -> None:
|
||||||
self._machine_type = machine_type
|
self._machine_type = machine_type
|
||||||
self.machineTypeChanged.emit()
|
self.machineTypeChanged.emit()
|
||||||
|
|
||||||
def setNumUserSettings(self, num_user_settings):
|
def setNumUserSettings(self, num_user_settings: int) -> None:
|
||||||
if self._num_user_settings != num_user_settings:
|
if self._num_user_settings != num_user_settings:
|
||||||
self._num_user_settings = num_user_settings
|
self._num_user_settings = num_user_settings
|
||||||
self.numVisibleSettingsChanged.emit()
|
self.numVisibleSettingsChanged.emit()
|
||||||
|
|
||||||
@pyqtProperty(int, notify=numUserSettingsChanged)
|
@pyqtProperty(int, notify=numUserSettingsChanged)
|
||||||
def numUserSettings(self):
|
def numUserSettings(self) -> int:
|
||||||
return self._num_user_settings
|
return self._num_user_settings
|
||||||
|
|
||||||
@pyqtProperty(bool, notify=objectsOnPlateChanged)
|
@pyqtProperty(bool, notify=objectsOnPlateChanged)
|
||||||
def hasObjectsOnPlate(self):
|
def hasObjectsOnPlate(self) -> bool:
|
||||||
return self._objects_on_plate
|
return self._objects_on_plate
|
||||||
|
|
||||||
def setHasObjectsOnPlate(self, objects_on_plate):
|
def setHasObjectsOnPlate(self, objects_on_plate):
|
||||||
@ -116,10 +125,10 @@ class WorkspaceDialog(QObject):
|
|||||||
self.objectsOnPlateChanged.emit()
|
self.objectsOnPlateChanged.emit()
|
||||||
|
|
||||||
@pyqtProperty("QVariantList", notify = materialLabelsChanged)
|
@pyqtProperty("QVariantList", notify = materialLabelsChanged)
|
||||||
def materialLabels(self):
|
def materialLabels(self) -> List[str]:
|
||||||
return self._material_labels
|
return self._material_labels
|
||||||
|
|
||||||
def setMaterialLabels(self, material_labels):
|
def setMaterialLabels(self, material_labels: List[str]) -> None:
|
||||||
if self._material_labels != material_labels:
|
if self._material_labels != material_labels:
|
||||||
self._material_labels = material_labels
|
self._material_labels = material_labels
|
||||||
self.materialLabelsChanged.emit()
|
self.materialLabelsChanged.emit()
|
||||||
@ -134,36 +143,44 @@ class WorkspaceDialog(QObject):
|
|||||||
self.extrudersChanged.emit()
|
self.extrudersChanged.emit()
|
||||||
|
|
||||||
@pyqtProperty(str, notify = machineNameChanged)
|
@pyqtProperty(str, notify = machineNameChanged)
|
||||||
def machineName(self):
|
def machineName(self) -> str:
|
||||||
return self._machine_name
|
return self._machine_name
|
||||||
|
|
||||||
def setMachineName(self, machine_name):
|
def setMachineName(self, machine_name: str) -> None:
|
||||||
if self._machine_name != machine_name:
|
if self._machine_name != machine_name:
|
||||||
self._machine_name = machine_name
|
self._machine_name = machine_name
|
||||||
self.machineNameChanged.emit()
|
self.machineNameChanged.emit()
|
||||||
|
|
||||||
|
@pyqtProperty(QObject, notify = updatableMachinesChanged)
|
||||||
|
def updatableMachinesModel(self) -> UpdatableMachinesModel:
|
||||||
|
return cast(UpdatableMachinesModel, self._updatable_machines_model)
|
||||||
|
|
||||||
|
def setUpdatableMachines(self, updatable_machines: List[GlobalStack]) -> None:
|
||||||
|
self._updatable_machines_model.update(updatable_machines)
|
||||||
|
self.updatableMachinesChanged.emit()
|
||||||
|
|
||||||
@pyqtProperty(str, notify=qualityTypeChanged)
|
@pyqtProperty(str, notify=qualityTypeChanged)
|
||||||
def qualityType(self):
|
def qualityType(self) -> str:
|
||||||
return self._quality_type
|
return self._quality_type
|
||||||
|
|
||||||
def setQualityType(self, quality_type):
|
def setQualityType(self, quality_type: str) -> None:
|
||||||
if self._quality_type != quality_type:
|
if self._quality_type != quality_type:
|
||||||
self._quality_type = quality_type
|
self._quality_type = quality_type
|
||||||
self.qualityTypeChanged.emit()
|
self.qualityTypeChanged.emit()
|
||||||
|
|
||||||
@pyqtProperty(int, notify=numSettingsOverridenByQualityChangesChanged)
|
@pyqtProperty(int, notify=numSettingsOverridenByQualityChangesChanged)
|
||||||
def numSettingsOverridenByQualityChanges(self):
|
def numSettingsOverridenByQualityChanges(self) -> int:
|
||||||
return self._num_settings_overridden_by_quality_changes
|
return self._num_settings_overridden_by_quality_changes
|
||||||
|
|
||||||
def setNumSettingsOverriddenByQualityChanges(self, num_settings_overridden_by_quality_changes):
|
def setNumSettingsOverriddenByQualityChanges(self, num_settings_overridden_by_quality_changes: int) -> None:
|
||||||
self._num_settings_overridden_by_quality_changes = num_settings_overridden_by_quality_changes
|
self._num_settings_overridden_by_quality_changes = num_settings_overridden_by_quality_changes
|
||||||
self.numSettingsOverridenByQualityChangesChanged.emit()
|
self.numSettingsOverridenByQualityChangesChanged.emit()
|
||||||
|
|
||||||
@pyqtProperty(str, notify=qualityNameChanged)
|
@pyqtProperty(str, notify=qualityNameChanged)
|
||||||
def qualityName(self):
|
def qualityName(self) -> str:
|
||||||
return self._quality_name
|
return self._quality_name
|
||||||
|
|
||||||
def setQualityName(self, quality_name):
|
def setQualityName(self, quality_name: str) -> None:
|
||||||
if self._quality_name != quality_name:
|
if self._quality_name != quality_name:
|
||||||
self._quality_name = quality_name
|
self._quality_name = quality_name
|
||||||
self.qualityNameChanged.emit()
|
self.qualityNameChanged.emit()
|
||||||
@ -178,80 +195,87 @@ class WorkspaceDialog(QObject):
|
|||||||
self.intentNameChanged.emit()
|
self.intentNameChanged.emit()
|
||||||
|
|
||||||
@pyqtProperty(str, notify=activeModeChanged)
|
@pyqtProperty(str, notify=activeModeChanged)
|
||||||
def activeMode(self):
|
def activeMode(self) -> str:
|
||||||
return self._active_mode
|
return self._active_mode
|
||||||
|
|
||||||
def setActiveMode(self, active_mode):
|
def setActiveMode(self, active_mode: int) -> None:
|
||||||
if active_mode == 0:
|
if active_mode == 0:
|
||||||
self._active_mode = i18n_catalog.i18nc("@title:tab", "Recommended")
|
self._active_mode = i18n_catalog.i18nc("@title:tab", "Recommended")
|
||||||
else:
|
else:
|
||||||
self._active_mode = i18n_catalog.i18nc("@title:tab", "Custom")
|
self._active_mode = i18n_catalog.i18nc("@title:tab", "Custom")
|
||||||
self.activeModeChanged.emit()
|
self.activeModeChanged.emit()
|
||||||
|
|
||||||
@pyqtProperty(int, notify = hasVisibleSettingsFieldChanged)
|
@pyqtProperty(bool, notify = hasVisibleSettingsFieldChanged)
|
||||||
def hasVisibleSettingsField(self):
|
def hasVisibleSettingsField(self) -> bool:
|
||||||
return self._has_visible_settings_field
|
return self._has_visible_settings_field
|
||||||
|
|
||||||
def setHasVisibleSettingsField(self, has_visible_settings_field):
|
def setHasVisibleSettingsField(self, has_visible_settings_field: bool) -> None:
|
||||||
self._has_visible_settings_field = has_visible_settings_field
|
self._has_visible_settings_field = has_visible_settings_field
|
||||||
self.hasVisibleSettingsFieldChanged.emit()
|
self.hasVisibleSettingsFieldChanged.emit()
|
||||||
|
|
||||||
@pyqtProperty(int, constant = True)
|
@pyqtProperty(int, constant = True)
|
||||||
def totalNumberOfSettings(self):
|
def totalNumberOfSettings(self) -> int:
|
||||||
general_definition_containers = ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")
|
general_definition_containers = ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")
|
||||||
if not general_definition_containers:
|
if not general_definition_containers:
|
||||||
return 0
|
return 0
|
||||||
return len(general_definition_containers[0].getAllKeys())
|
return len(general_definition_containers[0].getAllKeys())
|
||||||
|
|
||||||
@pyqtProperty(int, notify = numVisibleSettingsChanged)
|
@pyqtProperty(int, notify = numVisibleSettingsChanged)
|
||||||
def numVisibleSettings(self):
|
def numVisibleSettings(self) -> int:
|
||||||
return self._num_visible_settings
|
return self._num_visible_settings
|
||||||
|
|
||||||
def setNumVisibleSettings(self, num_visible_settings):
|
def setNumVisibleSettings(self, num_visible_settings: int) -> None:
|
||||||
if self._num_visible_settings != num_visible_settings:
|
if self._num_visible_settings != num_visible_settings:
|
||||||
self._num_visible_settings = num_visible_settings
|
self._num_visible_settings = num_visible_settings
|
||||||
self.numVisibleSettingsChanged.emit()
|
self.numVisibleSettingsChanged.emit()
|
||||||
|
|
||||||
@pyqtProperty(bool, notify = machineConflictChanged)
|
@pyqtProperty(bool, notify = machineConflictChanged)
|
||||||
def machineConflict(self):
|
def machineConflict(self) -> bool:
|
||||||
return self._has_machine_conflict
|
return self._has_machine_conflict
|
||||||
|
|
||||||
@pyqtProperty(bool, notify=qualityChangesConflictChanged)
|
@pyqtProperty(bool, notify=qualityChangesConflictChanged)
|
||||||
def qualityChangesConflict(self):
|
def qualityChangesConflict(self) -> bool:
|
||||||
return self._has_quality_changes_conflict
|
return self._has_quality_changes_conflict
|
||||||
|
|
||||||
@pyqtProperty(bool, notify=materialConflictChanged)
|
@pyqtProperty(bool, notify=materialConflictChanged)
|
||||||
def materialConflict(self):
|
def materialConflict(self) -> bool:
|
||||||
return self._has_material_conflict
|
return self._has_material_conflict
|
||||||
|
|
||||||
@pyqtSlot(str, str)
|
@pyqtSlot(str, str)
|
||||||
def setResolveStrategy(self, key, strategy):
|
def setResolveStrategy(self, key: str, strategy: Optional[str]) -> None:
|
||||||
if key in self._result:
|
if key in self._result:
|
||||||
self._result[key] = strategy
|
self._result[key] = strategy
|
||||||
|
|
||||||
|
def getMachineToOverride(self) -> str:
|
||||||
|
return self._override_machine
|
||||||
|
|
||||||
|
@pyqtSlot(str)
|
||||||
|
def setMachineToOverride(self, machine_name: str) -> None:
|
||||||
|
self._override_machine = machine_name
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def closeBackend(self):
|
def closeBackend(self) -> None:
|
||||||
"""Close the backend: otherwise one could end up with "Slicing..."""
|
"""Close the backend: otherwise one could end up with "Slicing..."""
|
||||||
|
|
||||||
Application.getInstance().getBackend().close()
|
Application.getInstance().getBackend().close()
|
||||||
|
|
||||||
def setMaterialConflict(self, material_conflict):
|
def setMaterialConflict(self, material_conflict: bool) -> None:
|
||||||
if self._has_material_conflict != material_conflict:
|
if self._has_material_conflict != material_conflict:
|
||||||
self._has_material_conflict = material_conflict
|
self._has_material_conflict = material_conflict
|
||||||
self.materialConflictChanged.emit()
|
self.materialConflictChanged.emit()
|
||||||
|
|
||||||
def setMachineConflict(self, machine_conflict):
|
def setMachineConflict(self, machine_conflict: bool) -> None:
|
||||||
if self._has_machine_conflict != machine_conflict:
|
if self._has_machine_conflict != machine_conflict:
|
||||||
self._has_machine_conflict = machine_conflict
|
self._has_machine_conflict = machine_conflict
|
||||||
self.machineConflictChanged.emit()
|
self.machineConflictChanged.emit()
|
||||||
|
|
||||||
def setQualityChangesConflict(self, quality_changes_conflict):
|
def setQualityChangesConflict(self, quality_changes_conflict: bool) -> None:
|
||||||
if self._has_quality_changes_conflict != quality_changes_conflict:
|
if self._has_quality_changes_conflict != quality_changes_conflict:
|
||||||
self._has_quality_changes_conflict = quality_changes_conflict
|
self._has_quality_changes_conflict = quality_changes_conflict
|
||||||
self.qualityChangesConflictChanged.emit()
|
self.qualityChangesConflictChanged.emit()
|
||||||
|
|
||||||
def getResult(self):
|
def getResult(self) -> Dict[str, Optional[str]]:
|
||||||
if "machine" in self._result and not self._has_machine_conflict:
|
if "machine" in self._result and self.updatableMachinesModel.count <= 1:
|
||||||
self._result["machine"] = None
|
self._result["machine"] = None
|
||||||
if "quality_changes" in self._result and not self._has_quality_changes_conflict:
|
if "quality_changes" in self._result and not self._has_quality_changes_conflict:
|
||||||
self._result["quality_changes"] = None
|
self._result["quality_changes"] = None
|
||||||
@ -267,11 +291,13 @@ class WorkspaceDialog(QObject):
|
|||||||
|
|
||||||
return self._result
|
return self._result
|
||||||
|
|
||||||
def _createViewFromQML(self):
|
def _createViewFromQML(self) -> None:
|
||||||
path = os.path.join(PluginRegistry.getInstance().getPluginPath("3MFReader"), self._qml_url)
|
three_mf_reader_path = PluginRegistry.getInstance().getPluginPath("3MFReader")
|
||||||
self._view = Application.getInstance().createQmlComponent(path, {"manager": self})
|
if three_mf_reader_path:
|
||||||
|
path = os.path.join(three_mf_reader_path, self._qml_url)
|
||||||
|
self._view = CuraApplication.getInstance().createQmlComponent(path, {"manager": self})
|
||||||
|
|
||||||
def show(self):
|
def show(self) -> None:
|
||||||
# Emit signal so the right thread actually shows the view.
|
# Emit signal so the right thread actually shows the view.
|
||||||
if threading.current_thread() != threading.main_thread():
|
if threading.current_thread() != threading.main_thread():
|
||||||
self._lock.acquire()
|
self._lock.acquire()
|
||||||
@ -284,7 +310,7 @@ class WorkspaceDialog(QObject):
|
|||||||
self.showDialogSignal.emit()
|
self.showDialogSignal.emit()
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def notifyClosed(self):
|
def notifyClosed(self) -> None:
|
||||||
"""Used to notify the dialog so the lock can be released."""
|
"""Used to notify the dialog so the lock can be released."""
|
||||||
|
|
||||||
self._result = {} # The result should be cleared before hide, because after it is released the main thread lock
|
self._result = {} # The result should be cleared before hide, because after it is released the main thread lock
|
||||||
@ -294,7 +320,7 @@ class WorkspaceDialog(QObject):
|
|||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def hide(self):
|
def hide(self) -> None:
|
||||||
self._visible = False
|
self._visible = False
|
||||||
self._view.hide()
|
self._view.hide()
|
||||||
try:
|
try:
|
||||||
@ -303,7 +329,7 @@ class WorkspaceDialog(QObject):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
@pyqtSlot(bool)
|
@pyqtSlot(bool)
|
||||||
def _onVisibilityChanged(self, visible):
|
def _onVisibilityChanged(self, visible: bool) -> None:
|
||||||
if not visible:
|
if not visible:
|
||||||
try:
|
try:
|
||||||
self._lock.release()
|
self._lock.release()
|
||||||
@ -311,17 +337,17 @@ class WorkspaceDialog(QObject):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def onOkButtonClicked(self):
|
def onOkButtonClicked(self) -> None:
|
||||||
self._view.hide()
|
self._view.hide()
|
||||||
self.hide()
|
self.hide()
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def onCancelButtonClicked(self):
|
def onCancelButtonClicked(self) -> None:
|
||||||
self._result = {}
|
self._result = {}
|
||||||
self._view.hide()
|
self._view.hide()
|
||||||
self.hide()
|
self.hide()
|
||||||
|
|
||||||
def waitForClose(self):
|
def waitForClose(self) -> None:
|
||||||
"""Block thread until the dialog is closed."""
|
"""Block thread until the dialog is closed."""
|
||||||
|
|
||||||
if self._visible:
|
if self._visible:
|
||||||
@ -334,7 +360,7 @@ class WorkspaceDialog(QObject):
|
|||||||
time.sleep(1 / 50)
|
time.sleep(1 / 50)
|
||||||
QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
|
QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
|
||||||
|
|
||||||
def __show(self):
|
def __show(self) -> None:
|
||||||
if self._view is None:
|
if self._view is None:
|
||||||
self._createViewFromQML()
|
self._createViewFromQML()
|
||||||
if self._view:
|
if self._view:
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
// Cura is released under the terms of the LGPLv3 or higher.
|
// Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import QtQuick 2.10
|
import QtQuick 2.10
|
||||||
import QtQuick.Controls 1.4
|
import QtQuick.Controls 2.3
|
||||||
import QtQuick.Layouts 1.3
|
import QtQuick.Layouts 1.3
|
||||||
import QtQuick.Window 2.2
|
import QtQuick.Window 2.2
|
||||||
|
|
||||||
@ -16,10 +16,11 @@ UM.Dialog
|
|||||||
minimumWidth: UM.Theme.getSize("popup_dialog").width
|
minimumWidth: UM.Theme.getSize("popup_dialog").width
|
||||||
minimumHeight: UM.Theme.getSize("popup_dialog").height
|
minimumHeight: UM.Theme.getSize("popup_dialog").height
|
||||||
width: minimumWidth
|
width: minimumWidth
|
||||||
height: minimumHeight
|
height: Math.max(dialogSummaryItem.height + 2 * buttonsItem.height, minimumHeight) // 2 * button height to also have some extra space around the button relative to the button size
|
||||||
|
|
||||||
property int comboboxHeight: 15 * screenScaleFactor
|
property int comboboxHeight: 15 * screenScaleFactor
|
||||||
property int spacerHeight: 10 * screenScaleFactor
|
property int spacerHeight: 10 * screenScaleFactor
|
||||||
|
property int doubleSpacerHeight: 20 * screenScaleFactor
|
||||||
|
|
||||||
onClosing: manager.notifyClosed()
|
onClosing: manager.notifyClosed()
|
||||||
onVisibleChanged:
|
onVisibleChanged:
|
||||||
@ -34,8 +35,10 @@ UM.Dialog
|
|||||||
|
|
||||||
Item
|
Item
|
||||||
{
|
{
|
||||||
anchors.fill: parent
|
id: dialogSummaryItem
|
||||||
anchors.margins: 20 * screenScaleFactor
|
width: parent.width
|
||||||
|
height: childrenRect.height
|
||||||
|
anchors.margins: 10 * screenScaleFactor
|
||||||
|
|
||||||
UM.I18nCatalog
|
UM.I18nCatalog
|
||||||
{
|
{
|
||||||
@ -62,7 +65,8 @@ UM.Dialog
|
|||||||
|
|
||||||
Column
|
Column
|
||||||
{
|
{
|
||||||
anchors.fill: parent
|
width: parent.width
|
||||||
|
height: childrenRect.height
|
||||||
spacing: 2 * screenScaleFactor
|
spacing: 2 * screenScaleFactor
|
||||||
Label
|
Label
|
||||||
{
|
{
|
||||||
@ -79,7 +83,7 @@ UM.Dialog
|
|||||||
}
|
}
|
||||||
Item // Spacer
|
Item // Spacer
|
||||||
{
|
{
|
||||||
height: spacerHeight
|
height: doubleSpacerHeight
|
||||||
width: height
|
width: height
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,35 +105,53 @@ UM.Dialog
|
|||||||
}
|
}
|
||||||
UM.TooltipArea
|
UM.TooltipArea
|
||||||
{
|
{
|
||||||
id: machineResolveTooltip
|
id: machineResolveStrategyTooltip
|
||||||
width: (parent.width / 3) | 0
|
width: (parent.width / 3) | 0
|
||||||
height: visible ? comboboxHeight : 0
|
height: visible ? comboboxHeight : 0
|
||||||
visible: manager.machineConflict
|
visible: base.visible && machineResolveComboBox.model.count > 1
|
||||||
text: catalog.i18nc("@info:tooltip", "How should the conflict in the machine be resolved?")
|
text: catalog.i18nc("@info:tooltip", "How should the conflict in the machine be resolved?")
|
||||||
ComboBox
|
ComboBox
|
||||||
{
|
{
|
||||||
model: ListModel
|
|
||||||
{
|
|
||||||
Component.onCompleted:
|
|
||||||
{
|
|
||||||
append({"key": "override", "label": catalog.i18nc("@action:ComboBox option", "Update") + " " + manager.machineName});
|
|
||||||
append({"key": "new", "label": catalog.i18nc("@action:ComboBox option", "Create new")});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Connections
|
|
||||||
{
|
|
||||||
target: manager
|
|
||||||
onMachineNameChanged:
|
|
||||||
{
|
|
||||||
machineResolveComboBox.model.get(0).label = catalog.i18nc("@action:ComboBox option", "Update") + " " + manager.machineName;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
textRole: "label"
|
|
||||||
id: machineResolveComboBox
|
id: machineResolveComboBox
|
||||||
|
model: manager.updatableMachinesModel
|
||||||
|
visible: machineResolveStrategyTooltip.visible
|
||||||
|
textRole: "displayName"
|
||||||
width: parent.width
|
width: parent.width
|
||||||
onActivated:
|
onCurrentIndexChanged:
|
||||||
{
|
{
|
||||||
manager.setResolveStrategy("machine", resolveStrategiesModel.get(index).key)
|
if (model.getItem(currentIndex).id == "new"
|
||||||
|
&& model.getItem(currentIndex).type == "default_option")
|
||||||
|
{
|
||||||
|
manager.setResolveStrategy("machine", "new")
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
manager.setResolveStrategy("machine", "override")
|
||||||
|
manager.setMachineToOverride(model.getItem(currentIndex).id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onVisibleChanged:
|
||||||
|
{
|
||||||
|
if (!visible) {return}
|
||||||
|
|
||||||
|
currentIndex = 0
|
||||||
|
// If the project printer exists in Cura, set it as the default dropdown menu option.
|
||||||
|
// No need to check object 0, which is the "Create new" option
|
||||||
|
for (var i = 1; i < model.count; i++)
|
||||||
|
{
|
||||||
|
if (model.getItem(i).name == manager.machineName)
|
||||||
|
{
|
||||||
|
currentIndex = i
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// The project printer does not exist in Cura. If there is at least one printer of the same
|
||||||
|
// type, select the first one, else set the index to "Create new"
|
||||||
|
if (currentIndex == 0 && model.count > 1)
|
||||||
|
{
|
||||||
|
currentIndex = 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -163,12 +185,13 @@ UM.Dialog
|
|||||||
{
|
{
|
||||||
text: manager.machineName
|
text: manager.machineName
|
||||||
width: (parent.width / 3) | 0
|
width: (parent.width / 3) | 0
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Item // Spacer
|
Item // Spacer
|
||||||
{
|
{
|
||||||
height: spacerHeight
|
height: doubleSpacerHeight
|
||||||
width: height
|
width: height
|
||||||
}
|
}
|
||||||
Row
|
Row
|
||||||
@ -220,6 +243,7 @@ UM.Dialog
|
|||||||
{
|
{
|
||||||
text: manager.qualityName
|
text: manager.qualityName
|
||||||
width: (parent.width / 3) | 0
|
width: (parent.width / 3) | 0
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Row
|
Row
|
||||||
@ -235,6 +259,7 @@ UM.Dialog
|
|||||||
{
|
{
|
||||||
text: manager.intentName
|
text: manager.intentName
|
||||||
width: (parent.width / 3) | 0
|
width: (parent.width / 3) | 0
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Row
|
Row
|
||||||
@ -266,12 +291,13 @@ UM.Dialog
|
|||||||
{
|
{
|
||||||
text: catalog.i18ncp("@action:label", "%1, %2 override", "%1, %2 overrides", manager.numSettingsOverridenByQualityChanges).arg(manager.qualityType).arg(manager.numSettingsOverridenByQualityChanges)
|
text: catalog.i18ncp("@action:label", "%1, %2 override", "%1, %2 overrides", manager.numSettingsOverridenByQualityChanges).arg(manager.qualityType).arg(manager.numSettingsOverridenByQualityChanges)
|
||||||
width: (parent.width / 3) | 0
|
width: (parent.width / 3) | 0
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
}
|
}
|
||||||
visible: manager.numSettingsOverridenByQualityChanges != 0
|
visible: manager.numSettingsOverridenByQualityChanges != 0
|
||||||
}
|
}
|
||||||
Item // Spacer
|
Item // Spacer
|
||||||
{
|
{
|
||||||
height: spacerHeight
|
height: doubleSpacerHeight
|
||||||
width: height
|
width: height
|
||||||
}
|
}
|
||||||
Row
|
Row
|
||||||
@ -327,13 +353,14 @@ UM.Dialog
|
|||||||
{
|
{
|
||||||
text: modelData
|
text: modelData
|
||||||
width: (parent.width / 3) | 0
|
width: (parent.width / 3) | 0
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Item // Spacer
|
Item // Spacer
|
||||||
{
|
{
|
||||||
height: spacerHeight
|
height: doubleSpacerHeight
|
||||||
width: height
|
width: height
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -400,6 +427,14 @@ UM.Dialog
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
Item
|
||||||
|
{
|
||||||
|
id: buttonsItem
|
||||||
|
width: parent.width
|
||||||
|
height: childrenRect.height
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
|
anchors.right: parent.right
|
||||||
Button
|
Button
|
||||||
{
|
{
|
||||||
id: cancel_button
|
id: cancel_button
|
||||||
@ -413,13 +448,14 @@ UM.Dialog
|
|||||||
Button
|
Button
|
||||||
{
|
{
|
||||||
id: ok_button
|
id: ok_button
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.bottom: parent.bottom
|
||||||
text: catalog.i18nc("@action:button","Open");
|
text: catalog.i18nc("@action:button","Open");
|
||||||
onClicked: { manager.closeBackend(); manager.onOkButtonClicked() }
|
onClicked: { manager.closeBackend(); manager.onOkButtonClicked() }
|
||||||
anchors.bottom: parent.bottom
|
|
||||||
anchors.right: parent.right
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function accept() {
|
function accept() {
|
||||||
manager.closeBackend();
|
manager.closeBackend();
|
||||||
manager.onOkButtonClicked();
|
manager.onOkButtonClicked();
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides support for reading 3MF files.",
|
"description": "Provides support for reading 3MF files.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides support for writing 3MF files.",
|
"description": "Provides support for writing 3MF files.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,5 +3,5 @@
|
|||||||
"author": "fieldOfView",
|
"author": "fieldOfView",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Provides support for reading AMF files.",
|
"description": "Provides support for reading AMF files.",
|
||||||
"api": "7.2.0"
|
"api": "7.3.0"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"description": "Backup and restore your configuration.",
|
"description": "Backup and restore your configuration.",
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
"name": "CuraEngine Backend",
|
"name": "CuraEngine Backend",
|
||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"description": "Provides the link to the CuraEngine slicing backend.",
|
"description": "Provides the link to the CuraEngine slicing backend.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides support for importing Cura profiles.",
|
"description": "Provides support for importing Cura profiles.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides support for exporting Cura profiles.",
|
"description": "Provides support for exporting Cura profiles.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog":"cura"
|
"i18n-catalog":"cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Checks for firmware updates.",
|
"description": "Checks for firmware updates.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides a machine actions for updating firmware.",
|
"description": "Provides a machine actions for updating firmware.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Reads g-code from a compressed archive.",
|
"description": "Reads g-code from a compressed archive.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Writes g-code to a compressed archive.",
|
"description": "Writes g-code to a compressed archive.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides support for importing profiles from g-code files.",
|
"description": "Provides support for importing profiles from g-code files.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Victor Larchenko, Ultimaker B.V.",
|
"author": "Victor Larchenko, Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Allows loading and displaying G-code files.",
|
"description": "Allows loading and displaying G-code files.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Writes g-code to a file.",
|
"description": "Writes g-code to a file.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Enables ability to generate printable geometry from 2D image files.",
|
"description": "Enables ability to generate printable geometry from 2D image files.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides support for importing profiles from legacy Cura versions.",
|
"description": "Provides support for importing profiles from legacy Cura versions.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -104,6 +104,7 @@ class MachineSettingsAction(MachineAction):
|
|||||||
# Force rebuilding the build volume by reloading the global container stack.
|
# Force rebuilding the build volume by reloading the global container stack.
|
||||||
# This is a bit of a hack, but it seems quick enough.
|
# This is a bit of a hack, but it seems quick enough.
|
||||||
self._application.getMachineManager().globalContainerChanged.emit()
|
self._application.getMachineManager().globalContainerChanged.emit()
|
||||||
|
self._application.getMachineManager().forceUpdateAllSettings()
|
||||||
|
|
||||||
@pyqtSlot()
|
@pyqtSlot()
|
||||||
def updateHasMaterialsMetadata(self) -> None:
|
def updateHasMaterialsMetadata(self) -> None:
|
||||||
|
@ -330,6 +330,14 @@ Item
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* The "Shared Heater" feature is temporarily disabled because its
|
||||||
|
implementation is incomplete. Printers with multiple filaments going
|
||||||
|
into one nozzle will keep the inactive filaments retracted at the
|
||||||
|
start of a print. However CuraEngine assumes that all filaments
|
||||||
|
start at the nozzle tip. So it'll start printing the second filament
|
||||||
|
without unretracting it.
|
||||||
|
See: https://github.com/Ultimaker/Cura/issues/8148
|
||||||
|
|
||||||
Cura.SimpleCheckBox // "Shared Heater"
|
Cura.SimpleCheckBox // "Shared Heater"
|
||||||
{
|
{
|
||||||
id: sharedHeaterCheckBox
|
id: sharedHeaterCheckBox
|
||||||
@ -341,6 +349,7 @@ Item
|
|||||||
labelWidth: base.labelWidth
|
labelWidth: base.labelWidth
|
||||||
forceUpdateOnChangeFunction: forceUpdateFunction
|
forceUpdateOnChangeFunction: forceUpdateFunction
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "fieldOfView, Ultimaker B.V.",
|
"author": "fieldOfView, Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides a way to change machine settings (such as build volume, nozzle size, etc.).",
|
"description": "Provides a way to change machine settings (such as build volume, nozzle size, etc.).",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
"name": "Model Checker",
|
"name": "Model Checker",
|
||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"description": "Checks models and print configuration for possible printing issues and give suggestions.",
|
"description": "Checks models and print configuration for possible printing issues and give suggestions.",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides a monitor stage in Cura.",
|
"description": "Provides a monitor stage in Cura.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides the Per Model Settings.",
|
"description": "Provides the Per Model Settings.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
"name": "Post Processing",
|
"name": "Post Processing",
|
||||||
"author": "Ultimaker",
|
"author": "Ultimaker",
|
||||||
"version": "2.2.1",
|
"version": "2.2.1",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"description": "Extension that allows for user created scripts for post processing",
|
"description": "Extension that allows for user created scripts for post processing",
|
||||||
"catalog": "cura"
|
"catalog": "cura"
|
||||||
}
|
}
|
@ -51,7 +51,7 @@
|
|||||||
# M207 S<mm> F<mm/m> - set the retract length <S> or feed rate <F>
|
# M207 S<mm> F<mm/m> - set the retract length <S> or feed rate <F>
|
||||||
# M117 - output the current changes
|
# M117 - output the current changes
|
||||||
|
|
||||||
from typing import List, Optional, Dict
|
from typing import List, Dict
|
||||||
from ..Script import Script
|
from ..Script import Script
|
||||||
import re
|
import re
|
||||||
|
|
||||||
@ -336,7 +336,7 @@ class ChangeAtZ(Script):
|
|||||||
|
|
||||||
caz_instance = ChangeAtZProcessor()
|
caz_instance = ChangeAtZProcessor()
|
||||||
|
|
||||||
caz_instance.TargetValues = {}
|
caz_instance.targetValues = {}
|
||||||
|
|
||||||
# copy over our settings to our change z class
|
# copy over our settings to our change z class
|
||||||
self.setIntSettingIfEnabled(caz_instance, "e1_Change_speed", "speed", "e2_speed")
|
self.setIntSettingIfEnabled(caz_instance, "e1_Change_speed", "speed", "e2_speed")
|
||||||
@ -352,23 +352,23 @@ class ChangeAtZ(Script):
|
|||||||
self.setFloatSettingIfEnabled(caz_instance, "caz_change_retractlength", "retractlength", "caz_retractlength")
|
self.setFloatSettingIfEnabled(caz_instance, "caz_change_retractlength", "retractlength", "caz_retractlength")
|
||||||
|
|
||||||
# is this mod enabled?
|
# is this mod enabled?
|
||||||
caz_instance.IsEnabled = self.getSettingValueByKey("caz_enabled")
|
caz_instance.enabled = self.getSettingValueByKey("caz_enabled")
|
||||||
|
|
||||||
# are we emitting data to the LCD?
|
# are we emitting data to the LCD?
|
||||||
caz_instance.IsDisplayingChangesToLcd = self.getSettingValueByKey("caz_output_to_display")
|
caz_instance.displayChangesToLcd = self.getSettingValueByKey("caz_output_to_display")
|
||||||
|
|
||||||
# are we doing linear move retractions?
|
# are we doing linear move retractions?
|
||||||
caz_instance.IsLinearRetraction = self.getSettingValueByKey("caz_retractstyle") == "linear"
|
caz_instance.linearRetraction = self.getSettingValueByKey("caz_retractstyle") == "linear"
|
||||||
|
|
||||||
# see if we're applying to a single layer or to all layers hence forth
|
# see if we're applying to a single layer or to all layers hence forth
|
||||||
caz_instance.IsApplyToSingleLayer = self.getSettingValueByKey("c_behavior") == "single_layer"
|
caz_instance.applyToSingleLayer = self.getSettingValueByKey("c_behavior") == "single_layer"
|
||||||
|
|
||||||
# used for easy reference of layer or height targeting
|
# used for easy reference of layer or height targeting
|
||||||
caz_instance.IsTargetByLayer = self.getSettingValueByKey("a_trigger") == "layer_no"
|
caz_instance.targetByLayer = self.getSettingValueByKey("a_trigger") == "layer_no"
|
||||||
|
|
||||||
# change our target based on what we're targeting
|
# change our target based on what we're targeting
|
||||||
caz_instance.TargetLayer = self.getIntSettingByKey("b_targetL", None)
|
caz_instance.targetLayer = self.getIntSettingByKey("b_targetL", None)
|
||||||
caz_instance.TargetZ = self.getFloatSettingByKey("b_targetZ", None)
|
caz_instance.targetZ = self.getFloatSettingByKey("b_targetZ", None)
|
||||||
|
|
||||||
# run our script
|
# run our script
|
||||||
return caz_instance.execute(data)
|
return caz_instance.execute(data)
|
||||||
@ -388,7 +388,7 @@ class ChangeAtZ(Script):
|
|||||||
return
|
return
|
||||||
|
|
||||||
# set our value in the target settings
|
# set our value in the target settings
|
||||||
caz_instance.TargetValues[target] = value
|
caz_instance.targetValues[target] = value
|
||||||
|
|
||||||
# Sets the given TargetValue in the ChangeAtZ instance if the trigger is specified
|
# Sets the given TargetValue in the ChangeAtZ instance if the trigger is specified
|
||||||
def setFloatSettingIfEnabled(self, caz_instance, trigger, target, setting):
|
def setFloatSettingIfEnabled(self, caz_instance, trigger, target, setting):
|
||||||
@ -405,7 +405,7 @@ class ChangeAtZ(Script):
|
|||||||
return
|
return
|
||||||
|
|
||||||
# set our value in the target settings
|
# set our value in the target settings
|
||||||
caz_instance.TargetValues[target] = value
|
caz_instance.targetValues[target] = value
|
||||||
|
|
||||||
# Returns the given settings value as an integer or the default if it cannot parse it
|
# Returns the given settings value as an integer or the default if it cannot parse it
|
||||||
def getIntSettingByKey(self, key, default):
|
def getIntSettingByKey(self, key, default):
|
||||||
@ -430,13 +430,13 @@ class ChangeAtZ(Script):
|
|||||||
class GCodeCommand:
|
class GCodeCommand:
|
||||||
|
|
||||||
# The GCode command itself (ex: G10)
|
# The GCode command itself (ex: G10)
|
||||||
Command = None,
|
command = None,
|
||||||
|
|
||||||
# Contains any arguments passed to the command. The key is the argument name, the value is the value of the argument.
|
# Contains any arguments passed to the command. The key is the argument name, the value is the value of the argument.
|
||||||
Arguments = {}
|
arguments = {}
|
||||||
|
|
||||||
# Contains the components of the command broken into pieces
|
# Contains the components of the command broken into pieces
|
||||||
Components = []
|
components = []
|
||||||
|
|
||||||
# Constructor. Sets up defaults
|
# Constructor. Sets up defaults
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@ -468,10 +468,10 @@ class GCodeCommand:
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
# stores all the components of the command within the class for later
|
# stores all the components of the command within the class for later
|
||||||
command.Components = command_pieces
|
command.components = command_pieces
|
||||||
|
|
||||||
# set the actual command
|
# set the actual command
|
||||||
command.Command = command_pieces[0]
|
command.command = command_pieces[0]
|
||||||
|
|
||||||
# stop here if we don't have any parameters
|
# stop here if we don't have any parameters
|
||||||
if len(command_pieces) == 1:
|
if len(command_pieces) == 1:
|
||||||
@ -488,15 +488,15 @@ class GCodeCommand:
|
|||||||
linear_command = GCodeCommand.getFromLine(line)
|
linear_command = GCodeCommand.getFromLine(line)
|
||||||
|
|
||||||
# if it's not a linear move, we don't care
|
# if it's not a linear move, we don't care
|
||||||
if linear_command is None or (linear_command.Command != "G0" and linear_command.Command != "G1"):
|
if linear_command is None or (linear_command.command != "G0" and linear_command.command != "G1"):
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# convert our values to floats (or defaults)
|
# convert our values to floats (or defaults)
|
||||||
linear_command.Arguments["F"] = linear_command.getArgumentAsFloat("F", None)
|
linear_command.arguments["F"] = linear_command.getArgumentAsFloat("F", None)
|
||||||
linear_command.Arguments["X"] = linear_command.getArgumentAsFloat("X", None)
|
linear_command.arguments["X"] = linear_command.getArgumentAsFloat("X", None)
|
||||||
linear_command.Arguments["Y"] = linear_command.getArgumentAsFloat("Y", None)
|
linear_command.arguments["Y"] = linear_command.getArgumentAsFloat("Y", None)
|
||||||
linear_command.Arguments["Z"] = linear_command.getArgumentAsFloat("Z", None)
|
linear_command.arguments["Z"] = linear_command.getArgumentAsFloat("Z", None)
|
||||||
linear_command.Arguments["E"] = linear_command.getArgumentAsFloat("E", None)
|
linear_command.arguments["E"] = linear_command.getArgumentAsFloat("E", None)
|
||||||
|
|
||||||
# return our new command
|
# return our new command
|
||||||
return linear_command
|
return linear_command
|
||||||
@ -508,11 +508,11 @@ class GCodeCommand:
|
|||||||
self.parseArguments()
|
self.parseArguments()
|
||||||
|
|
||||||
# if we don't have the parameter, return the default
|
# if we don't have the parameter, return the default
|
||||||
if name not in self.Arguments:
|
if name not in self.arguments:
|
||||||
return default
|
return default
|
||||||
|
|
||||||
# otherwise return the value
|
# otherwise return the value
|
||||||
return self.Arguments[name]
|
return self.arguments[name]
|
||||||
|
|
||||||
# Gets the value of a parameter as a float or returns the default
|
# Gets the value of a parameter as a float or returns the default
|
||||||
def getArgumentAsFloat(self, name: str, default: float = None) -> float:
|
def getArgumentAsFloat(self, name: str, default: float = None) -> float:
|
||||||
@ -593,14 +593,14 @@ class GCodeCommand:
|
|||||||
def parseArguments(self):
|
def parseArguments(self):
|
||||||
|
|
||||||
# stop here if we don't have any remaining components
|
# stop here if we don't have any remaining components
|
||||||
if len(self.Components) <= 1:
|
if len(self.components) <= 1:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
# iterate and index all of our parameters, skip the first component as it's the command
|
# iterate and index all of our parameters, skip the first component as it's the command
|
||||||
for i in range(1, len(self.Components)):
|
for i in range(1, len(self.components)):
|
||||||
|
|
||||||
# get our component
|
# get our component
|
||||||
component = self.Components[i]
|
component = self.components[i]
|
||||||
|
|
||||||
# get the first character of the parameter, which is the name
|
# get the first character of the parameter, which is the name
|
||||||
component_name = component[0]
|
component_name = component[0]
|
||||||
@ -613,10 +613,10 @@ class GCodeCommand:
|
|||||||
component_value = component[1:]
|
component_value = component[1:]
|
||||||
|
|
||||||
# index the argument
|
# index the argument
|
||||||
self.Arguments[component_name] = component_value
|
self.arguments[component_name] = component_value
|
||||||
|
|
||||||
# clear the components to we don't process again
|
# clear the components to we don't process again
|
||||||
self.Components = []
|
self.components = []
|
||||||
|
|
||||||
# Easy function for replacing any GCODE parameter variable in a given GCODE command
|
# Easy function for replacing any GCODE parameter variable in a given GCODE command
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -625,8 +625,8 @@ class GCodeCommand:
|
|||||||
|
|
||||||
# Resets the model back to defaults
|
# Resets the model back to defaults
|
||||||
def reset(self):
|
def reset(self):
|
||||||
self.Command = None
|
self.command = None
|
||||||
self.Arguments = {}
|
self.arguments = {}
|
||||||
|
|
||||||
|
|
||||||
# The primary ChangeAtZ class that does all the gcode editing. This was broken out into an
|
# The primary ChangeAtZ class that does all the gcode editing. This was broken out into an
|
||||||
@ -634,55 +634,55 @@ class GCodeCommand:
|
|||||||
class ChangeAtZProcessor:
|
class ChangeAtZProcessor:
|
||||||
|
|
||||||
# Holds our current height
|
# Holds our current height
|
||||||
CurrentZ = None
|
currentZ = None
|
||||||
|
|
||||||
# Holds our current layer number
|
# Holds our current layer number
|
||||||
CurrentLayer = None
|
currentLayer = None
|
||||||
|
|
||||||
# Indicates if we're only supposed to apply our settings to a single layer or multiple layers
|
# Indicates if we're only supposed to apply our settings to a single layer or multiple layers
|
||||||
IsApplyToSingleLayer = False
|
applyToSingleLayer = False
|
||||||
|
|
||||||
# Indicates if this should emit the changes as they happen to the LCD
|
# Indicates if this should emit the changes as they happen to the LCD
|
||||||
IsDisplayingChangesToLcd = False
|
displayChangesToLcd = False
|
||||||
|
|
||||||
# Indicates that this mod is still enabled (or not)
|
# Indicates that this mod is still enabled (or not)
|
||||||
IsEnabled = True
|
enabled = True
|
||||||
|
|
||||||
# Indicates if we're processing inside the target layer or not
|
# Indicates if we're processing inside the target layer or not
|
||||||
IsInsideTargetLayer = False
|
insideTargetLayer = False
|
||||||
|
|
||||||
# Indicates if we have restored the previous values from before we started our pass
|
# Indicates if we have restored the previous values from before we started our pass
|
||||||
IsLastValuesRestored = False
|
lastValuesRestored = False
|
||||||
|
|
||||||
# Indicates if the user has opted for linear move retractions or firmware retractions
|
# Indicates if the user has opted for linear move retractions or firmware retractions
|
||||||
IsLinearRetraction = True
|
linearRetraction = True
|
||||||
|
|
||||||
# Indicates if we're targetting by layer or height value
|
# Indicates if we're targetting by layer or height value
|
||||||
IsTargetByLayer = True
|
targetByLayer = True
|
||||||
|
|
||||||
# Indicates if we have injected our changed values for the given layer yet
|
# Indicates if we have injected our changed values for the given layer yet
|
||||||
IsTargetValuesInjected = False
|
targetValuesInjected = False
|
||||||
|
|
||||||
# Holds the last extrusion value, used with detecting when a retraction is made
|
# Holds the last extrusion value, used with detecting when a retraction is made
|
||||||
LastE = None
|
lastE = None
|
||||||
|
|
||||||
# An index of our gcodes which we're monitoring
|
# An index of our gcodes which we're monitoring
|
||||||
LastValues = {}
|
lastValues = {}
|
||||||
|
|
||||||
# The detected layer height from the gcode
|
# The detected layer height from the gcode
|
||||||
LayerHeight = None
|
layerHeight = None
|
||||||
|
|
||||||
# The target layer
|
# The target layer
|
||||||
TargetLayer = None
|
targetLayer = None
|
||||||
|
|
||||||
# Holds the values the user has requested to change
|
# Holds the values the user has requested to change
|
||||||
TargetValues = {}
|
targetValues = {}
|
||||||
|
|
||||||
# The target height in mm
|
# The target height in mm
|
||||||
TargetZ = None
|
targetZ = None
|
||||||
|
|
||||||
# Used to track if we've been inside our target layer yet
|
# Used to track if we've been inside our target layer yet
|
||||||
WasInsideTargetLayer = False
|
wasInsideTargetLayer = False
|
||||||
|
|
||||||
# boots up the class with defaults
|
# boots up the class with defaults
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@ -692,7 +692,7 @@ class ChangeAtZProcessor:
|
|||||||
def execute(self, data):
|
def execute(self, data):
|
||||||
|
|
||||||
# short cut the whole thing if we're not enabled
|
# short cut the whole thing if we're not enabled
|
||||||
if not self.IsEnabled:
|
if not self.enabled:
|
||||||
return data
|
return data
|
||||||
|
|
||||||
# our layer cursor
|
# our layer cursor
|
||||||
@ -750,14 +750,14 @@ class ChangeAtZProcessor:
|
|||||||
|
|
||||||
# for each of our target values, get the value to restore
|
# for each of our target values, get the value to restore
|
||||||
# no point in restoring values we haven't changed
|
# no point in restoring values we haven't changed
|
||||||
for key in self.TargetValues:
|
for key in self.targetValues:
|
||||||
|
|
||||||
# skip target values we can't restore
|
# skip target values we can't restore
|
||||||
if key not in self.LastValues:
|
if key not in self.lastValues:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# save into our changed
|
# save into our changed
|
||||||
changed[key] = self.LastValues[key]
|
changed[key] = self.lastValues[key]
|
||||||
|
|
||||||
# return our collection of changed values
|
# return our collection of changed values
|
||||||
return changed
|
return changed
|
||||||
@ -766,7 +766,7 @@ class ChangeAtZProcessor:
|
|||||||
def getDisplayChangesFromValues(self, values: Dict[str, any]) -> str:
|
def getDisplayChangesFromValues(self, values: Dict[str, any]) -> str:
|
||||||
|
|
||||||
# stop here if we're not outputting data
|
# stop here if we're not outputting data
|
||||||
if not self.IsDisplayingChangesToLcd:
|
if not self.displayChangesToLcd:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
# will hold all the default settings for the target layer
|
# will hold all the default settings for the target layer
|
||||||
@ -833,7 +833,7 @@ class ChangeAtZProcessor:
|
|||||||
def getTargetDisplayValues(self) -> str:
|
def getTargetDisplayValues(self) -> str:
|
||||||
|
|
||||||
# convert our target values to something we can output
|
# convert our target values to something we can output
|
||||||
return self.getDisplayChangesFromValues(self.TargetValues)
|
return self.getDisplayChangesFromValues(self.targetValues)
|
||||||
|
|
||||||
# Builds the the relevant GCODE lines from the given collection of values
|
# Builds the the relevant GCODE lines from the given collection of values
|
||||||
def getCodeFromValues(self, values: Dict[str, any]) -> str:
|
def getCodeFromValues(self, values: Dict[str, any]) -> str:
|
||||||
@ -898,7 +898,7 @@ class ChangeAtZProcessor:
|
|||||||
# set retract rate
|
# set retract rate
|
||||||
if "retractfeedrate" in values:
|
if "retractfeedrate" in values:
|
||||||
|
|
||||||
if self.IsLinearRetraction:
|
if self.linearRetraction:
|
||||||
codes.append(";RETRACTFEEDRATE " + str(values["retractfeedrate"] * 60) + "")
|
codes.append(";RETRACTFEEDRATE " + str(values["retractfeedrate"] * 60) + "")
|
||||||
else:
|
else:
|
||||||
codes.append("M207 F" + str(values["retractfeedrate"] * 60) + "")
|
codes.append("M207 F" + str(values["retractfeedrate"] * 60) + "")
|
||||||
@ -906,7 +906,7 @@ class ChangeAtZProcessor:
|
|||||||
# set retract length
|
# set retract length
|
||||||
if "retractlength" in values:
|
if "retractlength" in values:
|
||||||
|
|
||||||
if self.IsLinearRetraction:
|
if self.linearRetraction:
|
||||||
codes.append(";RETRACTLENGTH " + str(values["retractlength"]) + "")
|
codes.append(";RETRACTLENGTH " + str(values["retractlength"]) + "")
|
||||||
else:
|
else:
|
||||||
codes.append("M207 S" + str(values["retractlength"]) + "")
|
codes.append("M207 S" + str(values["retractlength"]) + "")
|
||||||
@ -923,19 +923,19 @@ class ChangeAtZProcessor:
|
|||||||
def getInjectCode(self) -> str:
|
def getInjectCode(self) -> str:
|
||||||
|
|
||||||
# if we're now outside of our target layer and haven't restored our last values, do so now
|
# if we're now outside of our target layer and haven't restored our last values, do so now
|
||||||
if not self.IsInsideTargetLayer and self.WasInsideTargetLayer and not self.IsLastValuesRestored:
|
if not self.insideTargetLayer and self.wasInsideTargetLayer and not self.lastValuesRestored:
|
||||||
|
|
||||||
# mark that we've injected the last values
|
# mark that we've injected the last values
|
||||||
self.IsLastValuesRestored = True
|
self.lastValuesRestored = True
|
||||||
|
|
||||||
# inject the defaults
|
# inject the defaults
|
||||||
return self.getLastValues() + "\n" + self.getLastDisplayValues()
|
return self.getLastValues() + "\n" + self.getLastDisplayValues()
|
||||||
|
|
||||||
# if we're inside our target layer but haven't added our values yet, do so now
|
# if we're inside our target layer but haven't added our values yet, do so now
|
||||||
if self.IsInsideTargetLayer and not self.IsTargetValuesInjected:
|
if self.insideTargetLayer and not self.targetValuesInjected:
|
||||||
|
|
||||||
# mark that we've injected the target values
|
# mark that we've injected the target values
|
||||||
self.IsTargetValuesInjected = True
|
self.targetValuesInjected = True
|
||||||
|
|
||||||
# inject the defaults
|
# inject the defaults
|
||||||
return self.getTargetValues() + "\n" + self.getTargetDisplayValues()
|
return self.getTargetValues() + "\n" + self.getTargetDisplayValues()
|
||||||
@ -960,35 +960,35 @@ class ChangeAtZProcessor:
|
|||||||
def getTargetValues(self) -> str:
|
def getTargetValues(self) -> str:
|
||||||
|
|
||||||
# build the gcode to change our current values
|
# build the gcode to change our current values
|
||||||
return self.getCodeFromValues(self.TargetValues)
|
return self.getCodeFromValues(self.targetValues)
|
||||||
|
|
||||||
# Determines if the current line is at or below the target required to start modifying
|
# Determines if the current line is at or below the target required to start modifying
|
||||||
def isTargetLayerOrHeight(self) -> bool:
|
def isTargetLayerOrHeight(self) -> bool:
|
||||||
|
|
||||||
# target selected by layer no.
|
# target selected by layer no.
|
||||||
if self.IsTargetByLayer:
|
if self.targetByLayer:
|
||||||
|
|
||||||
# if we don't have a current layer, we're not there yet
|
# if we don't have a current layer, we're not there yet
|
||||||
if self.CurrentLayer is None:
|
if self.currentLayer is None:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# if we're applying to a single layer, stop if our layer is not identical
|
# if we're applying to a single layer, stop if our layer is not identical
|
||||||
if self.IsApplyToSingleLayer:
|
if self.applyToSingleLayer:
|
||||||
return self.CurrentLayer == self.TargetLayer
|
return self.currentLayer == self.targetLayer
|
||||||
else:
|
else:
|
||||||
return self.CurrentLayer >= self.TargetLayer
|
return self.currentLayer >= self.targetLayer
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|
||||||
# if we don't have a current Z, we're not there yet
|
# if we don't have a current Z, we're not there yet
|
||||||
if self.CurrentZ is None:
|
if self.currentZ is None:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# if we're applying to a single layer, stop if our Z is not identical
|
# if we're applying to a single layer, stop if our Z is not identical
|
||||||
if self.IsApplyToSingleLayer:
|
if self.applyToSingleLayer:
|
||||||
return self.CurrentZ == self.TargetZ
|
return self.currentZ == self.targetZ
|
||||||
else:
|
else:
|
||||||
return self.CurrentZ >= self.TargetZ
|
return self.currentZ >= self.targetZ
|
||||||
|
|
||||||
# Marks any current ChangeZ layer defaults in the layer for deletion
|
# Marks any current ChangeZ layer defaults in the layer for deletion
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -999,7 +999,7 @@ class ChangeAtZProcessor:
|
|||||||
def processLayerHeight(self, line: str):
|
def processLayerHeight(self, line: str):
|
||||||
|
|
||||||
# stop here if we haven't entered a layer yet
|
# stop here if we haven't entered a layer yet
|
||||||
if self.CurrentLayer is None:
|
if self.currentLayer is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
# get our gcode command
|
# get our gcode command
|
||||||
@ -1010,7 +1010,7 @@ class ChangeAtZProcessor:
|
|||||||
return
|
return
|
||||||
|
|
||||||
# stop here if this isn't a linear move command
|
# stop here if this isn't a linear move command
|
||||||
if command.Command != "G0" and command.Command != "G1":
|
if command.command != "G0" and command.command != "G1":
|
||||||
return
|
return
|
||||||
|
|
||||||
# get our value from the command
|
# get our value from the command
|
||||||
@ -1021,15 +1021,15 @@ class ChangeAtZProcessor:
|
|||||||
return
|
return
|
||||||
|
|
||||||
# stop if there's no change
|
# stop if there's no change
|
||||||
if current_z == self.CurrentZ:
|
if current_z == self.currentZ:
|
||||||
return
|
return
|
||||||
|
|
||||||
# set our current Z value
|
# set our current Z value
|
||||||
self.CurrentZ = current_z
|
self.currentZ = current_z
|
||||||
|
|
||||||
# if we don't have a layer height yet, set it based on the current Z value
|
# if we don't have a layer height yet, set it based on the current Z value
|
||||||
if self.LayerHeight is None:
|
if self.layerHeight is None:
|
||||||
self.LayerHeight = self.CurrentZ
|
self.layerHeight = self.currentZ
|
||||||
|
|
||||||
# Grabs the current layer number
|
# Grabs the current layer number
|
||||||
def processLayerNumber(self, line: str):
|
def processLayerNumber(self, line: str):
|
||||||
@ -1042,11 +1042,11 @@ class ChangeAtZProcessor:
|
|||||||
current_layer = GCodeCommand.getDirectArgumentAsInt(line, ";LAYER:", None)
|
current_layer = GCodeCommand.getDirectArgumentAsInt(line, ";LAYER:", None)
|
||||||
|
|
||||||
# this should never happen, but if our layer number hasn't changed, stop here
|
# this should never happen, but if our layer number hasn't changed, stop here
|
||||||
if current_layer == self.CurrentLayer:
|
if current_layer == self.currentLayer:
|
||||||
return
|
return
|
||||||
|
|
||||||
# update our current layer
|
# update our current layer
|
||||||
self.CurrentLayer = current_layer
|
self.currentLayer = current_layer
|
||||||
|
|
||||||
# Makes any linear move changes and also injects either target or restored values depending on the plugin state
|
# Makes any linear move changes and also injects either target or restored values depending on the plugin state
|
||||||
def processLine(self, line: str) -> str:
|
def processLine(self, line: str) -> str:
|
||||||
@ -1059,10 +1059,10 @@ class ChangeAtZProcessor:
|
|||||||
|
|
||||||
# if we're not inside the target layer, simply read the any
|
# if we're not inside the target layer, simply read the any
|
||||||
# settings we can and revert any ChangeAtZ deletions
|
# settings we can and revert any ChangeAtZ deletions
|
||||||
if not self.IsInsideTargetLayer:
|
if not self.insideTargetLayer:
|
||||||
|
|
||||||
# read any settings if we haven't hit our target layer yet
|
# read any settings if we haven't hit our target layer yet
|
||||||
if not self.WasInsideTargetLayer:
|
if not self.wasInsideTargetLayer:
|
||||||
self.processSetting(line)
|
self.processSetting(line)
|
||||||
|
|
||||||
# if we haven't hit our target yet, leave the defaults as is (unmark them for deletion)
|
# if we haven't hit our target yet, leave the defaults as is (unmark them for deletion)
|
||||||
@ -1074,7 +1074,7 @@ class ChangeAtZProcessor:
|
|||||||
modified_gcode += self.getInjectCode()
|
modified_gcode += self.getInjectCode()
|
||||||
|
|
||||||
# modify our command if we're still inside our target layer, otherwise pass unmodified
|
# modify our command if we're still inside our target layer, otherwise pass unmodified
|
||||||
if self.IsInsideTargetLayer:
|
if self.insideTargetLayer:
|
||||||
modified_gcode += self.processLinearMove(line) + "\n"
|
modified_gcode += self.processLinearMove(line) + "\n"
|
||||||
else:
|
else:
|
||||||
modified_gcode += line + "\n"
|
modified_gcode += line + "\n"
|
||||||
@ -1101,14 +1101,14 @@ class ChangeAtZProcessor:
|
|||||||
|
|
||||||
# if it's not a linear move, we don't care
|
# if it's not a linear move, we don't care
|
||||||
if linear_command is None:
|
if linear_command is None:
|
||||||
return
|
return line
|
||||||
|
|
||||||
# get our linear move parameters
|
# get our linear move parameters
|
||||||
feed_rate = linear_command.Arguments["F"]
|
feed_rate = linear_command.arguments["F"]
|
||||||
x_coord = linear_command.Arguments["X"]
|
x_coord = linear_command.arguments["X"]
|
||||||
y_coord = linear_command.Arguments["Y"]
|
y_coord = linear_command.arguments["Y"]
|
||||||
z_coord = linear_command.Arguments["Z"]
|
z_coord = linear_command.arguments["Z"]
|
||||||
extrude_length = linear_command.Arguments["E"]
|
extrude_length = linear_command.arguments["E"]
|
||||||
|
|
||||||
# set our new line to our old line
|
# set our new line to our old line
|
||||||
new_line = line
|
new_line = line
|
||||||
@ -1120,10 +1120,11 @@ class ChangeAtZProcessor:
|
|||||||
new_line = self.processRetractFeedRate(extrude_length, feed_rate, new_line, x_coord, y_coord, z_coord)
|
new_line = self.processRetractFeedRate(extrude_length, feed_rate, new_line, x_coord, y_coord, z_coord)
|
||||||
|
|
||||||
# handle print speed adjustments
|
# handle print speed adjustments
|
||||||
new_line = self.processPrintSpeed(feed_rate, new_line)
|
if extrude_length is not None: # Only for extrusion moves.
|
||||||
|
new_line = self.processPrintSpeed(feed_rate, new_line)
|
||||||
|
|
||||||
# set our current extrude position
|
# set our current extrude position
|
||||||
self.LastE = extrude_length if extrude_length is not None else self.LastE
|
self.lastE = extrude_length if extrude_length is not None else self.lastE
|
||||||
|
|
||||||
# if no changes have been made, stop here
|
# if no changes have been made, stop here
|
||||||
if new_line == line:
|
if new_line == line:
|
||||||
@ -1136,11 +1137,11 @@ class ChangeAtZProcessor:
|
|||||||
def processPrintSpeed(self, feed_rate: float, new_line: str) -> str:
|
def processPrintSpeed(self, feed_rate: float, new_line: str) -> str:
|
||||||
|
|
||||||
# if we're not setting print speed or we don't have a feed rate, stop here
|
# if we're not setting print speed or we don't have a feed rate, stop here
|
||||||
if "printspeed" not in self.TargetValues or feed_rate is None:
|
if "printspeed" not in self.targetValues or feed_rate is None:
|
||||||
return new_line
|
return new_line
|
||||||
|
|
||||||
# get our requested print speed
|
# get our requested print speed
|
||||||
print_speed = int(self.TargetValues["printspeed"])
|
print_speed = int(self.targetValues["printspeed"])
|
||||||
|
|
||||||
# if they requested no change to print speed (ie: 100%), stop here
|
# if they requested no change to print speed (ie: 100%), stop here
|
||||||
if print_speed == 100:
|
if print_speed == 100:
|
||||||
@ -1156,11 +1157,11 @@ class ChangeAtZProcessor:
|
|||||||
def processRetractLength(self, extrude_length: float, feed_rate: float, new_line: str, x_coord: float, y_coord: float, z_coord: float) -> str:
|
def processRetractLength(self, extrude_length: float, feed_rate: float, new_line: str, x_coord: float, y_coord: float, z_coord: float) -> str:
|
||||||
|
|
||||||
# if we don't have a retract length in the file we can't add one
|
# if we don't have a retract length in the file we can't add one
|
||||||
if "retractlength" not in self.LastValues or self.LastValues["retractlength"] == 0:
|
if "retractlength" not in self.lastValues or self.lastValues["retractlength"] == 0:
|
||||||
return new_line
|
return new_line
|
||||||
|
|
||||||
# if we're not changing retraction length, stop here
|
# if we're not changing retraction length, stop here
|
||||||
if "retractlength" not in self.TargetValues:
|
if "retractlength" not in self.targetValues:
|
||||||
return new_line
|
return new_line
|
||||||
|
|
||||||
# retractions are only F (feed rate) and E (extrude), at least in cura
|
# retractions are only F (feed rate) and E (extrude), at least in cura
|
||||||
@ -1172,22 +1173,22 @@ class ChangeAtZProcessor:
|
|||||||
return new_line
|
return new_line
|
||||||
|
|
||||||
# stop here if we don't know our last extrude value
|
# stop here if we don't know our last extrude value
|
||||||
if self.LastE is None:
|
if self.lastE is None:
|
||||||
return new_line
|
return new_line
|
||||||
|
|
||||||
# if there's no change in extrude we have nothing to change
|
# if there's no change in extrude we have nothing to change
|
||||||
if self.LastE == extrude_length:
|
if self.lastE == extrude_length:
|
||||||
return new_line
|
return new_line
|
||||||
|
|
||||||
# if our last extrude was lower than our current, we're restoring, so skip
|
# if our last extrude was lower than our current, we're restoring, so skip
|
||||||
if self.LastE < extrude_length:
|
if self.lastE < extrude_length:
|
||||||
return new_line
|
return new_line
|
||||||
|
|
||||||
# get our desired retract length
|
# get our desired retract length
|
||||||
retract_length = float(self.TargetValues["retractlength"])
|
retract_length = float(self.targetValues["retractlength"])
|
||||||
|
|
||||||
# subtract the difference between the default and the desired
|
# subtract the difference between the default and the desired
|
||||||
extrude_length -= (retract_length - self.LastValues["retractlength"])
|
extrude_length -= (retract_length - self.lastValues["retractlength"])
|
||||||
|
|
||||||
# replace our extrude amount
|
# replace our extrude amount
|
||||||
return GCodeCommand.replaceDirectArgument(new_line, "E", extrude_length)
|
return GCodeCommand.replaceDirectArgument(new_line, "E", extrude_length)
|
||||||
@ -1196,7 +1197,7 @@ class ChangeAtZProcessor:
|
|||||||
def processRetractLengthSetting(self, line: str):
|
def processRetractLengthSetting(self, line: str):
|
||||||
|
|
||||||
# skip if we're not doing linear retractions
|
# skip if we're not doing linear retractions
|
||||||
if not self.IsLinearRetraction:
|
if not self.linearRetraction:
|
||||||
return
|
return
|
||||||
|
|
||||||
# get our command from the line
|
# get our command from the line
|
||||||
@ -1207,11 +1208,11 @@ class ChangeAtZProcessor:
|
|||||||
return
|
return
|
||||||
|
|
||||||
# get our linear move parameters
|
# get our linear move parameters
|
||||||
feed_rate = linear_command.Arguments["F"]
|
feed_rate = linear_command.arguments["F"]
|
||||||
x_coord = linear_command.Arguments["X"]
|
x_coord = linear_command.arguments["X"]
|
||||||
y_coord = linear_command.Arguments["Y"]
|
y_coord = linear_command.arguments["Y"]
|
||||||
z_coord = linear_command.Arguments["Z"]
|
z_coord = linear_command.arguments["Z"]
|
||||||
extrude_length = linear_command.Arguments["E"]
|
extrude_length = linear_command.arguments["E"]
|
||||||
|
|
||||||
# the command we're looking for only has extrude and feed rate
|
# the command we're looking for only has extrude and feed rate
|
||||||
if x_coord is not None or y_coord is not None or z_coord is not None:
|
if x_coord is not None or y_coord is not None or z_coord is not None:
|
||||||
@ -1229,17 +1230,17 @@ class ChangeAtZProcessor:
|
|||||||
return
|
return
|
||||||
|
|
||||||
# what ever the last negative retract length is it wins
|
# what ever the last negative retract length is it wins
|
||||||
self.LastValues["retractlength"] = extrude_length
|
self.lastValues["retractlength"] = extrude_length
|
||||||
|
|
||||||
# Handles any changes to retraction feed rate for the given linear motion command
|
# Handles any changes to retraction feed rate for the given linear motion command
|
||||||
def processRetractFeedRate(self, extrude_length: float, feed_rate: float, new_line: str, x_coord: float, y_coord: float, z_coord: float) -> str:
|
def processRetractFeedRate(self, extrude_length: float, feed_rate: float, new_line: str, x_coord: float, y_coord: float, z_coord: float) -> str:
|
||||||
|
|
||||||
# skip if we're not doing linear retractions
|
# skip if we're not doing linear retractions
|
||||||
if not self.IsLinearRetraction:
|
if not self.linearRetraction:
|
||||||
return new_line
|
return new_line
|
||||||
|
|
||||||
# if we're not changing retraction length, stop here
|
# if we're not changing retraction length, stop here
|
||||||
if "retractfeedrate" not in self.TargetValues:
|
if "retractfeedrate" not in self.targetValues:
|
||||||
return new_line
|
return new_line
|
||||||
|
|
||||||
# retractions are only F (feed rate) and E (extrude), at least in cura
|
# retractions are only F (feed rate) and E (extrude), at least in cura
|
||||||
@ -1251,7 +1252,7 @@ class ChangeAtZProcessor:
|
|||||||
return new_line
|
return new_line
|
||||||
|
|
||||||
# get our desired retract feed rate
|
# get our desired retract feed rate
|
||||||
retract_feed_rate = float(self.TargetValues["retractfeedrate"])
|
retract_feed_rate = float(self.targetValues["retractfeedrate"])
|
||||||
|
|
||||||
# convert to units/min
|
# convert to units/min
|
||||||
retract_feed_rate *= 60
|
retract_feed_rate *= 60
|
||||||
@ -1263,7 +1264,7 @@ class ChangeAtZProcessor:
|
|||||||
def processSetting(self, line: str):
|
def processSetting(self, line: str):
|
||||||
|
|
||||||
# if we're in layers already we're out of settings
|
# if we're in layers already we're out of settings
|
||||||
if self.CurrentLayer is not None:
|
if self.currentLayer is not None:
|
||||||
return
|
return
|
||||||
|
|
||||||
# check our retract length
|
# check our retract length
|
||||||
@ -1276,16 +1277,16 @@ class ChangeAtZProcessor:
|
|||||||
if not self.isTargetLayerOrHeight():
|
if not self.isTargetLayerOrHeight():
|
||||||
|
|
||||||
# flag that we're outside our target layer
|
# flag that we're outside our target layer
|
||||||
self.IsInsideTargetLayer = False
|
self.insideTargetLayer = False
|
||||||
|
|
||||||
# skip to the next line
|
# skip to the next line
|
||||||
return
|
return
|
||||||
|
|
||||||
# flip if we hit our target layer
|
# flip if we hit our target layer
|
||||||
self.WasInsideTargetLayer = True
|
self.wasInsideTargetLayer = True
|
||||||
|
|
||||||
# flag that we're inside our target layer
|
# flag that we're inside our target layer
|
||||||
self.IsInsideTargetLayer = True
|
self.insideTargetLayer = True
|
||||||
|
|
||||||
# Removes all the ChangeZ layer defaults from the given layer
|
# Removes all the ChangeZ layer defaults from the given layer
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -1295,22 +1296,22 @@ class ChangeAtZProcessor:
|
|||||||
# Resets the class contents to defaults
|
# Resets the class contents to defaults
|
||||||
def reset(self):
|
def reset(self):
|
||||||
|
|
||||||
self.TargetValues = {}
|
self.targetValues = {}
|
||||||
self.IsApplyToSingleLayer = False
|
self.applyToSingleLayer = False
|
||||||
self.LastE = None
|
self.lastE = None
|
||||||
self.CurrentZ = None
|
self.currentZ = None
|
||||||
self.CurrentLayer = None
|
self.currentLayer = None
|
||||||
self.IsTargetByLayer = True
|
self.targetByLayer = True
|
||||||
self.TargetLayer = None
|
self.targetLayer = None
|
||||||
self.TargetZ = None
|
self.targetZ = None
|
||||||
self.LayerHeight = None
|
self.layerHeight = None
|
||||||
self.LastValues = {}
|
self.lastValues = {}
|
||||||
self.IsLinearRetraction = True
|
self.linearRetraction = True
|
||||||
self.IsInsideTargetLayer = False
|
self.insideTargetLayer = False
|
||||||
self.IsTargetValuesInjected = False
|
self.targetValuesInjected = False
|
||||||
self.IsLastValuesRestored = False
|
self.lastValuesRestored = False
|
||||||
self.WasInsideTargetLayer = False
|
self.wasInsideTargetLayer = False
|
||||||
self.IsEnabled = True
|
self.enabled = True
|
||||||
|
|
||||||
# Sets the original GCODE line in a given GCODE command
|
# Sets the original GCODE line in a given GCODE command
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -1340,31 +1341,31 @@ class ChangeAtZProcessor:
|
|||||||
return
|
return
|
||||||
|
|
||||||
# handle retract length changes
|
# handle retract length changes
|
||||||
if command.Command == "M207":
|
if command.command == "M207":
|
||||||
|
|
||||||
# get our retract length if provided
|
# get our retract length if provided
|
||||||
if "S" in command.Arguments:
|
if "S" in command.arguments:
|
||||||
self.LastValues["retractlength"] = command.getArgumentAsFloat("S")
|
self.lastValues["retractlength"] = command.getArgumentAsFloat("S")
|
||||||
|
|
||||||
# get our retract feedrate if provided, convert from mm/m to mm/s
|
# get our retract feedrate if provided, convert from mm/m to mm/s
|
||||||
if "F" in command.Arguments:
|
if "F" in command.arguments:
|
||||||
self.LastValues["retractfeedrate"] = command.getArgumentAsFloat("F") / 60.0
|
self.lastValues["retractfeedrate"] = command.getArgumentAsFloat("F") / 60.0
|
||||||
|
|
||||||
# move to the next command
|
# move to the next command
|
||||||
return
|
return
|
||||||
|
|
||||||
# handle bed temp changes
|
# handle bed temp changes
|
||||||
if command.Command == "M140" or command.Command == "M190":
|
if command.command == "M140" or command.command == "M190":
|
||||||
|
|
||||||
# get our bed temp if provided
|
# get our bed temp if provided
|
||||||
if "S" in command.Arguments:
|
if "S" in command.arguments:
|
||||||
self.LastValues["bedTemp"] = command.getArgumentAsFloat("S")
|
self.lastValues["bedTemp"] = command.getArgumentAsFloat("S")
|
||||||
|
|
||||||
# move to the next command
|
# move to the next command
|
||||||
return
|
return
|
||||||
|
|
||||||
# handle extruder temp changes
|
# handle extruder temp changes
|
||||||
if command.Command == "M104" or command.Command == "M109":
|
if command.command == "M104" or command.command == "M109":
|
||||||
|
|
||||||
# get our tempurature
|
# get our tempurature
|
||||||
tempurature = command.getArgumentAsFloat("S")
|
tempurature = command.getArgumentAsFloat("S")
|
||||||
@ -1378,26 +1379,26 @@ class ChangeAtZProcessor:
|
|||||||
|
|
||||||
# set our extruder temp based on the extruder
|
# set our extruder temp based on the extruder
|
||||||
if extruder is None or extruder == 0:
|
if extruder is None or extruder == 0:
|
||||||
self.LastValues["extruderOne"] = tempurature
|
self.lastValues["extruderOne"] = tempurature
|
||||||
|
|
||||||
if extruder is None or extruder == 1:
|
if extruder is None or extruder == 1:
|
||||||
self.LastValues["extruderTwo"] = tempurature
|
self.lastValues["extruderTwo"] = tempurature
|
||||||
|
|
||||||
# move to the next command
|
# move to the next command
|
||||||
return
|
return
|
||||||
|
|
||||||
# handle fan speed changes
|
# handle fan speed changes
|
||||||
if command.Command == "M106":
|
if command.command == "M106":
|
||||||
|
|
||||||
# get our bed temp if provided
|
# get our bed temp if provided
|
||||||
if "S" in command.Arguments:
|
if "S" in command.arguments:
|
||||||
self.LastValues["fanSpeed"] = (command.getArgumentAsInt("S") / 255.0) * 100
|
self.lastValues["fanSpeed"] = (command.getArgumentAsInt("S") / 255.0) * 100
|
||||||
|
|
||||||
# move to the next command
|
# move to the next command
|
||||||
return
|
return
|
||||||
|
|
||||||
# handle flow rate changes
|
# handle flow rate changes
|
||||||
if command.Command == "M221":
|
if command.command == "M221":
|
||||||
|
|
||||||
# get our flow rate
|
# get our flow rate
|
||||||
tempurature = command.getArgumentAsFloat("S")
|
tempurature = command.getArgumentAsFloat("S")
|
||||||
@ -1411,21 +1412,21 @@ class ChangeAtZProcessor:
|
|||||||
|
|
||||||
# set our extruder temp based on the extruder
|
# set our extruder temp based on the extruder
|
||||||
if extruder is None:
|
if extruder is None:
|
||||||
self.LastValues["flowrate"] = tempurature
|
self.lastValues["flowrate"] = tempurature
|
||||||
elif extruder == 1:
|
elif extruder == 1:
|
||||||
self.LastValues["flowrateOne"] = tempurature
|
self.lastValues["flowrateOne"] = tempurature
|
||||||
elif extruder == 1:
|
elif extruder == 1:
|
||||||
self.LastValues["flowrateTwo"] = tempurature
|
self.lastValues["flowrateTwo"] = tempurature
|
||||||
|
|
||||||
# move to the next command
|
# move to the next command
|
||||||
return
|
return
|
||||||
|
|
||||||
# handle print speed changes
|
# handle print speed changes
|
||||||
if command.Command == "M220":
|
if command.command == "M220":
|
||||||
|
|
||||||
# get our speed if provided
|
# get our speed if provided
|
||||||
if "S" in command.Arguments:
|
if "S" in command.arguments:
|
||||||
self.LastValues["speed"] = command.getArgumentAsInt("S")
|
self.lastValues["speed"] = command.getArgumentAsInt("S")
|
||||||
|
|
||||||
# move to the next command
|
# move to the next command
|
||||||
return
|
return
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides a prepare stage in Cura.",
|
"description": "Provides a prepare stage in Cura.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides a preview stage in Cura.",
|
"description": "Provides a preview stage in Cura.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"description": "Provides removable drive hotplugging and writing support.",
|
"description": "Provides removable drive hotplugging and writing support.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Logs certain events so that they can be used by the crash reporter",
|
"description": "Logs certain events so that they can be used by the crash reporter",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@ class SimulationPass(RenderPass):
|
|||||||
self._current_shader = None # This shader will be the shadow or the normal depending if the user wants to see the paths or the layers
|
self._current_shader = None # This shader will be the shadow or the normal depending if the user wants to see the paths or the layers
|
||||||
self._tool_handle_shader = None
|
self._tool_handle_shader = None
|
||||||
self._nozzle_shader = None
|
self._nozzle_shader = None
|
||||||
|
self._disabled_shader = None
|
||||||
self._old_current_layer = 0
|
self._old_current_layer = 0
|
||||||
self._old_current_path = 0
|
self._old_current_path = 0
|
||||||
self._switching_layers = True # It tracks when the user is moving the layers' slider
|
self._switching_layers = True # It tracks when the user is moving the layers' slider
|
||||||
@ -90,9 +91,17 @@ class SimulationPass(RenderPass):
|
|||||||
self._nozzle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader"))
|
self._nozzle_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "color.shader"))
|
||||||
self._nozzle_shader.setUniformValue("u_color", Color(*Application.getInstance().getTheme().getColor("layerview_nozzle").getRgb()))
|
self._nozzle_shader.setUniformValue("u_color", Color(*Application.getInstance().getTheme().getColor("layerview_nozzle").getRgb()))
|
||||||
|
|
||||||
|
if not self._disabled_shader:
|
||||||
|
self._disabled_shader = OpenGL.getInstance().createShaderProgram(Resources.getPath(Resources.Shaders, "striped.shader"))
|
||||||
|
self._disabled_shader.setUniformValue("u_diffuseColor1", Color(*Application.getInstance().getTheme().getColor("model_unslicable").getRgb()))
|
||||||
|
self._disabled_shader.setUniformValue("u_diffuseColor2", Color(*Application.getInstance().getTheme().getColor("model_unslicable_alt").getRgb()))
|
||||||
|
self._disabled_shader.setUniformValue("u_width", 50.0)
|
||||||
|
self._disabled_shader.setUniformValue("u_opacity", 0.6)
|
||||||
|
|
||||||
self.bind()
|
self.bind()
|
||||||
|
|
||||||
tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay, backface_cull = True)
|
tool_handle_batch = RenderBatch(self._tool_handle_shader, type = RenderBatch.RenderType.Overlay, backface_cull = True)
|
||||||
|
disabled_batch = RenderBatch(self._disabled_shader)
|
||||||
head_position = None # Indicates the current position of the print head
|
head_position = None # Indicates the current position of the print head
|
||||||
nozzle_node = None
|
nozzle_node = None
|
||||||
|
|
||||||
@ -105,6 +114,9 @@ class SimulationPass(RenderPass):
|
|||||||
nozzle_node = node
|
nozzle_node = node
|
||||||
nozzle_node.setVisible(False)
|
nozzle_node.setVisible(False)
|
||||||
|
|
||||||
|
elif getattr(node, "_outside_buildarea", False) and isinstance(node, SceneNode) and node.getMeshData() and node.isVisible():
|
||||||
|
disabled_batch.addItem(node.getWorldTransformation(copy=False), node.getMeshData())
|
||||||
|
|
||||||
elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible():
|
elif isinstance(node, SceneNode) and (node.getMeshData() or node.callDecoration("isBlockSlicing")) and node.isVisible():
|
||||||
layer_data = node.callDecoration("getLayerData")
|
layer_data = node.callDecoration("getLayerData")
|
||||||
if not layer_data:
|
if not layer_data:
|
||||||
@ -183,6 +195,9 @@ class SimulationPass(RenderPass):
|
|||||||
nozzle_batch.addItem(nozzle_node.getWorldTransformation(), mesh = nozzle_node.getMeshData())
|
nozzle_batch.addItem(nozzle_node.getWorldTransformation(), mesh = nozzle_node.getMeshData())
|
||||||
nozzle_batch.render(self._scene.getActiveCamera())
|
nozzle_batch.render(self._scene.getActiveCamera())
|
||||||
|
|
||||||
|
if len(disabled_batch.items) > 0:
|
||||||
|
disabled_batch.render(self._scene.getActiveCamera())
|
||||||
|
|
||||||
# Render toolhandles on top of the layerview
|
# Render toolhandles on top of the layerview
|
||||||
if len(tool_handle_batch.items) > 0:
|
if len(tool_handle_batch.items) > 0:
|
||||||
tool_handle_batch.render(self._scene.getActiveCamera())
|
tool_handle_batch.render(self._scene.getActiveCamera())
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides the Simulation view.",
|
"description": "Provides the Simulation view.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Submits anonymous slice info. Can be disabled through preferences.",
|
"description": "Submits anonymous slice info. Can be disabled through preferences.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides a normal solid mesh view.",
|
"description": "Provides a normal solid mesh view.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Creates an eraser mesh to block the printing of support in certain places",
|
"description": "Creates an eraser mesh to block the printing of support in certain places",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -2,6 +2,6 @@
|
|||||||
"name": "Toolbox",
|
"name": "Toolbox",
|
||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"description": "Find, manage and install new Cura packages."
|
"description": "Find, manage and install new Cura packages."
|
||||||
}
|
}
|
||||||
|
@ -48,7 +48,15 @@ Item
|
|||||||
onClicked:
|
onClicked:
|
||||||
{
|
{
|
||||||
toolbox.viewPage = "overview"
|
toolbox.viewPage = "overview"
|
||||||
toolbox.filterModelByProp("packages", "type", toolbox.viewCategory)
|
if (toolbox.viewCategory == "material")
|
||||||
|
{
|
||||||
|
toolbox.filterModelByProp("authors", "package_types", "material")
|
||||||
|
}
|
||||||
|
else if (toolbox.viewCategory == "plugin")
|
||||||
|
{
|
||||||
|
toolbox.filterModelByProp("packages", "type", "plugin")
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
style: ButtonStyle
|
style: ButtonStyle
|
||||||
{
|
{
|
||||||
|
@ -3,5 +3,5 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Provides support for reading model files.",
|
"description": "Provides support for reading model files.",
|
||||||
"api": "7.2.0"
|
"api": "7.3.0"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Provides support for reading Ultimaker Format Packages.",
|
"description": "Provides support for reading Ultimaker Format Packages.",
|
||||||
"supported_sdk_versions": ["7.2.0"],
|
"supported_sdk_versions": ["7.3.0"],
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides support for writing Ultimaker Format Packages.",
|
"description": "Provides support for writing Ultimaker Format Packages.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"description": "Manages network connections to Ultimaker networked printers.",
|
"description": "Manages network connections to Ultimaker networked printers.",
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -282,12 +282,13 @@ Item
|
|||||||
enabled: !cameraButton.enabled
|
enabled: !cameraButton.enabled
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* //Warning message is commented out because it's factually incorrect. Fix CURA-7637 to allow camera connections via cloud.
|
||||||
MonitorInfoBlurb
|
MonitorInfoBlurb
|
||||||
{
|
{
|
||||||
id: cameraDisabledInfo
|
id: cameraDisabledInfo
|
||||||
text: catalog.i18nc("@info", "The webcam is not available because you are monitoring a cloud printer.")
|
text: catalog.i18nc("@info", "The webcam is not available because you are monitoring a cloud printer.")
|
||||||
target: cameraButton
|
target: cameraButton
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
// Divider
|
// Divider
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
# Copyright (c) 2019 Ultimaker B.V.
|
# Copyright (c) 2020 Ultimaker B.V.
|
||||||
# Cura is released under the terms of the LGPLv3 or higher.
|
# Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
from time import time
|
from time import time
|
||||||
import os
|
import os
|
||||||
from typing import List, Optional, cast
|
from typing import List, Optional, cast
|
||||||
@ -108,8 +109,9 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
|
|||||||
|
|
||||||
if self.isConnected():
|
if self.isConnected():
|
||||||
return
|
return
|
||||||
|
Logger.log("i", "Attempting to connect to cluster %s", self.key)
|
||||||
super().connect()
|
super().connect()
|
||||||
Logger.log("i", "Connected to cluster %s", self.key)
|
|
||||||
CuraApplication.getInstance().getBackend().backendStateChange.connect(self._onBackendStateChange)
|
CuraApplication.getInstance().getBackend().backendStateChange.connect(self._onBackendStateChange)
|
||||||
self._update()
|
self._update()
|
||||||
|
|
||||||
@ -228,10 +230,16 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
|
|||||||
self._onUploadError)
|
self._onUploadError)
|
||||||
|
|
||||||
def _onPrintJobUploaded(self) -> None:
|
def _onPrintJobUploaded(self) -> None:
|
||||||
"""Requests the print to be sent to the printer when we finished uploading the mesh."""
|
"""
|
||||||
|
Requests the print to be sent to the printer when we finished uploading
|
||||||
|
the mesh.
|
||||||
|
"""
|
||||||
|
|
||||||
self._progress.update(100)
|
self._progress.update(100)
|
||||||
print_job = cast(CloudPrintJobResponse, self._uploaded_print_job)
|
print_job = cast(CloudPrintJobResponse, self._uploaded_print_job)
|
||||||
|
if not print_job: # It's possible that another print job is requested in the meanwhile, which then fails to upload with an error, which sets self._uploaded_print_job to `None`.
|
||||||
|
# TODO: Maybe _onUploadError shouldn't set the _uploaded_print_job to None or we need to prevent such asynchronous cases.
|
||||||
|
return # Prevent a crash.
|
||||||
self._api.requestPrint(self.key, print_job.job_id, self._onPrintUploadCompleted)
|
self._api.requestPrint(self.key, print_job.job_id, self._onPrintUploadCompleted)
|
||||||
|
|
||||||
def _onPrintUploadCompleted(self, response: CloudPrintResponse) -> None:
|
def _onPrintUploadCompleted(self, response: CloudPrintResponse) -> None:
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
# Copyright (c) 2019 Ultimaker B.V.
|
# Copyright (c) 2020 Ultimaker B.V.
|
||||||
# Cura is released under the terms of the LGPLv3 or higher.
|
# Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
import os
|
import os
|
||||||
from typing import Dict, List, Optional, Set
|
from typing import Dict, List, Optional, Set
|
||||||
|
|
||||||
@ -37,7 +38,7 @@ class CloudOutputDeviceManager:
|
|||||||
SYNC_SERVICE_NAME = "CloudOutputDeviceManager"
|
SYNC_SERVICE_NAME = "CloudOutputDeviceManager"
|
||||||
|
|
||||||
# The translation catalog for this device.
|
# The translation catalog for this device.
|
||||||
I18N_CATALOG = i18nCatalog("cura")
|
i18n_catalog = i18nCatalog("cura")
|
||||||
|
|
||||||
# Signal emitted when the list of discovered devices changed.
|
# Signal emitted when the list of discovered devices changed.
|
||||||
discoveredDevicesChanged = Signal()
|
discoveredDevicesChanged = Signal()
|
||||||
@ -221,7 +222,7 @@ class CloudOutputDeviceManager:
|
|||||||
)
|
)
|
||||||
|
|
||||||
message = Message(
|
message = Message(
|
||||||
title = self.I18N_CATALOG.i18ncp(
|
title = self.i18n_catalog.i18ncp(
|
||||||
"info:status",
|
"info:status",
|
||||||
"New printer detected from your Ultimaker account",
|
"New printer detected from your Ultimaker account",
|
||||||
"New printers detected from your Ultimaker account",
|
"New printers detected from your Ultimaker account",
|
||||||
@ -234,11 +235,7 @@ class CloudOutputDeviceManager:
|
|||||||
message.show()
|
message.show()
|
||||||
|
|
||||||
for idx, device in enumerate(new_devices):
|
for idx, device in enumerate(new_devices):
|
||||||
message_text = self.I18N_CATALOG.i18nc(
|
message_text = self.i18n_catalog.i18nc("info:status Filled in with printer name and printer model.", "Adding printer {name} ({model}) from your account").format(name = device.name, model = device.printerTypeName)
|
||||||
"info:status", "Adding printer {} ({}) from your account",
|
|
||||||
device.name,
|
|
||||||
device.printerTypeName
|
|
||||||
)
|
|
||||||
message.setText(message_text)
|
message.setText(message_text)
|
||||||
if len(new_devices) > 1:
|
if len(new_devices) > 1:
|
||||||
message.setProgress((idx / len(new_devices)) * 100)
|
message.setProgress((idx / len(new_devices)) * 100)
|
||||||
@ -255,16 +252,12 @@ class CloudOutputDeviceManager:
|
|||||||
if len(new_devices) > max_disp_devices:
|
if len(new_devices) > max_disp_devices:
|
||||||
num_hidden = len(new_devices) - max_disp_devices
|
num_hidden = len(new_devices) - max_disp_devices
|
||||||
device_name_list = ["<li>{} ({})</li>".format(device.name, device.printerTypeName) for device in new_devices[0:max_disp_devices]]
|
device_name_list = ["<li>{} ({})</li>".format(device.name, device.printerTypeName) for device in new_devices[0:max_disp_devices]]
|
||||||
device_name_list.append(self.I18N_CATALOG.i18nc("info:hidden list items", "<li>... and {} others</li>", num_hidden))
|
device_name_list.append("<li>" + self.i18n_catalog.i18ncp("info:{0} gets replaced by a number of printers", "... and {0} other", "... and {0} others", num_hidden) + "</li>")
|
||||||
device_names = "".join(device_name_list)
|
device_names = "".join(device_name_list)
|
||||||
else:
|
else:
|
||||||
device_names = "".join(["<li>{} ({})</li>".format(device.name, device.printerTypeName) for device in new_devices])
|
device_names = "".join(["<li>{} ({})</li>".format(device.name, device.printerTypeName) for device in new_devices])
|
||||||
|
|
||||||
message_text = self.I18N_CATALOG.i18nc(
|
message_text = self.i18n_catalog.i18nc("info:status", "Printers added from Digital Factory:") + "<ul>" + device_names + "</ul>"
|
||||||
"info:status",
|
|
||||||
"Printers added from Digital Factory:<ul>{}</ul>",
|
|
||||||
device_names
|
|
||||||
)
|
|
||||||
message.setText(message_text)
|
message.setText(message_text)
|
||||||
|
|
||||||
def _updateOutdatedMachine(self, outdated_machine: GlobalStack, new_cloud_output_device: CloudOutputDevice) -> None:
|
def _updateOutdatedMachine(self, outdated_machine: GlobalStack, new_cloud_output_device: CloudOutputDevice) -> None:
|
||||||
@ -318,7 +311,7 @@ class CloudOutputDeviceManager:
|
|||||||
|
|
||||||
# Generate message
|
# Generate message
|
||||||
self._removed_printers_message = Message(
|
self._removed_printers_message = Message(
|
||||||
title = self.I18N_CATALOG.i18ncp(
|
title = self.i18n_catalog.i18ncp(
|
||||||
"info:status",
|
"info:status",
|
||||||
"A cloud connection is not available for a printer",
|
"A cloud connection is not available for a printer",
|
||||||
"A cloud connection is not available for some printers",
|
"A cloud connection is not available for some printers",
|
||||||
@ -326,27 +319,27 @@ class CloudOutputDeviceManager:
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
device_names = "".join(["<li>{} ({})</li>".format(self._um_cloud_printers[device].name, self._um_cloud_printers[device].definition.name) for device in self.reported_device_ids])
|
device_names = "".join(["<li>{} ({})</li>".format(self._um_cloud_printers[device].name, self._um_cloud_printers[device].definition.name) for device in self.reported_device_ids])
|
||||||
message_text = self.I18N_CATALOG.i18ncp(
|
message_text = self.i18n_catalog.i18ncp(
|
||||||
"info:status",
|
"info:status",
|
||||||
"This printer is not linked to the Digital Factory:",
|
"This printer is not linked to the Digital Factory:",
|
||||||
"These printers are not linked to the Digital Factory:",
|
"These printers are not linked to the Digital Factory:",
|
||||||
len(self.reported_device_ids)
|
len(self.reported_device_ids)
|
||||||
)
|
)
|
||||||
message_text += "<br/><ul>{}</ul><br/>".format(device_names)
|
message_text += "<br/><ul>{}</ul><br/>".format(device_names)
|
||||||
digital_factory_string = self.I18N_CATALOG.i18nc("info:name", "Ultimaker Digital Factory")
|
digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory")
|
||||||
|
|
||||||
message_text += self.I18N_CATALOG.i18nc(
|
message_text += self.i18n_catalog.i18nc(
|
||||||
"info:status",
|
"info:status",
|
||||||
"To establish a connection, please visit the {website_link}".format(website_link = "<a href='https://digitalfactory.ultimaker.com/'>{}</a>.".format(digital_factory_string))
|
"To establish a connection, please visit the {website_link}".format(website_link = "<a href='https://digitalfactory.ultimaker.com/'>{}</a>.".format(digital_factory_string))
|
||||||
)
|
)
|
||||||
self._removed_printers_message.setText(message_text)
|
self._removed_printers_message.setText(message_text)
|
||||||
self._removed_printers_message.addAction("keep_printer_configurations_action",
|
self._removed_printers_message.addAction("keep_printer_configurations_action",
|
||||||
name = self.I18N_CATALOG.i18nc("@action:button", "Keep printer configurations"),
|
name = self.i18n_catalog.i18nc("@action:button", "Keep printer configurations"),
|
||||||
icon = "",
|
icon = "",
|
||||||
description = "Keep cloud printers in Ultimaker Cura when not connected to your account.",
|
description = "Keep cloud printers in Ultimaker Cura when not connected to your account.",
|
||||||
button_align = Message.ActionButtonAlignment.ALIGN_RIGHT)
|
button_align = Message.ActionButtonAlignment.ALIGN_RIGHT)
|
||||||
self._removed_printers_message.addAction("remove_printers_action",
|
self._removed_printers_message.addAction("remove_printers_action",
|
||||||
name = self.I18N_CATALOG.i18nc("@action:button", "Remove printers"),
|
name = self.i18n_catalog.i18nc("@action:button", "Remove printers"),
|
||||||
icon = "",
|
icon = "",
|
||||||
description = "Remove cloud printer(s) which aren't linked to your account.",
|
description = "Remove cloud printer(s) which aren't linked to your account.",
|
||||||
button_style = Message.ActionButtonStyle.SECONDARY,
|
button_style = Message.ActionButtonStyle.SECONDARY,
|
||||||
@ -423,16 +416,11 @@ class CloudOutputDeviceManager:
|
|||||||
machine.setMetaDataEntry(self.META_HOST_GUID, device.clusterData.host_guid)
|
machine.setMetaDataEntry(self.META_HOST_GUID, device.clusterData.host_guid)
|
||||||
machine.setMetaDataEntry("group_name", device.name)
|
machine.setMetaDataEntry("group_name", device.name)
|
||||||
machine.setMetaDataEntry("group_size", device.clusterSize)
|
machine.setMetaDataEntry("group_size", device.clusterSize)
|
||||||
digital_factory_string = self.I18N_CATALOG.i18nc("info:name", "Ultimaker Digital Factory")
|
digital_factory_string = self.i18n_catalog.i18nc("info:name", "Ultimaker Digital Factory")
|
||||||
digital_factory_link = "<a href='https://digitalfactory.ultimaker.com/'>{}</a>".format(digital_factory_string)
|
digital_factory_link = "<a href='https://digitalfactory.ultimaker.com/'>{digital_factory_string}</a>".format(digital_factory_string = digital_factory_string)
|
||||||
removal_warning_string = self.I18N_CATALOG.i18nc(
|
removal_warning_string = self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "{printer_name} will be removed until the next account sync.").format(printer_name = device.name) \
|
||||||
"@label ({printer_name} is replaced with the name of the printer",
|
+ "<br>" + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "To remove {printer_name} permanently, visit {digital_factory_link}").format(printer_name = device.name, digital_factory_link = digital_factory_link) \
|
||||||
"{printer_name} will be removed until the next account sync. <br> To remove {printer_name} permanently, "
|
+ "<br><br>" + self.i18n_catalog.i18nc("@message {printer_name} is replaced with the name of the printer", "Are you sure you want to remove {printer_name} temporarily?").format(printer_name = device.name)
|
||||||
"visit {digital_factory_link}"
|
|
||||||
"<br><br>Are you sure you want to remove {printer_name} temporarily?".format(printer_name = device.name,
|
|
||||||
digital_factory_link = digital_factory_link)
|
|
||||||
)
|
|
||||||
|
|
||||||
machine.setMetaDataEntry("removal_warning", removal_warning_string)
|
machine.setMetaDataEntry("removal_warning", removal_warning_string)
|
||||||
machine.addConfiguredConnectionType(device.connectionType.value)
|
machine.addConfiguredConnectionType(device.connectionType.value)
|
||||||
|
|
||||||
@ -469,10 +457,15 @@ class CloudOutputDeviceManager:
|
|||||||
remove_printers_ids = {self._um_cloud_printers[i].getId() for i in self.reported_device_ids}
|
remove_printers_ids = {self._um_cloud_printers[i].getId() for i in self.reported_device_ids}
|
||||||
all_ids = {m.getId() for m in CuraApplication.getInstance().getContainerRegistry().findContainerStacks(type = "machine")}
|
all_ids = {m.getId() for m in CuraApplication.getInstance().getContainerRegistry().findContainerStacks(type = "machine")}
|
||||||
|
|
||||||
question_title = self.I18N_CATALOG.i18nc("@title:window", "Remove printers?")
|
question_title = self.i18n_catalog.i18nc("@title:window", "Remove printers?")
|
||||||
question_content = self.I18N_CATALOG.i18nc("@label", "You are about to remove {} printer(s) from Cura. This action cannot be undone. \nAre you sure you want to continue?".format(len(remove_printers_ids)))
|
question_content = self.i18n_catalog.i18ncp(
|
||||||
|
"@label",
|
||||||
|
"You are about to remove {0} printer from Cura. This action cannot be undone.\nAre you sure you want to continue?",
|
||||||
|
"You are about to remove {0} printers from Cura. This action cannot be undone.\nAre you sure you want to continue?",
|
||||||
|
len(remove_printers_ids)
|
||||||
|
).format(num_printers = len(remove_printers_ids))
|
||||||
if remove_printers_ids == all_ids:
|
if remove_printers_ids == all_ids:
|
||||||
question_content = self.I18N_CATALOG.i18nc("@label", "You are about to remove all printers from Cura. This action cannot be undone. \nAre you sure you want to continue?")
|
question_content = self.i18n_catalog.i18nc("@label", "You are about to remove all printers from Cura. This action cannot be undone.\nAre you sure you want to continue?")
|
||||||
result = QMessageBox.question(None, question_title, question_content)
|
result = QMessageBox.question(None, question_title, question_content)
|
||||||
if result == QMessageBox.No:
|
if result == QMessageBox.No:
|
||||||
return
|
return
|
||||||
|
@ -41,7 +41,7 @@ class LocalClusterOutputDevice(UltimakerNetworkedPrinterOutputDevice):
|
|||||||
connection_type=ConnectionType.NetworkConnection,
|
connection_type=ConnectionType.NetworkConnection,
|
||||||
parent=parent
|
parent=parent
|
||||||
)
|
)
|
||||||
|
self._timeout_time = 30
|
||||||
self._cluster_api = None # type: Optional[ClusterApiClient]
|
self._cluster_api = None # type: Optional[ClusterApiClient]
|
||||||
self._active_exported_job = None # type: Optional[ExportFileJob]
|
self._active_exported_job = None # type: Optional[ExportFileJob]
|
||||||
self._printer_select_dialog = None # type: Optional[QObject]
|
self._printer_select_dialog = None # type: Optional[QObject]
|
||||||
|
@ -45,10 +45,6 @@ class UltimakerNetworkedPrinterOutputDevice(NetworkedPrinterOutputDevice):
|
|||||||
# States indicating if a print job is queued.
|
# States indicating if a print job is queued.
|
||||||
QUEUED_PRINT_JOBS_STATES = {"queued", "error"}
|
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,
|
def __init__(self, device_id: str, address: str, properties: Dict[bytes, bytes], connection_type: ConnectionType,
|
||||||
parent=None) -> None:
|
parent=None) -> None:
|
||||||
|
|
||||||
@ -87,6 +83,8 @@ class UltimakerNetworkedPrinterOutputDevice(NetworkedPrinterOutputDevice):
|
|||||||
# The job upload progress message modal.
|
# The job upload progress message modal.
|
||||||
self._progress = PrintJobUploadProgressMessage()
|
self._progress = PrintJobUploadProgressMessage()
|
||||||
|
|
||||||
|
self._timeout_time = 30
|
||||||
|
|
||||||
@pyqtProperty(str, constant=True)
|
@pyqtProperty(str, constant=True)
|
||||||
def address(self) -> str:
|
def address(self) -> str:
|
||||||
"""The IP address of the printer."""
|
"""The IP address of the printer."""
|
||||||
@ -213,8 +211,8 @@ class UltimakerNetworkedPrinterOutputDevice(NetworkedPrinterOutputDevice):
|
|||||||
return Duration(seconds).getDisplayString(DurationFormat.Format.Short)
|
return Duration(seconds).getDisplayString(DurationFormat.Format.Short)
|
||||||
|
|
||||||
def _update(self) -> None:
|
def _update(self) -> None:
|
||||||
self._checkStillConnected()
|
|
||||||
super()._update()
|
super()._update()
|
||||||
|
self._checkStillConnected()
|
||||||
|
|
||||||
def _checkStillConnected(self) -> None:
|
def _checkStillConnected(self) -> None:
|
||||||
"""Check if we're still connected by comparing the last timestamps for network response and the current time.
|
"""Check if we're still connected by comparing the last timestamps for network response and the current time.
|
||||||
@ -224,7 +222,8 @@ class UltimakerNetworkedPrinterOutputDevice(NetworkedPrinterOutputDevice):
|
|||||||
TODO: it would be nice to have this logic in the managers, but connecting those with signals causes crashes.
|
TODO: it would be nice to have this logic in the managers, but connecting those with signals causes crashes.
|
||||||
"""
|
"""
|
||||||
time_since_last_response = time() - self._time_of_last_response
|
time_since_last_response = time() - self._time_of_last_response
|
||||||
if time_since_last_response > self.NETWORK_RESPONSE_CONSIDER_OFFLINE:
|
if time_since_last_response > self._timeout_time:
|
||||||
|
Logger.log("d", "It has been %s seconds since the last response for outputdevice %s, so assume a timeout", time_since_last_response, self.key)
|
||||||
self.setConnectionState(ConnectionState.Closed)
|
self.setConnectionState(ConnectionState.Closed)
|
||||||
if self.key in CuraApplication.getInstance().getOutputDeviceManager().getOutputDeviceIds():
|
if self.key in CuraApplication.getInstance().getOutputDeviceManager().getOutputDeviceIds():
|
||||||
CuraApplication.getInstance().getOutputDeviceManager().removeOutputDevice(self.key)
|
CuraApplication.getInstance().getOutputDeviceManager().removeOutputDevice(self.key)
|
||||||
@ -241,6 +240,7 @@ class UltimakerNetworkedPrinterOutputDevice(NetworkedPrinterOutputDevice):
|
|||||||
return
|
return
|
||||||
|
|
||||||
# Indicate this device is now connected again.
|
# Indicate this device is now connected again.
|
||||||
|
Logger.log("d", "Reconnecting output device after timeout.")
|
||||||
self.setConnectionState(ConnectionState.Connected)
|
self.setConnectionState(ConnectionState.Connected)
|
||||||
|
|
||||||
# If the device was already registered we don't need to register it again.
|
# If the device was already registered we don't need to register it again.
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
"name": "USB printing",
|
"name": "USB printing",
|
||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.2",
|
"version": "1.0.2",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"description": "Accepts G-Code and sends them to a printer. Plugin can also update firmware.",
|
"description": "Accepts G-Code and sends them to a printer. Plugin can also update firmware.",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.).",
|
"description": "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.).",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Upgrades configurations from Cura 2.1 to Cura 2.2.",
|
"description": "Upgrades configurations from Cura 2.1 to Cura 2.2.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Upgrades configurations from Cura 2.2 to Cura 2.4.",
|
"description": "Upgrades configurations from Cura 2.2 to Cura 2.4.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Upgrades configurations from Cura 2.5 to Cura 2.6.",
|
"description": "Upgrades configurations from Cura 2.5 to Cura 2.6.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Upgrades configurations from Cura 2.6 to Cura 2.7.",
|
"description": "Upgrades configurations from Cura 2.6 to Cura 2.7.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Upgrades configurations from Cura 2.7 to Cura 3.0.",
|
"description": "Upgrades configurations from Cura 2.7 to Cura 3.0.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Upgrades configurations from Cura 3.0 to Cura 3.1.",
|
"description": "Upgrades configurations from Cura 3.0 to Cura 3.1.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Upgrades configurations from Cura 3.2 to Cura 3.3.",
|
"description": "Upgrades configurations from Cura 3.2 to Cura 3.3.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Upgrades configurations from Cura 3.3 to Cura 3.4.",
|
"description": "Upgrades configurations from Cura 3.3 to Cura 3.4.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Upgrades configurations from Cura 3.4 to Cura 3.5.",
|
"description": "Upgrades configurations from Cura 3.4 to Cura 3.5.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Upgrades configurations from Cura 3.5 to Cura 4.0.",
|
"description": "Upgrades configurations from Cura 3.5 to Cura 4.0.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Upgrades configurations from Cura 4.0 to Cura 4.1.",
|
"description": "Upgrades configurations from Cura 4.0 to Cura 4.1.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Upgrades configurations from Cura 4.1 to Cura 4.2.",
|
"description": "Upgrades configurations from Cura 4.1 to Cura 4.2.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Upgrades configurations from Cura 4.2 to Cura 4.3.",
|
"description": "Upgrades configurations from Cura 4.2 to Cura 4.3.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Upgrades configurations from Cura 4.3 to Cura 4.4.",
|
"description": "Upgrades configurations from Cura 4.3 to Cura 4.4.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Upgrades configurations from Cura 4.4 to Cura 4.5.",
|
"description": "Upgrades configurations from Cura 4.4 to Cura 4.5.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Upgrades configurations from Cura 4.5 to Cura 4.6.",
|
"description": "Upgrades configurations from Cura 4.5 to Cura 4.6.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2.",
|
"description": "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"description": "Upgrades configurations from Cura 4.6.2 to Cura 4.7.",
|
"description": "Upgrades configurations from Cura 4.6.2 to Cura 4.7.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Seva Alekseyev, Ultimaker B.V.",
|
"author": "Seva Alekseyev, Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides support for reading X3D files.",
|
"description": "Provides support for reading X3D files.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides the X-Ray view.",
|
"description": "Provides the X-Ray view.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,6 @@
|
|||||||
"author": "Ultimaker B.V.",
|
"author": "Ultimaker B.V.",
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
"description": "Provides capabilities to read and write XML-based material profiles.",
|
"description": "Provides capabilities to read and write XML-based material profiles.",
|
||||||
"api": "7.2.0",
|
"api": "7.3.0",
|
||||||
"i18n-catalog": "cura"
|
"i18n-catalog": "cura"
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
"display_name": "3MF Reader",
|
"display_name": "3MF Reader",
|
||||||
"description": "Provides support for reading 3MF files.",
|
"description": "Provides support for reading 3MF files.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -23,7 +23,7 @@
|
|||||||
"display_name": "3MF Writer",
|
"display_name": "3MF Writer",
|
||||||
"description": "Provides support for writing 3MF files.",
|
"description": "Provides support for writing 3MF files.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -40,7 +40,7 @@
|
|||||||
"display_name": "AMF Reader",
|
"display_name": "AMF Reader",
|
||||||
"description": "Provides support for reading AMF files.",
|
"description": "Provides support for reading AMF files.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "fieldOfView",
|
"author_id": "fieldOfView",
|
||||||
@ -57,7 +57,7 @@
|
|||||||
"display_name": "Cura Backups",
|
"display_name": "Cura Backups",
|
||||||
"description": "Backup and restore your configuration.",
|
"description": "Backup and restore your configuration.",
|
||||||
"package_version": "1.2.0",
|
"package_version": "1.2.0",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -74,7 +74,7 @@
|
|||||||
"display_name": "CuraEngine Backend",
|
"display_name": "CuraEngine Backend",
|
||||||
"description": "Provides the link to the CuraEngine slicing backend.",
|
"description": "Provides the link to the CuraEngine slicing backend.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -91,7 +91,7 @@
|
|||||||
"display_name": "Cura Profile Reader",
|
"display_name": "Cura Profile Reader",
|
||||||
"description": "Provides support for importing Cura profiles.",
|
"description": "Provides support for importing Cura profiles.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -108,7 +108,7 @@
|
|||||||
"display_name": "Cura Profile Writer",
|
"display_name": "Cura Profile Writer",
|
||||||
"description": "Provides support for exporting Cura profiles.",
|
"description": "Provides support for exporting Cura profiles.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -125,7 +125,7 @@
|
|||||||
"display_name": "Firmware Update Checker",
|
"display_name": "Firmware Update Checker",
|
||||||
"description": "Checks for firmware updates.",
|
"description": "Checks for firmware updates.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -142,7 +142,7 @@
|
|||||||
"display_name": "Firmware Updater",
|
"display_name": "Firmware Updater",
|
||||||
"description": "Provides a machine actions for updating firmware.",
|
"description": "Provides a machine actions for updating firmware.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -159,7 +159,7 @@
|
|||||||
"display_name": "Compressed G-code Reader",
|
"display_name": "Compressed G-code Reader",
|
||||||
"description": "Reads g-code from a compressed archive.",
|
"description": "Reads g-code from a compressed archive.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -176,7 +176,7 @@
|
|||||||
"display_name": "Compressed G-code Writer",
|
"display_name": "Compressed G-code Writer",
|
||||||
"description": "Writes g-code to a compressed archive.",
|
"description": "Writes g-code to a compressed archive.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -193,7 +193,7 @@
|
|||||||
"display_name": "G-Code Profile Reader",
|
"display_name": "G-Code Profile Reader",
|
||||||
"description": "Provides support for importing profiles from g-code files.",
|
"description": "Provides support for importing profiles from g-code files.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -210,7 +210,7 @@
|
|||||||
"display_name": "G-Code Reader",
|
"display_name": "G-Code Reader",
|
||||||
"description": "Allows loading and displaying G-code files.",
|
"description": "Allows loading and displaying G-code files.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "VictorLarchenko",
|
"author_id": "VictorLarchenko",
|
||||||
@ -227,7 +227,7 @@
|
|||||||
"display_name": "G-Code Writer",
|
"display_name": "G-Code Writer",
|
||||||
"description": "Writes g-code to a file.",
|
"description": "Writes g-code to a file.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -244,7 +244,7 @@
|
|||||||
"display_name": "Image Reader",
|
"display_name": "Image Reader",
|
||||||
"description": "Enables ability to generate printable geometry from 2D image files.",
|
"description": "Enables ability to generate printable geometry from 2D image files.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -261,7 +261,7 @@
|
|||||||
"display_name": "Legacy Cura Profile Reader",
|
"display_name": "Legacy Cura Profile Reader",
|
||||||
"description": "Provides support for importing profiles from legacy Cura versions.",
|
"description": "Provides support for importing profiles from legacy Cura versions.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -278,7 +278,7 @@
|
|||||||
"display_name": "Machine Settings Action",
|
"display_name": "Machine Settings Action",
|
||||||
"description": "Provides a way to change machine settings (such as build volume, nozzle size, etc.).",
|
"description": "Provides a way to change machine settings (such as build volume, nozzle size, etc.).",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "fieldOfView",
|
"author_id": "fieldOfView",
|
||||||
@ -295,7 +295,7 @@
|
|||||||
"display_name": "Model Checker",
|
"display_name": "Model Checker",
|
||||||
"description": "Checks models and print configuration for possible printing issues and give suggestions.",
|
"description": "Checks models and print configuration for possible printing issues and give suggestions.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -312,7 +312,7 @@
|
|||||||
"display_name": "Monitor Stage",
|
"display_name": "Monitor Stage",
|
||||||
"description": "Provides a monitor stage in Cura.",
|
"description": "Provides a monitor stage in Cura.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -329,7 +329,7 @@
|
|||||||
"display_name": "Per-Object Settings Tool",
|
"display_name": "Per-Object Settings Tool",
|
||||||
"description": "Provides the per-model settings.",
|
"description": "Provides the per-model settings.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -346,7 +346,7 @@
|
|||||||
"display_name": "Post Processing",
|
"display_name": "Post Processing",
|
||||||
"description": "Extension that allows for user created scripts for post processing.",
|
"description": "Extension that allows for user created scripts for post processing.",
|
||||||
"package_version": "2.2.1",
|
"package_version": "2.2.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -363,7 +363,7 @@
|
|||||||
"display_name": "Prepare Stage",
|
"display_name": "Prepare Stage",
|
||||||
"description": "Provides a prepare stage in Cura.",
|
"description": "Provides a prepare stage in Cura.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -380,7 +380,7 @@
|
|||||||
"display_name": "Preview Stage",
|
"display_name": "Preview Stage",
|
||||||
"description": "Provides a preview stage in Cura.",
|
"description": "Provides a preview stage in Cura.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -397,7 +397,7 @@
|
|||||||
"display_name": "Removable Drive Output Device",
|
"display_name": "Removable Drive Output Device",
|
||||||
"description": "Provides removable drive hotplugging and writing support.",
|
"description": "Provides removable drive hotplugging and writing support.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -414,7 +414,7 @@
|
|||||||
"display_name": "Sentry Logger",
|
"display_name": "Sentry Logger",
|
||||||
"description": "Logs certain events so that they can be used by the crash reporter",
|
"description": "Logs certain events so that they can be used by the crash reporter",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -431,7 +431,7 @@
|
|||||||
"display_name": "Simulation View",
|
"display_name": "Simulation View",
|
||||||
"description": "Provides the Simulation view.",
|
"description": "Provides the Simulation view.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -448,7 +448,7 @@
|
|||||||
"display_name": "Slice Info",
|
"display_name": "Slice Info",
|
||||||
"description": "Submits anonymous slice info. Can be disabled through preferences.",
|
"description": "Submits anonymous slice info. Can be disabled through preferences.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -465,7 +465,7 @@
|
|||||||
"display_name": "Solid View",
|
"display_name": "Solid View",
|
||||||
"description": "Provides a normal solid mesh view.",
|
"description": "Provides a normal solid mesh view.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -482,7 +482,7 @@
|
|||||||
"display_name": "Support Eraser Tool",
|
"display_name": "Support Eraser Tool",
|
||||||
"description": "Creates an eraser mesh to block the printing of support in certain places.",
|
"description": "Creates an eraser mesh to block the printing of support in certain places.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -499,7 +499,7 @@
|
|||||||
"display_name": "Trimesh Reader",
|
"display_name": "Trimesh Reader",
|
||||||
"description": "Provides support for reading model files.",
|
"description": "Provides support for reading model files.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -516,7 +516,7 @@
|
|||||||
"display_name": "Toolbox",
|
"display_name": "Toolbox",
|
||||||
"description": "Find, manage and install new Cura packages.",
|
"description": "Find, manage and install new Cura packages.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -533,7 +533,7 @@
|
|||||||
"display_name": "UFP Reader",
|
"display_name": "UFP Reader",
|
||||||
"description": "Provides support for reading Ultimaker Format Packages.",
|
"description": "Provides support for reading Ultimaker Format Packages.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -550,7 +550,7 @@
|
|||||||
"display_name": "UFP Writer",
|
"display_name": "UFP Writer",
|
||||||
"description": "Provides support for writing Ultimaker Format Packages.",
|
"description": "Provides support for writing Ultimaker Format Packages.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -567,7 +567,7 @@
|
|||||||
"display_name": "Ultimaker Machine Actions",
|
"display_name": "Ultimaker Machine Actions",
|
||||||
"description": "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.).",
|
"description": "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.).",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -584,7 +584,7 @@
|
|||||||
"display_name": "UM3 Network Printing",
|
"display_name": "UM3 Network Printing",
|
||||||
"description": "Manages network connections to Ultimaker 3 printers.",
|
"description": "Manages network connections to Ultimaker 3 printers.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -601,7 +601,7 @@
|
|||||||
"display_name": "USB Printing",
|
"display_name": "USB Printing",
|
||||||
"description": "Accepts G-Code and sends them to a printer. Plugin can also update firmware.",
|
"description": "Accepts G-Code and sends them to a printer. Plugin can also update firmware.",
|
||||||
"package_version": "1.0.2",
|
"package_version": "1.0.2",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -618,7 +618,7 @@
|
|||||||
"display_name": "Version Upgrade 2.1 to 2.2",
|
"display_name": "Version Upgrade 2.1 to 2.2",
|
||||||
"description": "Upgrades configurations from Cura 2.1 to Cura 2.2.",
|
"description": "Upgrades configurations from Cura 2.1 to Cura 2.2.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -635,7 +635,7 @@
|
|||||||
"display_name": "Version Upgrade 2.2 to 2.4",
|
"display_name": "Version Upgrade 2.2 to 2.4",
|
||||||
"description": "Upgrades configurations from Cura 2.2 to Cura 2.4.",
|
"description": "Upgrades configurations from Cura 2.2 to Cura 2.4.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -652,7 +652,7 @@
|
|||||||
"display_name": "Version Upgrade 2.5 to 2.6",
|
"display_name": "Version Upgrade 2.5 to 2.6",
|
||||||
"description": "Upgrades configurations from Cura 2.5 to Cura 2.6.",
|
"description": "Upgrades configurations from Cura 2.5 to Cura 2.6.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -669,7 +669,7 @@
|
|||||||
"display_name": "Version Upgrade 2.6 to 2.7",
|
"display_name": "Version Upgrade 2.6 to 2.7",
|
||||||
"description": "Upgrades configurations from Cura 2.6 to Cura 2.7.",
|
"description": "Upgrades configurations from Cura 2.6 to Cura 2.7.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -686,7 +686,7 @@
|
|||||||
"display_name": "Version Upgrade 2.7 to 3.0",
|
"display_name": "Version Upgrade 2.7 to 3.0",
|
||||||
"description": "Upgrades configurations from Cura 2.7 to Cura 3.0.",
|
"description": "Upgrades configurations from Cura 2.7 to Cura 3.0.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -703,7 +703,7 @@
|
|||||||
"display_name": "Version Upgrade 3.0 to 3.1",
|
"display_name": "Version Upgrade 3.0 to 3.1",
|
||||||
"description": "Upgrades configurations from Cura 3.0 to Cura 3.1.",
|
"description": "Upgrades configurations from Cura 3.0 to Cura 3.1.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -720,7 +720,7 @@
|
|||||||
"display_name": "Version Upgrade 3.2 to 3.3",
|
"display_name": "Version Upgrade 3.2 to 3.3",
|
||||||
"description": "Upgrades configurations from Cura 3.2 to Cura 3.3.",
|
"description": "Upgrades configurations from Cura 3.2 to Cura 3.3.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -737,7 +737,7 @@
|
|||||||
"display_name": "Version Upgrade 3.3 to 3.4",
|
"display_name": "Version Upgrade 3.3 to 3.4",
|
||||||
"description": "Upgrades configurations from Cura 3.3 to Cura 3.4.",
|
"description": "Upgrades configurations from Cura 3.3 to Cura 3.4.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -754,7 +754,7 @@
|
|||||||
"display_name": "Version Upgrade 3.4 to 3.5",
|
"display_name": "Version Upgrade 3.4 to 3.5",
|
||||||
"description": "Upgrades configurations from Cura 3.4 to Cura 3.5.",
|
"description": "Upgrades configurations from Cura 3.4 to Cura 3.5.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -771,7 +771,7 @@
|
|||||||
"display_name": "Version Upgrade 3.5 to 4.0",
|
"display_name": "Version Upgrade 3.5 to 4.0",
|
||||||
"description": "Upgrades configurations from Cura 3.5 to Cura 4.0.",
|
"description": "Upgrades configurations from Cura 3.5 to Cura 4.0.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -788,7 +788,7 @@
|
|||||||
"display_name": "Version Upgrade 4.0 to 4.1",
|
"display_name": "Version Upgrade 4.0 to 4.1",
|
||||||
"description": "Upgrades configurations from Cura 4.0 to Cura 4.1.",
|
"description": "Upgrades configurations from Cura 4.0 to Cura 4.1.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -805,7 +805,7 @@
|
|||||||
"display_name": "Version Upgrade 4.1 to 4.2",
|
"display_name": "Version Upgrade 4.1 to 4.2",
|
||||||
"description": "Upgrades configurations from Cura 4.1 to Cura 4.2.",
|
"description": "Upgrades configurations from Cura 4.1 to Cura 4.2.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -822,7 +822,7 @@
|
|||||||
"display_name": "Version Upgrade 4.2 to 4.3",
|
"display_name": "Version Upgrade 4.2 to 4.3",
|
||||||
"description": "Upgrades configurations from Cura 4.2 to Cura 4.3.",
|
"description": "Upgrades configurations from Cura 4.2 to Cura 4.3.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -839,7 +839,7 @@
|
|||||||
"display_name": "Version Upgrade 4.3 to 4.4",
|
"display_name": "Version Upgrade 4.3 to 4.4",
|
||||||
"description": "Upgrades configurations from Cura 4.3 to Cura 4.4.",
|
"description": "Upgrades configurations from Cura 4.3 to Cura 4.4.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -856,7 +856,7 @@
|
|||||||
"display_name": "Version Upgrade 4.4 to 4.5",
|
"display_name": "Version Upgrade 4.4 to 4.5",
|
||||||
"description": "Upgrades configurations from Cura 4.4 to Cura 4.5.",
|
"description": "Upgrades configurations from Cura 4.4 to Cura 4.5.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -873,7 +873,7 @@
|
|||||||
"display_name": "Version Upgrade 4.5 to 4.6",
|
"display_name": "Version Upgrade 4.5 to 4.6",
|
||||||
"description": "Upgrades configurations from Cura 4.5 to Cura 4.6.",
|
"description": "Upgrades configurations from Cura 4.5 to Cura 4.6.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -890,7 +890,7 @@
|
|||||||
"display_name": "Version Upgrade 4.6.0 to 4.6.2",
|
"display_name": "Version Upgrade 4.6.0 to 4.6.2",
|
||||||
"description": "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2.",
|
"description": "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -907,7 +907,7 @@
|
|||||||
"display_name": "Version Upgrade 4.6.2 to 4.7",
|
"display_name": "Version Upgrade 4.6.2 to 4.7",
|
||||||
"description": "Upgrades configurations from Cura 4.6.2 to Cura 4.7.",
|
"description": "Upgrades configurations from Cura 4.6.2 to Cura 4.7.",
|
||||||
"package_version": "1.0.0",
|
"package_version": "1.0.0",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -924,7 +924,7 @@
|
|||||||
"display_name": "X3D Reader",
|
"display_name": "X3D Reader",
|
||||||
"description": "Provides support for reading X3D files.",
|
"description": "Provides support for reading X3D files.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "SevaAlekseyev",
|
"author_id": "SevaAlekseyev",
|
||||||
@ -941,7 +941,7 @@
|
|||||||
"display_name": "XML Material Profiles",
|
"display_name": "XML Material Profiles",
|
||||||
"description": "Provides capabilities to read and write XML-based material profiles.",
|
"description": "Provides capabilities to read and write XML-based material profiles.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -958,7 +958,7 @@
|
|||||||
"display_name": "X-Ray View",
|
"display_name": "X-Ray View",
|
||||||
"description": "Provides the X-Ray view.",
|
"description": "Provides the X-Ray view.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com",
|
"website": "https://ultimaker.com",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -975,7 +975,7 @@
|
|||||||
"display_name": "Generic ABS",
|
"display_name": "Generic ABS",
|
||||||
"description": "The generic ABS profile which other profiles can be based upon.",
|
"description": "The generic ABS profile which other profiles can be based upon.",
|
||||||
"package_version": "1.2.1",
|
"package_version": "1.2.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -993,7 +993,7 @@
|
|||||||
"display_name": "Generic BAM",
|
"display_name": "Generic BAM",
|
||||||
"description": "The generic BAM profile which other profiles can be based upon.",
|
"description": "The generic BAM profile which other profiles can be based upon.",
|
||||||
"package_version": "1.2.1",
|
"package_version": "1.2.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -1011,7 +1011,7 @@
|
|||||||
"display_name": "Generic CFF CPE",
|
"display_name": "Generic CFF CPE",
|
||||||
"description": "The generic CFF CPE profile which other profiles can be based upon.",
|
"description": "The generic CFF CPE profile which other profiles can be based upon.",
|
||||||
"package_version": "1.1.1",
|
"package_version": "1.1.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -1029,7 +1029,7 @@
|
|||||||
"display_name": "Generic CFF PA",
|
"display_name": "Generic CFF PA",
|
||||||
"description": "The generic CFF PA profile which other profiles can be based upon.",
|
"description": "The generic CFF PA profile which other profiles can be based upon.",
|
||||||
"package_version": "1.1.1",
|
"package_version": "1.1.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -1047,7 +1047,7 @@
|
|||||||
"display_name": "Generic CPE",
|
"display_name": "Generic CPE",
|
||||||
"description": "The generic CPE profile which other profiles can be based upon.",
|
"description": "The generic CPE profile which other profiles can be based upon.",
|
||||||
"package_version": "1.2.1",
|
"package_version": "1.2.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -1065,7 +1065,7 @@
|
|||||||
"display_name": "Generic CPE+",
|
"display_name": "Generic CPE+",
|
||||||
"description": "The generic CPE+ profile which other profiles can be based upon.",
|
"description": "The generic CPE+ profile which other profiles can be based upon.",
|
||||||
"package_version": "1.2.1",
|
"package_version": "1.2.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -1083,7 +1083,7 @@
|
|||||||
"display_name": "Generic GFF CPE",
|
"display_name": "Generic GFF CPE",
|
||||||
"description": "The generic GFF CPE profile which other profiles can be based upon.",
|
"description": "The generic GFF CPE profile which other profiles can be based upon.",
|
||||||
"package_version": "1.1.1",
|
"package_version": "1.1.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -1101,7 +1101,7 @@
|
|||||||
"display_name": "Generic GFF PA",
|
"display_name": "Generic GFF PA",
|
||||||
"description": "The generic GFF PA profile which other profiles can be based upon.",
|
"description": "The generic GFF PA profile which other profiles can be based upon.",
|
||||||
"package_version": "1.1.1",
|
"package_version": "1.1.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -1119,7 +1119,7 @@
|
|||||||
"display_name": "Generic HIPS",
|
"display_name": "Generic HIPS",
|
||||||
"description": "The generic HIPS profile which other profiles can be based upon.",
|
"description": "The generic HIPS profile which other profiles can be based upon.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -1137,7 +1137,7 @@
|
|||||||
"display_name": "Generic Nylon",
|
"display_name": "Generic Nylon",
|
||||||
"description": "The generic Nylon profile which other profiles can be based upon.",
|
"description": "The generic Nylon profile which other profiles can be based upon.",
|
||||||
"package_version": "1.2.1",
|
"package_version": "1.2.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -1155,7 +1155,7 @@
|
|||||||
"display_name": "Generic PC",
|
"display_name": "Generic PC",
|
||||||
"description": "The generic PC profile which other profiles can be based upon.",
|
"description": "The generic PC profile which other profiles can be based upon.",
|
||||||
"package_version": "1.2.1",
|
"package_version": "1.2.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -1173,7 +1173,7 @@
|
|||||||
"display_name": "Generic PETG",
|
"display_name": "Generic PETG",
|
||||||
"description": "The generic PETG profile which other profiles can be based upon.",
|
"description": "The generic PETG profile which other profiles can be based upon.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -1191,7 +1191,7 @@
|
|||||||
"display_name": "Generic PLA",
|
"display_name": "Generic PLA",
|
||||||
"description": "The generic PLA profile which other profiles can be based upon.",
|
"description": "The generic PLA profile which other profiles can be based upon.",
|
||||||
"package_version": "1.2.1",
|
"package_version": "1.2.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -1209,7 +1209,7 @@
|
|||||||
"display_name": "Generic PP",
|
"display_name": "Generic PP",
|
||||||
"description": "The generic PP profile which other profiles can be based upon.",
|
"description": "The generic PP profile which other profiles can be based upon.",
|
||||||
"package_version": "1.2.1",
|
"package_version": "1.2.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -1227,7 +1227,7 @@
|
|||||||
"display_name": "Generic PVA",
|
"display_name": "Generic PVA",
|
||||||
"description": "The generic PVA profile which other profiles can be based upon.",
|
"description": "The generic PVA profile which other profiles can be based upon.",
|
||||||
"package_version": "1.2.1",
|
"package_version": "1.2.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -1245,7 +1245,7 @@
|
|||||||
"display_name": "Generic Tough PLA",
|
"display_name": "Generic Tough PLA",
|
||||||
"description": "The generic Tough PLA profile which other profiles can be based upon.",
|
"description": "The generic Tough PLA profile which other profiles can be based upon.",
|
||||||
"package_version": "1.0.2",
|
"package_version": "1.0.2",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -1263,7 +1263,7 @@
|
|||||||
"display_name": "Generic TPU",
|
"display_name": "Generic TPU",
|
||||||
"description": "The generic TPU profile which other profiles can be based upon.",
|
"description": "The generic TPU profile which other profiles can be based upon.",
|
||||||
"package_version": "1.2.1",
|
"package_version": "1.2.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://github.com/Ultimaker/fdm_materials",
|
"website": "https://github.com/Ultimaker/fdm_materials",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Generic",
|
"author_id": "Generic",
|
||||||
@ -1281,7 +1281,7 @@
|
|||||||
"display_name": "Dagoma Chromatik PLA",
|
"display_name": "Dagoma Chromatik PLA",
|
||||||
"description": "Filament testé et approuvé pour les imprimantes 3D Dagoma. Chromatik est l'idéal pour débuter et suivre les tutoriels premiers pas. Il vous offre qualité et résistance pour chacune de vos impressions.",
|
"description": "Filament testé et approuvé pour les imprimantes 3D Dagoma. Chromatik est l'idéal pour débuter et suivre les tutoriels premiers pas. Il vous offre qualité et résistance pour chacune de vos impressions.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://dagoma.fr/boutique/filaments.html",
|
"website": "https://dagoma.fr/boutique/filaments.html",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Dagoma",
|
"author_id": "Dagoma",
|
||||||
@ -1298,7 +1298,7 @@
|
|||||||
"display_name": "FABtotum ABS",
|
"display_name": "FABtotum ABS",
|
||||||
"description": "This material is easy to be extruded but it is not the simplest to use. It is one of the most used in 3D printing to get very well finished objects. It is not sustainable and its smoke can be dangerous if inhaled. The reason to prefer this filament to PLA is mainly because of its precision and mechanical specs. ABS (for plastic) stands for Acrylonitrile Butadiene Styrene and it is a thermoplastic which is widely used in everyday objects. It can be printed with any FFF 3D printer which can get to high temperatures as it must be extruded in a range between 220° and 245°, so it’s compatible with all versions of the FABtotum Personal fabricator.",
|
"description": "This material is easy to be extruded but it is not the simplest to use. It is one of the most used in 3D printing to get very well finished objects. It is not sustainable and its smoke can be dangerous if inhaled. The reason to prefer this filament to PLA is mainly because of its precision and mechanical specs. ABS (for plastic) stands for Acrylonitrile Butadiene Styrene and it is a thermoplastic which is widely used in everyday objects. It can be printed with any FFF 3D printer which can get to high temperatures as it must be extruded in a range between 220° and 245°, so it’s compatible with all versions of the FABtotum Personal fabricator.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=40",
|
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=40",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "FABtotum",
|
"author_id": "FABtotum",
|
||||||
@ -1315,7 +1315,7 @@
|
|||||||
"display_name": "FABtotum Nylon",
|
"display_name": "FABtotum Nylon",
|
||||||
"description": "When 3D printing started this material was not listed among the extrudable filaments. It is flexible as well as resistant to tractions. It is well known for its uses in textile but also in industries which require a strong and flexible material. There are different kinds of Nylon: 3D printing mostly uses Nylon 6 and Nylon 6.6, which are the most common. It requires higher temperatures to be printed, so a 3D printer must be able to reach them (around 240°C): the FABtotum, of course, can.",
|
"description": "When 3D printing started this material was not listed among the extrudable filaments. It is flexible as well as resistant to tractions. It is well known for its uses in textile but also in industries which require a strong and flexible material. There are different kinds of Nylon: 3D printing mostly uses Nylon 6 and Nylon 6.6, which are the most common. It requires higher temperatures to be printed, so a 3D printer must be able to reach them (around 240°C): the FABtotum, of course, can.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=53",
|
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=53",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "FABtotum",
|
"author_id": "FABtotum",
|
||||||
@ -1332,7 +1332,7 @@
|
|||||||
"display_name": "FABtotum PLA",
|
"display_name": "FABtotum PLA",
|
||||||
"description": "It is the most common filament used for 3D printing. It is studied to be bio-degradable as it comes from corn starch’s sugar mainly. It is completely made of renewable sources and has no footprint on polluting. PLA stands for PolyLactic Acid and it is a thermoplastic that today is still considered the easiest material to be 3D printed. It can be extruded at lower temperatures: the standard range of FABtotum’s one is between 185° and 195°.",
|
"description": "It is the most common filament used for 3D printing. It is studied to be bio-degradable as it comes from corn starch’s sugar mainly. It is completely made of renewable sources and has no footprint on polluting. PLA stands for PolyLactic Acid and it is a thermoplastic that today is still considered the easiest material to be 3D printed. It can be extruded at lower temperatures: the standard range of FABtotum’s one is between 185° and 195°.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=39",
|
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=39",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "FABtotum",
|
"author_id": "FABtotum",
|
||||||
@ -1349,7 +1349,7 @@
|
|||||||
"display_name": "FABtotum TPU Shore 98A",
|
"display_name": "FABtotum TPU Shore 98A",
|
||||||
"description": "",
|
"description": "",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=66",
|
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=66",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "FABtotum",
|
"author_id": "FABtotum",
|
||||||
@ -1366,7 +1366,7 @@
|
|||||||
"display_name": "Fiberlogy HD PLA",
|
"display_name": "Fiberlogy HD PLA",
|
||||||
"description": "With our HD PLA you have many more options. You can use this material in two ways. Choose the one you like best. You can use it as a normal PLA and get prints characterized by a very good adhesion between the layers and high precision. You can also make your prints acquire similar properties to that of ABS – better impact resistance and high temperature resistance. All you need is an oven. Yes, an oven! By annealing our HD PLA in an oven, in accordance with the manual, you will avoid all the inconveniences of printing with ABS, such as unpleasant odour or hazardous fumes.",
|
"description": "With our HD PLA you have many more options. You can use this material in two ways. Choose the one you like best. You can use it as a normal PLA and get prints characterized by a very good adhesion between the layers and high precision. You can also make your prints acquire similar properties to that of ABS – better impact resistance and high temperature resistance. All you need is an oven. Yes, an oven! By annealing our HD PLA in an oven, in accordance with the manual, you will avoid all the inconveniences of printing with ABS, such as unpleasant odour or hazardous fumes.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "http://fiberlogy.com/en/fiberlogy-filaments/filament-hd-pla/",
|
"website": "http://fiberlogy.com/en/fiberlogy-filaments/filament-hd-pla/",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Fiberlogy",
|
"author_id": "Fiberlogy",
|
||||||
@ -1383,7 +1383,7 @@
|
|||||||
"display_name": "Filo3D PLA",
|
"display_name": "Filo3D PLA",
|
||||||
"description": "Fast, safe and reliable printing. PLA is ideal for the fast and reliable printing of parts and prototypes with a great surface quality.",
|
"description": "Fast, safe and reliable printing. PLA is ideal for the fast and reliable printing of parts and prototypes with a great surface quality.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://dagoma.fr",
|
"website": "https://dagoma.fr",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Dagoma",
|
"author_id": "Dagoma",
|
||||||
@ -1400,7 +1400,7 @@
|
|||||||
"display_name": "IMADE3D JellyBOX PETG",
|
"display_name": "IMADE3D JellyBOX PETG",
|
||||||
"description": "",
|
"description": "",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "http://shop.imade3d.com/filament.html",
|
"website": "http://shop.imade3d.com/filament.html",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "IMADE3D",
|
"author_id": "IMADE3D",
|
||||||
@ -1417,7 +1417,7 @@
|
|||||||
"display_name": "IMADE3D JellyBOX PLA",
|
"display_name": "IMADE3D JellyBOX PLA",
|
||||||
"description": "",
|
"description": "",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "http://shop.imade3d.com/filament.html",
|
"website": "http://shop.imade3d.com/filament.html",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "IMADE3D",
|
"author_id": "IMADE3D",
|
||||||
@ -1434,7 +1434,7 @@
|
|||||||
"display_name": "Octofiber PLA",
|
"display_name": "Octofiber PLA",
|
||||||
"description": "PLA material from Octofiber.",
|
"description": "PLA material from Octofiber.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://nl.octofiber.com/3d-printing-filament/pla.html",
|
"website": "https://nl.octofiber.com/3d-printing-filament/pla.html",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Octofiber",
|
"author_id": "Octofiber",
|
||||||
@ -1451,7 +1451,7 @@
|
|||||||
"display_name": "PolyFlex™ PLA",
|
"display_name": "PolyFlex™ PLA",
|
||||||
"description": "PolyFlex™ is a highly flexible yet easy to print 3D printing material. Featuring good elasticity and a large strain-to- failure, PolyFlex™ opens up a completely new realm of applications.",
|
"description": "PolyFlex™ is a highly flexible yet easy to print 3D printing material. Featuring good elasticity and a large strain-to- failure, PolyFlex™ opens up a completely new realm of applications.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "http://www.polymaker.com/shop/polyflex/",
|
"website": "http://www.polymaker.com/shop/polyflex/",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Polymaker",
|
"author_id": "Polymaker",
|
||||||
@ -1468,7 +1468,7 @@
|
|||||||
"display_name": "PolyMax™ PLA",
|
"display_name": "PolyMax™ PLA",
|
||||||
"description": "PolyMax™ PLA is a 3D printing material with excellent mechanical properties and printing quality. PolyMax™ PLA has an impact resistance of up to nine times that of regular PLA, and better overall mechanical properties than ABS.",
|
"description": "PolyMax™ PLA is a 3D printing material with excellent mechanical properties and printing quality. PolyMax™ PLA has an impact resistance of up to nine times that of regular PLA, and better overall mechanical properties than ABS.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "http://www.polymaker.com/shop/polymax/",
|
"website": "http://www.polymaker.com/shop/polymax/",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Polymaker",
|
"author_id": "Polymaker",
|
||||||
@ -1485,7 +1485,7 @@
|
|||||||
"display_name": "PolyPlus™ PLA True Colour",
|
"display_name": "PolyPlus™ PLA True Colour",
|
||||||
"description": "PolyPlus™ PLA is a premium PLA designed for all desktop FDM/FFF 3D printers. It is produced with our patented Jam-Free™ technology that ensures consistent extrusion and prevents jams.",
|
"description": "PolyPlus™ PLA is a premium PLA designed for all desktop FDM/FFF 3D printers. It is produced with our patented Jam-Free™ technology that ensures consistent extrusion and prevents jams.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "http://www.polymaker.com/shop/polyplus-true-colour/",
|
"website": "http://www.polymaker.com/shop/polyplus-true-colour/",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Polymaker",
|
"author_id": "Polymaker",
|
||||||
@ -1502,7 +1502,7 @@
|
|||||||
"display_name": "PolyWood™ PLA",
|
"display_name": "PolyWood™ PLA",
|
||||||
"description": "PolyWood™ is a wood mimic printing material that contains no actual wood ensuring a clean Jam-Free™ printing experience.",
|
"description": "PolyWood™ is a wood mimic printing material that contains no actual wood ensuring a clean Jam-Free™ printing experience.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "http://www.polymaker.com/shop/polywood/",
|
"website": "http://www.polymaker.com/shop/polywood/",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Polymaker",
|
"author_id": "Polymaker",
|
||||||
@ -1519,7 +1519,7 @@
|
|||||||
"display_name": "Ultimaker ABS",
|
"display_name": "Ultimaker ABS",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.2.2",
|
"package_version": "1.2.2",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com/products/materials/abs",
|
"website": "https://ultimaker.com/products/materials/abs",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -1538,7 +1538,7 @@
|
|||||||
"display_name": "Ultimaker Breakaway",
|
"display_name": "Ultimaker Breakaway",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.2.1",
|
"package_version": "1.2.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com/products/materials/breakaway",
|
"website": "https://ultimaker.com/products/materials/breakaway",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -1557,7 +1557,7 @@
|
|||||||
"display_name": "Ultimaker CPE",
|
"display_name": "Ultimaker CPE",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.2.2",
|
"package_version": "1.2.2",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com/products/materials/abs",
|
"website": "https://ultimaker.com/products/materials/abs",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -1576,7 +1576,7 @@
|
|||||||
"display_name": "Ultimaker CPE+",
|
"display_name": "Ultimaker CPE+",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.2.2",
|
"package_version": "1.2.2",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com/products/materials/cpe",
|
"website": "https://ultimaker.com/products/materials/cpe",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -1595,7 +1595,7 @@
|
|||||||
"display_name": "Ultimaker Nylon",
|
"display_name": "Ultimaker Nylon",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.2.2",
|
"package_version": "1.2.2",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com/products/materials/abs",
|
"website": "https://ultimaker.com/products/materials/abs",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -1614,7 +1614,7 @@
|
|||||||
"display_name": "Ultimaker PC",
|
"display_name": "Ultimaker PC",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.2.2",
|
"package_version": "1.2.2",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com/products/materials/pc",
|
"website": "https://ultimaker.com/products/materials/pc",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -1633,7 +1633,7 @@
|
|||||||
"display_name": "Ultimaker PLA",
|
"display_name": "Ultimaker PLA",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.2.2",
|
"package_version": "1.2.2",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com/products/materials/abs",
|
"website": "https://ultimaker.com/products/materials/abs",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -1652,7 +1652,7 @@
|
|||||||
"display_name": "Ultimaker PP",
|
"display_name": "Ultimaker PP",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.2.2",
|
"package_version": "1.2.2",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com/products/materials/pp",
|
"website": "https://ultimaker.com/products/materials/pp",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -1671,7 +1671,7 @@
|
|||||||
"display_name": "Ultimaker PVA",
|
"display_name": "Ultimaker PVA",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.2.1",
|
"package_version": "1.2.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com/products/materials/abs",
|
"website": "https://ultimaker.com/products/materials/abs",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -1690,7 +1690,7 @@
|
|||||||
"display_name": "Ultimaker TPU 95A",
|
"display_name": "Ultimaker TPU 95A",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.2.2",
|
"package_version": "1.2.2",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com/products/materials/tpu-95a",
|
"website": "https://ultimaker.com/products/materials/tpu-95a",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -1709,7 +1709,7 @@
|
|||||||
"display_name": "Ultimaker Tough PLA",
|
"display_name": "Ultimaker Tough PLA",
|
||||||
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
"description": "Example package for material and quality profiles for Ultimaker materials.",
|
||||||
"package_version": "1.0.3",
|
"package_version": "1.0.3",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://ultimaker.com/products/materials/tough-pla",
|
"website": "https://ultimaker.com/products/materials/tough-pla",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "UltimakerPackages",
|
"author_id": "UltimakerPackages",
|
||||||
@ -1728,7 +1728,7 @@
|
|||||||
"display_name": "Vertex Delta ABS",
|
"display_name": "Vertex Delta ABS",
|
||||||
"description": "ABS material and quality files for the Delta Vertex K8800.",
|
"description": "ABS material and quality files for the Delta Vertex K8800.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://vertex3dprinter.eu",
|
"website": "https://vertex3dprinter.eu",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Velleman",
|
"author_id": "Velleman",
|
||||||
@ -1745,7 +1745,7 @@
|
|||||||
"display_name": "Vertex Delta PET",
|
"display_name": "Vertex Delta PET",
|
||||||
"description": "ABS material and quality files for the Delta Vertex K8800.",
|
"description": "ABS material and quality files for the Delta Vertex K8800.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://vertex3dprinter.eu",
|
"website": "https://vertex3dprinter.eu",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Velleman",
|
"author_id": "Velleman",
|
||||||
@ -1762,7 +1762,7 @@
|
|||||||
"display_name": "Vertex Delta PLA",
|
"display_name": "Vertex Delta PLA",
|
||||||
"description": "ABS material and quality files for the Delta Vertex K8800.",
|
"description": "ABS material and quality files for the Delta Vertex K8800.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://vertex3dprinter.eu",
|
"website": "https://vertex3dprinter.eu",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Velleman",
|
"author_id": "Velleman",
|
||||||
@ -1779,7 +1779,7 @@
|
|||||||
"display_name": "Vertex Delta TPU",
|
"display_name": "Vertex Delta TPU",
|
||||||
"description": "ABS material and quality files for the Delta Vertex K8800.",
|
"description": "ABS material and quality files for the Delta Vertex K8800.",
|
||||||
"package_version": "1.0.1",
|
"package_version": "1.0.1",
|
||||||
"sdk_version": "7.2.0",
|
"sdk_version": "7.3.0",
|
||||||
"website": "https://vertex3dprinter.eu",
|
"website": "https://vertex3dprinter.eu",
|
||||||
"author": {
|
"author": {
|
||||||
"author_id": "Velleman",
|
"author_id": "Velleman",
|
||||||
|
79
resources/definitions/cocoon_create.def.json
Normal file
79
resources/definitions/cocoon_create.def.json
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
{
|
||||||
|
"name": "Cocoon Create",
|
||||||
|
"version": 2,
|
||||||
|
"inherits": "fdmprinter",
|
||||||
|
"metadata": {
|
||||||
|
"visible": true,
|
||||||
|
"author": "Thushan Fernando",
|
||||||
|
"manufacturer": "Cocoon Create",
|
||||||
|
"file_formats": "text/x-gcode",
|
||||||
|
"preferred_quality_type": "fine",
|
||||||
|
"has_materials": true,
|
||||||
|
"platform": "wanhao_200_200_platform.obj",
|
||||||
|
"platform_texture": "Cocoon-backplate.png",
|
||||||
|
"machine_extruder_trains": {
|
||||||
|
"0": "cocoon_create_extruder_0"
|
||||||
|
},
|
||||||
|
"platform_offset": [
|
||||||
|
0,
|
||||||
|
-28,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
"machine_name": {
|
||||||
|
"default_value": "Cocoon Create"
|
||||||
|
},
|
||||||
|
"machine_width": {
|
||||||
|
"default_value": 200
|
||||||
|
},
|
||||||
|
"machine_height": {
|
||||||
|
"default_value": 180
|
||||||
|
},
|
||||||
|
"machine_depth": {
|
||||||
|
"default_value": 200
|
||||||
|
},
|
||||||
|
"machine_heated_bed": {
|
||||||
|
"default_value": true
|
||||||
|
},
|
||||||
|
"machine_gcode_flavor": {
|
||||||
|
"default_value": "RepRap (Marlin/Sprinter)"
|
||||||
|
},
|
||||||
|
"machine_start_gcode": {
|
||||||
|
"default_value": "G21 ;metric values\n G90 ;absolute positioning\n M82 ;set extruder to absolute mode\n M107 ;start with the fan off\n G28 X0 Y0 ;move X/Y to min endstops\n G28 Z0 ;move Z to min endstops\n G1 Z15.0 F{speed_travel} ;move the platform down 15mm\n G92 E0 ;zero the extruded length\n G1 F200 E3 ;extrude 3mm of feed stock\n G92 E0 ;zero the extruded length again\n G1 F{speed_travel} \n ;Put printing message on LCD screen\n M117 Printing..."
|
||||||
|
},
|
||||||
|
"machine_end_gcode": {
|
||||||
|
"default_value": "M104 S0 ;extruder heater off \n G91 ;relative positioning\n G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n G1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\n G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\n M84 ;steppers off\n G90 ;absolute positioning"
|
||||||
|
},
|
||||||
|
"material_diameter": {
|
||||||
|
"default_value": 1.75
|
||||||
|
},
|
||||||
|
"layer_height": {
|
||||||
|
"default_value": 0.10
|
||||||
|
},
|
||||||
|
"layer_height_0": {
|
||||||
|
"default_value": 0.2
|
||||||
|
},
|
||||||
|
"wall_thickness": {
|
||||||
|
"value": "0.8"
|
||||||
|
},
|
||||||
|
"top_bottom_thickness": {
|
||||||
|
"default_value": 0.6
|
||||||
|
},
|
||||||
|
"speed_print": {
|
||||||
|
"default_value": 50
|
||||||
|
},
|
||||||
|
"support_enable": {
|
||||||
|
"default_value": true
|
||||||
|
},
|
||||||
|
"retraction_enable": {
|
||||||
|
"default_value": true
|
||||||
|
},
|
||||||
|
"retraction_amount": {
|
||||||
|
"default_value": 4.5
|
||||||
|
},
|
||||||
|
"retraction_speed": {
|
||||||
|
"default_value": 25
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
79
resources/definitions/cocoon_create_touch.def.json
Normal file
79
resources/definitions/cocoon_create_touch.def.json
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
{
|
||||||
|
"name": "Cocoon Create Touch",
|
||||||
|
"version": 2,
|
||||||
|
"inherits": "fdmprinter",
|
||||||
|
"metadata": {
|
||||||
|
"visible": true,
|
||||||
|
"author": "Thushan Fernando",
|
||||||
|
"manufacturer": "Cocoon Create",
|
||||||
|
"file_formats": "text/x-gcode",
|
||||||
|
"preferred_quality_type": "fine",
|
||||||
|
"has_materials": true,
|
||||||
|
"platform": "wanhao_200_200_platform.obj",
|
||||||
|
"platform_texture": "Cocoon-backplate.png",
|
||||||
|
"machine_extruder_trains": {
|
||||||
|
"0": "cocoon_create_touch_extruder_0"
|
||||||
|
},
|
||||||
|
"platform_offset": [
|
||||||
|
0,
|
||||||
|
-28,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"overrides": {
|
||||||
|
"machine_name": {
|
||||||
|
"default_value": "Cocoon Create Touch"
|
||||||
|
},
|
||||||
|
"machine_width": {
|
||||||
|
"default_value": 200
|
||||||
|
},
|
||||||
|
"machine_height": {
|
||||||
|
"default_value": 180
|
||||||
|
},
|
||||||
|
"machine_depth": {
|
||||||
|
"default_value": 200
|
||||||
|
},
|
||||||
|
"machine_heated_bed": {
|
||||||
|
"default_value": true
|
||||||
|
},
|
||||||
|
"machine_gcode_flavor": {
|
||||||
|
"default_value": "RepRap (Marlin/Sprinter)"
|
||||||
|
},
|
||||||
|
"machine_start_gcode": {
|
||||||
|
"default_value": "G21 ;metric values\n G90 ;absolute positioning\n M82 ;set extruder to absolute mode\n M107 ;start with the fan off\n G28 X0 Y0 ;move X/Y to min endstops\n G28 Z0 ;move Z to min endstops\n G1 Z15.0 F{speed_travel} ;move the platform down 15mm\n G92 E0 ;zero the extruded length\n G1 F200 E3 ;extrude 3mm of feed stock\n G92 E0 ;zero the extruded length again\n G1 F{speed_travel} \n ;Put printing message on LCD screen\n M117 Printing..."
|
||||||
|
},
|
||||||
|
"machine_end_gcode": {
|
||||||
|
"default_value": "M104 S0 ;extruder heater off \n G91 ;relative positioning\n G1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\n G1 Z+0.5 E-5 X-20 Y-20 F{speed_travel} ;move Z up a bit and retract filament even more\n G28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\n M84 ;steppers off\n G90 ;absolute positioning"
|
||||||
|
},
|
||||||
|
"material_diameter": {
|
||||||
|
"default_value": 1.75
|
||||||
|
},
|
||||||
|
"layer_height": {
|
||||||
|
"default_value": 0.10
|
||||||
|
},
|
||||||
|
"layer_height_0": {
|
||||||
|
"default_value": 0.2
|
||||||
|
},
|
||||||
|
"wall_thickness": {
|
||||||
|
"value": "0.8"
|
||||||
|
},
|
||||||
|
"top_bottom_thickness": {
|
||||||
|
"default_value": 0.6
|
||||||
|
},
|
||||||
|
"speed_print": {
|
||||||
|
"default_value": 50
|
||||||
|
},
|
||||||
|
"support_enable": {
|
||||||
|
"default_value": true
|
||||||
|
},
|
||||||
|
"retraction_enable": {
|
||||||
|
"default_value": true
|
||||||
|
},
|
||||||
|
"retraction_amount": {
|
||||||
|
"default_value": 4.5
|
||||||
|
},
|
||||||
|
"retraction_speed": {
|
||||||
|
"default_value": 25
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -4332,7 +4332,7 @@
|
|||||||
"type": "bool",
|
"type": "bool",
|
||||||
"default_value": false,
|
"default_value": false,
|
||||||
"value": "support_pattern == 'cross' or support_pattern == 'gyroid'",
|
"value": "support_pattern == 'cross' or support_pattern == 'gyroid'",
|
||||||
"enabled": "(support_enable or support_meshes_present) and (support_pattern == 'grid' or support_pattern == 'triangles' or support_pattern == 'cross' or support_pattern == 'gyroid')",
|
"enabled": "(support_enable or support_meshes_present) and (support_pattern == 'lines' or support_pattern == 'grid' or support_pattern == 'triangles' or support_pattern == 'cross' or support_pattern == 'gyroid')",
|
||||||
"limit_to_extruder": "support_infill_extruder_nr",
|
"limit_to_extruder": "support_infill_extruder_nr",
|
||||||
"settable_per_mesh": false,
|
"settable_per_mesh": false,
|
||||||
"settable_per_extruder": true
|
"settable_per_extruder": true
|
||||||
@ -6152,7 +6152,7 @@
|
|||||||
"infill_mesh_order":
|
"infill_mesh_order":
|
||||||
{
|
{
|
||||||
"label": "Mesh Processing Rank",
|
"label": "Mesh Processing Rank",
|
||||||
"description": "Determines the priority of this mesh when considering overlapping volumes. Areas where multiple meshes reside will be won by the lower rank mesh. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes.",
|
"description": "Determines the priority of this mesh when considering multiple overlapping infill meshes. Areas where multiple infill meshes overlap will take on the settings of the mesh with the lowest rank. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes.",
|
||||||
"default_value": 0,
|
"default_value": 0,
|
||||||
"value": "1 if infill_mesh else 0",
|
"value": "1 if infill_mesh else 0",
|
||||||
"minimum_value_warning": "1",
|
"minimum_value_warning": "1",
|
||||||
|
15
resources/extruders/cocoon_create_extruder_0.def.json
Normal file
15
resources/extruders/cocoon_create_extruder_0.def.json
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"name": "Extruder 1",
|
||||||
|
"inherits": "fdmextruder",
|
||||||
|
"metadata": {
|
||||||
|
"machine": "cocoon_create",
|
||||||
|
"position": "0"
|
||||||
|
},
|
||||||
|
|
||||||
|
"overrides": {
|
||||||
|
"extruder_nr": { "default_value": 0 },
|
||||||
|
"machine_nozzle_size": { "default_value": 0.4 },
|
||||||
|
"material_diameter": { "default_value": 1.75 }
|
||||||
|
}
|
||||||
|
}
|
15
resources/extruders/cocoon_create_touch_extruder_0.def.json
Normal file
15
resources/extruders/cocoon_create_touch_extruder_0.def.json
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"version": 2,
|
||||||
|
"name": "Extruder 1",
|
||||||
|
"inherits": "fdmextruder",
|
||||||
|
"metadata": {
|
||||||
|
"machine": "cocoon_create_touch",
|
||||||
|
"position": "0"
|
||||||
|
},
|
||||||
|
|
||||||
|
"overrides": {
|
||||||
|
"extruder_nr": { "default_value": 0 },
|
||||||
|
"machine_nozzle_size": { "default_value": 0.4 },
|
||||||
|
"material_diameter": { "default_value": 1.75 }
|
||||||
|
}
|
||||||
|
}
|
@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Project-Id-Version: Cura 4.7\n"
|
"Project-Id-Version: Cura 4.7\n"
|
||||||
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
|
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
|
||||||
"POT-Creation-Date: 2020-07-31 12:48+0200\n"
|
"POT-Creation-Date: 2020-07-31 12:48+0200\n"
|
||||||
"PO-Revision-Date: 2020-04-07 11:15+0200\n"
|
"PO-Revision-Date: 2020-08-21 14:20+0200\n"
|
||||||
"Last-Translator: DenyCZ <www.github.com/DenyCZ>\n"
|
"Last-Translator: DenyCZ <www.github.com/DenyCZ>\n"
|
||||||
"Language-Team: DenyCZ <www.github.com/DenyCZ>\n"
|
"Language-Team: DenyCZ <www.github.com/DenyCZ>\n"
|
||||||
"Language: cs_CZ\n"
|
"Language: cs_CZ\n"
|
||||||
@ -46,7 +46,7 @@ msgstr "Nepřepsáno"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/Machines/Models/GlobalStacksModel.py:76
|
#: /home/trin/Gedeeld/Projects/Cura/cura/Machines/Models/GlobalStacksModel.py:76
|
||||||
msgctxt "@label ({} is object name)"
|
msgctxt "@label ({} is object name)"
|
||||||
msgid "Are you sure you wish to remove {}? This cannot be undone!"
|
msgid "Are you sure you wish to remove {}? This cannot be undone!"
|
||||||
msgstr ""
|
msgstr "Doopravdy chcete odstranit {}? Toto nelze vrátit zpět!"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/Machines/Models/IntentCategoryModel.py:42
|
#: /home/trin/Gedeeld/Projects/Cura/cura/Machines/Models/IntentCategoryModel.py:42
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/Machines/Models/IntentTranslations.py:11
|
#: /home/trin/Gedeeld/Projects/Cura/cura/Machines/Models/IntentTranslations.py:11
|
||||||
@ -438,7 +438,7 @@ msgstr "Při pokusu o přihlášení se stalo něco neočekávaného, zkuste to
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/OAuth2/AuthorizationService.py:187
|
#: /home/trin/Gedeeld/Projects/Cura/cura/OAuth2/AuthorizationService.py:187
|
||||||
msgctxt "@info"
|
msgctxt "@info"
|
||||||
msgid "Unable to start a new sign in process. Check if another sign in attempt is still active."
|
msgid "Unable to start a new sign in process. Check if another sign in attempt is still active."
|
||||||
msgstr ""
|
msgstr "Nepodařilo se mi spustit nový proces přihlášení. Zkontrolujte, zda nějaký jiný již neběží."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/OAuth2/AuthorizationService.py:242
|
#: /home/trin/Gedeeld/Projects/Cura/cura/OAuth2/AuthorizationService.py:242
|
||||||
msgctxt "@info"
|
msgctxt "@info"
|
||||||
@ -561,7 +561,7 @@ msgstr "Nelze najít typ kvality {0} pro aktuální konfiguraci."
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/Settings/CuraContainerRegistry.py:443
|
#: /home/trin/Gedeeld/Projects/Cura/cura/Settings/CuraContainerRegistry.py:443
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Unable to add the profile."
|
msgid "Unable to add the profile."
|
||||||
msgstr ""
|
msgstr "Nepovedlo se přidat profil."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/Settings/cura_empty_instance_containers.py:36
|
#: /home/trin/Gedeeld/Projects/Cura/cura/Settings/cura_empty_instance_containers.py:36
|
||||||
msgctxt "@info:not supported profile"
|
msgctxt "@info:not supported profile"
|
||||||
@ -605,7 +605,7 @@ msgstr "Přidat"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/UI/WelcomePagesModel.py:263
|
#: /home/trin/Gedeeld/Projects/Cura/cura/UI/WelcomePagesModel.py:263
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Finish"
|
msgid "Finish"
|
||||||
msgstr ""
|
msgstr "Dokončit"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/UI/AddPrinterPagesModel.py:33
|
#: /home/trin/Gedeeld/Projects/Cura/cura/UI/AddPrinterPagesModel.py:33
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:406
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:406
|
||||||
@ -737,18 +737,18 @@ msgstr "Otevřít soubor s projektem"
|
|||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@info:error Don't translate the XML tags <filename> or <message>!"
|
msgctxt "@info:error Don't translate the XML tags <filename> or <message>!"
|
||||||
msgid "Project file <filename>{0}</filename> is suddenly inaccessible: <message>{1}</message>."
|
msgid "Project file <filename>{0}</filename> is suddenly inaccessible: <message>{1}</message>."
|
||||||
msgstr ""
|
msgstr "Soubor projektu <filename>{0}</filename>je neočekávaně nedostupný: <message>{1}</message>."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:623
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:623
|
||||||
msgctxt "@info:title"
|
msgctxt "@info:title"
|
||||||
msgid "Can't Open Project File"
|
msgid "Can't Open Project File"
|
||||||
msgstr ""
|
msgstr "Nepovedlo se otevřít soubor projektu"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:668
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:668
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@info:error Don't translate the XML tag <filename>!"
|
msgctxt "@info:error Don't translate the XML tag <filename>!"
|
||||||
msgid "Project file <filename>{0}</filename> is made using profiles that are unknown to this version of Ultimaker Cura."
|
msgid "Project file <filename>{0}</filename> is made using profiles that are unknown to this version of Ultimaker Cura."
|
||||||
msgstr ""
|
msgstr "Soubor projektu <filename>{0}</filename> je vytvořený profily, které jsou této verzi Ultimaker Cura neznámé."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:186
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:186
|
||||||
msgctxt "@title:tab"
|
msgctxt "@title:tab"
|
||||||
@ -920,7 +920,7 @@ msgstr "Nemohu načíst informace o aktualizaci."
|
|||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!"
|
msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!"
|
||||||
msgid "New features or bug-fixes may be available for your {machine_name}! If not already at the latest version, it is recommended to update the firmware on your printer to version {latest_version}."
|
msgid "New features or bug-fixes may be available for your {machine_name}! If not already at the latest version, it is recommended to update the firmware on your printer to version {latest_version}."
|
||||||
msgstr ""
|
msgstr "Pro vaše {machine_name} mohou být k dispozici nové funkce nebo opravy chyb! Pokud ještě není v nejnovější verzi, doporučuje se aktualizovat firmware v tiskárně na verzi {latest_version}."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py:22
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py:22
|
||||||
#, python-format
|
#, python-format
|
||||||
@ -1184,12 +1184,12 @@ msgstr "Pohled vrstev"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/SolidView/SolidView.py:70
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/SolidView/SolidView.py:70
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Your model is not manifold. The highlighted areas indicate either missing or extraneous surfaces."
|
msgid "Your model is not manifold. The highlighted areas indicate either missing or extraneous surfaces."
|
||||||
msgstr ""
|
msgstr "Váš model není rozmanitý. Zvýrazněné oblasti indikují buď chybějící, či vedlejší povrch."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/SolidView/SolidView.py:72
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/SolidView/SolidView.py:72
|
||||||
msgctxt "@info:title"
|
msgctxt "@info:title"
|
||||||
msgid "Model errors"
|
msgid "Model errors"
|
||||||
msgstr ""
|
msgstr "Chyby modelu"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/SolidView/__init__.py:12
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/SolidView/__init__.py:12
|
||||||
msgctxt "@item:inmenu"
|
msgctxt "@item:inmenu"
|
||||||
@ -1297,7 +1297,7 @@ msgstr "Balíček ve formátu Ultimaker"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UFPWriter/UFPWriter.py:146
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UFPWriter/UFPWriter.py:146
|
||||||
msgctxt "@info:error"
|
msgctxt "@info:error"
|
||||||
msgid "Can't write to UFP file:"
|
msgid "Can't write to UFP file:"
|
||||||
msgstr ""
|
msgstr "Nemohu zapsat do UFP souboru:"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:24
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:24
|
||||||
msgctxt "@action"
|
msgctxt "@action"
|
||||||
@ -1312,81 +1312,81 @@ msgstr "Vybrat vylepšení"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:148
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:148
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Print via cloud"
|
msgid "Print via cloud"
|
||||||
msgstr ""
|
msgstr "Tisknout přes cloud"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:149
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:149
|
||||||
msgctxt "@properties:tooltip"
|
msgctxt "@properties:tooltip"
|
||||||
msgid "Print via cloud"
|
msgid "Print via cloud"
|
||||||
msgstr ""
|
msgstr "Tisknout přes cloud"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:150
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:150
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Connected via cloud"
|
msgid "Connected via cloud"
|
||||||
msgstr ""
|
msgstr "Připojen přes cloud"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:226
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:226
|
||||||
msgctxt "info:status"
|
msgctxt "info:status"
|
||||||
msgid "New printer detected from your Ultimaker account"
|
msgid "New printer detected from your Ultimaker account"
|
||||||
msgid_plural "New printers detected from your Ultimaker account"
|
msgid_plural "New printers detected from your Ultimaker account"
|
||||||
msgstr[0] ""
|
msgstr[0] "Z vašeho Ultimaker účtu byla detekována nová tiskárna"
|
||||||
msgstr[1] ""
|
msgstr[1] "Z vašeho Ultimaker účtu byly detekovány nové tiskárny"
|
||||||
msgstr[2] ""
|
msgstr[2] "Z vašeho Ultimaker účtu byly detekovány nové tiskárny"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:238
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:238
|
||||||
msgctxt "info:status"
|
msgctxt "info:status"
|
||||||
msgid "Adding printer {} ({}) from your account"
|
msgid "Adding printer {} ({}) from your account"
|
||||||
msgstr ""
|
msgstr "Přidávám tiskárnu {} ({}) z vašeho účtu"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:258
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:258
|
||||||
msgctxt "info:hidden list items"
|
msgctxt "info:hidden list items"
|
||||||
msgid "<li>... and {} others</li>"
|
msgid "<li>... and {} others</li>"
|
||||||
msgstr ""
|
msgstr "<li>... a {} dalších</li>"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:265
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:265
|
||||||
msgctxt "info:status"
|
msgctxt "info:status"
|
||||||
msgid "Printers added from Digital Factory:<ul>{}</ul>"
|
msgid "Printers added from Digital Factory:<ul>{}</ul>"
|
||||||
msgstr ""
|
msgstr "Tiskárny přidané z Digital Factory:<ul>{}</ul>"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:324
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:324
|
||||||
msgctxt "info:status"
|
msgctxt "info:status"
|
||||||
msgid "A cloud connection is not available for a printer"
|
msgid "A cloud connection is not available for a printer"
|
||||||
msgid_plural "A cloud connection is not available for some printers"
|
msgid_plural "A cloud connection is not available for some printers"
|
||||||
msgstr[0] ""
|
msgstr[0] "Pro tuto tiskárnu není připojení přes cloud dostupné"
|
||||||
msgstr[1] ""
|
msgstr[1] "Pro tyto tiskárny není připojení přes cloud dostupné"
|
||||||
msgstr[2] ""
|
msgstr[2] "Pro tyto tiskárny není připojení přes cloud dostupné"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:332
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:332
|
||||||
msgctxt "info:status"
|
msgctxt "info:status"
|
||||||
msgid "This printer is not linked to the Digital Factory:"
|
msgid "This printer is not linked to the Digital Factory:"
|
||||||
msgid_plural "These printers are not linked to the Digital Factory:"
|
msgid_plural "These printers are not linked to the Digital Factory:"
|
||||||
msgstr[0] ""
|
msgstr[0] "Tato tiskárna není napojena na Digital Factory:"
|
||||||
msgstr[1] ""
|
msgstr[1] "Tyto tiskárny nejsou napojeny na Digital Factory:"
|
||||||
msgstr[2] ""
|
msgstr[2] "Tyto tiskárny nejsou napojeny na Digital Factory:"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:338
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:338
|
||||||
msgctxt "info:status"
|
msgctxt "info:status"
|
||||||
msgid "<ul>{}</ul>To establish a connection, please visit the <a href='https://mycloud.ultimaker.com/'>Ultimaker Digital Factory</a>."
|
msgid "<ul>{}</ul>To establish a connection, please visit the <a href='https://mycloud.ultimaker.com/'>Ultimaker Digital Factory</a>."
|
||||||
msgstr ""
|
msgstr "<ul>{}</ul> Chcete-li navázat spojení, navštivte <a href='https://mycloud.ultimaker.com/'>Ultimaker Digital Factory</a>."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:344
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:344
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Keep printer configurations"
|
msgid "Keep printer configurations"
|
||||||
msgstr ""
|
msgstr "Zachovat konfiguraci tiskárny"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:349
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:349
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Remove printers"
|
msgid "Remove printers"
|
||||||
msgstr ""
|
msgstr "Odstranit tiskárnu"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:428
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:428
|
||||||
msgctxt "@label ({} is printer name)"
|
msgctxt "@label ({} is printer name)"
|
||||||
msgid "{} will be removed until the next account sync. <br> To remove {} permanently, visit <a href='https://mycloud.ultimaker.com/'>Ultimaker Digital Factory</a>. <br><br>Are you sure you want to remove {} temporarily?"
|
msgid "{} will be removed until the next account sync. <br> To remove {} permanently, visit <a href='https://mycloud.ultimaker.com/'>Ultimaker Digital Factory</a>. <br><br>Are you sure you want to remove {} temporarily?"
|
||||||
msgstr ""
|
msgstr "{} bude odebrána až do další synchronizace účtu. <br> Chcete-li {} trvale odebrat, navštivte <a href='https://mycloud.ultimaker.com/'>Ultimaker Digital Factory</a>. <br><br>Opravdu chcete dočasně odebrat {}?"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:468
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:468
|
||||||
msgctxt "@title:window"
|
msgctxt "@title:window"
|
||||||
msgid "Remove printers?"
|
msgid "Remove printers?"
|
||||||
msgstr ""
|
msgstr "Odstranit tiskárny?"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:469
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:469
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
@ -1394,6 +1394,8 @@ msgid ""
|
|||||||
"You are about to remove {} printer(s) from Cura. This action cannot be undone. \n"
|
"You are about to remove {} printer(s) from Cura. This action cannot be undone. \n"
|
||||||
"Are you sure you want to continue?"
|
"Are you sure you want to continue?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Chystáte se odebrat {} tiskárny z Cury. Tuto akci nelze vrátit zpět.\n"
|
||||||
|
"Jste si jistý, že chcete pokračovat?"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:471
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:471
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
@ -1401,6 +1403,8 @@ msgid ""
|
|||||||
"You are about to remove all printers from Cura. This action cannot be undone. \n"
|
"You are about to remove all printers from Cura. This action cannot be undone. \n"
|
||||||
"Are you sure you want to continue?"
|
"Are you sure you want to continue?"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Chystáte se odebrat všechny tiskárny z Cury. Tuto akci nelze vrátit zpět.\n"
|
||||||
|
"Doopravdy chcete pokračovat?"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:27
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:27
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
@ -1410,7 +1414,7 @@ msgstr "Odesílejte a sledujte tiskové úlohy odkudkoli pomocí účtu Ultimake
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:33
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:33
|
||||||
msgctxt "@info:status Ultimaker Cloud should not be translated."
|
msgctxt "@info:status Ultimaker Cloud should not be translated."
|
||||||
msgid "Connect to Ultimaker Digital Factory"
|
msgid "Connect to Ultimaker Digital Factory"
|
||||||
msgstr ""
|
msgstr "Připojit se k Ultimaker Digital Factory"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:36
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:36
|
||||||
msgctxt "@action"
|
msgctxt "@action"
|
||||||
@ -2460,7 +2464,7 @@ msgstr "Aktualizování"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/components/ToolboxDownloadsShowcase.qml:27
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/components/ToolboxDownloadsShowcase.qml:27
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Premium"
|
msgid "Premium"
|
||||||
msgstr ""
|
msgstr "Premium"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/components/ToolboxDownloadsShowcase.qml:39
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/components/ToolboxDownloadsShowcase.qml:39
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/components/ToolboxHeader.qml:86
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/components/ToolboxHeader.qml:86
|
||||||
@ -2636,32 +2640,32 @@ msgstr "Nelze se připojit k databázi balíčku Cura. Zkontrolujte připojení.
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:33
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:33
|
||||||
msgctxt "@title:tab"
|
msgctxt "@title:tab"
|
||||||
msgid "Installed plugins"
|
msgid "Installed plugins"
|
||||||
msgstr ""
|
msgstr "Nainstalovaná rozšíření"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:72
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:72
|
||||||
msgctxt "@info"
|
msgctxt "@info"
|
||||||
msgid "No plugin has been installed."
|
msgid "No plugin has been installed."
|
||||||
msgstr ""
|
msgstr "Žádné rozšíření nebylo nainstalováno."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:86
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:86
|
||||||
msgctxt "@title:tab"
|
msgctxt "@title:tab"
|
||||||
msgid "Installed materials"
|
msgid "Installed materials"
|
||||||
msgstr ""
|
msgstr "Nainstalované materiály"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:125
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:125
|
||||||
msgctxt "@info"
|
msgctxt "@info"
|
||||||
msgid "No material has been installed."
|
msgid "No material has been installed."
|
||||||
msgstr ""
|
msgstr "Žádný materiál nebyl nainstalován."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:139
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:139
|
||||||
msgctxt "@title:tab"
|
msgctxt "@title:tab"
|
||||||
msgid "Bundled plugins"
|
msgid "Bundled plugins"
|
||||||
msgstr ""
|
msgstr "Zabalená rozšíření"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:184
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:184
|
||||||
msgctxt "@title:tab"
|
msgctxt "@title:tab"
|
||||||
msgid "Bundled materials"
|
msgid "Bundled materials"
|
||||||
msgstr ""
|
msgstr "Zabalené materiály"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxLoadingPage.qml:16
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxLoadingPage.qml:16
|
||||||
msgctxt "@info"
|
msgctxt "@info"
|
||||||
@ -2671,7 +2675,7 @@ msgstr "Načítám balíčky..."
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/WelcomePage.qml:22
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/WelcomePage.qml:22
|
||||||
msgctxt "@description"
|
msgctxt "@description"
|
||||||
msgid "Please sign in to get verified plugins and materials for Ultimaker Cura Enterprise"
|
msgid "Please sign in to get verified plugins and materials for Ultimaker Cura Enterprise"
|
||||||
msgstr ""
|
msgstr "Přihlaste se, abyste získali ověřené pluginy a materiály pro Ultimaker Cura Enterprise"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:19
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:19
|
||||||
msgctxt "@title"
|
msgctxt "@title"
|
||||||
@ -3135,47 +3139,47 @@ msgstr "Vytvořit účet"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:28
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:28
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Checking..."
|
msgid "Checking..."
|
||||||
msgstr ""
|
msgstr "Kontroluji..."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:35
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:35
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Account synced"
|
msgid "Account synced"
|
||||||
msgstr ""
|
msgstr "Účet byl synchronizován"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:42
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:42
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Something went wrong..."
|
msgid "Something went wrong..."
|
||||||
msgstr ""
|
msgstr "Nastala chyba..."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:96
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:96
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
msgid "Install pending updates"
|
msgid "Install pending updates"
|
||||||
msgstr ""
|
msgstr "Nainstalujte čekající aktualizace"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:118
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:118
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
msgid "Check for account updates"
|
msgid "Check for account updates"
|
||||||
msgstr ""
|
msgstr "Zkontrolovat aktualizace pro účet"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/UserOperations.qml:81
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/UserOperations.qml:81
|
||||||
msgctxt "@label The argument is a timestamp"
|
msgctxt "@label The argument is a timestamp"
|
||||||
msgid "Last update: %1"
|
msgid "Last update: %1"
|
||||||
msgstr ""
|
msgstr "Poslední aktualizace: %1"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/UserOperations.qml:99
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/UserOperations.qml:99
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
msgid "Ultimaker Digital Factory"
|
msgid "Ultimaker Digital Factory"
|
||||||
msgstr ""
|
msgstr "Ultimaker Digital Factory"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/UserOperations.qml:109
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/UserOperations.qml:109
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
msgid "Ultimaker Account"
|
msgid "Ultimaker Account"
|
||||||
msgstr ""
|
msgstr "Ultimaker Account"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/UserOperations.qml:125
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/UserOperations.qml:125
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
msgid "Sign Out"
|
msgid "Sign Out"
|
||||||
msgstr ""
|
msgstr "Odhlásit se"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:59
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:59
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
@ -3674,18 +3678,18 @@ msgstr "Knihovna pro výstřižky z mnohoúhelníků"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:155
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:155
|
||||||
msgctxt "@Label"
|
msgctxt "@Label"
|
||||||
msgid "Static type checker for Python"
|
msgid "Static type checker for Python"
|
||||||
msgstr ""
|
msgstr "Kontrola statických typů pro Python"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:156
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:156
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:157
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:157
|
||||||
msgctxt "@Label"
|
msgctxt "@Label"
|
||||||
msgid "Root Certificates for validating SSL trustworthiness"
|
msgid "Root Certificates for validating SSL trustworthiness"
|
||||||
msgstr ""
|
msgstr "Základní certifikáty pro validaci důvěryhodnosti SSL"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:158
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:158
|
||||||
msgctxt "@Label"
|
msgctxt "@Label"
|
||||||
msgid "Python Error tracking library"
|
msgid "Python Error tracking library"
|
||||||
msgstr ""
|
msgstr "Chyba v Python trackovací knihovně"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:160
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:160
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
@ -3739,6 +3743,9 @@ msgid ""
|
|||||||
"Would you like to Keep these changed settings after switching profiles?\n"
|
"Would you like to Keep these changed settings after switching profiles?\n"
|
||||||
"Alternatively, you can Discard the changes to load the defaults from '%1'."
|
"Alternatively, you can Discard the changes to load the defaults from '%1'."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Upravili jste některá nastavení profilu.\n"
|
||||||
|
"Chcete tato změněná nastavení zachovat i po přepnutí profilů?\n"
|
||||||
|
"Alternativně můžete zahodit změny a načíst výchozí hodnoty z '%1'."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:111
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:111
|
||||||
msgctxt "@title:column"
|
msgctxt "@title:column"
|
||||||
@ -3748,7 +3755,7 @@ msgstr "Nastavení profilu"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:125
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:125
|
||||||
msgctxt "@title:column"
|
msgctxt "@title:column"
|
||||||
msgid "Current changes"
|
msgid "Current changes"
|
||||||
msgstr ""
|
msgstr "Aktuální změny"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:158
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:158
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:747
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:747
|
||||||
@ -3769,12 +3776,12 @@ msgstr "Nechat a už se nikdy neptat"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:197
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:197
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Discard changes"
|
msgid "Discard changes"
|
||||||
msgstr ""
|
msgstr "Smazat změny"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:210
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:210
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Keep changes"
|
msgid "Keep changes"
|
||||||
msgstr ""
|
msgstr "Zanechat změny"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:64
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:64
|
||||||
msgctxt "@text:window"
|
msgctxt "@text:window"
|
||||||
@ -3966,7 +3973,7 @@ msgstr "Počet kopií"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Menus/FileMenu.qml:33
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Menus/FileMenu.qml:33
|
||||||
msgctxt "@title:menu menubar:file"
|
msgctxt "@title:menu menubar:file"
|
||||||
msgid "&Save Project..."
|
msgid "&Save Project..."
|
||||||
msgstr ""
|
msgstr "&Uložit projekt..."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Menus/FileMenu.qml:54
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Menus/FileMenu.qml:54
|
||||||
msgctxt "@title:menu menubar:file"
|
msgctxt "@title:menu menubar:file"
|
||||||
@ -4126,30 +4133,30 @@ msgstr "Jste si jist, že chcete zrušit tisknutí?"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:102
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:102
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Is printed as support."
|
msgid "Is printed as support."
|
||||||
msgstr ""
|
msgstr "Je tisknuto jako podpora."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:105
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:105
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Other models overlapping with this model are modified."
|
msgid "Other models overlapping with this model are modified."
|
||||||
msgstr ""
|
msgstr "Ostatní modely překrývající se s tímto modelem jsou upraveny."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:108
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:108
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Infill overlapping with this model is modified."
|
msgid "Infill overlapping with this model is modified."
|
||||||
msgstr ""
|
msgstr "Výplň překrývající se s tímto modelem byla modifikována."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:111
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:111
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Overlaps with this model are not supported."
|
msgid "Overlaps with this model are not supported."
|
||||||
msgstr ""
|
msgstr "Přesahy na tomto modelu nejsou podporovány."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:118
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:118
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Overrides %1 setting."
|
msgid "Overrides %1 setting."
|
||||||
msgid_plural "Overrides %1 settings."
|
msgid_plural "Overrides %1 settings."
|
||||||
msgstr[0] ""
|
msgstr[0] "Přepsat %1 nastavení."
|
||||||
msgstr[1] ""
|
msgstr[1] "Přepsat %1 nastavení."
|
||||||
msgstr[2] ""
|
msgstr[2] "Přepsat %1 nastavení."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectSelector.qml:59
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectSelector.qml:59
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
@ -4204,12 +4211,12 @@ msgstr "Zobrazit převis"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:351
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:351
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
msgid "Highlight missing or extraneous surfaces of the model using warning signs. The toolpaths will often be missing parts of the intended geometry."
|
msgid "Highlight missing or extraneous surfaces of the model using warning signs. The toolpaths will often be missing parts of the intended geometry."
|
||||||
msgstr ""
|
msgstr "Zvýraznit chybějící nebo vedlejší povrchy modelu pomocí varovných značek. Dráhám nástrojů budou často chybět části zamýšlené geometrie."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:360
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:360
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Display model errors"
|
msgid "Display model errors"
|
||||||
msgstr ""
|
msgstr "Zobrazovat chyby modelu"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:368
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:368
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
@ -4322,12 +4329,12 @@ msgstr "Otevírám a ukládám soubory"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:570
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:570
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
msgid "Should opening files from the desktop or external applications open in the same instance of Cura?"
|
msgid "Should opening files from the desktop or external applications open in the same instance of Cura?"
|
||||||
msgstr ""
|
msgstr "Měli by se soubory z plochy, nebo externích aplikací otevírat ve stejné instanci Cury?"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:575
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:575
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Use a single instance of Cura"
|
msgid "Use a single instance of Cura"
|
||||||
msgstr ""
|
msgstr "Používat pouze jednu instanci programu Cura"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:585
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:585
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
@ -4861,22 +4868,22 @@ msgstr "Tiskárna není připojena."
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:47
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:47
|
||||||
msgctxt "@status"
|
msgctxt "@status"
|
||||||
msgid "The cloud printer is offline. Please check if the printer is turned on and connected to the internet."
|
msgid "The cloud printer is offline. Please check if the printer is turned on and connected to the internet."
|
||||||
msgstr ""
|
msgstr "Cloudová tiskárna je offline. Prosím zkontrolujte, zda je tiskárna zapnutá a připojená k internetu."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:51
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:51
|
||||||
msgctxt "@status"
|
msgctxt "@status"
|
||||||
msgid "This printer is not linked to your account. Please visit the Ultimaker Digital Factory to establish a connection."
|
msgid "This printer is not linked to your account. Please visit the Ultimaker Digital Factory to establish a connection."
|
||||||
msgstr ""
|
msgstr "Tiskárna není připojena k vašemu účtu. Prosím navštivte Ultimaker Digital Factory pro navázání spojení."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:56
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:56
|
||||||
msgctxt "@status"
|
msgctxt "@status"
|
||||||
msgid "The cloud connection is currently unavailable. Please sign in to connect to the cloud printer."
|
msgid "The cloud connection is currently unavailable. Please sign in to connect to the cloud printer."
|
||||||
msgstr ""
|
msgstr "Připojení ke cloudu není nyní dostupné. Prosím přihlašte se k připojení ke cloudové tiskárně."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:60
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:60
|
||||||
msgctxt "@status"
|
msgctxt "@status"
|
||||||
msgid "The cloud connection is currently unavailable. Please check your internet connection."
|
msgid "The cloud connection is currently unavailable. Please check your internet connection."
|
||||||
msgstr ""
|
msgstr "Připojení ke cloudu není nyní dostupné. Prosím zkontrolujte si vaše internetové připojení."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:238
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:238
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
@ -5133,27 +5140,27 @@ msgstr "Typ pohledu"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:47
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:47
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Add a Cloud printer"
|
msgid "Add a Cloud printer"
|
||||||
msgstr ""
|
msgstr "Přidat Cloudovou tiskárnu"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:73
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:73
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Waiting for Cloud response"
|
msgid "Waiting for Cloud response"
|
||||||
msgstr ""
|
msgstr "Čekám na odpověď od Cloudu"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:84
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:84
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "No printers found in your account?"
|
msgid "No printers found in your account?"
|
||||||
msgstr ""
|
msgstr "Žádné tiskárny nenalezeny ve vašem účtě?"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:118
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:118
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "The following printers in your account have been added in Cura:"
|
msgid "The following printers in your account have been added in Cura:"
|
||||||
msgstr ""
|
msgstr "Následující tiskárny ve vašem účtě byla přidány do Cury:"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:200
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:200
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
msgid "Add printer manually"
|
msgid "Add printer manually"
|
||||||
msgstr ""
|
msgstr "Přidat tiskárnu manuálně"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:214
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:214
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
@ -5163,12 +5170,12 @@ msgstr "Dokončit"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:231
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:231
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Manufacturer"
|
msgid "Manufacturer"
|
||||||
msgstr ""
|
msgstr "Výrobce"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:245
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:245
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Profile author"
|
msgid "Profile author"
|
||||||
msgstr ""
|
msgstr "Autor profilu"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:260
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:260
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
@ -5213,7 +5220,7 @@ msgstr "Přidat tiskárnu podle IP"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:203
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:203
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Add cloud printer"
|
msgid "Add cloud printer"
|
||||||
msgstr ""
|
msgstr "Přidat cloudovou tiskárnu"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:239
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:239
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
@ -5228,7 +5235,7 @@ msgstr "Přidat tiskárnu podle IP adresy"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:133
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:133
|
||||||
msgctxt "@text"
|
msgctxt "@text"
|
||||||
msgid "Enter your printer's IP address."
|
msgid "Enter your printer's IP address."
|
||||||
msgstr ""
|
msgstr "Zadejte IP adresu vaší tiskárny."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:158
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:158
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
@ -5294,7 +5301,7 @@ msgstr "- Zvyšte efektivitu pomocí vzdáleného pracovního postupu na tiskár
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:157
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:157
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr ""
|
msgstr "Přeskočit"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:24
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:24
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
@ -5898,22 +5905,22 @@ msgstr "Aktualizace verze 4.5 na 4.6"
|
|||||||
#: VersionUpgrade/VersionUpgrade460to462/plugin.json
|
#: VersionUpgrade/VersionUpgrade460to462/plugin.json
|
||||||
msgctxt "description"
|
msgctxt "description"
|
||||||
msgid "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2."
|
msgid "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2."
|
||||||
msgstr ""
|
msgstr "Aktualizuje konfigurace z Cura 4.6.0 na Cura 4.6.2."
|
||||||
|
|
||||||
#: VersionUpgrade/VersionUpgrade460to462/plugin.json
|
#: VersionUpgrade/VersionUpgrade460to462/plugin.json
|
||||||
msgctxt "name"
|
msgctxt "name"
|
||||||
msgid "Version Upgrade 4.6.0 to 4.6.2"
|
msgid "Version Upgrade 4.6.0 to 4.6.2"
|
||||||
msgstr ""
|
msgstr "Aktualizace verze 4.6.0 na 4.6.2"
|
||||||
|
|
||||||
#: VersionUpgrade/VersionUpgrade462to47/plugin.json
|
#: VersionUpgrade/VersionUpgrade462to47/plugin.json
|
||||||
msgctxt "description"
|
msgctxt "description"
|
||||||
msgid "Upgrades configurations from Cura 4.6.2 to Cura 4.7."
|
msgid "Upgrades configurations from Cura 4.6.2 to Cura 4.7."
|
||||||
msgstr ""
|
msgstr "Aktualizuje konfigurace z Cura 4.6.2 na Cura 4.7."
|
||||||
|
|
||||||
#: VersionUpgrade/VersionUpgrade462to47/plugin.json
|
#: VersionUpgrade/VersionUpgrade462to47/plugin.json
|
||||||
msgctxt "name"
|
msgctxt "name"
|
||||||
msgid "Version Upgrade 4.6.2 to 4.7"
|
msgid "Version Upgrade 4.6.2 to 4.7"
|
||||||
msgstr ""
|
msgstr "Aktualizace verze 4.6.2 na 4.7"
|
||||||
|
|
||||||
#: X3DReader/plugin.json
|
#: X3DReader/plugin.json
|
||||||
msgctxt "description"
|
msgctxt "description"
|
||||||
|
@ -8,7 +8,7 @@ msgstr ""
|
|||||||
"Project-Id-Version: Cura 4.7\n"
|
"Project-Id-Version: Cura 4.7\n"
|
||||||
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
|
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
|
||||||
"POT-Creation-Date: 2020-07-31 14:10+0000\n"
|
"POT-Creation-Date: 2020-07-31 14:10+0000\n"
|
||||||
"PO-Revision-Date: 2020-04-07 11:21+0200\n"
|
"PO-Revision-Date: 2020-08-04 12:40+0200\n"
|
||||||
"Last-Translator: DenyCZ <www.github.com/DenyCZ>\n"
|
"Last-Translator: DenyCZ <www.github.com/DenyCZ>\n"
|
||||||
"Language-Team: DenyCZ <www.github.com/DenyCZ>\n"
|
"Language-Team: DenyCZ <www.github.com/DenyCZ>\n"
|
||||||
"Language: cs_CZ\n"
|
"Language: cs_CZ\n"
|
||||||
@ -226,12 +226,12 @@ msgstr "Zda je zařízení schopno stabilizovat teplotu podložky."
|
|||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "machine_always_write_active_tool label"
|
msgctxt "machine_always_write_active_tool label"
|
||||||
msgid "Always Write Active Tool"
|
msgid "Always Write Active Tool"
|
||||||
msgstr ""
|
msgstr "Vždy Zapisovat Aktivní Nástroj"
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "machine_always_write_active_tool description"
|
msgctxt "machine_always_write_active_tool description"
|
||||||
msgid "Write active tool after sending temp commands to inactive tool. Required for Dual Extruder printing with Smoothie or other firmware with modal tool commands."
|
msgid "Write active tool after sending temp commands to inactive tool. Required for Dual Extruder printing with Smoothie or other firmware with modal tool commands."
|
||||||
msgstr ""
|
msgstr "Zapisování aktivního nástroje po odeslání dočasných příkazů neaktivnímu nástroji. Vyžadováno pro tisk s dvojitým extruderem se Smoothie, či jiným firmwarem s modálními příkazy nástrojů."
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "machine_center_is_zero label"
|
msgctxt "machine_center_is_zero label"
|
||||||
@ -3485,22 +3485,22 @@ msgstr "Vytlačovací stroj se používá pro tisk podlah podpěry. To se použ
|
|||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_structure label"
|
msgctxt "support_structure label"
|
||||||
msgid "Support Structure"
|
msgid "Support Structure"
|
||||||
msgstr ""
|
msgstr "Podpůrná struktura"
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_structure description"
|
msgctxt "support_structure description"
|
||||||
msgid "Chooses between the techniques available to generate support. \"Normal\" support creates a support structure directly below the overhanging parts and drops those areas straight down. \"Tree\" support creates branches towards the overhanging areas that support the model on the tips of those branches, and allows the branches to crawl around the model to support it from the build plate as much as possible."
|
msgid "Chooses between the techniques available to generate support. \"Normal\" support creates a support structure directly below the overhanging parts and drops those areas straight down. \"Tree\" support creates branches towards the overhanging areas that support the model on the tips of those branches, and allows the branches to crawl around the model to support it from the build plate as much as possible."
|
||||||
msgstr ""
|
msgstr "Volí mezi dostupnými technikami pro generování podpory. „Normální“ podpora vytváří podpůrnou strukturu přímo pod převislými částmi a upouští tyto oblasti přímo dolů. „Stromová“ podpora vytváří větve směrem k převislým oblastem, které podporují model na koncích těchto větví, a umožňuje větvím procházet se kolem modelu a podporovat je co nejvíce z konstrukční desky."
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_structure option normal"
|
msgctxt "support_structure option normal"
|
||||||
msgid "Normal"
|
msgid "Normal"
|
||||||
msgstr ""
|
msgstr "Normální"
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_structure option tree"
|
msgctxt "support_structure option tree"
|
||||||
msgid "Tree"
|
msgid "Tree"
|
||||||
msgstr ""
|
msgstr "Strom"
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_tree_angle label"
|
msgctxt "support_tree_angle label"
|
||||||
@ -3820,12 +3820,12 @@ msgstr "Maximální šířka schodů schodišťového dna podpory spočívá na
|
|||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_bottom_stair_step_min_slope label"
|
msgctxt "support_bottom_stair_step_min_slope label"
|
||||||
msgid "Support Stair Step Minimum Slope Angle"
|
msgid "Support Stair Step Minimum Slope Angle"
|
||||||
msgstr ""
|
msgstr "Podpora Schodu Minimální Úhel Sklonu"
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_bottom_stair_step_min_slope description"
|
msgctxt "support_bottom_stair_step_min_slope description"
|
||||||
msgid "The minimum slope of the area for stair-stepping to take effect. Low values should make support easier to remove on shallower slopes, but really low values may result in some very counter-intuitive results on other parts of the model."
|
msgid "The minimum slope of the area for stair-stepping to take effect. Low values should make support easier to remove on shallower slopes, but really low values may result in some very counter-intuitive results on other parts of the model."
|
||||||
msgstr ""
|
msgstr "Minimální sklon oblasti, aby se schodové schody projevily. Nízké hodnoty by měly usnadnit odstraňování podpory na mělkých svazích, ale opravdu nízké hodnoty mohou vést k velmi kontraintuitivním výsledkům na jiných částech modelu."
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_join_distance label"
|
msgctxt "support_join_distance label"
|
||||||
@ -4275,12 +4275,12 @@ msgstr "Podpořte všude pod podpůrnou sítí, aby v podpůrné síti nebyl př
|
|||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_meshes_present label"
|
msgctxt "support_meshes_present label"
|
||||||
msgid "Scene Has Support Meshes"
|
msgid "Scene Has Support Meshes"
|
||||||
msgstr ""
|
msgstr "Scéna Má Podpůrné Masky"
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_meshes_present description"
|
msgctxt "support_meshes_present description"
|
||||||
msgid "There are support meshes present in the scene. This setting is controlled by Cura."
|
msgid "There are support meshes present in the scene. This setting is controlled by Cura."
|
||||||
msgstr ""
|
msgstr "Ve scéně existují podpůrné masky. Toto nastavení je kontrolováno Curou."
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "platform_adhesion label"
|
msgctxt "platform_adhesion label"
|
||||||
@ -5044,7 +5044,7 @@ msgstr "Tisková sekvence"
|
|||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "print_sequence description"
|
msgctxt "print_sequence description"
|
||||||
msgid "Whether to print all models one layer at a time or to wait for one model to finish, before moving on to the next. One at a time mode is possible if a) only one extruder is enabled and b) all models are separated in such a way that the whole print head can move in between and all models are lower than the distance between the nozzle and the X/Y axes."
|
msgid "Whether to print all models one layer at a time or to wait for one model to finish, before moving on to the next. One at a time mode is possible if a) only one extruder is enabled and b) all models are separated in such a way that the whole print head can move in between and all models are lower than the distance between the nozzle and the X/Y axes."
|
||||||
msgstr ""
|
msgstr "Zda tisknout všechny modely po jedné vrstvě najednou, nebo počkat na dokončení jednoho modelu, než se přesunete k další. Jeden za časovým režimem je možný, pokud a) je povolen pouze jeden extrudér a b) všechny modely jsou odděleny tak, že celá tisková hlava se může pohybovat mezi a všechny modely jsou menší než vzdálenost mezi tryskou a X / Osy Y."
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "print_sequence option all_at_once"
|
msgctxt "print_sequence option all_at_once"
|
||||||
@ -5069,12 +5069,12 @@ msgstr "Pomocí této mřížky můžete upravit výplň dalších sítí, s nim
|
|||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "infill_mesh_order label"
|
msgctxt "infill_mesh_order label"
|
||||||
msgid "Mesh Processing Rank"
|
msgid "Mesh Processing Rank"
|
||||||
msgstr ""
|
msgstr "Úroveň Zpracování Masky"
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "infill_mesh_order description"
|
msgctxt "infill_mesh_order description"
|
||||||
msgid "Determines the priority of this mesh when considering overlapping volumes. Areas where multiple meshes reside will be won by the lower rank mesh. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes."
|
msgid "Determines the priority of this mesh when considering overlapping volumes. Areas where multiple meshes reside will be won by the lower rank mesh. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes."
|
||||||
msgstr ""
|
msgstr "Určuje prioritu této sítě při zvažování překrývajících se objemů. Oblasti, kde je umístěno více sítí, budou vyhrány sítí s nižším hodnocením. Výplňová síť s vyšším pořádkem upraví výplň síťových výplní s nižším řádem a běžnými oky."
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "cutting_mesh label"
|
msgctxt "cutting_mesh label"
|
||||||
@ -5219,7 +5219,7 @@ msgstr "Tolerance slicování"
|
|||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "slicing_tolerance description"
|
msgctxt "slicing_tolerance description"
|
||||||
msgid "Vertical tolerance in the sliced layers. The contours of a layer are normally generated by taking cross sections through the middle of each layer's thickness (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the entire thickness of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Inclusive retains the most details, Exclusive makes for the best fit and Middle stays closest to the original surface."
|
msgid "Vertical tolerance in the sliced layers. The contours of a layer are normally generated by taking cross sections through the middle of each layer's thickness (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the entire thickness of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Inclusive retains the most details, Exclusive makes for the best fit and Middle stays closest to the original surface."
|
||||||
msgstr ""
|
msgstr "Vertikální tolerance ve slicovaných vrstvách. Obrysy vrstvy jsou obvykle vytvářeny průřezy středem tloušťky každé vrstvy (uprostřed). Alternativně každá vrstva může mít oblasti, které spadají dovnitř objemu po celé tloušťce vrstvy (Exkluzivní), nebo vrstva má oblasti, které padají dovnitř kdekoli v rámci vrstvy (Inkluzivní). Inclusive si zachovává nejpodrobnější detaily, Exclusive dělá to nejlepší a Middle zůstává co nejblíže původnímu povrchu."
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "slicing_tolerance option middle"
|
msgctxt "slicing_tolerance option middle"
|
||||||
|
@ -7,7 +7,7 @@ msgstr ""
|
|||||||
"Project-Id-Version: Cura 4.7\n"
|
"Project-Id-Version: Cura 4.7\n"
|
||||||
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
|
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
|
||||||
"POT-Creation-Date: 2020-07-31 12:48+0200\n"
|
"POT-Creation-Date: 2020-07-31 12:48+0200\n"
|
||||||
"PO-Revision-Date: 2020-04-15 17:43+0200\n"
|
"PO-Revision-Date: 2020-08-21 13:40+0200\n"
|
||||||
"Last-Translator: Lionbridge <info@lionbridge.com>\n"
|
"Last-Translator: Lionbridge <info@lionbridge.com>\n"
|
||||||
"Language-Team: German <info@lionbridge.com>, German <info@bothof.nl>\n"
|
"Language-Team: German <info@lionbridge.com>, German <info@bothof.nl>\n"
|
||||||
"Language: de_DE\n"
|
"Language: de_DE\n"
|
||||||
@ -45,7 +45,7 @@ msgstr "Nicht überschrieben"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/Machines/Models/GlobalStacksModel.py:76
|
#: /home/trin/Gedeeld/Projects/Cura/cura/Machines/Models/GlobalStacksModel.py:76
|
||||||
msgctxt "@label ({} is object name)"
|
msgctxt "@label ({} is object name)"
|
||||||
msgid "Are you sure you wish to remove {}? This cannot be undone!"
|
msgid "Are you sure you wish to remove {}? This cannot be undone!"
|
||||||
msgstr ""
|
msgstr "Möchten Sie {} wirklich entfernen? Der Vorgang kann nicht rückgängig gemacht werden!"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/Machines/Models/IntentCategoryModel.py:42
|
#: /home/trin/Gedeeld/Projects/Cura/cura/Machines/Models/IntentCategoryModel.py:42
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/Machines/Models/IntentTranslations.py:11
|
#: /home/trin/Gedeeld/Projects/Cura/cura/Machines/Models/IntentTranslations.py:11
|
||||||
@ -437,7 +437,7 @@ msgstr "Bei dem Versuch, sich anzumelden, trat ein unerwarteter Fehler auf. Bitt
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/OAuth2/AuthorizationService.py:187
|
#: /home/trin/Gedeeld/Projects/Cura/cura/OAuth2/AuthorizationService.py:187
|
||||||
msgctxt "@info"
|
msgctxt "@info"
|
||||||
msgid "Unable to start a new sign in process. Check if another sign in attempt is still active."
|
msgid "Unable to start a new sign in process. Check if another sign in attempt is still active."
|
||||||
msgstr ""
|
msgstr "Es kann kein neuer Anmeldevorgang gestartet werden. Bitte überprüfen Sie, ob noch ein weiterer Anmeldevorgang aktiv ist."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/OAuth2/AuthorizationService.py:242
|
#: /home/trin/Gedeeld/Projects/Cura/cura/OAuth2/AuthorizationService.py:242
|
||||||
msgctxt "@info"
|
msgctxt "@info"
|
||||||
@ -560,7 +560,7 @@ msgstr "Es konnte keine Qualitätsangabe {0} für die vorliegende Konfiguration
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/Settings/CuraContainerRegistry.py:443
|
#: /home/trin/Gedeeld/Projects/Cura/cura/Settings/CuraContainerRegistry.py:443
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Unable to add the profile."
|
msgid "Unable to add the profile."
|
||||||
msgstr ""
|
msgstr "Das Profil kann nicht hinzugefügt werden."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/Settings/cura_empty_instance_containers.py:36
|
#: /home/trin/Gedeeld/Projects/Cura/cura/Settings/cura_empty_instance_containers.py:36
|
||||||
msgctxt "@info:not supported profile"
|
msgctxt "@info:not supported profile"
|
||||||
@ -604,7 +604,7 @@ msgstr "Hinzufügen"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/UI/WelcomePagesModel.py:263
|
#: /home/trin/Gedeeld/Projects/Cura/cura/UI/WelcomePagesModel.py:263
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Finish"
|
msgid "Finish"
|
||||||
msgstr ""
|
msgstr "Beenden"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/cura/UI/AddPrinterPagesModel.py:33
|
#: /home/trin/Gedeeld/Projects/Cura/cura/UI/AddPrinterPagesModel.py:33
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:406
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/WorkspaceDialog.qml:406
|
||||||
@ -719,7 +719,7 @@ msgstr ""
|
|||||||
"<p>Ein oder mehrere 3D-Modelle können möglicherweise aufgrund der Modellgröße und Materialkonfiguration nicht optimal gedruckt werden:</p>\n"
|
"<p>Ein oder mehrere 3D-Modelle können möglicherweise aufgrund der Modellgröße und Materialkonfiguration nicht optimal gedruckt werden:</p>\n"
|
||||||
"<p>{model_names}</p>\n"
|
"<p>{model_names}</p>\n"
|
||||||
"<p>Erfahren Sie, wie Sie die bestmögliche Druckqualität und Zuverlässigkeit sicherstellen.</p>\n"
|
"<p>Erfahren Sie, wie Sie die bestmögliche Druckqualität und Zuverlässigkeit sicherstellen.</p>\n"
|
||||||
"<p><a href=“https://ultimaker.com/3D-model-assistant“>Leitfaden zu Druckqualität anzeigen</a></p>"
|
"<p><a href=\"https://ultimaker.com/3D-model-assistant\">Leitfaden zu Druckqualität anzeigen</a></p>"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:521
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:521
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
@ -736,18 +736,18 @@ msgstr "Projektdatei öffnen"
|
|||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@info:error Don't translate the XML tags <filename> or <message>!"
|
msgctxt "@info:error Don't translate the XML tags <filename> or <message>!"
|
||||||
msgid "Project file <filename>{0}</filename> is suddenly inaccessible: <message>{1}</message>."
|
msgid "Project file <filename>{0}</filename> is suddenly inaccessible: <message>{1}</message>."
|
||||||
msgstr ""
|
msgstr "Auf Projektdatei <filename>{0}</filename> kann plötzlich nicht mehr zugegriffen werden: <message>{1}</message>."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:623
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:623
|
||||||
msgctxt "@info:title"
|
msgctxt "@info:title"
|
||||||
msgid "Can't Open Project File"
|
msgid "Can't Open Project File"
|
||||||
msgstr ""
|
msgstr "Projektdatei kann nicht geöffnet werden"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:668
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/ThreeMFWorkspaceReader.py:668
|
||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@info:error Don't translate the XML tag <filename>!"
|
msgctxt "@info:error Don't translate the XML tag <filename>!"
|
||||||
msgid "Project file <filename>{0}</filename> is made using profiles that are unknown to this version of Ultimaker Cura."
|
msgid "Project file <filename>{0}</filename> is made using profiles that are unknown to this version of Ultimaker Cura."
|
||||||
msgstr ""
|
msgstr "Projektdatei <filename>{0}</filename> verwendet Profile, die nicht mit dieser Ultimaker Cura-Version kompatibel sind."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:186
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/3MFReader/WorkspaceDialog.py:186
|
||||||
msgctxt "@title:tab"
|
msgctxt "@title:tab"
|
||||||
@ -919,7 +919,8 @@ msgstr "Zugriff auf Update-Informationen nicht möglich."
|
|||||||
#, python-brace-format
|
#, python-brace-format
|
||||||
msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!"
|
msgctxt "@info Don't translate {machine_name}, since it gets replaced by a printer name!"
|
||||||
msgid "New features or bug-fixes may be available for your {machine_name}! If not already at the latest version, it is recommended to update the firmware on your printer to version {latest_version}."
|
msgid "New features or bug-fixes may be available for your {machine_name}! If not already at the latest version, it is recommended to update the firmware on your printer to version {latest_version}."
|
||||||
msgstr ""
|
msgstr "Für Ihren {machine_name} sind eventuell neue Funktionen oder Fehlerbereinigungen verfügbar! Falls Sie nicht bereits die aktuellste Version verwenden, empfehlen"
|
||||||
|
" wir Ihnen, ein Firmware-Update Ihres Druckers auf Version {latest_version} auszuführen."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py:22
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerMessage.py:22
|
||||||
#, python-format
|
#, python-format
|
||||||
@ -1183,12 +1184,12 @@ msgstr "Schichtenansicht"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/SolidView/SolidView.py:70
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/SolidView/SolidView.py:70
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Your model is not manifold. The highlighted areas indicate either missing or extraneous surfaces."
|
msgid "Your model is not manifold. The highlighted areas indicate either missing or extraneous surfaces."
|
||||||
msgstr ""
|
msgstr "Ihrem Modell fehlen Schichten. Die fehlenden oder fehlerhaften Bereiche sind hervorgehoben."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/SolidView/SolidView.py:72
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/SolidView/SolidView.py:72
|
||||||
msgctxt "@info:title"
|
msgctxt "@info:title"
|
||||||
msgid "Model errors"
|
msgid "Model errors"
|
||||||
msgstr ""
|
msgstr "Modellfehler"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/SolidView/__init__.py:12
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/SolidView/__init__.py:12
|
||||||
msgctxt "@item:inmenu"
|
msgctxt "@item:inmenu"
|
||||||
@ -1296,7 +1297,7 @@ msgstr "Ultimaker Format Package"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UFPWriter/UFPWriter.py:146
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UFPWriter/UFPWriter.py:146
|
||||||
msgctxt "@info:error"
|
msgctxt "@info:error"
|
||||||
msgid "Can't write to UFP file:"
|
msgid "Can't write to UFP file:"
|
||||||
msgstr ""
|
msgstr "Kann nicht in UFP-Datei schreiben:"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:24
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UltimakerMachineActions/BedLevelMachineAction.py:24
|
||||||
msgctxt "@action"
|
msgctxt "@action"
|
||||||
@ -1311,92 +1312,93 @@ msgstr "Upgrades wählen"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:148
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:148
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Print via cloud"
|
msgid "Print via cloud"
|
||||||
msgstr ""
|
msgstr "Über Cloud drucken"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:149
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:149
|
||||||
msgctxt "@properties:tooltip"
|
msgctxt "@properties:tooltip"
|
||||||
msgid "Print via cloud"
|
msgid "Print via cloud"
|
||||||
msgstr ""
|
msgstr "Über Cloud drucken"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:150
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDevice.py:150
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
msgid "Connected via cloud"
|
msgid "Connected via cloud"
|
||||||
msgstr ""
|
msgstr "Über Cloud verbunden"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:226
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:226
|
||||||
msgctxt "info:status"
|
msgctxt "info:status"
|
||||||
msgid "New printer detected from your Ultimaker account"
|
msgid "New printer detected from your Ultimaker account"
|
||||||
msgid_plural "New printers detected from your Ultimaker account"
|
msgid_plural "New printers detected from your Ultimaker account"
|
||||||
msgstr[0] ""
|
msgstr[0] "Ihr Ultimaker-Konto hat einen neuen Drucker erkannt."
|
||||||
msgstr[1] ""
|
msgstr[1] "Ihr Ultimaker-Konto hat neue Drucker erkannt."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:238
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:238
|
||||||
msgctxt "info:status"
|
msgctxt "info:status"
|
||||||
msgid "Adding printer {} ({}) from your account"
|
msgid "Adding printer {} ({}) from your account"
|
||||||
msgstr ""
|
msgstr "Drucker {} ({}) aus Ihrem Konto wird hinzugefügt"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:258
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:258
|
||||||
msgctxt "info:hidden list items"
|
msgctxt "info:hidden list items"
|
||||||
msgid "<li>... and {} others</li>"
|
msgid "<li>... and {} others</li>"
|
||||||
msgstr ""
|
msgstr "<li>... und {} weitere</li>"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:265
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:265
|
||||||
msgctxt "info:status"
|
msgctxt "info:status"
|
||||||
msgid "Printers added from Digital Factory:<ul>{}</ul>"
|
msgid "Printers added from Digital Factory:<ul>{}</ul>"
|
||||||
msgstr ""
|
msgstr "Drucker aus Digital Factory hinzugefügt<ul>:{}</ul>"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:324
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:324
|
||||||
msgctxt "info:status"
|
msgctxt "info:status"
|
||||||
msgid "A cloud connection is not available for a printer"
|
msgid "A cloud connection is not available for a printer"
|
||||||
msgid_plural "A cloud connection is not available for some printers"
|
msgid_plural "A cloud connection is not available for some printers"
|
||||||
msgstr[0] ""
|
msgstr[0] "Für einen Drucker ist keine Cloud-Verbindung verfügbar"
|
||||||
msgstr[1] ""
|
msgstr[1] "Für mehrere Drucker ist keine Cloud-Verbindung verfügbar"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:332
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:332
|
||||||
msgctxt "info:status"
|
msgctxt "info:status"
|
||||||
msgid "This printer is not linked to the Digital Factory:"
|
msgid "This printer is not linked to the Digital Factory:"
|
||||||
msgid_plural "These printers are not linked to the Digital Factory:"
|
msgid_plural "These printers are not linked to the Digital Factory:"
|
||||||
msgstr[0] ""
|
msgstr[0] "Dieser Drucker ist nicht mit der Digital Factory verbunden:"
|
||||||
msgstr[1] ""
|
msgstr[1] "Diese Drucker sind nicht mit der Digital Factory verbunden:"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:338
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:338
|
||||||
msgctxt "info:status"
|
msgctxt "info:status"
|
||||||
msgid "<ul>{}</ul>To establish a connection, please visit the <a href='https://mycloud.ultimaker.com/'>Ultimaker Digital Factory</a>."
|
msgid "<ul>{}</ul>To establish a connection, please visit the <a href='https://mycloud.ultimaker.com/'>Ultimaker Digital Factory</a>."
|
||||||
msgstr ""
|
msgstr "<ul>{}</ul>Bitte besuchen Sie die <a href='https://mycloud.ultimaker.com/'>Ultimaker Digital Factory</a>, um eine Verbindung herzustellen."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:344
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:344
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Keep printer configurations"
|
msgid "Keep printer configurations"
|
||||||
msgstr ""
|
msgstr "Druckerkonfigurationen speichern"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:349
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:349
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Remove printers"
|
msgid "Remove printers"
|
||||||
msgstr ""
|
msgstr "Drucker entfernen"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:428
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:428
|
||||||
msgctxt "@label ({} is printer name)"
|
msgctxt "@label ({} is printer name)"
|
||||||
msgid "{} will be removed until the next account sync. <br> To remove {} permanently, visit <a href='https://mycloud.ultimaker.com/'>Ultimaker Digital Factory</a>. <br><br>Are you sure you want to remove {} temporarily?"
|
msgid "{} will be removed until the next account sync. <br> To remove {} permanently, visit <a href='https://mycloud.ultimaker.com/'>Ultimaker Digital Factory</a>. <br><br>Are you sure you want to remove {} temporarily?"
|
||||||
msgstr ""
|
msgstr "{} wird bis zur nächsten Synchronisierung des Kontos entfernt. <br> Wenn Sie {} dauerhaft entfernen möchten, dann besuchen Sie bitte die <a href='https://mycloud.ultimaker.com/'>Ultimaker"
|
||||||
|
" Digital Factory</a>. <br><br>Möchten Sie {} wirklich vorübergehend entfernen?"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:468
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:468
|
||||||
msgctxt "@title:window"
|
msgctxt "@title:window"
|
||||||
msgid "Remove printers?"
|
msgid "Remove printers?"
|
||||||
msgstr ""
|
msgstr "Drucker entfernen?"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:469
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:469
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid ""
|
msgid ""
|
||||||
"You are about to remove {} printer(s) from Cura. This action cannot be undone. \n"
|
"You are about to remove {} printer(s) from Cura. This action cannot be undone. \n"
|
||||||
"Are you sure you want to continue?"
|
"Are you sure you want to continue?"
|
||||||
msgstr ""
|
msgstr "Es werden gleich {} Drucker aus Cura entfernt. Der Vorgang kann nicht rückgängig gemacht werden. \nMöchten Sie wirklich fortfahren?"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:471
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Cloud/CloudOutputDeviceManager.py:471
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid ""
|
msgid ""
|
||||||
"You are about to remove all printers from Cura. This action cannot be undone. \n"
|
"You are about to remove all printers from Cura. This action cannot be undone. \n"
|
||||||
"Are you sure you want to continue?"
|
"Are you sure you want to continue?"
|
||||||
msgstr ""
|
msgstr "Es werden gleich alle Drucker aus Cura entfernt. Dieser Vorgang kann nicht rückgängig gemacht werden. \nMöchten Sie wirklich fortfahren?"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:27
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:27
|
||||||
msgctxt "@info:status"
|
msgctxt "@info:status"
|
||||||
@ -1406,7 +1408,7 @@ msgstr "Druckaufträge mithilfe Ihres Ultimaker-Kontos von einem anderen Ort aus
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:33
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:33
|
||||||
msgctxt "@info:status Ultimaker Cloud should not be translated."
|
msgctxt "@info:status Ultimaker Cloud should not be translated."
|
||||||
msgid "Connect to Ultimaker Digital Factory"
|
msgid "Connect to Ultimaker Digital Factory"
|
||||||
msgstr ""
|
msgstr "Mit der Ultimaker Digital Factory verbinden"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:36
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/UM3NetworkPrinting/src/Messages/CloudFlowMessage.py:36
|
||||||
msgctxt "@action"
|
msgctxt "@action"
|
||||||
@ -2260,8 +2262,8 @@ msgstr "Aktive Nachbearbeitungsskripts ändern."
|
|||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
msgid "The following script is active:"
|
msgid "The following script is active:"
|
||||||
msgid_plural "The following scripts are active:"
|
msgid_plural "The following scripts are active:"
|
||||||
msgstr[0] ""
|
msgstr[0] "Die folgenden Skript ist aktiv:"
|
||||||
msgstr[1] ""
|
msgstr[1] "Die folgenden Skripte sind aktiv:"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:20
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:20
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:49
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/SimulationView/SimulationViewMenuComponent.qml:49
|
||||||
@ -2452,7 +2454,7 @@ msgstr "Aktualisiert"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/components/ToolboxDownloadsShowcase.qml:27
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/components/ToolboxDownloadsShowcase.qml:27
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Premium"
|
msgid "Premium"
|
||||||
msgstr ""
|
msgstr "Premium"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/components/ToolboxDownloadsShowcase.qml:39
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/components/ToolboxDownloadsShowcase.qml:39
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/components/ToolboxHeader.qml:86
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/components/ToolboxHeader.qml:86
|
||||||
@ -2628,32 +2630,32 @@ msgstr "Verbindung zur Cura Paket-Datenbank konnte nicht hergestellt werden. Bit
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:33
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:33
|
||||||
msgctxt "@title:tab"
|
msgctxt "@title:tab"
|
||||||
msgid "Installed plugins"
|
msgid "Installed plugins"
|
||||||
msgstr ""
|
msgstr "Installierte Plugins"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:72
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:72
|
||||||
msgctxt "@info"
|
msgctxt "@info"
|
||||||
msgid "No plugin has been installed."
|
msgid "No plugin has been installed."
|
||||||
msgstr ""
|
msgstr "Es wurde kein Plugin installiert."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:86
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:86
|
||||||
msgctxt "@title:tab"
|
msgctxt "@title:tab"
|
||||||
msgid "Installed materials"
|
msgid "Installed materials"
|
||||||
msgstr ""
|
msgstr "Installierte Materialien"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:125
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:125
|
||||||
msgctxt "@info"
|
msgctxt "@info"
|
||||||
msgid "No material has been installed."
|
msgid "No material has been installed."
|
||||||
msgstr ""
|
msgstr "Es wurde kein Material installiert."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:139
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:139
|
||||||
msgctxt "@title:tab"
|
msgctxt "@title:tab"
|
||||||
msgid "Bundled plugins"
|
msgid "Bundled plugins"
|
||||||
msgstr ""
|
msgstr "Gebündelte Plugins"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:184
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxInstalledPage.qml:184
|
||||||
msgctxt "@title:tab"
|
msgctxt "@title:tab"
|
||||||
msgid "Bundled materials"
|
msgid "Bundled materials"
|
||||||
msgstr ""
|
msgstr "Gebündelte Materialien"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxLoadingPage.qml:16
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/ToolboxLoadingPage.qml:16
|
||||||
msgctxt "@info"
|
msgctxt "@info"
|
||||||
@ -2663,7 +2665,7 @@ msgstr "Pakete werden abgeholt..."
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/WelcomePage.qml:22
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/pages/WelcomePage.qml:22
|
||||||
msgctxt "@description"
|
msgctxt "@description"
|
||||||
msgid "Please sign in to get verified plugins and materials for Ultimaker Cura Enterprise"
|
msgid "Please sign in to get verified plugins and materials for Ultimaker Cura Enterprise"
|
||||||
msgstr ""
|
msgstr "Bitte melden Sie sich an, um verifizierte Plugins und Materialien für Ultimaker Cura Enterprise zu erhalten"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:19
|
#: /home/trin/Gedeeld/Projects/Cura/plugins/Toolbox/resources/qml/Toolbox.qml:19
|
||||||
msgctxt "@title"
|
msgctxt "@title"
|
||||||
@ -3126,47 +3128,47 @@ msgstr "Konto erstellen"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:28
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:28
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Checking..."
|
msgid "Checking..."
|
||||||
msgstr ""
|
msgstr "Überprüfung läuft ..."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:35
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:35
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Account synced"
|
msgid "Account synced"
|
||||||
msgstr ""
|
msgstr "Konto wurde synchronisiert"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:42
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:42
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Something went wrong..."
|
msgid "Something went wrong..."
|
||||||
msgstr ""
|
msgstr "Irgendetwas ist schief gelaufen ..."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:96
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:96
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
msgid "Install pending updates"
|
msgid "Install pending updates"
|
||||||
msgstr ""
|
msgstr "Ausstehende Updates installieren"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:118
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/SyncState.qml:118
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
msgid "Check for account updates"
|
msgid "Check for account updates"
|
||||||
msgstr ""
|
msgstr "Nach Updates für das Konto suchen"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/UserOperations.qml:81
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/UserOperations.qml:81
|
||||||
msgctxt "@label The argument is a timestamp"
|
msgctxt "@label The argument is a timestamp"
|
||||||
msgid "Last update: %1"
|
msgid "Last update: %1"
|
||||||
msgstr ""
|
msgstr "Letztes Update: %1"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/UserOperations.qml:99
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/UserOperations.qml:99
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
msgid "Ultimaker Digital Factory"
|
msgid "Ultimaker Digital Factory"
|
||||||
msgstr ""
|
msgstr "Ultimaker Digital Factory"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/UserOperations.qml:109
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/UserOperations.qml:109
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
msgid "Ultimaker Account"
|
msgid "Ultimaker Account"
|
||||||
msgstr ""
|
msgstr "Ultimaker‑Konto"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/UserOperations.qml:125
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Account/UserOperations.qml:125
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
msgid "Sign Out"
|
msgid "Sign Out"
|
||||||
msgstr ""
|
msgstr "Abmelden"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:59
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ActionPanel/OutputProcessWidget.qml:59
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
@ -3662,18 +3664,18 @@ msgstr "Bibliothek für Polygon-Beschneidung"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:155
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:155
|
||||||
msgctxt "@Label"
|
msgctxt "@Label"
|
||||||
msgid "Static type checker for Python"
|
msgid "Static type checker for Python"
|
||||||
msgstr ""
|
msgstr "Statischer Prüfer für Python"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:156
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:156
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:157
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:157
|
||||||
msgctxt "@Label"
|
msgctxt "@Label"
|
||||||
msgid "Root Certificates for validating SSL trustworthiness"
|
msgid "Root Certificates for validating SSL trustworthiness"
|
||||||
msgstr ""
|
msgstr "Root-Zertifikate zur Validierung der SSL-Vertrauenswürdigkeit"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:158
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:158
|
||||||
msgctxt "@Label"
|
msgctxt "@Label"
|
||||||
msgid "Python Error tracking library"
|
msgid "Python Error tracking library"
|
||||||
msgstr ""
|
msgstr "Python-Fehlerverfolgungs-Bibliothek"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:160
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/AboutDialog.qml:160
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
@ -3726,7 +3728,8 @@ msgid ""
|
|||||||
"You have customized some profile settings.\n"
|
"You have customized some profile settings.\n"
|
||||||
"Would you like to Keep these changed settings after switching profiles?\n"
|
"Would you like to Keep these changed settings after switching profiles?\n"
|
||||||
"Alternatively, you can Discard the changes to load the defaults from '%1'."
|
"Alternatively, you can Discard the changes to load the defaults from '%1'."
|
||||||
msgstr ""
|
msgstr "Sie haben einige Profileinstellungen personalisiert.\nMöchten Sie diese geänderten Einstellungen nach einem Profilwechsel beibehalten?\nSie können die"
|
||||||
|
" Änderungen auch verwerfen, um die Standardeinstellungen von '%1' zu laden."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:111
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:111
|
||||||
msgctxt "@title:column"
|
msgctxt "@title:column"
|
||||||
@ -3736,7 +3739,7 @@ msgstr "Profileinstellungen"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:125
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:125
|
||||||
msgctxt "@title:column"
|
msgctxt "@title:column"
|
||||||
msgid "Current changes"
|
msgid "Current changes"
|
||||||
msgstr ""
|
msgstr "Aktuelle Änderungen"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:158
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:158
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:747
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:747
|
||||||
@ -3757,12 +3760,12 @@ msgstr "Übernehmen und zukünftig nicht mehr nachfragen"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:197
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:197
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Discard changes"
|
msgid "Discard changes"
|
||||||
msgstr ""
|
msgstr "Änderungen verwerfen"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:210
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/DiscardOrKeepProfileChangesDialog.qml:210
|
||||||
msgctxt "@action:button"
|
msgctxt "@action:button"
|
||||||
msgid "Keep changes"
|
msgid "Keep changes"
|
||||||
msgstr ""
|
msgstr "Änderungen speichern"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:64
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Dialogs/OpenFilesIncludingProjectsDialog.qml:64
|
||||||
msgctxt "@text:window"
|
msgctxt "@text:window"
|
||||||
@ -3951,7 +3954,7 @@ msgstr "Anzahl Kopien"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Menus/FileMenu.qml:33
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Menus/FileMenu.qml:33
|
||||||
msgctxt "@title:menu menubar:file"
|
msgctxt "@title:menu menubar:file"
|
||||||
msgid "&Save Project..."
|
msgid "&Save Project..."
|
||||||
msgstr ""
|
msgstr "&Projekt speichern ..."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Menus/FileMenu.qml:54
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Menus/FileMenu.qml:54
|
||||||
msgctxt "@title:menu menubar:file"
|
msgctxt "@title:menu menubar:file"
|
||||||
@ -4111,29 +4114,29 @@ msgstr "Soll das Drucken wirklich abgebrochen werden?"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:102
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:102
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Is printed as support."
|
msgid "Is printed as support."
|
||||||
msgstr ""
|
msgstr "Wird als Stückstruktur gedruckt."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:105
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:105
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Other models overlapping with this model are modified."
|
msgid "Other models overlapping with this model are modified."
|
||||||
msgstr ""
|
msgstr "Andere Modelle, die sich mit diesem Modell überschneiden, werden angepasst."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:108
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:108
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Infill overlapping with this model is modified."
|
msgid "Infill overlapping with this model is modified."
|
||||||
msgstr ""
|
msgstr "Überlappende Füllung wird bei diesem Modell angepasst."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:111
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:111
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Overlaps with this model are not supported."
|
msgid "Overlaps with this model are not supported."
|
||||||
msgstr ""
|
msgstr "Überlappungen mit diesem Modell werden nicht unterstützt."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:118
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectItemButton.qml:118
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Overrides %1 setting."
|
msgid "Overrides %1 setting."
|
||||||
msgid_plural "Overrides %1 settings."
|
msgid_plural "Overrides %1 settings."
|
||||||
msgstr[0] ""
|
msgstr[0] "Überschreibt %1 Einstellung."
|
||||||
msgstr[1] ""
|
msgstr[1] "Überschreibt %1 Einstellungen."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectSelector.qml:59
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/ObjectSelector.qml:59
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
@ -4188,12 +4191,12 @@ msgstr "Überhang anzeigen"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:351
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:351
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
msgid "Highlight missing or extraneous surfaces of the model using warning signs. The toolpaths will often be missing parts of the intended geometry."
|
msgid "Highlight missing or extraneous surfaces of the model using warning signs. The toolpaths will often be missing parts of the intended geometry."
|
||||||
msgstr ""
|
msgstr "Heben Sie fehlende oder fehlerhafte Flächen des Modells mithilfe von Warnhinweisen hervor. In den Werkzeugpfaden fehlen oft Teile der beabsichtigten Geometrie."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:360
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:360
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Display model errors"
|
msgid "Display model errors"
|
||||||
msgstr ""
|
msgstr "Modellfehler anzeigen"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:368
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:368
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
@ -4306,12 +4309,12 @@ msgstr "Dateien öffnen und speichern"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:570
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:570
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
msgid "Should opening files from the desktop or external applications open in the same instance of Cura?"
|
msgid "Should opening files from the desktop or external applications open in the same instance of Cura?"
|
||||||
msgstr ""
|
msgstr "Sollten Dateien vom Desktop oder von externen Anwendungen in derselben Instanz von Cura geöffnet werden?"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:575
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:575
|
||||||
msgctxt "@option:check"
|
msgctxt "@option:check"
|
||||||
msgid "Use a single instance of Cura"
|
msgid "Use a single instance of Cura"
|
||||||
msgstr ""
|
msgstr "Eine einzelne Instanz von Cura verwenden"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:585
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/Preferences/GeneralPage.qml:585
|
||||||
msgctxt "@info:tooltip"
|
msgctxt "@info:tooltip"
|
||||||
@ -4845,22 +4848,22 @@ msgstr "Der Drucker ist nicht verbunden."
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:47
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:47
|
||||||
msgctxt "@status"
|
msgctxt "@status"
|
||||||
msgid "The cloud printer is offline. Please check if the printer is turned on and connected to the internet."
|
msgid "The cloud printer is offline. Please check if the printer is turned on and connected to the internet."
|
||||||
msgstr ""
|
msgstr "Der Cloud-Drucker ist offline. Bitte prüfen Sie, ob der Drucker eingeschaltet und mit dem Internet verbunden ist."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:51
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:51
|
||||||
msgctxt "@status"
|
msgctxt "@status"
|
||||||
msgid "This printer is not linked to your account. Please visit the Ultimaker Digital Factory to establish a connection."
|
msgid "This printer is not linked to your account. Please visit the Ultimaker Digital Factory to establish a connection."
|
||||||
msgstr ""
|
msgstr "Der Drucker ist nicht mit Ihrem Konto verbunden. Bitte besuchen Sie die Ultimaker Digital Factory, um eine Verbindung herzustellen."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:56
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:56
|
||||||
msgctxt "@status"
|
msgctxt "@status"
|
||||||
msgid "The cloud connection is currently unavailable. Please sign in to connect to the cloud printer."
|
msgid "The cloud connection is currently unavailable. Please sign in to connect to the cloud printer."
|
||||||
msgstr ""
|
msgstr "Die Cloud-Verbindung ist aktuell nicht verfügbar. Bitte melden Sie sich an, um sich mit dem Cloud-Drucker zu verbinden."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:60
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:60
|
||||||
msgctxt "@status"
|
msgctxt "@status"
|
||||||
msgid "The cloud connection is currently unavailable. Please check your internet connection."
|
msgid "The cloud connection is currently unavailable. Please check your internet connection."
|
||||||
msgstr ""
|
msgstr "Die Cloud-Verbindung ist aktuell nicht verfügbar. Bitte überprüfen Sie ihre Internetverbindung."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:238
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/PrinterSelector/MachineSelector.qml:238
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
@ -5116,27 +5119,27 @@ msgstr "Typ anzeigen"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:47
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:47
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Add a Cloud printer"
|
msgid "Add a Cloud printer"
|
||||||
msgstr ""
|
msgstr "Einen Cloud-Drucker hinzufügen"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:73
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:73
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Waiting for Cloud response"
|
msgid "Waiting for Cloud response"
|
||||||
msgstr ""
|
msgstr "Auf eine Antwort von der Cloud warten"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:84
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:84
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "No printers found in your account?"
|
msgid "No printers found in your account?"
|
||||||
msgstr ""
|
msgstr "Keine Drucker in Ihrem Konto gefunden?"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:118
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:118
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "The following printers in your account have been added in Cura:"
|
msgid "The following printers in your account have been added in Cura:"
|
||||||
msgstr ""
|
msgstr "Folgende Drucker in Ihrem Konto wurden zu Cura hinzugefügt:"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:200
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:200
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
msgid "Add printer manually"
|
msgid "Add printer manually"
|
||||||
msgstr ""
|
msgstr "Drucker manuell hinzufügen"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:214
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddCloudPrintersView.qml:214
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
@ -5151,7 +5154,7 @@ msgstr "Hersteller"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:245
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:245
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Profile author"
|
msgid "Profile author"
|
||||||
msgstr ""
|
msgstr "Autor des Profils"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:260
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddLocalPrinterScrollView.qml:260
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
@ -5196,7 +5199,7 @@ msgstr "Drucker nach IP hinzufügen"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:203
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:203
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
msgid "Add cloud printer"
|
msgid "Add cloud printer"
|
||||||
msgstr ""
|
msgstr "Ein Cloud-Drucker hinzufügen"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:239
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddNetworkPrinterScrollView.qml:239
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
@ -5211,7 +5214,7 @@ msgstr "Drucker nach IP-Adresse hinzufügen"
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:133
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:133
|
||||||
msgctxt "@text"
|
msgctxt "@text"
|
||||||
msgid "Enter your printer's IP address."
|
msgid "Enter your printer's IP address."
|
||||||
msgstr ""
|
msgstr "Geben Sie die IP-Adresse Ihres Druckers ein."
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:158
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/AddPrinterByIpContent.qml:158
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
@ -5277,7 +5280,7 @@ msgstr "- Steigern Sie Ihre Effizienz mit einem Remote-Workflow für Ultimaker-D
|
|||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:157
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/CloudContent.qml:157
|
||||||
msgctxt "@button"
|
msgctxt "@button"
|
||||||
msgid "Skip"
|
msgid "Skip"
|
||||||
msgstr ""
|
msgstr "Überspringen"
|
||||||
|
|
||||||
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:24
|
#: /home/trin/Gedeeld/Projects/Cura/resources/qml/WelcomePages/DataCollectionsContent.qml:24
|
||||||
msgctxt "@label"
|
msgctxt "@label"
|
||||||
@ -5881,22 +5884,22 @@ msgstr "Upgrade von Version 4.5 auf 4.6"
|
|||||||
#: VersionUpgrade/VersionUpgrade460to462/plugin.json
|
#: VersionUpgrade/VersionUpgrade460to462/plugin.json
|
||||||
msgctxt "description"
|
msgctxt "description"
|
||||||
msgid "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2."
|
msgid "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2."
|
||||||
msgstr ""
|
msgstr "Upgrade der Konfigurationen von Cura 4.6.0 auf Cura 4.6.2."
|
||||||
|
|
||||||
#: VersionUpgrade/VersionUpgrade460to462/plugin.json
|
#: VersionUpgrade/VersionUpgrade460to462/plugin.json
|
||||||
msgctxt "name"
|
msgctxt "name"
|
||||||
msgid "Version Upgrade 4.6.0 to 4.6.2"
|
msgid "Version Upgrade 4.6.0 to 4.6.2"
|
||||||
msgstr ""
|
msgstr "Upgrade von Version 4.6.0 auf 4.6.2"
|
||||||
|
|
||||||
#: VersionUpgrade/VersionUpgrade462to47/plugin.json
|
#: VersionUpgrade/VersionUpgrade462to47/plugin.json
|
||||||
msgctxt "description"
|
msgctxt "description"
|
||||||
msgid "Upgrades configurations from Cura 4.6.2 to Cura 4.7."
|
msgid "Upgrades configurations from Cura 4.6.2 to Cura 4.7."
|
||||||
msgstr ""
|
msgstr "Aktualisiert Konfigurationen von Cura 4.6.2 auf Cura 4.7."
|
||||||
|
|
||||||
#: VersionUpgrade/VersionUpgrade462to47/plugin.json
|
#: VersionUpgrade/VersionUpgrade462to47/plugin.json
|
||||||
msgctxt "name"
|
msgctxt "name"
|
||||||
msgid "Version Upgrade 4.6.2 to 4.7"
|
msgid "Version Upgrade 4.6.2 to 4.7"
|
||||||
msgstr ""
|
msgstr "Upgrade von Version 4.6.2 auf 4.7"
|
||||||
|
|
||||||
#: X3DReader/plugin.json
|
#: X3DReader/plugin.json
|
||||||
msgctxt "description"
|
msgctxt "description"
|
||||||
|
@ -7,7 +7,7 @@ msgstr ""
|
|||||||
"Project-Id-Version: Cura 4.7\n"
|
"Project-Id-Version: Cura 4.7\n"
|
||||||
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
|
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
|
||||||
"POT-Creation-Date: 2020-07-31 14:10+0000\n"
|
"POT-Creation-Date: 2020-07-31 14:10+0000\n"
|
||||||
"PO-Revision-Date: 2019-07-29 15:51+0200\n"
|
"PO-Revision-Date: 2020-08-21 13:40+0200\n"
|
||||||
"Last-Translator: Lionbridge <info@lionbridge.com>\n"
|
"Last-Translator: Lionbridge <info@lionbridge.com>\n"
|
||||||
"Language-Team: German <info@lionbridge.com>, German <info@bothof.nl>\n"
|
"Language-Team: German <info@lionbridge.com>, German <info@bothof.nl>\n"
|
||||||
"Language: de_DE\n"
|
"Language: de_DE\n"
|
||||||
@ -227,12 +227,13 @@ msgstr "Zeigt an, ob das Gerät die Temperatur im Druckraum stabilisieren kann."
|
|||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "machine_always_write_active_tool label"
|
msgctxt "machine_always_write_active_tool label"
|
||||||
msgid "Always Write Active Tool"
|
msgid "Always Write Active Tool"
|
||||||
msgstr ""
|
msgstr "Immer aktives Tools schreiben"
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "machine_always_write_active_tool description"
|
msgctxt "machine_always_write_active_tool description"
|
||||||
msgid "Write active tool after sending temp commands to inactive tool. Required for Dual Extruder printing with Smoothie or other firmware with modal tool commands."
|
msgid "Write active tool after sending temp commands to inactive tool. Required for Dual Extruder printing with Smoothie or other firmware with modal tool commands."
|
||||||
msgstr ""
|
msgstr "Mit aktivem Werkzeug schreiben, nach dem temporäre Befehle an das inaktive Werkzeug übermittelt wurden. Erforderlich für Dual-Extruder-Druck mit Smoothie"
|
||||||
|
" oder anderer Firmware mit modalen Werkzeugbefehlen."
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "machine_center_is_zero label"
|
msgctxt "machine_center_is_zero label"
|
||||||
@ -3486,22 +3487,24 @@ msgstr "Das für das Drucken der Stützstruktur der Böden verwendete Extruder-E
|
|||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_structure label"
|
msgctxt "support_structure label"
|
||||||
msgid "Support Structure"
|
msgid "Support Structure"
|
||||||
msgstr ""
|
msgstr "Stützstruktur"
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_structure description"
|
msgctxt "support_structure description"
|
||||||
msgid "Chooses between the techniques available to generate support. \"Normal\" support creates a support structure directly below the overhanging parts and drops those areas straight down. \"Tree\" support creates branches towards the overhanging areas that support the model on the tips of those branches, and allows the branches to crawl around the model to support it from the build plate as much as possible."
|
msgid "Chooses between the techniques available to generate support. \"Normal\" support creates a support structure directly below the overhanging parts and drops those areas straight down. \"Tree\" support creates branches towards the overhanging areas that support the model on the tips of those branches, and allows the branches to crawl around the model to support it from the build plate as much as possible."
|
||||||
msgstr ""
|
msgstr "Wählt zwischen den verfügbaren Techniken zur Erzeugung von Stützstrukturen. Mit „Normal“ wird eine Stützstruktur direkt unter den überhängenden Teilen"
|
||||||
|
" erzeugt, die direkt darauf liegen. In der Einstellung „Tree“ wird eine Baumstützstruktur erzeugt, die zu den überhängenden Teilen reicht und diese stützt."
|
||||||
|
" Die Stützstruktur verästelt sich innerhalb des Modells und stützt es so gut wie möglich vom Druckbett aus."
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_structure option normal"
|
msgctxt "support_structure option normal"
|
||||||
msgid "Normal"
|
msgid "Normal"
|
||||||
msgstr ""
|
msgstr "Normal"
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_structure option tree"
|
msgctxt "support_structure option tree"
|
||||||
msgid "Tree"
|
msgid "Tree"
|
||||||
msgstr ""
|
msgstr "Tree"
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_tree_angle label"
|
msgctxt "support_tree_angle label"
|
||||||
@ -3821,12 +3824,13 @@ msgstr "Die maximale Breite der Stufen der treppenförmigen Unterlage für die S
|
|||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_bottom_stair_step_min_slope label"
|
msgctxt "support_bottom_stair_step_min_slope label"
|
||||||
msgid "Support Stair Step Minimum Slope Angle"
|
msgid "Support Stair Step Minimum Slope Angle"
|
||||||
msgstr ""
|
msgstr "Stützstufe minimaler Neigungswinkel"
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_bottom_stair_step_min_slope description"
|
msgctxt "support_bottom_stair_step_min_slope description"
|
||||||
msgid "The minimum slope of the area for stair-stepping to take effect. Low values should make support easier to remove on shallower slopes, but really low values may result in some very counter-intuitive results on other parts of the model."
|
msgid "The minimum slope of the area for stair-stepping to take effect. Low values should make support easier to remove on shallower slopes, but really low values may result in some very counter-intuitive results on other parts of the model."
|
||||||
msgstr ""
|
msgstr "Die Mindestneigung des Bereichs zur Erstellung einer Stützstufe. Bei niedrigeren Werten lassen sich die Stützstrukturen an flachen Neigungen leichter entfernen."
|
||||||
|
" Zu niedrige Werte können allerdings zu widersprüchlichen Ergebnissen an anderen Teilen des Modells führen."
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_join_distance label"
|
msgctxt "support_join_distance label"
|
||||||
@ -4276,12 +4280,12 @@ msgstr "Sorgt für Unterstützung überall unterhalb des Stütznetzes, sodass ke
|
|||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_meshes_present label"
|
msgctxt "support_meshes_present label"
|
||||||
msgid "Scene Has Support Meshes"
|
msgid "Scene Has Support Meshes"
|
||||||
msgstr ""
|
msgstr "Szene verfügt über Stütznetze"
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "support_meshes_present description"
|
msgctxt "support_meshes_present description"
|
||||||
msgid "There are support meshes present in the scene. This setting is controlled by Cura."
|
msgid "There are support meshes present in the scene. This setting is controlled by Cura."
|
||||||
msgstr ""
|
msgstr "Die Szene verfügt über Stütznetze. Diese Einstellung wird von Cura gesteuert."
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "platform_adhesion label"
|
msgctxt "platform_adhesion label"
|
||||||
@ -5045,7 +5049,9 @@ msgstr "Druckreihenfolge"
|
|||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "print_sequence description"
|
msgctxt "print_sequence description"
|
||||||
msgid "Whether to print all models one layer at a time or to wait for one model to finish, before moving on to the next. One at a time mode is possible if a) only one extruder is enabled and b) all models are separated in such a way that the whole print head can move in between and all models are lower than the distance between the nozzle and the X/Y axes."
|
msgid "Whether to print all models one layer at a time or to wait for one model to finish, before moving on to the next. One at a time mode is possible if a) only one extruder is enabled and b) all models are separated in such a way that the whole print head can move in between and all models are lower than the distance between the nozzle and the X/Y axes."
|
||||||
msgstr ""
|
msgstr "Es wird festgelegt, ob eine Schicht für alle Modelle gleichzeitig gedruckt werden soll oder ob zuerst ein Modell fertig gedruckt wird, bevor der Druck"
|
||||||
|
" eines weiteren begonnen wird. Der „Nacheinandermodus“ ist möglich, wenn a) nur ein Extruder aktiviert ist und b) alle Modelle voneinander getrennt sind,"
|
||||||
|
" sodass sich der gesamte Druckkopf zwischen allen Modellen bewegen kann und alle Modelle niedriger sind als der Abstand zwischen der Düse und den X/Y-Achsen."
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "print_sequence option all_at_once"
|
msgctxt "print_sequence option all_at_once"
|
||||||
@ -5070,12 +5076,14 @@ msgstr "Verwenden Sie dieses Mesh, um die Füllung anderer Meshes zu ändern, mi
|
|||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "infill_mesh_order label"
|
msgctxt "infill_mesh_order label"
|
||||||
msgid "Mesh Processing Rank"
|
msgid "Mesh Processing Rank"
|
||||||
msgstr ""
|
msgstr "Rang der Netzverarbeitung"
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "infill_mesh_order description"
|
msgctxt "infill_mesh_order description"
|
||||||
msgid "Determines the priority of this mesh when considering overlapping volumes. Areas where multiple meshes reside will be won by the lower rank mesh. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes."
|
msgid "Determines the priority of this mesh when considering overlapping volumes. Areas where multiple meshes reside will be won by the lower rank mesh. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes."
|
||||||
msgstr ""
|
msgstr "Legt fest, welche Priorität dieses Netz (Mesh) bei überlappenden Volumen hat. Bereiche mit einem niedrigeren Netzrang haben Priorität vor Bereichen, in"
|
||||||
|
" denen es mehrere Netze gibt. Wird eine Mesh-Füllung höher gerankt, führt dies zu einer Modifizierung der Füllungen oder Mesh-Füllungen, deren Priorität"
|
||||||
|
" niedriger oder normal ist."
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "cutting_mesh label"
|
msgctxt "cutting_mesh label"
|
||||||
@ -5220,7 +5228,10 @@ msgstr "Slicing-Toleranz"
|
|||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "slicing_tolerance description"
|
msgctxt "slicing_tolerance description"
|
||||||
msgid "Vertical tolerance in the sliced layers. The contours of a layer are normally generated by taking cross sections through the middle of each layer's thickness (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the entire thickness of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Inclusive retains the most details, Exclusive makes for the best fit and Middle stays closest to the original surface."
|
msgid "Vertical tolerance in the sliced layers. The contours of a layer are normally generated by taking cross sections through the middle of each layer's thickness (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the entire thickness of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Inclusive retains the most details, Exclusive makes for the best fit and Middle stays closest to the original surface."
|
||||||
msgstr ""
|
msgstr "Vertikale Toleranz der geschnittenen (Slicing) Schichten. Die Konturen einer Schicht werden normalerweise erzeugt, indem ein Querschnitt durch die Mitte"
|
||||||
|
" der Höhe jeder Schicht (Mitte) vorgenommen wird. Alternativ kann jede Schicht die Bereiche aufweisen, die über die gesamte Dicke der Schicht (Exklusiv)"
|
||||||
|
" in das Volumen fallen, oder eine Schicht weist die Bereiche auf, die innerhalb der Schicht (Inklusiv) irgendwo hineinfallen. Inklusiv ermöglicht die meisten"
|
||||||
|
" Details, Exklusiv die beste Passform und Mitte entspricht der ursprünglichen Fläche am ehesten."
|
||||||
|
|
||||||
#: fdmprinter.def.json
|
#: fdmprinter.def.json
|
||||||
msgctxt "slicing_tolerance option middle"
|
msgctxt "slicing_tolerance option middle"
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user