Merge branch 'CURA-7376_full_of_spiders' into CURA-7555_Beading_strategy_user_control

This commit is contained in:
Kostas Karmas 2020-08-11 14:00:01 +02:00
commit c5fc26350b
168 changed files with 19839 additions and 11271 deletions

View File

@ -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
# example Cura 3.2 with SDK version 6.1 will not work. So the SDK version is hard-coded here and left out of the
# CuraVersion.py.in template.
CuraSDKVersion = "7.2.0"
CuraSDKVersion = "7.3.0"
try:
from cura.CuraVersion import CuraAppName # type: ignore

View File

@ -135,9 +135,7 @@ class MachineNode(ContainerNode):
groups_by_name[name] = QualityChangesGroup(name, quality_type = quality_changes["quality_type"],
intent_category = quality_changes.get("intent_category", "default"),
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.
groups_by_name[name].intent_category = quality_changes.get("intent_category", "default")
@ -146,6 +144,18 @@ class MachineNode(ContainerNode):
else: # Global profile.
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())
def preferredGlobalQuality(self) -> "QualityNode":

View File

@ -72,8 +72,8 @@ class GlobalStacksModel(ListModel):
section_name = self._catalog.i18nc("@info:title", section_name)
default_removal_warning = self._catalog.i18nc(
"@label ({} is object name)",
"Are you sure you wish to remove {}? This cannot be undone!", device_name
"@label {0} is the name of a printer that's about to be deleted.",
"Are you sure you wish to remove {0}? This cannot be undone!", device_name
)
removal_warning = container_stack.getMetaDataEntry("removal_warning", default_removal_warning)

View File

@ -333,6 +333,7 @@ class QualityManagementModel(ListModel):
"layer_height": layer_height, # layer_height is only used for sorting
}
item_list.append(item)
# Sort by layer_height for built-in qualities
item_list = sorted(item_list, key = lambda x: x["layer_height"])
@ -341,6 +342,9 @@ class QualityManagementModel(ListModel):
available_intent_list = [i for i in available_intent_list if i[0] != "default"]
result = []
for intent_category, quality_type in available_intent_list:
if not quality_group_dict[quality_type].is_available:
continue
result.append({
"name": quality_group_dict[quality_type].name, # Use the quality name as the display name
"is_read_only": True,
@ -361,6 +365,9 @@ class QualityManagementModel(ListModel):
# 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_type = quality_changes_group.quality_type
if not quality_changes_group.is_available:
continue
item = {"name": quality_changes_group.name,
"is_read_only": False,
"quality_group": quality_group,

View File

@ -1,14 +1,17 @@
# Copyright (c) 2019 Ultimaker B.V.
# Copyright (c) 2020 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from PyQt5.QtCore import pyqtProperty, pyqtSignal, Qt
from typing import Set
import cura.CuraApplication
from UM import i18nCatalog
from UM.Logger import Logger
from UM.Qt.ListModel import ListModel
from UM.Settings.ContainerRegistry import ContainerRegistry
import os
class QualitySettingsModel(ListModel):
"""This model is used to show details settings of the selected quality in the quality management page."""
@ -81,6 +84,12 @@ class QualitySettingsModel(ListModel):
global_container_stack = self._application.getGlobalContainerStack()
definition_container = global_container_stack.definition
# Try and find a translation catalog for the definition
for file_name in definition_container.getInheritedFiles():
catalog = i18nCatalog(os.path.basename(file_name))
if catalog.hasTranslationLoaded():
self._i18n_catalog = catalog
quality_group = self._selected_quality_item["quality_group"]
quality_changes_group = self._selected_quality_item["quality_changes_group"]

View File

@ -45,7 +45,7 @@ class CuraContainerRegistry(ContainerRegistry):
self.containerAdded.connect(self._onContainerAdded)
@override(ContainerRegistry)
def addContainer(self, container: ContainerInterface) -> None:
def addContainer(self, container: ContainerInterface) -> bool:
"""Overridden from ContainerRegistry
Adds a container to the registry.
@ -64,9 +64,9 @@ class CuraContainerRegistry(ContainerRegistry):
actual_setting_version = int(container.getMetaDataEntry("setting_version", default = 0))
if required_setting_version != actual_setting_version:
Logger.log("w", "Instance container {container_id} is outdated. Its setting version is {actual_setting_version} but it should be {required_setting_version}.".format(container_id = container.getId(), actual_setting_version = actual_setting_version, required_setting_version = required_setting_version))
return # Don't add.
return False # Don't add.
super().addContainer(container)
return super().addContainer(container)
def createUniqueName(self, container_type: str, current_name: str, new_name: str, fallback_name: str) -> str:
"""Create a name that is not empty and unique
@ -348,6 +348,34 @@ class CuraContainerRegistry(ContainerRegistry):
self._registerSingleExtrusionMachinesExtruderStacks()
self._connectUpgradedExtruderStacksToMachines()
@override(ContainerRegistry)
def loadAllMetadata(self) -> None:
super().loadAllMetadata()
self._cleanUpInvalidQualityChanges()
def _cleanUpInvalidQualityChanges(self) -> None:
# We've seen cases where it was possible for quality_changes to be incorrectly added. This is to ensure that
# any such leftovers are purged from the registry.
quality_changes = ContainerRegistry.getInstance().findContainersMetadata(type="quality_changes")
profile_count_by_name = {} # type: Dict[str, int]
for quality_change in quality_changes:
name = str(quality_change.get("name", ""))
if name == "empty":
continue
if name not in profile_count_by_name:
profile_count_by_name[name] = 0
profile_count_by_name[name] += 1
for profile_name, profile_count in profile_count_by_name.items():
if profile_count > 1:
continue
# Only one profile found, this should not ever be the case, so that profile needs to be removed!
Logger.log("d", "Found an invalid quality_changes profile with the name %s. Going to remove that now", profile_name)
invalid_quality_changes = ContainerRegistry.getInstance().findContainersMetadata(name=profile_name)
self.removeContainer(invalid_quality_changes[0]["id"])
@override(ContainerRegistry)
def _isMetadataValid(self, metadata: Optional[Dict[str, Any]]) -> bool:
"""Check if the metadata for a container is okay before adding it.
@ -411,7 +439,8 @@ class CuraContainerRegistry(ContainerRegistry):
if quality_type != empty_quality_container.getMetaDataEntry("quality_type") and quality_type not in quality_group_dict:
return catalog.i18nc("@info:status", "Could not find a quality type {0} for the current configuration.", quality_type)
ContainerRegistry.getInstance().addContainer(profile)
if not self.addContainer(profile):
return catalog.i18nc("@info:status", "Unable to add the profile.")
return None

View File

@ -62,7 +62,8 @@ class CuraStackBuilder:
for position in extruder_dict:
try:
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
for new_extruder in new_global_stack.extruderList: # Only register the extruders if we're sure that all of them are correct.

View File

@ -5,7 +5,7 @@ from configparser import ConfigParser
import zipfile
import os
import json
from typing import cast, Dict, List, Optional, Tuple, Any
from typing import cast, Dict, List, Optional, Tuple, Any, Set
import xml.etree.ElementTree as ET
@ -41,6 +41,18 @@ from .WorkspaceDialog import WorkspaceDialog
i18n_catalog = i18nCatalog("cura")
_ignored_machine_network_metadata = {
"um_cloud_cluster_id",
"um_network_key",
"um_linked_to_account",
"host_guid",
"removal_warning",
"group_name",
"group_size",
"connection_type"
} # type: Set[str]
class ContainerInfo:
def __init__(self, file_name: Optional[str], serialized: Optional[str], parser: Optional[ConfigParser]) -> None:
self.file_name = file_name
@ -121,12 +133,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
# 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._is_same_machine_type = False
self._old_new_materials = {} # type: Dict[str, str]
self._machine_info = None
def _clearState(self):
self._is_same_machine_type = False
self._id_mapping = {}
self._old_new_materials = {}
self._machine_info = None
@ -217,6 +227,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
# Read definition containers
#
machine_definition_id = None
updatable_machines = []
machine_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)]
@ -233,6 +244,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
definition_container_type = definition_container.get("type")
if definition_container_type == "machine":
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"]
variant_type_name = definition_container.get("variants_name", variant_type_name)
@ -248,7 +262,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
if machine_definition_container_count != 1:
return WorkspaceReader.PreReadResult.failed # Not a workspace file but ordinary 3MF.
material_labels = []
material_ids_to_names_map = {}
material_conflict = False
xml_material_profile = self._getXmlProfileClass()
reverse_material_id_dict = {}
@ -264,7 +278,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
reverse_map = {metadata["id"]: container_id for metadata in metadata_list}
reverse_material_id_dict.update(reverse_map)
material_labels.append(self._getMaterialLabelFromSerialized(serialized))
material_ids_to_names_map[container_id] = self._getMaterialLabelFromSerialized(serialized)
if self._container_registry.findContainersMetadata(id = container_id): #This material already exists.
containers_found_dict["material"] = True
if not self._container_registry.isReadOnly(container_id): # Only non readonly materials can be in conflict
@ -374,8 +388,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
machine_definition_id = id_list[7]
stacks = self._container_registry.findContainerStacks(name = machine_name, type = "machine")
self._is_same_machine_type = True
existing_global_stack = None
global_stack = None
if stacks:
global_stack = stacks[0]
@ -388,7 +402,9 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
if global_stack.getContainer(index).getId() != container_id:
machine_conflict = True
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
parser = ConfigParser(interpolation = None)
@ -431,6 +447,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
Job.yieldThread()
materials_in_extruders_dict = {} # Which material is in which extruder
# if the global stack is found, we check if there are conflicts in the extruder stacks
for extruder_stack_file in extruder_stack_files:
serialized = archive.open(extruder_stack_file).read().decode("utf-8")
@ -456,6 +474,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
if material_id not in ("empty", "empty_material"):
root_material_id = reverse_material_id_dict[material_id]
extruder_info.root_material_id = root_material_id
materials_in_extruders_dict[position] = material_ids_to_names_map[reverse_material_id_dict[material_id]]
definition_changes_id = parser["containers"][str(_ContainerIndexes.DefinitionChanges)]
if definition_changes_id not in ("empty", "empty_definition_changes"):
@ -470,7 +489,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
if intent_id not in ("empty", "empty_intent"):
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):
continue
@ -484,6 +503,10 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
machine_conflict = True
break
# Now we know which material is in which extruder. Let's use that to sort the material_labels according to
# their extruder position
material_labels = [material_name for pos, material_name in sorted(materials_in_extruders_dict.items())]
num_visible_settings = 0
try:
temp_preferences = Preferences()
@ -536,9 +559,6 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
self._machine_info.custom_quality_name = quality_name
self._machine_info.intent_category = intent_category
if machine_conflict and not self._is_same_machine_type:
machine_conflict = False
is_printer_group = False
if machine_conflict:
group_name = existing_global_stack.getMetaDataEntry("group_name")
@ -559,6 +579,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
self._dialog.setNumSettingsOverriddenByQualityChanges(num_settings_overridden_by_quality_changes)
self._dialog.setNumUserSettings(num_user_settings)
self._dialog.setActiveMode(active_mode)
self._dialog.setUpdatableMachines(updatable_machines)
self._dialog.setMachineName(machine_name)
self._dialog.setMaterialLabels(material_labels)
self._dialog.setMachineType(machine_type)
@ -639,8 +660,8 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
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 not self._is_same_machine_type or self._resolve_strategies["machine"] != "override":
# If there are no machines of the same type, create a new machine.
if self._resolve_strategies["machine"] != "override" or self._dialog.updatableMachinesModel.count <= 1:
# We need to create a new machine
machine_name = self._container_registry.uniqueName(self._machine_info.name)
@ -650,10 +671,12 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
self._container_registry.addContainer(global_stack)
else:
# Find the machine
global_stacks = self._container_registry.findContainerStacks(name = self._machine_info.name, type = "machine")
# Find the machine which will be overridden
global_stacks = self._container_registry.findContainerStacks(id = self._dialog.getMachineToOverride(), type = "machine")
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()
self.setWorkspaceName("")
return [], {}
@ -739,6 +762,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
Job.yieldThread()
QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
if global_stack:
# Handle quality changes if any
self._processQualityChanges(global_stack)
@ -1069,6 +1093,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
# Set metadata fields that are missing from the global stack
for key, value in self._machine_info.metadata_dict.items():
if key not in _ignored_machine_network_metadata:
global_stack.setMetaDataEntry(key, value)
def _updateActiveMachine(self, global_stack):
@ -1080,7 +1105,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader):
# Set metadata fields that are missing from the global stack
for key, value in self._machine_info.metadata_dict.items():
if key not in global_stack.getMetaData():
if key not in global_stack.getMetaData() and key not in _ignored_machine_network_metadata:
global_stack.setMetaDataEntry(key, value)
if self._quality_changes_to_apply:

View 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)

View File

@ -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.
from typing import List, Optional, Dict, cast
from PyQt5.QtCore import pyqtSignal, QObject, pyqtProperty, QCoreApplication
from UM.FlameProfiler import pyqtSlot
@ -7,10 +8,15 @@ from UM.PluginRegistry import PluginRegistry
from UM.Application import Application
from UM.i18n import i18nCatalog
from UM.Settings.ContainerRegistry import ContainerRegistry
from cura.Settings.GlobalStack import GlobalStack
from .UpdatableMachinesModel import UpdatableMachinesModel
import os
import threading
import time
from cura.CuraApplication import CuraApplication
i18n_catalog = i18nCatalog("cura")
@ -29,6 +35,7 @@ class WorkspaceDialog(QObject):
"quality_changes": self._default_strategy,
"definition_changes": self._default_strategy,
"material": self._default_strategy}
self._override_machine = None
self._visible = False
self.showDialogSignal.connect(self.__show)
@ -51,6 +58,7 @@ class WorkspaceDialog(QObject):
self._extruders = []
self._objects_on_plate = False
self._is_printer_group = False
self._updatable_machines_model = UpdatableMachinesModel(self)
machineConflictChanged = pyqtSignal()
qualityChangesConflictChanged = pyqtSignal()
@ -63,6 +71,7 @@ class WorkspaceDialog(QObject):
qualityTypeChanged = pyqtSignal()
intentNameChanged = pyqtSignal()
machineNameChanged = pyqtSignal()
updatableMachinesChanged = pyqtSignal()
materialLabelsChanged = pyqtSignal()
objectsOnPlateChanged = pyqtSignal()
numUserSettingsChanged = pyqtSignal()
@ -81,33 +90,33 @@ class WorkspaceDialog(QObject):
self.isPrinterGroupChanged.emit()
@pyqtProperty(str, notify=variantTypeChanged)
def variantType(self):
def variantType(self) -> str:
return self._variant_type
def setVariantType(self, variant_type):
def setVariantType(self, variant_type: str) -> None:
if self._variant_type != variant_type:
self._variant_type = variant_type
self.variantTypeChanged.emit()
@pyqtProperty(str, notify=machineTypeChanged)
def machineType(self):
def machineType(self) -> str:
return self._machine_type
def setMachineType(self, machine_type):
def setMachineType(self, machine_type: str) -> None:
self._machine_type = machine_type
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:
self._num_user_settings = num_user_settings
self.numVisibleSettingsChanged.emit()
@pyqtProperty(int, notify=numUserSettingsChanged)
def numUserSettings(self):
def numUserSettings(self) -> int:
return self._num_user_settings
@pyqtProperty(bool, notify=objectsOnPlateChanged)
def hasObjectsOnPlate(self):
def hasObjectsOnPlate(self) -> bool:
return self._objects_on_plate
def setHasObjectsOnPlate(self, objects_on_plate):
@ -116,10 +125,10 @@ class WorkspaceDialog(QObject):
self.objectsOnPlateChanged.emit()
@pyqtProperty("QVariantList", notify = materialLabelsChanged)
def materialLabels(self):
def materialLabels(self) -> List[str]:
return self._material_labels
def setMaterialLabels(self, material_labels):
def setMaterialLabels(self, material_labels: List[str]) -> None:
if self._material_labels != material_labels:
self._material_labels = material_labels
self.materialLabelsChanged.emit()
@ -134,36 +143,44 @@ class WorkspaceDialog(QObject):
self.extrudersChanged.emit()
@pyqtProperty(str, notify = machineNameChanged)
def machineName(self):
def machineName(self) -> str:
return self._machine_name
def setMachineName(self, machine_name):
def setMachineName(self, machine_name: str) -> None:
if self._machine_name != machine_name:
self._machine_name = machine_name
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)
def qualityType(self):
def qualityType(self) -> str:
return self._quality_type
def setQualityType(self, quality_type):
def setQualityType(self, quality_type: str) -> None:
if self._quality_type != quality_type:
self._quality_type = quality_type
self.qualityTypeChanged.emit()
@pyqtProperty(int, notify=numSettingsOverridenByQualityChangesChanged)
def numSettingsOverridenByQualityChanges(self):
def numSettingsOverridenByQualityChanges(self) -> int:
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.numSettingsOverridenByQualityChangesChanged.emit()
@pyqtProperty(str, notify=qualityNameChanged)
def qualityName(self):
def qualityName(self) -> str:
return self._quality_name
def setQualityName(self, quality_name):
def setQualityName(self, quality_name: str) -> None:
if self._quality_name != quality_name:
self._quality_name = quality_name
self.qualityNameChanged.emit()
@ -178,80 +195,87 @@ class WorkspaceDialog(QObject):
self.intentNameChanged.emit()
@pyqtProperty(str, notify=activeModeChanged)
def activeMode(self):
def activeMode(self) -> str:
return self._active_mode
def setActiveMode(self, active_mode):
def setActiveMode(self, active_mode: int) -> None:
if active_mode == 0:
self._active_mode = i18n_catalog.i18nc("@title:tab", "Recommended")
else:
self._active_mode = i18n_catalog.i18nc("@title:tab", "Custom")
self.activeModeChanged.emit()
@pyqtProperty(int, notify = hasVisibleSettingsFieldChanged)
def hasVisibleSettingsField(self):
@pyqtProperty(bool, notify = hasVisibleSettingsFieldChanged)
def hasVisibleSettingsField(self) -> bool:
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.hasVisibleSettingsFieldChanged.emit()
@pyqtProperty(int, constant = True)
def totalNumberOfSettings(self):
def totalNumberOfSettings(self) -> int:
general_definition_containers = ContainerRegistry.getInstance().findDefinitionContainers(id = "fdmprinter")
if not general_definition_containers:
return 0
return len(general_definition_containers[0].getAllKeys())
@pyqtProperty(int, notify = numVisibleSettingsChanged)
def numVisibleSettings(self):
def numVisibleSettings(self) -> int:
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:
self._num_visible_settings = num_visible_settings
self.numVisibleSettingsChanged.emit()
@pyqtProperty(bool, notify = machineConflictChanged)
def machineConflict(self):
def machineConflict(self) -> bool:
return self._has_machine_conflict
@pyqtProperty(bool, notify=qualityChangesConflictChanged)
def qualityChangesConflict(self):
def qualityChangesConflict(self) -> bool:
return self._has_quality_changes_conflict
@pyqtProperty(bool, notify=materialConflictChanged)
def materialConflict(self):
def materialConflict(self) -> bool:
return self._has_material_conflict
@pyqtSlot(str, str)
def setResolveStrategy(self, key, strategy):
def setResolveStrategy(self, key: str, strategy: Optional[str]) -> None:
if key in self._result:
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()
def closeBackend(self):
def closeBackend(self) -> None:
"""Close the backend: otherwise one could end up with "Slicing..."""
Application.getInstance().getBackend().close()
def setMaterialConflict(self, material_conflict):
def setMaterialConflict(self, material_conflict: bool) -> None:
if self._has_material_conflict != material_conflict:
self._has_material_conflict = material_conflict
self.materialConflictChanged.emit()
def setMachineConflict(self, machine_conflict):
def setMachineConflict(self, machine_conflict: bool) -> None:
if self._has_machine_conflict != machine_conflict:
self._has_machine_conflict = machine_conflict
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:
self._has_quality_changes_conflict = quality_changes_conflict
self.qualityChangesConflictChanged.emit()
def getResult(self):
if "machine" in self._result and not self._has_machine_conflict:
def getResult(self) -> Dict[str, Optional[str]]:
if "machine" in self._result and self.updatableMachinesModel.count <= 1:
self._result["machine"] = None
if "quality_changes" in self._result and not self._has_quality_changes_conflict:
self._result["quality_changes"] = None
@ -267,11 +291,13 @@ class WorkspaceDialog(QObject):
return self._result
def _createViewFromQML(self):
path = os.path.join(PluginRegistry.getInstance().getPluginPath("3MFReader"), self._qml_url)
self._view = Application.getInstance().createQmlComponent(path, {"manager": self})
def _createViewFromQML(self) -> None:
three_mf_reader_path = PluginRegistry.getInstance().getPluginPath("3MFReader")
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.
if threading.current_thread() != threading.main_thread():
self._lock.acquire()
@ -284,7 +310,7 @@ class WorkspaceDialog(QObject):
self.showDialogSignal.emit()
@pyqtSlot()
def notifyClosed(self):
def notifyClosed(self) -> None:
"""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
@ -294,7 +320,7 @@ class WorkspaceDialog(QObject):
except:
pass
def hide(self):
def hide(self) -> None:
self._visible = False
self._view.hide()
try:
@ -303,7 +329,7 @@ class WorkspaceDialog(QObject):
pass
@pyqtSlot(bool)
def _onVisibilityChanged(self, visible):
def _onVisibilityChanged(self, visible: bool) -> None:
if not visible:
try:
self._lock.release()
@ -311,17 +337,17 @@ class WorkspaceDialog(QObject):
pass
@pyqtSlot()
def onOkButtonClicked(self):
def onOkButtonClicked(self) -> None:
self._view.hide()
self.hide()
@pyqtSlot()
def onCancelButtonClicked(self):
def onCancelButtonClicked(self) -> None:
self._result = {}
self._view.hide()
self.hide()
def waitForClose(self):
def waitForClose(self) -> None:
"""Block thread until the dialog is closed."""
if self._visible:
@ -334,7 +360,7 @@ class WorkspaceDialog(QObject):
time.sleep(1 / 50)
QCoreApplication.processEvents() # Ensure that the GUI does not freeze.
def __show(self):
def __show(self) -> None:
if self._view is None:
self._createViewFromQML()
if self._view:

View File

@ -2,7 +2,7 @@
// Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.10
import QtQuick.Controls 1.4
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
import QtQuick.Window 2.2
@ -20,6 +20,7 @@ UM.Dialog
property int comboboxHeight: 15 * screenScaleFactor
property int spacerHeight: 10 * screenScaleFactor
property int doubleSpacerHeight: 20 * screenScaleFactor
onClosing: manager.notifyClosed()
onVisibleChanged:
@ -35,7 +36,7 @@ UM.Dialog
Item
{
anchors.fill: parent
anchors.margins: 20 * screenScaleFactor
anchors.margins: 10 * screenScaleFactor
UM.I18nCatalog
{
@ -79,7 +80,7 @@ UM.Dialog
}
Item // Spacer
{
height: spacerHeight
height: doubleSpacerHeight
width: height
}
@ -101,35 +102,53 @@ UM.Dialog
}
UM.TooltipArea
{
id: machineResolveTooltip
id: machineResolveStrategyTooltip
width: (parent.width / 3) | 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?")
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
model: manager.updatableMachinesModel
visible: machineResolveStrategyTooltip.visible
textRole: "displayName"
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
}
}
}
}
@ -168,7 +187,7 @@ UM.Dialog
Item // Spacer
{
height: spacerHeight
height: doubleSpacerHeight
width: height
}
Row
@ -271,7 +290,7 @@ UM.Dialog
}
Item // Spacer
{
height: spacerHeight
height: doubleSpacerHeight
width: height
}
Row
@ -333,7 +352,7 @@ UM.Dialog
Item // Spacer
{
height: spacerHeight
height: doubleSpacerHeight
width: height
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides support for reading 3MF files.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -136,7 +136,17 @@ class ThreeMFWorkspaceWriter(WorkspaceWriter):
file_in_archive.compress_type = zipfile.ZIP_DEFLATED
# Do not include the network authentication keys
ignore_keys = {"network_authentication_id", "network_authentication_key", "octoprint_api_key"}
ignore_keys = {
"um_cloud_cluster_id",
"um_network_key",
"um_linked_to_account",
"removal_warning",
"host_guid",
"group_name",
"group_size",
"connection_type",
"octoprint_api_key"
}
serialized_data = container.serialize(ignored_metadata_keys = ignore_keys)
archive.writestr(file_in_archive, serialized_data)

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides support for writing 3MF files.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,5 +3,5 @@
"author": "fieldOfView",
"version": "1.0.0",
"description": "Provides support for reading AMF files.",
"api": "7.2.0"
"api": "7.3.0"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"description": "Backup and restore your configuration.",
"version": "1.2.0",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -2,7 +2,7 @@
"name": "CuraEngine Backend",
"author": "Ultimaker B.V.",
"description": "Provides the link to the CuraEngine slicing backend.",
"api": "7.2.0",
"api": "7.3.0",
"version": "1.0.1",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides support for importing Cura profiles.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides support for exporting Cura profiles.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog":"cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Checks for firmware updates.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides a machine actions for updating firmware.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Reads g-code from a compressed archive.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Writes g-code to a compressed archive.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -1,7 +1,7 @@
# Copyright (c) 2018 Ultimaker B.V.
# Copyright (c) 2020 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
import re #Regular expressions for parsing escape characters in the settings.
import re # Regular expressions for parsing escape characters in the settings.
import json
from typing import Optional
@ -9,9 +9,10 @@ from UM.Settings.ContainerFormatError import ContainerFormatError
from UM.Settings.InstanceContainer import InstanceContainer
from UM.Logger import Logger
from UM.i18n import i18nCatalog
from cura.ReaderWriters.ProfileReader import ProfileReader, NoProfileException
catalog = i18nCatalog("cura")
from cura.ReaderWriters.ProfileReader import ProfileReader, NoProfileException
class GCodeProfileReader(ProfileReader):
"""A class that reads profile data from g-code files.
@ -29,9 +30,9 @@ class GCodeProfileReader(ProfileReader):
"""
escape_characters = {
re.escape("\\\\"): "\\", #The escape character.
re.escape("\\n"): "\n", #Newlines. They break off the comment.
re.escape("\\r"): "\r" #Carriage return. Windows users may need this for visualisation in their editors.
re.escape("\\\\"): "\\", # The escape character.
re.escape("\\n"): "\n", # Newlines. They break off the comment.
re.escape("\\r"): "\r" # Carriage return. Windows users may need this for visualisation in their editors.
}
"""Dictionary that defines how characters are escaped when embedded in
@ -41,11 +42,6 @@ class GCodeProfileReader(ProfileReader):
not.
"""
def __init__(self):
"""Initialises the g-code reader as a profile reader."""
super().__init__()
def read(self, file_name):
"""Reads a g-code file, loading the profile from it.
@ -54,6 +50,7 @@ class GCodeProfileReader(ProfileReader):
specified file was no g-code or contained no parsable profile,
None is returned.
"""
Logger.log("i", "Attempting to read a profile from the g-code")
if file_name.split(".")[-1] != "gcode":
return None
@ -70,7 +67,7 @@ class GCodeProfileReader(ProfileReader):
for line in f:
if line.startswith(prefix):
# Remove the prefix and the newline from the line and add it to the rest.
serialized += line[prefix_length : -1]
serialized += line[prefix_length: -1]
except IOError as e:
Logger.log("e", "Unable to open file %s for reading: %s", file_name, str(e))
return None
@ -79,10 +76,10 @@ class GCodeProfileReader(ProfileReader):
serialized = serialized.strip()
if not serialized:
Logger.log("i", "No custom profile to import from this g-code: %s", file_name)
Logger.log("w", "No custom profile to import from this g-code: %s", file_name)
raise NoProfileException()
# serialized data can be invalid JSON
# Serialized data can be invalid JSON
try:
json_data = json.loads(serialized)
except Exception as e:

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides support for importing profiles from g-code files.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Victor Larchenko, Ultimaker B.V.",
"version": "1.0.1",
"description": "Allows loading and displaying G-code files.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Writes g-code to a file.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Enables ability to generate printable geometry from 2D image files.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides support for importing profiles from legacy Cura versions.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "fieldOfView, Ultimaker B.V.",
"version": "1.0.1",
"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"
}

View File

@ -2,7 +2,7 @@
"name": "Model Checker",
"author": "Ultimaker B.V.",
"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.",
"i18n-catalog": "cura"
}

View File

@ -136,7 +136,7 @@ Rectangle
{
id: externalLinkIcon
anchors.verticalCenter: parent.verticalCenter
color: UM.Theme.getColor("monitor_text_link")
color: UM.Theme.getColor("text_link")
source: UM.Theme.getIcon("external_link")
width: UM.Theme.getSize("monitor_external_link_icon").width
height: UM.Theme.getSize("monitor_external_link_icon").height
@ -150,9 +150,8 @@ Rectangle
leftMargin: UM.Theme.getSize("narrow_margin").width
verticalCenter: externalLinkIcon.verticalCenter
}
color: UM.Theme.getColor("monitor_text_link")
color: UM.Theme.getColor("text_link")
font: UM.Theme.getFont("medium")
linkColor: UM.Theme.getColor("monitor_text_link")
text: catalog.i18nc("@label link to technical assistance", "View user manuals online")
renderType: Text.NativeRendering
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides a monitor stage in Cura.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides the Per Model Settings.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -2,7 +2,7 @@
"name": "Post Processing",
"author": "Ultimaker",
"version": "2.2.1",
"api": "7.2.0",
"api": "7.3.0",
"description": "Extension that allows for user created scripts for post processing",
"catalog": "cura"
}

View File

@ -1101,7 +1101,7 @@ class ChangeAtZProcessor:
# if it's not a linear move, we don't care
if linear_command is None:
return
return line
# get our linear move parameters
feed_rate = linear_command.Arguments["F"]
@ -1120,6 +1120,7 @@ class ChangeAtZProcessor:
new_line = self.processRetractFeedRate(extrude_length, feed_rate, new_line, x_coord, y_coord, z_coord)
# handle print speed adjustments
if extrude_length is not None: # Only for extrusion moves.
new_line = self.processPrintSpeed(feed_rate, new_line)
# set our current extrude position

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides a prepare stage in Cura.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides a preview stage in Cura.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -79,7 +79,7 @@ class RemovableDriveOutputDevice(OutputDevice):
if extension: # Not empty string.
extension = "." + extension
file_name = os.path.join(self.getId(), os.path.splitext(file_name)[0] + extension)
file_name = os.path.join(self.getId(), file_name + extension)
try:
Logger.log("d", "Writing to %s", file_name)

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"description": "Provides removable drive hotplugging and writing support.",
"version": "1.0.1",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.0",
"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"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides the Simulation view.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Submits anonymous slice info. Can be disabled through preferences.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides a normal solid mesh view.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"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"
}

View File

@ -2,6 +2,6 @@
"name": "Toolbox",
"author": "Ultimaker B.V.",
"version": "1.0.1",
"api": "7.2.0",
"api": "7.3.0",
"description": "Find, manage and install new Cura packages."
}

View File

@ -48,7 +48,15 @@ Item
onClicked:
{
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
{

View File

@ -24,7 +24,7 @@ Rectangle
Label
{
id: heading
text: catalog.i18nc("@label", "Featured")
text: catalog.i18nc("@label", "Premium")
width: contentWidth
height: contentHeight
color: UM.Theme.getColor("text_medium")

View File

@ -33,7 +33,7 @@ Item
width: UM.Theme.getSize("toolbox_thumbnail_medium").width
height: UM.Theme.getSize("toolbox_thumbnail_medium").height
fillMode: Image.PreserveAspectFit
source: details.icon_url || "../../images/placeholder.svg"
source: details && details.icon_url ? details.icon_url : "../../images/placeholder.svg"
mipmap: true
anchors
{
@ -56,8 +56,9 @@ Item
rightMargin: UM.Theme.getSize("wide_margin").width
bottomMargin: UM.Theme.getSize("default_margin").height
}
text: details.name || ""
text: details && details.name ? details.name : ""
font: UM.Theme.getFont("large_bold")
color: UM.Theme.getColor("text_medium")
wrapMode: Text.WordWrap
width: parent.width
height: UM.Theme.getSize("toolbox_property_label").height
@ -66,8 +67,9 @@ Item
Label
{
id: description
text: details.description || ""
text: details && details.description ? details.description : ""
font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text_medium")
anchors
{
top: title.bottom
@ -121,7 +123,7 @@ Item
{
text:
{
if (details.website)
if (details && details.website)
{
return "<a href=\"" + details.website + "\">" + details.website + "</a>"
}
@ -140,7 +142,7 @@ Item
{
text:
{
if (details.email)
if (details && details.email)
{
return "<a href=\"mailto:" + details.email + "\">" + details.email + "</a>"
}

View File

@ -100,7 +100,7 @@ Item
}
Label
{
text: catalog.i18nc("@label", "Author") + ":"
text: catalog.i18nc("@label", "Brand") + ":"
font: UM.Theme.getFont("default")
color: UM.Theme.getColor("text_medium")
renderType: Text.NativeRendering

View File

@ -4,6 +4,7 @@
import QtQuick 2.10
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
import UM 1.3 as UM
Rectangle
{
@ -14,6 +15,7 @@ Rectangle
Label
{
text: catalog.i18nc("@info", "Fetching packages...")
color: UM.Theme.getColor("text")
anchors
{
centerIn: parent

View File

@ -145,7 +145,7 @@ class CloudPackageChecker(QObject):
sync_message.addAction("sync",
name = self._i18n_catalog.i18nc("@action:button", "Sync"),
icon = "",
description = "Sync your Cloud subscribed packages to your local environment.",
description = "Sync your plugins and print profiles to Ultimaker Cura.",
button_align = Message.ActionButtonAlignment.ALIGN_RIGHT)
sync_message.actionTriggered.connect(self._onSyncButtonClicked)
sync_message.show()

View File

@ -3,5 +3,5 @@
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Provides support for reading model files.",
"api": "7.2.0"
"api": "7.3.0"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Provides support for reading Ultimaker Format Packages.",
"supported_sdk_versions": ["7.2.0"],
"supported_sdk_versions": ["7.3.0"],
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides support for writing Ultimaker Format Packages.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"description": "Manages network connections to Ultimaker networked printers.",
"version": "2.0.0",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -149,9 +149,8 @@ Item
{
id: managePrinterText
anchors.verticalCenter: managePrinterLink.verticalCenter
color: UM.Theme.getColor("monitor_text_link")
color: UM.Theme.getColor("text_link")
font: UM.Theme.getFont("default")
linkColor: UM.Theme.getColor("monitor_text_link")
text: catalog.i18nc("@label link to Connect and Cloud interfaces", "Manage printer")
renderType: Text.NativeRendering
}
@ -164,7 +163,7 @@ Item
leftMargin: 6 * screenScaleFactor
verticalCenter: managePrinterText.verticalCenter
}
color: UM.Theme.getColor("monitor_text_link")
color: UM.Theme.getColor("text_link")
source: UM.Theme.getIcon("external_link")
width: 12 * screenScaleFactor
height: 12 * screenScaleFactor

View File

@ -47,7 +47,7 @@ Item
{
id: externalLinkIcon
anchors.verticalCenter: manageQueueLabel.verticalCenter
color: UM.Theme.getColor("monitor_text_link")
color: UM.Theme.getColor("text_link")
source: UM.Theme.getIcon("external_link")
width: 16 * screenScaleFactor // TODO: Theme! (Y U NO USE 18 LIKE ALL OTHER ICONS?!)
height: 16 * screenScaleFactor // TODO: Theme! (Y U NO USE 18 LIKE ALL OTHER ICONS?!)
@ -61,9 +61,8 @@ Item
leftMargin: 6 * screenScaleFactor // TODO: Theme!
verticalCenter: externalLinkIcon.verticalCenter
}
color: UM.Theme.getColor("monitor_text_link")
color: UM.Theme.getColor("text_link")
font: UM.Theme.getFont("medium") // 14pt, regular
linkColor: UM.Theme.getColor("monitor_text_link")
text: catalog.i18nc("@label link to connect manager", "Manage in browser")
renderType: Text.NativeRendering
}

View File

@ -145,9 +145,9 @@ class CloudOutputDevice(UltimakerNetworkedPrinterOutputDevice):
"""Set all the interface elements and texts for this output device."""
self.setPriority(2) # Make sure we end up below the local networking and above 'save to file'.
self.setShortDescription(I18N_CATALOG.i18nc("@action:button", "Print via Cloud"))
self.setDescription(I18N_CATALOG.i18nc("@properties:tooltip", "Print via Cloud"))
self.setConnectionText(I18N_CATALOG.i18nc("@info:status", "Connected via Cloud"))
self.setShortDescription(I18N_CATALOG.i18nc("@action:button", "Print via cloud"))
self.setDescription(I18N_CATALOG.i18nc("@properties:tooltip", "Print via cloud"))
self.setConnectionText(I18N_CATALOG.i18nc("@info:status", "Connected via cloud"))
def _update(self) -> None:
"""Called when the network data should be updated."""

View File

@ -262,7 +262,7 @@ class CloudOutputDeviceManager:
message_text = self.I18N_CATALOG.i18nc(
"info:status",
"Cloud printers added from your account:<ul>{}</ul>",
"Printers added from Digital Factory:<ul>{}</ul>",
device_names
)
message.setText(message_text)
@ -291,7 +291,6 @@ class CloudOutputDeviceManager:
del self._remote_clusters[old_cluster_id]
self._remote_clusters[new_cloud_output_device.key] = new_cloud_output_device
def _devicesRemovedFromAccount(self, removed_device_ids: Set[str]) -> None:
"""
Removes the CloudOutputDevice from the received device ids and marks the specific printers as "removed from
@ -321,34 +320,35 @@ class CloudOutputDeviceManager:
self._removed_printers_message = Message(
title = self.I18N_CATALOG.i18ncp(
"info:status",
"Cloud connection is not available for a printer",
"Cloud connection is not available for some printers",
"A cloud connection is not available for a printer",
"A cloud connection is not available for some printers",
len(self.reported_device_ids)
)
)
device_names = "\n".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(
"info:status",
"The following cloud printer is not linked to your account:\n",
"The following cloud printers are not linked to your account:\n",
"This printer is not linked to the Digital Factory:",
"These printers are not linked to the Digital Factory:",
len(self.reported_device_ids)
)
message_text += "<br/><ul>{}</ul><br/>".format(device_names)
digital_factory_string = self.I18N_CATALOG.i18nc("info:name", "Ultimaker Digital Factory")
message_text += self.I18N_CATALOG.i18nc(
"info:status",
"<ul>{}</ul>\nTo establish a connection, please visit the "
"<a href='https://mycloud.ultimaker.com/'>Ultimaker Digital Factory</a>.",
device_names
"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.addAction("keep_printer_configurations_action",
name = self.I18N_CATALOG.i18nc("@action:button", "Keep printer configurations"),
icon = "",
description = "Keep the configuration of the cloud printer(s) synced with Cura which are not linked to your account.",
description = "Keep cloud printers in Ultimaker Cura when not connected to your account.",
button_align = Message.ActionButtonAlignment.ALIGN_RIGHT)
self._removed_printers_message.addAction("remove_printers_action",
name = self.I18N_CATALOG.i18nc("@action:button", "Remove printers"),
icon = "",
description = "Remove the cloud printer(s) which are not linked to your account.",
description = "Remove cloud printer(s) which aren't linked to your account.",
button_style = Message.ActionButtonStyle.SECONDARY,
button_align = Message.ActionButtonAlignment.ALIGN_LEFT)
self._removed_printers_message.actionTriggered.connect(self._onRemovedPrintersMessageActionTriggered)
@ -423,13 +423,17 @@ class CloudOutputDeviceManager:
machine.setMetaDataEntry(self.META_HOST_GUID, device.clusterData.host_guid)
machine.setMetaDataEntry("group_name", device.name)
machine.setMetaDataEntry("group_size", device.clusterSize)
machine.setMetaDataEntry("removal_warning", self.I18N_CATALOG.i18nc(
"@label ({} is printer name)",
"{} 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?",
device.name, device.name, device.name
))
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)
removal_warning_string = self.I18N_CATALOG.i18nc(
"@label ({printer_name} is replaced with the name of the printer",
"{printer_name} will be removed until the next account sync. <br> To remove {printer_name} permanently, "
"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.addConfiguredConnectionType(device.connectionType.value)
def _connectToOutputDevice(self, device: CloudOutputDevice, machine: GlobalStack) -> None:

View File

@ -30,7 +30,7 @@ class CloudFlowMessage(Message):
option_state=False,
image_source=QUrl.fromLocalFile(image_path),
image_caption=I18N_CATALOG.i18nc("@info:status Ultimaker Cloud should not be translated.",
"Connect to Ultimaker Cloud"),
"Connect to Ultimaker Digital Factory"),
)
self._address = address
self.addAction("", I18N_CATALOG.i18nc("@action", "Get started"), "", "")

View File

@ -2,7 +2,7 @@
"name": "USB printing",
"author": "Ultimaker B.V.",
"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.",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"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"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Upgrades configurations from Cura 2.1 to Cura 2.2.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Upgrades configurations from Cura 2.2 to Cura 2.4.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Upgrades configurations from Cura 2.5 to Cura 2.6.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Upgrades configurations from Cura 2.6 to Cura 2.7.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Upgrades configurations from Cura 2.7 to Cura 3.0.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Upgrades configurations from Cura 3.0 to Cura 3.1.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Upgrades configurations from Cura 3.2 to Cura 3.3.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Upgrades configurations from Cura 3.3 to Cura 3.4.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Upgrades configurations from Cura 3.4 to Cura 3.5.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 3.5 to Cura 4.0.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Upgrades configurations from Cura 4.0 to Cura 4.1.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 4.1 to Cura 4.2.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 4.2 to Cura 4.3.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 4.3 to Cura 4.4.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 4.4 to Cura 4.5.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 4.5 to Cura 4.6.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -25,6 +25,7 @@ _removed_settings = {
"support_tree_enable"
} # type: Set[str]
class VersionUpgrade462to47(VersionUpgrade):
def upgradePreferences(self, serialized: str, filename: str) -> Tuple[List[str], List[str]]:
"""

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.0",
"description": "Upgrades configurations from Cura 4.6.2 to Cura 4.7.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Seva Alekseyev, Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides support for reading X3D files.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides the X-Ray view.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -3,6 +3,6 @@
"author": "Ultimaker B.V.",
"version": "1.0.1",
"description": "Provides capabilities to read and write XML-based material profiles.",
"api": "7.2.0",
"api": "7.3.0",
"i18n-catalog": "cura"
}

View File

@ -6,7 +6,7 @@
"display_name": "3MF Reader",
"description": "Provides support for reading 3MF files.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -23,7 +23,7 @@
"display_name": "3MF Writer",
"description": "Provides support for writing 3MF files.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -40,7 +40,7 @@
"display_name": "AMF Reader",
"description": "Provides support for reading AMF files.",
"package_version": "1.0.0",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "fieldOfView",
@ -57,7 +57,7 @@
"display_name": "Cura Backups",
"description": "Backup and restore your configuration.",
"package_version": "1.2.0",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -74,7 +74,7 @@
"display_name": "CuraEngine Backend",
"description": "Provides the link to the CuraEngine slicing backend.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -91,7 +91,7 @@
"display_name": "Cura Profile Reader",
"description": "Provides support for importing Cura profiles.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -108,7 +108,7 @@
"display_name": "Cura Profile Writer",
"description": "Provides support for exporting Cura profiles.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -125,7 +125,7 @@
"display_name": "Firmware Update Checker",
"description": "Checks for firmware updates.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -142,7 +142,7 @@
"display_name": "Firmware Updater",
"description": "Provides a machine actions for updating firmware.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -159,7 +159,7 @@
"display_name": "Compressed G-code Reader",
"description": "Reads g-code from a compressed archive.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -176,7 +176,7 @@
"display_name": "Compressed G-code Writer",
"description": "Writes g-code to a compressed archive.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -193,7 +193,7 @@
"display_name": "G-Code Profile Reader",
"description": "Provides support for importing profiles from g-code files.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -210,7 +210,7 @@
"display_name": "G-Code Reader",
"description": "Allows loading and displaying G-code files.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "VictorLarchenko",
@ -227,7 +227,7 @@
"display_name": "G-Code Writer",
"description": "Writes g-code to a file.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -244,7 +244,7 @@
"display_name": "Image Reader",
"description": "Enables ability to generate printable geometry from 2D image files.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -261,7 +261,7 @@
"display_name": "Legacy Cura Profile Reader",
"description": "Provides support for importing profiles from legacy Cura versions.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -278,7 +278,7 @@
"display_name": "Machine Settings Action",
"description": "Provides a way to change machine settings (such as build volume, nozzle size, etc.).",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "fieldOfView",
@ -295,7 +295,7 @@
"display_name": "Model Checker",
"description": "Checks models and print configuration for possible printing issues and give suggestions.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -312,7 +312,7 @@
"display_name": "Monitor Stage",
"description": "Provides a monitor stage in Cura.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -329,7 +329,7 @@
"display_name": "Per-Object Settings Tool",
"description": "Provides the per-model settings.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -346,7 +346,7 @@
"display_name": "Post Processing",
"description": "Extension that allows for user created scripts for post processing.",
"package_version": "2.2.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -363,7 +363,7 @@
"display_name": "Prepare Stage",
"description": "Provides a prepare stage in Cura.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -380,7 +380,7 @@
"display_name": "Preview Stage",
"description": "Provides a preview stage in Cura.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -397,7 +397,7 @@
"display_name": "Removable Drive Output Device",
"description": "Provides removable drive hotplugging and writing support.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -414,7 +414,7 @@
"display_name": "Sentry Logger",
"description": "Logs certain events so that they can be used by the crash reporter",
"package_version": "1.0.0",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -431,7 +431,7 @@
"display_name": "Simulation View",
"description": "Provides the Simulation view.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -448,7 +448,7 @@
"display_name": "Slice Info",
"description": "Submits anonymous slice info. Can be disabled through preferences.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -465,7 +465,7 @@
"display_name": "Solid View",
"description": "Provides a normal solid mesh view.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -482,7 +482,7 @@
"display_name": "Support Eraser Tool",
"description": "Creates an eraser mesh to block the printing of support in certain places.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -499,7 +499,7 @@
"display_name": "Trimesh Reader",
"description": "Provides support for reading model files.",
"package_version": "1.0.0",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -516,7 +516,7 @@
"display_name": "Toolbox",
"description": "Find, manage and install new Cura packages.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -533,7 +533,7 @@
"display_name": "UFP Reader",
"description": "Provides support for reading Ultimaker Format Packages.",
"package_version": "1.0.0",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -550,7 +550,7 @@
"display_name": "UFP Writer",
"description": "Provides support for writing Ultimaker Format Packages.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -567,7 +567,7 @@
"display_name": "Ultimaker Machine Actions",
"description": "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.).",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -584,7 +584,7 @@
"display_name": "UM3 Network Printing",
"description": "Manages network connections to Ultimaker 3 printers.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -601,7 +601,7 @@
"display_name": "USB Printing",
"description": "Accepts G-Code and sends them to a printer. Plugin can also update firmware.",
"package_version": "1.0.2",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -618,7 +618,7 @@
"display_name": "Version Upgrade 2.1 to 2.2",
"description": "Upgrades configurations from Cura 2.1 to Cura 2.2.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -635,7 +635,7 @@
"display_name": "Version Upgrade 2.2 to 2.4",
"description": "Upgrades configurations from Cura 2.2 to Cura 2.4.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -652,7 +652,7 @@
"display_name": "Version Upgrade 2.5 to 2.6",
"description": "Upgrades configurations from Cura 2.5 to Cura 2.6.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -669,7 +669,7 @@
"display_name": "Version Upgrade 2.6 to 2.7",
"description": "Upgrades configurations from Cura 2.6 to Cura 2.7.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -686,7 +686,7 @@
"display_name": "Version Upgrade 2.7 to 3.0",
"description": "Upgrades configurations from Cura 2.7 to Cura 3.0.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -703,7 +703,7 @@
"display_name": "Version Upgrade 3.0 to 3.1",
"description": "Upgrades configurations from Cura 3.0 to Cura 3.1.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -720,7 +720,7 @@
"display_name": "Version Upgrade 3.2 to 3.3",
"description": "Upgrades configurations from Cura 3.2 to Cura 3.3.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -737,7 +737,7 @@
"display_name": "Version Upgrade 3.3 to 3.4",
"description": "Upgrades configurations from Cura 3.3 to Cura 3.4.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -754,7 +754,7 @@
"display_name": "Version Upgrade 3.4 to 3.5",
"description": "Upgrades configurations from Cura 3.4 to Cura 3.5.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -771,7 +771,7 @@
"display_name": "Version Upgrade 3.5 to 4.0",
"description": "Upgrades configurations from Cura 3.5 to Cura 4.0.",
"package_version": "1.0.0",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -788,7 +788,7 @@
"display_name": "Version Upgrade 4.0 to 4.1",
"description": "Upgrades configurations from Cura 4.0 to Cura 4.1.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -805,7 +805,7 @@
"display_name": "Version Upgrade 4.1 to 4.2",
"description": "Upgrades configurations from Cura 4.1 to Cura 4.2.",
"package_version": "1.0.0",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -822,7 +822,7 @@
"display_name": "Version Upgrade 4.2 to 4.3",
"description": "Upgrades configurations from Cura 4.2 to Cura 4.3.",
"package_version": "1.0.0",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -839,7 +839,7 @@
"display_name": "Version Upgrade 4.3 to 4.4",
"description": "Upgrades configurations from Cura 4.3 to Cura 4.4.",
"package_version": "1.0.0",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -856,7 +856,7 @@
"display_name": "Version Upgrade 4.4 to 4.5",
"description": "Upgrades configurations from Cura 4.4 to Cura 4.5.",
"package_version": "1.0.0",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -873,7 +873,7 @@
"display_name": "Version Upgrade 4.5 to 4.6",
"description": "Upgrades configurations from Cura 4.5 to Cura 4.6.",
"package_version": "1.0.0",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -890,7 +890,7 @@
"display_name": "Version Upgrade 4.6.0 to 4.6.2",
"description": "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2.",
"package_version": "1.0.0",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -907,7 +907,7 @@
"display_name": "Version Upgrade 4.6.2 to 4.7",
"description": "Upgrades configurations from Cura 4.6.2 to Cura 4.7.",
"package_version": "1.0.0",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -924,7 +924,7 @@
"display_name": "X3D Reader",
"description": "Provides support for reading X3D files.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "SevaAlekseyev",
@ -941,7 +941,7 @@
"display_name": "XML Material Profiles",
"description": "Provides capabilities to read and write XML-based material profiles.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -958,7 +958,7 @@
"display_name": "X-Ray View",
"description": "Provides the X-Ray view.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com",
"author": {
"author_id": "UltimakerPackages",
@ -975,7 +975,7 @@
"display_name": "Generic ABS",
"description": "The generic ABS profile which other profiles can be based upon.",
"package_version": "1.2.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -993,7 +993,7 @@
"display_name": "Generic BAM",
"description": "The generic BAM profile which other profiles can be based upon.",
"package_version": "1.2.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -1011,7 +1011,7 @@
"display_name": "Generic CFF CPE",
"description": "The generic CFF CPE profile which other profiles can be based upon.",
"package_version": "1.1.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -1029,7 +1029,7 @@
"display_name": "Generic CFF PA",
"description": "The generic CFF PA profile which other profiles can be based upon.",
"package_version": "1.1.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -1047,7 +1047,7 @@
"display_name": "Generic CPE",
"description": "The generic CPE profile which other profiles can be based upon.",
"package_version": "1.2.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -1065,7 +1065,7 @@
"display_name": "Generic CPE+",
"description": "The generic CPE+ profile which other profiles can be based upon.",
"package_version": "1.2.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -1083,7 +1083,7 @@
"display_name": "Generic GFF CPE",
"description": "The generic GFF CPE profile which other profiles can be based upon.",
"package_version": "1.1.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -1101,7 +1101,7 @@
"display_name": "Generic GFF PA",
"description": "The generic GFF PA profile which other profiles can be based upon.",
"package_version": "1.1.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -1119,7 +1119,7 @@
"display_name": "Generic HIPS",
"description": "The generic HIPS profile which other profiles can be based upon.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -1137,7 +1137,7 @@
"display_name": "Generic Nylon",
"description": "The generic Nylon profile which other profiles can be based upon.",
"package_version": "1.2.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -1155,7 +1155,7 @@
"display_name": "Generic PC",
"description": "The generic PC profile which other profiles can be based upon.",
"package_version": "1.2.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -1173,7 +1173,7 @@
"display_name": "Generic PETG",
"description": "The generic PETG profile which other profiles can be based upon.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -1191,7 +1191,7 @@
"display_name": "Generic PLA",
"description": "The generic PLA profile which other profiles can be based upon.",
"package_version": "1.2.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -1209,7 +1209,7 @@
"display_name": "Generic PP",
"description": "The generic PP profile which other profiles can be based upon.",
"package_version": "1.2.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -1227,7 +1227,7 @@
"display_name": "Generic PVA",
"description": "The generic PVA profile which other profiles can be based upon.",
"package_version": "1.2.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -1245,7 +1245,7 @@
"display_name": "Generic Tough PLA",
"description": "The generic Tough PLA profile which other profiles can be based upon.",
"package_version": "1.0.2",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -1263,7 +1263,7 @@
"display_name": "Generic TPU",
"description": "The generic TPU profile which other profiles can be based upon.",
"package_version": "1.2.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://github.com/Ultimaker/fdm_materials",
"author": {
"author_id": "Generic",
@ -1281,7 +1281,7 @@
"display_name": "Dagoma Chromatik PLA",
"description": "Filament testé et approuvé pour les imprimantes 3D Dagoma. Chromatik est l'idéal pour débuter et suivre les tutoriels premiers pas. Il vous offre qualité et résistance pour chacune de vos impressions.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://dagoma.fr/boutique/filaments.html",
"author": {
"author_id": "Dagoma",
@ -1298,7 +1298,7 @@
"display_name": "FABtotum ABS",
"description": "This material is easy to be extruded but it is not the simplest to use. It is one of the most used in 3D printing to get very well finished objects. It is not sustainable and its smoke can be dangerous if inhaled. The reason to prefer this filament to PLA is mainly because of its precision and mechanical specs. ABS (for plastic) stands for Acrylonitrile Butadiene Styrene and it is a thermoplastic which is widely used in everyday objects. It can be printed with any FFF 3D printer which can get to high temperatures as it must be extruded in a range between 220° and 245°, so its compatible with all versions of the FABtotum Personal fabricator.",
"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",
"author": {
"author_id": "FABtotum",
@ -1315,7 +1315,7 @@
"display_name": "FABtotum Nylon",
"description": "When 3D printing started this material was not listed among the extrudable filaments. It is flexible as well as resistant to tractions. It is well known for its uses in textile but also in industries which require a strong and flexible material. There are different kinds of Nylon: 3D printing mostly uses Nylon 6 and Nylon 6.6, which are the most common. It requires higher temperatures to be printed, so a 3D printer must be able to reach them (around 240°C): the FABtotum, of course, can.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=53",
"author": {
"author_id": "FABtotum",
@ -1332,7 +1332,7 @@
"display_name": "FABtotum PLA",
"description": "It is the most common filament used for 3D printing. It is studied to be bio-degradable as it comes from corn starchs 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 FABtotums one is between 185° and 195°.",
"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",
"author": {
"author_id": "FABtotum",
@ -1349,7 +1349,7 @@
"display_name": "FABtotum TPU Shore 98A",
"description": "",
"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",
"author": {
"author_id": "FABtotum",
@ -1366,7 +1366,7 @@
"display_name": "Fiberlogy HD PLA",
"description": "With our HD PLA you have many more options. You can use this material in two ways. Choose the one you like best. You can use it as a normal PLA and get prints characterized by a very good adhesion between the layers and high precision. You can also make your prints acquire similar properties to that of ABS better impact resistance and high temperature resistance. All you need is an oven. Yes, an oven! By annealing our HD PLA in an oven, in accordance with the manual, you will avoid all the inconveniences of printing with ABS, such as unpleasant odour or hazardous fumes.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "http://fiberlogy.com/en/fiberlogy-filaments/filament-hd-pla/",
"author": {
"author_id": "Fiberlogy",
@ -1383,7 +1383,7 @@
"display_name": "Filo3D PLA",
"description": "Fast, safe and reliable printing. PLA is ideal for the fast and reliable printing of parts and prototypes with a great surface quality.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://dagoma.fr",
"author": {
"author_id": "Dagoma",
@ -1400,7 +1400,7 @@
"display_name": "IMADE3D JellyBOX PETG",
"description": "",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "http://shop.imade3d.com/filament.html",
"author": {
"author_id": "IMADE3D",
@ -1417,7 +1417,7 @@
"display_name": "IMADE3D JellyBOX PLA",
"description": "",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "http://shop.imade3d.com/filament.html",
"author": {
"author_id": "IMADE3D",
@ -1434,7 +1434,7 @@
"display_name": "Octofiber PLA",
"description": "PLA material from Octofiber.",
"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",
"author": {
"author_id": "Octofiber",
@ -1451,7 +1451,7 @@
"display_name": "PolyFlex™ PLA",
"description": "PolyFlex™ is a highly flexible yet easy to print 3D printing material. Featuring good elasticity and a large strain-to- failure, PolyFlex™ opens up a completely new realm of applications.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "http://www.polymaker.com/shop/polyflex/",
"author": {
"author_id": "Polymaker",
@ -1468,7 +1468,7 @@
"display_name": "PolyMax™ PLA",
"description": "PolyMax™ PLA is a 3D printing material with excellent mechanical properties and printing quality. PolyMax™ PLA has an impact resistance of up to nine times that of regular PLA, and better overall mechanical properties than ABS.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "http://www.polymaker.com/shop/polymax/",
"author": {
"author_id": "Polymaker",
@ -1485,7 +1485,7 @@
"display_name": "PolyPlus™ PLA True Colour",
"description": "PolyPlus™ PLA is a premium PLA designed for all desktop FDM/FFF 3D printers. It is produced with our patented Jam-Free™ technology that ensures consistent extrusion and prevents jams.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "http://www.polymaker.com/shop/polyplus-true-colour/",
"author": {
"author_id": "Polymaker",
@ -1502,7 +1502,7 @@
"display_name": "PolyWood™ PLA",
"description": "PolyWood™ is a wood mimic printing material that contains no actual wood ensuring a clean Jam-Free™ printing experience.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "http://www.polymaker.com/shop/polywood/",
"author": {
"author_id": "Polymaker",
@ -1519,7 +1519,7 @@
"display_name": "Ultimaker ABS",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.2",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com/products/materials/abs",
"author": {
"author_id": "UltimakerPackages",
@ -1538,7 +1538,7 @@
"display_name": "Ultimaker Breakaway",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com/products/materials/breakaway",
"author": {
"author_id": "UltimakerPackages",
@ -1557,7 +1557,7 @@
"display_name": "Ultimaker CPE",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.2",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com/products/materials/abs",
"author": {
"author_id": "UltimakerPackages",
@ -1576,7 +1576,7 @@
"display_name": "Ultimaker CPE+",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.2",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com/products/materials/cpe",
"author": {
"author_id": "UltimakerPackages",
@ -1595,7 +1595,7 @@
"display_name": "Ultimaker Nylon",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.2",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com/products/materials/abs",
"author": {
"author_id": "UltimakerPackages",
@ -1614,7 +1614,7 @@
"display_name": "Ultimaker PC",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.2",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com/products/materials/pc",
"author": {
"author_id": "UltimakerPackages",
@ -1633,7 +1633,7 @@
"display_name": "Ultimaker PLA",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.2",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com/products/materials/abs",
"author": {
"author_id": "UltimakerPackages",
@ -1652,7 +1652,7 @@
"display_name": "Ultimaker PP",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.2",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com/products/materials/pp",
"author": {
"author_id": "UltimakerPackages",
@ -1671,7 +1671,7 @@
"display_name": "Ultimaker PVA",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com/products/materials/abs",
"author": {
"author_id": "UltimakerPackages",
@ -1690,7 +1690,7 @@
"display_name": "Ultimaker TPU 95A",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.2.2",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com/products/materials/tpu-95a",
"author": {
"author_id": "UltimakerPackages",
@ -1709,7 +1709,7 @@
"display_name": "Ultimaker Tough PLA",
"description": "Example package for material and quality profiles for Ultimaker materials.",
"package_version": "1.0.3",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://ultimaker.com/products/materials/tough-pla",
"author": {
"author_id": "UltimakerPackages",
@ -1728,7 +1728,7 @@
"display_name": "Vertex Delta ABS",
"description": "ABS material and quality files for the Delta Vertex K8800.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://vertex3dprinter.eu",
"author": {
"author_id": "Velleman",
@ -1745,7 +1745,7 @@
"display_name": "Vertex Delta PET",
"description": "ABS material and quality files for the Delta Vertex K8800.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://vertex3dprinter.eu",
"author": {
"author_id": "Velleman",
@ -1762,7 +1762,7 @@
"display_name": "Vertex Delta PLA",
"description": "ABS material and quality files for the Delta Vertex K8800.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://vertex3dprinter.eu",
"author": {
"author_id": "Velleman",
@ -1779,7 +1779,7 @@
"display_name": "Vertex Delta TPU",
"description": "ABS material and quality files for the Delta Vertex K8800.",
"package_version": "1.0.1",
"sdk_version": "7.2.0",
"sdk_version": "7.3.0",
"website": "https://vertex3dprinter.eu",
"author": {
"author_id": "Velleman",

View File

@ -243,7 +243,7 @@
"support_angle": { "value": "math.floor(math.degrees(math.atan(line_width/2.0/layer_height)))" },
"support_pattern": { "value": "'zigzag'" },
"support_infill_rate": { "value": "0 if support_tree_enable else 20" },
"support_infill_rate": { "value": "0 if support_enable and support_structure == 'tree' else 20" },
"support_use_towers": { "value": false },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View File

@ -0,0 +1,40 @@
{
"version": 2,
"name": "Cubicon Style Neo-A22",
"inherits": "cubicon_common",
"metadata": {
"author": "Cubicon R&D Center",
"manufacturer": "Cubicon",
"visible": true,
"file_formats": "text/x-gcode",
"supports_usb_connection": false,
"machine_extruder_trains": {
"0": "cubicon_style_neo_a22_extruder_0"
},
"platform_offset": [
0,
0,
0
]
},
"overrides": {
"machine_name": {
"default_value": "Cubicon Style Neo-A22"
},
"machine_start_gcode": {
"default_value": "M911 Style Neo-A22\nM201 X400 Y400\nM202 X400 Y400\nG28 ; Home\nG1 Z15.0 F6000 ;move the platform down 15mm\n;Prime the extruder\nG92 E0\nG1 F200 E3\nG92 E0"
},
"machine_width": {
"default_value": 220
},
"machine_depth": {
"default_value": 220
},
"machine_height": {
"default_value": 220
},
"material_bed_temp_wait":{
"default_value": false
}
}
}

View File

@ -0,0 +1,89 @@
{
"version": 2,
"name": "Diytech 220",
"inherits": "fdmprinter",
"metadata": {
"visible": true,
"author": "Venkatkamesh",
"manufacturer": "Sri Vignan Technologies",
"weight": 3,
"file_formats": "text/x-gcode",
"platform": "ultimaker3_platform.obj",
"platform_texture": "svtbacktext.png",
"platform_offset": [0, 0, 0],
"has_materials": true,
"has_variants": true,
"preferred_variant_name": "0.4 mm",
"machine_extruder_trains":
{
"0": "diy220_extruder_0"
}
},
"overrides": {
"machine_name": { "default_value": "Diytech 220" },
"machine_start_gcode" : {
"value": "\"\" if machine_gcode_flavor == \"UltiGCode\" else \"G21 ;metric values\\nG90 ;absolute positioning\\nM82 ;set extruder to absolute mode\\nM107 ;start with the fan off\\nG28 Z0 ;move Z to bottom endstops\\nG28 X0 Y0 ;move X/Y to endstops\\nG1 X15 Y0 F4000 ;move X/Y to front of printer\\nG1 Z15.0 F9000 ;move the platform to 15mm\\nG92 E0 ;zero the extruded length\\nG1 F200 E50 ;extrude 10 mm of feed stock\\nG92 E0 ;zero the extruded length again\\nG1 F9000\\n;Put printing message on LCD screen\\nM117 Printing...\""
},
"machine_end_gcode" : {
"value": "\";Version _2.6 of the firmware can abort the print too early if the file ends\\n;too soon. However if the file hasn't ended yet because there are comments at\\n;the end of the file, it won't abort yet. Therefore we have to put at least 512\\n;bytes at the end of the g-code so that the file is not yet finished by the\\n;time that the motion planner gets flushed. With firmware version _3.3 this\\n;should be fixed, so this comment wouldn't be necessary any more. Now we have\\n;to pad this text to make precisely 512 bytes.\" if machine_gcode_flavor == \"UltiGCode\" else \"M104 S0 ;extruder heater off\\nM140 S0 ;heated bed heater off (if you have it)\\nG91 ;relative positioning\\nG1 E-1 F300 ;retract the filament a bit before lifting the nozzle, to release some of the pressure\\nG1 Z+0.5 E-5 X-20 Y-20 F9000 ;move Z up a bit and retract filament even more\\nG28 X0 Y0 ;move X/Y to min endstops, so the head is out of the way\\nM84 ;steppers off\\nG90 ;absolute positioning\\n;Version _2.6 of the firmware can abort the print too early if the file ends\\n;too soon. However if the file hasn't ended yet because there are comments at\\n;the end of the file, it won't abort yet. Therefore we have to put at least 512\\n;bytes at the end of the g-code so that the file is not yet finished by the\\n;time that the motion planner gets flushed. With firmware version _3.3 this\\n;should be fixed, so this comment wouldn't be necessary any more. Now we have\\n;to pad this text to make precisely 512 bytes.\""
},
"machine_width": {
"default_value": 220
},
"machine_depth": {
"default_value": 220
},
"machine_height": {
"default_value": 305
},
"machine_heated_bed": {
"default_value": true
},
"machine_head_with_fans_polygon":
{
"default_value": [
[ -42, 12 ],
[ -42, -32 ],
[ 62, 12 ],
[ 62, -32 ]
]
},
"machine_center_is_zero": {
"default_value": false
},
"gantry_height": {
"value": "48"
},
"machine_use_extruder_offset_to_offset_coords": {
"default_value": true
},
"machine_gcode_flavor": {
"default_value": "Marlin"
},
"machine_disallowed_areas": {
"default_value": [
[[-115, 112.5], [ -82, 112.5], [ -84, 102.5], [-115, 102.5]],
[[ 115, 112.5], [ 115, 102.5], [ 110, 102.5], [ 108, 112.5]],
[[-115, -112.5], [-115, -104.5], [ -84, -104.5], [ -82, -112.5]],
[[ 115, -112.5], [ 108, -112.5], [ 110, -104.5], [ 115, -104.5]]
]},
"machine_nozzle_tip_outer_diameter": {
"default_value": 1
},
"machine_nozzle_head_distance": {
"default_value": 3
},
"machine_max_feedrate_x": {
"default_value": 300
},
"machine_max_feedrate_y": {
"default_value": 300
},
"machine_max_feedrate_z": {
"default_value": 40
},
"machine_acceleration": {
"default_value": 3000
}
}
}

View File

@ -70,7 +70,7 @@
"jerk_print": { "default_value": 10 },
"support_angle": { "default_value": 65 },
"support_brim_enable": { "default_value": true },
"support_brim_enable": { "value": true },
"adhesion_type": { "default_value": "skirt" },
"brim_outside_only": { "default_value": false },

View File

@ -2625,7 +2625,7 @@
"minimum_value": "5",
"minimum_value_warning": "50",
"maximum_value_warning": "150",
"enabled": "support_enable",
"enabled": "support_enable or support_meshes_present",
"limit_to_extruder": "support_infill_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@ -2641,7 +2641,7 @@
"minimum_value": "5",
"minimum_value_warning": "50",
"maximum_value_warning": "150",
"enabled": "support_enable and support_interface_enable",
"enabled": "(support_enable or support_meshes_present) and support_interface_enable",
"limit_to_extruder": "support_interface_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true,
@ -2658,7 +2658,7 @@
"minimum_value": "5",
"minimum_value_warning": "50",
"maximum_value_warning": "150",
"enabled": "support_enable and support_roof_enable",
"enabled": "(support_enable or support_meshes_present) and support_roof_enable",
"limit_to_extruder": "support_roof_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@ -2674,7 +2674,7 @@
"minimum_value": "5",
"minimum_value_warning": "50",
"maximum_value_warning": "150",
"enabled": "support_enable and support_bottom_enable",
"enabled": "(support_enable or support_meshes_present) and support_bottom_enable",
"limit_to_extruder": "support_bottom_extruder_nr",
"settable_per_mesh": false,
"settable_per_extruder": true
@ -4175,14 +4175,14 @@
"support_structure":
{
"label": "Support Structure",
"description": "Generate a tree-like support ",
"description": "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.",
"type": "enum",
"options":
{
"normal": "Normal",
"tree": "Tree"
},
"enabled": "support_enable or support_meshes_present",
"enabled": "support_enable",
"default_value": "normal",
"settable_per_mesh": false,
"settable_per_extruder": false
@ -4413,6 +4413,7 @@
"description": "Generate a brim within the support infill regions of the first layer. This brim is printed underneath the support, not around it. Enabling this setting increases the adhesion of support to the build plate.",
"type": "bool",
"default_value": false,
"value": "support_structure == 'tree'",
"enabled": "support_enable or support_meshes_present",
"limit_to_extruder": "support_infill_extruder_nr",
"settable_per_mesh": false,
@ -4585,7 +4586,7 @@
"limit_to_extruder": "support_infill_extruder_nr",
"minimum_value_warning": "0",
"maximum_value_warning": "10",
"enabled": "support_enable or support_meshes_present",
"enabled": "support_enable and support_structure == 'normal'",
"settable_per_mesh": true
},
"support_offset":
@ -4598,7 +4599,7 @@
"limit_to_extruder": "support_infill_extruder_nr",
"minimum_value_warning": "-1 * machine_nozzle_size",
"maximum_value_warning": "10 * machine_nozzle_size",
"enabled": "support_enable or support_meshes_present",
"enabled": "(support_enable and support_structure == 'normal') or support_meshes_present",
"settable_per_mesh": true
},
"support_infill_sparse_thickness":
@ -4651,7 +4652,7 @@
"default_value": 0.0,
"minimum_value": "0",
"maximum_value_warning": "5",
"enabled": "support_enable or support_meshes_present",
"enabled": "support_enable and support_structure == 'normal'",
"limit_to_extruder": "support_infill_extruder_nr",
"settable_per_mesh": true
},
@ -5048,7 +5049,7 @@
"type": "bool",
"default_value": true,
"limit_to_extruder": "support_infill_extruder_nr",
"enabled": "support_enable",
"enabled": "support_enable and support_structure == 'normal'",
"settable_per_mesh": true
},
"support_tower_diameter":
@ -5062,7 +5063,7 @@
"minimum_value": "0",
"minimum_value_warning": "2 * machine_nozzle_size",
"maximum_value_warning": "20",
"enabled": "support_enable and support_use_towers",
"enabled": "support_enable and support_structure == 'normal' and support_use_towers",
"settable_per_mesh": true
},
"support_tower_maximum_supported_diameter":
@ -5077,7 +5078,7 @@
"minimum_value_warning": "2 * machine_nozzle_size",
"maximum_value_warning": "20",
"maximum_value": "support_tower_diameter",
"enabled": "support_enable and support_use_towers",
"enabled": "support_enable and support_structure == 'normal' and support_use_towers",
"settable_per_mesh": true
},
"support_tower_roof_angle":
@ -5090,7 +5091,7 @@
"maximum_value": "90",
"default_value": 65,
"limit_to_extruder": "support_infill_extruder_nr",
"enabled": "support_enable and support_use_towers",
"enabled": "support_enable and support_structure == 'normal' and support_use_towers",
"settable_per_mesh": true
},
"support_mesh_drop_down":
@ -6597,7 +6598,7 @@
"description": "Make support areas smaller at the bottom than at the overhang.",
"type": "bool",
"default_value": false,
"enabled": "support_enable",
"enabled": "support_enable and support_structure != 'tree'",
"limit_to_extruder": "support_infill_extruder_nr",
"settable_per_mesh": true
},
@ -6612,7 +6613,7 @@
"maximum_value_warning": "45",
"maximum_value": "90",
"default_value": 30,
"enabled": "support_conical_enabled and support_enable",
"enabled": "support_conical_enabled and support_enable and support_structure != 'tree'",
"limit_to_extruder": "support_infill_extruder_nr",
"settable_per_mesh": true
},
@ -6626,7 +6627,7 @@
"minimum_value_warning": "machine_nozzle_size * 3",
"maximum_value_warning": "100.0",
"type": "float",
"enabled": "support_conical_enabled and support_enable and support_conical_angle > 0",
"enabled": "support_conical_enabled and support_enable and support_structure != 'tree' and support_conical_angle > 0",
"limit_to_extruder": "support_infill_extruder_nr",
"settable_per_mesh": true
},

View File

@ -102,7 +102,7 @@
"support_angle": { "value": "math.floor(math.degrees(math.atan(line_width/2.0/layer_height)))" },
"support_pattern": { "value": "'zigzag'" },
"support_infill_rate": { "value": "0 if support_tree_enable else 20" },
"support_infill_rate": { "value": "0 if support_enable and support_structure == 'tree' else 20" },
"support_z_distance": { "value": "layer_height if layer_height >= 0.16 else layer_height*2" },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_overrides_z": { "value": "'xy_overrides_z'" },

View File

@ -12,7 +12,7 @@
"exclude_materials": [
"chromatik_pla",
"dsm_arnitel2045_175", "dsm_novamid1070_175",
"emotiontech_abs", "emotiontech_asax", "emotiontech_hips", "emotiontech_petg", "emotiontech_pla", "emotiontech_pva-m", "emotiontech_pva-oks", "emotiontech_pva-s", "emotiontech_tpu98a",
"emotiontech_abs", "emotiontech_asax", "emotiontech_hips", "emotiontech_petg", "emotiontech_pla", "emotiontech_pva-m", "emotiontech_pva-oks", "emotiontech_pva-s", "emotiontech_tpu98a", "emotiontech_absx", "emotiontech_bvoh",
"eSUN_PETG_Black", "eSUN_PETG_Grey", "eSUN_PETG_Purple", "eSUN_PLA_PRO_Black", "eSUN_PLA_PRO_Grey", "eSUN_PLA_PRO_Purple", "eSUN_PLA_PRO_White",
"fabtotum_abs", "fabtotum_nylon", "fabtotum_pla", "fabtotum_tpu",
"fiberlogy_hd_pla",
@ -104,7 +104,7 @@
"ironing_inset": {"value": "ironing_line_spacing + (ironing_line_spacing - skin_line_width * (1.0 + ironing_flow / 100) / 2 if ironing_pattern == 'concentric' else skin_line_width * (1.0 - ironing_flow / 100) / 2)"},
"speed_ironing": {"value": "150"},
"infill_sparse_density": {"value": 30},
"infill_sparse_density": {"value": 100},
"infill_pattern": {"value": "'lines'"},
"infill_before_walls": {"value": true},

View File

@ -248,7 +248,7 @@
"support_angle": { "value": "math.floor(math.degrees(math.atan(line_width/2.0/layer_height)))" },
"support_pattern": { "value": "'zigzag'" },
"support_infill_rate": { "value": "0 if support_tree_enable else 20" },
"support_infill_rate": { "value": "0 if support_enable and support_structure == 'tree' else 20" },
"support_use_towers": { "value": false },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View File

@ -143,7 +143,7 @@
"support_angle": { "value": "math.floor(math.degrees(math.atan(line_width/2.0/layer_height)))" },
"support_pattern": { "value": "'zigzag'" },
"support_infill_rate": { "value": "0 if support_tree_enable else 20" },
"support_infill_rate": { "value": "0 if support_enable and support_structure == 'tree' else 20" },
"support_use_towers": { "value": false },
"support_xy_distance": { "value": "wall_line_width_0 * 2" },
"support_xy_distance_overhang": { "value": "wall_line_width_0" },

View File

@ -0,0 +1,26 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
"machine": "cubicon_style_neo_a22",
"position": "0"
},
"overrides": {
"extruder_nr": {
"default_value": 0
},
"machine_nozzle_size": {
"default_value": 0.4
},
"machine_nozzle_offset_x": {
"default_value": -3.20
},
"machine_nozzle_offset_y": {
"default_value": -4.70
},
"material_diameter": {
"default_value": 1.75
}
}
}

View File

@ -0,0 +1,15 @@
{
"version": 2,
"name": "Extruder 1",
"inherits": "fdmextruder",
"metadata": {
"machine": "diy220",
"position": "0"
},
"overrides": {
"extruder_nr": { "default_value": 0 },
"machine_nozzle_size": { "default_value": 0.4 },
"material_diameter": { "default_value": 1.75 }
}
}

File diff suppressed because it is too large Load Diff

View File

@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: Cura 4.6\n"
"Project-Id-Version: Cura 4.7\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2020-04-06 16:33+0000\n"
"POT-Creation-Date: 2020-07-31 12:48+0000\n"
"PO-Revision-Date: 2020-02-20 17:30+0100\n"
"Last-Translator: DenyCZ <www.github.com/DenyCZ>\n"
"Language-Team: DenyCZ <www.github.com/DenyCZ>\n"

View File

@ -5,9 +5,9 @@
#
msgid ""
msgstr ""
"Project-Id-Version: Cura 4.6\n"
"Project-Id-Version: Cura 4.7\n"
"Report-Msgid-Bugs-To: r.dulek@ultimaker.com\n"
"POT-Creation-Date: 2020-04-06 16:33+0000\n"
"POT-Creation-Date: 2020-07-31 14:10+0000\n"
"PO-Revision-Date: 2020-04-07 11:21+0200\n"
"Last-Translator: DenyCZ <www.github.com/DenyCZ>\n"
"Language-Team: DenyCZ <www.github.com/DenyCZ>\n"
@ -223,6 +223,16 @@ msgctxt "machine_heated_build_volume description"
msgid "Whether the machine is able to stabilize the build volume temperature."
msgstr "Zda je zařízení schopno stabilizovat teplotu podložky."
#: fdmprinter.def.json
msgctxt "machine_always_write_active_tool label"
msgid "Always Write Active Tool"
msgstr ""
#: fdmprinter.def.json
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."
msgstr ""
#: fdmprinter.def.json
msgctxt "machine_center_is_zero label"
msgid "Is Center Origin"
@ -3472,6 +3482,76 @@ msgctxt "support_bottom_extruder_nr description"
msgid "The extruder train to use for printing the floors of the support. This is used in multi-extrusion."
msgstr "Vytlačovací stroj se používá pro tisk podlah podpěry. To se používá při vícenásobném vytlačování."
#: fdmprinter.def.json
msgctxt "support_structure label"
msgid "Support Structure"
msgstr ""
#: fdmprinter.def.json
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."
msgstr ""
#: fdmprinter.def.json
msgctxt "support_structure option normal"
msgid "Normal"
msgstr ""
#: fdmprinter.def.json
msgctxt "support_structure option tree"
msgid "Tree"
msgstr ""
#: fdmprinter.def.json
msgctxt "support_tree_angle label"
msgid "Tree Support Branch Angle"
msgstr "Úhel větve stromové podpory"
#: fdmprinter.def.json
msgctxt "support_tree_angle description"
msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach."
msgstr "Úhel větví. Použijte nižší úhel, aby byly více vertikální a stabilnější. K dosažení většího dosahu použijte vyšší úhel."
#: fdmprinter.def.json
msgctxt "support_tree_branch_distance label"
msgid "Tree Support Branch Distance"
msgstr "Vzdálenost větví stromu"
#: fdmprinter.def.json
msgctxt "support_tree_branch_distance description"
msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove."
msgstr "Jak daleko od sebe musí být větve, když se dotýkají modelu. Zmenšení této vzdálenosti způsobí, že se stromová podpora dotkne modelu ve více bodech, což způsobí lepší přesah, ale těžší odstranění podpory."
#: fdmprinter.def.json
msgctxt "support_tree_branch_diameter label"
msgid "Tree Support Branch Diameter"
msgstr "Průměr větve podpěry stromu"
#: fdmprinter.def.json
msgctxt "support_tree_branch_diameter description"
msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this."
msgstr "Průměr větve stromu podpory Průměr nejtenčí větve stromu podpory. Silnější větve jsou odolnější. Větve směrem k základně budou silnější než tato."
#: fdmprinter.def.json
msgctxt "support_tree_branch_diameter_angle label"
msgid "Tree Support Branch Diameter Angle"
msgstr "Průměr úhlu větve podpěry stromu"
#: fdmprinter.def.json
msgctxt "support_tree_branch_diameter_angle description"
msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support."
msgstr "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support."
#: fdmprinter.def.json
msgctxt "support_tree_collision_resolution label"
msgid "Tree Support Collision Resolution"
msgstr "Stromová podpora - rozlišení kolize"
#: fdmprinter.def.json
msgctxt "support_tree_collision_resolution description"
msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically."
msgstr "Rozlišení pro výpočet kolizí, aby nedošlo k nárazu do modelu. Nastavením této nižší se vytvoří přesnější stromy, které selhávají méně často, ale dramaticky se zvyšuje doba slicování."
#: fdmprinter.def.json
msgctxt "support_type label"
msgid "Support Placement"
@ -3737,6 +3817,16 @@ msgctxt "support_bottom_stair_step_width description"
msgid "The maximum width of the steps of the stair-like bottom of support resting on the model. A low value makes the support harder to remove, but too high values can lead to unstable support structures."
msgstr "Maximální šířka schodů schodišťového dna podpory spočívá na modelu. Nízká hodnota ztěžuje odstranění podpory, ale příliš vysoké hodnoty mohou vést k nestabilním podpůrným strukturám."
#: fdmprinter.def.json
msgctxt "support_bottom_stair_step_min_slope label"
msgid "Support Stair Step Minimum Slope Angle"
msgstr ""
#: fdmprinter.def.json
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."
msgstr ""
#: fdmprinter.def.json
msgctxt "support_join_distance label"
msgid "Support Join Distance"
@ -4182,6 +4272,16 @@ msgctxt "support_mesh_drop_down description"
msgid "Make support everywhere below the support mesh, so that there's no overhang in the support mesh."
msgstr "Podpořte všude pod podpůrnou sítí, aby v podpůrné síti nebyl přesah."
#: fdmprinter.def.json
msgctxt "support_meshes_present label"
msgid "Scene Has Support Meshes"
msgstr ""
#: fdmprinter.def.json
msgctxt "support_meshes_present description"
msgid "There are support meshes present in the scene. This setting is controlled by Cura."
msgstr ""
#: fdmprinter.def.json
msgctxt "platform_adhesion label"
msgid "Build Plate Adhesion"
@ -4943,8 +5043,8 @@ msgstr "Tisková sekvence"
#: fdmprinter.def.json
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. "
msgstr "Zda se mají tisknout všechny modely po jedné vrstvě najednou, nebo počkat na dokončení jednoho modelu, než se přesunete na další. Jeden za časovým režimem je možný, pokud a) je povolen pouze jeden extruder ab) 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. "
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 ""
#: fdmprinter.def.json
msgctxt "print_sequence option all_at_once"
@ -4968,13 +5068,13 @@ msgstr "Pomocí této mřížky můžete upravit výplň dalších sítí, s nim
#: fdmprinter.def.json
msgctxt "infill_mesh_order label"
msgid "Infill Mesh Order"
msgstr "Pořadí sítě výplně"
msgid "Mesh Processing Rank"
msgstr ""
#: fdmprinter.def.json
msgctxt "infill_mesh_order description"
msgid "Determines which infill mesh is inside the infill of another infill mesh. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes."
msgstr "Určuje, která výplň je uvnitř výplně jiné výplně. Výplňová síť s vyšším pořádkem upraví výplň síťových výplní s nižším řádem a normálními oky."
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 ""
#: fdmprinter.def.json
msgctxt "cutting_mesh label"
@ -5111,66 +5211,6 @@ msgctxt "experimental description"
msgid "Features that haven't completely been fleshed out yet."
msgstr "Nové vychytávky, které ještě nejsou venku."
#: fdmprinter.def.json
msgctxt "support_tree_enable label"
msgid "Tree Support"
msgstr "Stromová podpora"
#: fdmprinter.def.json
msgctxt "support_tree_enable description"
msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time."
msgstr "Vygenerujte stromovou podporu s větvemi, které podporují váš tisk. To může snížit spotřebu materiálu a dobu tisku, ale výrazně prodlužuje dobu slicování."
#: fdmprinter.def.json
msgctxt "support_tree_angle label"
msgid "Tree Support Branch Angle"
msgstr "Úhel větve stromové podpory"
#: fdmprinter.def.json
msgctxt "support_tree_angle description"
msgid "The angle of the branches. Use a lower angle to make them more vertical and more stable. Use a higher angle to be able to have more reach."
msgstr "Úhel větví. Použijte nižší úhel, aby byly více vertikální a stabilnější. K dosažení většího dosahu použijte vyšší úhel."
#: fdmprinter.def.json
msgctxt "support_tree_branch_distance label"
msgid "Tree Support Branch Distance"
msgstr "Vzdálenost větví stromu"
#: fdmprinter.def.json
msgctxt "support_tree_branch_distance description"
msgid "How far apart the branches need to be when they touch the model. Making this distance small will cause the tree support to touch the model at more points, causing better overhang but making support harder to remove."
msgstr "Jak daleko od sebe musí být větve, když se dotýkají modelu. Zmenšení této vzdálenosti způsobí, že se stromová podpora dotkne modelu ve více bodech, což způsobí lepší přesah, ale těžší odstranění podpory."
#: fdmprinter.def.json
msgctxt "support_tree_branch_diameter label"
msgid "Tree Support Branch Diameter"
msgstr "Průměr větve podpěry stromu"
#: fdmprinter.def.json
msgctxt "support_tree_branch_diameter description"
msgid "The diameter of the thinnest branches of tree support. Thicker branches are more sturdy. Branches towards the base will be thicker than this."
msgstr "Průměr větve stromu podpory Průměr nejtenčí větve stromu podpory. Silnější větve jsou odolnější. Větve směrem k základně budou silnější než tato."
#: fdmprinter.def.json
msgctxt "support_tree_branch_diameter_angle label"
msgid "Tree Support Branch Diameter Angle"
msgstr "Průměr úhlu větve podpěry stromu"
#: fdmprinter.def.json
msgctxt "support_tree_branch_diameter_angle description"
msgid "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support."
msgstr "The angle of the branches' diameter as they gradually become thicker towards the bottom. An angle of 0 will cause the branches to have uniform thickness over their length. A bit of an angle can increase stability of the tree support."
#: fdmprinter.def.json
msgctxt "support_tree_collision_resolution label"
msgid "Tree Support Collision Resolution"
msgstr "Stromová podpora - rozlišení kolize"
#: fdmprinter.def.json
msgctxt "support_tree_collision_resolution description"
msgid "Resolution to compute collisions with to avoid hitting the model. Setting this lower will produce more accurate trees that fail less often, but increases slicing time dramatically."
msgstr "Rozlišení pro výpočet kolizí, aby nedošlo k nárazu do modelu. Nastavením této nižší se vytvoří přesnější stromy, které selhávají méně často, ale dramaticky se zvyšuje doba slicování."
#: fdmprinter.def.json
msgctxt "slicing_tolerance label"
msgid "Slicing Tolerance"
@ -5178,8 +5218,8 @@ msgstr "Tolerance slicování"
#: fdmprinter.def.json
msgctxt "slicing_tolerance description"
msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process."
msgstr "Jak krájet vrstvy s diagonálními povrchy. Oblasti vrstvy mohou být generovány na základě toho, kde střed vrstvy protíná povrch (Střední). Alternativně každá vrstva může mít oblasti, které padají uvnitř objemu po celé výšce vrstvy (Exkluzivní), nebo vrstva má oblasti, které padají dovnitř kdekoli v rámci vrstvy (Inkluzivní). Exkluzivní zachovává co nejvíce podrobností, Inkluzivní dělá to nejlepší a Střední trvá zpracování nejméně času."
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 ""
#: fdmprinter.def.json
msgctxt "slicing_tolerance option middle"
@ -5451,76 +5491,6 @@ msgctxt "cross_support_density_image description"
msgid "The file location of an image of which the brightness values determine the minimal density at the corresponding location in the support."
msgstr "Umístění souboru obrázku, jehož hodnoty jasu určují minimální hustotu na odpovídajícím místě v podpoře."
#: fdmprinter.def.json
msgctxt "spaghetti_infill_enabled label"
msgid "Spaghetti Infill"
msgstr "Špagetová výplň"
#: fdmprinter.def.json
msgctxt "spaghetti_infill_enabled description"
msgid "Print the infill every so often, so that the filament will curl up chaotically inside the object. This reduces print time, but the behaviour is rather unpredictable."
msgstr "Výplň tiskněte tak často, aby se vlákno chaoticky stočilo uvnitř objektu. To zkracuje dobu tisku, ale chování je spíše nepředvídatelné."
#: fdmprinter.def.json
msgctxt "spaghetti_infill_stepped label"
msgid "Spaghetti Infill Stepping"
msgstr "Krokování při špagetové výplni"
#: fdmprinter.def.json
msgctxt "spaghetti_infill_stepped description"
msgid "Whether to print spaghetti infill in steps or extrude all the infill filament at the end of the print."
msgstr "Zda se má tisknout špagetová výplň po krocích, nebo se vytlačí veškeré výplňové vlákno na konci tisku."
#: fdmprinter.def.json
msgctxt "spaghetti_max_infill_angle label"
msgid "Spaghetti Maximum Infill Angle"
msgstr "Maximální úhel špagetové výplně"
#: fdmprinter.def.json
msgctxt "spaghetti_max_infill_angle description"
msgid "The maximum angle w.r.t. the Z axis of the inside of the print for areas which are to be filled with spaghetti infill afterwards. Lowering this value causes more angled parts in your model to be filled on each layer."
msgstr "Maximální úhel osy Z uvnitř tisku pro oblasti, které mají být poté vyplněny špagetovou výplní. Snížení této hodnoty způsobí, že se na každé vrstvě vyplní více šikmých částí modelu."
#: fdmprinter.def.json
msgctxt "spaghetti_max_height label"
msgid "Spaghetti Infill Maximum Height"
msgstr "Maximální výška špagetové výplně"
#: fdmprinter.def.json
msgctxt "spaghetti_max_height description"
msgid "The maximum height of inside space which can be combined and filled from the top."
msgstr "Maximální výška vnitřního prostoru, kterou lze kombinovat a naplnit shora."
#: fdmprinter.def.json
msgctxt "spaghetti_inset label"
msgid "Spaghetti Inset"
msgstr "Špagetová výplň"
#: fdmprinter.def.json
msgctxt "spaghetti_inset description"
msgid "The offset from the walls from where the spaghetti infill will be printed."
msgstr "Odsazení od stěn, odkud bude vytištěna výplň špaget."
#: fdmprinter.def.json
msgctxt "spaghetti_flow label"
msgid "Spaghetti Flow"
msgstr "Průtok při špagetové výplni"
#: fdmprinter.def.json
msgctxt "spaghetti_flow description"
msgid "Adjusts the density of the spaghetti infill. Note that the Infill Density only controls the line spacing of the filling pattern, not the amount of extrusion for spaghetti infill."
msgstr "Upravuje hustotu výplně špaget. Mějte na paměti, že hustota výplně řídí pouze rozteč linií výplňového vzoru, nikoli velikost výtluku pro výplň špaget."
#: fdmprinter.def.json
msgctxt "spaghetti_infill_extra_volume label"
msgid "Spaghetti Infill Extra Volume"
msgstr "Objem navíc při špagetové výplni"
#: fdmprinter.def.json
msgctxt "spaghetti_infill_extra_volume description"
msgid "A correction term to adjust the total volume being extruded each time when filling spaghetti."
msgstr "Korekční termín pro úpravu celkového objemu, který se vytlačuje pokaždé, když se plní špagety."
#: fdmprinter.def.json
msgctxt "support_conical_enabled label"
msgid "Enable Conical Support"
@ -6390,6 +6360,86 @@ msgctxt "mesh_rotation_matrix description"
msgid "Transformation matrix to be applied to the model when loading it from file."
msgstr "Transformační matice, která se použije na model při načítání ze souboru."
#~ 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. "
#~ msgstr "Zda se mají tisknout všechny modely po jedné vrstvě najednou, nebo počkat na dokončení jednoho modelu, než se přesunete na další. Jeden za časovým režimem je možný, pokud a) je povolen pouze jeden extruder ab) 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. "
#~ msgctxt "infill_mesh_order label"
#~ msgid "Infill Mesh Order"
#~ msgstr "Pořadí sítě výplně"
#~ msgctxt "infill_mesh_order description"
#~ msgid "Determines which infill mesh is inside the infill of another infill mesh. An infill mesh with a higher order will modify the infill of infill meshes with lower order and normal meshes."
#~ msgstr "Určuje, která výplň je uvnitř výplně jiné výplně. Výplňová síť s vyšším pořádkem upraví výplň síťových výplní s nižším řádem a normálními oky."
#~ msgctxt "support_tree_enable label"
#~ msgid "Tree Support"
#~ msgstr "Stromová podpora"
#~ msgctxt "support_tree_enable description"
#~ msgid "Generate a tree-like support with branches that support your print. This may reduce material usage and print time, but greatly increases slicing time."
#~ msgstr "Vygenerujte stromovou podporu s větvemi, které podporují váš tisk. To může snížit spotřebu materiálu a dobu tisku, ale výrazně prodlužuje dobu slicování."
#~ msgctxt "slicing_tolerance description"
#~ msgid "How to slice layers with diagonal surfaces. The areas of a layer can be generated based on where the middle of the layer intersects the surface (Middle). Alternatively each layer can have the areas which fall inside of the volume throughout the height of the layer (Exclusive) or a layer has the areas which fall inside anywhere within the layer (Inclusive). Exclusive retains the most details, Inclusive makes for the best fit and Middle takes the least time to process."
#~ msgstr "Jak krájet vrstvy s diagonálními povrchy. Oblasti vrstvy mohou být generovány na základě toho, kde střed vrstvy protíná povrch (Střední). Alternativně každá vrstva může mít oblasti, které padají uvnitř objemu po celé výšce vrstvy (Exkluzivní), nebo vrstva má oblasti, které padají dovnitř kdekoli v rámci vrstvy (Inkluzivní). Exkluzivní zachovává co nejvíce podrobností, Inkluzivní dělá to nejlepší a Střední trvá zpracování nejméně času."
#~ msgctxt "spaghetti_infill_enabled label"
#~ msgid "Spaghetti Infill"
#~ msgstr "Špagetová výplň"
#~ msgctxt "spaghetti_infill_enabled description"
#~ msgid "Print the infill every so often, so that the filament will curl up chaotically inside the object. This reduces print time, but the behaviour is rather unpredictable."
#~ msgstr "Výplň tiskněte tak často, aby se vlákno chaoticky stočilo uvnitř objektu. To zkracuje dobu tisku, ale chování je spíše nepředvídatelné."
#~ msgctxt "spaghetti_infill_stepped label"
#~ msgid "Spaghetti Infill Stepping"
#~ msgstr "Krokování při špagetové výplni"
#~ msgctxt "spaghetti_infill_stepped description"
#~ msgid "Whether to print spaghetti infill in steps or extrude all the infill filament at the end of the print."
#~ msgstr "Zda se má tisknout špagetová výplň po krocích, nebo se vytlačí veškeré výplňové vlákno na konci tisku."
#~ msgctxt "spaghetti_max_infill_angle label"
#~ msgid "Spaghetti Maximum Infill Angle"
#~ msgstr "Maximální úhel špagetové výplně"
#~ msgctxt "spaghetti_max_infill_angle description"
#~ msgid "The maximum angle w.r.t. the Z axis of the inside of the print for areas which are to be filled with spaghetti infill afterwards. Lowering this value causes more angled parts in your model to be filled on each layer."
#~ msgstr "Maximální úhel osy Z uvnitř tisku pro oblasti, které mají být poté vyplněny špagetovou výplní. Snížení této hodnoty způsobí, že se na každé vrstvě vyplní více šikmých částí modelu."
#~ msgctxt "spaghetti_max_height label"
#~ msgid "Spaghetti Infill Maximum Height"
#~ msgstr "Maximální výška špagetové výplně"
#~ msgctxt "spaghetti_max_height description"
#~ msgid "The maximum height of inside space which can be combined and filled from the top."
#~ msgstr "Maximální výška vnitřního prostoru, kterou lze kombinovat a naplnit shora."
#~ msgctxt "spaghetti_inset label"
#~ msgid "Spaghetti Inset"
#~ msgstr "Špagetová výplň"
#~ msgctxt "spaghetti_inset description"
#~ msgid "The offset from the walls from where the spaghetti infill will be printed."
#~ msgstr "Odsazení od stěn, odkud bude vytištěna výplň špaget."
#~ msgctxt "spaghetti_flow label"
#~ msgid "Spaghetti Flow"
#~ msgstr "Průtok při špagetové výplni"
#~ msgctxt "spaghetti_flow description"
#~ msgid "Adjusts the density of the spaghetti infill. Note that the Infill Density only controls the line spacing of the filling pattern, not the amount of extrusion for spaghetti infill."
#~ msgstr "Upravuje hustotu výplně špaget. Mějte na paměti, že hustota výplně řídí pouze rozteč linií výplňového vzoru, nikoli velikost výtluku pro výplň špaget."
#~ msgctxt "spaghetti_infill_extra_volume label"
#~ msgid "Spaghetti Infill Extra Volume"
#~ msgstr "Objem navíc při špagetové výplni"
#~ msgctxt "spaghetti_infill_extra_volume description"
#~ msgid "A correction term to adjust the total volume being extruded each time when filling spaghetti."
#~ msgstr "Korekční termín pro úpravu celkového objemu, který se vytlačuje pokaždé, když se plní špagety."
#~ msgctxt "material_guid description"
#~ msgid "GUID of the material. This is set automatically. "
#~ msgstr "GUID materiálu. Toto je nastaveno automaticky. "

Some files were not shown because too many files have changed in this diff Show More