From 4f9d041ae84206c4ad3f7d2c6f01912965d57890 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 11 May 2023 16:14:38 +0200 Subject: [PATCH 001/126] Add rotation lock in arrange and multiply objects Add rotation lock in - context menu item arrange and - checkbox in multiply objects dialog CURA-7951 --- cura/Arranging/ArrangeObjectsJob.py | 7 +++-- cura/Arranging/Nest2DArrange.py | 36 ++++++++++++++++------- cura/CuraActions.py | 10 ++++--- cura/CuraApplication.py | 11 ++++---- cura/MultiplyObjectsJob.py | 14 +++++---- resources/qml/Actions.qml | 20 +++++++++++-- resources/qml/Menus/ContextMenu.qml | 44 ++++++++++++++++++----------- 7 files changed, 97 insertions(+), 45 deletions(-) diff --git a/cura/Arranging/ArrangeObjectsJob.py b/cura/Arranging/ArrangeObjectsJob.py index 6ba6717191..f938b44d1f 100644 --- a/cura/Arranging/ArrangeObjectsJob.py +++ b/cura/Arranging/ArrangeObjectsJob.py @@ -14,11 +14,13 @@ i18n_catalog = i18nCatalog("cura") class ArrangeObjectsJob(Job): - def __init__(self, nodes: List[SceneNode], fixed_nodes: List[SceneNode], min_offset = 8) -> None: + def __init__(self, nodes: List[SceneNode], fixed_nodes: List[SceneNode], min_offset=8, + lock_rotation: bool = False) -> None: super().__init__() self._nodes = nodes self._fixed_nodes = fixed_nodes self._min_offset = min_offset + self._lock_rotation = lock_rotation def run(self): found_solution_for_all = False @@ -30,7 +32,8 @@ class ArrangeObjectsJob(Job): status_message.show() try: - found_solution_for_all = arrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes) + found_solution_for_all = arrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes, + lock_rotation=self._lock_rotation) except: # If the thread crashes, the message should still close Logger.logException("e", "Unable to arrange the objects on the buildplate. The arrange algorithm has crashed.") diff --git a/cura/Arranging/Nest2DArrange.py b/cura/Arranging/Nest2DArrange.py index 21427f1194..8921c9ede2 100644 --- a/cura/Arranging/Nest2DArrange.py +++ b/cura/Arranging/Nest2DArrange.py @@ -22,7 +22,13 @@ if TYPE_CHECKING: from cura.BuildVolume import BuildVolume -def findNodePlacement(nodes_to_arrange: List["SceneNode"], build_volume: "BuildVolume", fixed_nodes: Optional[List["SceneNode"]] = None, factor = 10000) -> Tuple[bool, List[Item]]: +def findNodePlacement( + nodes_to_arrange: List["SceneNode"], + build_volume: "BuildVolume", + fixed_nodes: Optional[List["SceneNode"]] = None, + factor: int = 10000, + lock_rotation: bool = False +) -> Tuple[bool, List[Item]]: """ Find placement for a set of scene nodes, but don't actually move them just yet. :param nodes_to_arrange: The list of nodes that need to be moved. @@ -30,6 +36,7 @@ def findNodePlacement(nodes_to_arrange: List["SceneNode"], build_volume: "BuildV :param fixed_nodes: List of nods that should not be moved, but should be used when deciding where the others nodes are placed. :param factor: The library that we use is int based. This factor defines how accurate we want it to be. + :param lock_rotation: If set to true the orientation of the object will remain the same :return: tuple (found_solution_for_all, node_items) WHERE @@ -100,6 +107,8 @@ def findNodePlacement(nodes_to_arrange: List["SceneNode"], build_volume: "BuildV config = NfpConfig() config.accuracy = 1.0 config.alignment = NfpConfig.Alignment.DONT_ALIGN + if lock_rotation: + config.rotations = [0.0] num_bins = nest(node_items, build_plate_bounding_box, spacing, config) @@ -114,10 +123,12 @@ def findNodePlacement(nodes_to_arrange: List["SceneNode"], build_volume: "BuildV def createGroupOperationForArrange(nodes_to_arrange: List["SceneNode"], build_volume: "BuildVolume", fixed_nodes: Optional[List["SceneNode"]] = None, - factor = 10000, - add_new_nodes_in_scene: bool = False) -> Tuple[GroupedOperation, int]: + factor: int = 10000, + add_new_nodes_in_scene: bool = False, + lock_rotation: bool = False) -> Tuple[GroupedOperation, int]: scene_root = Application.getInstance().getController().getScene().getRoot() - found_solution_for_all, node_items = findNodePlacement(nodes_to_arrange, build_volume, fixed_nodes, factor) + found_solution_for_all, node_items = findNodePlacement(nodes_to_arrange, build_volume, fixed_nodes, factor, + lock_rotation) not_fit_count = 0 grouped_operation = GroupedOperation() @@ -141,11 +152,14 @@ def createGroupOperationForArrange(nodes_to_arrange: List["SceneNode"], return grouped_operation, not_fit_count -def arrange(nodes_to_arrange: List["SceneNode"], - build_volume: "BuildVolume", - fixed_nodes: Optional[List["SceneNode"]] = None, - factor = 10000, - add_new_nodes_in_scene: bool = False) -> bool: +def arrange( + nodes_to_arrange: List["SceneNode"], + build_volume: "BuildVolume", + fixed_nodes: Optional[List["SceneNode"]] = None, + factor=10000, + add_new_nodes_in_scene: bool = False, + lock_rotation: bool = False +) -> bool: """ Find placement for a set of scene nodes, and move them by using a single grouped operation. :param nodes_to_arrange: The list of nodes that need to be moved. @@ -154,10 +168,12 @@ def arrange(nodes_to_arrange: List["SceneNode"], are placed. :param factor: The library that we use is int based. This factor defines how accuracte we want it to be. :param add_new_nodes_in_scene: Whether to create new scene nodes before applying the transformations and rotations + :param lock_rotation: If set to true the orientation of the object will remain the same :return: found_solution_for_all: Whether the algorithm found a place on the buildplate for all the objects """ - grouped_operation, not_fit_count = createGroupOperationForArrange(nodes_to_arrange, build_volume, fixed_nodes, factor, add_new_nodes_in_scene) + grouped_operation, not_fit_count = createGroupOperationForArrange(nodes_to_arrange, build_volume, fixed_nodes, + factor, add_new_nodes_in_scene, lock_rotation) grouped_operation.push() return not_fit_count == 0 diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 193803325f..fed57c8500 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -75,19 +75,21 @@ class CuraActions(QObject): center_y = 0 # Move the object so that it's bottom is on to of the buildplate - center_operation = TranslateOperation(current_node, Vector(0, center_y, 0), set_position = True) + center_operation = TranslateOperation(current_node, Vector(0, center_y, 0), set_position=True) operation.addOperation(center_operation) operation.push() - @pyqtSlot(int) - def multiplySelection(self, count: int) -> None: + @pyqtSlot(int, bool) + def multiplySelection(self, count: int, lock_rotation: bool) -> None: """Multiply all objects in the selection :param count: The number of times to multiply the selection. + :param lock_rotation: If set to true the orientation of the object will remain the same """ min_offset = cura.CuraApplication.CuraApplication.getInstance().getBuildVolume().getEdgeDisallowedSize() + 2 # Allow for some rounding errors - job = MultiplyObjectsJob(Selection.getAllSelectedObjects(), count, min_offset = max(min_offset, 8)) + job = MultiplyObjectsJob(Selection.getAllSelectedObjects(), count, min_offset=max(min_offset, 8), + lock_rotation=lock_rotation) job.start() @pyqtSlot() diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 113e7b3ff4..15e7a60fcb 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1421,8 +1421,8 @@ class CuraApplication(QtApplication): op.push() # Single build plate - @pyqtSlot() - def arrangeAll(self) -> None: + @pyqtSlot(bool) + def arrangeAll(self, lock_rotation: bool) -> None: nodes_to_arrange = [] active_build_plate = self.getMultiBuildPlateModel().activeBuildPlate locked_nodes = [] @@ -1452,17 +1452,18 @@ class CuraApplication(QtApplication): locked_nodes.append(node) else: nodes_to_arrange.append(node) - self.arrange(nodes_to_arrange, locked_nodes) + self.arrange(nodes_to_arrange, locked_nodes, lock_rotation) - def arrange(self, nodes: List[SceneNode], fixed_nodes: List[SceneNode]) -> None: + def arrange(self, nodes: List[SceneNode], fixed_nodes: List[SceneNode], lock_rotation: bool = False) -> None: """Arrange a set of nodes given a set of fixed nodes :param nodes: nodes that we have to place :param fixed_nodes: nodes that are placed in the arranger before finding spots for nodes + :param lock_rotation: If set to true the orientation of the object will remain the same """ min_offset = self.getBuildVolume().getEdgeDisallowedSize() + 2 # Allow for some rounding errors - job = ArrangeObjectsJob(nodes, fixed_nodes, min_offset = max(min_offset, 8)) + job = ArrangeObjectsJob(nodes, fixed_nodes, min_offset=max(min_offset, 8), lock_rotation=lock_rotation) job.start() @pyqtSlot() diff --git a/cura/MultiplyObjectsJob.py b/cura/MultiplyObjectsJob.py index 1446ae687e..ff4f362b4c 100644 --- a/cura/MultiplyObjectsJob.py +++ b/cura/MultiplyObjectsJob.py @@ -20,11 +20,12 @@ i18n_catalog = i18nCatalog("cura") class MultiplyObjectsJob(Job): - def __init__(self, objects, count, min_offset = 8): + def __init__(self, objects, count: int, min_offset: int = 8, lock_rotation: bool = False): super().__init__() self._objects = objects - self._count = count - self._min_offset = min_offset + self._count: int = count + self._min_offset: int = min_offset + self._lock_rotation: bool = lock_rotation def run(self) -> None: status_message = Message(i18n_catalog.i18nc("@info:status", "Multiplying and placing objects"), lifetime = 0, @@ -39,7 +40,7 @@ class MultiplyObjectsJob(Job): root = scene.getRoot() - processed_nodes = [] # type: List[SceneNode] + processed_nodes: List[SceneNode] = [] nodes = [] fixed_nodes = [] @@ -79,8 +80,9 @@ class MultiplyObjectsJob(Job): group_operation, not_fit_count = createGroupOperationForArrange(nodes, Application.getInstance().getBuildVolume(), fixed_nodes, - factor = 10000, - add_new_nodes_in_scene = True) + factor=10000, + add_new_nodes_in_scene=True, + lock_rotation=self._lock_rotation) found_solution_for_all = not_fit_count == 0 if nodes_to_add_without_arrange: diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 6cd75b51ac..eb9f1c7f21 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -41,7 +41,9 @@ Item property alias deleteAll: deleteAllAction property alias reloadAll: reloadAllAction property alias arrangeAll: arrangeAllAction + property alias arrangeAllLock: arrangeAllLockAction property alias arrangeSelection: arrangeSelectionAction + property alias arrangeSelectionLock: arrangeSelectionLockAction property alias resetAllTranslation: resetAllTranslationAction property alias resetAll: resetAllAction @@ -412,15 +414,29 @@ Item { id: arrangeAllAction text: catalog.i18nc("@action:inmenu menubar:edit","Arrange All Models") - onTriggered: Printer.arrangeAll() + onTriggered: Printer.arrangeAll(false) shortcut: "Ctrl+R" } + Action + { + id: arrangeAllLockAction + text: catalog.i18nc("@action:inmenu menubar:edit","Arrange All Models Without Rotation") + onTriggered: Printer.arrangeAll(true) + } + Action { id: arrangeSelectionAction text: catalog.i18nc("@action:inmenu menubar:edit","Arrange Selection") - onTriggered: Printer.arrangeSelection() + onTriggered: Printer.arrangeSelection(false) + } + + Action + { + id: arrangeSelectionLockAction + text: catalog.i18nc("@action:inmenu menubar:edit","Arrange Selection Without Rotation") + onTriggered: Printer.arrangeSelection(true) } Action diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index 65f3409c8a..c327a37a2b 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -53,6 +53,7 @@ Cura.Menu Cura.MenuSeparator {} Cura.MenuItem { action: Cura.Actions.selectAll } Cura.MenuItem { action: Cura.Actions.arrangeAll } + Cura.MenuItem { action: Cura.Actions.arrangeAllLock } Cura.MenuItem { action: Cura.Actions.deleteAll } Cura.MenuItem { action: Cura.Actions.reloadAll } Cura.MenuItem { action: Cura.Actions.resetAllTranslation } @@ -96,7 +97,7 @@ Cura.Menu minimumWidth: UM.Theme.getSize("small_popup_dialog").width minimumHeight: UM.Theme.getSize("small_popup_dialog").height - onAccepted: CuraActions.multiplySelection(copiesField.value) + onAccepted: CuraActions.multiplySelection(copiesField.value, lockRotationField.checked) buttonSpacing: UM.Theme.getSize("thin_margin").width @@ -114,27 +115,38 @@ Cura.Menu } ] - Row + Column { - spacing: UM.Theme.getSize("default_margin").width + spacing: UM.Theme.getSize("default_margin").height - UM.Label + Row { - text: catalog.i18nc("@label", "Number of Copies") - anchors.verticalCenter: copiesField.verticalCenter - width: contentWidth - wrapMode: Text.NoWrap + spacing: UM.Theme.getSize("default_margin").width + + UM.Label + { + text: catalog.i18nc("@label", "Number of Copies") + anchors.verticalCenter: copiesField.verticalCenter + width: contentWidth + wrapMode: Text.NoWrap + } + + Cura.SpinBox + { + id: copiesField + editable: true + focus: true + from: 1 + to: 99 + width: 2 * UM.Theme.getSize("button").width + value: 1 + } } - Cura.SpinBox + UM.CheckBox { - id: copiesField - editable: true - focus: true - from: 1 - to: 99 - width: 2 * UM.Theme.getSize("button").width - value: 1 + id: lockRotationField + text: catalog.i18nc("@label", "Lock Rotation") } } } From d4c0f81719fae2af2117cb05b5c7aeab371f6654 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Thu, 11 May 2023 14:20:25 +0000 Subject: [PATCH 002/126] update translations --- resources/i18n/cs_CZ/cura.po | 139 +++-- resources/i18n/cura.pot | 1065 +++++++++++++++++----------------- resources/i18n/de_DE/cura.po | 139 +++-- resources/i18n/es_ES/cura.po | 139 +++-- resources/i18n/fi_FI/cura.po | 139 +++-- resources/i18n/fr_FR/cura.po | 139 +++-- resources/i18n/hu_HU/cura.po | 139 +++-- resources/i18n/it_IT/cura.po | 139 +++-- resources/i18n/ja_JP/cura.po | 139 +++-- resources/i18n/ko_KR/cura.po | 139 +++-- resources/i18n/nl_NL/cura.po | 139 +++-- resources/i18n/pl_PL/cura.po | 139 +++-- resources/i18n/pt_BR/cura.po | 139 +++-- resources/i18n/pt_PT/cura.po | 139 +++-- resources/i18n/ru_RU/cura.po | 139 +++-- resources/i18n/tr_TR/cura.po | 139 +++-- resources/i18n/zh_CN/cura.po | 139 +++-- resources/i18n/zh_TW/cura.po | 139 +++-- 18 files changed, 1849 insertions(+), 1579 deletions(-) diff --git a/resources/i18n/cs_CZ/cura.po b/resources/i18n/cs_CZ/cura.po index f20c8c2949..29109ae325 100644 --- a/resources/i18n/cs_CZ/cura.po +++ b/resources/i18n/cs_CZ/cura.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Cura 5.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: 2023-02-16 20:28+0100\n" "Last-Translator: Miroslav Šustek \n" "Language-Team: DenyCZ \n" @@ -23,22 +23,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "Přihlášení selhalo" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "Hledám nové umístění pro objekt" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "Hledám umístění" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "Nemohu najít lokaci na podložce pro všechny objekty" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "Nemohu najít umístění" @@ -265,25 +265,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Současně lze načíst pouze jeden soubor G-kódu. Přeskočen import {0}" -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "Varování" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Nelze otevřít žádný jiný soubor, když se načítá G kód. Přeskočen import {0}" -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -410,17 +410,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "Vypočítáno" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Násobím a rozmisťuji objekty" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "Umisťuji objekty" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "Umisťuji objekt" @@ -3689,17 +3689,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "Odstranit tiskárnu" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Tisk přes síť" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Tisk přes síť" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "Připojeno přes síť" @@ -4241,227 +4241,237 @@ msgctxt "@button" msgid "Cancel" msgstr "Zrušit" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "Zobrazit online řešení problémů" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "Přepnout zobrazení na celou obrazovku" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "Ukončit zobrazení na celou obrazovku" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Vrátit" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Znovu" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Ukončit" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "3D Pohled" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "Přední pohled" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "Pohled seshora" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "Pohled zezdola" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "Pohled z pravé strany" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "Pohled z pravé strany" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Konfigurovat Cura..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "Přidat t&iskárnu..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Spravovat &tiskárny..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Spravovat materiály..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "Přidat více materiálů z Marketplace" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Aktualizovat profil s aktuálními nastaveními/přepsáními" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "Smazat aktuální &změny" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Vytvořit profil z aktuálního nastavení/přepsání." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Spravovat profily..." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Zobrazit online &dokumentaci" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Nahlásit &chybu" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "Co je nového" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "Více..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "Smazat vybrané" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "Centrovat vybrané" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "Násobit vybrané" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Odstranit model" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "&Centerovat model na podložce" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "Sesk&upit modely" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Rozdělit modely" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Spo&jit modely" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "Náso&bení modelu..." -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "Vybrat všechny modely" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "Vyčistit podložku" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "Znovu načíst všechny modely" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Uspořádat všechny modely" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Uspořádat selekci" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Resetovat všechny pozice modelů" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "Resetovat všechny transformace modelů" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Otevřít soubor(y)..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Nový projekt..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Zobrazit složku s konfigurací" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Konfigurovat viditelnost nastavení..." @@ -5083,7 +5093,7 @@ msgstr[0] "Tisknout vybraný model pomocí:" msgstr[1] "Tisknout vybrané modely pomocí:" msgstr[2] "Tisknout vybrané modely pomocí:" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" @@ -5091,11 +5101,16 @@ msgstr[0] "Násobit vybraný model" msgstr[1] "Násobit vybrané modele" msgstr[2] "Násobit vybrané modele" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "Počet kopií" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" diff --git a/resources/i18n/cura.pot b/resources/i18n/cura.pot index 9321ffa72b..3dc901e8e0 100644 --- a/resources/i18n/cura.pot +++ b/resources/i18n/cura.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -23,23 +23,23 @@ msgctxt "@info:title" msgid "Login failed" msgstr "" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "" -#: cura/Arranging/ArrangeObjectsJob.py:42 -#: cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 +#: cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "" @@ -259,26 +259,26 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "" -#: cura/CuraApplication.py:1818 +#: cura/CuraApplication.py:1819 #: cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "" -#: cura/CuraApplication.py:1830 +#: cura/CuraApplication.py:1831 #: cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 @@ -406,17 +406,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "" @@ -3321,17 +3321,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "" @@ -3570,227 +3570,237 @@ msgctxt "@button" msgid "Cancel" msgstr "" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "" -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "" -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "" -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "" -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "" -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "" -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "" -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "" -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "" -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "" -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "" -#: resources/qml/Actions.qml:469 +#: resources/qml/Actions.qml:485 #: resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." @@ -4414,18 +4424,23 @@ msgid_plural "Print Selected Models With:" msgstr[0] "" msgstr[1] "" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "" msgstr[1] "" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" @@ -6244,6 +6259,106 @@ msgstr "" msgctxt "@label" msgid "No items to select from" msgstr "" +#: plugins/UltimakerMachineActions/plugin.json +msgctxt "description" +msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)." +msgstr "" + +#: plugins/UltimakerMachineActions/plugin.json +msgctxt "name" +msgid "UltiMaker machine actions" +msgstr "" + +#: plugins/SupportEraser/plugin.json +msgctxt "description" +msgid "Creates an eraser mesh to block the printing of support in certain places" +msgstr "" + +#: plugins/SupportEraser/plugin.json +msgctxt "name" +msgid "Support Eraser" +msgstr "" + +#: plugins/GCodeGzReader/plugin.json +msgctxt "description" +msgid "Reads g-code from a compressed archive." +msgstr "" + +#: plugins/GCodeGzReader/plugin.json +msgctxt "name" +msgid "Compressed G-code Reader" +msgstr "" + +#: plugins/SentryLogger/plugin.json +msgctxt "description" +msgid "Logs certain events so that they can be used by the crash reporter" +msgstr "" + +#: plugins/SentryLogger/plugin.json +msgctxt "name" +msgid "Sentry Logger" +msgstr "" + +#: plugins/CuraProfileReader/plugin.json +msgctxt "description" +msgid "Provides support for importing Cura profiles." +msgstr "" + +#: plugins/CuraProfileReader/plugin.json +msgctxt "name" +msgid "Cura Profile Reader" +msgstr "" + +#: plugins/3MFWriter/plugin.json +msgctxt "description" +msgid "Provides support for writing 3MF files." +msgstr "" + +#: plugins/3MFWriter/plugin.json +msgctxt "name" +msgid "3MF Writer" +msgstr "" + +#: plugins/PerObjectSettingsTool/plugin.json +msgctxt "description" +msgid "Provides the Per Model Settings." +msgstr "" + +#: plugins/PerObjectSettingsTool/plugin.json +msgctxt "name" +msgid "Per Model Settings Tool" +msgstr "" + +#: plugins/PrepareStage/plugin.json +msgctxt "description" +msgid "Provides a prepare stage in Cura." +msgstr "" + +#: plugins/PrepareStage/plugin.json +msgctxt "name" +msgid "Prepare Stage" +msgstr "" + +#: plugins/TrimeshReader/plugin.json +msgctxt "description" +msgid "Provides support for reading model files." +msgstr "" + +#: plugins/TrimeshReader/plugin.json +msgctxt "name" +msgid "Trimesh Reader" +msgstr "" + +#: plugins/Marketplace/plugin.json +msgctxt "description" +msgid "Manages extensions to the application and allows browsing extensions from the UltiMaker website." +msgstr "" + +#: plugins/Marketplace/plugin.json +msgctxt "name" +msgid "Marketplace" +msgstr "" + #: plugins/LegacyProfileReader/plugin.json msgctxt "description" msgid "Provides support for importing profiles from legacy Cura versions." @@ -6254,34 +6369,294 @@ msgctxt "name" msgid "Legacy Cura Profile Reader" msgstr "" -#: plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json +#: plugins/GCodeProfileReader/plugin.json msgctxt "description" -msgid "Upgrades configurations from Cura 2.2 to Cura 2.4." +msgid "Provides support for importing profiles from g-code files." msgstr "" -#: plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json +#: plugins/GCodeProfileReader/plugin.json msgctxt "name" -msgid "Version Upgrade 2.2 to 2.4" +msgid "G-code Profile Reader" msgstr "" -#: plugins/VersionUpgrade/VersionUpgrade411to412/plugin.json +#: plugins/CuraDrive/plugin.json msgctxt "description" -msgid "Upgrades configurations from Cura 4.11 to Cura 4.12." +msgid "Backup and restore your configuration." msgstr "" -#: plugins/VersionUpgrade/VersionUpgrade411to412/plugin.json +#: plugins/CuraDrive/plugin.json msgctxt "name" -msgid "Version Upgrade 4.11 to 4.12" +msgid "Cura Backups" msgstr "" -#: plugins/VersionUpgrade/VersionUpgrade41to42/plugin.json +#: plugins/3MFReader/plugin.json msgctxt "description" -msgid "Upgrades configurations from Cura 4.1 to Cura 4.2." +msgid "Provides support for reading 3MF files." msgstr "" -#: plugins/VersionUpgrade/VersionUpgrade41to42/plugin.json +#: plugins/3MFReader/plugin.json msgctxt "name" -msgid "Version Upgrade 4.1 to 4.2" +msgid "3MF Reader" +msgstr "" + +#: plugins/X3DReader/plugin.json +msgctxt "description" +msgid "Provides support for reading X3D files." +msgstr "" + +#: plugins/X3DReader/plugin.json +msgctxt "name" +msgid "X3D Reader" +msgstr "" + +#: plugins/RemovableDriveOutputDevice/plugin.json +msgctxt "description" +msgid "Provides removable drive hotplugging and writing support." +msgstr "" + +#: plugins/RemovableDriveOutputDevice/plugin.json +msgctxt "name" +msgid "Removable Drive Output Device Plugin" +msgstr "" + +#: plugins/FirmwareUpdateChecker/plugin.json +msgctxt "description" +msgid "Checks for firmware updates." +msgstr "" + +#: plugins/FirmwareUpdateChecker/plugin.json +msgctxt "name" +msgid "Firmware Update Checker" +msgstr "" + +#: plugins/MachineSettingsAction/plugin.json +msgctxt "description" +msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)." +msgstr "" + +#: plugins/MachineSettingsAction/plugin.json +msgctxt "name" +msgid "Machine Settings Action" +msgstr "" + +#: plugins/XmlMaterialProfile/plugin.json +msgctxt "description" +msgid "Provides capabilities to read and write XML-based material profiles." +msgstr "" + +#: plugins/XmlMaterialProfile/plugin.json +msgctxt "name" +msgid "Material Profiles" +msgstr "" + +#: plugins/UFPReader/plugin.json +msgctxt "description" +msgid "Provides support for reading Ultimaker Format Packages." +msgstr "" + +#: plugins/UFPReader/plugin.json +msgctxt "name" +msgid "UFP Reader" +msgstr "" + +#: plugins/CuraEngineBackend/plugin.json +msgctxt "description" +msgid "Provides the link to the CuraEngine slicing backend." +msgstr "" + +#: plugins/CuraEngineBackend/plugin.json +msgctxt "name" +msgid "CuraEngine Backend" +msgstr "" + +#: plugins/GCodeReader/plugin.json +msgctxt "description" +msgid "Allows loading and displaying G-code files." +msgstr "" + +#: plugins/GCodeReader/plugin.json +msgctxt "name" +msgid "G-code Reader" +msgstr "" + +#: plugins/CuraProfileWriter/plugin.json +msgctxt "description" +msgid "Provides support for exporting Cura profiles." +msgstr "" + +#: plugins/CuraProfileWriter/plugin.json +msgctxt "name" +msgid "Cura Profile Writer" +msgstr "" + +#: plugins/SimulationView/plugin.json +msgctxt "description" +msgid "Provides the preview of sliced layerdata." +msgstr "" + +#: plugins/SimulationView/plugin.json +msgctxt "name" +msgid "Simulation View" +msgstr "" + +#: plugins/UM3NetworkPrinting/plugin.json +msgctxt "description" +msgid "Manages network connections to UltiMaker networked printers." +msgstr "" + +#: plugins/UM3NetworkPrinting/plugin.json +msgctxt "name" +msgid "UltiMaker Network Connection" +msgstr "" + +#: plugins/XRayView/plugin.json +msgctxt "description" +msgid "Provides the X-Ray view." +msgstr "" + +#: plugins/XRayView/plugin.json +msgctxt "name" +msgid "X-Ray View" +msgstr "" + +#: plugins/UFPWriter/plugin.json +msgctxt "description" +msgid "Provides support for writing Ultimaker Format Packages." +msgstr "" + +#: plugins/UFPWriter/plugin.json +msgctxt "name" +msgid "UFP Writer" +msgstr "" + +#: plugins/GCodeWriter/plugin.json +msgctxt "description" +msgid "Writes g-code to a file." +msgstr "" + +#: plugins/GCodeWriter/plugin.json +msgctxt "name" +msgid "G-code Writer" +msgstr "" + +#: plugins/MonitorStage/plugin.json +msgctxt "description" +msgid "Provides a monitor stage in Cura." +msgstr "" + +#: plugins/MonitorStage/plugin.json +msgctxt "name" +msgid "Monitor Stage" +msgstr "" + +#: plugins/FirmwareUpdater/plugin.json +msgctxt "description" +msgid "Provides a machine actions for updating firmware." +msgstr "" + +#: plugins/FirmwareUpdater/plugin.json +msgctxt "name" +msgid "Firmware Updater" +msgstr "" + +#: plugins/SolidView/plugin.json +msgctxt "description" +msgid "Provides a normal solid mesh view." +msgstr "" + +#: plugins/SolidView/plugin.json +msgctxt "name" +msgid "Solid View" +msgstr "" + +#: plugins/SliceInfoPlugin/plugin.json +msgctxt "description" +msgid "Submits anonymous slice info. Can be disabled through preferences." +msgstr "" + +#: plugins/SliceInfoPlugin/plugin.json +msgctxt "name" +msgid "Slice info" +msgstr "" + +#: plugins/ImageReader/plugin.json +msgctxt "description" +msgid "Enables ability to generate printable geometry from 2D image files." +msgstr "" + +#: plugins/ImageReader/plugin.json +msgctxt "name" +msgid "Image Reader" +msgstr "" + +#: plugins/PostProcessingPlugin/plugin.json +msgctxt "description" +msgid "Extension that allows for user created scripts for post processing" +msgstr "" + +#: plugins/PostProcessingPlugin/plugin.json +msgctxt "name" +msgid "Post Processing" +msgstr "" + +#: plugins/AMFReader/plugin.json +msgctxt "description" +msgid "Provides support for reading AMF files." +msgstr "" + +#: plugins/AMFReader/plugin.json +msgctxt "name" +msgid "AMF Reader" +msgstr "" + +#: plugins/VersionUpgrade/VersionUpgrade53to54/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 5.3 to Cura 5.4." +msgstr "" + +#: plugins/VersionUpgrade/VersionUpgrade53to54/plugin.json +msgctxt "name" +msgid "Version Upgrade 5.3 to 5.4" +msgstr "" + +#: plugins/VersionUpgrade/VersionUpgrade460to462/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2." +msgstr "" + +#: plugins/VersionUpgrade/VersionUpgrade460to462/plugin.json +msgctxt "name" +msgid "Version Upgrade 4.6.0 to 4.6.2" +msgstr "" + +#: plugins/VersionUpgrade/VersionUpgrade47to48/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 4.7 to Cura 4.8." +msgstr "" + +#: plugins/VersionUpgrade/VersionUpgrade47to48/plugin.json +msgctxt "name" +msgid "Version Upgrade 4.7 to 4.8" +msgstr "" + +#: plugins/VersionUpgrade/VersionUpgrade42to43/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 4.2 to Cura 4.3." +msgstr "" + +#: plugins/VersionUpgrade/VersionUpgrade42to43/plugin.json +msgctxt "name" +msgid "Version Upgrade 4.2 to 4.3" +msgstr "" + +#: plugins/VersionUpgrade/VersionUpgrade32to33/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 3.2 to Cura 3.3." +msgstr "" + +#: plugins/VersionUpgrade/VersionUpgrade32to33/plugin.json +msgctxt "name" +msgid "Version Upgrade 3.2 to 3.3" msgstr "" #: plugins/VersionUpgrade/VersionUpgrade35to40/plugin.json @@ -6304,136 +6679,6 @@ msgctxt "name" msgid "Version Upgrade 2.7 to 3.0" msgstr "" -#: plugins/VersionUpgrade/VersionUpgrade44to45/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 4.4 to Cura 4.5." -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade44to45/plugin.json -msgctxt "name" -msgid "Version Upgrade 4.4 to 4.5" -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade30to31/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade30to31/plugin.json -msgctxt "name" -msgid "Version Upgrade 3.0 to 3.1" -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 2.1 to Cura 2.2." -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json -msgctxt "name" -msgid "Version Upgrade 2.1 to 2.2" -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade413to50/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 4.13 to Cura 5.0." -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade413to50/plugin.json -msgctxt "name" -msgid "Version Upgrade 4.13 to 5.0" -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade53to54/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 5.3 to Cura 5.4." -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade53to54/plugin.json -msgctxt "name" -msgid "Version Upgrade 5.3 to 5.4" -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade32to33/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 3.2 to Cura 3.3." -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade32to33/plugin.json -msgctxt "name" -msgid "Version Upgrade 3.2 to 3.3" -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade40to41/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 4.0 to Cura 4.1." -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade40to41/plugin.json -msgctxt "name" -msgid "Version Upgrade 4.0 to 4.1" -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade42to43/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 4.2 to Cura 4.3." -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade42to43/plugin.json -msgctxt "name" -msgid "Version Upgrade 4.2 to 4.3" -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade47to48/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 4.7 to Cura 4.8." -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade47to48/plugin.json -msgctxt "name" -msgid "Version Upgrade 4.7 to 4.8" -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade34to35/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade34to35/plugin.json -msgctxt "name" -msgid "Version Upgrade 3.4 to 3.5" -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade48to49/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 4.8 to Cura 4.9." -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade48to49/plugin.json -msgctxt "name" -msgid "Version Upgrade 4.8 to 4.9" -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade43to44/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 4.3 to Cura 4.4." -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade43to44/plugin.json -msgctxt "name" -msgid "Version Upgrade 4.3 to 4.4" -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json -msgctxt "name" -msgid "Version Upgrade 2.5 to 2.6" -msgstr "" - #: plugins/VersionUpgrade/VersionUpgrade462to47/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 4.6.2 to Cura 4.7." @@ -6444,34 +6689,14 @@ msgctxt "name" msgid "Version Upgrade 4.6.2 to 4.7" msgstr "" -#: plugins/VersionUpgrade/VersionUpgrade26to27/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json msgctxt "description" -msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." +msgid "Upgrades configurations from Cura 2.2 to Cura 2.4." msgstr "" -#: plugins/VersionUpgrade/VersionUpgrade26to27/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade22to24/plugin.json msgctxt "name" -msgid "Version Upgrade 2.6 to 2.7" -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade45to46/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 4.5 to Cura 4.6." -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade45to46/plugin.json -msgctxt "name" -msgid "Version Upgrade 4.5 to 4.6" -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade33to34/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 3.3 to Cura 3.4." -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade33to34/plugin.json -msgctxt "name" -msgid "Version Upgrade 3.3 to 3.4" +msgid "Version Upgrade 2.2 to 2.4" msgstr "" #: plugins/VersionUpgrade/VersionUpgrade52to53/plugin.json @@ -6484,16 +6709,6 @@ msgctxt "name" msgid "Version Upgrade 5.2 to 5.3" msgstr "" -#: plugins/VersionUpgrade/VersionUpgrade460to462/plugin.json -msgctxt "description" -msgid "Upgrades configurations from Cura 4.6.0 to Cura 4.6.2." -msgstr "" - -#: plugins/VersionUpgrade/VersionUpgrade460to462/plugin.json -msgctxt "name" -msgid "Version Upgrade 4.6.0 to 4.6.2" -msgstr "" - #: plugins/VersionUpgrade/VersionUpgrade49to410/plugin.json msgctxt "description" msgid "Upgrades configurations from Cura 4.9 to Cura 4.10." @@ -6504,114 +6719,144 @@ msgctxt "name" msgid "Version Upgrade 4.9 to 4.10" msgstr "" -#: plugins/CuraProfileWriter/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade48to49/plugin.json msgctxt "description" -msgid "Provides support for exporting Cura profiles." +msgid "Upgrades configurations from Cura 4.8 to Cura 4.9." msgstr "" -#: plugins/CuraProfileWriter/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade48to49/plugin.json msgctxt "name" -msgid "Cura Profile Writer" +msgid "Version Upgrade 4.8 to 4.9" msgstr "" -#: plugins/FirmwareUpdateChecker/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "description" -msgid "Checks for firmware updates." +msgid "Upgrades configurations from Cura 3.0 to Cura 3.1." msgstr "" -#: plugins/FirmwareUpdateChecker/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade30to31/plugin.json msgctxt "name" -msgid "Firmware Update Checker" +msgid "Version Upgrade 3.0 to 3.1" msgstr "" -#: plugins/PostProcessingPlugin/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "description" -msgid "Extension that allows for user created scripts for post processing" +msgid "Upgrades configurations from Cura 3.4 to Cura 3.5." msgstr "" -#: plugins/PostProcessingPlugin/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade34to35/plugin.json msgctxt "name" -msgid "Post Processing" +msgid "Version Upgrade 3.4 to 3.5" msgstr "" -#: plugins/USBPrinting/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade43to44/plugin.json msgctxt "description" -msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware." +msgid "Upgrades configurations from Cura 4.3 to Cura 4.4." msgstr "" -#: plugins/USBPrinting/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade43to44/plugin.json msgctxt "name" -msgid "USB printing" +msgid "Version Upgrade 4.3 to 4.4" msgstr "" -#: plugins/CuraDrive/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade41to42/plugin.json msgctxt "description" -msgid "Backup and restore your configuration." +msgid "Upgrades configurations from Cura 4.1 to Cura 4.2." msgstr "" -#: plugins/CuraDrive/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade41to42/plugin.json msgctxt "name" -msgid "Cura Backups" +msgid "Version Upgrade 4.1 to 4.2" msgstr "" -#: plugins/GCodeGzWriter/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade44to45/plugin.json msgctxt "description" -msgid "Writes g-code to a compressed archive." +msgid "Upgrades configurations from Cura 4.4 to Cura 4.5." msgstr "" -#: plugins/GCodeGzWriter/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade44to45/plugin.json msgctxt "name" -msgid "Compressed G-code Writer" +msgid "Version Upgrade 4.4 to 4.5" msgstr "" -#: plugins/GCodeWriter/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade33to34/plugin.json msgctxt "description" -msgid "Writes g-code to a file." +msgid "Upgrades configurations from Cura 3.3 to Cura 3.4." msgstr "" -#: plugins/GCodeWriter/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade33to34/plugin.json msgctxt "name" -msgid "G-code Writer" +msgid "Version Upgrade 3.3 to 3.4" msgstr "" -#: plugins/3MFWriter/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade411to412/plugin.json msgctxt "description" -msgid "Provides support for writing 3MF files." +msgid "Upgrades configurations from Cura 4.11 to Cura 4.12." msgstr "" -#: plugins/3MFWriter/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade411to412/plugin.json msgctxt "name" -msgid "3MF Writer" +msgid "Version Upgrade 4.11 to 4.12" msgstr "" -#: plugins/ModelChecker/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade413to50/plugin.json msgctxt "description" -msgid "Checks models and print configuration for possible printing issues and give suggestions." +msgid "Upgrades configurations from Cura 4.13 to Cura 5.0." msgstr "" -#: plugins/ModelChecker/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade413to50/plugin.json msgctxt "name" -msgid "Model Checker" +msgid "Version Upgrade 4.13 to 5.0" msgstr "" -#: plugins/GCodeReader/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade45to46/plugin.json msgctxt "description" -msgid "Allows loading and displaying G-code files." +msgid "Upgrades configurations from Cura 4.5 to Cura 4.6." msgstr "" -#: plugins/GCodeReader/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade45to46/plugin.json msgctxt "name" -msgid "G-code Reader" +msgid "Version Upgrade 4.5 to 4.6" msgstr "" -#: plugins/GCodeGzReader/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json msgctxt "description" -msgid "Reads g-code from a compressed archive." +msgid "Upgrades configurations from Cura 2.1 to Cura 2.2." msgstr "" -#: plugins/GCodeGzReader/plugin.json +#: plugins/VersionUpgrade/VersionUpgrade21to22/plugin.json msgctxt "name" -msgid "Compressed G-code Reader" +msgid "Version Upgrade 2.1 to 2.2" +msgstr "" + +#: plugins/VersionUpgrade/VersionUpgrade40to41/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 4.0 to Cura 4.1." +msgstr "" + +#: plugins/VersionUpgrade/VersionUpgrade40to41/plugin.json +msgctxt "name" +msgid "Version Upgrade 4.0 to 4.1" +msgstr "" + +#: plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.5 to Cura 2.6." +msgstr "" + +#: plugins/VersionUpgrade/VersionUpgrade25to26/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.5 to 2.6" +msgstr "" + +#: plugins/VersionUpgrade/VersionUpgrade26to27/plugin.json +msgctxt "description" +msgid "Upgrades configurations from Cura 2.6 to Cura 2.7." +msgstr "" + +#: plugins/VersionUpgrade/VersionUpgrade26to27/plugin.json +msgctxt "name" +msgid "Version Upgrade 2.6 to 2.7" msgstr "" #: plugins/DigitalLibrary/plugin.json @@ -6624,234 +6869,34 @@ msgctxt "name" msgid "Ultimaker Digital Library" msgstr "" -#: plugins/SupportEraser/plugin.json +#: plugins/ModelChecker/plugin.json msgctxt "description" -msgid "Creates an eraser mesh to block the printing of support in certain places" +msgid "Checks models and print configuration for possible printing issues and give suggestions." msgstr "" -#: plugins/SupportEraser/plugin.json +#: plugins/ModelChecker/plugin.json msgctxt "name" -msgid "Support Eraser" +msgid "Model Checker" msgstr "" -#: plugins/RemovableDriveOutputDevice/plugin.json +#: plugins/USBPrinting/plugin.json msgctxt "description" -msgid "Provides removable drive hotplugging and writing support." +msgid "Accepts G-Code and sends them to a printer. Plugin can also update firmware." msgstr "" -#: plugins/RemovableDriveOutputDevice/plugin.json +#: plugins/USBPrinting/plugin.json msgctxt "name" -msgid "Removable Drive Output Device Plugin" +msgid "USB printing" msgstr "" -#: plugins/SolidView/plugin.json +#: plugins/GCodeGzWriter/plugin.json msgctxt "description" -msgid "Provides a normal solid mesh view." +msgid "Writes g-code to a compressed archive." msgstr "" -#: plugins/SolidView/plugin.json +#: plugins/GCodeGzWriter/plugin.json msgctxt "name" -msgid "Solid View" -msgstr "" - -#: plugins/SentryLogger/plugin.json -msgctxt "description" -msgid "Logs certain events so that they can be used by the crash reporter" -msgstr "" - -#: plugins/SentryLogger/plugin.json -msgctxt "name" -msgid "Sentry Logger" -msgstr "" - -#: plugins/PerObjectSettingsTool/plugin.json -msgctxt "description" -msgid "Provides the Per Model Settings." -msgstr "" - -#: plugins/PerObjectSettingsTool/plugin.json -msgctxt "name" -msgid "Per Model Settings Tool" -msgstr "" - -#: plugins/3MFReader/plugin.json -msgctxt "description" -msgid "Provides support for reading 3MF files." -msgstr "" - -#: plugins/3MFReader/plugin.json -msgctxt "name" -msgid "3MF Reader" -msgstr "" - -#: plugins/AMFReader/plugin.json -msgctxt "description" -msgid "Provides support for reading AMF files." -msgstr "" - -#: plugins/AMFReader/plugin.json -msgctxt "name" -msgid "AMF Reader" -msgstr "" - -#: plugins/X3DReader/plugin.json -msgctxt "description" -msgid "Provides support for reading X3D files." -msgstr "" - -#: plugins/X3DReader/plugin.json -msgctxt "name" -msgid "X3D Reader" -msgstr "" - -#: plugins/SimulationView/plugin.json -msgctxt "description" -msgid "Provides the preview of sliced layerdata." -msgstr "" - -#: plugins/SimulationView/plugin.json -msgctxt "name" -msgid "Simulation View" -msgstr "" - -#: plugins/TrimeshReader/plugin.json -msgctxt "description" -msgid "Provides support for reading model files." -msgstr "" - -#: plugins/TrimeshReader/plugin.json -msgctxt "name" -msgid "Trimesh Reader" -msgstr "" - -#: plugins/CuraEngineBackend/plugin.json -msgctxt "description" -msgid "Provides the link to the CuraEngine slicing backend." -msgstr "" - -#: plugins/CuraEngineBackend/plugin.json -msgctxt "name" -msgid "CuraEngine Backend" -msgstr "" - -#: plugins/ImageReader/plugin.json -msgctxt "description" -msgid "Enables ability to generate printable geometry from 2D image files." -msgstr "" - -#: plugins/ImageReader/plugin.json -msgctxt "name" -msgid "Image Reader" -msgstr "" - -#: plugins/GCodeProfileReader/plugin.json -msgctxt "description" -msgid "Provides support for importing profiles from g-code files." -msgstr "" - -#: plugins/GCodeProfileReader/plugin.json -msgctxt "name" -msgid "G-code Profile Reader" -msgstr "" - -#: plugins/XmlMaterialProfile/plugin.json -msgctxt "description" -msgid "Provides capabilities to read and write XML-based material profiles." -msgstr "" - -#: plugins/XmlMaterialProfile/plugin.json -msgctxt "name" -msgid "Material Profiles" -msgstr "" - -#: plugins/MonitorStage/plugin.json -msgctxt "description" -msgid "Provides a monitor stage in Cura." -msgstr "" - -#: plugins/MonitorStage/plugin.json -msgctxt "name" -msgid "Monitor Stage" -msgstr "" - -#: plugins/CuraProfileReader/plugin.json -msgctxt "description" -msgid "Provides support for importing Cura profiles." -msgstr "" - -#: plugins/CuraProfileReader/plugin.json -msgctxt "name" -msgid "Cura Profile Reader" -msgstr "" - -#: plugins/UM3NetworkPrinting/plugin.json -msgctxt "description" -msgid "Manages network connections to UltiMaker networked printers." -msgstr "" - -#: plugins/UM3NetworkPrinting/plugin.json -msgctxt "name" -msgid "UltiMaker Network Connection" -msgstr "" - -#: plugins/PrepareStage/plugin.json -msgctxt "description" -msgid "Provides a prepare stage in Cura." -msgstr "" - -#: plugins/PrepareStage/plugin.json -msgctxt "name" -msgid "Prepare Stage" -msgstr "" - -#: plugins/UFPWriter/plugin.json -msgctxt "description" -msgid "Provides support for writing Ultimaker Format Packages." -msgstr "" - -#: plugins/UFPWriter/plugin.json -msgctxt "name" -msgid "UFP Writer" -msgstr "" - -#: plugins/UltimakerMachineActions/plugin.json -msgctxt "description" -msgid "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.)." -msgstr "" - -#: plugins/UltimakerMachineActions/plugin.json -msgctxt "name" -msgid "UltiMaker machine actions" -msgstr "" - -#: plugins/UFPReader/plugin.json -msgctxt "description" -msgid "Provides support for reading Ultimaker Format Packages." -msgstr "" - -#: plugins/UFPReader/plugin.json -msgctxt "name" -msgid "UFP Reader" -msgstr "" - -#: plugins/XRayView/plugin.json -msgctxt "description" -msgid "Provides the X-Ray view." -msgstr "" - -#: plugins/XRayView/plugin.json -msgctxt "name" -msgid "X-Ray View" -msgstr "" - -#: plugins/MachineSettingsAction/plugin.json -msgctxt "description" -msgid "Provides a way to change machine settings (such as build volume, nozzle size, etc.)." -msgstr "" - -#: plugins/MachineSettingsAction/plugin.json -msgctxt "name" -msgid "Machine Settings Action" +msgid "Compressed G-code Writer" msgstr "" #: plugins/PreviewStage/plugin.json @@ -6864,33 +6909,3 @@ msgctxt "name" msgid "Preview Stage" msgstr "" -#: plugins/SliceInfoPlugin/plugin.json -msgctxt "description" -msgid "Submits anonymous slice info. Can be disabled through preferences." -msgstr "" - -#: plugins/SliceInfoPlugin/plugin.json -msgctxt "name" -msgid "Slice info" -msgstr "" - -#: plugins/Marketplace/plugin.json -msgctxt "description" -msgid "Manages extensions to the application and allows browsing extensions from the UltiMaker website." -msgstr "" - -#: plugins/Marketplace/plugin.json -msgctxt "name" -msgid "Marketplace" -msgstr "" - -#: plugins/FirmwareUpdater/plugin.json -msgctxt "description" -msgid "Provides a machine actions for updating firmware." -msgstr "" - -#: plugins/FirmwareUpdater/plugin.json -msgctxt "name" -msgid "Firmware Updater" -msgstr "" - diff --git a/resources/i18n/de_DE/cura.po b/resources/i18n/de_DE/cura.po index 32d5befcda..c326cca9fd 100644 --- a/resources/i18n/de_DE/cura.po +++ b/resources/i18n/de_DE/cura.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -23,22 +23,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "Login fehlgeschlagen" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "Neue Position für Objekte finden" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "Position finden" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "Innerhalb der Druckabmessung für alle Objekte konnte keine Position gefunden werden" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "Kann Position nicht finden" @@ -265,25 +265,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Es kann nur jeweils ein G-Code gleichzeitig geladen werden. Wichtige {0} werden übersprungen." -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "Warnhinweis" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Wenn G-Code geladen wird, kann keine weitere Datei geöffnet werden. Wichtige {0} werden übersprungen." -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -410,17 +410,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "Berechnet" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Objekte vervielfältigen und platzieren" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "Objekte platzieren" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "Objekt-Platzierung" @@ -3675,17 +3675,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "Drucker entfernen" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Drucken über Netzwerk" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Drücken über Netzwerk" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "Über Netzwerk verbunden" @@ -4227,227 +4227,237 @@ msgctxt "@button" msgid "Cancel" msgstr "Abbrechen" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "Online-Fehlerbehebung anzeigen" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "Umschalten auf Vollbild-Modus" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "Vollbildmodus beenden" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Rückgängig machen" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Wiederholen" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Beenden" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "3D-Ansicht" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "Vorderansicht" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "Draufsicht" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "Ansicht von unten" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "Ansicht von links" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "Ansicht von rechts" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Cura konfigurieren..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Drucker hinzufügen..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Dr&ucker verwalten..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Materialien werden verwaltet..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "Weiteres Material aus Marketplace hinzufügen" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Profil mit aktuellen Einstellungen/Überschreibungen aktualisieren" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Aktuelle Änderungen verwerfen" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "P&rofil von aktuellen Einstellungen/Überschreibungen erstellen..." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Profile verwalten..." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Online-&Dokumentation anzeigen" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "&Fehler melden" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "Neuheiten" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "Über..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "Ausgewählte löschen" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "Ausgewählte zentrieren" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "Ausgewählte vervielfachen" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Modell löschen" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Modell auf Druckplatte ze&ntrieren" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "Modelle &gruppieren" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Gruppierung für Modelle aufheben" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Modelle &zusammenführen" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "Modell &multiplizieren..." -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "Alle Modelle wählen" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "Druckplatte reinigen" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "Alle Modelle neu laden" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Alle Modelle anordnen" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Anordnung auswählen" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Alle Modellpositionen zurücksetzen" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "Alle Modelltransformationen zurücksetzen" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Datei(en) öffnen..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Neues Projekt..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Konfigurationsordner anzeigen" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Sichtbarkeit einstellen wird konfiguriert..." @@ -5071,18 +5081,23 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Ausgewähltes Modell drucken mit:" msgstr[1] "Ausgewählte Modelle drucken mit:" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Ausgewähltes Modell multiplizieren" msgstr[1] "Ausgewählte Modelle multiplizieren" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "Anzahl Kopien" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" diff --git a/resources/i18n/es_ES/cura.po b/resources/i18n/es_ES/cura.po index 991ce49f1e..f8f3eddb49 100644 --- a/resources/i18n/es_ES/cura.po +++ b/resources/i18n/es_ES/cura.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Cura 5.3\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -22,22 +22,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "Fallo de inicio de sesión" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "Buscando nueva ubicación para los objetos" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "Buscando ubicación" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "No se puede encontrar una ubicación dentro del volumen de impresión para todos los objetos" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "No se puede encontrar la ubicación" @@ -264,25 +264,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Solo se puede cargar un archivo GCode a la vez. Se omitió la importación de {0}" -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "Advertencia" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "No se puede abrir ningún archivo si se está cargando un archivo GCode. Se omitió la importación de {0}" -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -409,17 +409,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "Calculado" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Multiplicar y colocar objetos" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "Colocando objetos" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "Colocando objeto" @@ -3675,17 +3675,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "Eliminar impresoras" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Imprimir a través de la red" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Imprime a través de la red" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "Conectado a través de la red" @@ -4227,227 +4227,237 @@ msgctxt "@button" msgid "Cancel" msgstr "Cancelar" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "Mostrar resolución de problemas online" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "Alternar pantalla completa" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "Salir de modo de pantalla completa" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "Des&hacer" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Rehacer" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Salir" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "Vista en 3D" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "Vista frontal" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "Vista superior" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "Vista inferior" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "Vista del lado izquierdo" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "Vista del lado derecho" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Configurar Cura..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Agregar impresora..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Adm&inistrar impresoras ..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Administrar materiales..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "Añadir más materiales de Marketplace" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Actualizar perfil con ajustes o sobrescrituras actuales" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Descartar cambios actuales" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Crear perfil a partir de ajustes o sobrescrituras actuales..." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Administrar perfiles..." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Mostrar &documentación en línea" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Informar de un &error" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "Novedades" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "Acerca de..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "Eliminar selección" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "Centrar selección" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "Multiplicar selección" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Eliminar modelo" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Ce&ntrar modelo en plataforma" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "A&grupar modelos" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Desagrupar modelos" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Co&mbinar modelos" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Multiplicar modelo..." -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "Seleccionar todos los modelos" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "Borrar placa de impresión" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "Recargar todos los modelos" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Organizar todos los modelos" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Organizar selección" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Restablecer las posiciones de todos los modelos" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "Restablecer las transformaciones de todos los modelos" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Abrir archivo(s)..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Nuevo proyecto..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Mostrar carpeta de configuración" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Configurar visibilidad de los ajustes..." @@ -5071,18 +5081,23 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Imprimir modelo seleccionado con:" msgstr[1] "Imprimir modelos seleccionados con:" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Multiplicar modelo seleccionado" msgstr[1] "Multiplicar modelos seleccionados" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "Número de copias" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" diff --git a/resources/i18n/fi_FI/cura.po b/resources/i18n/fi_FI/cura.po index f2b4e4cbcb..95c45c0ea1 100644 --- a/resources/i18n/fi_FI/cura.po +++ b/resources/i18n/fi_FI/cura.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Cura 5.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: 2022-07-15 10:53+0200\n" "Last-Translator: Bothof \n" "Language-Team: Finnish\n" @@ -23,22 +23,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "Uusien paikkojen etsiminen kappaleille" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "Etsitään paikkaa" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "Kaikille kappaleille ei löydy paikkaa tulostustilavuudessa" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "Paikkaa ei löydy" @@ -257,25 +257,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Vain yksi G-code-tiedosto voidaan ladata kerralla. Tiedoston {0} tuonti ohitettiin." -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "Varoitus" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Muita tiedostoja ei voida ladata, kun G-code latautuu. Tiedoston {0} tuonti ohitettiin." -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -402,17 +402,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "Laskettu" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Kappaleiden kertominen ja sijoittelu" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "Sijoitetaan kappaletta" @@ -3650,17 +3650,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Tulosta verkon kautta" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Tulosta verkon kautta" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "" @@ -4199,227 +4199,237 @@ msgctxt "@button" msgid "Cancel" msgstr "" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "Vaihda koko näyttöön" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Kumoa" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "Tee &uudelleen" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Lopeta" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Määritä Curan asetukset..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "L&isää tulostin..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Tulostinten &hallinta..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Hallitse materiaaleja..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Päivitä nykyiset asetukset tai ohitukset profiiliin" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Hylkää tehdyt muutokset" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Luo profiili nykyisten asetusten tai ohitusten perusteella..." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Profiilien hallinta..." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Näytä sähköinen &dokumentaatio" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Ilmoita &virheestä" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "Tietoja..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Poista malli" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Ke&skitä malli alustalle" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&Ryhmittele mallit" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Poista mallien ryhmitys" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Yhdistä mallit" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Kerro malli..." -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "Valitse kaikki mallit" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "Tyhjennä tulostusalusta" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "Lataa kaikki mallit uudelleen" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Järjestä kaikki mallit" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Järjestä valinta" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Määritä kaikkien mallien positiot uudelleen" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "Määritä kaikkien mallien muutokset uudelleen" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Avaa tiedosto(t)..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Uusi projekti..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Näytä määrityskansio" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Määritä asetusten näkyvyys..." @@ -5040,18 +5050,23 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Tulosta valittu malli asetuksella:" msgstr[1] "Tulosta valitut mallit asetuksella:" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Kerro valittu malli" msgstr[1] "Kerro valitut mallit" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "Kopioiden määrä" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" diff --git a/resources/i18n/fr_FR/cura.po b/resources/i18n/fr_FR/cura.po index ea1d51cd5a..e496faed64 100644 --- a/resources/i18n/fr_FR/cura.po +++ b/resources/i18n/fr_FR/cura.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -23,22 +23,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "La connexion a échoué" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "Recherche d'un nouvel emplacement pour les objets" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "Recherche d'emplacement" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "Impossible de trouver un emplacement dans le volume d'impression pour tous les objets" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "Impossible de trouver un emplacement" @@ -265,25 +265,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Un seul fichier G-Code peut être chargé à la fois. Importation de {0} sautée" -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "Avertissement" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Impossible d'ouvrir un autre fichier si le G-Code est en cours de chargement. Importation de {0} sautée" -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -410,17 +410,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "Calculer" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Multiplication et placement d'objets" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "Placement des objets" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "Placement de l'objet" @@ -3678,17 +3678,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "Supprimer des imprimantes" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Imprimer sur le réseau" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Imprimer sur le réseau" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "Connecté sur le réseau" @@ -4227,227 +4227,237 @@ msgctxt "@button" msgid "Cancel" msgstr "Annuler" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "Afficher le dépannage en ligne" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "Passer en Plein écran" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "Quitter le mode plein écran" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Annuler" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Rétablir" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Quitter" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "Vue 3D" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "Vue de face" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "Vue du dessus" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "Vue de dessous" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "Vue latérale gauche" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "Vue latérale droite" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Configurer Cura..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Ajouter une imprimante..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Gérer les &imprimantes..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Gérer les matériaux..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "Ajouter d'autres matériaux depuis la Marketplace" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Mettre à jour le profil à l'aide des paramètres / forçages actuels" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Ignorer les modifications actuelles" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Créer un profil à partir des paramètres / forçages actuels..." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Gérer les profils..." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Afficher la &documentation en ligne" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Notifier un &bug" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "Quoi de neuf" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "À propos de..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "Supprimer la sélection" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "Centrer la sélection" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "Multiplier la sélection" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Supprimer le modèle" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Ce&ntrer le modèle sur le plateau" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&Grouper les modèles" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Dégrouper les modèles" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Fusionner les modèles" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Multiplier le modèle..." -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "Sélectionner tous les modèles" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "Supprimer les modèles du plateau" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "Recharger tous les modèles" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Réorganiser tous les modèles" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Réorganiser la sélection" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Réinitialiser toutes les positions des modèles" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "Réinitialiser tous les modèles et transformations" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Ouvrir le(s) fichier(s)..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Nouveau projet..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Afficher le dossier de configuration" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Configurer la visibilité des paramètres..." @@ -5071,18 +5081,23 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Imprimer le modèle sélectionné avec :" msgstr[1] "Imprimer les modèles sélectionnés avec :" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Multiplier le modèle sélectionné" msgstr[1] "Multiplier les modèles sélectionnés" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "Nombre de copies" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" diff --git a/resources/i18n/hu_HU/cura.po b/resources/i18n/hu_HU/cura.po index 9ea5ca5aea..06e99060f7 100644 --- a/resources/i18n/hu_HU/cura.po +++ b/resources/i18n/hu_HU/cura.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Cura 5.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: 2020-03-24 09:36+0100\n" "Last-Translator: Nagy Attila \n" "Language-Team: ATI-SZOFT\n" @@ -23,22 +23,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "Sikertelen bejelentkezés" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "Új hely keresése az objektumokhoz" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "Hely keresés" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "Nincs elég hely az összes objektum építési térfogatához" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "Nem találok helyet" @@ -265,25 +265,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Egyszerre csak egy G-kód fájlt lehet betölteni. Az importálás kihagyva {0}" -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "Figyelem" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Nem nyitható meg más fájl, ha a G-kód betöltődik. Az importálás kihagyva {0}" -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -410,17 +410,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "Számított" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Tárgyak többszörözése és elhelyezése" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "Tárgyak elhelyezése" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "Tárgy elhelyezése" @@ -3666,17 +3666,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Hálózati nyomtatás" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Hálózati nyomtatás" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "Csatlakozva hálózaton keresztül" @@ -4215,227 +4215,237 @@ msgctxt "@button" msgid "Cancel" msgstr "Elvet" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "Teljes képernyőre váltás" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "Kilépés a teljes képernyőn" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Visszavon" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Újra" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "Kilép" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "3D nézet" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "Előlnézet" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "Felülnézet" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "Bal oldalnézet" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "Jobb oldalnézet" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Cura beállítása..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Nyomtató hozzáadása..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Nyomtatók kezelése..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Anyagok kezelése..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "Profil &frissítése a jelenlegi beállításokkal/felülírásokkal" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Jelenlegi változtatások eldobása" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "Profil &létrehozása a jelenlegi beállításokkal/felülírásokkal..." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Profilok kezelése..." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Online &Dokumentumok megjelenítése" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Hibajelentés" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "Újdonságok" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "Rólunk..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Modell törlés" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "&Középső modell a platformon" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&Csoportosítás" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Csoport bontása" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Modellek keverése" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Modell többszörözés..." -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "Mindent kijelöl" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "Tárgyasztal törlése" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "Mindent újratölt" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Minden modell rendezése" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Kijelöltek rendezése" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Minden modellpozíció visszaállítása" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "Minden modelltranszformáció visszaállítása" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "Fájl(ok) megnyitása..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "Új projekt..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Konfigurációs mappa megjelenítése" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Beállítások láthatóságának beállítása..." @@ -5054,18 +5064,23 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Kiválasztott modell nyomtatása:" msgstr[1] "Kiválasztott modellek nyomtatása:" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Kiválasztott modell sokszorozása" msgstr[1] "Kiválasztott modellek sokszorozása" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "Másolatok száma" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" diff --git a/resources/i18n/it_IT/cura.po b/resources/i18n/it_IT/cura.po index ea4fc72cff..8151bb48c9 100644 --- a/resources/i18n/it_IT/cura.po +++ b/resources/i18n/it_IT/cura.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -23,22 +23,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "Login non riuscito" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "Ricerca nuova posizione per gli oggetti" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "Ricerca posizione" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "Impossibile individuare una posizione nel volume di stampa per tutti gli oggetti" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "Impossibile individuare posizione" @@ -265,25 +265,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "È possibile caricare un solo file codice G per volta. Importazione saltata {0}" -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "Avvertenza" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Impossibile aprire altri file durante il caricamento del codice G. Importazione saltata {0}" -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -410,17 +410,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "Calcolato" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Moltiplicazione e collocazione degli oggetti" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "Sistemazione oggetti" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "Sistemazione oggetto" @@ -3678,17 +3678,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "Rimuovere le stampanti" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Stampa sulla rete" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Stampa sulla rete" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "Collegato alla rete" @@ -4230,227 +4230,237 @@ msgctxt "@button" msgid "Cancel" msgstr "Annulla" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "Mostra ricerca e riparazione dei guasti online" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "Attiva/disattiva schermo intero" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "Esci da schermo intero" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Annulla" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "Ri&peti" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Esci" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "Visualizzazione 3D" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "Visualizzazione frontale" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "Visualizzazione superiore" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "Vista inferiore" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "Visualizzazione lato sinistro" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "Visualizzazione lato destro" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Configura Cura..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Aggiungi stampante..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Gestione stampanti..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Gestione materiali..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "Aggiungere altri materiali da Marketplace" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Aggiorna il profilo con le impostazioni/esclusioni correnti" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Elimina le modifiche correnti" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Crea profilo dalle impostazioni/esclusioni correnti..." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Gestione profili..." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Mostra documentazione &online" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Se&gnala un errore" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "Scopri le novità" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "Informazioni..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "Cancella selezionati" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "Centra selezionati" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "Moltiplica selezionati" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Elimina modello" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "C&entra modello su piattaforma" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&Raggruppa modelli" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Separa modelli" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Unisci modelli" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "Mo<iplica modello..." -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "Seleziona tutti i modelli" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "Cancellare piano di stampa" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "Ricarica tutti i modelli" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Sistema tutti i modelli" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Sistema selezione" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Reimposta tutte le posizioni dei modelli" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "Reimposta tutte le trasformazioni dei modelli" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Apri file..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Nuovo Progetto..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Mostra cartella di configurazione" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Configura visibilità delle impostazioni..." @@ -5074,18 +5084,23 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Stampa modello selezionato con:" msgstr[1] "Stampa modelli selezionati con:" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Moltiplica modello selezionato" msgstr[1] "Moltiplica modelli selezionati" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "Numero di copie" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" diff --git a/resources/i18n/ja_JP/cura.po b/resources/i18n/ja_JP/cura.po index 3a896394a5..7609c93e0f 100644 --- a/resources/i18n/ja_JP/cura.po +++ b/resources/i18n/ja_JP/cura.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -23,22 +23,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "ログインに失敗しました" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "造形物のために新しい位置を探索中" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "位置確認" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "全ての造形物の造形サイズに対し、適切な位置が確認できません" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "位置を確保できません" @@ -265,25 +265,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "一度に一つのG-codeしか読み取れません。{0}の取り込みをスキップしました。" -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "警告" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "G-codeを読み込み中は他のファイルを開くことができません。{0}の取り込みをスキップしました。" -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -410,17 +410,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "計算された" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "造形データを増やす、配置する" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "造形データを配置" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "造形データを配置" @@ -3666,17 +3666,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "プリンターを取り除く" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "ネットワーク上のプリント" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "ネットワークのプリント" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "ネットワーク上で接続" @@ -4218,227 +4218,237 @@ msgctxt "@button" msgid "Cancel" msgstr "キャンセル" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "オンライントラブルシューティングを表示" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "留め金 フルスクリーン" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "全画面表示を終了する" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&取り消す" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&やりなおす" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&やめる" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "3Dビュー" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "フロントビュー" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "トップビュー" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "底面図" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "左サイドビュー" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "右サイドビュー" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Curaを構成する..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&プリンターを追加する..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "プリンターを管理する..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "フィラメントを管理する..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "Add more materials from Marketplace" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&現在の設定/無効にプロファイルをアップデートする" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&変更を破棄する" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&今の設定/無効からプロファイルを作成する..." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "プロファイルを管理する..." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "オンラインドキュメントを表示する" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "報告&バグ" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "新情報" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "アバウト..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "選択内容を削除" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "選択内容を中央に移動" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "選択内容を増倍" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "モデルを消去する" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "プラットホームの中心にモデルを配置" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&モデルグループ" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "モデルを非グループ化" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "モ&デルの合体" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&モデルを増倍する..." -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "すべてのモデル選択" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "ビルドプレート上のクリア" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "すべてのモデルを読み込む" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "すべてのモデルをアレンジする" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "選択をアレンジする" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "すべてのモデルのポジションをリセットする" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "すべてのモデル&変更点をリセットする" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&ファイルを開く(s)..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&新しいプロジェクト..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "コンフィグレーションのフォルダーを表示する" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "視野のセッティングを構成する..." @@ -5061,17 +5071,22 @@ msgid "Print Selected Model With:" msgid_plural "Print Selected Models With:" msgstr[0] "選択したモデルで印刷:" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "選択した複数のモデル" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "コピーの数" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" diff --git a/resources/i18n/ko_KR/cura.po b/resources/i18n/ko_KR/cura.po index f7a5f47e0a..45af01145e 100644 --- a/resources/i18n/ko_KR/cura.po +++ b/resources/i18n/ko_KR/cura.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -23,22 +23,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "로그인 실패" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "객체의 새 위치 찾기" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "위치 찾기" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "모든 개체가 출력할 수 있는 최대 사이즈 내에 위치할 수 없습니다" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "위치를 찾을 수 없음" @@ -265,25 +265,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "한 번에 하나의 G-코드 파일만 로드 할 수 있습니다. {0} 가져 오기를 건너 뛰었습니다." -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "경고" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "G-코드가 로드되어 있으면 다른 파일을 열 수 없습니다. {0} 가져 오기를 건너 뛰었습니다." -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -410,17 +410,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "계산된" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "객체를 증가시키고 배치" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "개체 배치 중" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "개체 배치 중" @@ -3665,17 +3665,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "프린터 제거" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "네트워크를 통해 프린팅" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "네트워크를 통해 프린팅" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "네트워크를 통해 연결됨" @@ -4217,227 +4217,237 @@ msgctxt "@button" msgid "Cancel" msgstr "취소" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "온라인 문제 해결 표시" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "전채 화면 전환" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "전체 화면 종료" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "되돌리기(&U)" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "다시하기(&R)" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "종료(&Q)" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "3D 보기" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "앞에서 보기" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "위에서 보기" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "하단 뷰" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "왼쪽에서 보기" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "오른쪽에서 보기" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Cura 구성 ..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "프린터 추가..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "프린터 관리 ..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "재료 관리..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "마켓플레이스에서 더 많은 재료 추가" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "현재 설정으로로 프로파일 업데이트" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "현재 변경 사항 무시" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "현재 설정으로 프로파일 생성..." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "프로파일 관리..." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "온라인 문서 표시" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "버그 리포트" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "새로운 기능" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "소개..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "선택 항목 삭제" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "선택 항목 가운데 정렬" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "선택 항목 복제" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "모델 삭제" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "플랫폼중심에 모델 위치하기" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "모델 그룹화" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "모델 그룹 해제" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "모델 합치기" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "모델 복제..." -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "모든 모델 선택" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "빌드 플레이트 지우기" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "모든 모델 다시 로드" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "모든 모델 정렬" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "선택한 모델 정렬" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "모든 모델의 위치 재설정" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "모든 모델의 변환 재설정" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "파일 열기..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "새로운 프로젝트..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "설정 폴더 표시" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "설정 보기..." @@ -5060,17 +5070,22 @@ msgid "Print Selected Model With:" msgid_plural "Print Selected Models With:" msgstr[0] "선택된 모델 프린팅 :" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "선택한 모델 복" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "복제할 수" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" diff --git a/resources/i18n/nl_NL/cura.po b/resources/i18n/nl_NL/cura.po index 6c903dd42c..6a3bb768c4 100644 --- a/resources/i18n/nl_NL/cura.po +++ b/resources/i18n/nl_NL/cura.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -23,22 +23,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "Inloggen mislukt" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "Nieuwe locatie vinden voor objecten" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "Locatie vinden" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "Kan binnen het werkvolume niet voor alle objecten een locatie vinden" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "Kan locatie niet vinden" @@ -265,25 +265,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Er kan slechts één G-code-bestand tegelijkertijd worden geladen. Het importeren van {0} is overgeslagen" -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "Waarschuwing" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Kan geen ander bestand openen als G-code wordt geladen. Het importeren van {0} is overgeslagen" -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -410,17 +410,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "Berekend" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Objecten verveelvoudigen en plaatsen" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "Objecten plaatsen" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "Object plaatsen" @@ -3678,17 +3678,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "Printers verwijderen" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Printen via netwerk" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Printen via netwerk" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "Via het netwerk verbonden" @@ -4230,227 +4230,237 @@ msgctxt "@button" msgid "Cancel" msgstr "Annuleren" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "Online probleemoplossing weergeven" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "Volledig Scherm In-/Uitschakelen" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "Volledig scherm sluiten" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "Ongedaan &Maken" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Opnieuw" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Afsluiten" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "3D-weergave" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "Weergave voorzijde" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "Weergave bovenzijde" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "Aanzicht onderzijde" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "Weergave linkerzijde" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "Weergave rechterzijde" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Cura Configureren..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Printer Toevoegen..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Pr&inters Beheren..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Materialen Beheren..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "Meer materialen toevoegen van Marketplace" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "Profiel bijwerken met h&uidige instellingen/overschrijvingen" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "Hui&dige wijzigingen verwijderen" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "Profiel maken op basis van huidige instellingen/overs&chrijvingen..." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Profielen Beheren..." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Online &Documentatie Weergeven" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Een &Bug Rapporteren" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "Nieuwe functies" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "Over..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "Verwijder geselecteerde items" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "Centreer geselecteerde items" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "Verveelvoudig geselecteerde items" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Model Verwijderen" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Model op Platform Ce&ntreren" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "Modellen &Groeperen" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Groeperen van Modellen Opheffen" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Modellen Samen&voegen" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Model verveelvoudigen..." -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "Alle Modellen Selecteren" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "Platform Leegmaken" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "Alle Modellen Opnieuw Laden" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Alle modellen schikken" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Selectie schikken" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Alle Modelposities Herstellen" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "Alle Modeltransformaties Herstellen" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "Bestand(en) &openen..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Nieuw project..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Open Configuratiemap" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Zichtbaarheid Instelling Configureren..." @@ -5074,18 +5084,23 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Geselecteerd model printen met:" msgstr[1] "Geselecteerde modellen printen met:" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Geselecteerd model verveelvoudigen" msgstr[1] "Geselecteerde modellen verveelvoudigen" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "Aantal exemplaren" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" diff --git a/resources/i18n/pl_PL/cura.po b/resources/i18n/pl_PL/cura.po index 6bdef88ffd..27734220ad 100644 --- a/resources/i18n/pl_PL/cura.po +++ b/resources/i18n/pl_PL/cura.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Cura 5.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: 2021-09-07 08:02+0200\n" "Last-Translator: Mariusz Matłosz \n" "Language-Team: Mariusz Matłosz , reprapy.pl\n" @@ -24,22 +24,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "Logowanie nie powiodło się" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "Znajdowanie nowej lokalizacji obiektów" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "Szukanie Lokalizacji" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "Nie można znaleźć lokalizacji w obrębie obszaru roboczego dla wszystkich obiektów" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "Nie można Znaleźć Lokalizacji" @@ -266,25 +266,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Jednocześnie można załadować tylko jeden plik G-code. Pominięto importowanie {0}" -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "Ostrzeżenie" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Nie można otworzyć żadnego innego pliku, jeśli ładuje się G-code. Pominięto importowanie {0}" -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -411,17 +411,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "Przeliczone" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Zwielokrotnienie i umieszczanie przedmiotów" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "Umieść Obiekty" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "Rozmieszczenie Obiektów" @@ -3667,17 +3667,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Drukuj przez sieć" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Drukuj przez sieć" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "Połączone przez sieć" @@ -4216,227 +4216,237 @@ msgctxt "@button" msgid "Cancel" msgstr "Anuluj" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "Przełącz tryb pełnoekranowy" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "Wyłącz tryb pełnoekranowy" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Cofnij" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Ponów" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Zamknij" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "Widok 3D" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "Widok z przodu" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "Widok z góry" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "Widok z lewej strony" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "Widok z prawej strony" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Konfiguruj Cura..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Dodaj drukarkę..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Zarządzaj drukarkami..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Zarządzaj materiałami..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Aktualizuj profil z bieżącymi ustawieniami" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Odrzuć bieżące zmiany" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Utwórz profil z bieżących ustawień..." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Zarządzaj profilami..." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Pokaż dokumentację internetową" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Zgłoś błąd" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "Co nowego" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "O..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Usuń model" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Wyśrodkuj model na platformie" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&Grupuj modele" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Rozgrupuj modele" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Połącz modele" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Powiel model..." -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "Wybierz wszystkie modele" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "Wyczyść stół" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "Przeładuj wszystkie modele" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Ułóż wszystkie modele" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Wybór ułożenia" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Zresetuj wszystkie pozycje modelu" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "Zresetuj wszystkie przekształcenia modelu" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Otwórz plik(i)..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Nowy projekt..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Pokaż folder konfiguracji" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Skonfiguruj widoczność ustawień ..." @@ -5057,18 +5067,23 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Wydrukuj wybrany model z:" msgstr[1] "Wydrukuj wybrane modele z:" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Zduplikuj wybrany model" msgstr[1] "Zduplikuj wybrane modele" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "Liczba kopii" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" diff --git a/resources/i18n/pt_BR/cura.po b/resources/i18n/pt_BR/cura.po index 4242a852d5..1973e9e3ed 100644 --- a/resources/i18n/pt_BR/cura.po +++ b/resources/i18n/pt_BR/cura.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Cura 5.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: 2023-02-17 17:37+0100\n" "Last-Translator: Cláudio Sampaio \n" "Language-Team: Cláudio Sampaio \n" @@ -23,22 +23,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "Login falhou" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "Achando novos lugares para objetos" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "Buscando Localização" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "Não foi possível achar um lugar dentro do volume de construção para todos os objetos" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "Não Foi Encontrada Localização" @@ -265,25 +265,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Somente um arquivo G-Code pode ser carregado por vez. Pulando importação de {0}" -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "Aviso" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Não é possível abrir nenhum outro arquivo se G-Code estiver sendo carregado. Pulando importação de {0}" -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -410,17 +410,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "Calculado" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Multiplicando e colocando objetos" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "Colocando Objetos" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "Colocando Objeto" @@ -3678,17 +3678,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "Remover impressoras" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Imprimir pela rede" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Imprime pela rede" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "Conectado pela rede" @@ -4230,227 +4230,237 @@ msgctxt "@button" msgid "Cancel" msgstr "Cancelar" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "Mostrar Resolução de Problemas Online" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "Alternar Tela Cheia" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "Sair da Tela Cheia" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "Desfazer (&U)" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Refazer" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "Sair (&Q)" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "Visão &3D" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "Visão Frontal" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "Visão Superior" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "Visão de Baixo" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "Visão do Lado Esquerdo" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "Visão do Lado Direito" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Configurar Cura..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Adicionar Impressora..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Adm&inistrar Impressoras..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Administrar Materiais..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "Adicionar mais materiais ao Marketplace" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "At&ualizar perfil com valores e sobreposições atuais" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Descartar ajustes atuais" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Criar perfil a partir de ajustes/sobreposições atuais..." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Administrar perfis..." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Exibir &Documentação Online" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Relatar um &Bug" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "Novidades" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "Sobre..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "Remover Selecionados" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "Centralizar Selecionados" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "Multiplicar Selecionados" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Remover Modelo" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Ce&ntralizar Modelo na Mesa" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "A&grupar Modelos" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Desagrupar Modelos" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Co&mbinar Modelos" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Multiplicar Modelo..." -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "Selecionar Todos Os Modelos" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "Esvaziar a Mesa de Impressão" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "Recarregar Todos Os Modelos" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Posicionar Todos os Modelos" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Posicionar Seleção" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Reestabelecer as Posições de Todos Os Modelos" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "Remover as Transformações de Todos Os Modelos" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "Abrir Arquiv&o(s)..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Novo Projeto..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Exibir Pasta de Configuração" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Configurar a visibilidade dos ajustes..." @@ -5071,18 +5081,23 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Imprimir Modelo Selecionado Com:" msgstr[1] "Imprimir Modelos Selecionados Com:" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Multiplicar Modelo Selecionado" msgstr[1] "Multiplicar Modelos Selecionados" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "Número de Cópias" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" diff --git a/resources/i18n/pt_PT/cura.po b/resources/i18n/pt_PT/cura.po index 21eace1a53..2f683461e6 100644 --- a/resources/i18n/pt_PT/cura.po +++ b/resources/i18n/pt_PT/cura.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -23,22 +23,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "Falha no início de sessão" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "A procurar nova posição para os objetos" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "A Procurar Posição" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "Não é possível posicionar todos os objetos dentro do volume de construção" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "Não é Possível Posicionar" @@ -265,25 +265,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Apenas pode ser carregado um ficheiro G-code de cada vez. Importação {0} ignorada" -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "Aviso" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Não é possível abrir outro ficheiro enquanto o G-code estiver a carregar. Importação {0} ignorada" -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -410,17 +410,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "Calculado" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Multiplicar e posicionar objetos" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "A posicionar objetos" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "A Posicionar Objeto" @@ -3676,17 +3676,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "Remover impressoras" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Imprimir através da rede" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Imprimir através da rede" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "Ligado através da rede" @@ -4228,227 +4228,237 @@ msgctxt "@button" msgid "Cancel" msgstr "Cancelar" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "Ver online o guia de resolução de problemas" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "Alternar para ecrã inteiro" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "Sair do Ecrã Inteiro" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Desfazer" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Refazer" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Sair" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "Vista 3D" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "Vista Frente" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "Vista Cima" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "Vista Inferior" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "Vista Lado Esquerdo" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "Vista Lado Direito" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Configurar Cura..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Adicionar Impressora..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Gerir Im&pressoras..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Gerir Materiais..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "Adicionar mais materiais disponíveis no Marketplace" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Atualizar perfil com as definições/substituições atuais" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Descartar alterações atuais" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "&Criar perfil a partir das definições/substituições atuais..." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Gerir Perfis..." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Mostrar &documentação online" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Reportar um &erro" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "Novidades" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "Sobre..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "Apagar seleção" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "Centrar seleção" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "Multiplicar seleção" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Apagar Modelo" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Ce&ntrar Modelo na Base" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "&Agrupar Modelos" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Desagrupar Modelos" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Combinar Modelos" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Multiplicar Modelo..." -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "Selecionar todos os modelos" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "Limpar base de construção" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "Recarregar todos os modelos" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Dispor todos os modelos" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Dispor seleção" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Repor todas as posições de modelos" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "Repor Todas as Transformações do Modelo" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Abrir Ficheiro(s)..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Novo Projeto..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Mostrar pasta de configuração" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Configurar visibilidade das definições..." @@ -5072,18 +5082,23 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Imprimir Modelo Selecionado Com:" msgstr[1] "Imprimir modelos selecionados com:" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Multiplicar Modelo Selecionado" msgstr[1] "Multiplicar modelos selecionados" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "Número de Cópias" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" diff --git a/resources/i18n/ru_RU/cura.po b/resources/i18n/ru_RU/cura.po index a43df3e590..15431cabc9 100644 --- a/resources/i18n/ru_RU/cura.po +++ b/resources/i18n/ru_RU/cura.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -23,22 +23,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "Вход не выполнен" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "Поиск места для новых объектов" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "Поиск места" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "Невозможно разместить все объекты внутри печатаемого объёма" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "Не могу найти место" @@ -265,25 +265,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f мм" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Только один G-code файла может быть загружен в момент времени. Пропускаю импортирование {0}" -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "Внимание" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "Невозможно открыть любой другой файл, если G-code файл уже загружен. Пропускаю импортирование {0}" -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -410,17 +410,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "Вычислено" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Размножение и размещение объектов" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "Размещение объектов" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "Размещение объекта" @@ -3687,17 +3687,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "Удалить принтеры" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Печать через сеть" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Печать через сеть" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "Подключен по сети" @@ -4239,227 +4239,237 @@ msgctxt "@button" msgid "Cancel" msgstr "Отмена" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "Показать сетевое руководство по устранению неполадок" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "Полный экран" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "Выйти из полноэкранного режима" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "Отмена" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "Возврат" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "Выход" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "Трехмерный вид" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "Вид спереди" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "Вид сверху" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "Вид снизу" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "Вид слева" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "Вид справа" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Настроить Cura..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "Добавить принтер..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Управление принтерами..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Управление материалами..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "Добавить больше материалов из Магазина" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "Обновить профиль текущими параметрами" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "Сбросить текущие параметры" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "Создать профиль из текущих параметров..." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Управление профилями..." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Показать онлайн документацию" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Отправить отчёт об ошибке" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "Что нового" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "О Cura..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "Удалить выбранное" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "Центрировать выбранное" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "Размножить выбранное" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Удалить модель" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Поместить модель по центру" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "Сгруппировать модели" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Разгруппировать модели" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "Объединить модели" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "Дублировать модель..." -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "Выбрать все модели" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "Очистить стол" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "Перезагрузить все модели" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Выровнять все модели" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Выровнять выбранные" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Сбросить позиции всех моделей" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "Сбросить преобразования всех моделей" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "Открыть файл(ы)..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "Новый проект..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Показать конфигурационный каталог" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Видимость параметров..." @@ -5084,7 +5094,7 @@ msgstr[0] "Печать выбранной модели:" msgstr[1] "Печать выбранных моделей:" msgstr[2] "Печать выбранных моделей:" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" @@ -5092,11 +5102,16 @@ msgstr[0] "Размножить выбранную модель" msgstr[1] "Размножить выбранные модели" msgstr[2] "Размножить выбранные модели" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "Количество копий" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" diff --git a/resources/i18n/tr_TR/cura.po b/resources/i18n/tr_TR/cura.po index 7731155049..f607ed1c83 100644 --- a/resources/i18n/tr_TR/cura.po +++ b/resources/i18n/tr_TR/cura.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -23,22 +23,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "Giriş başarısız" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "Nesneler için yeni konum bulunuyor" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "Konumu Buluyor" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "Yapılan hacim içinde tüm nesneler için konum bulunamadı" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "Konum Bulunamıyor" @@ -265,25 +265,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "Aynı anda yalnızca bir G-code dosyası yüklenebilir. {0} içe aktarma atlandı" -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "Uyarı" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "G-code yüklenirken başka bir dosya açılamaz. {0} içe aktarma atlandı" -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -410,17 +410,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "Hesaplanmış" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "Nesneler çoğaltılıyor ve yerleştiriliyor" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "Nesneler Yerleştiriliyor" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "Nesne Yerleştiriliyor" @@ -3678,17 +3678,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "Yazıcıları kaldır" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "Ağ üzerinden yazdır" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "Ağ üzerinden yazdır" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "Ağ üzerinden bağlandı" @@ -4230,227 +4230,237 @@ msgctxt "@button" msgid "Cancel" msgstr "İptal" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "Çevrimiçi Sorun Giderme Kılavuzunu Göster" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "Tam Ekrana Geç" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "Tam Ekrandan Çık" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "&Geri Al" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "&Yinele" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "&Çıkış" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "3 Boyutlu Görünüm" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "Önden Görünüm" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "Yukarıdan Görünüm" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "Alttan Görünüm" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "Sol Taraftan Görünüm" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "Sağ Taraftan Görünüm" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "Cura’yı yapılandır..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "&Yazıcı Ekle..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "Yazıcıları Yönet..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "Malzemeleri Yönet..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "Mağazadan daha fazla malzeme ekle" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "&Profili geçerli ayarlar/geçersiz kılmalar ile güncelle" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "&Geçerli değişiklikleri iptal et" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "G&eçerli ayarlardan/geçersiz kılmalardan profil oluştur..." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "Profilleri Yönet..." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "Çevrimiçi Belgeleri Göster" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "Hata Bildir" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "Yenilikler" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "Hakkında..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "Seçileni Sil" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "Seçileni Ortala" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "Seçileni Çoğalt" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "Modeli Sil" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "Modeli Platformda Ortala" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "Modelleri Gruplandır" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "Model Grubunu Çöz" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "&Modelleri Birleştir" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "&Modeli Çoğalt..." -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "Tüm modelleri Seç" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "Yapı Levhasını Temizle" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "Tüm Modelleri Yeniden Yükle" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "Tüm Modelleri Düzenle" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "Seçimi Düzenle" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "Tüm Model Konumlarını Sıfırla" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "Tüm Model ve Dönüşümleri Sıfırla" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "&Dosya Aç..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "&Yeni Proje..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "Yapılandırma Klasörünü Göster" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "Görünürlük ayarını yapılandır..." @@ -5074,18 +5084,23 @@ msgid_plural "Print Selected Models With:" msgstr[0] "Seçili Modeli Şununla Yazdır:" msgstr[1] "Seçili Modelleri Şununla Yazdır:" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "Seçili Modeli Çoğalt" msgstr[1] "Seçili Modelleri Çoğalt" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "Kopya Sayısı" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" diff --git a/resources/i18n/zh_CN/cura.po b/resources/i18n/zh_CN/cura.po index 5d63f8552b..a2e4fd3d24 100644 --- a/resources/i18n/zh_CN/cura.po +++ b/resources/i18n/zh_CN/cura.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Cura 5.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: 2022-07-15 11:06+0200\n" "Last-Translator: \n" "Language-Team: \n" @@ -23,22 +23,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "登录失败" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "正在为模型寻找新位置" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "正在寻找位置" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "无法在成形空间体积内放下全部模型" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "找不到位置" @@ -265,25 +265,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "一次只能加载一个 G-code 文件。{0} 已跳过导入" -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "警告" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "如果加载 G-code,则无法打开其他任何文件。{0} 已跳过导入" -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -410,17 +410,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "已计算" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "复制并放置模型" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "放置模型" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "放置模型" @@ -3667,17 +3667,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "删除打印机" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "通过网络打印" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "通过网络打印" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "已通过网络连接" @@ -4219,227 +4219,237 @@ msgctxt "@button" msgid "Cancel" msgstr "取消" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "显示联机故障排除" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "切换全屏" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "退出全屏" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "撤销(&U)" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "重做(&R)" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "退出(&Q)" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "3D 视图" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "正视图" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "顶视图" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "仰视图" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "左视图" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "右视图" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "配置 Cura..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "新增打印机(&A)..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "管理打印机(&I)..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "管理材料..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "从市场添加更多材料" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "使用当前设置 / 重写值更新配置文件(&U)" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "舍弃当前更改(&D)" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "从当前设置 / 重写值创建配置文件(&C)..." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "管理配置文件.." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "显示在线文档(&D)" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "BUG 反馈(&B)" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "新增功能" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "关于..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "删除所选项" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "居中所选项" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "复制所选项" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "删除模型" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "使模型居于平台中央(&N)" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "绑定模型(&G)" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "拆分模型" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "合并模型(&M)" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "复制模型(&M)…" -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "选择所有模型" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "清空打印平台" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "重新载入所有模型" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "编位所有的模型" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "为所选模型编位" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "复位所有模型的位置" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "复位所有模型的变动" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "打开文件(&O)..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "新建项目(&N)..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "显示配置文件夹" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "配置设定可见性..." @@ -5062,17 +5072,22 @@ msgid "Print Selected Model With:" msgid_plural "Print Selected Models With:" msgstr[0] "打印所选模型:" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "复制所选模型" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "复制个数" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" diff --git a/resources/i18n/zh_TW/cura.po b/resources/i18n/zh_TW/cura.po index 0a4522c657..f4eb2ebf6e 100644 --- a/resources/i18n/zh_TW/cura.po +++ b/resources/i18n/zh_TW/cura.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: Cura 5.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-04-27 12:22+0000\n" +"POT-Creation-Date: 2023-05-11 14:19+0000\n" "PO-Revision-Date: 2022-01-02 19:59+0800\n" "Last-Translator: Valen Chang \n" "Language-Team: Valen Chang \n" @@ -23,22 +23,22 @@ msgctxt "@info:title" msgid "Login failed" msgstr "登入失敗" -#: cura/Arranging/ArrangeObjectsJob.py:25 +#: cura/Arranging/ArrangeObjectsJob.py:27 msgctxt "@info:status" msgid "Finding new location for objects" msgstr "正在為物件尋找新位置" -#: cura/Arranging/ArrangeObjectsJob.py:29 +#: cura/Arranging/ArrangeObjectsJob.py:31 msgctxt "@info:title" msgid "Finding Location" msgstr "尋找位置中" -#: cura/Arranging/ArrangeObjectsJob.py:42 cura/MultiplyObjectsJob.py:99 +#: cura/Arranging/ArrangeObjectsJob.py:45 cura/MultiplyObjectsJob.py:101 msgctxt "@info:status" msgid "Unable to find a location within the build volume for all objects" msgstr "無法在列印範圍內放下全部物件" -#: cura/Arranging/ArrangeObjectsJob.py:43 +#: cura/Arranging/ArrangeObjectsJob.py:46 msgctxt "@info:title" msgid "Can't Find Location" msgstr "無法找到位置" @@ -265,25 +265,25 @@ msgctxt "@info 'width', 'depth' and 'height' are variable names that must NOT be msgid "%(width).1f x %(depth).1f x %(height).1f mm" msgstr "%(width).1f x %(depth).1f x %(height).1f mm" -#: cura/CuraApplication.py:1816 +#: cura/CuraApplication.py:1817 #, python-brace-format msgctxt "@info:status" msgid "Only one G-code file can be loaded at a time. Skipped importing {0}" msgstr "一次只能載入一個 G-code 檔案。{0} 已跳過匯入" -#: cura/CuraApplication.py:1818 cura/OAuth2/AuthorizationService.py:217 +#: cura/CuraApplication.py:1819 cura/OAuth2/AuthorizationService.py:217 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:189 msgctxt "@info:title" msgid "Warning" msgstr "警告" -#: cura/CuraApplication.py:1828 +#: cura/CuraApplication.py:1829 #, python-brace-format msgctxt "@info:status" msgid "Can't open any other file if G-code is loading. Skipped importing {0}" msgstr "如果載入 G-code,則無法開啟其他任何檔案。{0} 已跳過匯入" -#: cura/CuraApplication.py:1830 cura/Settings/CuraContainerRegistry.py:156 +#: cura/CuraApplication.py:1831 cura/Settings/CuraContainerRegistry.py:156 #: cura/Settings/CuraContainerRegistry.py:166 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:153 #: plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py:173 @@ -410,17 +410,17 @@ msgctxt "@info:status" msgid "Calculated" msgstr "已計算" -#: cura/MultiplyObjectsJob.py:30 +#: cura/MultiplyObjectsJob.py:31 msgctxt "@info:status" msgid "Multiplying and placing objects" msgstr "正在複製並放置模型" -#: cura/MultiplyObjectsJob.py:32 +#: cura/MultiplyObjectsJob.py:33 msgctxt "@info:title" msgid "Placing Objects" msgstr "正在放置模型" -#: cura/MultiplyObjectsJob.py:100 +#: cura/MultiplyObjectsJob.py:102 msgctxt "@info:title" msgid "Placing Object" msgstr "擺放物件中" @@ -3668,17 +3668,17 @@ msgctxt "@action:button" msgid "Remove printers" msgstr "移除印表機" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:62 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 msgctxt "@action:button Preceded by 'Ready to'." msgid "Print over network" msgstr "網路連線列印" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:63 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 msgctxt "@properties:tooltip" msgid "Print over network" msgstr "網路連線列印" -#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:64 +#: plugins/UM3NetworkPrinting/src/Network/LocalClusterOutputDevice.py:65 msgctxt "@info:status" msgid "Connected over the network" msgstr "透過網路連接" @@ -4220,227 +4220,237 @@ msgctxt "@button" msgid "Cancel" msgstr "取消" -#: resources/qml/Actions.qml:81 +#: resources/qml/Actions.qml:83 msgctxt "@action:inmenu" msgid "Show Online Troubleshooting" msgstr "" -#: resources/qml/Actions.qml:88 +#: resources/qml/Actions.qml:90 msgctxt "@action:inmenu" msgid "Toggle Full Screen" msgstr "切換全螢幕" -#: resources/qml/Actions.qml:96 +#: resources/qml/Actions.qml:98 msgctxt "@action:inmenu" msgid "Exit Full Screen" msgstr "離開全螢幕" -#: resources/qml/Actions.qml:103 +#: resources/qml/Actions.qml:105 msgctxt "@action:inmenu menubar:edit" msgid "&Undo" msgstr "復原(&U)" -#: resources/qml/Actions.qml:113 +#: resources/qml/Actions.qml:115 msgctxt "@action:inmenu menubar:edit" msgid "&Redo" msgstr "取消復原(&R)" -#: resources/qml/Actions.qml:131 +#: resources/qml/Actions.qml:133 msgctxt "@action:inmenu menubar:file" msgid "&Quit" msgstr "退出(&Q)" -#: resources/qml/Actions.qml:139 +#: resources/qml/Actions.qml:141 msgctxt "@action:inmenu menubar:view" msgid "3D View" msgstr "立體圖" -#: resources/qml/Actions.qml:146 +#: resources/qml/Actions.qml:148 msgctxt "@action:inmenu menubar:view" msgid "Front View" msgstr "前視圖" -#: resources/qml/Actions.qml:153 +#: resources/qml/Actions.qml:155 msgctxt "@action:inmenu menubar:view" msgid "Top View" msgstr "上視圖" -#: resources/qml/Actions.qml:160 +#: resources/qml/Actions.qml:162 msgctxt "@action:inmenu menubar:view" msgid "Bottom View" msgstr "下視圖" -#: resources/qml/Actions.qml:167 +#: resources/qml/Actions.qml:169 msgctxt "@action:inmenu menubar:view" msgid "Left Side View" msgstr "左視圖" -#: resources/qml/Actions.qml:174 +#: resources/qml/Actions.qml:176 msgctxt "@action:inmenu menubar:view" msgid "Right Side View" msgstr "右視圖" -#: resources/qml/Actions.qml:188 +#: resources/qml/Actions.qml:190 msgctxt "@action:inmenu" msgid "Configure Cura..." msgstr "設定 Cura..." -#: resources/qml/Actions.qml:197 +#: resources/qml/Actions.qml:199 msgctxt "@action:inmenu menubar:printer" msgid "&Add Printer..." msgstr "新增印表機(&A)..." -#: resources/qml/Actions.qml:203 +#: resources/qml/Actions.qml:205 msgctxt "@action:inmenu menubar:printer" msgid "Manage Pr&inters..." msgstr "管理印表機(&I)..." -#: resources/qml/Actions.qml:210 +#: resources/qml/Actions.qml:212 msgctxt "@action:inmenu" msgid "Manage Materials..." msgstr "管理線材..." -#: resources/qml/Actions.qml:218 +#: resources/qml/Actions.qml:220 msgctxt "@action:inmenu Marketplace is a brand name of UltiMaker's, so don't translate." msgid "Add more materials from Marketplace" msgstr "從市集增加更多線材" -#: resources/qml/Actions.qml:225 +#: resources/qml/Actions.qml:227 msgctxt "@action:inmenu menubar:profile" msgid "&Update profile with current settings/overrides" msgstr "使用目前設定 / 覆寫更新列印參數(&U)" -#: resources/qml/Actions.qml:233 +#: resources/qml/Actions.qml:235 msgctxt "@action:inmenu menubar:profile" msgid "&Discard current changes" msgstr "捨棄目前更改(&D)" -#: resources/qml/Actions.qml:245 +#: resources/qml/Actions.qml:247 msgctxt "@action:inmenu menubar:profile" msgid "&Create profile from current settings/overrides..." msgstr "從目前設定 / 覆寫值建立列印參數(&C)..." -#: resources/qml/Actions.qml:251 +#: resources/qml/Actions.qml:253 msgctxt "@action:inmenu menubar:profile" msgid "Manage Profiles..." msgstr "管理列印參數.." -#: resources/qml/Actions.qml:259 +#: resources/qml/Actions.qml:261 msgctxt "@action:inmenu menubar:help" msgid "Show Online &Documentation" msgstr "顯示線上說明文件(&D)" -#: resources/qml/Actions.qml:267 +#: resources/qml/Actions.qml:269 msgctxt "@action:inmenu menubar:help" msgid "Report a &Bug" msgstr "BUG 回報(&B)" -#: resources/qml/Actions.qml:275 +#: resources/qml/Actions.qml:277 msgctxt "@action:inmenu menubar:help" msgid "What's New" msgstr "新功能" -#: resources/qml/Actions.qml:289 +#: resources/qml/Actions.qml:291 msgctxt "@action:inmenu menubar:help" msgid "About..." msgstr "關於..." -#: resources/qml/Actions.qml:296 +#: resources/qml/Actions.qml:298 msgctxt "@action:inmenu menubar:edit" msgid "Delete Selected" msgstr "刪除選取" -#: resources/qml/Actions.qml:306 +#: resources/qml/Actions.qml:308 msgctxt "@action:inmenu menubar:edit" msgid "Center Selected" msgstr "置中選取" -#: resources/qml/Actions.qml:315 +#: resources/qml/Actions.qml:317 msgctxt "@action:inmenu menubar:edit" msgid "Multiply Selected" msgstr "複製選取" -#: resources/qml/Actions.qml:324 +#: resources/qml/Actions.qml:326 msgctxt "@action:inmenu" msgid "Delete Model" msgstr "刪除模型" -#: resources/qml/Actions.qml:332 +#: resources/qml/Actions.qml:334 msgctxt "@action:inmenu" msgid "Ce&nter Model on Platform" msgstr "將模型置中(&N)" -#: resources/qml/Actions.qml:338 +#: resources/qml/Actions.qml:340 msgctxt "@action:inmenu menubar:edit" msgid "&Group Models" msgstr "群組模型(&G)" -#: resources/qml/Actions.qml:358 +#: resources/qml/Actions.qml:360 msgctxt "@action:inmenu menubar:edit" msgid "Ungroup Models" msgstr "取消模型群組" -#: resources/qml/Actions.qml:368 +#: resources/qml/Actions.qml:370 msgctxt "@action:inmenu menubar:edit" msgid "&Merge Models" msgstr "結合模型(&M)" -#: resources/qml/Actions.qml:378 +#: resources/qml/Actions.qml:380 msgctxt "@action:inmenu" msgid "&Multiply Model..." msgstr "複製模型...(&M)" -#: resources/qml/Actions.qml:385 +#: resources/qml/Actions.qml:387 msgctxt "@action:inmenu menubar:edit" msgid "Select All Models" msgstr "選擇所有模型" -#: resources/qml/Actions.qml:395 +#: resources/qml/Actions.qml:397 msgctxt "@action:inmenu menubar:edit" msgid "Clear Build Plate" msgstr "清空列印平台" -#: resources/qml/Actions.qml:405 +#: resources/qml/Actions.qml:407 msgctxt "@action:inmenu menubar:file" msgid "Reload All Models" msgstr "重新載入所有模型" -#: resources/qml/Actions.qml:414 +#: resources/qml/Actions.qml:416 msgctxt "@action:inmenu menubar:edit" msgid "Arrange All Models" msgstr "排列所有模型" -#: resources/qml/Actions.qml:422 +#: resources/qml/Actions.qml:424 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange All Models Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:431 msgctxt "@action:inmenu menubar:edit" msgid "Arrange Selection" msgstr "排列所選模型" -#: resources/qml/Actions.qml:429 +#: resources/qml/Actions.qml:438 +msgctxt "@action:inmenu menubar:edit" +msgid "Arrange Selection Without Rotation" +msgstr "" + +#: resources/qml/Actions.qml:445 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Positions" msgstr "重置所有模型位置" -#: resources/qml/Actions.qml:436 +#: resources/qml/Actions.qml:452 msgctxt "@action:inmenu menubar:edit" msgid "Reset All Model Transformations" msgstr "重置所有模型旋轉" -#: resources/qml/Actions.qml:445 +#: resources/qml/Actions.qml:461 msgctxt "@action:inmenu menubar:file" msgid "&Open File(s)..." msgstr "開啟檔案(&O)..." -#: resources/qml/Actions.qml:455 +#: resources/qml/Actions.qml:471 msgctxt "@action:inmenu menubar:file" msgid "&New Project..." msgstr "新建專案(&N)..." -#: resources/qml/Actions.qml:462 +#: resources/qml/Actions.qml:478 msgctxt "@action:inmenu menubar:help" msgid "Show Configuration Folder" msgstr "顯示設定資料夾" -#: resources/qml/Actions.qml:469 resources/qml/Settings/SettingView.qml:476 +#: resources/qml/Actions.qml:485 resources/qml/Settings/SettingView.qml:476 msgctxt "@action:menu" msgid "Configure setting visibility..." msgstr "參數顯示設定..." @@ -5060,17 +5070,22 @@ msgid "Print Selected Model With:" msgid_plural "Print Selected Models With:" msgstr[0] "列印所選模型:" -#: resources/qml/Menus/ContextMenu.qml:92 +#: resources/qml/Menus/ContextMenu.qml:93 msgctxt "@title:window" msgid "Multiply Selected Model" msgid_plural "Multiply Selected Models" msgstr[0] "複製所選模型" -#: resources/qml/Menus/ContextMenu.qml:123 +#: resources/qml/Menus/ContextMenu.qml:128 msgctxt "@label" msgid "Number of Copies" msgstr "複製個數" +#: resources/qml/Menus/ContextMenu.qml:149 +msgctxt "@label" +msgid "Lock Rotation" +msgstr "" + #: resources/qml/Menus/EditMenu.qml:12 msgctxt "@title:menu menubar:toplevel" msgid "&Edit" From 1c07ba81f4f9ddfb5509729dc6da02f256c88c8f Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Fri, 12 May 2023 09:23:03 +0200 Subject: [PATCH 003/126] Add shortcut for "arrange without rotation" action CURA-7951 --- resources/qml/Actions.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index eb9f1c7f21..8a4826e149 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -423,6 +423,7 @@ Item id: arrangeAllLockAction text: catalog.i18nc("@action:inmenu menubar:edit","Arrange All Models Without Rotation") onTriggered: Printer.arrangeAll(true) + shortcut: "Shift+Ctrl+R" } Action From 61db7ce4006258c0db1d858702709f5305c23081 Mon Sep 17 00:00:00 2001 From: Randy Zwitch Date: Sat, 15 Jul 2023 13:07:22 -0400 Subject: [PATCH 004/126] Add E444M definition file --- .../matterhackers_pulsexe_e444m.def.json | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 resources/definitions/matterhackers_pulsexe_e444m.def.json diff --git a/resources/definitions/matterhackers_pulsexe_e444m.def.json b/resources/definitions/matterhackers_pulsexe_e444m.def.json new file mode 100644 index 0000000000..05757b0679 --- /dev/null +++ b/resources/definitions/matterhackers_pulsexe_e444m.def.json @@ -0,0 +1,62 @@ +{ + "version": 2, + "name": "Pulse XE E-444M", + "inherits": "fdmprinter", + "metadata": + { + "visible": true, + "author": "Zwitch Guitars", + "manufacturer": "MatterHackers", + "file_formats": "text/x-gcode", + "has_materials": true, + "has_variants": false, + "has_machine_quality": false, + "preferred_material": "generic_pla", + "preferred_quality_type": "normal", + "first_start_actions": [ "MachineSettingsAction" ], + "machine_extruder_trains": + { + "0": "matterhackers_extruder" + } + }, + "overrides": + { + "machine_name": { "default_value": "Pulse XE E-444M" }, + "machine_gcode_flavor": { "default_value": "Marlin" }, + "machine_depth": { "default_value": 220 }, + "machine_height": { "default_value": 215 }, + "machine_width": { "default_value": 250 }, + "gantry_height": { "value": 23 }, + "machine_heated_bed": { "default_value": true }, + "machine_head_with_fans_polygon": + { + "default_value": [[-28, 45], [-28, -18], [40, 45], [40, -18]] + }, + "machine_steps_per_mm_x": {"value": 80}, + "machine_steps_per_mm_y": {"value": 80}, + "machine_steps_per_mm_z": {"value": 400}, + "machine_steps_per_mm_e": {"value": 415}, + "machine_max_feedrate_x": {"value": 300}, + "machine_max_feedrate_y": {"value": 300}, + "machine_max_feedrate_z": {"value": 30}, + "machine_max_feedrate_e": {"value": 75}, + "machine_acceleration": {"value": 1300}, + "material_diameter": { "value": 1.75 }, + + "adhesion_type": { "value": "skirt" }, + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_min_layer_time": { "value": 10 }, + "z_seam_type": { "value": "back" }, + "travel_retract_before_outer_wall": { "value": true }, + "optimize_wall_printing_order": { "value": true }, + "top_bottom_thickness": { "value": "layer_height_0 + layer_height * 3" }, + "wall_thickness": { "value": "line_width * 2" }, + + "speed_print": { "value": 50 }, + "speed_layer_0": { "value": 20.0 }, + + "machine_start_gcode": { "default_value": "G21 ; set units to millimeters\nG90 ; use absolute positioning\nM82 ; absolute extrusion mode\nG28 ; home axes\nM104 S{material_print_temperature_layer_0} ; set extruder temp\nM140 S{material_bed_temperature_layer_0} ; set bed temp\nM190 S{material_bed_temperature_layer_0} ; wait for bed temp\nM109 S{material_print_temperature_layer_0} ; wait for extruder temp\nG29 ; mesh bed leveling\n\nG92 E0\nG1 X5 Y5 Z0.8 F1800\nG1 X100 Z0.3 E25 F900\nG92 E0\nG1 E-2 F2400"}, + "machine_end_gcode": { "default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y{machine_depth}; home X axis and push Y forward\nG28 Z0\nM84 ; disable motors" } + + } +} \ No newline at end of file From d748e609f9ac3a20ac8eb0168f6ccfc3b6e8ccc1 Mon Sep 17 00:00:00 2001 From: Randy Zwitch Date: Sat, 15 Jul 2023 13:08:08 -0400 Subject: [PATCH 005/126] Add E444M extruder file --- .../extruders/matterhackers_extruder.def.json | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 resources/extruders/matterhackers_extruder.def.json diff --git a/resources/extruders/matterhackers_extruder.def.json b/resources/extruders/matterhackers_extruder.def.json new file mode 100644 index 0000000000..f05e4b4e20 --- /dev/null +++ b/resources/extruders/matterhackers_extruder.def.json @@ -0,0 +1,16 @@ +{ + "version": 2, + "name": "Extruder 1", + "inherits": "fdmextruder", + "metadata": + { + "machine": "matterhackers_pulsexe_e444m", + "position": "0" + }, + "overrides": + { + "extruder_nr": { "default_value": 0 }, + "machine_nozzle_size": { "default_value": 0.4 }, + "material_diameter": { "default_value": 1.75 } + } +} \ No newline at end of file From 202d802f613c8d6ff7a5b1b2e314920db31831d3 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 28 Jul 2023 13:36:40 +0200 Subject: [PATCH 006/126] Move the required plugins list to before it's actually checked Cuz ya know. If you don't set the data before checking, you will have a baaaad time. --- cura/CuraApplication.py | 56 ++++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 889e442eaa..64d88d13dc 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -495,6 +495,36 @@ class CuraApplication(QtApplication): def startSplashWindowPhase(self) -> None: """Runs preparations that needs to be done before the starting process.""" + self.setRequiredPlugins([ + # Misc.: + "ConsoleLogger", # You want to be able to read the log if something goes wrong. + "CuraEngineBackend", # Cura is useless without this one since you can't slice. + "FileLogger", # You want to be able to read the log if something goes wrong. + "XmlMaterialProfile", # Cura crashes without this one. + "Marketplace", + # This contains the interface to enable/disable plug-ins, so if you disable it you can't enable it back. + "PrepareStage", # Cura is useless without this one since you can't load models. + "PreviewStage", # This shows the list of the plugin views that are installed in Cura. + "MonitorStage", # Major part of Cura's functionality. + "LocalFileOutputDevice", # Major part of Cura's functionality. + "LocalContainerProvider", # Cura is useless without any profiles or setting definitions. + + # Views: + "SimpleView", # Dependency of SolidView. + "SolidView", # Displays models. Cura is useless without it. + + # Readers & Writers: + "GCodeWriter", # Cura is useless if it can't write its output. + "STLReader", # Most common model format, so disabling this makes Cura 90% useless. + "3MFWriter", # Required for writing project files. + + # Tools: + "CameraTool", # Needed to see the scene. Cura is useless without it. + "SelectionTool", # Dependency of the rest of the tools. + "TranslateTool", # You'll need this for almost every print. + ]) + # Plugins need to be set here, since in the super the check is done if they are actually loaded. + super().startSplashWindowPhase() if not self.getIsHeadLess(): @@ -503,33 +533,7 @@ class CuraApplication(QtApplication): except FileNotFoundError: Logger.log("w", "Unable to find the window icon.") - self.setRequiredPlugins([ - # Misc.: - "ConsoleLogger", #You want to be able to read the log if something goes wrong. - "CuraEngineBackend", #Cura is useless without this one since you can't slice. - "FileLogger", #You want to be able to read the log if something goes wrong. - "XmlMaterialProfile", #Cura crashes without this one. - "Marketplace", #This contains the interface to enable/disable plug-ins, so if you disable it you can't enable it back. - "PrepareStage", #Cura is useless without this one since you can't load models. - "PreviewStage", #This shows the list of the plugin views that are installed in Cura. - "MonitorStage", #Major part of Cura's functionality. - "LocalFileOutputDevice", #Major part of Cura's functionality. - "LocalContainerProvider", #Cura is useless without any profiles or setting definitions. - # Views: - "SimpleView", #Dependency of SolidView. - "SolidView", #Displays models. Cura is useless without it. - - # Readers & Writers: - "GCodeWriter", #Cura is useless if it can't write its output. - "STLReader", #Most common model format, so disabling this makes Cura 90% useless. - "3MFWriter", #Required for writing project files. - - # Tools: - "CameraTool", #Needed to see the scene. Cura is useless without it. - "SelectionTool", #Dependency of the rest of the tools. - "TranslateTool", #You'll need this for almost every print. - ]) self._i18n_catalog = i18nCatalog("cura") self._update_platform_activity_timer = QTimer() From 8572589a2d11849e40d8b3ddd33a7cd0e165315e Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 4 Aug 2023 12:51:07 +0200 Subject: [PATCH 007/126] Revert "Disable Small Skin Area feature for now :-/" This reverts commit 1f7c11667fb577c6593faf09eb5b242c59426092. --- resources/definitions/fdmprinter.def.json | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index d1c532a32d..79c6d457a2 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1665,16 +1665,15 @@ { "label": "Small Top/Bottom Width", "description": "Small top/bottom regions are filled with walls instead of the default top/bottom pattern. This helps to avoids jerky motions.", - "value": "0", - "default_value": 0, + "value": "skin_line_width * 2", + "default_value": 1, "minimum_value": "0", "maximum_value_warning": "skin_line_width * 10", "type": "float", - "enabled": false, + "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern != 'concentric'", "limit_to_extruder": "top_bottom_extruder_nr", "settable_per_mesh": true, - "unit": "mm", - "comment": "Disabled for 5.4.x, as we're worried about micro-segments in the infill. Also disabled in the engine, so forcing this > 0 will not do anything at the moment." + "unit": "mm" }, "skin_no_small_gaps_heuristic": { From 836bf65d20bcea01e82cd777b8a49b411b4eb4ec Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 4 Aug 2023 14:24:31 +0200 Subject: [PATCH 008/126] Reduce maximum warning value for small top/bottom skin. While the current solution works well for values smaller than this (and that's mostly what we'd need it for), it becomes clear beyond this value (if you'd like to set it that hight for some reason) that the current solution needs to be improved (for example by adding these small skin areas to the already existing wall areas. -- Lift the solution out of the fill as it where. WHat happens when it becomes larger it that it's very likely that it'll generate a dot as middle walls on the 'outsides' of any small area connected to a larger one. done as part of CURA-10670 --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 79c6d457a2..b1e82c0b65 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1668,7 +1668,7 @@ "value": "skin_line_width * 2", "default_value": 1, "minimum_value": "0", - "maximum_value_warning": "skin_line_width * 10", + "maximum_value_warning": "skin_line_width * 3", "type": "float", "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern != 'concentric'", "limit_to_extruder": "top_bottom_extruder_nr", From 3f5ea6f6e2344ca33dd9b1e6683de6fda255ac26 Mon Sep 17 00:00:00 2001 From: Thomas Rahm <67757218+ThomasRahm@users.noreply.github.com> Date: Sat, 5 Aug 2023 07:05:16 +0200 Subject: [PATCH 009/126] Change minimum support area to be 0 when tree supports are used --- resources/definitions/elegoo_base.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/elegoo_base.def.json b/resources/definitions/elegoo_base.def.json index b0a0717c59..c54a388806 100644 --- a/resources/definitions/elegoo_base.def.json +++ b/resources/definitions/elegoo_base.def.json @@ -69,7 +69,7 @@ "material_print_temperature_layer_0": { "value": "210 if material_print_temperature < 210 else material_print_temperature" }, "min_infill_area": { "value": "5" }, "minimum_interface_area": { "default_value": 10 }, - "minimum_support_area": { "default_value": 3 }, + "minimum_support_area": { "value": "3 if support_structure == 'normal' else 0" }, "optimize_wall_printing_order": { "default_value": true }, "prime_tower_brim_enable": { "default_value": true }, "prime_tower_min_volume": { "value": "(layer_height) * (prime_tower_size / 2)**2 * 3 * 0.5 " }, From 68e60e66b9a69a14be84f5944e46db29dba177f4 Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Tue, 8 Aug 2023 11:10:03 +0200 Subject: [PATCH 010/126] Prevent a maximum value for the horizontal interface expansion to be set when in tree support mode. PP-370 --- resources/definitions/fdmprinter.def.json | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index d1c532a32d..03abd05759 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5504,7 +5504,9 @@ "unit": "mm", "type": "float", "default_value": 0.0, - "maximum_value": "extruderValue(support_extruder_nr, 'support_offset')", + "maximum_value": "extruderValue(support_extruder_nr, 'support_offset') if support_structure == 'normal' else 100", + "minimum_value_warning": "-1 * machine_nozzle_size", + "maximum_value_warning": "10 * machine_nozzle_size", "limit_to_extruder": "support_interface_extruder_nr", "enabled": "support_interface_enable and (support_enable or support_meshes_present)", "settable_per_mesh": false, @@ -5519,7 +5521,9 @@ "type": "float", "default_value": 0.0, "value": "extruderValue(support_roof_extruder_nr, 'support_interface_offset')", - "maximum_value": "extruderValue(support_extruder_nr, 'support_offset')", + "maximum_value": "extruderValue(support_extruder_nr, 'support_offset') if support_structure == 'normal' else 100", + "minimum_value_warning": "-1 * machine_nozzle_size", + "maximum_value_warning": "10 * machine_nozzle_size", "limit_to_extruder": "support_roof_extruder_nr", "enabled": "support_roof_enable and (support_enable or support_meshes_present)", "settable_per_mesh": false, @@ -5533,7 +5537,9 @@ "type": "float", "default_value": 0.0, "value": "extruderValue(support_bottom_extruder_nr, 'support_interface_offset')", - "maximum_value": "extruderValue(support_extruder_nr, 'support_offset')", + "maximum_value": "extruderValue(support_extruder_nr, 'support_offset') if support_structure == 'normal' else 100", + "minimum_value_warning": "-1 * machine_nozzle_size", + "maximum_value_warning": "10 * machine_nozzle_size", "limit_to_extruder": "support_bottom_extruder_nr", "enabled": "support_bottom_enable and (support_enable or support_meshes_present)", "settable_per_mesh": false, From d1f8125f51882adb9bfe4702f2bd97e8f9dfbc6d Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 8 Aug 2023 17:19:35 +0200 Subject: [PATCH 011/126] Add setting to prevent the top layer from doing small-skin behaviour. Actually the other way around, so we don't have another negation you have to turn on to turn off (and so the default can be false I suppose). The idea is that recently, a feature was introduced where there should be walls instead of normal skin in small hard to reach places of the model. However, this is to be excluded in most cases for all the top-layer parts exposed to air on the buildplate. implements CURA-10829 --- resources/definitions/fdmprinter.def.json | 13 ++++++++++++- resources/setting_visibility/advanced.cfg | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b1e82c0b65..5ba9e87450 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1664,7 +1664,7 @@ "small_skin_width": { "label": "Small Top/Bottom Width", - "description": "Small top/bottom regions are filled with walls instead of the default top/bottom pattern. This helps to avoids jerky motions.", + "description": "Small top/bottom regions are filled with walls instead of the default top/bottom pattern. This helps to avoids jerky motions. Off for the topmost (air-exposed) layer by default (see 'Small Top/Bottom On Surface').", "value": "skin_line_width * 2", "default_value": 1, "minimum_value": "0", @@ -1675,6 +1675,17 @@ "settable_per_mesh": true, "unit": "mm" }, + "small_skin_on_surface": + { + "label": "Small Top/Bottom On Surface", + "description": "Enable small (up to 'Small Top/Bottom Width') regions on the topmost skinned layer (exposed to air) to be filled with walls instead of the default pattern.", + "value": "False", + "default_value": false, + "type": "bool", + "enabled": "small_skin_width > 0 and top_layers > 0", + "limit_to_extruder": "top_bottom_extruder_nr", + "settable_per_mesh": true + }, "skin_no_small_gaps_heuristic": { "label": "No Skin in Z Gaps", diff --git a/resources/setting_visibility/advanced.cfg b/resources/setting_visibility/advanced.cfg index a744c8eae8..c3451d2c98 100644 --- a/resources/setting_visibility/advanced.cfg +++ b/resources/setting_visibility/advanced.cfg @@ -34,6 +34,8 @@ bottom_thickness bottom_layers ironing_enabled skin_monotonic +small_skin_width +small_skin_on_surface [infill] infill_extruder_nr From 652fff8571ba8cd9615732f56e19e04f7ba30ff2 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Tue, 8 Aug 2023 17:33:17 +0200 Subject: [PATCH 012/126] Also add new setting to expert. part of CURA-10829 --- resources/setting_visibility/expert.cfg | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg index 6517728968..cab4bb7d8f 100644 --- a/resources/setting_visibility/expert.cfg +++ b/resources/setting_visibility/expert.cfg @@ -60,6 +60,7 @@ skin_monotonic connect_skin_polygons skin_angles small_skin_width +small_skin_on_surface skin_no_small_gaps_heuristic skin_outline_count ironing_enabled From 56b15a284c60cb1ad34309adea0ca6f4fcb90c0c Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Wed, 9 Aug 2023 22:52:31 +0200 Subject: [PATCH 013/126] Add fluid motion related settings CURA-10811 --- resources/definitions/fdmprinter.def.json | 33 +++++++++++++++++++++-- resources/setting_visibility/expert.cfg | 4 +++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index fca9e69310..ac52e9d52f 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6794,8 +6794,7 @@ "maximum_value_warning": "0.3", "settable_per_mesh": true }, - "meshfix_maximum_extrusion_area_deviation": - { + "meshfix_maximum_extrusion_area_deviation": { "label": "Maximum Extrusion Area Deviation", "description": "The maximum extrusion area deviation allowed when removing intermediate points from a straight line. An intermediate point may serve as width-changing point in a long straight line. Therefore, if it is removed, it will cause the line to have a uniform width and, as a result, lose (or gain) a bit of extrusion area. If you increase this you may notice slight under- (or over-) extrusion in between straight parallel walls, as more intermediate width-changing points will be allowed to be removed. Your print will be less accurate, but the g-code will be smaller.", "type": "float", @@ -6805,6 +6804,36 @@ "minimum_value_warning": "500", "maximum_value_warning": "100000", "settable_per_mesh": true + }, + "meshfix_fluid_motion_enabled": { + "label": "Enable Fluid Motion", + "description": "When enabled tool paths are corrected for printers with smooth motion planners. Small movements that deviate from the general tool path direction are smoothed to improve fluid motions.", + "type": "bool", + "default_value": true + }, + "meshfix_fluid_motion_shift_distance": { + "label": "Fluid Motion Shift Distance", + "description": "Distance points are shifted to smooth the path", + "enabled": "meshfix_fluid_motion_enabled", + "type": "float", + "unit": "mm", + "default_value": 0.3 + }, + "meshfix_fluid_motion_small_distance": { + "label": "Fluid Motion Small Distance", + "description": "Distance points are shifted to smooth the path", + "enabled": "meshfix_fluid_motion_enabled", + "unit": "mm", + "type": "float", + "default_value": 0.001 + }, + "meshfix_fluid_motion_angle": { + "label": "Fluid Motion Angle", + "description": "Threshold angle of smooth toolpath transitions", + "enabled": "meshfix_fluid_motion_enabled", + "type": "float", + "unit": "\u00b0", + "default_value": 5 } } }, diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg index 6517728968..9247ad1b9e 100644 --- a/resources/setting_visibility/expert.cfg +++ b/resources/setting_visibility/expert.cfg @@ -365,6 +365,10 @@ multiple_mesh_overlap carve_multiple_volumes alternate_carve_order remove_empty_first_layers +meshfix_fluid_motion_enabled +meshfix_fluid_motion_shift_distance +meshfix_fluid_motion_small_distance +meshfix_fluid_motion_angle [blackmagic] print_sequence From b93be35b89446921be5d1ead9d3625b6c57cf295 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Wed, 9 Aug 2023 20:53:36 +0000 Subject: [PATCH 014/126] Applied printer-linter format --- resources/definitions/fdmprinter.def.json | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index ac52e9d52f..8f5a40f25c 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6794,7 +6794,8 @@ "maximum_value_warning": "0.3", "settable_per_mesh": true }, - "meshfix_maximum_extrusion_area_deviation": { + "meshfix_maximum_extrusion_area_deviation": + { "label": "Maximum Extrusion Area Deviation", "description": "The maximum extrusion area deviation allowed when removing intermediate points from a straight line. An intermediate point may serve as width-changing point in a long straight line. Therefore, if it is removed, it will cause the line to have a uniform width and, as a result, lose (or gain) a bit of extrusion area. If you increase this you may notice slight under- (or over-) extrusion in between straight parallel walls, as more intermediate width-changing points will be allowed to be removed. Your print will be less accurate, but the g-code will be smaller.", "type": "float", @@ -6805,13 +6806,15 @@ "maximum_value_warning": "100000", "settable_per_mesh": true }, - "meshfix_fluid_motion_enabled": { + "meshfix_fluid_motion_enabled": + { "label": "Enable Fluid Motion", "description": "When enabled tool paths are corrected for printers with smooth motion planners. Small movements that deviate from the general tool path direction are smoothed to improve fluid motions.", "type": "bool", "default_value": true }, - "meshfix_fluid_motion_shift_distance": { + "meshfix_fluid_motion_shift_distance": + { "label": "Fluid Motion Shift Distance", "description": "Distance points are shifted to smooth the path", "enabled": "meshfix_fluid_motion_enabled", @@ -6819,7 +6822,8 @@ "unit": "mm", "default_value": 0.3 }, - "meshfix_fluid_motion_small_distance": { + "meshfix_fluid_motion_small_distance": + { "label": "Fluid Motion Small Distance", "description": "Distance points are shifted to smooth the path", "enabled": "meshfix_fluid_motion_enabled", @@ -6827,7 +6831,8 @@ "type": "float", "default_value": 0.001 }, - "meshfix_fluid_motion_angle": { + "meshfix_fluid_motion_angle": + { "label": "Fluid Motion Angle", "description": "Threshold angle of smooth toolpath transitions", "enabled": "meshfix_fluid_motion_enabled", From 4a559e812abe259286a2a5ca1e6fe0991ec2a318 Mon Sep 17 00:00:00 2001 From: Saumya Jain <70144862+saumyaj3@users.noreply.github.com> Date: Thu, 10 Aug 2023 10:06:09 +0200 Subject: [PATCH 015/126] Update fdmprinter.def.json removed warning CURA-10670 --- resources/definitions/fdmprinter.def.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b1e82c0b65..cfc6fe03dd 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1668,7 +1668,6 @@ "value": "skin_line_width * 2", "default_value": 1, "minimum_value": "0", - "maximum_value_warning": "skin_line_width * 3", "type": "float", "enabled": "(top_layers > 0 or bottom_layers > 0) and top_bottom_pattern != 'concentric'", "limit_to_extruder": "top_bottom_extruder_nr", @@ -8119,4 +8118,4 @@ } } } -} \ No newline at end of file +} From c74748dbb327bbe244b8d2d6eb12a0d5ecf2e768 Mon Sep 17 00:00:00 2001 From: saumyaj3 Date: Thu, 10 Aug 2023 08:07:17 +0000 Subject: [PATCH 016/126] Applied printer-linter format --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index cfc6fe03dd..bfa62e3eaf 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -8118,4 +8118,4 @@ } } } -} +} \ No newline at end of file From 00607cf157f45321ddeb79f017fd8ec2a8022293 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 10 Aug 2023 12:18:54 +0200 Subject: [PATCH 017/126] Use more reasonable settings values for fluid motion CURA-10811 --- resources/definitions/fdmprinter.def.json | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 8f5a40f25c..18806da422 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6820,25 +6820,31 @@ "enabled": "meshfix_fluid_motion_enabled", "type": "float", "unit": "mm", - "default_value": 0.3 + "default_value": 0.1, + "minimum_value": "0.01", + "maximum_value": "1" }, - "meshfix_fluid_motion_small_distance": - { + "meshfix_fluid_motion_small_distance": { "label": "Fluid Motion Small Distance", "description": "Distance points are shifted to smooth the path", "enabled": "meshfix_fluid_motion_enabled", "unit": "mm", "type": "float", - "default_value": 0.001 + "default_value": 0.01, + "minimum_value": "0.01", + "maximum_value": "0.1" }, - "meshfix_fluid_motion_angle": - { + "meshfix_fluid_motion_angle": { "label": "Fluid Motion Angle", - "description": "Threshold angle of smooth toolpath transitions", + "description": "Threshold angle of smooth toolpath transitions. If a toolpath deviates more then this angle from the general direction it is smoothed.", "enabled": "meshfix_fluid_motion_enabled", "type": "float", "unit": "\u00b0", - "default_value": 5 + "default_value": 15, + "maximum_value": "90", + "minimum_value": "0", + "minimum_value_warning": "1", + "maximum_value_warning": "35" } } }, From 99bcec18d653283080a881c02f831f7aba30c188 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Thu, 10 Aug 2023 10:20:25 +0000 Subject: [PATCH 018/126] Applied printer-linter format --- resources/definitions/fdmprinter.def.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 18806da422..0ecc8957cd 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6824,7 +6824,8 @@ "minimum_value": "0.01", "maximum_value": "1" }, - "meshfix_fluid_motion_small_distance": { + "meshfix_fluid_motion_small_distance": + { "label": "Fluid Motion Small Distance", "description": "Distance points are shifted to smooth the path", "enabled": "meshfix_fluid_motion_enabled", @@ -6834,7 +6835,8 @@ "minimum_value": "0.01", "maximum_value": "0.1" }, - "meshfix_fluid_motion_angle": { + "meshfix_fluid_motion_angle": + { "label": "Fluid Motion Angle", "description": "Threshold angle of smooth toolpath transitions. If a toolpath deviates more then this angle from the general direction it is smoothed.", "enabled": "meshfix_fluid_motion_enabled", From 1d6df4cd8831f7ee5d95473f9e152cba4a8bbbdc Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 10 Aug 2023 12:23:48 +0200 Subject: [PATCH 019/126] Update copy CURA-7913 --- resources/definitions/fdmprinter.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 0ecc8957cd..3d95c3af50 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6838,7 +6838,7 @@ "meshfix_fluid_motion_angle": { "label": "Fluid Motion Angle", - "description": "Threshold angle of smooth toolpath transitions. If a toolpath deviates more then this angle from the general direction it is smoothed.", + "description": "If a toolpath-segment deviates more than this angle from the general motion it is smoothed.", "enabled": "meshfix_fluid_motion_enabled", "type": "float", "unit": "\u00b0", From 2451e288de11a1061e9b21e2a06403735892daed Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Thu, 10 Aug 2023 14:41:10 +0200 Subject: [PATCH 020/126] Fix horizontal interface expansion setting. PP-370 --- resources/definitions/fdmprinter.def.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 03abd05759..b44b8c6853 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5504,7 +5504,7 @@ "unit": "mm", "type": "float", "default_value": 0.0, - "maximum_value": "extruderValue(support_extruder_nr, 'support_offset') if support_structure == 'normal' else 100", + "maximum_value": "extruderValue(support_extruder_nr, 'support_offset') if support_structure == 'normal' else None", "minimum_value_warning": "-1 * machine_nozzle_size", "maximum_value_warning": "10 * machine_nozzle_size", "limit_to_extruder": "support_interface_extruder_nr", @@ -5521,7 +5521,7 @@ "type": "float", "default_value": 0.0, "value": "extruderValue(support_roof_extruder_nr, 'support_interface_offset')", - "maximum_value": "extruderValue(support_extruder_nr, 'support_offset') if support_structure == 'normal' else 100", + "maximum_value": "extruderValue(support_extruder_nr, 'support_offset') if support_structure == 'normal' else None", "minimum_value_warning": "-1 * machine_nozzle_size", "maximum_value_warning": "10 * machine_nozzle_size", "limit_to_extruder": "support_roof_extruder_nr", @@ -5537,7 +5537,7 @@ "type": "float", "default_value": 0.0, "value": "extruderValue(support_bottom_extruder_nr, 'support_interface_offset')", - "maximum_value": "extruderValue(support_extruder_nr, 'support_offset') if support_structure == 'normal' else 100", + "maximum_value": "extruderValue(support_extruder_nr, 'support_offset') if support_structure == 'normal' else None", "minimum_value_warning": "-1 * machine_nozzle_size", "maximum_value_warning": "10 * machine_nozzle_size", "limit_to_extruder": "support_bottom_extruder_nr", @@ -5927,7 +5927,7 @@ "maximum_value_warning": "skirt_brim_line_width", "enabled": "resolveOrValue('adhesion_type') == 'brim'", "limit_to_extruder": "skirt_brim_extruder_nr", - "settable_per_mesh": true, + "settable_per_mesh": false, "settable_per_extruder": true }, "brim_replaces_support": From 596b3930b6a3ae40b77d42680c2604d8ee01d851 Mon Sep 17 00:00:00 2001 From: MariMakes <40423138+MariMakes@users.noreply.github.com> Date: Tue, 15 Aug 2023 14:01:22 +0200 Subject: [PATCH 021/126] Align Licences to LGPLv3 As discussed in https://github.com/Ultimaker/Cura/issues/15731, we should align these licences under the LGPLv3 because they fall under the Cura umbrella. --- plugins/PostProcessingPlugin/PostProcessingPlugin.py | 2 +- plugins/PostProcessingPlugin/PostProcessingPlugin.qml | 2 +- plugins/PostProcessingPlugin/Script.py | 2 +- plugins/PostProcessingPlugin/scripts/ChangeAtZ.py | 2 +- plugins/PostProcessingPlugin/scripts/ColorMix.py | 2 +- plugins/PostProcessingPlugin/scripts/FilamentChange.py | 2 +- plugins/PostProcessingPlugin/scripts/RetractContinue.py | 2 +- plugins/PostProcessingPlugin/scripts/SearchAndReplace.py | 2 +- plugins/PostProcessingPlugin/scripts/Stretch.py | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.py b/plugins/PostProcessingPlugin/PostProcessingPlugin.py index fbb4214021..b3ef761af5 100644 --- a/plugins/PostProcessingPlugin/PostProcessingPlugin.py +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.py @@ -1,5 +1,5 @@ # Copyright (c) 2018 Jaime van Kessel, Ultimaker B.V. -# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. import configparser # The script lists are stored in metadata as serialised config files. import importlib.util diff --git a/plugins/PostProcessingPlugin/PostProcessingPlugin.qml b/plugins/PostProcessingPlugin/PostProcessingPlugin.qml index a80f304aaa..0f379479ba 100644 --- a/plugins/PostProcessingPlugin/PostProcessingPlugin.qml +++ b/plugins/PostProcessingPlugin/PostProcessingPlugin.qml @@ -1,5 +1,5 @@ // Copyright (c) 2022 Jaime van Kessel, Ultimaker B.V. -// The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +// The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 import QtQuick.Controls 2.15 diff --git a/plugins/PostProcessingPlugin/Script.py b/plugins/PostProcessingPlugin/Script.py index 1cc9b59c9c..be661e0889 100644 --- a/plugins/PostProcessingPlugin/Script.py +++ b/plugins/PostProcessingPlugin/Script.py @@ -1,6 +1,6 @@ # Copyright (c) 2015 Jaime van Kessel # Copyright (c) 2018 Ultimaker B.V. -# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. from typing import Optional, Any, Dict, TYPE_CHECKING, List from UM.Signal import Signal, signalemitter diff --git a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py index 91b36389f3..2930623a93 100644 --- a/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py +++ b/plugins/PostProcessingPlugin/scripts/ChangeAtZ.py @@ -1,7 +1,7 @@ # ChangeAtZ script - Change printing parameters at a given height # This script is the successor of the TweakAtZ plugin for legacy Cura. # It contains code from the TweakAtZ plugin V1.0-V4.x and from the ExampleScript by Jaime van Kessel, Ultimaker B.V. -# It runs with the PostProcessingPlugin which is released under the terms of the AGPLv3 or higher. +# It runs with the PostProcessingPlugin which is released under the terms of the LGPLv3 or higher. # This script is licensed under the Creative Commons - Attribution - Share Alike (CC BY-SA) terms # Authors of the ChangeAtZ plugin / script: diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index dacb40e905..534c0208cf 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -1,6 +1,6 @@ # ColorMix script - 2-1 extruder color mix and blending # This script is specific for the Geeetech A10M dual extruder but should work with other Marlin printers. -# It runs with the PostProcessingPlugin which is released under the terms of the AGPLv3 or higher. +# It runs with the PostProcessingPlugin which is released under the terms of the LGPLv3 or higher. # This script is licensed under the Creative Commons - Attribution - Share Alike (CC BY-SA) terms #Authors of the 2-1 ColorMix plug-in / script: diff --git a/plugins/PostProcessingPlugin/scripts/FilamentChange.py b/plugins/PostProcessingPlugin/scripts/FilamentChange.py index d3c1e60192..93941c0992 100644 --- a/plugins/PostProcessingPlugin/scripts/FilamentChange.py +++ b/plugins/PostProcessingPlugin/scripts/FilamentChange.py @@ -1,5 +1,5 @@ # Copyright (c) 2023 Ultimaker B.V. -# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. # Modification 06.09.2020 # add checkbox, now you can choose and use configuration from the firmware itself. diff --git a/plugins/PostProcessingPlugin/scripts/RetractContinue.py b/plugins/PostProcessingPlugin/scripts/RetractContinue.py index b5ea4d4eda..eaa15e0942 100644 --- a/plugins/PostProcessingPlugin/scripts/RetractContinue.py +++ b/plugins/PostProcessingPlugin/scripts/RetractContinue.py @@ -1,5 +1,5 @@ # Copyright (c) 2023 UltiMaker B.V. -# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. from ..Script import Script diff --git a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py index 40a56ace57..7a12c229cc 100644 --- a/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py +++ b/plugins/PostProcessingPlugin/scripts/SearchAndReplace.py @@ -1,5 +1,5 @@ # Copyright (c) 2017 Ghostkeeper -# The PostProcessingPlugin is released under the terms of the AGPLv3 or higher. +# The PostProcessingPlugin is released under the terms of the LGPLv3 or higher. import re #To perform the search and replace. diff --git a/plugins/PostProcessingPlugin/scripts/Stretch.py b/plugins/PostProcessingPlugin/scripts/Stretch.py index 8d35f68822..ab964d160a 100644 --- a/plugins/PostProcessingPlugin/scripts/Stretch.py +++ b/plugins/PostProcessingPlugin/scripts/Stretch.py @@ -1,4 +1,4 @@ -# This PostProcessingPlugin script is released under the terms of the AGPLv3 or higher. +# This PostProcessingPlugin script is released under the terms of the LGPLv3 or higher. """ Copyright (c) 2017 Christophe Baribaud 2017 Python implementation of https://github.com/electrocbd/post_stretch From 8698fd66860c65fb74320bba36fc59998c24165c Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 15 Aug 2023 16:10:04 +0200 Subject: [PATCH 022/126] Create FUNDING.yml --- FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 FUNDING.yml diff --git a/FUNDING.yml b/FUNDING.yml new file mode 100644 index 0000000000..2d108a74e1 --- /dev/null +++ b/FUNDING.yml @@ -0,0 +1 @@ +github: [ultimaker] From bb79282f9595e25c5d040f709162525795f2e05f Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Tue, 15 Aug 2023 16:51:50 +0200 Subject: [PATCH 023/126] Update version & releasedate in CITATION.cff --- CITATION.cff | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CITATION.cff b/CITATION.cff index 627cfa2515..7a93bbf099 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -18,8 +18,8 @@ url: "https://ultimaker.com/software/ultimaker-cura" repository-code: "https://github.com/Ultimaker/Cura" license: LGPL-3.0 license-url: "https://github.com/Ultimaker/Cura/blob/main/LICENSE" -version: 5.2.1 -date-released: "2022-10-19" +version: 5.4.0 +date-released: "2023-07-04" keywords: - Ultimaker - Cura From c8f393f78580247ac44ab5612f4d5c7c67d46d92 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 08:22:27 +0200 Subject: [PATCH 024/126] Specify runner for each installer workflow Contributes to CURA-10855 --- .github/workflows/cura-all-installers.yml | 6 ++++++ .github/workflows/cura-installer.yml | 7 ++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cura-all-installers.yml b/.github/workflows/cura-all-installers.yml index 4729c4198a..96071756fe 100644 --- a/.github/workflows/cura-all-installers.yml +++ b/.github/workflows/cura-all-installers.yml @@ -64,6 +64,7 @@ jobs: if: ${{ inputs.build_windows_exe }} uses: ./.github/workflows/cura-installer.yml with: + runner: 'windows-2022' platform: 'windows-2022' os_name: 'win64' cura_conan_version: ${{ inputs.cura_conan_version }} @@ -79,6 +80,7 @@ jobs: if: ${{ inputs.build_windows_msi }} uses: ./.github/workflows/cura-installer.yml with: + runner: 'windows-2022' platform: 'windows-2022' os_name: 'win64' cura_conan_version: ${{ inputs.cura_conan_version }} @@ -94,6 +96,7 @@ jobs: if: ${{ inputs.build_linux }} uses: ./.github/workflows/cura-installer.yml with: + runner: 'ubuntu-20.04' platform: 'ubuntu-20.04' os_name: 'linux' cura_conan_version: ${{ inputs.cura_conan_version }} @@ -109,6 +112,7 @@ jobs: if: ${{ inputs.build_linux }} uses: ./.github/workflows/cura-installer.yml with: + runner: 'ubuntu-22.04' platform: 'ubuntu-22.04' os_name: 'linux-modern' cura_conan_version: ${{ inputs.cura_conan_version }} @@ -124,6 +128,7 @@ jobs: if: ${{ inputs.build_macos }} uses: ./.github/workflows/cura-installer.yml with: + runner: 'self-hosted' platform: 'macos-11' os_name: 'mac' cura_conan_version: ${{ inputs.cura_conan_version }} @@ -139,6 +144,7 @@ jobs: if: ${{ inputs.build_macos }} uses: ./.github/workflows/cura-installer.yml with: + runner: 'self-hosted' platform: 'macos-11' os_name: 'mac' cura_conan_version: ${{ inputs.cura_conan_version }} diff --git a/.github/workflows/cura-installer.yml b/.github/workflows/cura-installer.yml index 9572b31aee..ea71fc83dc 100644 --- a/.github/workflows/cura-installer.yml +++ b/.github/workflows/cura-installer.yml @@ -4,6 +4,11 @@ run-name: ${{ inputs.cura_conan_version }} for ${{ inputs.platform }} by @${{ gi on: workflow_call: inputs: + runner: + description: 'Selected runner' + default: 'ubuntu-20.04' + required: true + type: string platform: description: 'Selected Installer OS' default: 'ubuntu-20.04' @@ -74,7 +79,7 @@ env: jobs: cura-installer-create: - runs-on: ${{ inputs.platform }} + runs-on: ${{ inputs.runner }} steps: - name: Checkout From 874f4a1b4a2d18ea5db250e4d66dd84906a8d9c0 Mon Sep 17 00:00:00 2001 From: Maksym Shevchenko Date: Fri, 18 Aug 2023 10:37:13 +0300 Subject: [PATCH 025/126] Update kingroon_kp3s_pro.def.json Added the default machine_depth value. Changed the default machine_name value. --- resources/definitions/kingroon_kp3s_pro.def.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/definitions/kingroon_kp3s_pro.def.json b/resources/definitions/kingroon_kp3s_pro.def.json index 79a4916680..e06ce0b891 100644 --- a/resources/definitions/kingroon_kp3s_pro.def.json +++ b/resources/definitions/kingroon_kp3s_pro.def.json @@ -13,6 +13,8 @@ { "machine_acceleration": { "value": 1000 }, "machine_height": { "default_value": 200 }, + "machine_width": { "default_value": 200 }, + "machine_depth": { "default_value": 200 }, "machine_max_acceleration_e": { "value": 1000 }, "machine_max_acceleration_x": { "value": 1000 }, "machine_max_acceleration_y": { "value": 1000 }, @@ -23,12 +25,11 @@ "machine_max_feedrate_z": { "value": 4 }, "machine_max_jerk_xy": { "value": 15 }, "machine_max_jerk_z": { "value": 0.4 }, - "machine_name": { "default_value": "Kingroon KP3S" }, + "machine_name": { "default_value": "Kingroon KP3S Pro" }, "machine_steps_per_mm_e": { "value": 764 }, "machine_steps_per_mm_x": { "value": 160 }, "machine_steps_per_mm_y": { "value": 160 }, "machine_steps_per_mm_z": { "value": 800 }, - "machine_width": { "default_value": 200 }, "retraction_amount": { "value": 1 }, "retraction_extrusion_window": { "value": 1 }, "retraction_speed": { "value": 40 }, From 9b140a7e67ed5fe4f7d4ee2bb2264c7e80c80204 Mon Sep 17 00:00:00 2001 From: Maksym Shevchenko Date: Fri, 18 Aug 2023 10:40:01 +0300 Subject: [PATCH 026/126] Added missing extruder variants Added missing extruder variants for Kingroon KP3S Pro. --- .../kingroon/kingroon_kp3s_pro_0.2.inst.cfg | 13 +++++++++++++ .../kingroon/kingroon_kp3s_pro_0.3.inst.cfg | 13 +++++++++++++ .../kingroon/kingroon_kp3s_pro_0.4.inst.cfg | 13 +++++++++++++ .../kingroon/kingroon_kp3s_pro_0.5.inst.cfg | 13 +++++++++++++ .../kingroon/kingroon_kp3s_pro_0.6.inst.cfg | 13 +++++++++++++ .../kingroon/kingroon_kp3s_pro_0.8.inst.cfg | 13 +++++++++++++ .../kingroon/kingroon_kp3s_pro_1.0.inst.cfg | 13 +++++++++++++ 7 files changed, 91 insertions(+) create mode 100644 resources/variants/kingroon/kingroon_kp3s_pro_0.2.inst.cfg create mode 100644 resources/variants/kingroon/kingroon_kp3s_pro_0.3.inst.cfg create mode 100644 resources/variants/kingroon/kingroon_kp3s_pro_0.4.inst.cfg create mode 100644 resources/variants/kingroon/kingroon_kp3s_pro_0.5.inst.cfg create mode 100644 resources/variants/kingroon/kingroon_kp3s_pro_0.6.inst.cfg create mode 100644 resources/variants/kingroon/kingroon_kp3s_pro_0.8.inst.cfg create mode 100644 resources/variants/kingroon/kingroon_kp3s_pro_1.0.inst.cfg diff --git a/resources/variants/kingroon/kingroon_kp3s_pro_0.2.inst.cfg b/resources/variants/kingroon/kingroon_kp3s_pro_0.2.inst.cfg new file mode 100644 index 0000000000..4d0858a573 --- /dev/null +++ b/resources/variants/kingroon/kingroon_kp3s_pro_0.2.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = kingroon_kp3s_pro +name = 0.2mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.2 + diff --git a/resources/variants/kingroon/kingroon_kp3s_pro_0.3.inst.cfg b/resources/variants/kingroon/kingroon_kp3s_pro_0.3.inst.cfg new file mode 100644 index 0000000000..e127a63c76 --- /dev/null +++ b/resources/variants/kingroon/kingroon_kp3s_pro_0.3.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = kingroon_kp3s_pro +name = 0.3mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.3 + diff --git a/resources/variants/kingroon/kingroon_kp3s_pro_0.4.inst.cfg b/resources/variants/kingroon/kingroon_kp3s_pro_0.4.inst.cfg new file mode 100644 index 0000000000..3422da8b90 --- /dev/null +++ b/resources/variants/kingroon/kingroon_kp3s_pro_0.4.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = kingroon_kp3s_pro +name = 0.4mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.4 + diff --git a/resources/variants/kingroon/kingroon_kp3s_pro_0.5.inst.cfg b/resources/variants/kingroon/kingroon_kp3s_pro_0.5.inst.cfg new file mode 100644 index 0000000000..744e7e441d --- /dev/null +++ b/resources/variants/kingroon/kingroon_kp3s_pro_0.5.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = kingroon_kp3s_pro +name = 0.5mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.5 + diff --git a/resources/variants/kingroon/kingroon_kp3s_pro_0.6.inst.cfg b/resources/variants/kingroon/kingroon_kp3s_pro_0.6.inst.cfg new file mode 100644 index 0000000000..289eb3bd96 --- /dev/null +++ b/resources/variants/kingroon/kingroon_kp3s_pro_0.6.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = kingroon_kp3s_pro +name = 0.6mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.6 + diff --git a/resources/variants/kingroon/kingroon_kp3s_pro_0.8.inst.cfg b/resources/variants/kingroon/kingroon_kp3s_pro_0.8.inst.cfg new file mode 100644 index 0000000000..68aa6dc7da --- /dev/null +++ b/resources/variants/kingroon/kingroon_kp3s_pro_0.8.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = kingroon_kp3s_pro +name = 0.8mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 0.8 + diff --git a/resources/variants/kingroon/kingroon_kp3s_pro_1.0.inst.cfg b/resources/variants/kingroon/kingroon_kp3s_pro_1.0.inst.cfg new file mode 100644 index 0000000000..5e332ea26b --- /dev/null +++ b/resources/variants/kingroon/kingroon_kp3s_pro_1.0.inst.cfg @@ -0,0 +1,13 @@ +[general] +definition = kingroon_kp3s_pro +name = 1.0mm Nozzle +version = 4 + +[metadata] +hardware_type = nozzle +setting_version = 22 +type = variant + +[values] +machine_nozzle_size = 1.0 + From 64715aeb33c90e79c546fbaa342aff2d59e99550 Mon Sep 17 00:00:00 2001 From: Casper Lamboo Date: Fri, 18 Aug 2023 09:50:46 +0200 Subject: [PATCH 027/126] Fix printer definition for SV02 CURA-10949 --- resources/definitions/SV02.def.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/SV02.def.json b/resources/definitions/SV02.def.json index 95b165075b..b603900f47 100644 --- a/resources/definitions/SV02.def.json +++ b/resources/definitions/SV02.def.json @@ -59,7 +59,7 @@ "machine_width": { "default_value": 280 }, "material_diameter": { "default_value": 1.75 }, "material_initial_print_temperature": { "value": "material_print_temperature" }, - "prime_tower_min_volume": { "value": "((reveOrValue('layer_height'))/2" }, + "prime_tower_min_volume": { "value": "((resolveOrValue('layer_height'))/2" }, "prime_tower_position_x": { "value": "240" }, "prime_tower_position_y": { "value": "190" }, "prime_tower_size": { "value": "30" }, @@ -73,4 +73,4 @@ "top_bottom_thickness": { "default_value": 1 }, "wall_0_wipe_dist": { "value": 0.0 } } -} \ No newline at end of file +} From 8ee48434e7af6f197b942ec219339688a1bfd666 Mon Sep 17 00:00:00 2001 From: casperlamboo Date: Fri, 18 Aug 2023 07:51:51 +0000 Subject: [PATCH 028/126] Applied printer-linter format --- resources/definitions/SV02.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/SV02.def.json b/resources/definitions/SV02.def.json index b603900f47..728a6c6242 100644 --- a/resources/definitions/SV02.def.json +++ b/resources/definitions/SV02.def.json @@ -73,4 +73,4 @@ "top_bottom_thickness": { "default_value": 1 }, "wall_0_wipe_dist": { "value": 0.0 } } -} +} \ No newline at end of file From a077dc4b5e53bb63a1d40274f977fd3f4eb3fdee Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 11:32:20 +0200 Subject: [PATCH 029/126] Always force detection of default profile Contributes to CURA-10855 --- .github/workflows/cura-installer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cura-installer.yml b/.github/workflows/cura-installer.yml index 9572b31aee..e5a205a770 100644 --- a/.github/workflows/cura-installer.yml +++ b/.github/workflows/cura-installer.yml @@ -155,7 +155,7 @@ jobs: sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10 - name: Create the default Conan profile - run: conan profile new default --detect + run: conan profile new default --detect --force - name: Configure GPG Key Linux (Bash) if: ${{ runner.os == 'Linux' }} From bcdd7c9ed32a4c4a5eb05c4feaf329354410934b Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 11:43:04 +0200 Subject: [PATCH 030/126] keychain is persistent If we ever need to start from scratch, temporarily remove `&& inputs.runner != 'self-hosted'` Contributes to CURA-8415 --- .github/workflows/cura-installer.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cura-installer.yml b/.github/workflows/cura-installer.yml index ac5a8ee921..0fa95d5364 100644 --- a/.github/workflows/cura-installer.yml +++ b/.github/workflows/cura-installer.yml @@ -168,7 +168,7 @@ jobs: - name: Configure Macos keychain Developer Cert(Bash) id: macos-keychain-developer-cert - if: ${{ runner.os == 'Macos' }} + if: ${{ runner.os == 'Macos' && inputs.runner != 'self-hosted' }} # will be installed on the first-run, if reinitializing the keychain is needed, set to true uses: apple-actions/import-codesign-certs@v1 with: keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} @@ -177,7 +177,7 @@ jobs: - name: Configure Macos keychain Installer Cert (Bash) id: macos-keychain-installer-cert - if: ${{ runner.os == 'Macos' }} + if: ${{ runner.os == 'Macos' && inputs.runner != 'self-hosted' }} # will be installed on the first-run, if reinitializing the keychain is needed, set to true uses: apple-actions/import-codesign-certs@v1 with: keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} From c894ffe93454b97b77dd1a8d23c03fb9d7639491 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 12:41:44 +0200 Subject: [PATCH 031/126] Revert "keychain is persistent" This reverts commit bcdd7c9ed32a4c4a5eb05c4feaf329354410934b. --- .github/workflows/cura-installer.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cura-installer.yml b/.github/workflows/cura-installer.yml index 0fa95d5364..ac5a8ee921 100644 --- a/.github/workflows/cura-installer.yml +++ b/.github/workflows/cura-installer.yml @@ -168,7 +168,7 @@ jobs: - name: Configure Macos keychain Developer Cert(Bash) id: macos-keychain-developer-cert - if: ${{ runner.os == 'Macos' && inputs.runner != 'self-hosted' }} # will be installed on the first-run, if reinitializing the keychain is needed, set to true + if: ${{ runner.os == 'Macos' }} uses: apple-actions/import-codesign-certs@v1 with: keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} @@ -177,7 +177,7 @@ jobs: - name: Configure Macos keychain Installer Cert (Bash) id: macos-keychain-installer-cert - if: ${{ runner.os == 'Macos' && inputs.runner != 'self-hosted' }} # will be installed on the first-run, if reinitializing the keychain is needed, set to true + if: ${{ runner.os == 'Macos' }} uses: apple-actions/import-codesign-certs@v1 with: keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} From 13fdb9499e88327303d283a9daa9395711352b7e Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 13:13:41 +0200 Subject: [PATCH 032/126] Ensure that signing_temp.keychain has been removed Contributes to CURA-8415 --- .github/workflows/cura-installer.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/cura-installer.yml b/.github/workflows/cura-installer.yml index ac5a8ee921..a790f0bc95 100644 --- a/.github/workflows/cura-installer.yml +++ b/.github/workflows/cura-installer.yml @@ -166,6 +166,10 @@ jobs: if: ${{ runner.os == 'Linux' }} run: echo -n "$GPG_PRIVATE_KEY" | base64 --decode | gpg --import + - name: Remove Macos keychain (Bash) + if: ${{ runner.os == 'Macos' && inputs.runner == 'self-hosted' }} + run: security delete-keychain signing_temp.keychain || true + - name: Configure Macos keychain Developer Cert(Bash) id: macos-keychain-developer-cert if: ${{ runner.os == 'Macos' }} From a3d664571a847c510bf2557614b12a5782d1697b Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Fri, 18 Aug 2023 14:45:02 +0200 Subject: [PATCH 033/126] Add scrollable area around text messages CURA-9374 --- .../resources/qml/LicenseDialog.qml | 4 +- .../resources/qml/MultipleLicenseDialog.qml | 4 +- plugins/SliceInfoPlugin/MoreInfoWindow.qml | 4 +- .../qml/WelcomePages/ChangelogContent.qml | 4 +- .../qml/WelcomePages/WhatsNewContent.qml | 4 +- resources/qml/Widgets/ScrollableTextArea.qml | 44 ------------------- 6 files changed, 10 insertions(+), 54 deletions(-) delete mode 100644 resources/qml/Widgets/ScrollableTextArea.qml diff --git a/plugins/Marketplace/resources/qml/LicenseDialog.qml b/plugins/Marketplace/resources/qml/LicenseDialog.qml index 5dd8ac6fc4..849df5925e 100644 --- a/plugins/Marketplace/resources/qml/LicenseDialog.qml +++ b/plugins/Marketplace/resources/qml/LicenseDialog.qml @@ -6,7 +6,7 @@ import QtQuick.Window 2.2 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 -import UM 1.6 as UM +import UM 1.7 as UM import Cura 1.6 as Cura UM.Dialog @@ -52,7 +52,7 @@ UM.Dialog } } - Cura.ScrollableTextArea + UM.ScrollableTextArea { Layout.fillWidth: true Layout.fillHeight: true diff --git a/plugins/Marketplace/resources/qml/MultipleLicenseDialog.qml b/plugins/Marketplace/resources/qml/MultipleLicenseDialog.qml index a3d4b60221..c92709e954 100644 --- a/plugins/Marketplace/resources/qml/MultipleLicenseDialog.qml +++ b/plugins/Marketplace/resources/qml/MultipleLicenseDialog.qml @@ -6,7 +6,7 @@ import QtQuick.Window 2.2 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 -import UM 1.5 as UM +import UM 1.7 as UM import Cura 1.6 as Cura UM.Dialog @@ -66,7 +66,7 @@ UM.Dialog } } - Cura.ScrollableTextArea + UM.ScrollableTextArea { Layout.fillWidth: true Layout.fillHeight: true diff --git a/plugins/SliceInfoPlugin/MoreInfoWindow.qml b/plugins/SliceInfoPlugin/MoreInfoWindow.qml index e0954dc55e..3debd8e707 100644 --- a/plugins/SliceInfoPlugin/MoreInfoWindow.qml +++ b/plugins/SliceInfoPlugin/MoreInfoWindow.qml @@ -5,7 +5,7 @@ import QtQuick 2.10 import QtQuick.Controls 2.3 import QtQuick.Window 2.2 -import UM 1.5 as UM +import UM 1.7 as UM import Cura 1.1 as Cura Window @@ -74,7 +74,7 @@ Window wrapMode: Text.WordWrap } - Cura.ScrollableTextArea + UM.ScrollableTextArea { anchors { diff --git a/resources/qml/WelcomePages/ChangelogContent.qml b/resources/qml/WelcomePages/ChangelogContent.qml index 7c3b1adfc3..20380f3938 100644 --- a/resources/qml/WelcomePages/ChangelogContent.qml +++ b/resources/qml/WelcomePages/ChangelogContent.qml @@ -4,7 +4,7 @@ import QtQuick 2.10 import QtQuick.Controls 2.3 -import UM 1.5 as UM +import UM 1.7 as UM import Cura 1.1 as Cura @@ -26,7 +26,7 @@ Item font: UM.Theme.getFont("huge") } - Cura.ScrollableTextArea + UM.ScrollableTextArea { id: changelogTextArea diff --git a/resources/qml/WelcomePages/WhatsNewContent.qml b/resources/qml/WelcomePages/WhatsNewContent.qml index 6406d65756..eefadbdacf 100644 --- a/resources/qml/WelcomePages/WhatsNewContent.qml +++ b/resources/qml/WelcomePages/WhatsNewContent.qml @@ -5,7 +5,7 @@ import QtQuick 2.10 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 -import UM 1.5 as UM +import UM 1.7 as UM import Cura 1.1 as Cura @@ -90,7 +90,7 @@ Item source: manager.getSubpageImageSource(index) } - Cura.ScrollableTextArea + UM.ScrollableTextArea { id: subpageText diff --git a/resources/qml/Widgets/ScrollableTextArea.qml b/resources/qml/Widgets/ScrollableTextArea.qml deleted file mode 100644 index 7d8f6b886d..0000000000 --- a/resources/qml/Widgets/ScrollableTextArea.qml +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) 2022 Ultimaker B.V. -// Cura is released under the terms of the LGPLv3 or higher. - -import QtQuick 2.10 -import QtQuick.Controls 2.3 - -import UM 1.5 as UM -import Cura 1.1 as Cura - - -// -// Cura-style TextArea with scrolls -// -Flickable -{ - id: scrollableTextAreaBase - property bool do_borders: true - property var back_color: UM.Theme.getColor("main_background") - property alias textArea: flickableTextArea - - ScrollBar.vertical: UM.ScrollBar {} - - TextArea.flickable: TextArea - { - id: flickableTextArea - - background: Rectangle //Providing the background color and border. - { - anchors.fill: parent - anchors.margins: -border.width - - color: scrollableTextAreaBase.back_color - border.color: UM.Theme.getColor("thick_lining") - border.width: scrollableTextAreaBase.do_borders ? UM.Theme.getSize("default_lining").width : 0 - } - - font: UM.Theme.getFont("default") - color: UM.Theme.getColor("text") - textFormat: TextEdit.PlainText - renderType: Text.NativeRendering - wrapMode: Text.Wrap - selectByMouse: true - } -} \ No newline at end of file From 4f6c0001b61bd6af8f029c760d7290cc001a9cb3 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Fri, 18 Aug 2023 14:55:19 +0200 Subject: [PATCH 034/126] Sponsor cura added at designated loc CURA-10832 --- resources/qml/Actions.qml | 8 ++++++++ .../qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml | 8 ++++---- resources/qml/Menus/HelpMenu.qml | 1 + resources/themes/cura-light/icons/default/Heart.svg | 7 +++++++ 4 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 resources/themes/cura-light/icons/default/Heart.svg diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 3b75c7699e..d9d35946ea 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -60,6 +60,7 @@ Item property alias showProfileFolder: showProfileFolderAction property alias documentation: documentationAction property alias showTroubleshooting: showTroubleShootingAction + property alias openSponsershipPage : openSponsershipPageAction property alias reportBug: reportBugAction property alias whatsNew: whatsNewAction property alias about: aboutAction @@ -90,6 +91,13 @@ Item text: catalog.i18nc("@action:inmenu", "Show Online Troubleshooting") } + Action + { + id: openSponsershipPageAction + onTriggered: Qt.openUrlExternally("https://ultimaker.com/software/ultimaker-cura/sponsor/") + text: catalog.i18nc("@action:inmenu", "Sponsor Cura") + } + Action { id: toggleFullScreenAction diff --git a/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml b/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml index f13ca28447..252329bf16 100644 --- a/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml +++ b/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml @@ -57,10 +57,10 @@ Popup permissionsRequired: [] }, { - displayName: "UltiMaker Academy", //Not translated, since it's a brand name. - thumbnail: UM.Theme.getIcon("Knowledge"), - description: catalog.i18nc("@tooltip:button", "Become a 3D printing expert with UltiMaker e-learning."), - link: "https://academy.ultimaker.com/?utm_source=cura&utm_medium=software&utm_campaign=switcher-academy", + displayName: "Sponsor Cura", //Not translated, since it's a brand name. + thumbnail: UM.Theme.getIcon("Heart"), + description: catalog.i18nc("@tooltip:button", "Show your support for Cura with a donation."), + link: "https://ultimaker.com/software/ultimaker-cura/sponsor/", permissionsRequired: [] }, { diff --git a/resources/qml/Menus/HelpMenu.qml b/resources/qml/Menus/HelpMenu.qml index 4be25fdffe..6a57a99515 100644 --- a/resources/qml/Menus/HelpMenu.qml +++ b/resources/qml/Menus/HelpMenu.qml @@ -17,6 +17,7 @@ Cura.Menu Cura.MenuItem { action: Cura.Actions.showTroubleshooting} Cura.MenuItem { action: Cura.Actions.documentation } Cura.MenuItem { action: Cura.Actions.reportBug } + Cura.MenuItem { action: Cura.Actions.openSponsershipPage } Cura.MenuSeparator { } Cura.MenuItem { action: Cura.Actions.whatsNew } Cura.MenuItem { action: Cura.Actions.about } diff --git a/resources/themes/cura-light/icons/default/Heart.svg b/resources/themes/cura-light/icons/default/Heart.svg new file mode 100644 index 0000000000..793dcbd6b5 --- /dev/null +++ b/resources/themes/cura-light/icons/default/Heart.svg @@ -0,0 +1,7 @@ + + + + + + + From 3e63863a72eb3d192b9d80965593b4f3bb7612de Mon Sep 17 00:00:00 2001 From: Casper Lamboo Date: Fri, 18 Aug 2023 16:41:38 +0200 Subject: [PATCH 035/126] Formatting --- resources/qml/Actions.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index d9d35946ea..f945b1c11d 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -60,7 +60,7 @@ Item property alias showProfileFolder: showProfileFolderAction property alias documentation: documentationAction property alias showTroubleshooting: showTroubleShootingAction - property alias openSponsershipPage : openSponsershipPageAction + property alias openSponsershipPage: openSponsershipPageAction property alias reportBug: reportBugAction property alias whatsNew: whatsNewAction property alias about: aboutAction From 62a32fc725ace9d06488828b68fb39f831d34b6e Mon Sep 17 00:00:00 2001 From: Saumya Jain <70144862+saumyaj3@users.noreply.github.com> Date: Fri, 18 Aug 2023 17:34:54 +0200 Subject: [PATCH 036/126] Update resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml translating sponser cura Co-authored-by: Casper Lamboo --- resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml b/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml index 252329bf16..a42239056c 100644 --- a/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml +++ b/resources/qml/ApplicationSwitcher/ApplicationSwitcherPopup.qml @@ -57,7 +57,7 @@ Popup permissionsRequired: [] }, { - displayName: "Sponsor Cura", //Not translated, since it's a brand name. + displayName: catalog.i18nc("@label:button", "Sponsor Cura"), thumbnail: UM.Theme.getIcon("Heart"), description: catalog.i18nc("@tooltip:button", "Show your support for Cura with a donation."), link: "https://ultimaker.com/software/ultimaker-cura/sponsor/", From 23c407150c79e9726c427a26f8c7880272a85521 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 20:12:45 +0200 Subject: [PATCH 037/126] Specifify arch in filename Contributes to CURA-8415 --- .github/workflows/cura-installer.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/cura-installer.yml b/.github/workflows/cura-installer.yml index a790f0bc95..4b4df0a5bd 100644 --- a/.github/workflows/cura-installer.yml +++ b/.github/workflows/cura-installer.yml @@ -264,7 +264,7 @@ jobs: run: | import os enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else "" - installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-${{ inputs.os_name }}" + installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-${{ inputs.os_name }}-${{ inputs.arch }}" if "${{ runner.os }}" == "Windows": installer_ext = "msi" if "${{ inputs.msi_installer }}" == "true" else "exe" elif "${{ runner.os }}" == "macOS": From 5a12ad2a7148482168f89116af93b18af12d951d Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 20:13:49 +0200 Subject: [PATCH 038/126] Allow the build_macos script to build both dmg/pkg on the same runner Why should we build the installer twice? Contributes to CURA-8415 --- packaging/MacOS/build_macos.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packaging/MacOS/build_macos.py b/packaging/MacOS/build_macos.py index dcde629900..bea248b324 100644 --- a/packaging/MacOS/build_macos.py +++ b/packaging/MacOS/build_macos.py @@ -21,6 +21,7 @@ def build_dmg(source_path: str, dist_path: str, filename: str, app_name: str) -> "--icon", app_name, "169", "272", "--eula", f"{source_path}/packaging/cura_license.txt", "--background", f"{source_path}/packaging/MacOs/cura_background_dmg.png", + "--hdiutil-quiet", f"{dist_path}/{filename}", f"{dist_path}/{app_name}"] @@ -141,7 +142,9 @@ if __name__ == "__main__": parser.add_argument("source_path", type = str, help = "Path to Pyinstaller source folder") parser.add_argument("dist_path", type = str, help = "Path to Pyinstaller dist folder") parser.add_argument("cura_conan_version", type = str, help="The version of cura") - parser.add_argument("filename", type = str, help = "Filename of the pkg/dmg (e.g. 'UltiMaker-Cura-5.1.0-beta-Macos-X64.pkg' or 'UltiMaker-Cura-5.1.0-beta-Macos-X64.dmg')") + parser.add_argument("filename", type = str, help = "Filename of the pkg/dmg (e.g. 'UltiMaker-Cura-5.1.0-beta-Macos-X64' or 'UltiMaker-Cura-5.1.0-beta-Macos-X64')") + parser.add_argument("build_pkg", type = bool, default = False, help = "build the pkg") + parser.add_argument("build_dmg", type = bool, default = True, help = "build the dmg") parser.add_argument("app_name", type = str, help = "Filename of the .app that will be contained within the dmg/pkg") args = parser.parse_args() @@ -149,7 +152,7 @@ if __name__ == "__main__": app_name = f"{args.app_name}.app" - if Path(args.filename).suffix == ".pkg": - create_pkg_installer(args.filename, args.dist_path, cura_version, app_name) - else: - create_dmg(args.filename, args.dist_path, args.source_path, app_name) + if args.build_pkg: + create_pkg_installer(args.filename + ".pkg", args.dist_path, cura_version, app_name) + if args.build_dmg: + create_dmg(args.filename + ".dmg", args.dist_path, args.source_path, app_name) From 7a8fe8330ac5bdbb2dbed6a0ddaf9daa7bcf285a Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 20:48:15 +0200 Subject: [PATCH 039/126] Use named arguments Contributes to CURA-8415 --- packaging/MacOS/build_macos.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packaging/MacOS/build_macos.py b/packaging/MacOS/build_macos.py index bea248b324..8382cac27a 100644 --- a/packaging/MacOS/build_macos.py +++ b/packaging/MacOS/build_macos.py @@ -139,13 +139,13 @@ def create_dmg(filename: str, dist_path: str, source_path: str, app_name: str) - if __name__ == "__main__": parser = argparse.ArgumentParser(description = "Create installer for Cura.") - parser.add_argument("source_path", type = str, help = "Path to Pyinstaller source folder") - parser.add_argument("dist_path", type = str, help = "Path to Pyinstaller dist folder") - parser.add_argument("cura_conan_version", type = str, help="The version of cura") - parser.add_argument("filename", type = str, help = "Filename of the pkg/dmg (e.g. 'UltiMaker-Cura-5.1.0-beta-Macos-X64' or 'UltiMaker-Cura-5.1.0-beta-Macos-X64')") - parser.add_argument("build_pkg", type = bool, default = False, help = "build the pkg") - parser.add_argument("build_dmg", type = bool, default = True, help = "build the dmg") - parser.add_argument("app_name", type = str, help = "Filename of the .app that will be contained within the dmg/pkg") + parser.add_argument("--source_path", required = True, type = str, help = "Path to Pyinstaller source folder") + parser.add_argument("--dist_path", required = True, type = str, help = "Path to Pyinstaller dist folder") + parser.add_argument("--cura_conan_version", required = True, type = str, help = "The version of cura") + parser.add_argument("--filename", required = True, type = str, help = "Filename of the pkg/dmg (e.g. 'UltiMaker-Cura-5.5.0-Macos-X64' or 'UltiMaker-Cura-5.5.0-beta.1-Macos-ARM64')") + parser.add_argument("--build_pkg", type = bool, default = False, help = "build the pkg") + parser.add_argument("--build_dmg", type = bool, default = True, help = "build the dmg") + parser.add_argument("--app_name", required = True, type = str, help = "Filename of the .app that will be contained within the dmg/pkg") args = parser.parse_args() cura_version = args.cura_conan_version.split("/")[-1] From 83d2c8154b26fb36b312bb129c1b28489f2f4056 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 21:21:36 +0200 Subject: [PATCH 040/126] use dedicated workflow for macos installer Contributes to CURA-8415 --- .github/workflows/installers/macos.yml | 245 +++++++++++++++++++++++++ 1 file changed, 245 insertions(+) create mode 100644 .github/workflows/installers/macos.yml diff --git a/.github/workflows/installers/macos.yml b/.github/workflows/installers/macos.yml new file mode 100644 index 0000000000..c9ac1dd159 --- /dev/null +++ b/.github/workflows/installers/macos.yml @@ -0,0 +1,245 @@ +name: Macos Installer +run-name: ${{ inputs.cura_conan_version }} for Macos-${{ inputs.architecture }} by @${{ github.actor }} + +on: + workflow_dispatch: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: choice + options: + - X64 + - ARM64 + workflow_call: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'x64' + type: choice + options: + - x64 + - arm64 + +env: + CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} + CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} + CODESIGN_IDENTITY: ${{ secrets.CODESIGN_IDENTITY }} + MAC_NOTARIZE_USER: ${{ secrets.MAC_NOTARIZE_USER }} + MAC_NOTARIZE_PASS: ${{ secrets.MAC_NOTARIZE_PASS }} + MACOS_CERT_P12: ${{ secrets.MACOS_CERT_P12 }} + MACOS_CERT_INSTALLER_P12: ${{ secrets.MACOS_CERT_INSTALLER_P12 }} + MACOS_CERT_USER: ${{ secrets.MACOS_CERT_USER }} + MACOS_CERT_PASSPHRASE: ${{ secrets.MACOS_CERT_PASSPHRASE }} + CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }} + ENTERPRISE: ${{ inputs.enterprise }} + STAGING: ${{ inputs.staging }} + +jobs: + cura-installer-create: + runs-on: [ self-hosted, "${{ inputs.architecture }}" ] + + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Python and pip + uses: actions/setup-python@v4 + with: + python-version: '3.10.x' + cache: 'pip' + cache-dependency-path: .github/workflows/requirements-conan-package.txt + + - name: Install Python requirements for runner + run: pip install -r .github/workflows/requirements-conan-package.txt + + - name: Install MacOS system requirements + run: brew install cmake autoconf automake ninja create-dmg + + - name: Create the default Conan profile + run: conan profile new default --detect --force + + - name: Remove Macos keychain (Bash) + run: security delete-keychain signing_temp.keychain || true + + - name: Configure Macos keychain Developer Cert(Bash) + id: macos-keychain-developer-cert + uses: apple-actions/import-codesign-certs@v1 + with: + keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} + p12-file-base64: ${{ secrets.MACOS_CERT_P12 }} + p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} + + - name: Configure Macos keychain Installer Cert (Bash) + id: macos-keychain-installer-cert + uses: apple-actions/import-codesign-certs@v1 + with: + keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} + create-keychain: false # keychain is created in previous use of action. + p12-file-base64: ${{ secrets.MACOS_CERT_INSTALLER_P12 }} + p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} + + - name: Get Conan configuration + run: conan config install https://github.com/Ultimaker/conan-config.git + + - name: + + - name: Set Environment variables for Cura (bash) + run: | + . ./cura_inst/bin/activate_github_actions_env.sh + . ./cura_inst/bin/activate_github_actions_version_env.sh + + - name: Unlock Macos keychain (Bash) + run: security unlock -p $TEMP_KEYCHAIN_PASSWORD signing_temp.keychain + env: + TEMP_KEYCHAIN_PASSWORD: ${{ steps.macos-keychain-developer-cert.outputs.keychain-password }} + + # FIXME: This is a workaround to ensure that we use and pack a shared library for OpenSSL 1.1.1l. We currently compile + # OpenSSL statically for CPython, but our Python Dependenies (such as PyQt6) require a shared library. + # Because Conan won't allow for building the same library with two different options (easily) we need to install it explicitly + # and do a manual copy to the VirtualEnv, such that Pyinstaller can find it. + - name: Install OpenSSL shared + run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy + + - name: Copy OpenSSL shared (Bash) + run: | + cp ./openssl/lib/*.so* ./cura_inst/bin/ || true + cp ./openssl/lib/*.dylib* ./cura_inst/bin/ || true + + - name: Create the Cura dist + run: pyinstaller ./cura_inst/UltiMaker-Cura.spec + + - name: Output the name file name and extension + id: filename + shell: python + run: | + import os + enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else "" + installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-macos-${{ inputs.arch }}" + output_env = os.environ["GITHUB_OUTPUT"] + content = "" + if os.path.exists(output_env): + with open(output_env, "r") as f: + content = f.read() + with open(output_env, "w") as f: + f.write(content) + f.writelines(f"INSTALLER_FILENAME={installer_filename}\n") + + - name: Summarize the used Conan dependencies + shell: python + run: | + import os + import json + from pathlib import Path + + conan_install_info_path = Path("cura_inst/conan_install_info.json") + conan_info = {"installed": []} + if os.path.exists(conan_install_info_path): + with open(conan_install_info_path, "r") as f: + conan_info = json.load(f) + sorted_deps = sorted([dep["recipe"]["id"].replace('#', r' rev: ') for dep in conan_info["installed"]]) + + summary_env = os.environ["GITHUB_STEP_SUMMARY"] + content = "" + if os.path.exists(summary_env): + with open(summary_env, "r") as f: + content = f.read() + + with open(summary_env, "w") as f: + f.write(content) + f.writelines("# ${{ steps.filename.outputs.INSTALLER_FILENAME }}\n") + f.writelines("## Conan packages:\n") + for dep in sorted_deps: + f.writelines(f"`{dep}`\n") + + - name: Summarize the used Python modules + shell: python + run: | + import os + import pkg_resources + summary_env = os.environ["GITHUB_STEP_SUMMARY"] + content = "" + if os.path.exists(summary_env): + with open(summary_env, "r") as f: + content = f.read() + + with open(summary_env, "w") as f: + f.write(content) + f.writelines("## Python modules:\n") + for package in pkg_resources.working_set: + f.writelines(f"`{package.key}/{package.version}`\n") + + - name: Create the Macos dmg and pkg (Bash) + run: python ../cura_inst/packaging/MacOS/build_macos.py --source_path ../cura_inst --dist_path . --cura_conan_version $CURA_CONAN_VERSION --filename "${{ steps.filename.outputs.INSTALLER_FILENAME }}" --build_pkg --build_dmg --app_name "$CURA_APP_NAME" + working-directory: dist + + - name: Upload the pkg + uses: actions/upload-artifact@v3 + with: + name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-pkg + path: | + dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.pkg + retention-days: 5 + + - name: Upload the dmg + uses: actions/upload-artifact@v3 + with: + name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-dmg + path: | + dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.dmg + retention-days: 5 + + notify-export: + if: ${{ always() }} + needs: [ cura-installer-create ] + + uses: ultimaker/cura/.github/workflows/notify.yml@main + with: + success: ${{ contains(join(needs.*.result, ','), 'success') }} + success_title: "Create the Cura distributions" + success_body: "Installers for ${{ inputs.cura_conan_version }}" + failure_title: "Failed to create the Cura distributions" + failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}" + secrets: inherit From 1ffd94e07c8fa2d7d2997a3d6744bcf15b0e50d4 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 21:28:40 +0200 Subject: [PATCH 041/126] moved macos macos installer to root workflows Contributes to CURA-8415 --- .github/workflows/{installers => }/macos.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{installers => }/macos.yml (100%) diff --git a/.github/workflows/installers/macos.yml b/.github/workflows/macos.yml similarity index 100% rename from .github/workflows/installers/macos.yml rename to .github/workflows/macos.yml From 50db1fbb620a50a33205db10e62246d0f494b26a Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 21:33:39 +0200 Subject: [PATCH 042/126] Set arch for X64 Contributes to CURA-8415 --- .github/workflows/macos.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index c9ac1dd159..e27a3b679f 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -124,7 +124,9 @@ jobs: - name: Get Conan configuration run: conan config install https://github.com/Ultimaker/conan-config.git - - name: + - name: Set architecture conan profile + if: ${{ inputs.architecture == 'X64' }} + run: conan profile update settings.arch=x86_64 default - name: Set Environment variables for Cura (bash) run: | From 1dddb9ff89ad7caf8a3c7e90a65bf4934a4742d7 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 21:36:44 +0200 Subject: [PATCH 043/126] use string for workflow call Contributes to CURA-8415 --- .github/workflows/macos.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index e27a3b679f..bc59eb27c1 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -57,11 +57,8 @@ on: architecture: description: 'Architecture' required: true - default: 'x64' - type: choice - options: - - x64 - - arm64 + default: 'X64' + type: string env: CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} From b1cac1224a9d8ce8e29b753638ade779e7343e85 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 21:40:40 +0200 Subject: [PATCH 044/126] actually install the cura package Contributes to CURA-8415 --- .github/workflows/macos.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index bc59eb27c1..6477bc401f 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -125,6 +125,10 @@ jobs: if: ${{ inputs.architecture == 'X64' }} run: conan profile update settings.arch=x86_64 default + - name: Create the Packages (Bash) + if: ${{ runner.os != 'Windows' }} + run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING --json "cura_inst/conan_install_info.json" + - name: Set Environment variables for Cura (bash) run: | . ./cura_inst/bin/activate_github_actions_env.sh From 3dcba69c3312c9c55690757912f56675fceef9ba Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 21:50:50 +0200 Subject: [PATCH 045/126] use build_pkg and build_dmg as flags Contributes to CURA-8415 --- packaging/MacOS/build_macos.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/MacOS/build_macos.py b/packaging/MacOS/build_macos.py index 8382cac27a..bde28afab0 100644 --- a/packaging/MacOS/build_macos.py +++ b/packaging/MacOS/build_macos.py @@ -143,8 +143,8 @@ if __name__ == "__main__": parser.add_argument("--dist_path", required = True, type = str, help = "Path to Pyinstaller dist folder") parser.add_argument("--cura_conan_version", required = True, type = str, help = "The version of cura") parser.add_argument("--filename", required = True, type = str, help = "Filename of the pkg/dmg (e.g. 'UltiMaker-Cura-5.5.0-Macos-X64' or 'UltiMaker-Cura-5.5.0-beta.1-Macos-ARM64')") - parser.add_argument("--build_pkg", type = bool, default = False, help = "build the pkg") - parser.add_argument("--build_dmg", type = bool, default = True, help = "build the dmg") + parser.add_argument("--build_pkg", action="store_true", default = False, help = "build the pkg") + parser.add_argument("--build_dmg", action="store_true", default = True, help = "build the dmg") parser.add_argument("--app_name", required = True, type = str, help = "Filename of the .app that will be contained within the dmg/pkg") args = parser.parse_args() From f5f06842841473b7bb4ba5d229200c2715faf886 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 22:05:50 +0200 Subject: [PATCH 046/126] use runner context Contributes to CURA-8415 --- .github/workflows/macos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 6477bc401f..216de03a09 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -160,7 +160,7 @@ jobs: run: | import os enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else "" - installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-macos-${{ inputs.arch }}" + installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-macos-${{ runner.arch }}" output_env = os.environ["GITHUB_OUTPUT"] content = "" if os.path.exists(output_env): From bc13ba8c244f9e9654f810f4f0e76919d8ca1c70 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 22:47:08 +0200 Subject: [PATCH 047/126] don't specify arch for runs-on Contributes to CURA-8415 --- .github/workflows/macos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 216de03a09..7cd6a1247c 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -76,7 +76,7 @@ env: jobs: cura-installer-create: - runs-on: [ self-hosted, "${{ inputs.architecture }}" ] + runs-on: [ self-hosted ] steps: - name: Checkout From 13b3082b003e0eccbc0c340f35d5f00ddf492f85 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 23:02:09 +0200 Subject: [PATCH 048/126] Use architecture string from inputs Contributes to CURA-8415 --- .github/workflows/macos.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 7cd6a1247c..bd42a2b453 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -76,7 +76,7 @@ env: jobs: cura-installer-create: - runs-on: [ self-hosted ] + runs-on: [ self-hosted, "${{ inputs.architecture }}" ] steps: - name: Checkout @@ -160,7 +160,7 @@ jobs: run: | import os enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else "" - installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-macos-${{ runner.arch }}" + installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-macos-${{ inputs.architecture }}" output_env = os.environ["GITHUB_OUTPUT"] content = "" if os.path.exists(output_env): From e6e867eb5fd9000f9c2dc07d001767fb7a9efb99 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 23:11:59 +0200 Subject: [PATCH 049/126] run X64 on regular runners Contributes to CURA-8415 --- .github/workflows/macos.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index bd42a2b453..11d57b286f 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -75,8 +75,17 @@ env: STAGING: ${{ inputs.staging }} jobs: + get-runner-label: + runs-on: ubuntu-latest + outputs: + label: ${{ steps.determine-label.outputs.label }} # You must define the specific step inside the job + steps: + - id: determine-label + run: echo "::set-output name=label::$(if [ "${{ inputs.architecture }}" = "ARM64" ]; then echo 'self-hosted'; else echo 'macos-11'; fi)" + cura-installer-create: - runs-on: [ self-hosted, "${{ inputs.architecture }}" ] + needs: [ get-runner-label ] + runs-on: ${{ needs.get-runner-label.outputs.label }} steps: - name: Checkout From 07f784a5d6079eeaf372351a8d74934baf17bd3b Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 23:17:55 +0200 Subject: [PATCH 050/126] use env instead of output Contributes to CURA-8415 --- .github/workflows/macos.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 11d57b286f..a19a67c607 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -81,7 +81,7 @@ jobs: label: ${{ steps.determine-label.outputs.label }} # You must define the specific step inside the job steps: - id: determine-label - run: echo "::set-output name=label::$(if [ "${{ inputs.architecture }}" = "ARM64" ]; then echo 'self-hosted'; else echo 'macos-11'; fi)" + run: echo "label=$(if [ "${{ inputs.architecture }}" = "ARM64" ]; then echo 'self-hosted'; else echo 'macos-11'; fi)" >> $GITHUB_OUTPUT cura-installer-create: needs: [ get-runner-label ] From 62aa1a6af6e0d28f14db55c745a4bddc735b51b7 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 23:42:14 +0200 Subject: [PATCH 051/126] Setup minimum workflow for Windows Needed for the GH UI Contributes to CURA-8415 --- .github/workflows/windows.yml | 77 +++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 .github/workflows/windows.yml diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml new file mode 100644 index 0000000000..1fb38e352d --- /dev/null +++ b/.github/workflows/windows.yml @@ -0,0 +1,77 @@ +name: Windows Installer +run-name: ${{ inputs.cura_conan_version }} for Windows-${{ inputs.architecture }} by @${{ github.actor }} + +on: + workflow_dispatch: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: choice + options: + - X64 + workflow_call: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: string + +env: + CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} + CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} + WIN_CERT_INSTALLER_CER: ${{ secrets.WIN_CERT_INSTALLER_CER }} + WIN_CERT_INSTALLER_CER_PASS: ${{ secrets.WIN_CERT_INSTALLER_CER_PASS }} + CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }} + ENTERPRISE: ${{ inputs.enterprise }} + STAGING: ${{ inputs.staging }} + +jobs: + cura-installer-create: + runs-on: 'windows-2022' + + steps: + - name: Checkout + uses: actions/checkout@v3 \ No newline at end of file From b681439bba3b8e81088eaa46fc97079cfe8b0b09 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 23:46:54 +0200 Subject: [PATCH 052/126] Setup minimum workflow for Linux Needed for the GH UI Contributes to CURA-8415 --- .github/workflows/linux.yml | 79 +++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 .github/workflows/linux.yml diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml new file mode 100644 index 0000000000..7940a8126b --- /dev/null +++ b/.github/workflows/linux.yml @@ -0,0 +1,79 @@ +name: Linux Installer +run-name: ${{ inputs.cura_conan_version }} for Linux-${{ inputs.architecture }} by @${{ github.actor }} + +on: + workflow_dispatch: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: choice + options: + - X64 + workflow_call: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: string + +env: + CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} + CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} + GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }} + ENTERPRISE: ${{ inputs.enterprise }} + STAGING: ${{ inputs.staging }} + +jobs: + cura-installer-create: + strategy: + matrix: + os: [ "ubuntu-20.04", "ubuntu-22.04" ] + runs-on: ${{ matrix.os }} + + steps: + - name: Checkout + uses: actions/checkout@v3 \ No newline at end of file From f452bcf5766519a42d791346f234f9a96ca304c5 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Fri, 18 Aug 2023 23:54:48 +0200 Subject: [PATCH 053/126] Specify OS as UI option Contributes to CURA-8415 --- .github/workflows/linux.yml | 18 ++++++++++++++---- .github/workflows/macos.yml | 16 +++++++++++++++- .github/workflows/windows.yml | 14 +++++++++++++- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 7940a8126b..e307354c0a 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -31,6 +31,14 @@ on: type: choice options: - X64 + operating_system: + description: 'OS' + required: true + default: 'ubuntu-22.04' + type: choice + options: + - ubuntu-22.04 + - ubuntu-20.04 workflow_call: inputs: cura_conan_version: @@ -58,6 +66,11 @@ on: required: true default: 'X64' type: string + operating_system: + description: 'OS' + required: true + default: 'ubuntu-22.04' + type: string env: CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} @@ -69,10 +82,7 @@ env: jobs: cura-installer-create: - strategy: - matrix: - os: [ "ubuntu-20.04", "ubuntu-22.04" ] - runs-on: ${{ matrix.os }} + runs-on: ${{ inputs.operating_system }} steps: - name: Checkout diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index bc59eb27c1..1a9b8809e3 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -32,6 +32,15 @@ on: options: - X64 - ARM64 + operating_system: + description: 'OS' + required: true + default: 'macos-11' + type: choice + options: + - self-hosted + - macos-11 + - macos-12 workflow_call: inputs: cura_conan_version: @@ -59,6 +68,11 @@ on: required: true default: 'X64' type: string + operating_system: + description: 'OS' + required: true + default: 'macos-11' + type: string env: CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} @@ -76,7 +90,7 @@ env: jobs: cura-installer-create: - runs-on: [ self-hosted, "${{ inputs.architecture }}" ] + runs-on: ${{ inputs.operating_system }} steps: - name: Checkout diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 1fb38e352d..d76a44d917 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -31,6 +31,13 @@ on: type: choice options: - X64 + operating_system: + description: 'OS' + required: true + default: 'windows-2022' + type: choice + options: + - windows-2022 workflow_call: inputs: cura_conan_version: @@ -58,6 +65,11 @@ on: required: true default: 'X64' type: string + operating_system: + description: 'OS' + required: true + default: 'windows-2022' + type: string env: CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} @@ -70,7 +82,7 @@ env: jobs: cura-installer-create: - runs-on: 'windows-2022' + runs-on: ${{ inputs.operating_system }} steps: - name: Checkout From 5521d6448e7b21d34a1f74e38921c7acd11fd6b9 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 00:10:29 +0200 Subject: [PATCH 054/126] Ported windows runner logic from old workflows Contributes to CURA-8415 --- .github/workflows/windows.yml | 173 +++++++++++++++++++++++++++++++++- 1 file changed, 172 insertions(+), 1 deletion(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index d76a44d917..27621c9055 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -86,4 +86,175 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 \ No newline at end of file + uses: actions/checkout@v3 + + - name: Setup Python and pip + uses: actions/setup-python@v4 + with: + python-version: '3.10.x' + cache: 'pip' + cache-dependency-path: .github/workflows/requirements-conan-package.txt + + - name: Install Python requirements for runner + run: pip install -r .github/workflows/requirements-conan-package.txt + + - name: Use Conan download cache (Powershell) + run: conan config set storage.download_cache="C:\Users\runneradmin\.conan\conan_download_cache" + + - name: Cache Conan local repository packages (Powershell) + uses: actions/cache@v3 + with: + path: | + C:\Users\runneradmin\.conan\data + C:\.conan + C:\Users\runneradmin\.conan\conan_download_cache + key: conan-${{ runner.os }}-${{ runner.arch }}-installer-cache + + - name: Create the default Conan profile + run: conan profile new default --detect --force + + - name: Create PFX certificate from BASE64_PFX_CONTENT secret + id: create-pfx + env: + PFX_CONTENT: ${{ secrets.WIN_CERT_INSTALLER_CER }} + run: | + $pfxPath = Join-Path -Path $env:RUNNER_TEMP -ChildPath "cert.pfx"; + $encodedBytes = [System.Convert]::FromBase64String($env:PFX_CONTENT); + Set-Content $pfxPath -Value $encodedBytes -AsByteStream; + echo "PFX_PATH=$pfxPath" >> $env:GITHUB_OUTPUT; + + - name: Get Conan configuration + run: conan config install https://github.com/Ultimaker/conan-config.git + + - name: Create the Packages (Powershell) + run: conan install $Env:CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$Env:ENTERPRISE -o cura:staging=$Env:STAGING --json "cura_inst/conan_install_info.json" + + - name: Set Environment variables for Cura (Powershell) + run: | + echo "${Env:WIX}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + .\cura_inst\Scripts\activate_github_actions_env.ps1 + .\cura_inst\Scripts\activate_github_actions_version_env.ps1 + + - name: Install OpenSSL shared + run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy + + - name: Copy OpenSSL shared (Powershell) + run: | + cp openssl/bin/*.dll ./cura_inst/Scripts/ + cp openssl/lib/*.lib ./cura_inst/Lib/ + + - name: Create the Cura dist + run: pyinstaller ./cura_inst/UltiMaker-Cura.spec + + - name: Output the name file name and extension + id: filename + shell: python + run: | + import os + enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else "" + installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-win64-${{ inputs.architecture }}" + output_env = os.environ["GITHUB_OUTPUT"] + content = "" + if os.path.exists(output_env): + with open(output_env, "r") as f: + content = f.read() + with open(output_env, "w") as f: + f.write(content) + f.writelines(f"INSTALLER_FILENAME={installer_filename}\n") + + - name: Summarize the used Conan dependencies + shell: python + run: | + import os + import json + from pathlib import Path + + conan_install_info_path = Path("cura_inst/conan_install_info.json") + conan_info = {"installed": []} + if os.path.exists(conan_install_info_path): + with open(conan_install_info_path, "r") as f: + conan_info = json.load(f) + sorted_deps = sorted([dep["recipe"]["id"].replace('#', r' rev: ') for dep in conan_info["installed"]]) + + summary_env = os.environ["GITHUB_STEP_SUMMARY"] + content = "" + if os.path.exists(summary_env): + with open(summary_env, "r") as f: + content = f.read() + + with open(summary_env, "w") as f: + f.write(content) + f.writelines("# ${{ steps.filename.outputs.INSTALLER_FILENAME }}\n") + f.writelines("## Conan packages:\n") + for dep in sorted_deps: + f.writelines(f"`{dep}`\n") + + - name: Summarize the used Python modules + shell: python + run: | + import os + import pkg_resources + summary_env = os.environ["GITHUB_STEP_SUMMARY"] + content = "" + if os.path.exists(summary_env): + with open(summary_env, "r") as f: + content = f.read() + + with open(summary_env, "w") as f: + f.write(content) + f.writelines("## Python modules:\n") + for package in pkg_resources.working_set: + f.writelines(f"`{package.key}/{package.version}`\n") + + - name: Create the Windows exe installer (Powershell) + run: | + python ..\cura_inst\packaging\NSIS\create_windows_installer.py ../cura_inst . "${{ steps.filename.outputs.INSTALLER_FILENAME }}.exe" + working-directory: dist + + - name: Create the Windows msi installer (Powershell) + run: | + python ..\cura_inst\packaging\msi\create_windows_msi.py ..\cura_inst .\UltiMaker-Cura "${{ steps.filename.outputs.INSTALLER_FILENAME }}.msi" "$Env:CURA_APP_NAME" + working-directory: dist + + - name: Sign the Windows exe installer (Powershell) + env: + PFX_PATH: ${{ steps.create-pfx.outputs.PFX_PATH }} + run: | + & "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{ steps.filename.outputs.INSTALLER_FILENAME }}.exe" + working-directory: dist + + - name: Sign the Windows msi installer (Powershell) + env: + PFX_PATH: ${{ steps.create-pfx.outputs.PFX_PATH }} + run: | + & "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{ steps.filename.outputs.INSTALLER_FILENAME }}.msi" + working-directory: dist + + - name: Upload the exe + uses: actions/upload-artifact@v3 + with: + name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-exe + path: | + dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.exe + retention-days: 5 + + - name: Upload the msi + uses: actions/upload-artifact@v3 + with: + name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-msi + path: | + dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.msi + retention-days: 5 + + notify-export: + if: ${{ always() }} + needs: [ cura-installer-create ] + + uses: ultimaker/cura/.github/workflows/notify.yml@main + with: + success: ${{ contains(join(needs.*.result, ','), 'success') }} + success_title: "Create the Cura distributions" + success_body: "Installers for ${{ inputs.cura_conan_version }}" + failure_title: "Failed to create the Cura distributions" + failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}" + secrets: inherit \ No newline at end of file From e184e4f15af0c51692a80f34347d6612985f8e34 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 00:10:51 +0200 Subject: [PATCH 055/126] removed redundant if check Contributes to CURA-8415 --- .github/workflows/macos.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 4ea9db5010..75eefb1528 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -140,7 +140,6 @@ jobs: run: conan profile update settings.arch=x86_64 default - name: Create the Packages (Bash) - if: ${{ runner.os != 'Windows' }} run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING --json "cura_inst/conan_install_info.json" - name: Set Environment variables for Cura (bash) From d934f06d1b7472f8e426a4279048139a398280fe Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 00:30:57 +0200 Subject: [PATCH 056/126] ported linux workflow Contributes to CURA-8415 --- .github/workflows/linux.yml | 178 +++++++++++++++++++++++++++++++++++- 1 file changed, 177 insertions(+), 1 deletion(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index e307354c0a..38e520f766 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -86,4 +86,180 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 \ No newline at end of file + uses: actions/checkout@v3 + + - name: Setup Python and pip + uses: actions/setup-python@v4 + with: + python-version: '3.10.x' + cache: 'pip' + cache-dependency-path: .github/workflows/requirements-conan-package.txt + + - name: Install Python requirements for runner + run: pip install -r .github/workflows/requirements-conan-package.txt + + - name: Use Conan download cache (Bash) + run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache" + + - name: Cache Conan local repository packages (Bash) + uses: actions/cache@v3 + with: + path: | + $HOME/.conan/data + $HOME/.conan/conan_download_cache + key: conan-${{ runner.os }}-${{ runner.arch }}-installer-cache + + - name: Hack needed specifically for ubuntu-22.04 from mid-Feb 2023 onwards + if: ${{ startsWith(inputs.operating_system, 'ubuntu-22.04') }} + run: sudo apt remove libodbc2 libodbcinst2 unixodbc-common -y + + # NOTE: Due to what are probably github issues, we have to remove the cache and reconfigure before the rest. + # This is maybe because grub caches the disk it uses last time, which is recreated each time. + - name: Install Linux system requirements + run: | + sudo rm /var/cache/debconf/config.dat + sudo dpkg --configure -a + sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y + sudo apt update + sudo apt upgrade + sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config -y + wget --no-check-certificate --quiet https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O $GITHUB_WORKSPACE/appimagetool + chmod +x $GITHUB_WORKSPACE/appimagetool + echo "APPIMAGETOOL_LOCATION=$GITHUB_WORKSPACE/appimagetool" >> $GITHUB_ENV + + - name: Install GCC-12 on ubuntu-22.04 + if: ${{ startsWith(inputs.operating_system, 'ubuntu-22.04') }} + run: | + sudo apt install g++-12 gcc-12 -y + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12 + + - name: Use GCC-10 on ubuntu-20.04 + if: ${{ startsWith(inputs.operating_system, 'ubuntu-20.04') }} + run: | + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10 + + - name: Create the default Conan profile + run: conan profile new default --detect --force + + - name: Configure GPG Key Linux (Bash) + run: echo -n "$GPG_PRIVATE_KEY" | base64 --decode | gpg --import + + - name: Get Conan configuration + run: conan config install https://github.com/Ultimaker/conan-config.git + + - name: Create the Packages (Bash) + run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING --json "cura_inst/conan_install_info.json" + + - name: Set Environment variables for Cura (bash) + run: | + . ./cura_inst/bin/activate_github_actions_env.sh + . ./cura_inst/bin/activate_github_actions_version_env.sh + + # FIXME: This is a workaround to ensure that we use and pack a shared library for OpenSSL 1.1.1l. We currently compile + # OpenSSL statically for CPython, but our Python Dependenies (such as PyQt6) require a shared library. + # Because Conan won't allow for building the same library with two different options (easily) we need to install it explicitly + # and do a manual copy to the VirtualEnv, such that Pyinstaller can find it. + + - name: Install OpenSSL shared + run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy + + - name: Copy OpenSSL shared (Bash) + run: | + cp ./openssl/lib/*.so* ./cura_inst/bin/ || true + cp ./openssl/lib/*.dylib* ./cura_inst/bin/ || true + + - name: Create the Cura dist + run: pyinstaller ./cura_inst/UltiMaker-Cura.spec + + - name: Output the name file name and extension + id: filename + shell: python + run: | + import os + enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else "" + installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-linux-${{ inputs.architecture }}" + if ${{ inputs.operating_system }} == "ubuntu-22.04": + installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-linux-modern-${{ inputs.architecture }}" + else: + installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-linux-${{ inputs.architecture }}" + output_env = os.environ["GITHUB_OUTPUT"] + content = "" + if os.path.exists(output_env): + with open(output_env, "r") as f: + content = f.read() + with open(output_env, "w") as f: + f.write(content) + f.writelines(f"INSTALLER_FILENAME={installer_filename}\n") + + - name: Summarize the used Conan dependencies + shell: python + run: | + import os + import json + from pathlib import Path + + conan_install_info_path = Path("cura_inst/conan_install_info.json") + conan_info = {"installed": []} + if os.path.exists(conan_install_info_path): + with open(conan_install_info_path, "r") as f: + conan_info = json.load(f) + sorted_deps = sorted([dep["recipe"]["id"].replace('#', r' rev: ') for dep in conan_info["installed"]]) + + summary_env = os.environ["GITHUB_STEP_SUMMARY"] + content = "" + if os.path.exists(summary_env): + with open(summary_env, "r") as f: + content = f.read() + + with open(summary_env, "w") as f: + f.write(content) + f.writelines("# ${{ steps.filename.outputs.INSTALLER_FILENAME }}\n") + f.writelines("## Conan packages:\n") + for dep in sorted_deps: + f.writelines(f"`{dep}`\n") + + - name: Summarize the used Python modules + shell: python + run: | + import os + import pkg_resources + summary_env = os.environ["GITHUB_STEP_SUMMARY"] + content = "" + if os.path.exists(summary_env): + with open(summary_env, "r") as f: + content = f.read() + + with open(summary_env, "w") as f: + f.write(content) + f.writelines("## Python modules:\n") + for package in pkg_resources.working_set: + f.writelines(f"`{package.key}/{package.version}`\n") + + - name: Create the Linux AppImage (Bash) + run: | + python ../cura_inst/packaging/AppImage/create_appimage.py ./UltiMaker-Cura $CURA_VERSION_FULL "${{ steps.filename.outputs.INSTALLER_FILENAME }}.AppImage" + chmod +x "${{ steps.filename.outputs.INSTALLER_FILENAME }}.AppImage" + working-directory: dist + + - name: Upload the AppImage + uses: actions/upload-artifact@v3 + with: + name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-AppImage + path: | + dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.AppImage + retention-days: 5 + + notify-export: + if: ${{ always() }} + needs: [ cura-installer-create ] + + uses: ultimaker/cura/.github/workflows/notify.yml@main + with: + success: ${{ contains(join(needs.*.result, ','), 'success') }} + success_title: "Create the Cura distributions" + success_body: "Installers for ${{ inputs.cura_conan_version }}" + failure_title: "Failed to create the Cura distributions" + failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}" + secrets: inherit From ce5fb3d403969e33af6d2198ea0ba4f445d06fc4 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 00:32:12 +0200 Subject: [PATCH 057/126] run download cache after config Contributes to CURA-8415 --- .github/workflows/linux.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 38e520f766..30f1f73705 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -98,9 +98,6 @@ jobs: - name: Install Python requirements for runner run: pip install -r .github/workflows/requirements-conan-package.txt - - name: Use Conan download cache (Bash) - run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache" - - name: Cache Conan local repository packages (Bash) uses: actions/cache@v3 with: @@ -149,6 +146,9 @@ jobs: - name: Get Conan configuration run: conan config install https://github.com/Ultimaker/conan-config.git + - name: Use Conan download cache (Bash) + run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache" + - name: Create the Packages (Bash) run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING --json "cura_inst/conan_install_info.json" From 8501c7113a3771ccbe1e5fbae874b66bc92c9ee6 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 00:33:20 +0200 Subject: [PATCH 058/126] use caching of conan data Contributes to CURA-8415 --- .github/workflows/macos.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 75eefb1528..00ef703cd5 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -106,6 +106,14 @@ jobs: - name: Install Python requirements for runner run: pip install -r .github/workflows/requirements-conan-package.txt + - name: Cache Conan local repository packages (Bash) + uses: actions/cache@v3 + with: + path: | + $HOME/.conan/data + $HOME/.conan/conan_download_cache + key: conan-${{ runner.os }}-${{ runner.arch }}-installer-cache + - name: Install MacOS system requirements run: brew install cmake autoconf automake ninja create-dmg @@ -135,6 +143,9 @@ jobs: - name: Get Conan configuration run: conan config install https://github.com/Ultimaker/conan-config.git + - name: Use Conan download cache (Bash) + run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache" + - name: Set architecture conan profile if: ${{ inputs.architecture == 'X64' }} run: conan profile update settings.arch=x86_64 default From fce1aba6a6e265e231b6b669e0c0ff9ddf8ab475 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 00:34:09 +0200 Subject: [PATCH 059/126] run conan config download cache after config install Contributes to CURA-8415 --- .github/workflows/windows.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 27621c9055..816092dd0f 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -98,9 +98,6 @@ jobs: - name: Install Python requirements for runner run: pip install -r .github/workflows/requirements-conan-package.txt - - name: Use Conan download cache (Powershell) - run: conan config set storage.download_cache="C:\Users\runneradmin\.conan\conan_download_cache" - - name: Cache Conan local repository packages (Powershell) uses: actions/cache@v3 with: @@ -126,6 +123,9 @@ jobs: - name: Get Conan configuration run: conan config install https://github.com/Ultimaker/conan-config.git + - name: Use Conan download cache (Powershell) + run: conan config set storage.download_cache="C:\Users\runneradmin\.conan\conan_download_cache" + - name: Create the Packages (Powershell) run: conan install $Env:CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$Env:ENTERPRISE -o cura:staging=$Env:STAGING --json "cura_inst/conan_install_info.json" From 67caa185db83ba7822edea46dbc6acc158afe0d5 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 00:43:49 +0200 Subject: [PATCH 060/126] fixed missing qoutes Contributes to CURA-8415 --- .github/workflows/linux.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 30f1f73705..42312219d6 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -180,7 +180,7 @@ jobs: import os enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else "" installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-linux-${{ inputs.architecture }}" - if ${{ inputs.operating_system }} == "ubuntu-22.04": + if "${{ inputs.operating_system }}" == "ubuntu-22.04": installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-linux-modern-${{ inputs.architecture }}" else: installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-linux-${{ inputs.architecture }}" From f2c68fe2ce766491b2ec3e0e270f661f012c9f43 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 01:03:08 +0200 Subject: [PATCH 061/126] parallelize msi and exe creation Contributes to CURA-8415 --- .github/workflows/windows.yml | 97 ++++++++++++++++++++++++----------- 1 file changed, 68 insertions(+), 29 deletions(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 816092dd0f..25aca0d2c9 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -84,6 +84,9 @@ jobs: cura-installer-create: runs-on: ${{ inputs.operating_system }} + outputs: + INSTALLER_FILENAME: ${{ steps.filename.outputs.INSTALLER_FILENAME }} + steps: - name: Checkout uses: actions/checkout@v3 @@ -110,16 +113,6 @@ jobs: - name: Create the default Conan profile run: conan profile new default --detect --force - - name: Create PFX certificate from BASE64_PFX_CONTENT secret - id: create-pfx - env: - PFX_CONTENT: ${{ secrets.WIN_CERT_INSTALLER_CER }} - run: | - $pfxPath = Join-Path -Path $env:RUNNER_TEMP -ChildPath "cert.pfx"; - $encodedBytes = [System.Convert]::FromBase64String($env:PFX_CONTENT); - Set-Content $pfxPath -Value $encodedBytes -AsByteStream; - echo "PFX_PATH=$pfxPath" >> $env:GITHUB_OUTPUT; - - name: Get Conan configuration run: conan config install https://github.com/Ultimaker/conan-config.git @@ -206,49 +199,95 @@ jobs: for package in pkg_resources.working_set: f.writelines(f"`{package.key}/{package.version}`\n") + - name: upload the dist folder + uses: actions/upload-artifact@v3 + with: + name: dist + path: | + dist/ + retention-days: 5 + + cura-installer-create-exe: + needs: [ cura-installer-create ] + runs-on: ${{ inputs.operating_system }} + steps: + - name: Download the dist + uses: actions/download-artifact@v3 + with: + name: dist + + - name: Create PFX certificate from BASE64_PFX_CONTENT secret + id: create-pfx + env: + PFX_CONTENT: ${{ secrets.WIN_CERT_INSTALLER_CER }} + run: | + $pfxPath = Join-Path -Path $env:RUNNER_TEMP -ChildPath "cert.pfx"; + $encodedBytes = [System.Convert]::FromBase64String($env:PFX_CONTENT); + Set-Content $pfxPath -Value $encodedBytes -AsByteStream; + echo "PFX_PATH=$pfxPath" >> $env:GITHUB_OUTPUT; + - name: Create the Windows exe installer (Powershell) run: | - python ..\cura_inst\packaging\NSIS\create_windows_installer.py ../cura_inst . "${{ steps.filename.outputs.INSTALLER_FILENAME }}.exe" - working-directory: dist - - - name: Create the Windows msi installer (Powershell) - run: | - python ..\cura_inst\packaging\msi\create_windows_msi.py ..\cura_inst .\UltiMaker-Cura "${{ steps.filename.outputs.INSTALLER_FILENAME }}.msi" "$Env:CURA_APP_NAME" + python ..\cura_inst\packaging\NSIS\create_windows_installer.py ../cura_inst . "${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.exe" working-directory: dist - name: Sign the Windows exe installer (Powershell) env: PFX_PATH: ${{ steps.create-pfx.outputs.PFX_PATH }} run: | - & "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{ steps.filename.outputs.INSTALLER_FILENAME }}.exe" + & "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.exe" + working-directory: dist + + - name: Upload the exe + uses: actions/upload-artifact@v3 + with: + name: ${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}-exe + path: | + dist/${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.exe + retention-days: 5 + + cura-installer-create-msi: + needs: [ cura-installer-create ] + runs-on: ${{ inputs.operating_system }} + steps: + - name: Download the dist + uses: actions/download-artifact@v3 + with: + name: dist + + - name: Create PFX certificate from BASE64_PFX_CONTENT secret + id: create-pfx + env: + PFX_CONTENT: ${{ secrets.WIN_CERT_INSTALLER_CER }} + run: | + $pfxPath = Join-Path -Path $env:RUNNER_TEMP -ChildPath "cert.pfx"; + $encodedBytes = [System.Convert]::FromBase64String($env:PFX_CONTENT); + Set-Content $pfxPath -Value $encodedBytes -AsByteStream; + echo "PFX_PATH=$pfxPath" >> $env:GITHUB_OUTPUT; + + - name: Create the Windows msi installer (Powershell) + run: | + python ..\cura_inst\packaging\msi\create_windows_msi.py ..\cura_inst .\UltiMaker-Cura "${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.msi" "$Env:CURA_APP_NAME" working-directory: dist - name: Sign the Windows msi installer (Powershell) env: PFX_PATH: ${{ steps.create-pfx.outputs.PFX_PATH }} run: | - & "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{ steps.filename.outputs.INSTALLER_FILENAME }}.msi" + & "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.msi" working-directory: dist - - name: Upload the exe - uses: actions/upload-artifact@v3 - with: - name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-exe - path: | - dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.exe - retention-days: 5 - - name: Upload the msi uses: actions/upload-artifact@v3 with: - name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-msi + name: ${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}-msi path: | - dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.msi + dist/${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.msi retention-days: 5 notify-export: if: ${{ always() }} - needs: [ cura-installer-create ] + needs: [ cura-installer-create-exe, cura-installer-create-msi ] uses: ultimaker/cura/.github/workflows/notify.yml@main with: From 8ea4dabcea1815eec8bc82ae5d5bfc3f29e5e371 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 01:12:43 +0200 Subject: [PATCH 062/126] parallelize dmg and pkg creation Contributes to CURA-8415 --- .github/workflows/macos.yml | 103 +++++++++++++++++++++++++++++++----- 1 file changed, 91 insertions(+), 12 deletions(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 00ef703cd5..086cfd1cf1 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -92,6 +92,9 @@ jobs: cura-installer-create: runs-on: ${{ inputs.operating_system }} + outputs: + INSTALLER_FILENAME: ${{ steps.filename.outputs.INSTALLER_FILENAME }} + steps: - name: Checkout uses: actions/checkout@v3 @@ -238,29 +241,105 @@ jobs: for package in pkg_resources.working_set: f.writelines(f"`{package.key}/{package.version}`\n") + - name: upload the dist folder + uses: actions/upload-artifact@v3 + with: + name: dist + path: | + dist/ + retention-days: 5 + + cura-installer-create-dmg: + needs: [ cura-installer-create ] + runs-on: macos-11 + steps: + - name: Download the dist + uses: actions/download-artifact@v3 + with: + name: dist + + - name: Remove Macos keychain (Bash) + run: security delete-keychain signing_temp.keychain || true + + - name: Configure Macos keychain Developer Cert(Bash) + id: macos-keychain-developer-cert + uses: apple-actions/import-codesign-certs@v1 + with: + keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} + p12-file-base64: ${{ secrets.MACOS_CERT_P12 }} + p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} + + - name: Configure Macos keychain Installer Cert (Bash) + id: macos-keychain-installer-cert + uses: apple-actions/import-codesign-certs@v1 + with: + keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} + create-keychain: false # keychain is created in previous use of action. + p12-file-base64: ${{ secrets.MACOS_CERT_INSTALLER_P12 }} + p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} + + - name: Install MacOS system requirements + run: brew install create-dmg + - name: Create the Macos dmg and pkg (Bash) - run: python ../cura_inst/packaging/MacOS/build_macos.py --source_path ../cura_inst --dist_path . --cura_conan_version $CURA_CONAN_VERSION --filename "${{ steps.filename.outputs.INSTALLER_FILENAME }}" --build_pkg --build_dmg --app_name "$CURA_APP_NAME" + run: python ../cura_inst/packaging/MacOS/build_macos.py --source_path ../cura_inst --dist_path . --cura_conan_version $CURA_CONAN_VERSION --filename "${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}" --build_dmg --app_name "$CURA_APP_NAME" + working-directory: dist + + - name: Upload the dmg + uses: actions/upload-artifact@v3 + with: + name: ${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}-dmg + path: | + dist/${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.dmg + retention-days: 5 + + cura-installer-create-pkg: + needs: [ cura-installer-create ] + runs-on: macos-11 + steps: + - name: Download the dist + uses: actions/download-artifact@v3 + with: + name: dist + + - name: Remove Macos keychain (Bash) + run: security delete-keychain signing_temp.keychain || true + + - name: Configure Macos keychain Developer Cert(Bash) + id: macos-keychain-developer-cert + uses: apple-actions/import-codesign-certs@v1 + with: + keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} + p12-file-base64: ${{ secrets.MACOS_CERT_P12 }} + p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} + + - name: Configure Macos keychain Installer Cert (Bash) + id: macos-keychain-installer-cert + uses: apple-actions/import-codesign-certs@v1 + with: + keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} + create-keychain: false # keychain is created in previous use of action. + p12-file-base64: ${{ secrets.MACOS_CERT_INSTALLER_P12 }} + p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} + + - name: Install MacOS system requirements + run: brew install create-dmg + + - name: Create the Macos dmg and pkg (Bash) + run: python ../cura_inst/packaging/MacOS/build_macos.py --source_path ../cura_inst --dist_path . --cura_conan_version $CURA_CONAN_VERSION --filename "${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}" --build_pkg --app_name "$CURA_APP_NAME" working-directory: dist - name: Upload the pkg uses: actions/upload-artifact@v3 with: - name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-pkg + name: ${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}-pkg path: | - dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.pkg - retention-days: 5 - - - name: Upload the dmg - uses: actions/upload-artifact@v3 - with: - name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-dmg - path: | - dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.dmg + dist/${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.pkg retention-days: 5 notify-export: if: ${{ always() }} - needs: [ cura-installer-create ] + needs: [ cura-installer-create-dmg, cura-installer-create-pkg ] uses: ultimaker/cura/.github/workflows/notify.yml@main with: From c1e27a9016f22932b5ef045c5ba11aea9531de9d Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 01:21:45 +0200 Subject: [PATCH 063/126] zip dist Contributes to CURA-8415 --- .github/workflows/windows.yml | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 25aca0d2c9..715b05056b 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -199,23 +199,32 @@ jobs: for package in pkg_resources.working_set: f.writelines(f"`{package.key}/{package.version}`\n") - - name: upload the dist folder + + - name: Archive the artifacts (Powershell) + run: Compress-Archive -Path ".\UltiMaker-Cura" -DestinationPath ".\${{ steps.filename.outputs.INSTALLER_FILENAME }}.zip" + working-directory: dist + + - name: upload the zipped dist folder uses: actions/upload-artifact@v3 with: name: dist path: | - dist/ + dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.zip retention-days: 5 cura-installer-create-exe: needs: [ cura-installer-create ] runs-on: ${{ inputs.operating_system }} steps: - - name: Download the dist + - name: Download the zipped dist uses: actions/download-artifact@v3 with: name: dist + - name: Extract the zipped dist + run: Expand-Archive -Path ".\dist\${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.zip" -DestinationPath ".\dist" + shell: powershell + - name: Create PFX certificate from BASE64_PFX_CONTENT secret id: create-pfx env: @@ -255,6 +264,10 @@ jobs: with: name: dist + - name: Extract the zipped dist + run: Expand-Archive -Path ".\dist\${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.zip" -DestinationPath ".\dist" + shell: powershell + - name: Create PFX certificate from BASE64_PFX_CONTENT secret id: create-pfx env: From 5e7a71c914f00b6c7fbe4133a704027fea6fd5df Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 01:23:26 +0200 Subject: [PATCH 064/126] zip dist Contributes to CURA-8415 --- .github/workflows/macos.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 086cfd1cf1..7ba83ca70b 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -241,12 +241,16 @@ jobs: for package in pkg_resources.working_set: f.writelines(f"`{package.key}/{package.version}`\n") - - name: upload the dist folder + - name: Archive the artifacts (bash) + run: tar -zcf "./${{ steps.filename.outputs.INSTALLER_FILENAME }}.tar.gz" "./UltiMaker-Cura/" + working-directory: dist + + - name: upload the tarred dist folder uses: actions/upload-artifact@v3 with: name: dist path: | - dist/ + dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.tar.gz retention-days: 5 cura-installer-create-dmg: @@ -258,6 +262,10 @@ jobs: with: name: dist + - name: untar the dist folder + run: tar -zxf "./${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.tar.gz" + working-directory: dist + - name: Remove Macos keychain (Bash) run: security delete-keychain signing_temp.keychain || true @@ -302,6 +310,10 @@ jobs: with: name: dist + - name: untar the dist folder + run: tar -zxf "./${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.tar.gz" + working-directory: dist + - name: Remove Macos keychain (Bash) run: security delete-keychain signing_temp.keychain || true From 0cc286a159a4975831c860088d61d16c4d7ffd15 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 01:37:01 +0200 Subject: [PATCH 065/126] level up Contributes to CURA-8415 --- .github/workflows/macos.yml | 7 ++----- .github/workflows/windows.yml | 9 ++++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 7ba83ca70b..4c77692cff 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -242,15 +242,14 @@ jobs: f.writelines(f"`{package.key}/{package.version}`\n") - name: Archive the artifacts (bash) - run: tar -zcf "./${{ steps.filename.outputs.INSTALLER_FILENAME }}.tar.gz" "./UltiMaker-Cura/" - working-directory: dist + run: tar -zcf "./${{ steps.filename.outputs.INSTALLER_FILENAME }}.tar.gz" "./dist/" - name: upload the tarred dist folder uses: actions/upload-artifact@v3 with: name: dist path: | - dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.tar.gz + ${{ steps.filename.outputs.INSTALLER_FILENAME }}.tar.gz retention-days: 5 cura-installer-create-dmg: @@ -264,7 +263,6 @@ jobs: - name: untar the dist folder run: tar -zxf "./${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.tar.gz" - working-directory: dist - name: Remove Macos keychain (Bash) run: security delete-keychain signing_temp.keychain || true @@ -312,7 +310,6 @@ jobs: - name: untar the dist folder run: tar -zxf "./${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.tar.gz" - working-directory: dist - name: Remove Macos keychain (Bash) run: security delete-keychain signing_temp.keychain || true diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 715b05056b..f335605b91 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -201,15 +201,14 @@ jobs: - name: Archive the artifacts (Powershell) - run: Compress-Archive -Path ".\UltiMaker-Cura" -DestinationPath ".\${{ steps.filename.outputs.INSTALLER_FILENAME }}.zip" - working-directory: dist + run: Compress-Archive -Path ".\dist" -DestinationPath ".\${{ steps.filename.outputs.INSTALLER_FILENAME }}.zip" - name: upload the zipped dist folder uses: actions/upload-artifact@v3 with: name: dist path: | - dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.zip + ${{ steps.filename.outputs.INSTALLER_FILENAME }}.zip retention-days: 5 cura-installer-create-exe: @@ -222,7 +221,7 @@ jobs: name: dist - name: Extract the zipped dist - run: Expand-Archive -Path ".\dist\${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.zip" -DestinationPath ".\dist" + run: Expand-Archive -Path ".\${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.zip" -DestinationPath "." shell: powershell - name: Create PFX certificate from BASE64_PFX_CONTENT secret @@ -265,7 +264,7 @@ jobs: name: dist - name: Extract the zipped dist - run: Expand-Archive -Path ".\dist\${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.zip" -DestinationPath ".\dist" + run: Expand-Archive -Path ".\${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.zip" -DestinationPath "." shell: powershell - name: Create PFX certificate from BASE64_PFX_CONTENT secret From 457bbb154309d831892e4aa6f49a296d8f329e2d Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 01:44:33 +0200 Subject: [PATCH 066/126] All installers Contributes to CURA-8415 --- .github/workflows/installers.yml | 77 ++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 .github/workflows/installers.yml diff --git a/.github/workflows/installers.yml b/.github/workflows/installers.yml new file mode 100644 index 0000000000..e2fd109a57 --- /dev/null +++ b/.github/workflows/installers.yml @@ -0,0 +1,77 @@ +name: All installers +run-name: ${{ inputs.cura_conan_version }} by @${{ github.actor }} + +on: + workflow_dispatch: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + +jobs: + windows-installer: + uses: ./.github/workflows/windows.yml@CURA-8415_self_hosted_runner + with: + cura_conan_version: ${{ inputs.cura_conan_version }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} + architecture: X64 + operating_system: windows-2022 + + linux-modern-installer: + uses: ./.github/workflows/linux.yml@CURA-8415_self_hosted_runner + with: + cura_conan_version: ${{ inputs.cura_conan_version }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} + architecture: X64 + operating_system: ubuntu-22.04 + + linux-legacy-installer: + uses: ./.github/workflows/linux.yml@CURA-8415_self_hosted_runner + with: + cura_conan_version: ${{ inputs.cura_conan_version }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} + architecture: X64 + operating_system: ubuntu-20.04 + + macos-installer: + uses: ./.github/workflows/macos.yml@CURA-8415_self_hosted_runner + with: + cura_conan_version: ${{ inputs.cura_conan_version }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} + architecture: X64 + operating_system: macos-11.0 + + macos-arm-installer: + uses: ./.github/workflows/macos.yml@CURA-8415_self_hosted_runner + with: + cura_conan_version: ${{ inputs.cura_conan_version }} + conan_args: ${{ inputs.conan_args }} + enterprise: ${{ inputs.enterprise }} + staging: ${{ inputs.staging }} + architecture: ARM64 + operating_system: self-hosted \ No newline at end of file From fbfb4b82dd17b9173a23b0d4ac671994f1318075 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 01:46:07 +0200 Subject: [PATCH 067/126] Don't specify versions Contributes to CURA-8415 --- .github/workflows/installers.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/installers.yml b/.github/workflows/installers.yml index e2fd109a57..283fc76ee5 100644 --- a/.github/workflows/installers.yml +++ b/.github/workflows/installers.yml @@ -27,7 +27,7 @@ on: jobs: windows-installer: - uses: ./.github/workflows/windows.yml@CURA-8415_self_hosted_runner + uses: ./.github/workflows/windows.yml with: cura_conan_version: ${{ inputs.cura_conan_version }} conan_args: ${{ inputs.conan_args }} @@ -37,7 +37,7 @@ jobs: operating_system: windows-2022 linux-modern-installer: - uses: ./.github/workflows/linux.yml@CURA-8415_self_hosted_runner + uses: ./.github/workflows/linux.yml with: cura_conan_version: ${{ inputs.cura_conan_version }} conan_args: ${{ inputs.conan_args }} @@ -47,7 +47,7 @@ jobs: operating_system: ubuntu-22.04 linux-legacy-installer: - uses: ./.github/workflows/linux.yml@CURA-8415_self_hosted_runner + uses: ./.github/workflows/linux.yml with: cura_conan_version: ${{ inputs.cura_conan_version }} conan_args: ${{ inputs.conan_args }} @@ -57,7 +57,7 @@ jobs: operating_system: ubuntu-20.04 macos-installer: - uses: ./.github/workflows/macos.yml@CURA-8415_self_hosted_runner + uses: ./.github/workflows/macos.yml with: cura_conan_version: ${{ inputs.cura_conan_version }} conan_args: ${{ inputs.conan_args }} @@ -67,7 +67,7 @@ jobs: operating_system: macos-11.0 macos-arm-installer: - uses: ./.github/workflows/macos.yml@CURA-8415_self_hosted_runner + uses: ./.github/workflows/macos.yml with: cura_conan_version: ${{ inputs.cura_conan_version }} conan_args: ${{ inputs.conan_args }} From c686326e2220e36997b63f1590547567ce3b0943 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 01:56:23 +0200 Subject: [PATCH 068/126] Parallelization fixes Contributes to CURA-8415 --- .github/workflows/installers.yml | 7 +++++- .github/workflows/linux.yml | 1 - .github/workflows/macos.yml | 35 ++++++++++++++++++++++++------ .github/workflows/windows.yml | 37 +++++++++++++++++++++++--------- 4 files changed, 62 insertions(+), 18 deletions(-) diff --git a/.github/workflows/installers.yml b/.github/workflows/installers.yml index 283fc76ee5..ead3b7a87a 100644 --- a/.github/workflows/installers.yml +++ b/.github/workflows/installers.yml @@ -35,6 +35,7 @@ jobs: staging: ${{ inputs.staging }} architecture: X64 operating_system: windows-2022 + secrets: inherit linux-modern-installer: uses: ./.github/workflows/linux.yml @@ -45,6 +46,7 @@ jobs: staging: ${{ inputs.staging }} architecture: X64 operating_system: ubuntu-22.04 + secrets: inherit linux-legacy-installer: uses: ./.github/workflows/linux.yml @@ -55,6 +57,7 @@ jobs: staging: ${{ inputs.staging }} architecture: X64 operating_system: ubuntu-20.04 + secrets: inherit macos-installer: uses: ./.github/workflows/macos.yml @@ -65,6 +68,7 @@ jobs: staging: ${{ inputs.staging }} architecture: X64 operating_system: macos-11.0 + secrets: inherit macos-arm-installer: uses: ./.github/workflows/macos.yml @@ -74,4 +78,5 @@ jobs: enterprise: ${{ inputs.enterprise }} staging: ${{ inputs.staging }} architecture: ARM64 - operating_system: self-hosted \ No newline at end of file + operating_system: self-hosted + secrets: inherit \ No newline at end of file diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 42312219d6..70a15bcbb5 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -179,7 +179,6 @@ jobs: run: | import os enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else "" - installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-linux-${{ inputs.architecture }}" if "${{ inputs.operating_system }}" == "ubuntu-22.04": installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-linux-modern-${{ inputs.architecture }}" else: diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 4c77692cff..e5e8ead2cd 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -242,27 +242,40 @@ jobs: f.writelines(f"`{package.key}/{package.version}`\n") - name: Archive the artifacts (bash) - run: tar -zcf "./${{ steps.filename.outputs.INSTALLER_FILENAME }}.tar.gz" "./dist/" + run: | + tar -zcf "./${{ steps.filename.outputs.INSTALLER_FILENAME }}.tar.gz" "./dist/" + tar -zcf "./${{ steps.filename.outputs.INSTALLER_FILENAME }}-package.tar.gz" "./cura_inst/packaging/" - - name: upload the tarred dist folder + - name: upload the tarred dist and packaging folder uses: actions/upload-artifact@v3 with: name: dist path: | ${{ steps.filename.outputs.INSTALLER_FILENAME }}.tar.gz + ${{ steps.filename.outputs.INSTALLER_FILENAME }}-package.tar.gz retention-days: 5 cura-installer-create-dmg: needs: [ cura-installer-create ] runs-on: macos-11 steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.10.x' + - name: Download the dist uses: actions/download-artifact@v3 with: name: dist - name: untar the dist folder - run: tar -zxf "./${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.tar.gz" + run: | + tar -zxf "./${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.tar.gz" + tar -zxf "./${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}-package.tar.gz" - name: Remove Macos keychain (Bash) run: security delete-keychain signing_temp.keychain || true @@ -287,7 +300,7 @@ jobs: - name: Install MacOS system requirements run: brew install create-dmg - - name: Create the Macos dmg and pkg (Bash) + - name: Create the Macos dmg (Bash) run: python ../cura_inst/packaging/MacOS/build_macos.py --source_path ../cura_inst --dist_path . --cura_conan_version $CURA_CONAN_VERSION --filename "${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}" --build_dmg --app_name "$CURA_APP_NAME" working-directory: dist @@ -303,13 +316,23 @@ jobs: needs: [ cura-installer-create ] runs-on: macos-11 steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.10.x' + - name: Download the dist uses: actions/download-artifact@v3 with: name: dist - name: untar the dist folder - run: tar -zxf "./${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.tar.gz" + run: | + tar -zxf "./${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.tar.gz" + tar -zxf "./${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}-package.tar.gz" - name: Remove Macos keychain (Bash) run: security delete-keychain signing_temp.keychain || true @@ -334,7 +357,7 @@ jobs: - name: Install MacOS system requirements run: brew install create-dmg - - name: Create the Macos dmg and pkg (Bash) + - name: Create the Macos pkg (Bash) run: python ../cura_inst/packaging/MacOS/build_macos.py --source_path ../cura_inst --dist_path . --cura_conan_version $CURA_CONAN_VERSION --filename "${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}" --build_pkg --app_name "$CURA_APP_NAME" working-directory: dist diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index f335605b91..99327f9602 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -199,29 +199,38 @@ jobs: for package in pkg_resources.working_set: f.writelines(f"`{package.key}/{package.version}`\n") - - name: Archive the artifacts (Powershell) - run: Compress-Archive -Path ".\dist" -DestinationPath ".\${{ steps.filename.outputs.INSTALLER_FILENAME }}.zip" + run: Compress-Archive -Force -CompressionLevel NoCompression -Path @('.\dist', '.\cura_inst\packaging') -DestinationPath ".\${{ steps.filename.outputs.INSTALLER_FILENAME }}.zip" + shell: powershell - - name: upload the zipped dist folder + - name: upload the zipped dist and packaging folder uses: actions/upload-artifact@v3 with: - name: dist + name: dist-windows path: | ${{ steps.filename.outputs.INSTALLER_FILENAME }}.zip - retention-days: 5 + retention-days: 1 + if-no-files-found: error cura-installer-create-exe: needs: [ cura-installer-create ] runs-on: ${{ inputs.operating_system }} steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.10.x' + - name: Download the zipped dist uses: actions/download-artifact@v3 with: - name: dist + name: dist-windows - name: Extract the zipped dist - run: Expand-Archive -Path ".\${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.zip" -DestinationPath "." + run: Expand-Archive -Force -Path ".\${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.zip" -DestinationPath . shell: powershell - name: Create PFX certificate from BASE64_PFX_CONTENT secret @@ -258,13 +267,21 @@ jobs: needs: [ cura-installer-create ] runs-on: ${{ inputs.operating_system }} steps: - - name: Download the dist + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.10.x' + + - name: Download the zipped dist uses: actions/download-artifact@v3 with: - name: dist + name: dist-windows - name: Extract the zipped dist - run: Expand-Archive -Path ".\${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.zip" -DestinationPath "." + run: Expand-Archive -Force -Path ".\${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.zip" -DestinationPath . shell: powershell - name: Create PFX certificate from BASE64_PFX_CONTENT secret From 78d555144ebb1e8d905859e8435a46f42cc2aa4a Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 16:26:24 +0200 Subject: [PATCH 069/126] Don't parallelize installer creation Zipping -> uploading -> downloading unzipping cost the same amount of time, while it also increased the complexity. Contributes to CURA-8415 --- .github/workflows/macos.yml | 121 ++-------------------------------- .github/workflows/windows.yml | 115 +++++++------------------------- 2 files changed, 32 insertions(+), 204 deletions(-) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index e5e8ead2cd..736c906dab 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -241,137 +241,30 @@ jobs: for package in pkg_resources.working_set: f.writelines(f"`{package.key}/{package.version}`\n") - - name: Archive the artifacts (bash) - run: | - tar -zcf "./${{ steps.filename.outputs.INSTALLER_FILENAME }}.tar.gz" "./dist/" - tar -zcf "./${{ steps.filename.outputs.INSTALLER_FILENAME }}-package.tar.gz" "./cura_inst/packaging/" - - - name: upload the tarred dist and packaging folder - uses: actions/upload-artifact@v3 - with: - name: dist - path: | - ${{ steps.filename.outputs.INSTALLER_FILENAME }}.tar.gz - ${{ steps.filename.outputs.INSTALLER_FILENAME }}-package.tar.gz - retention-days: 5 - - cura-installer-create-dmg: - needs: [ cura-installer-create ] - runs-on: macos-11 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.10.x' - - - name: Download the dist - uses: actions/download-artifact@v3 - with: - name: dist - - - name: untar the dist folder - run: | - tar -zxf "./${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.tar.gz" - tar -zxf "./${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}-package.tar.gz" - - - name: Remove Macos keychain (Bash) - run: security delete-keychain signing_temp.keychain || true - - - name: Configure Macos keychain Developer Cert(Bash) - id: macos-keychain-developer-cert - uses: apple-actions/import-codesign-certs@v1 - with: - keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} - p12-file-base64: ${{ secrets.MACOS_CERT_P12 }} - p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} - - - name: Configure Macos keychain Installer Cert (Bash) - id: macos-keychain-installer-cert - uses: apple-actions/import-codesign-certs@v1 - with: - keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} - create-keychain: false # keychain is created in previous use of action. - p12-file-base64: ${{ secrets.MACOS_CERT_INSTALLER_P12 }} - p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} - - - name: Install MacOS system requirements - run: brew install create-dmg - - name: Create the Macos dmg (Bash) - run: python ../cura_inst/packaging/MacOS/build_macos.py --source_path ../cura_inst --dist_path . --cura_conan_version $CURA_CONAN_VERSION --filename "${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}" --build_dmg --app_name "$CURA_APP_NAME" + run: python ../cura_inst/packaging/MacOS/build_macos.py --source_path ../cura_inst --dist_path . --cura_conan_version $CURA_CONAN_VERSION --filename "${{ steps.filename.outputs.INSTALLER_FILENAME }}" --build_dmg --build_pkg --app_name "$CURA_APP_NAME" working-directory: dist - name: Upload the dmg uses: actions/upload-artifact@v3 with: - name: ${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}-dmg + name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-dmg path: | - dist/${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.dmg + dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.dmg retention-days: 5 - cura-installer-create-pkg: - needs: [ cura-installer-create ] - runs-on: macos-11 - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.10.x' - - - name: Download the dist - uses: actions/download-artifact@v3 - with: - name: dist - - - name: untar the dist folder - run: | - tar -zxf "./${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.tar.gz" - tar -zxf "./${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}-package.tar.gz" - - - name: Remove Macos keychain (Bash) - run: security delete-keychain signing_temp.keychain || true - - - name: Configure Macos keychain Developer Cert(Bash) - id: macos-keychain-developer-cert - uses: apple-actions/import-codesign-certs@v1 - with: - keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} - p12-file-base64: ${{ secrets.MACOS_CERT_P12 }} - p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} - - - name: Configure Macos keychain Installer Cert (Bash) - id: macos-keychain-installer-cert - uses: apple-actions/import-codesign-certs@v1 - with: - keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} - create-keychain: false # keychain is created in previous use of action. - p12-file-base64: ${{ secrets.MACOS_CERT_INSTALLER_P12 }} - p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} - - - name: Install MacOS system requirements - run: brew install create-dmg - - - name: Create the Macos pkg (Bash) - run: python ../cura_inst/packaging/MacOS/build_macos.py --source_path ../cura_inst --dist_path . --cura_conan_version $CURA_CONAN_VERSION --filename "${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}" --build_pkg --app_name "$CURA_APP_NAME" - working-directory: dist - - name: Upload the pkg uses: actions/upload-artifact@v3 with: - name: ${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}-pkg + name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-pkg path: | - dist/${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.pkg + dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.pkg retention-days: 5 + notify-export: if: ${{ always() }} - needs: [ cura-installer-create-dmg, cura-installer-create-pkg ] + needs: [ cura-installer-create ] uses: ultimaker/cura/.github/workflows/notify.yml@main with: diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 99327f9602..57bace2fef 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -199,91 +199,6 @@ jobs: for package in pkg_resources.working_set: f.writelines(f"`{package.key}/{package.version}`\n") - - name: Archive the artifacts (Powershell) - run: Compress-Archive -Force -CompressionLevel NoCompression -Path @('.\dist', '.\cura_inst\packaging') -DestinationPath ".\${{ steps.filename.outputs.INSTALLER_FILENAME }}.zip" - shell: powershell - - - name: upload the zipped dist and packaging folder - uses: actions/upload-artifact@v3 - with: - name: dist-windows - path: | - ${{ steps.filename.outputs.INSTALLER_FILENAME }}.zip - retention-days: 1 - if-no-files-found: error - - cura-installer-create-exe: - needs: [ cura-installer-create ] - runs-on: ${{ inputs.operating_system }} - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.10.x' - - - name: Download the zipped dist - uses: actions/download-artifact@v3 - with: - name: dist-windows - - - name: Extract the zipped dist - run: Expand-Archive -Force -Path ".\${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.zip" -DestinationPath . - shell: powershell - - - name: Create PFX certificate from BASE64_PFX_CONTENT secret - id: create-pfx - env: - PFX_CONTENT: ${{ secrets.WIN_CERT_INSTALLER_CER }} - run: | - $pfxPath = Join-Path -Path $env:RUNNER_TEMP -ChildPath "cert.pfx"; - $encodedBytes = [System.Convert]::FromBase64String($env:PFX_CONTENT); - Set-Content $pfxPath -Value $encodedBytes -AsByteStream; - echo "PFX_PATH=$pfxPath" >> $env:GITHUB_OUTPUT; - - - name: Create the Windows exe installer (Powershell) - run: | - python ..\cura_inst\packaging\NSIS\create_windows_installer.py ../cura_inst . "${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.exe" - working-directory: dist - - - name: Sign the Windows exe installer (Powershell) - env: - PFX_PATH: ${{ steps.create-pfx.outputs.PFX_PATH }} - run: | - & "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.exe" - working-directory: dist - - - name: Upload the exe - uses: actions/upload-artifact@v3 - with: - name: ${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}-exe - path: | - dist/${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.exe - retention-days: 5 - - cura-installer-create-msi: - needs: [ cura-installer-create ] - runs-on: ${{ inputs.operating_system }} - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Setup Python - uses: actions/setup-python@v4 - with: - python-version: '3.10.x' - - - name: Download the zipped dist - uses: actions/download-artifact@v3 - with: - name: dist-windows - - - name: Extract the zipped dist - run: Expand-Archive -Force -Path ".\${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.zip" -DestinationPath . - shell: powershell - - name: Create PFX certificate from BASE64_PFX_CONTENT secret id: create-pfx env: @@ -296,27 +211,47 @@ jobs: - name: Create the Windows msi installer (Powershell) run: | - python ..\cura_inst\packaging\msi\create_windows_msi.py ..\cura_inst .\UltiMaker-Cura "${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.msi" "$Env:CURA_APP_NAME" + python ..\cura_inst\packaging\msi\create_windows_msi.py ..\cura_inst .\UltiMaker-Cura "${{steps.filename.outputs.INSTALLER_FILENAME }}.msi" "$Env:CURA_APP_NAME" working-directory: dist - name: Sign the Windows msi installer (Powershell) env: PFX_PATH: ${{ steps.create-pfx.outputs.PFX_PATH }} run: | - & "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.msi" + & "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{steps.filename.outputs.INSTALLER_FILENAME }}.msi" + working-directory: dist + + - name: Create the Windows exe installer (Powershell) + run: | + python ..\cura_inst\packaging\NSIS\create_windows_installer.py ../cura_inst . "${{steps.filename.outputs.INSTALLER_FILENAME }}.exe" + working-directory: dist + + - name: Sign the Windows exe installer (Powershell) + env: + PFX_PATH: ${{ steps.create-pfx.outputs.PFX_PATH }} + run: | + & "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{steps.filename.outputs.INSTALLER_FILENAME }}.exe" working-directory: dist - name: Upload the msi uses: actions/upload-artifact@v3 with: - name: ${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}-msi + name: ${{steps.filename.outputs.INSTALLER_FILENAME }}-msi path: | - dist/${{ needs.cura-installer-create.outputs.INSTALLER_FILENAME }}.msi + dist/${{steps.filename.outputs.INSTALLER_FILENAME }}.msi + retention-days: 5 + + - name: Upload the exe + uses: actions/upload-artifact@v3 + with: + name: ${{steps.filename.outputs.INSTALLER_FILENAME }}-exe + path: | + dist/${{steps.filename.outputs.INSTALLER_FILENAME }}.exe retention-days: 5 notify-export: if: ${{ always() }} - needs: [ cura-installer-create-exe, cura-installer-create-msi ] + needs: [ cura-installer-create ] uses: ultimaker/cura/.github/workflows/notify.yml@main with: From 7011c8f85ab022b0e297416ac8983d0f06fa82b7 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sat, 19 Aug 2023 16:53:25 +0200 Subject: [PATCH 070/126] Removed old installer workflows Contributes to CURA-8415 --- .github/workflows/cura-all-installers.yml | 157 --------- .github/workflows/cura-installer.yml | 399 ---------------------- 2 files changed, 556 deletions(-) delete mode 100644 .github/workflows/cura-all-installers.yml delete mode 100644 .github/workflows/cura-installer.yml diff --git a/.github/workflows/cura-all-installers.yml b/.github/workflows/cura-all-installers.yml deleted file mode 100644 index 96071756fe..0000000000 --- a/.github/workflows/cura-all-installers.yml +++ /dev/null @@ -1,157 +0,0 @@ -name: Cura All Installers -run-name: ${{ inputs.cura_conan_version }} for exe ${{ inputs.build_windows_exe }}, msi ${{ inputs.build_windows_msi }}, dmg ${{ inputs.build_macos }}, pkg ${{ inputs.build_macos_installer }}, appimage ${{ inputs.build_linux }} - enterprise ${{ inputs.enterprise }} - -on: - workflow_dispatch: - inputs: - cura_conan_version: - description: 'Cura Conan Version' - default: 'cura/latest@ultimaker/testing' - required: true - type: string - conan_args: - description: 'Conan args: eq.: --require-override' - default: '' - required: false - type: string - conan_config: - description: 'Conan config branch to use' - default: '' - required: false - type: string - enterprise: - description: 'Build Cura as an Enterprise edition' - default: false - required: true - type: boolean - staging: - description: 'Use staging API' - default: false - required: true - type: boolean - installer: - description: 'Create the installer' - default: true - required: true - type: boolean - build_windows_exe: - description: 'Build for Windows exe' - default: false - required: true - type: boolean - build_windows_msi: - description: 'Build for msi+pkg' - default: true - required: true - type: boolean - build_linux: - description: 'Build for Linux' - default: true - required: true - type: boolean - build_macos: - description: 'Build dmg for MacOS' - default: true - required: true - type: boolean - - # Run the nightly at 3:25 UTC on working days - schedule: - - cron: '25 3 * * 1-5' - -jobs: - windows-installer-create-exe: - if: ${{ inputs.build_windows_exe }} - uses: ./.github/workflows/cura-installer.yml - with: - runner: 'windows-2022' - platform: 'windows-2022' - os_name: 'win64' - cura_conan_version: ${{ inputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - conan_config: ${{ inputs.conan_config }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} - installer: ${{ inputs.installer }} - msi_installer: false - secrets: inherit - - windows-installer-create-msi: - if: ${{ inputs.build_windows_msi }} - uses: ./.github/workflows/cura-installer.yml - with: - runner: 'windows-2022' - platform: 'windows-2022' - os_name: 'win64' - cura_conan_version: ${{ inputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - conan_config: ${{ inputs.conan_config }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} - installer: ${{ inputs.installer }} - msi_installer: true - secrets: inherit - - linux-installer-create: - if: ${{ inputs.build_linux }} - uses: ./.github/workflows/cura-installer.yml - with: - runner: 'ubuntu-20.04' - platform: 'ubuntu-20.04' - os_name: 'linux' - cura_conan_version: ${{ inputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - conan_config: ${{ inputs.conan_config }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} - installer: ${{ inputs.installer }} - msi_installer: false - secrets: inherit - - linux-modern-installer-create: - if: ${{ inputs.build_linux }} - uses: ./.github/workflows/cura-installer.yml - with: - runner: 'ubuntu-22.04' - platform: 'ubuntu-22.04' - os_name: 'linux-modern' - cura_conan_version: ${{ inputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - conan_config: ${{ inputs.conan_config }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} - installer: ${{ inputs.installer }} - msi_installer: false - secrets: inherit - - macos-dmg-create: - if: ${{ inputs.build_macos }} - uses: ./.github/workflows/cura-installer.yml - with: - runner: 'self-hosted' - platform: 'macos-11' - os_name: 'mac' - cura_conan_version: ${{ inputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - conan_config: ${{ inputs.conan_config }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} - installer: ${{ inputs.installer }} - msi_installer: false - secrets: inherit - - macos-installer-create: - if: ${{ inputs.build_macos }} - uses: ./.github/workflows/cura-installer.yml - with: - runner: 'self-hosted' - platform: 'macos-11' - os_name: 'mac' - cura_conan_version: ${{ inputs.cura_conan_version }} - conan_args: ${{ inputs.conan_args }} - conan_config: ${{ inputs.conan_config }} - enterprise: ${{ inputs.enterprise }} - staging: ${{ inputs.staging }} - installer: ${{ inputs.installer }} - msi_installer: true - secrets: inherit diff --git a/.github/workflows/cura-installer.yml b/.github/workflows/cura-installer.yml deleted file mode 100644 index 4b4df0a5bd..0000000000 --- a/.github/workflows/cura-installer.yml +++ /dev/null @@ -1,399 +0,0 @@ -name: Cura Installer -run-name: ${{ inputs.cura_conan_version }} for ${{ inputs.platform }} by @${{ github.actor }} - -on: - workflow_call: - inputs: - runner: - description: 'Selected runner' - default: 'ubuntu-20.04' - required: true - type: string - platform: - description: 'Selected Installer OS' - default: 'ubuntu-20.04' - required: true - type: string - os_name: - description: 'OS Friendly Name' - default: 'linux' - required: true - type: string - cura_conan_version: - description: 'Cura Conan Version' - default: 'cura/latest@ultimaker/testing' - required: true - type: string - conan_args: - description: 'Conan args: eq.: --require-override' - default: '' - required: false - type: string - conan_config: - description: 'Conan config branch to use' - default: '' - required: false - type: string - enterprise: - description: 'Build Cura as an Enterprise edition' - default: false - required: true - type: boolean - staging: - description: 'Use staging API' - default: false - required: true - type: boolean - installer: - description: 'Create the installer' - default: true - required: true - type: boolean - msi_installer: - description: 'Create the msi' - default: false - required: true - type: boolean - -env: - CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} - CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} - CONAN_LOGIN_USERNAME_CURA_CE: ${{ secrets.CONAN_USER }} - CONAN_PASSWORD_CURA_CE: ${{ secrets.CONAN_PASS }} - CONAN_LOG_RUN_TO_OUTPUT: 1 - CONAN_LOGGING_LEVEL: ${{ inputs.conan_logging_level }} - CONAN_NON_INTERACTIVE: 1 - CODESIGN_IDENTITY: ${{ secrets.CODESIGN_IDENTITY }} - MAC_NOTARIZE_USER: ${{ secrets.MAC_NOTARIZE_USER }} - MAC_NOTARIZE_PASS: ${{ secrets.MAC_NOTARIZE_PASS }} - MACOS_CERT_P12: ${{ secrets.MACOS_CERT_P12 }} - MACOS_CERT_INSTALLER_P12: ${{ secrets.MACOS_CERT_INSTALLER_P12 }} - MACOS_CERT_USER: ${{ secrets.MACOS_CERT_USER }} - GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} - MACOS_CERT_PASSPHRASE: ${{ secrets.MACOS_CERT_PASSPHRASE }} - WIN_CERT_INSTALLER_CER: ${{ secrets.WIN_CERT_INSTALLER_CER }} - WIN_CERT_INSTALLER_CER_PASS: ${{ secrets.WIN_CERT_INSTALLER_CER_PASS }} - CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }} - ENTERPRISE: ${{ inputs.enterprise }} - STAGING: ${{ inputs.staging }} - -jobs: - cura-installer-create: - runs-on: ${{ inputs.runner }} - - steps: - - name: Checkout - uses: actions/checkout@v3 - - - name: Setup Python and pip - uses: actions/setup-python@v4 - with: - python-version: '3.10.x' - cache: 'pip' - cache-dependency-path: .github/workflows/requirements-conan-package.txt - - - name: Install Python requirements for runner - run: pip install -r https://raw.githubusercontent.com/Ultimaker/Cura/main/.github/workflows/requirements-conan-package.txt - # Note the runner requirements are always installed from the main branch in the Ultimaker/Cura repo - - - name: Use Conan download cache (Bash) - if: ${{ runner.os != 'Windows' }} - run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache" - - - name: Use Conan download cache (Powershell) - if: ${{ runner.os == 'Windows' }} - run: conan config set storage.download_cache="C:\Users\runneradmin\.conan\conan_download_cache" - - - name: Cache Conan local repository packages (Bash) - uses: actions/cache@v3 - if: ${{ runner.os != 'Windows' }} - with: - path: | - $HOME/.conan/data - $HOME/.conan/conan_download_cache - key: conan-${{ runner.os }}-${{ runner.arch }}-installer-cache - - - name: Cache Conan local repository packages (Powershell) - uses: actions/cache@v3 - if: ${{ runner.os == 'Windows' }} - with: - path: | - C:\Users\runneradmin\.conan\data - C:\.conan - C:\Users\runneradmin\.conan\conan_download_cache - key: conan-${{ runner.os }}-${{ runner.arch }}-installer-cache - - - name: Install MacOS system requirements - if: ${{ runner.os == 'Macos' }} - run: brew install autoconf automake ninja create-dmg # Delete create-dmg when deprecating dmg - - - name: Hack needed specifically for ubuntu-22.04 from mid-Feb 2023 onwards - if: ${{ runner.os == 'Linux' && startsWith(inputs.platform, 'ubuntu-22.04') }} - run: sudo apt remove libodbc2 libodbcinst2 unixodbc-common -y - - # NOTE: Due to what are probably github issues, we have to remove the cache and reconfigure before the rest. - # This is maybe because grub caches the disk it uses last time, which is recreated each time. - - name: Install Linux system requirements - if: ${{ runner.os == 'Linux' }} - run: | - sudo rm /var/cache/debconf/config.dat - sudo dpkg --configure -a - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y - sudo apt update - sudo apt upgrade - sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config -y - wget --no-check-certificate --quiet https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O $GITHUB_WORKSPACE/appimagetool - chmod +x $GITHUB_WORKSPACE/appimagetool - echo "APPIMAGETOOL_LOCATION=$GITHUB_WORKSPACE/appimagetool" >> $GITHUB_ENV - - - name: Install GCC-12 on ubuntu-22.04 - if: ${{ startsWith(inputs.platform, 'ubuntu-22.04') }} - run: | - sudo apt install g++-12 gcc-12 -y - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12 - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12 - - - name: Use GCC-10 on ubuntu-20.04 - if: ${{ startsWith(inputs.platform, 'ubuntu-20.04') }} - run: | - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10 - - - name: Create the default Conan profile - run: conan profile new default --detect --force - - - name: Configure GPG Key Linux (Bash) - if: ${{ runner.os == 'Linux' }} - run: echo -n "$GPG_PRIVATE_KEY" | base64 --decode | gpg --import - - - name: Remove Macos keychain (Bash) - if: ${{ runner.os == 'Macos' && inputs.runner == 'self-hosted' }} - run: security delete-keychain signing_temp.keychain || true - - - name: Configure Macos keychain Developer Cert(Bash) - id: macos-keychain-developer-cert - if: ${{ runner.os == 'Macos' }} - uses: apple-actions/import-codesign-certs@v1 - with: - keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} - p12-file-base64: ${{ secrets.MACOS_CERT_P12 }} - p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} - - - name: Configure Macos keychain Installer Cert (Bash) - id: macos-keychain-installer-cert - if: ${{ runner.os == 'Macos' }} - uses: apple-actions/import-codesign-certs@v1 - with: - keychain-password: ${{ secrets.MACOS_KEYCHAIN_PASSWORD }} - create-keychain: false # keychain is created in previous use of action. - p12-file-base64: ${{ secrets.MACOS_CERT_INSTALLER_P12 }} - p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} - - - name: Create PFX certificate from BASE64_PFX_CONTENT secret - if: ${{ runner.os == 'Windows' }} - id: create-pfx - env: - PFX_CONTENT: ${{ secrets.WIN_CERT_INSTALLER_CER }} - run: | - $pfxPath = Join-Path -Path $env:RUNNER_TEMP -ChildPath "cert.pfx"; - $encodedBytes = [System.Convert]::FromBase64String($env:PFX_CONTENT); - Set-Content $pfxPath -Value $encodedBytes -AsByteStream; - echo "PFX_PATH=$pfxPath" >> $env:GITHUB_OUTPUT; - - - name: Get Conan configuration from branch - if: ${{ inputs.conan_config != '' }} - run: conan config install https://github.com/Ultimaker/conan-config.git -a "-b ${{ inputs.conan_config }}" - - - name: Get Conan configuration - if: ${{ inputs.conan_config == '' }} - run: conan config install https://github.com/Ultimaker/conan-config.git - - - name: Create the Packages (Bash) - if: ${{ runner.os != 'Windows' }} - run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING --json "cura_inst/conan_install_info.json" - - - name: Create the Packages (Powershell) - if: ${{ runner.os == 'Windows' }} - run: conan install $Env:CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$Env:ENTERPRISE -o cura:staging=$Env:STAGING --json "cura_inst/conan_install_info.json" - - - name: Set Environment variables for Cura (bash) - if: ${{ runner.os != 'Windows' }} - run: | - . ./cura_inst/bin/activate_github_actions_env.sh - . ./cura_inst/bin/activate_github_actions_version_env.sh - - - name: Set Environment variables for Cura (Powershell) - if: ${{ runner.os == 'Windows' }} - run: | - echo "${Env:WIX}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - .\cura_inst\Scripts\activate_github_actions_env.ps1 - .\cura_inst\Scripts\activate_github_actions_version_env.ps1 - - - name: Unlock Macos keychain (Bash) - if: ${{ runner.os == 'Macos' }} - run: security unlock -p $TEMP_KEYCHAIN_PASSWORD signing_temp.keychain - env: - TEMP_KEYCHAIN_PASSWORD: ${{ steps.macos-keychain-developer-cert.outputs.keychain-password }} - - # FIXME: This is a workaround to ensure that we use and pack a shared library for OpenSSL 1.1.1l. We currently compile - # OpenSSL statically for CPython, but our Python Dependenies (such as PyQt6) require a shared library. - # Because Conan won't allow for building the same library with two different options (easily) we need to install it explicitly - # and do a manual copy to the VirtualEnv, such that Pyinstaller can find it. - - - name: Install OpenSSL shared - run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy - - - name: Copy OpenSSL shared (Bash) - if: ${{ runner.os != 'Windows' }} - run: | - cp ./openssl/lib/*.so* ./cura_inst/bin/ || true - cp ./openssl/lib/*.dylib* ./cura_inst/bin/ || true - - - name: Copy OpenSSL shared (Powershell) - if: ${{ runner.os == 'Windows' }} - run: | - cp openssl/bin/*.dll ./cura_inst/Scripts/ - cp openssl/lib/*.lib ./cura_inst/Lib/ - - - name: Create the Cura dist - run: pyinstaller ./cura_inst/UltiMaker-Cura.spec - - - name: Output the name file name and extension - id: filename - shell: python - run: | - import os - enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else "" - installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-${{ inputs.os_name }}-${{ inputs.arch }}" - if "${{ runner.os }}" == "Windows": - installer_ext = "msi" if "${{ inputs.msi_installer }}" == "true" else "exe" - elif "${{ runner.os }}" == "macOS": - installer_ext = "pkg" if "${{ inputs.msi_installer }}" == "true" else "dmg" - else: - installer_ext = "AppImage" - output_env = os.environ["GITHUB_OUTPUT"] - content = "" - if os.path.exists(output_env): - with open(output_env, "r") as f: - content = f.read() - with open(output_env, "w") as f: - f.write(content) - f.writelines(f"INSTALLER_FILENAME={installer_filename}\n") - f.writelines(f"INSTALLER_EXT={installer_ext}\n") - f.writelines(f"FULL_INSTALLER_FILENAME={installer_filename}.{installer_ext}\n") - - - name: Summarize the used Conan dependencies - shell: python - run: | - import os - import json - from pathlib import Path - - conan_install_info_path = Path("cura_inst/conan_install_info.json") - conan_info = {"installed": []} - if os.path.exists(conan_install_info_path): - with open(conan_install_info_path, "r") as f: - conan_info = json.load(f) - sorted_deps = sorted([dep["recipe"]["id"].replace('#', r' rev: ') for dep in conan_info["installed"]]) - - summary_env = os.environ["GITHUB_STEP_SUMMARY"] - content = "" - if os.path.exists(summary_env): - with open(summary_env, "r") as f: - content = f.read() - - with open(summary_env, "w") as f: - f.write(content) - f.writelines("# ${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}\n") - f.writelines("## Conan packages:\n") - for dep in sorted_deps: - f.writelines(f"`{dep}`\n") - - - name: Summarize the used Python modules - shell: python - run: | - import os - import pkg_resources - summary_env = os.environ["GITHUB_STEP_SUMMARY"] - content = "" - if os.path.exists(summary_env): - with open(summary_env, "r") as f: - content = f.read() - - with open(summary_env, "w") as f: - f.write(content) - f.writelines("## Python modules:\n") - for package in pkg_resources.working_set: - f.writelines(f"`{package.key}/{package.version}`\n") - - - name: Archive the artifacts (bash) - if: ${{ !inputs.installer && runner.os != 'Windows' }} - run: tar -zcf "./${{ steps.filename.outputs.INSTALLER_FILENAME }}.tar.gz" "./UltiMaker-Cura/" - working-directory: dist - - - name: Archive the artifacts (Powershell) - if: ${{ !inputs.installer && runner.os == 'Windows' }} - run: Compress-Archive -Path ".\UltiMaker-Cura" -DestinationPath ".\${{ steps.filename.outputs.INSTALLER_FILENAME }}.zip" - working-directory: dist - - - name: Create the Windows exe installer (Powershell) - if: ${{ inputs.installer && runner.os == 'Windows' && !inputs.msi_installer }} - run: | - python ..\cura_inst\packaging\NSIS\create_windows_installer.py ../cura_inst . "${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}" - working-directory: dist - - - name: Create the Windows msi installer (Powershell) - if: ${{ inputs.installer && runner.os == 'Windows' && inputs.msi_installer }} - run: | - python ..\cura_inst\packaging\msi\create_windows_msi.py ..\cura_inst .\UltiMaker-Cura "${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}" "$Env:CURA_APP_NAME" - working-directory: dist - - - name: Sign the Windows exe installer (Powershell) - if: ${{ inputs.installer && runner.os == 'Windows' && !inputs.msi_installer }} - env: - PFX_PATH: ${{ steps.create-pfx.outputs.PFX_PATH }} - run: | - & "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}" - working-directory: dist - - - name: Sign the Windows msi installer (Powershell) - if: ${{ inputs.installer && runner.os == 'Windows' && inputs.msi_installer }} - env: - PFX_PATH: ${{ steps.create-pfx.outputs.PFX_PATH }} - run: | - & "C:/Program Files (x86)/Windows Kits/10/bin/10.0.17763.0/x86/signtool.exe" sign /f $Env:PFX_PATH /p "$Env:WIN_CERT_INSTALLER_CER_PASS" /fd SHA256 /t http://timestamp.digicert.com "${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}" - working-directory: dist - - - name: Create the Linux AppImage (Bash) - if: ${{ inputs.installer && runner.os == 'Linux' }} - run: python ../cura_inst/packaging/AppImage/create_appimage.py ./UltiMaker-Cura $CURA_VERSION_FULL "${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}" - working-directory: dist - - - name: Create the MacOS dmg and/or pkg (Bash) - if: ${{ github.event.inputs.installer == 'true' && runner.os == 'Macos' }} - run: python ../cura_inst/packaging/MacOS/build_macos.py ../cura_inst . $CURA_CONAN_VERSION "${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }}" "$CURA_APP_NAME" - working-directory: dist - - - name: Upload the artifacts - uses: actions/upload-artifact@v3 - with: - name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-${{ steps.filename.outputs.INSTALLER_EXT }} - path: | - dist/*.tar.gz - dist/*.zip - dist/${{ steps.filename.outputs.FULL_INSTALLER_FILENAME }} - dist/*.asc - retention-days: 5 - - notify-export: - if: ${{ always() }} - needs: [ cura-installer-create ] - - uses: ultimaker/cura/.github/workflows/notify.yml@main - with: - success: ${{ contains(join(needs.*.result, ','), 'success') }} - success_title: "Create the Cura distributions" - success_body: "Installers for ${{ inputs.cura_conan_version }}" - failure_title: "Failed to create the Cura distributions" - failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}" - secrets: inherit From bd57b43931c1c192e4bce50b0bac2b2cbb1cc4b4 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Sun, 20 Aug 2023 12:49:25 +0200 Subject: [PATCH 071/126] Use runner OS and Arch specific configurations https://github.com/Ultimaker/Cura/issues/11841#issuecomment-1685076361 Contributes to CURA-8415 and CURA-10855 --- .github/workflows/linux.yml | 4 +++- .github/workflows/macos.yml | 8 +++----- .github/workflows/windows.yml | 4 +++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 70a15bcbb5..4d58dcee34 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -144,7 +144,9 @@ jobs: run: echo -n "$GPG_PRIVATE_KEY" | base64 --decode | gpg --import - name: Get Conan configuration - run: conan config install https://github.com/Ultimaker/conan-config.git + run: | + conan config install https://github.com/Ultimaker/conan-config.git + conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}" - name: Use Conan download cache (Bash) run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache" diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 736c906dab..4690d27878 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -144,15 +144,13 @@ jobs: p12-password: ${{ secrets.MACOS_CERT_PASSPHRASE }} - name: Get Conan configuration - run: conan config install https://github.com/Ultimaker/conan-config.git + run: | + conan config install https://github.com/Ultimaker/conan-config.git + conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}" - name: Use Conan download cache (Bash) run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache" - - name: Set architecture conan profile - if: ${{ inputs.architecture == 'X64' }} - run: conan profile update settings.arch=x86_64 default - - name: Create the Packages (Bash) run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING --json "cura_inst/conan_install_info.json" diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 57bace2fef..88d9d84e94 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -114,7 +114,9 @@ jobs: run: conan profile new default --detect --force - name: Get Conan configuration - run: conan config install https://github.com/Ultimaker/conan-config.git + run: | + conan config install https://github.com/Ultimaker/conan-config.git + conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}" - name: Use Conan download cache (Powershell) run: conan config set storage.download_cache="C:\Users\runneradmin\.conan\conan_download_cache" From 6870a3bce48f5115f390c1e93b41b3e9f87b721a Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Mon, 21 Aug 2023 10:06:51 +0200 Subject: [PATCH 072/126] improve number of iterations CURA-10685 --- cura/Settings/CuraFormulaFunctions.py | 8 ++++---- resources/definitions/fdmprinter.def.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cura/Settings/CuraFormulaFunctions.py b/cura/Settings/CuraFormulaFunctions.py index fd6555e679..8dd96cc03e 100644 --- a/cura/Settings/CuraFormulaFunctions.py +++ b/cura/Settings/CuraFormulaFunctions.py @@ -101,10 +101,10 @@ class CuraFormulaFunctions: def getAnyExtruderPositionWithOrDefault(self, filter_key: str, context: Optional["PropertyEvaluationContext"] = None) -> str: for extruder in self._getActiveExtruders(context): - value = extruder.getRawProperty(filter_key, "value", context=context) - if value is None or not value: - continue - return str(extruder.position) + material_container = extruder.material + value = material_container.getProperty(filter_key, "value", context) + if value is not None: + return extruder.position return self.getDefaultExtruderPosition() # Get the resolve value or value for a given key. diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 9c83431f54..525a5e1eee 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4488,7 +4488,7 @@ "type": "extruder", "default_value": "0", "enabled": "(support_enable or support_meshes_present) and extruders_enabled_count > 1", - "value": "int(defaultExtruderPosition())", + "value": "int(anyExtruderNrWithOrDefault('material_is_support_material'))", "settable_per_mesh": false, "settable_per_extruder": false, "children": From 0c405288e010ac341f4ce9965d0f9dd4ebe79535 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Mon, 21 Aug 2023 15:50:52 +0200 Subject: [PATCH 073/126] Add wrapper to Cura.ScrollableTextArea Add wrapper to legacy Cura.ScrollableTextArea class which has now moved to Uranium, in order to keep plugins working in case they use it. CURA-9374 --- .../Marketplace/resources/qml/LicenseDialog.qml | 2 +- .../resources/qml/MultipleLicenseDialog.qml | 2 +- plugins/SliceInfoPlugin/MoreInfoWindow.qml | 2 +- resources/qml/WelcomePages/ChangelogContent.qml | 2 +- resources/qml/WelcomePages/WhatsNewContent.qml | 2 +- resources/qml/Widgets/ScrollableTextArea.qml | 14 ++++++++++++++ 6 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 resources/qml/Widgets/ScrollableTextArea.qml diff --git a/plugins/Marketplace/resources/qml/LicenseDialog.qml b/plugins/Marketplace/resources/qml/LicenseDialog.qml index 849df5925e..775e53f7aa 100644 --- a/plugins/Marketplace/resources/qml/LicenseDialog.qml +++ b/plugins/Marketplace/resources/qml/LicenseDialog.qml @@ -52,7 +52,7 @@ UM.Dialog } } - UM.ScrollableTextArea + Cura.ScrollableTextArea { Layout.fillWidth: true Layout.fillHeight: true diff --git a/plugins/Marketplace/resources/qml/MultipleLicenseDialog.qml b/plugins/Marketplace/resources/qml/MultipleLicenseDialog.qml index c92709e954..b251aeab85 100644 --- a/plugins/Marketplace/resources/qml/MultipleLicenseDialog.qml +++ b/plugins/Marketplace/resources/qml/MultipleLicenseDialog.qml @@ -66,7 +66,7 @@ UM.Dialog } } - UM.ScrollableTextArea + Cura.ScrollableTextArea { Layout.fillWidth: true Layout.fillHeight: true diff --git a/plugins/SliceInfoPlugin/MoreInfoWindow.qml b/plugins/SliceInfoPlugin/MoreInfoWindow.qml index 3debd8e707..76b9e651c7 100644 --- a/plugins/SliceInfoPlugin/MoreInfoWindow.qml +++ b/plugins/SliceInfoPlugin/MoreInfoWindow.qml @@ -74,7 +74,7 @@ Window wrapMode: Text.WordWrap } - UM.ScrollableTextArea + Cura.ScrollableTextArea { anchors { diff --git a/resources/qml/WelcomePages/ChangelogContent.qml b/resources/qml/WelcomePages/ChangelogContent.qml index 20380f3938..9be3c30373 100644 --- a/resources/qml/WelcomePages/ChangelogContent.qml +++ b/resources/qml/WelcomePages/ChangelogContent.qml @@ -26,7 +26,7 @@ Item font: UM.Theme.getFont("huge") } - UM.ScrollableTextArea + Cura.ScrollableTextArea { id: changelogTextArea diff --git a/resources/qml/WelcomePages/WhatsNewContent.qml b/resources/qml/WelcomePages/WhatsNewContent.qml index eefadbdacf..787b280095 100644 --- a/resources/qml/WelcomePages/WhatsNewContent.qml +++ b/resources/qml/WelcomePages/WhatsNewContent.qml @@ -90,7 +90,7 @@ Item source: manager.getSubpageImageSource(index) } - UM.ScrollableTextArea + Cura.ScrollableTextArea { id: subpageText diff --git a/resources/qml/Widgets/ScrollableTextArea.qml b/resources/qml/Widgets/ScrollableTextArea.qml new file mode 100644 index 0000000000..3f0db28058 --- /dev/null +++ b/resources/qml/Widgets/ScrollableTextArea.qml @@ -0,0 +1,14 @@ +// Copyright (c) 2022 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.10 +import QtQuick.Controls 2.3 + +import UM 1.7 as UM +import Cura 1.1 as Cura + + +// Wrapper to UM.ScrollableTextArea which was originally placed here +UM.ScrollableTextArea +{ +} From 89cb69a376faf93b880d88a33f833cc7dbb4a8c2 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Mon, 21 Aug 2023 15:57:36 +0200 Subject: [PATCH 074/126] Restored QML import versions Restore versions to minimize the impact of CURA-9374 --- plugins/Marketplace/resources/qml/LicenseDialog.qml | 2 +- plugins/Marketplace/resources/qml/MultipleLicenseDialog.qml | 2 +- plugins/SliceInfoPlugin/MoreInfoWindow.qml | 2 +- resources/qml/WelcomePages/ChangelogContent.qml | 2 +- resources/qml/WelcomePages/WhatsNewContent.qml | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/Marketplace/resources/qml/LicenseDialog.qml b/plugins/Marketplace/resources/qml/LicenseDialog.qml index 775e53f7aa..5dd8ac6fc4 100644 --- a/plugins/Marketplace/resources/qml/LicenseDialog.qml +++ b/plugins/Marketplace/resources/qml/LicenseDialog.qml @@ -6,7 +6,7 @@ import QtQuick.Window 2.2 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 -import UM 1.7 as UM +import UM 1.6 as UM import Cura 1.6 as Cura UM.Dialog diff --git a/plugins/Marketplace/resources/qml/MultipleLicenseDialog.qml b/plugins/Marketplace/resources/qml/MultipleLicenseDialog.qml index b251aeab85..a3d4b60221 100644 --- a/plugins/Marketplace/resources/qml/MultipleLicenseDialog.qml +++ b/plugins/Marketplace/resources/qml/MultipleLicenseDialog.qml @@ -6,7 +6,7 @@ import QtQuick.Window 2.2 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 -import UM 1.7 as UM +import UM 1.5 as UM import Cura 1.6 as Cura UM.Dialog diff --git a/plugins/SliceInfoPlugin/MoreInfoWindow.qml b/plugins/SliceInfoPlugin/MoreInfoWindow.qml index 76b9e651c7..e0954dc55e 100644 --- a/plugins/SliceInfoPlugin/MoreInfoWindow.qml +++ b/plugins/SliceInfoPlugin/MoreInfoWindow.qml @@ -5,7 +5,7 @@ import QtQuick 2.10 import QtQuick.Controls 2.3 import QtQuick.Window 2.2 -import UM 1.7 as UM +import UM 1.5 as UM import Cura 1.1 as Cura Window diff --git a/resources/qml/WelcomePages/ChangelogContent.qml b/resources/qml/WelcomePages/ChangelogContent.qml index 9be3c30373..7c3b1adfc3 100644 --- a/resources/qml/WelcomePages/ChangelogContent.qml +++ b/resources/qml/WelcomePages/ChangelogContent.qml @@ -4,7 +4,7 @@ import QtQuick 2.10 import QtQuick.Controls 2.3 -import UM 1.7 as UM +import UM 1.5 as UM import Cura 1.1 as Cura diff --git a/resources/qml/WelcomePages/WhatsNewContent.qml b/resources/qml/WelcomePages/WhatsNewContent.qml index 787b280095..6406d65756 100644 --- a/resources/qml/WelcomePages/WhatsNewContent.qml +++ b/resources/qml/WelcomePages/WhatsNewContent.qml @@ -5,7 +5,7 @@ import QtQuick 2.10 import QtQuick.Controls 2.3 import QtQuick.Layouts 1.3 -import UM 1.7 as UM +import UM 1.5 as UM import Cura 1.1 as Cura From 209162fbce5dc0e5b2ff934900623691c46df233 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Mon, 21 Aug 2023 17:31:29 +0200 Subject: [PATCH 075/126] multiplying objects place them in a grid CURA-7951 --- cura/Arranging/GridArrange.py | 185 ++++++++++++++++++++++++++++++++++ cura/MultiplyObjectsJob.py | 18 ++-- 2 files changed, 197 insertions(+), 6 deletions(-) create mode 100644 cura/Arranging/GridArrange.py diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py new file mode 100644 index 0000000000..543971c5b2 --- /dev/null +++ b/cura/Arranging/GridArrange.py @@ -0,0 +1,185 @@ +import math +from typing import List, TYPE_CHECKING, Optional, Tuple, Set + +from UM.Application import Application +from UM.Math import AxisAlignedBox +from UM.Math.Vector import Vector +from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation +from UM.Operations.GroupedOperation import GroupedOperation +from UM.Operations.TranslateOperation import TranslateOperation + + +class GridArrange: + offset_x: float = 10 + offset_y: float = 10 + + _grid_width: float + _grid_height: float + + _nodes_to_arrange: List["SceneNode"] + _fixed_nodes: List["SceneNode"] + _build_volume_bounding_box = AxisAlignedBox + + def __init__(self, nodes_to_arrange: List["SceneNode"], build_volume: "BuildVolume", fixed_nodes: List["SceneNode"] = []): + print("len(nodes_to_arrange)", len(nodes_to_arrange)) + self._nodes_to_arrange = nodes_to_arrange + self._build_volume_bounding_box = build_volume.getBoundingBox() + self._fixed_nodes = fixed_nodes + + def arrange(self) -> Tuple[GroupedOperation, int]: + self._grid_width = 0 + self._grid_height = 0 + for node in self._nodes_to_arrange: + bounding_box = node.getBoundingBox() + self._grid_width = max(self._grid_width, bounding_box.width) + self._grid_height = max(self._grid_height, bounding_box.depth) + + # Find grid indexes that intersect with fixed objects + fixed_nodes_grid_ids = set() + for node in self._fixed_nodes: + fixed_nodes_grid_ids = fixed_nodes_grid_ids.union(self.intersectingGridIdxInclusive(node.getBoundingBox())) + + build_plate_grid_ids = self.intersectingGridIdxExclusive(self._build_volume_bounding_box) + allowed_grid_idx = build_plate_grid_ids.difference(fixed_nodes_grid_ids) + + # Find the sequence in which items are placed + coord_build_plate_center_x = self._build_volume_bounding_box.width * 0.5 + self._build_volume_bounding_box.left + coord_build_plate_center_y = self._build_volume_bounding_box.depth * 0.5 + self._build_volume_bounding_box.back + grid_build_plate_center_x, grid_build_plate_center_y = self.coordSpaceToGridSpace(coord_build_plate_center_x, coord_build_plate_center_y) + + def distToCenter(grid_id: Tuple[int, int]) -> float: + grid_x, grid_y = grid_id + distance_squared = (grid_build_plate_center_x - grid_x) ** 2 + (grid_build_plate_center_y - grid_y) ** 2 + return distance_squared + + sequence: List[Tuple[int, int]] = list(allowed_grid_idx) + sequence.sort(key=distToCenter) + scene_root = Application.getInstance().getController().getScene().getRoot() + grouped_operation = GroupedOperation() + + for grid_id, node in zip(sequence, self._nodes_to_arrange): + grouped_operation.addOperation(AddSceneNodeOperation(node, scene_root)) + grid_x, grid_y = grid_id + + coord_grid_x, coord_grid_y = self.gridSpaceToCoordSpace(grid_x, grid_y) + center_grid_x = coord_grid_x+(0.5 * self._grid_width) + center_grid_y = coord_grid_y+(0.5 * self._grid_height) + + bounding_box = node.getBoundingBox() + center_node_x = (bounding_box.left + bounding_box.right) * 0.5 + center_node_y = (bounding_box.back + bounding_box.front) * 0.5 + + delta_x = center_grid_x - center_node_x + delta_y = center_grid_y - center_node_y + grouped_operation.addOperation(TranslateOperation(node, Vector(delta_x, 0, delta_y))) + + self.drawDebugSvg() + + return grouped_operation, 0 + + def getGridCornerPoints(self, bounding_box: "BoundingVolume") -> Tuple[float, float, float, float]: + coord_x1 = bounding_box.left + coord_x2 = bounding_box.right + coord_y1 = bounding_box.back + coord_y2 = bounding_box.front + grid_x1, grid_y1 = self.coordSpaceToGridSpace(coord_x1, coord_y1) + grid_x2, grid_y2 = self.coordSpaceToGridSpace(coord_x2, coord_y2) + return grid_x1, grid_y1, grid_x2, grid_y2 + + def intersectingGridIdxInclusive(self, bounding_box: "BoundingVolume") -> Set[Tuple[int, int]]: + grid_x1, grid_y1, grid_x2, grid_y2 = self.getGridCornerPoints(bounding_box) + grid_idx = set() + for grid_x in range(math.floor(grid_x1), math.ceil(grid_x2)): + for grid_y in range(math.floor(grid_y1), math.ceil(grid_y2)): + grid_idx.add((grid_x, grid_y)) + return grid_idx + + def intersectingGridIdxExclusive(self, bounding_box: "BoundingVolume") -> Set[Tuple[int, int]]: + grid_x1, grid_y1, grid_x2, grid_y2 = self.getGridCornerPoints(bounding_box) + grid_idx = set() + for grid_x in range(math.ceil(grid_x1), math.floor(grid_x2)): + for grid_y in range(math.ceil(grid_y1), math.floor(grid_y2)): + grid_idx.add((grid_x, grid_y)) + return grid_idx + + def gridSpaceToCoordSpace(self, x: float, y: float) -> Tuple[float, float]: + grid_x = x * (self._grid_width + self.offset_x) + self._build_volume_bounding_box.left + grid_y = y * (self._grid_height + self.offset_y) + self._build_volume_bounding_box.back + return grid_x, grid_y + + def coordSpaceToGridSpace(self, grid_x: float, grid_y: float) -> Tuple[float, float]: + coord_x = (grid_x - self._build_volume_bounding_box.left) / (self._grid_width + self.offset_x) + coord_y = (grid_y - self._build_volume_bounding_box.back) / (self._grid_height + self.offset_y) + return coord_x, coord_y + + def drawDebugSvg(self): + with open("Builvolume_test.svg", "w") as f: + build_volume_bounding_box = self._build_volume_bounding_box + + f.write( + f"\n") + + f.write( + f""" + + """) + + for grid_x in range(-10, 10): + for grid_y in range(-10, 10): + # if (grid_x, grid_y) in intersecting_grid_idx: + # fill_color = "red" + # elif (grid_x, grid_y) in build_plate_grid_idx: + # fill_color = "green" + # else: + # fill_color = "orange" + coord_grid_x, coord_grid_y = self.gridSpaceToCoordSpace(grid_x, grid_y) + f.write( + f""" + + """) + f.write(f""" + + {grid_x},{grid_y} + + """) + for node in self._fixed_nodes: + bounding_box = node.getBoundingBox() + f.write(f""" + + """) + for node in self._nodes_to_arrange: + bounding_box = node.getBoundingBox() + f.write(f""" + + """) + f.write(f"") diff --git a/cura/MultiplyObjectsJob.py b/cura/MultiplyObjectsJob.py index ff4f362b4c..e1cead7557 100644 --- a/cura/MultiplyObjectsJob.py +++ b/cura/MultiplyObjectsJob.py @@ -14,6 +14,7 @@ from UM.Operations.TranslateOperation import TranslateOperation from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.i18n import i18nCatalog +from cura.Arranging.GridArrange import GridArrange from cura.Arranging.Nest2DArrange import arrange, createGroupOperationForArrange i18n_catalog = i18nCatalog("cura") @@ -77,12 +78,17 @@ class MultiplyObjectsJob(Job): found_solution_for_all = True group_operation = GroupedOperation() if nodes: - group_operation, not_fit_count = createGroupOperationForArrange(nodes, - Application.getInstance().getBuildVolume(), - fixed_nodes, - factor=10000, - add_new_nodes_in_scene=True, - lock_rotation=self._lock_rotation) + grid_arrange = GridArrange(nodes,Application.getInstance().getBuildVolume(), + fixed_nodes) + + group_operation, not_fit_count = grid_arrange.arrange() + print("group_operation", group_operation) + # group_operation, not_fit_count = createGroupOperationForArrange(nodes, + # Application.getInstance().getBuildVolume(), + # fixed_nodes, + # factor=10000, + # add_new_nodes_in_scene=True, + # lock_rotation=self._lock_rotation) found_solution_for_all = not_fit_count == 0 if nodes_to_add_without_arrange: From df69ccadb585fb86291861b1dfd3015dadfd0182 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Mon, 21 Aug 2023 18:45:40 +0200 Subject: [PATCH 076/126] Revert "multiplying objects place them in a grid" This reverts commit 209162fbce5dc0e5b2ff934900623691c46df233. --- cura/Arranging/GridArrange.py | 185 ---------------------------------- cura/MultiplyObjectsJob.py | 18 ++-- 2 files changed, 6 insertions(+), 197 deletions(-) delete mode 100644 cura/Arranging/GridArrange.py diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py deleted file mode 100644 index 543971c5b2..0000000000 --- a/cura/Arranging/GridArrange.py +++ /dev/null @@ -1,185 +0,0 @@ -import math -from typing import List, TYPE_CHECKING, Optional, Tuple, Set - -from UM.Application import Application -from UM.Math import AxisAlignedBox -from UM.Math.Vector import Vector -from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation -from UM.Operations.GroupedOperation import GroupedOperation -from UM.Operations.TranslateOperation import TranslateOperation - - -class GridArrange: - offset_x: float = 10 - offset_y: float = 10 - - _grid_width: float - _grid_height: float - - _nodes_to_arrange: List["SceneNode"] - _fixed_nodes: List["SceneNode"] - _build_volume_bounding_box = AxisAlignedBox - - def __init__(self, nodes_to_arrange: List["SceneNode"], build_volume: "BuildVolume", fixed_nodes: List["SceneNode"] = []): - print("len(nodes_to_arrange)", len(nodes_to_arrange)) - self._nodes_to_arrange = nodes_to_arrange - self._build_volume_bounding_box = build_volume.getBoundingBox() - self._fixed_nodes = fixed_nodes - - def arrange(self) -> Tuple[GroupedOperation, int]: - self._grid_width = 0 - self._grid_height = 0 - for node in self._nodes_to_arrange: - bounding_box = node.getBoundingBox() - self._grid_width = max(self._grid_width, bounding_box.width) - self._grid_height = max(self._grid_height, bounding_box.depth) - - # Find grid indexes that intersect with fixed objects - fixed_nodes_grid_ids = set() - for node in self._fixed_nodes: - fixed_nodes_grid_ids = fixed_nodes_grid_ids.union(self.intersectingGridIdxInclusive(node.getBoundingBox())) - - build_plate_grid_ids = self.intersectingGridIdxExclusive(self._build_volume_bounding_box) - allowed_grid_idx = build_plate_grid_ids.difference(fixed_nodes_grid_ids) - - # Find the sequence in which items are placed - coord_build_plate_center_x = self._build_volume_bounding_box.width * 0.5 + self._build_volume_bounding_box.left - coord_build_plate_center_y = self._build_volume_bounding_box.depth * 0.5 + self._build_volume_bounding_box.back - grid_build_plate_center_x, grid_build_plate_center_y = self.coordSpaceToGridSpace(coord_build_plate_center_x, coord_build_plate_center_y) - - def distToCenter(grid_id: Tuple[int, int]) -> float: - grid_x, grid_y = grid_id - distance_squared = (grid_build_plate_center_x - grid_x) ** 2 + (grid_build_plate_center_y - grid_y) ** 2 - return distance_squared - - sequence: List[Tuple[int, int]] = list(allowed_grid_idx) - sequence.sort(key=distToCenter) - scene_root = Application.getInstance().getController().getScene().getRoot() - grouped_operation = GroupedOperation() - - for grid_id, node in zip(sequence, self._nodes_to_arrange): - grouped_operation.addOperation(AddSceneNodeOperation(node, scene_root)) - grid_x, grid_y = grid_id - - coord_grid_x, coord_grid_y = self.gridSpaceToCoordSpace(grid_x, grid_y) - center_grid_x = coord_grid_x+(0.5 * self._grid_width) - center_grid_y = coord_grid_y+(0.5 * self._grid_height) - - bounding_box = node.getBoundingBox() - center_node_x = (bounding_box.left + bounding_box.right) * 0.5 - center_node_y = (bounding_box.back + bounding_box.front) * 0.5 - - delta_x = center_grid_x - center_node_x - delta_y = center_grid_y - center_node_y - grouped_operation.addOperation(TranslateOperation(node, Vector(delta_x, 0, delta_y))) - - self.drawDebugSvg() - - return grouped_operation, 0 - - def getGridCornerPoints(self, bounding_box: "BoundingVolume") -> Tuple[float, float, float, float]: - coord_x1 = bounding_box.left - coord_x2 = bounding_box.right - coord_y1 = bounding_box.back - coord_y2 = bounding_box.front - grid_x1, grid_y1 = self.coordSpaceToGridSpace(coord_x1, coord_y1) - grid_x2, grid_y2 = self.coordSpaceToGridSpace(coord_x2, coord_y2) - return grid_x1, grid_y1, grid_x2, grid_y2 - - def intersectingGridIdxInclusive(self, bounding_box: "BoundingVolume") -> Set[Tuple[int, int]]: - grid_x1, grid_y1, grid_x2, grid_y2 = self.getGridCornerPoints(bounding_box) - grid_idx = set() - for grid_x in range(math.floor(grid_x1), math.ceil(grid_x2)): - for grid_y in range(math.floor(grid_y1), math.ceil(grid_y2)): - grid_idx.add((grid_x, grid_y)) - return grid_idx - - def intersectingGridIdxExclusive(self, bounding_box: "BoundingVolume") -> Set[Tuple[int, int]]: - grid_x1, grid_y1, grid_x2, grid_y2 = self.getGridCornerPoints(bounding_box) - grid_idx = set() - for grid_x in range(math.ceil(grid_x1), math.floor(grid_x2)): - for grid_y in range(math.ceil(grid_y1), math.floor(grid_y2)): - grid_idx.add((grid_x, grid_y)) - return grid_idx - - def gridSpaceToCoordSpace(self, x: float, y: float) -> Tuple[float, float]: - grid_x = x * (self._grid_width + self.offset_x) + self._build_volume_bounding_box.left - grid_y = y * (self._grid_height + self.offset_y) + self._build_volume_bounding_box.back - return grid_x, grid_y - - def coordSpaceToGridSpace(self, grid_x: float, grid_y: float) -> Tuple[float, float]: - coord_x = (grid_x - self._build_volume_bounding_box.left) / (self._grid_width + self.offset_x) - coord_y = (grid_y - self._build_volume_bounding_box.back) / (self._grid_height + self.offset_y) - return coord_x, coord_y - - def drawDebugSvg(self): - with open("Builvolume_test.svg", "w") as f: - build_volume_bounding_box = self._build_volume_bounding_box - - f.write( - f"\n") - - f.write( - f""" - - """) - - for grid_x in range(-10, 10): - for grid_y in range(-10, 10): - # if (grid_x, grid_y) in intersecting_grid_idx: - # fill_color = "red" - # elif (grid_x, grid_y) in build_plate_grid_idx: - # fill_color = "green" - # else: - # fill_color = "orange" - coord_grid_x, coord_grid_y = self.gridSpaceToCoordSpace(grid_x, grid_y) - f.write( - f""" - - """) - f.write(f""" - - {grid_x},{grid_y} - - """) - for node in self._fixed_nodes: - bounding_box = node.getBoundingBox() - f.write(f""" - - """) - for node in self._nodes_to_arrange: - bounding_box = node.getBoundingBox() - f.write(f""" - - """) - f.write(f"") diff --git a/cura/MultiplyObjectsJob.py b/cura/MultiplyObjectsJob.py index e1cead7557..ff4f362b4c 100644 --- a/cura/MultiplyObjectsJob.py +++ b/cura/MultiplyObjectsJob.py @@ -14,7 +14,6 @@ from UM.Operations.TranslateOperation import TranslateOperation from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.i18n import i18nCatalog -from cura.Arranging.GridArrange import GridArrange from cura.Arranging.Nest2DArrange import arrange, createGroupOperationForArrange i18n_catalog = i18nCatalog("cura") @@ -78,17 +77,12 @@ class MultiplyObjectsJob(Job): found_solution_for_all = True group_operation = GroupedOperation() if nodes: - grid_arrange = GridArrange(nodes,Application.getInstance().getBuildVolume(), - fixed_nodes) - - group_operation, not_fit_count = grid_arrange.arrange() - print("group_operation", group_operation) - # group_operation, not_fit_count = createGroupOperationForArrange(nodes, - # Application.getInstance().getBuildVolume(), - # fixed_nodes, - # factor=10000, - # add_new_nodes_in_scene=True, - # lock_rotation=self._lock_rotation) + group_operation, not_fit_count = createGroupOperationForArrange(nodes, + Application.getInstance().getBuildVolume(), + fixed_nodes, + factor=10000, + add_new_nodes_in_scene=True, + lock_rotation=self._lock_rotation) found_solution_for_all = not_fit_count == 0 if nodes_to_add_without_arrange: From b91ebcbb364b14d2aa6a8d894fcbc27a2bb06538 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Mon, 21 Aug 2023 18:51:08 +0200 Subject: [PATCH 077/126] multiplying objects place them in a grid Co-authored-by: Casper Lamboo CURA-7951 --- cura/Arranging/GridArrange.py | 185 ++++++++++++++++++++++++++++++++++ cura/MultiplyObjectsJob.py | 18 ++-- 2 files changed, 197 insertions(+), 6 deletions(-) create mode 100644 cura/Arranging/GridArrange.py diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py new file mode 100644 index 0000000000..543971c5b2 --- /dev/null +++ b/cura/Arranging/GridArrange.py @@ -0,0 +1,185 @@ +import math +from typing import List, TYPE_CHECKING, Optional, Tuple, Set + +from UM.Application import Application +from UM.Math import AxisAlignedBox +from UM.Math.Vector import Vector +from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation +from UM.Operations.GroupedOperation import GroupedOperation +from UM.Operations.TranslateOperation import TranslateOperation + + +class GridArrange: + offset_x: float = 10 + offset_y: float = 10 + + _grid_width: float + _grid_height: float + + _nodes_to_arrange: List["SceneNode"] + _fixed_nodes: List["SceneNode"] + _build_volume_bounding_box = AxisAlignedBox + + def __init__(self, nodes_to_arrange: List["SceneNode"], build_volume: "BuildVolume", fixed_nodes: List["SceneNode"] = []): + print("len(nodes_to_arrange)", len(nodes_to_arrange)) + self._nodes_to_arrange = nodes_to_arrange + self._build_volume_bounding_box = build_volume.getBoundingBox() + self._fixed_nodes = fixed_nodes + + def arrange(self) -> Tuple[GroupedOperation, int]: + self._grid_width = 0 + self._grid_height = 0 + for node in self._nodes_to_arrange: + bounding_box = node.getBoundingBox() + self._grid_width = max(self._grid_width, bounding_box.width) + self._grid_height = max(self._grid_height, bounding_box.depth) + + # Find grid indexes that intersect with fixed objects + fixed_nodes_grid_ids = set() + for node in self._fixed_nodes: + fixed_nodes_grid_ids = fixed_nodes_grid_ids.union(self.intersectingGridIdxInclusive(node.getBoundingBox())) + + build_plate_grid_ids = self.intersectingGridIdxExclusive(self._build_volume_bounding_box) + allowed_grid_idx = build_plate_grid_ids.difference(fixed_nodes_grid_ids) + + # Find the sequence in which items are placed + coord_build_plate_center_x = self._build_volume_bounding_box.width * 0.5 + self._build_volume_bounding_box.left + coord_build_plate_center_y = self._build_volume_bounding_box.depth * 0.5 + self._build_volume_bounding_box.back + grid_build_plate_center_x, grid_build_plate_center_y = self.coordSpaceToGridSpace(coord_build_plate_center_x, coord_build_plate_center_y) + + def distToCenter(grid_id: Tuple[int, int]) -> float: + grid_x, grid_y = grid_id + distance_squared = (grid_build_plate_center_x - grid_x) ** 2 + (grid_build_plate_center_y - grid_y) ** 2 + return distance_squared + + sequence: List[Tuple[int, int]] = list(allowed_grid_idx) + sequence.sort(key=distToCenter) + scene_root = Application.getInstance().getController().getScene().getRoot() + grouped_operation = GroupedOperation() + + for grid_id, node in zip(sequence, self._nodes_to_arrange): + grouped_operation.addOperation(AddSceneNodeOperation(node, scene_root)) + grid_x, grid_y = grid_id + + coord_grid_x, coord_grid_y = self.gridSpaceToCoordSpace(grid_x, grid_y) + center_grid_x = coord_grid_x+(0.5 * self._grid_width) + center_grid_y = coord_grid_y+(0.5 * self._grid_height) + + bounding_box = node.getBoundingBox() + center_node_x = (bounding_box.left + bounding_box.right) * 0.5 + center_node_y = (bounding_box.back + bounding_box.front) * 0.5 + + delta_x = center_grid_x - center_node_x + delta_y = center_grid_y - center_node_y + grouped_operation.addOperation(TranslateOperation(node, Vector(delta_x, 0, delta_y))) + + self.drawDebugSvg() + + return grouped_operation, 0 + + def getGridCornerPoints(self, bounding_box: "BoundingVolume") -> Tuple[float, float, float, float]: + coord_x1 = bounding_box.left + coord_x2 = bounding_box.right + coord_y1 = bounding_box.back + coord_y2 = bounding_box.front + grid_x1, grid_y1 = self.coordSpaceToGridSpace(coord_x1, coord_y1) + grid_x2, grid_y2 = self.coordSpaceToGridSpace(coord_x2, coord_y2) + return grid_x1, grid_y1, grid_x2, grid_y2 + + def intersectingGridIdxInclusive(self, bounding_box: "BoundingVolume") -> Set[Tuple[int, int]]: + grid_x1, grid_y1, grid_x2, grid_y2 = self.getGridCornerPoints(bounding_box) + grid_idx = set() + for grid_x in range(math.floor(grid_x1), math.ceil(grid_x2)): + for grid_y in range(math.floor(grid_y1), math.ceil(grid_y2)): + grid_idx.add((grid_x, grid_y)) + return grid_idx + + def intersectingGridIdxExclusive(self, bounding_box: "BoundingVolume") -> Set[Tuple[int, int]]: + grid_x1, grid_y1, grid_x2, grid_y2 = self.getGridCornerPoints(bounding_box) + grid_idx = set() + for grid_x in range(math.ceil(grid_x1), math.floor(grid_x2)): + for grid_y in range(math.ceil(grid_y1), math.floor(grid_y2)): + grid_idx.add((grid_x, grid_y)) + return grid_idx + + def gridSpaceToCoordSpace(self, x: float, y: float) -> Tuple[float, float]: + grid_x = x * (self._grid_width + self.offset_x) + self._build_volume_bounding_box.left + grid_y = y * (self._grid_height + self.offset_y) + self._build_volume_bounding_box.back + return grid_x, grid_y + + def coordSpaceToGridSpace(self, grid_x: float, grid_y: float) -> Tuple[float, float]: + coord_x = (grid_x - self._build_volume_bounding_box.left) / (self._grid_width + self.offset_x) + coord_y = (grid_y - self._build_volume_bounding_box.back) / (self._grid_height + self.offset_y) + return coord_x, coord_y + + def drawDebugSvg(self): + with open("Builvolume_test.svg", "w") as f: + build_volume_bounding_box = self._build_volume_bounding_box + + f.write( + f"\n") + + f.write( + f""" + + """) + + for grid_x in range(-10, 10): + for grid_y in range(-10, 10): + # if (grid_x, grid_y) in intersecting_grid_idx: + # fill_color = "red" + # elif (grid_x, grid_y) in build_plate_grid_idx: + # fill_color = "green" + # else: + # fill_color = "orange" + coord_grid_x, coord_grid_y = self.gridSpaceToCoordSpace(grid_x, grid_y) + f.write( + f""" + + """) + f.write(f""" + + {grid_x},{grid_y} + + """) + for node in self._fixed_nodes: + bounding_box = node.getBoundingBox() + f.write(f""" + + """) + for node in self._nodes_to_arrange: + bounding_box = node.getBoundingBox() + f.write(f""" + + """) + f.write(f"") diff --git a/cura/MultiplyObjectsJob.py b/cura/MultiplyObjectsJob.py index ff4f362b4c..e1cead7557 100644 --- a/cura/MultiplyObjectsJob.py +++ b/cura/MultiplyObjectsJob.py @@ -14,6 +14,7 @@ from UM.Operations.TranslateOperation import TranslateOperation from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.i18n import i18nCatalog +from cura.Arranging.GridArrange import GridArrange from cura.Arranging.Nest2DArrange import arrange, createGroupOperationForArrange i18n_catalog = i18nCatalog("cura") @@ -77,12 +78,17 @@ class MultiplyObjectsJob(Job): found_solution_for_all = True group_operation = GroupedOperation() if nodes: - group_operation, not_fit_count = createGroupOperationForArrange(nodes, - Application.getInstance().getBuildVolume(), - fixed_nodes, - factor=10000, - add_new_nodes_in_scene=True, - lock_rotation=self._lock_rotation) + grid_arrange = GridArrange(nodes,Application.getInstance().getBuildVolume(), + fixed_nodes) + + group_operation, not_fit_count = grid_arrange.arrange() + print("group_operation", group_operation) + # group_operation, not_fit_count = createGroupOperationForArrange(nodes, + # Application.getInstance().getBuildVolume(), + # fixed_nodes, + # factor=10000, + # add_new_nodes_in_scene=True, + # lock_rotation=self._lock_rotation) found_solution_for_all = not_fit_count == 0 if nodes_to_add_without_arrange: From ac8a958decf3c4539a91a7d71214d79226591823 Mon Sep 17 00:00:00 2001 From: rburema Date: Tue, 22 Aug 2023 08:15:02 +0000 Subject: [PATCH 078/126] Applied printer-linter format --- resources/definitions/fdmprinter.def.json | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 9a83817726..ccd92c9ba3 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1664,7 +1664,6 @@ "small_skin_width": { "label": "Small Top/Bottom Width", - "description": "Small top/bottom regions are filled with walls instead of the default top/bottom pattern. This helps to avoids jerky motions. Off for the topmost (air-exposed) layer by default (see 'Small Top/Bottom On Surface').", "value": "skin_line_width * 2", "default_value": 1, From b62725b4f0289ed672281d4b913d708f4de3234a Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 22 Aug 2023 10:30:51 +0200 Subject: [PATCH 079/126] copy_paste in a grid arrange all objects in grid place in grid Co-authored-by: Casper Lamboo CURA-7951 --- cura/Arranging/ArrangeObjectsJob.py | 15 +++++++++++---- cura/Arranging/GridArrange.py | 8 +++++++- cura/CuraActions.py | 12 ++++++------ cura/CuraApplication.py | 10 +++++----- cura/MultiplyObjectsJob.py | 24 +++++++++++------------- resources/qml/Actions.qml | 6 +++--- resources/qml/Menus/ContextMenu.qml | 8 ++++---- 7 files changed, 47 insertions(+), 36 deletions(-) diff --git a/cura/Arranging/ArrangeObjectsJob.py b/cura/Arranging/ArrangeObjectsJob.py index f938b44d1f..d122098565 100644 --- a/cura/Arranging/ArrangeObjectsJob.py +++ b/cura/Arranging/ArrangeObjectsJob.py @@ -8,6 +8,7 @@ from UM.Logger import Logger from UM.Message import Message from UM.Scene.SceneNode import SceneNode from UM.i18n import i18nCatalog +from cura.Arranging.GridArrange import GridArrange from cura.Arranging.Nest2DArrange import arrange i18n_catalog = i18nCatalog("cura") @@ -15,12 +16,12 @@ i18n_catalog = i18nCatalog("cura") class ArrangeObjectsJob(Job): def __init__(self, nodes: List[SceneNode], fixed_nodes: List[SceneNode], min_offset=8, - lock_rotation: bool = False) -> None: + grid_arrange: bool = False) -> None: super().__init__() self._nodes = nodes self._fixed_nodes = fixed_nodes self._min_offset = min_offset - self._lock_rotation = lock_rotation + self._grid_arrange = grid_arrange def run(self): found_solution_for_all = False @@ -32,8 +33,14 @@ class ArrangeObjectsJob(Job): status_message.show() try: - found_solution_for_all = arrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes, - lock_rotation=self._lock_rotation) + + if self._grid_arrange: + grid_arrange = GridArrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes) + found_solution_for_all = grid_arrange.arrange() + + else: + found_solution_for_all = arrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes) + except: # If the thread crashes, the message should still close Logger.logException("e", "Unable to arrange the objects on the buildplate. The arrange algorithm has crashed.") diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index 543971c5b2..0d76ecff52 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -26,7 +26,13 @@ class GridArrange: self._build_volume_bounding_box = build_volume.getBoundingBox() self._fixed_nodes = fixed_nodes - def arrange(self) -> Tuple[GroupedOperation, int]: + def arrange(self)-> bool: + + grouped_operation, not_fit_count = self.createGroupOperationForArrange() + grouped_operation.push() + return not_fit_count == 0 + + def createGroupOperationForArrange(self) -> Tuple[GroupedOperation, int]: self._grid_width = 0 self._grid_height = 0 for node in self._nodes_to_arrange: diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 3567c1532f..1b98bdddd8 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -18,6 +18,7 @@ from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.TranslateOperation import TranslateOperation import cura.CuraApplication +from cura.Arranging.GridArrange import GridArrange from cura.Operations.SetParentOperation import SetParentOperation from cura.MultiplyObjectsJob import MultiplyObjectsJob from cura.Settings.SetObjectExtruderOperation import SetObjectExtruderOperation @@ -84,16 +85,16 @@ class CuraActions(QObject): operation.push() @pyqtSlot(int, bool) - def multiplySelection(self, count: int, lock_rotation: bool) -> None: + def multiplySelection(self, count: int, grid_placement: bool) -> None: """Multiply all objects in the selection :param count: The number of times to multiply the selection. - :param lock_rotation: If set to true the orientation of the object will remain the same + :param grid_placement: If set to true objects are placed in a grid """ min_offset = cura.CuraApplication.CuraApplication.getInstance().getBuildVolume().getEdgeDisallowedSize() + 2 # Allow for some rounding errors job = MultiplyObjectsJob(Selection.getAllSelectedObjects(), count, min_offset=max(min_offset, 8), - lock_rotation=lock_rotation) + grid_arrange=grid_placement) job.start() @pyqtSlot() @@ -231,9 +232,8 @@ class CuraActions(QObject): if node.callDecoration("isSliceable"): fixed_nodes.append(node) # Add the new nodes to the scene, and arrange them - group_operation, not_fit_count = createGroupOperationForArrange(nodes, application.getBuildVolume(), - fixed_nodes, factor=10000, - add_new_nodes_in_scene=True) + grid_arrange = GridArrange(nodes, application.getBuildVolume(), fixed_nodes) + group_operation, not_fit_count = grid_arrange.createGroupOperationForArrange() group_operation.push() # deselect currently selected nodes, and select the new nodes diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 82d009e436..c6c0ed3cd2 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1441,7 +1441,7 @@ class CuraApplication(QtApplication): # Single build plate @pyqtSlot(bool) - def arrangeAll(self, lock_rotation: bool) -> None: + def arrangeAll(self, grid_arrangement: bool) -> None: nodes_to_arrange = [] active_build_plate = self.getMultiBuildPlateModel().activeBuildPlate locked_nodes = [] @@ -1471,18 +1471,18 @@ class CuraApplication(QtApplication): locked_nodes.append(node) else: nodes_to_arrange.append(node) - self.arrange(nodes_to_arrange, locked_nodes, lock_rotation) + self.arrange(nodes_to_arrange, locked_nodes, grid_arrangement) - def arrange(self, nodes: List[SceneNode], fixed_nodes: List[SceneNode], lock_rotation: bool = False) -> None: + def arrange(self, nodes: List[SceneNode], fixed_nodes: List[SceneNode], grid_arrangement: bool = False) -> None: """Arrange a set of nodes given a set of fixed nodes :param nodes: nodes that we have to place :param fixed_nodes: nodes that are placed in the arranger before finding spots for nodes - :param lock_rotation: If set to true the orientation of the object will remain the same + :param grid_arrangement: If set to true if objects are to be placed in a grid """ min_offset = self.getBuildVolume().getEdgeDisallowedSize() + 2 # Allow for some rounding errors - job = ArrangeObjectsJob(nodes, fixed_nodes, min_offset=max(min_offset, 8), lock_rotation=lock_rotation) + job = ArrangeObjectsJob(nodes, fixed_nodes, min_offset=max(min_offset, 8), grid_arrange =grid_arrangement) job.start() @pyqtSlot() diff --git a/cura/MultiplyObjectsJob.py b/cura/MultiplyObjectsJob.py index e1cead7557..6df80eb01c 100644 --- a/cura/MultiplyObjectsJob.py +++ b/cura/MultiplyObjectsJob.py @@ -21,12 +21,12 @@ i18n_catalog = i18nCatalog("cura") class MultiplyObjectsJob(Job): - def __init__(self, objects, count: int, min_offset: int = 8, lock_rotation: bool = False): + def __init__(self, objects, count: int, min_offset: int = 8, grid_arrange: bool = False): super().__init__() self._objects = objects self._count: int = count self._min_offset: int = min_offset - self._lock_rotation: bool = lock_rotation + self._grid_arrange: bool = grid_arrange def run(self) -> None: status_message = Message(i18n_catalog.i18nc("@info:status", "Multiplying and placing objects"), lifetime = 0, @@ -78,18 +78,16 @@ class MultiplyObjectsJob(Job): found_solution_for_all = True group_operation = GroupedOperation() if nodes: - grid_arrange = GridArrange(nodes,Application.getInstance().getBuildVolume(), - fixed_nodes) + if(self._grid_arrange): + grid_arrange = GridArrange(nodes,Application.getInstance().getBuildVolume(),fixed_nodes) + group_operation, not_fit_count = grid_arrange.createGroupOperationForArrange() - group_operation, not_fit_count = grid_arrange.arrange() - print("group_operation", group_operation) - # group_operation, not_fit_count = createGroupOperationForArrange(nodes, - # Application.getInstance().getBuildVolume(), - # fixed_nodes, - # factor=10000, - # add_new_nodes_in_scene=True, - # lock_rotation=self._lock_rotation) - found_solution_for_all = not_fit_count == 0 + else: + group_operation, not_fit_count = createGroupOperationForArrange(nodes, + Application.getInstance().getBuildVolume(), + fixed_nodes, + factor=10000, + add_new_nodes_in_scene=True) if nodes_to_add_without_arrange: for nested_node in nodes_to_add_without_arrange: diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index e47f797195..1c84ec66b7 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -41,7 +41,7 @@ Item property alias deleteAll: deleteAllAction property alias reloadAll: reloadAllAction property alias arrangeAll: arrangeAllAction - property alias arrangeAllLock: arrangeAllLockAction + property alias arrangeAllGrid: arrangeAllGridAction property alias arrangeSelection: arrangeSelectionAction property alias arrangeSelectionLock: arrangeSelectionLockAction property alias resetAllTranslation: resetAllTranslationAction @@ -464,8 +464,8 @@ Item Action { - id: arrangeAllLockAction - text: catalog.i18nc("@action:inmenu menubar:edit","Arrange All Models Without Rotation") + id: arrangeAllGridAction + text: catalog.i18nc("@action:inmenu menubar:edit","Arrange All Models in a grid") onTriggered: Printer.arrangeAll(true) shortcut: "Shift+Ctrl+R" } diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index f07b4d9571..75d366e5db 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -66,7 +66,7 @@ Cura.Menu Cura.MenuSeparator {} Cura.MenuItem { action: Cura.Actions.selectAll } Cura.MenuItem { action: Cura.Actions.arrangeAll } - Cura.MenuItem { action: Cura.Actions.arrangeAllLock } + Cura.MenuItem { action: Cura.Actions.arrangeAllGrid } Cura.MenuItem { action: Cura.Actions.deleteAll } Cura.MenuItem { action: Cura.Actions.reloadAll } Cura.MenuItem { action: Cura.Actions.resetAllTranslation } @@ -110,7 +110,7 @@ Cura.Menu minimumWidth: UM.Theme.getSize("small_popup_dialog").width minimumHeight: UM.Theme.getSize("small_popup_dialog").height - onAccepted: CuraActions.multiplySelection(copiesField.value, lockRotationField.checked) + onAccepted: CuraActions.multiplySelection(copiesField.value, gridPlacementSelected.checked) buttonSpacing: UM.Theme.getSize("thin_margin").width @@ -158,8 +158,8 @@ Cura.Menu UM.CheckBox { - id: lockRotationField - text: catalog.i18nc("@label", "Lock Rotation") + id: gridPlacementSelected + text: catalog.i18nc("@label", "Grid Placement") } } } From 2089462cd8121fe0e220e38c9909a13f688d8b9b Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 22 Aug 2023 11:16:02 +0200 Subject: [PATCH 080/126] place objects outside grid Co-authored-by: Casper Lamboo CURA-7951 --- cura/Arranging/GridArrange.py | 60 +++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 17 deletions(-) diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index 0d76ecff52..212f7b8e51 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -26,13 +26,6 @@ class GridArrange: self._build_volume_bounding_box = build_volume.getBoundingBox() self._fixed_nodes = fixed_nodes - def arrange(self)-> bool: - - grouped_operation, not_fit_count = self.createGroupOperationForArrange() - grouped_operation.push() - return not_fit_count == 0 - - def createGroupOperationForArrange(self) -> Tuple[GroupedOperation, int]: self._grid_width = 0 self._grid_height = 0 for node in self._nodes_to_arrange: @@ -40,6 +33,19 @@ class GridArrange: self._grid_width = max(self._grid_width, bounding_box.width) self._grid_height = max(self._grid_height, bounding_box.depth) + coord_initial_leftover_x = self._build_volume_bounding_box.right + 2 * self._grid_width + coord_initial_leftover_y = (self._build_volume_bounding_box.back + self._build_volume_bounding_box.front) * 0.5 + self._initial_leftover_grid_x, self._initial_leftover_grid_y = self.coordSpaceToGridSpace(coord_initial_leftover_x, coord_initial_leftover_y) + self._initial_leftover_grid_x = math.floor(self._initial_leftover_grid_x) + self._initial_leftover_grid_y = math.floor(self._initial_leftover_grid_y) + + def arrange(self)-> bool: + + grouped_operation, not_fit_count = self.createGroupOperationForArrange() + grouped_operation.push() + return not_fit_count == 0 + + def createGroupOperationForArrange(self) -> Tuple[GroupedOperation, int]: # Find grid indexes that intersect with fixed objects fixed_nodes_grid_ids = set() for node in self._fixed_nodes: @@ -67,21 +73,41 @@ class GridArrange: grouped_operation.addOperation(AddSceneNodeOperation(node, scene_root)) grid_x, grid_y = grid_id - coord_grid_x, coord_grid_y = self.gridSpaceToCoordSpace(grid_x, grid_y) - center_grid_x = coord_grid_x+(0.5 * self._grid_width) - center_grid_y = coord_grid_y+(0.5 * self._grid_height) + operation = self.moveNodeOnGrid(node, grid_x, grid_y) + grouped_operation.addOperation(operation) - bounding_box = node.getBoundingBox() - center_node_x = (bounding_box.left + bounding_box.right) * 0.5 - center_node_y = (bounding_box.back + bounding_box.front) * 0.5 + leftover_nodes = self._nodes_to_arrange[len(sequence):] - delta_x = center_grid_x - center_node_x - delta_y = center_grid_y - center_node_y - grouped_operation.addOperation(TranslateOperation(node, Vector(delta_x, 0, delta_y))) + left_over_grid_y = self._initial_leftover_grid_y + for node in leftover_nodes: + grouped_operation.addOperation(AddSceneNodeOperation(node, scene_root)) + + # find the first next grid position that isn't occupied by a fixed node + while (self._initial_leftover_grid_x, left_over_grid_y) in fixed_nodes_grid_ids: + left_over_grid_y = left_over_grid_y - 1 + + operation = self.moveNodeOnGrid(node, self._initial_leftover_grid_x, left_over_grid_y) + grouped_operation.addOperation(operation) + + left_over_grid_y = left_over_grid_y - 1 self.drawDebugSvg() - return grouped_operation, 0 + return grouped_operation, len(leftover_nodes) + + def moveNodeOnGrid(self, node: "SceneNode", grid_x: int, grid_y: int) -> "Operation.Operation": + coord_grid_x, coord_grid_y = self.gridSpaceToCoordSpace(grid_x, grid_y) + center_grid_x = coord_grid_x + (0.5 * self._grid_width) + center_grid_y = coord_grid_y + (0.5 * self._grid_height) + + bounding_box = node.getBoundingBox() + center_node_x = (bounding_box.left + bounding_box.right) * 0.5 + center_node_y = (bounding_box.back + bounding_box.front) * 0.5 + + delta_x = center_grid_x - center_node_x + delta_y = center_grid_y - center_node_y + + return TranslateOperation(node, Vector(delta_x, 0, delta_y)) def getGridCornerPoints(self, bounding_box: "BoundingVolume") -> Tuple[float, float, float, float]: coord_x1 = bounding_box.left From 7449e2137c979b49ccf9a4f423344ed887070bb9 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 22 Aug 2023 11:26:43 +0200 Subject: [PATCH 081/126] objects placed with an offset to the grid Co-authored-by: Casper Lamboo CURA-7951 --- cura/Arranging/GridArrange.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index 212f7b8e51..fbfaa7f40e 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -97,8 +97,8 @@ class GridArrange: def moveNodeOnGrid(self, node: "SceneNode", grid_x: int, grid_y: int) -> "Operation.Operation": coord_grid_x, coord_grid_y = self.gridSpaceToCoordSpace(grid_x, grid_y) - center_grid_x = coord_grid_x + (0.5 * self._grid_width) - center_grid_y = coord_grid_y + (0.5 * self._grid_height) + center_grid_x = coord_grid_x + (0.5 * (self._grid_width + self.offset_x)) + center_grid_y = coord_grid_y + (0.5 * (self._grid_height + self.offset_y)) bounding_box = node.getBoundingBox() center_node_x = (bounding_box.left + bounding_box.right) * 0.5 From b662da732eeb5c310db4ab07e748624e12441c1d Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 22 Aug 2023 11:51:30 +0200 Subject: [PATCH 082/126] review comments fixed Co-authored-by: Casper Lamboo CURA-7951 --- cura/Arranging/GridArrange.py | 6 ------ cura/CuraActions.py | 15 +++++++++++---- cura/CuraApplication.py | 11 +++++++++-- resources/qml/Actions.qml | 4 ++-- resources/qml/Menus/ContextMenu.qml | 11 ++++++++++- 5 files changed, 32 insertions(+), 15 deletions(-) diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index fbfaa7f40e..6d4db360f7 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -21,7 +21,6 @@ class GridArrange: _build_volume_bounding_box = AxisAlignedBox def __init__(self, nodes_to_arrange: List["SceneNode"], build_volume: "BuildVolume", fixed_nodes: List["SceneNode"] = []): - print("len(nodes_to_arrange)", len(nodes_to_arrange)) self._nodes_to_arrange = nodes_to_arrange self._build_volume_bounding_box = build_volume.getBoundingBox() self._fixed_nodes = fixed_nodes @@ -72,7 +71,6 @@ class GridArrange: for grid_id, node in zip(sequence, self._nodes_to_arrange): grouped_operation.addOperation(AddSceneNodeOperation(node, scene_root)) grid_x, grid_y = grid_id - operation = self.moveNodeOnGrid(node, grid_x, grid_y) grouped_operation.addOperation(operation) @@ -81,18 +79,14 @@ class GridArrange: left_over_grid_y = self._initial_leftover_grid_y for node in leftover_nodes: grouped_operation.addOperation(AddSceneNodeOperation(node, scene_root)) - # find the first next grid position that isn't occupied by a fixed node while (self._initial_leftover_grid_x, left_over_grid_y) in fixed_nodes_grid_ids: left_over_grid_y = left_over_grid_y - 1 operation = self.moveNodeOnGrid(node, self._initial_leftover_grid_x, left_over_grid_y) grouped_operation.addOperation(operation) - left_over_grid_y = left_over_grid_y - 1 - self.drawDebugSvg() - return grouped_operation, len(leftover_nodes) def moveNodeOnGrid(self, node: "SceneNode", grid_x: int, grid_y: int) -> "Operation.Operation": diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 1b98bdddd8..bd5787de42 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -83,18 +83,25 @@ class CuraActions(QObject): center_operation = TranslateOperation(current_node, Vector(0, center_y, 0), set_position=True) operation.addOperation(center_operation) operation.push() + @pyqtSlot(int) + def multiplySelection(self, count: int) -> None: + """Multiply all objects in the selection + :param count: The number of times to multiply the selection. + """ + min_offset = cura.CuraApplication.CuraApplication.getInstance().getBuildVolume().getEdgeDisallowedSize() + 2 # Allow for some rounding errors + job = MultiplyObjectsJob(Selection.getAllSelectedObjects(), count, min_offset = max(min_offset, 8)) + job.start() - @pyqtSlot(int, bool) - def multiplySelection(self, count: int, grid_placement: bool) -> None: + @pyqtSlot(int) + def multiplySelectionToGrid(self, count: int) -> None: """Multiply all objects in the selection :param count: The number of times to multiply the selection. - :param grid_placement: If set to true objects are placed in a grid """ min_offset = cura.CuraApplication.CuraApplication.getInstance().getBuildVolume().getEdgeDisallowedSize() + 2 # Allow for some rounding errors job = MultiplyObjectsJob(Selection.getAllSelectedObjects(), count, min_offset=max(min_offset, 8), - grid_arrange=grid_placement) + grid_arrange=True) job.start() @pyqtSlot() diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index c6c0ed3cd2..a9517c966c 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1440,8 +1440,15 @@ class CuraApplication(QtApplication): op.push() # Single build plate - @pyqtSlot(bool) - def arrangeAll(self, grid_arrangement: bool) -> None: + @pyqtSlot() + def arrangeAll(self) -> None: + self._arrangeAll(False) + + @pyqtSlot() + def arrangeAllInGrid(self) -> None: + self._arrangeAll(True) + + def _arrangeAll(self, grid_arrangement: bool) -> None: nodes_to_arrange = [] active_build_plate = self.getMultiBuildPlateModel().activeBuildPlate locked_nodes = [] diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 1c84ec66b7..0701ba48ce 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -458,7 +458,7 @@ Item { id: arrangeAllAction text: catalog.i18nc("@action:inmenu menubar:edit","Arrange All Models") - onTriggered: Printer.arrangeAll(false) + onTriggered: Printer.arrangeAll() shortcut: "Ctrl+R" } @@ -466,7 +466,7 @@ Item { id: arrangeAllGridAction text: catalog.i18nc("@action:inmenu menubar:edit","Arrange All Models in a grid") - onTriggered: Printer.arrangeAll(true) + onTriggered: Printer.arrangeAllInGrid() shortcut: "Shift+Ctrl+R" } diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index 75d366e5db..a095fb6e1a 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -110,7 +110,16 @@ Cura.Menu minimumWidth: UM.Theme.getSize("small_popup_dialog").width minimumHeight: UM.Theme.getSize("small_popup_dialog").height - onAccepted: CuraActions.multiplySelection(copiesField.value, gridPlacementSelected.checked) + onAccepted: { + if (gridPlacementSelected.checked) + { + CuraActions.multiplySelectionToGrid(copiesField.value) + } + else + { + CuraActions.multiplySelection(copiesField.value) + } + } buttonSpacing: UM.Theme.getSize("thin_margin").width From 5dc417cf0aab9ebae5116606474262c3f502109d Mon Sep 17 00:00:00 2001 From: saumyaj3 Date: Tue, 22 Aug 2023 11:59:03 +0000 Subject: [PATCH 083/126] Applied printer-linter format --- resources/definitions/kingroon_kp3s_pro.def.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/resources/definitions/kingroon_kp3s_pro.def.json b/resources/definitions/kingroon_kp3s_pro.def.json index e06ce0b891..bda5ac03b2 100644 --- a/resources/definitions/kingroon_kp3s_pro.def.json +++ b/resources/definitions/kingroon_kp3s_pro.def.json @@ -5,16 +5,15 @@ "metadata": { "visible": true, + "author": "willuhmjs", "platform": "kingroon_kp3s.stl", - "quality_definition": "kingroon_base", - "author": "willuhmjs" + "quality_definition": "kingroon_base" }, "overrides": { "machine_acceleration": { "value": 1000 }, - "machine_height": { "default_value": 200 }, - "machine_width": { "default_value": 200 }, "machine_depth": { "default_value": 200 }, + "machine_height": { "default_value": 200 }, "machine_max_acceleration_e": { "value": 1000 }, "machine_max_acceleration_x": { "value": 1000 }, "machine_max_acceleration_y": { "value": 1000 }, @@ -30,9 +29,10 @@ "machine_steps_per_mm_x": { "value": 160 }, "machine_steps_per_mm_y": { "value": 160 }, "machine_steps_per_mm_z": { "value": 800 }, + "machine_width": { "default_value": 200 }, "retraction_amount": { "value": 1 }, "retraction_extrusion_window": { "value": 1 }, "retraction_speed": { "value": 40 }, "speed_z_hop": { "value": 4 } } -} +} \ No newline at end of file From 4096fc864b524db6d3da45526abfc08e6c9604d2 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 22 Aug 2023 15:06:17 +0200 Subject: [PATCH 084/126] grid placement available for elliptical buildplates Co-authored-by: Casper Lamboo CURA-7951 --- cura/Arranging/ArrangeObjectsJob.py | 2 +- cura/Arranging/GridArrange.py | 90 +++++++++++++++++++++++------ cura/BuildVolume.py | 3 + cura/CuraActions.py | 2 +- resources/qml/Actions.qml | 16 ----- 5 files changed, 78 insertions(+), 35 deletions(-) diff --git a/cura/Arranging/ArrangeObjectsJob.py b/cura/Arranging/ArrangeObjectsJob.py index d122098565..4bb55bf660 100644 --- a/cura/Arranging/ArrangeObjectsJob.py +++ b/cura/Arranging/ArrangeObjectsJob.py @@ -15,7 +15,7 @@ i18n_catalog = i18nCatalog("cura") class ArrangeObjectsJob(Job): - def __init__(self, nodes: List[SceneNode], fixed_nodes: List[SceneNode], min_offset=8, + def __init__(self, nodes: List[SceneNode], fixed_nodes: List[SceneNode], min_offset = 8, grid_arrange: bool = False) -> None: super().__init__() self._nodes = nodes diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index 6d4db360f7..5280843bd3 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -18,10 +18,12 @@ class GridArrange: _nodes_to_arrange: List["SceneNode"] _fixed_nodes: List["SceneNode"] - _build_volume_bounding_box = AxisAlignedBox + _build_volume: "BuildVolume" + _build_volume_bounding_box: AxisAlignedBox def __init__(self, nodes_to_arrange: List["SceneNode"], build_volume: "BuildVolume", fixed_nodes: List["SceneNode"] = []): self._nodes_to_arrange = nodes_to_arrange + self._build_volume = build_volume self._build_volume_bounding_box = build_volume.getBoundingBox() self._fixed_nodes = fixed_nodes @@ -39,7 +41,6 @@ class GridArrange: self._initial_leftover_grid_y = math.floor(self._initial_leftover_grid_y) def arrange(self)-> bool: - grouped_operation, not_fit_count = self.createGroupOperationForArrange() grouped_operation.push() return not_fit_count == 0 @@ -51,6 +52,11 @@ class GridArrange: fixed_nodes_grid_ids = fixed_nodes_grid_ids.union(self.intersectingGridIdxInclusive(node.getBoundingBox())) build_plate_grid_ids = self.intersectingGridIdxExclusive(self._build_volume_bounding_box) + + # Filter out the corner grid squares if the build plate shape is elliptic + if self._build_volume.getShape() == "elliptic": + build_plate_grid_ids = set(filter(lambda grid_id: self.checkGridUnderDiscSpace(grid_id[0], grid_id[1]), build_plate_grid_ids)) + allowed_grid_idx = build_plate_grid_ids.difference(fixed_nodes_grid_ids) # Find the sequence in which items are placed @@ -86,7 +92,6 @@ class GridArrange: operation = self.moveNodeOnGrid(node, self._initial_leftover_grid_x, left_over_grid_y) grouped_operation.addOperation(operation) left_over_grid_y = left_over_grid_y - 1 - return grouped_operation, len(leftover_nodes) def moveNodeOnGrid(self, node: "SceneNode", grid_x: int, grid_y: int) -> "Operation.Operation": @@ -138,6 +143,35 @@ class GridArrange: coord_y = (grid_y - self._build_volume_bounding_box.back) / (self._grid_height + self.offset_y) return coord_x, coord_y + def checkGridUnderDiscSpace(self, grid_x: int, grid_y: int) -> bool: + left, back = self.gridSpaceToCoordSpace(grid_x, grid_y) + right, front = self.gridSpaceToCoordSpace(grid_x + 1, grid_y + 1) + corners = [(left, back), (right, back), (right, front), (left, front)] + return all([self.checkPointUnderDiscSpace(x, y) for x, y in corners]) + + def checkPointUnderDiscSpace(self, x: float, y: float) -> bool: + disc_x, disc_y = self.coordSpaceToDiscSpace(x, y) + distance_to_center_squared = disc_x ** 2 + disc_y ** 2 + return distance_to_center_squared <= 1.0 + + def coordSpaceToDiscSpace(self, x: float, y: float) -> Tuple[float, float]: + # Transform coordinate system to + # + # coord_build_plate_left = -1 + # | coord_build_plate_right = 1 + # v (0,1) v + # ┌───────┬───────┐ < coord_build_plate_back = -1 + # │ │ │ + # │ │(0,0) │ + # (-1,0)│───────o───────┤(1,0) + # │ │ │ + # │ │ │ + # └───────┴───────┘ < coord_build_plate_front = +1 + # (0,-1) + disc_x = ((x - self._build_volume_bounding_box.left) / self._build_volume_bounding_box.width) * 2.0 - 1.0 + disc_y = ((y - self._build_volume_bounding_box.back) / self._build_volume_bounding_box.depth) * 2.0 - 1.0 + return disc_x, disc_y + def drawDebugSvg(self): with open("Builvolume_test.svg", "w") as f: build_volume_bounding_box = self._build_volume_bounding_box @@ -145,25 +179,39 @@ class GridArrange: f.write( f"\n") - f.write( - f""" - - """) + ellipse = True + if ellipse: + f.write( + f""" + + """) + else: + f.write( + f""" + + """) - for grid_x in range(-10, 10): - for grid_y in range(-10, 10): + for grid_x in range(0, 100): + for grid_y in range(0, 100): # if (grid_x, grid_y) in intersecting_grid_idx: # fill_color = "red" # elif (grid_x, grid_y) in build_plate_grid_idx: # fill_color = "green" # else: # fill_color = "orange" + coord_grid_x, coord_grid_y = self.gridSpaceToCoordSpace(grid_x, grid_y) f.write( f""" @@ -172,12 +220,13 @@ class GridArrange: y="{coord_grid_y}" width="{self._grid_width}" height="{self._grid_height}" - fill="green" + fill="#ff00ff88" stroke="black" /> """) f.write(f""" @@ -208,4 +257,11 @@ class GridArrange: stroke-width="3" /> """) - f.write(f"") + + for x in range(math.floor(self._build_volume_bounding_box.left), math.floor(self._build_volume_bounding_box.right), 50): + for y in range(math.floor(self._build_volume_bounding_box.back), math.floor(self._build_volume_bounding_box.front), 50): + color = "green" if self.checkPointUnderDiscSpace(x, y) else "red" + f.write(f""" + + """) + f.write(f"") \ No newline at end of file diff --git a/cura/BuildVolume.py b/cura/BuildVolume.py index 0d6ecf5810..045156dcce 100755 --- a/cura/BuildVolume.py +++ b/cura/BuildVolume.py @@ -203,6 +203,9 @@ class BuildVolume(SceneNode): if shape: self._shape = shape + def getShape(self) -> str: + return self._shape + def getDiagonalSize(self) -> float: """Get the length of the 3D diagonal through the build volume. diff --git a/cura/CuraActions.py b/cura/CuraActions.py index bd5787de42..6e6e93e3ad 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -80,7 +80,7 @@ class CuraActions(QObject): center_y = 0 # Move the object so that it's bottom is on to of the buildplate - center_operation = TranslateOperation(current_node, Vector(0, center_y, 0), set_position=True) + center_operation = TranslateOperation(current_node, Vector(0, center_y, 0), set_position = True) operation.addOperation(center_operation) operation.push() @pyqtSlot(int) diff --git a/resources/qml/Actions.qml b/resources/qml/Actions.qml index 0701ba48ce..65888b3493 100644 --- a/resources/qml/Actions.qml +++ b/resources/qml/Actions.qml @@ -42,8 +42,6 @@ Item property alias reloadAll: reloadAllAction property alias arrangeAll: arrangeAllAction property alias arrangeAllGrid: arrangeAllGridAction - property alias arrangeSelection: arrangeSelectionAction - property alias arrangeSelectionLock: arrangeSelectionLockAction property alias resetAllTranslation: resetAllTranslationAction property alias resetAll: resetAllAction @@ -470,20 +468,6 @@ Item shortcut: "Shift+Ctrl+R" } - Action - { - id: arrangeSelectionAction - text: catalog.i18nc("@action:inmenu menubar:edit","Arrange Selection") - onTriggered: Printer.arrangeSelection(false) - } - - Action - { - id: arrangeSelectionLockAction - text: catalog.i18nc("@action:inmenu menubar:edit","Arrange Selection Without Rotation") - onTriggered: Printer.arrangeSelection(true) - } - Action { id: resetAllTranslationAction From 1f6c096bf719b508b6e0234ad33ac687771aa7f8 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Tue, 22 Aug 2023 16:42:34 +0200 Subject: [PATCH 085/126] Don't omit printers in printer list Since the message is now scrollable we can do this :) --- .../src/Messages/NewPrinterDetectedMessage.py | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/plugins/UM3NetworkPrinting/src/Messages/NewPrinterDetectedMessage.py b/plugins/UM3NetworkPrinting/src/Messages/NewPrinterDetectedMessage.py index d85ade9dce..76254547da 100644 --- a/plugins/UM3NetworkPrinting/src/Messages/NewPrinterDetectedMessage.py +++ b/plugins/UM3NetworkPrinting/src/Messages/NewPrinterDetectedMessage.py @@ -37,24 +37,13 @@ class NewPrinterDetectedMessage(Message): def finalize(self, new_devices_added, new_output_devices): self.setProgress(None) - num_devices_added = len(new_devices_added) - max_disp_devices = 3 - - if num_devices_added > max_disp_devices: - num_hidden = num_devices_added - max_disp_devices - device_name_list = ["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in - new_output_devices[0: max_disp_devices]] - device_name_list.append( - "
  • " + self.i18n_catalog.i18ncp("info:{0} gets replaced by a number of printers", "... and {0} other", - "... and {0} others", num_hidden) + "
  • ") - device_names = "".join(device_name_list) - else: - device_names = "".join( - ["
  • {} ({})
  • ".format(device.name, device.printerTypeName) for device in new_devices_added]) if new_devices_added: - message_text = self.i18n_catalog.i18nc("info:status", - "Printers added from Digital Factory:") + f"
      {device_names}
    " + device_names = "" + for device in new_devices_added: + device_names = device_names + "
  • {} ({})
  • ".format(device.name, device.printerTypeName) + message_title = self.i18n_catalog.i18nc("info:status", "Printers added from Digital Factory:") + message_text = f"{message_title}
      {device_names}
    " self.setText(message_text) else: self.hide() From 9000730ce72ebd395ca662e37513584acb45678c Mon Sep 17 00:00:00 2001 From: Casper Lamboo Date: Wed, 23 Aug 2023 11:39:54 +0200 Subject: [PATCH 086/126] use template strings --- packaging/MacOS/build_macos.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packaging/MacOS/build_macos.py b/packaging/MacOS/build_macos.py index bde28afab0..eae9afceff 100644 --- a/packaging/MacOS/build_macos.py +++ b/packaging/MacOS/build_macos.py @@ -153,6 +153,6 @@ if __name__ == "__main__": app_name = f"{args.app_name}.app" if args.build_pkg: - create_pkg_installer(args.filename + ".pkg", args.dist_path, cura_version, app_name) + create_pkg_installer(f"{args.filename}.pkg", args.dist_path, cura_version, app_name) if args.build_dmg: - create_dmg(args.filename + ".dmg", args.dist_path, args.source_path, app_name) + create_dmg(f"{args.filename}.dmg", args.dist_path, args.source_path, app_name) From 118f49a0520bdd1a3983bbf33b49c3ed8a645fb1 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Wed, 23 Aug 2023 15:39:23 +0200 Subject: [PATCH 087/126] review comments fixed Co-authored-by: Casper Lamboo CURA-7951 --- cura/Arranging/ArrangeObjectsJob.py | 10 ++---- cura/Arranging/GridArrange.py | 39 +++++++++----------- cura/Arranging/Nest2DArrange.py | 56 ++++++++++++++++------------- cura/CuraActions.py | 4 +-- cura/CuraApplication.py | 13 ++++--- cura/MultiplyObjectsJob.py | 21 +++++------ resources/qml/Menus/ContextMenu.qml | 23 ++++++------ 7 files changed, 76 insertions(+), 90 deletions(-) diff --git a/cura/Arranging/ArrangeObjectsJob.py b/cura/Arranging/ArrangeObjectsJob.py index 4bb55bf660..0f8c576995 100644 --- a/cura/Arranging/ArrangeObjectsJob.py +++ b/cura/Arranging/ArrangeObjectsJob.py @@ -16,7 +16,7 @@ i18n_catalog = i18nCatalog("cura") class ArrangeObjectsJob(Job): def __init__(self, nodes: List[SceneNode], fixed_nodes: List[SceneNode], min_offset = 8, - grid_arrange: bool = False) -> None: + *, grid_arrange: bool = False) -> None: super().__init__() self._nodes = nodes self._fixed_nodes = fixed_nodes @@ -33,13 +33,7 @@ class ArrangeObjectsJob(Job): status_message.show() try: - - if self._grid_arrange: - grid_arrange = GridArrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes) - found_solution_for_all = grid_arrange.arrange() - - else: - found_solution_for_all = arrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes) + found_solution_for_all = arrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes, grid_arrange= self._grid_arrange) except: # If the thread crashes, the message should still close Logger.logException("e", "Unable to arrange the objects on the buildplate. The arrange algorithm has crashed.") diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index 5280843bd3..d8b7ba9db8 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -1,6 +1,11 @@ import math from typing import List, TYPE_CHECKING, Optional, Tuple, Set + + +if TYPE_CHECKING: + from UM.Scene.SceneNode import SceneNode + from UM.Application import Application from UM.Math import AxisAlignedBox from UM.Math.Vector import Vector @@ -10,23 +15,16 @@ from UM.Operations.TranslateOperation import TranslateOperation class GridArrange: - offset_x: float = 10 - offset_y: float = 10 - - _grid_width: float - _grid_height: float - - _nodes_to_arrange: List["SceneNode"] - _fixed_nodes: List["SceneNode"] - _build_volume: "BuildVolume" - _build_volume_bounding_box: AxisAlignedBox - - def __init__(self, nodes_to_arrange: List["SceneNode"], build_volume: "BuildVolume", fixed_nodes: List["SceneNode"] = []): + def __init__(self, nodes_to_arrange: List["SceneNode"], build_volume: "BuildVolume", fixed_nodes: List["SceneNode"] = None): + if fixed_nodes is None: + fixed_nodes = [] self._nodes_to_arrange = nodes_to_arrange self._build_volume = build_volume self._build_volume_bounding_box = build_volume.getBoundingBox() self._fixed_nodes = fixed_nodes + self._offset_x: float = 10 + self._offset_y: float = 10 self._grid_width = 0 self._grid_height = 0 for node in self._nodes_to_arrange: @@ -40,11 +38,6 @@ class GridArrange: self._initial_leftover_grid_x = math.floor(self._initial_leftover_grid_x) self._initial_leftover_grid_y = math.floor(self._initial_leftover_grid_y) - def arrange(self)-> bool: - grouped_operation, not_fit_count = self.createGroupOperationForArrange() - grouped_operation.push() - return not_fit_count == 0 - def createGroupOperationForArrange(self) -> Tuple[GroupedOperation, int]: # Find grid indexes that intersect with fixed objects fixed_nodes_grid_ids = set() @@ -96,8 +89,8 @@ class GridArrange: def moveNodeOnGrid(self, node: "SceneNode", grid_x: int, grid_y: int) -> "Operation.Operation": coord_grid_x, coord_grid_y = self.gridSpaceToCoordSpace(grid_x, grid_y) - center_grid_x = coord_grid_x + (0.5 * (self._grid_width + self.offset_x)) - center_grid_y = coord_grid_y + (0.5 * (self._grid_height + self.offset_y)) + center_grid_x = coord_grid_x + (0.5 * (self._grid_width + self._offset_x)) + center_grid_y = coord_grid_y + (0.5 * (self._grid_height + self._offset_y)) bounding_box = node.getBoundingBox() center_node_x = (bounding_box.left + bounding_box.right) * 0.5 @@ -134,13 +127,13 @@ class GridArrange: return grid_idx def gridSpaceToCoordSpace(self, x: float, y: float) -> Tuple[float, float]: - grid_x = x * (self._grid_width + self.offset_x) + self._build_volume_bounding_box.left - grid_y = y * (self._grid_height + self.offset_y) + self._build_volume_bounding_box.back + grid_x = x * (self._grid_width + self._offset_x) + self._build_volume_bounding_box.left + grid_y = y * (self._grid_height + self._offset_y) + self._build_volume_bounding_box.back return grid_x, grid_y def coordSpaceToGridSpace(self, grid_x: float, grid_y: float) -> Tuple[float, float]: - coord_x = (grid_x - self._build_volume_bounding_box.left) / (self._grid_width + self.offset_x) - coord_y = (grid_y - self._build_volume_bounding_box.back) / (self._grid_height + self.offset_y) + coord_x = (grid_x - self._build_volume_bounding_box.left) / (self._grid_width + self._offset_x) + coord_y = (grid_y - self._build_volume_bounding_box.back) / (self._grid_height + self._offset_y) return coord_x, coord_y def checkGridUnderDiscSpace(self, grid_x: int, grid_y: int) -> bool: diff --git a/cura/Arranging/Nest2DArrange.py b/cura/Arranging/Nest2DArrange.py index 8921c9ede2..b7422e3943 100644 --- a/cura/Arranging/Nest2DArrange.py +++ b/cura/Arranging/Nest2DArrange.py @@ -15,7 +15,7 @@ from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.RotateOperation import RotateOperation from UM.Operations.TranslateOperation import TranslateOperation - +from cura.Arranging.GridArrange import GridArrange if TYPE_CHECKING: from UM.Scene.SceneNode import SceneNode @@ -27,6 +27,7 @@ def findNodePlacement( build_volume: "BuildVolume", fixed_nodes: Optional[List["SceneNode"]] = None, factor: int = 10000, + *, lock_rotation: bool = False ) -> Tuple[bool, List[Item]]: """ @@ -124,30 +125,36 @@ def createGroupOperationForArrange(nodes_to_arrange: List["SceneNode"], build_volume: "BuildVolume", fixed_nodes: Optional[List["SceneNode"]] = None, factor: int = 10000, + *, add_new_nodes_in_scene: bool = False, - lock_rotation: bool = False) -> Tuple[GroupedOperation, int]: - scene_root = Application.getInstance().getController().getScene().getRoot() - found_solution_for_all, node_items = findNodePlacement(nodes_to_arrange, build_volume, fixed_nodes, factor, - lock_rotation) + lock_rotation: bool = False, + grid_arrange: bool = False) -> Tuple[GroupedOperation, int]: + if grid_arrange: + grid = GridArrange(nodes_to_arrange, build_volume, fixed_nodes) + return grid.createGroupOperationForArrange() + else: + scene_root = Application.getInstance().getController().getScene().getRoot() + found_solution_for_all, node_items = findNodePlacement(nodes_to_arrange, build_volume, fixed_nodes, factor, + lock_rotation = lock_rotation) - not_fit_count = 0 - grouped_operation = GroupedOperation() - for node, node_item in zip(nodes_to_arrange, node_items): - if add_new_nodes_in_scene: - grouped_operation.addOperation(AddSceneNodeOperation(node, scene_root)) + not_fit_count = 0 + grouped_operation = GroupedOperation() + for node, node_item in zip(nodes_to_arrange, node_items): + if add_new_nodes_in_scene: + grouped_operation.addOperation(AddSceneNodeOperation(node, scene_root)) - if node_item.binId() == 0: - # We found a spot for it - rotation_matrix = Matrix() - rotation_matrix.setByRotationAxis(node_item.rotation(), Vector(0, -1, 0)) - grouped_operation.addOperation(RotateOperation(node, Quaternion.fromMatrix(rotation_matrix))) - grouped_operation.addOperation(TranslateOperation(node, Vector(node_item.translation().x() / factor, 0, - node_item.translation().y() / factor))) - else: - # We didn't find a spot - grouped_operation.addOperation( - TranslateOperation(node, Vector(200, node.getWorldPosition().y, -not_fit_count * 20), set_position = True)) - not_fit_count += 1 + if node_item.binId() == 0: + # We found a spot for it + rotation_matrix = Matrix() + rotation_matrix.setByRotationAxis(node_item.rotation(), Vector(0, -1, 0)) + grouped_operation.addOperation(RotateOperation(node, Quaternion.fromMatrix(rotation_matrix))) + grouped_operation.addOperation(TranslateOperation(node, Vector(node_item.translation().x() / factor, 0, + node_item.translation().y() / factor))) + else: + # We didn't find a spot + grouped_operation.addOperation( + TranslateOperation(node, Vector(200, node.getWorldPosition().y, -not_fit_count * 20), set_position = True)) + not_fit_count += 1 return grouped_operation, not_fit_count @@ -158,7 +165,8 @@ def arrange( fixed_nodes: Optional[List["SceneNode"]] = None, factor=10000, add_new_nodes_in_scene: bool = False, - lock_rotation: bool = False + lock_rotation: bool = False, + grid_arrange: bool = False ) -> bool: """ Find placement for a set of scene nodes, and move them by using a single grouped operation. @@ -174,6 +182,6 @@ def arrange( """ grouped_operation, not_fit_count = createGroupOperationForArrange(nodes_to_arrange, build_volume, fixed_nodes, - factor, add_new_nodes_in_scene, lock_rotation) + factor, add_new_nodes_in_scene = add_new_nodes_in_scene, lock_rotation = lock_rotation, grid_arrange = grid_arrange) grouped_operation.push() return not_fit_count == 0 diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 6e6e93e3ad..dc18497191 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -18,7 +18,6 @@ from UM.Operations.RemoveSceneNodeOperation import RemoveSceneNodeOperation from UM.Operations.TranslateOperation import TranslateOperation import cura.CuraApplication -from cura.Arranging.GridArrange import GridArrange from cura.Operations.SetParentOperation import SetParentOperation from cura.MultiplyObjectsJob import MultiplyObjectsJob from cura.Settings.SetObjectExtruderOperation import SetObjectExtruderOperation @@ -239,8 +238,7 @@ class CuraActions(QObject): if node.callDecoration("isSliceable"): fixed_nodes.append(node) # Add the new nodes to the scene, and arrange them - grid_arrange = GridArrange(nodes, application.getBuildVolume(), fixed_nodes) - group_operation, not_fit_count = grid_arrange.createGroupOperationForArrange() + group_operation, not_fit_count = createGroupOperationForArrange(nodes, application.getBuildVolume(), fixed_nodes, grid_arrange = True) group_operation.push() # deselect currently selected nodes, and select the new nodes diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index a9517c966c..fb4b4cc5d6 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1442,13 +1442,13 @@ class CuraApplication(QtApplication): # Single build plate @pyqtSlot() def arrangeAll(self) -> None: - self._arrangeAll(False) + self._arrangeAll(grid_arrangement = False) @pyqtSlot() def arrangeAllInGrid(self) -> None: - self._arrangeAll(True) + self._arrangeAll(grid_arrangement = True) - def _arrangeAll(self, grid_arrangement: bool) -> None: + def _arrangeAll(self, *, grid_arrangement: bool) -> None: nodes_to_arrange = [] active_build_plate = self.getMultiBuildPlateModel().activeBuildPlate locked_nodes = [] @@ -1478,18 +1478,17 @@ class CuraApplication(QtApplication): locked_nodes.append(node) else: nodes_to_arrange.append(node) - self.arrange(nodes_to_arrange, locked_nodes, grid_arrangement) + self.arrange(nodes_to_arrange, locked_nodes, grid_arrangement = grid_arrangement) - def arrange(self, nodes: List[SceneNode], fixed_nodes: List[SceneNode], grid_arrangement: bool = False) -> None: + def arrange(self, nodes: List[SceneNode], fixed_nodes: List[SceneNode], *, grid_arrangement: bool = False) -> None: """Arrange a set of nodes given a set of fixed nodes :param nodes: nodes that we have to place :param fixed_nodes: nodes that are placed in the arranger before finding spots for nodes :param grid_arrangement: If set to true if objects are to be placed in a grid """ - min_offset = self.getBuildVolume().getEdgeDisallowedSize() + 2 # Allow for some rounding errors - job = ArrangeObjectsJob(nodes, fixed_nodes, min_offset=max(min_offset, 8), grid_arrange =grid_arrangement) + job = ArrangeObjectsJob(nodes, fixed_nodes, min_offset = max(min_offset, 8), grid_arrange = grid_arrangement) job.start() @pyqtSlot() diff --git a/cura/MultiplyObjectsJob.py b/cura/MultiplyObjectsJob.py index 6df80eb01c..3864b94427 100644 --- a/cura/MultiplyObjectsJob.py +++ b/cura/MultiplyObjectsJob.py @@ -14,14 +14,13 @@ from UM.Operations.TranslateOperation import TranslateOperation from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.i18n import i18nCatalog -from cura.Arranging.GridArrange import GridArrange -from cura.Arranging.Nest2DArrange import arrange, createGroupOperationForArrange +from cura.Arranging.Nest2DArrange import createGroupOperationForArrange i18n_catalog = i18nCatalog("cura") class MultiplyObjectsJob(Job): - def __init__(self, objects, count: int, min_offset: int = 8, grid_arrange: bool = False): + def __init__(self, objects, count: int, min_offset: int = 8 ,* , grid_arrange: bool = False): super().__init__() self._objects = objects self._count: int = count @@ -78,16 +77,12 @@ class MultiplyObjectsJob(Job): found_solution_for_all = True group_operation = GroupedOperation() if nodes: - if(self._grid_arrange): - grid_arrange = GridArrange(nodes,Application.getInstance().getBuildVolume(),fixed_nodes) - group_operation, not_fit_count = grid_arrange.createGroupOperationForArrange() - - else: - group_operation, not_fit_count = createGroupOperationForArrange(nodes, - Application.getInstance().getBuildVolume(), - fixed_nodes, - factor=10000, - add_new_nodes_in_scene=True) + group_operation, not_fit_count = createGroupOperationForArrange(nodes, + Application.getInstance().getBuildVolume(), + fixed_nodes, + factor=10000, + add_new_nodes_in_scene=True, + grid_arrange=self._grid_arrange) if nodes_to_add_without_arrange: for nested_node in nodes_to_add_without_arrange: diff --git a/resources/qml/Menus/ContextMenu.qml b/resources/qml/Menus/ContextMenu.qml index a095fb6e1a..2de2795a74 100644 --- a/resources/qml/Menus/ContextMenu.qml +++ b/resources/qml/Menus/ContextMenu.qml @@ -109,18 +109,7 @@ Cura.Menu height: UM.Theme.getSize("small_popup_dialog").height minimumWidth: UM.Theme.getSize("small_popup_dialog").width minimumHeight: UM.Theme.getSize("small_popup_dialog").height - - onAccepted: { - if (gridPlacementSelected.checked) - { - CuraActions.multiplySelectionToGrid(copiesField.value) - } - else - { - CuraActions.multiplySelection(copiesField.value) - } - } - + onAccepted: gridPlacementSelected.checked? CuraActions.multiplySelectionToGrid(copiesField.value) : CuraActions.multiplySelection(copiesField.value) buttonSpacing: UM.Theme.getSize("thin_margin").width rightButtons: @@ -169,7 +158,17 @@ Cura.Menu { id: gridPlacementSelected text: catalog.i18nc("@label", "Grid Placement") + + UM.ToolTip + { + visible: parent.hovered + targetPoint: Qt.point(parent.x + Math.round(parent.width / 2), parent.y) + x: 0 + y: parent.y + parent.height + UM.Theme.getSize("default_margin").height + tooltipText: catalog.i18nc("@info", "Multiply selected item and place them in a grid of build plate.") + } } + } } } From 668038c59f420843b166690486c698d79c957da6 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Wed, 23 Aug 2023 17:58:00 +0200 Subject: [PATCH 088/126] Implement factory for Arrange CURA-7951 --- cura/Arranging/ArrangeObjectsJob.py | 10 +- cura/Arranging/Arranger.py | 27 ++++ cura/Arranging/GridArrange.py | 12 +- cura/Arranging/Nest2DArrange.py | 228 ++++++++++++---------------- cura/CuraActions.py | 9 +- cura/CuraApplication.py | 1 - cura/MultiplyObjectsJob.py | 15 +- 7 files changed, 152 insertions(+), 150 deletions(-) create mode 100644 cura/Arranging/Arranger.py diff --git a/cura/Arranging/ArrangeObjectsJob.py b/cura/Arranging/ArrangeObjectsJob.py index 0f8c576995..b1e0432786 100644 --- a/cura/Arranging/ArrangeObjectsJob.py +++ b/cura/Arranging/ArrangeObjectsJob.py @@ -9,7 +9,7 @@ from UM.Message import Message from UM.Scene.SceneNode import SceneNode from UM.i18n import i18nCatalog from cura.Arranging.GridArrange import GridArrange -from cura.Arranging.Nest2DArrange import arrange +from cura.Arranging.Nest2DArrange import Nest2DArrange i18n_catalog = i18nCatalog("cura") @@ -33,7 +33,13 @@ class ArrangeObjectsJob(Job): status_message.show() try: - found_solution_for_all = arrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes, grid_arrange= self._grid_arrange) + if self._grid_arrange: + arranger = GridArrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes) + else: + arranger = Nest2DArrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes, + factor=1000) + + found_solution_for_all = arranger.arrange() except: # If the thread crashes, the message should still close Logger.logException("e", "Unable to arrange the objects on the buildplate. The arrange algorithm has crashed.") diff --git a/cura/Arranging/Arranger.py b/cura/Arranging/Arranger.py new file mode 100644 index 0000000000..684fa1258b --- /dev/null +++ b/cura/Arranging/Arranger.py @@ -0,0 +1,27 @@ +from typing import List, TYPE_CHECKING, Optional, Tuple, Set + +if TYPE_CHECKING: + from UM.Operations.GroupedOperation import GroupedOperation + + +class Arranger: + def createGroupOperationForArrange(self, add_new_nodes_in_scene: bool = True) -> Tuple["GroupedOperation", int]: + """ + Find placement for a set of scene nodes, but don't actually move them just yet. + :param add_new_nodes_in_scene: Whether to create new scene nodes before applying the transformations and rotations + :return: tuple (found_solution_for_all, node_items) + WHERE + found_solution_for_all: Whether the algorithm found a place on the buildplate for all the objects + node_items: A list of the nodes return by libnest2d, which contain the new positions on the buildplate + """ + raise NotImplementedError + + def arrange(self, add_new_nodes_in_scene: bool = True) -> bool: + """ + Find placement for a set of scene nodes, and move them by using a single grouped operation. + :param add_new_nodes_in_scene: Whether to create new scene nodes before applying the transformations and rotations + :return: found_solution_for_all: Whether the algorithm found a place on the buildplate for all the objects + """ + grouped_operation, not_fit_count = self.createGroupOperationForArrange(add_new_nodes_in_scene) + grouped_operation.push() + return not_fit_count == 0 diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index d8b7ba9db8..4866e99b69 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -1,8 +1,6 @@ import math from typing import List, TYPE_CHECKING, Optional, Tuple, Set - - if TYPE_CHECKING: from UM.Scene.SceneNode import SceneNode @@ -12,9 +10,10 @@ from UM.Math.Vector import Vector from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.TranslateOperation import TranslateOperation +from cura.Arranging.Arranger import Arranger -class GridArrange: +class GridArrange(Arranger): def __init__(self, nodes_to_arrange: List["SceneNode"], build_volume: "BuildVolume", fixed_nodes: List["SceneNode"] = None): if fixed_nodes is None: fixed_nodes = [] @@ -38,7 +37,7 @@ class GridArrange: self._initial_leftover_grid_x = math.floor(self._initial_leftover_grid_x) self._initial_leftover_grid_y = math.floor(self._initial_leftover_grid_y) - def createGroupOperationForArrange(self) -> Tuple[GroupedOperation, int]: + def createGroupOperationForArrange(self, add_new_nodes_in_scene: bool = True) -> Tuple[GroupedOperation, int]: # Find grid indexes that intersect with fixed objects fixed_nodes_grid_ids = set() for node in self._fixed_nodes: @@ -77,7 +76,8 @@ class GridArrange: left_over_grid_y = self._initial_leftover_grid_y for node in leftover_nodes: - grouped_operation.addOperation(AddSceneNodeOperation(node, scene_root)) + if add_new_nodes_in_scene: + grouped_operation.addOperation(AddSceneNodeOperation(node, scene_root)) # find the first next grid position that isn't occupied by a fixed node while (self._initial_leftover_grid_x, left_over_grid_y) in fixed_nodes_grid_ids: left_over_grid_y = left_over_grid_y - 1 @@ -156,7 +156,7 @@ class GridArrange: # ┌───────┬───────┐ < coord_build_plate_back = -1 # │ │ │ # │ │(0,0) │ - # (-1,0)│───────o───────┤(1,0) + # (-1,0)├───────o───────┤(1,0) # │ │ │ # │ │ │ # └───────┴───────┘ < coord_build_plate_front = +1 diff --git a/cura/Arranging/Nest2DArrange.py b/cura/Arranging/Nest2DArrange.py index b7422e3943..ea45fe0b8e 100644 --- a/cura/Arranging/Nest2DArrange.py +++ b/cura/Arranging/Nest2DArrange.py @@ -15,131 +15,122 @@ from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation from UM.Operations.GroupedOperation import GroupedOperation from UM.Operations.RotateOperation import RotateOperation from UM.Operations.TranslateOperation import TranslateOperation -from cura.Arranging.GridArrange import GridArrange +from cura.Arranging.Arranger import Arranger if TYPE_CHECKING: from UM.Scene.SceneNode import SceneNode from cura.BuildVolume import BuildVolume -def findNodePlacement( - nodes_to_arrange: List["SceneNode"], - build_volume: "BuildVolume", - fixed_nodes: Optional[List["SceneNode"]] = None, - factor: int = 10000, - *, - lock_rotation: bool = False -) -> Tuple[bool, List[Item]]: - """ - Find placement for a set of scene nodes, but don't actually move them just yet. - :param nodes_to_arrange: The list of nodes that need to be moved. - :param build_volume: The build volume that we want to place the nodes in. It gets size & disallowed areas from this. - :param fixed_nodes: List of nods that should not be moved, but should be used when deciding where the others nodes - are placed. - :param factor: The library that we use is int based. This factor defines how accurate we want it to be. - :param lock_rotation: If set to true the orientation of the object will remain the same +class Nest2DArrange(Arranger): + def __init__(self, + nodes_to_arrange: List["SceneNode"], + build_volume: "BuildVolume", + fixed_nodes: Optional[List["SceneNode"]] = None, + *, + factor: int = 10000, + lock_rotation: bool = False): + """ + :param nodes_to_arrange: The list of nodes that need to be moved. + :param build_volume: The build volume that we want to place the nodes in. It gets size & disallowed areas from this. + :param fixed_nodes: List of nods that should not be moved, but should be used when deciding where the others nodes + are placed. + :param factor: The library that we use is int based. This factor defines how accuracte we want it to be. + :param lock_rotation: If set to true the orientation of the object will remain the same + """ + super().__init__() + self._nodes_to_arrange = nodes_to_arrange + self._build_volume = build_volume + self._fixed_nodes = fixed_nodes + self._factor = factor + self._lock_rotation = lock_rotation - :return: tuple (found_solution_for_all, node_items) - WHERE - found_solution_for_all: Whether the algorithm found a place on the buildplate for all the objects - node_items: A list of the nodes return by libnest2d, which contain the new positions on the buildplate - """ - spacing = int(1.5 * factor) # 1.5mm spacing. + def findNodePlacement(self) -> Tuple[bool, List[Item]]: + spacing = int(1.5 * self._factor) # 1.5mm spacing. - machine_width = build_volume.getWidth() - machine_depth = build_volume.getDepth() - build_plate_bounding_box = Box(int(machine_width * factor), int(machine_depth * factor)) + machine_width = self._build_volume.getWidth() + machine_depth = self._build_volume.getDepth() + build_plate_bounding_box = Box(int(machine_width * self._factor), int(machine_depth * self._factor)) - if fixed_nodes is None: - fixed_nodes = [] + if self._fixed_nodes is None: + self._fixed_nodes = [] - # Add all the items we want to arrange - node_items = [] - for node in nodes_to_arrange: - hull_polygon = node.callDecoration("getConvexHull") - if not hull_polygon or hull_polygon.getPoints is None: - Logger.log("w", "Object {} cannot be arranged because it has no convex hull.".format(node.getName())) - continue - converted_points = [] - for point in hull_polygon.getPoints(): - converted_points.append(Point(int(point[0] * factor), int(point[1] * factor))) - item = Item(converted_points) - node_items.append(item) - - # Use a tiny margin for the build_plate_polygon (the nesting doesn't like overlapping disallowed areas) - half_machine_width = 0.5 * machine_width - 1 - half_machine_depth = 0.5 * machine_depth - 1 - build_plate_polygon = Polygon(numpy.array([ - [half_machine_width, -half_machine_depth], - [-half_machine_width, -half_machine_depth], - [-half_machine_width, half_machine_depth], - [half_machine_width, half_machine_depth] - ], numpy.float32)) - - disallowed_areas = build_volume.getDisallowedAreas() - num_disallowed_areas_added = 0 - for area in disallowed_areas: - converted_points = [] - - # Clip the disallowed areas so that they don't overlap the bounding box (The arranger chokes otherwise) - clipped_area = area.intersectionConvexHulls(build_plate_polygon) - - if clipped_area.getPoints() is not None and len(clipped_area.getPoints()) > 2: # numpy array has to be explicitly checked against None - for point in clipped_area.getPoints(): - converted_points.append(Point(int(point[0] * factor), int(point[1] * factor))) - - disallowed_area = Item(converted_points) - disallowed_area.markAsDisallowedAreaInBin(0) - node_items.append(disallowed_area) - num_disallowed_areas_added += 1 - - for node in fixed_nodes: - converted_points = [] - hull_polygon = node.callDecoration("getConvexHull") - - if hull_polygon is not None and hull_polygon.getPoints() is not None and len(hull_polygon.getPoints()) > 2: # numpy array has to be explicitly checked against None + # Add all the items we want to arrange + node_items = [] + for node in self._nodes_to_arrange: + hull_polygon = node.callDecoration("getConvexHull") + if not hull_polygon or hull_polygon.getPoints is None: + Logger.log("w", "Object {} cannot be arranged because it has no convex hull.".format(node.getName())) + continue + converted_points = [] for point in hull_polygon.getPoints(): - converted_points.append(Point(int(point[0] * factor), int(point[1] * factor))) + converted_points.append(Point(int(point[0] * self._factor), int(point[1] * self._factor))) item = Item(converted_points) - item.markAsFixedInBin(0) node_items.append(item) - num_disallowed_areas_added += 1 - config = NfpConfig() - config.accuracy = 1.0 - config.alignment = NfpConfig.Alignment.DONT_ALIGN - if lock_rotation: - config.rotations = [0.0] + # Use a tiny margin for the build_plate_polygon (the nesting doesn't like overlapping disallowed areas) + half_machine_width = 0.5 * machine_width - 1 + half_machine_depth = 0.5 * machine_depth - 1 + build_plate_polygon = Polygon(numpy.array([ + [half_machine_width, -half_machine_depth], + [-half_machine_width, -half_machine_depth], + [-half_machine_width, half_machine_depth], + [half_machine_width, half_machine_depth] + ], numpy.float32)) - num_bins = nest(node_items, build_plate_bounding_box, spacing, config) + disallowed_areas = self._build_volume.getDisallowedAreas() + num_disallowed_areas_added = 0 + for area in disallowed_areas: + converted_points = [] - # Strip the fixed items (previously placed) and the disallowed areas from the results again. - node_items = list(filter(lambda item: not item.isFixed(), node_items)) + # Clip the disallowed areas so that they don't overlap the bounding box (The arranger chokes otherwise) + clipped_area = area.intersectionConvexHulls(build_plate_polygon) - found_solution_for_all = num_bins == 1 + if clipped_area.getPoints() is not None and len( + clipped_area.getPoints()) > 2: # numpy array has to be explicitly checked against None + for point in clipped_area.getPoints(): + converted_points.append(Point(int(point[0] * self._factor), int(point[1] * self._factor))) - return found_solution_for_all, node_items + disallowed_area = Item(converted_points) + disallowed_area.markAsDisallowedAreaInBin(0) + node_items.append(disallowed_area) + num_disallowed_areas_added += 1 + for node in self._fixed_nodes: + converted_points = [] + hull_polygon = node.callDecoration("getConvexHull") -def createGroupOperationForArrange(nodes_to_arrange: List["SceneNode"], - build_volume: "BuildVolume", - fixed_nodes: Optional[List["SceneNode"]] = None, - factor: int = 10000, - *, - add_new_nodes_in_scene: bool = False, - lock_rotation: bool = False, - grid_arrange: bool = False) -> Tuple[GroupedOperation, int]: - if grid_arrange: - grid = GridArrange(nodes_to_arrange, build_volume, fixed_nodes) - return grid.createGroupOperationForArrange() - else: + if hull_polygon is not None and hull_polygon.getPoints() is not None and len( + hull_polygon.getPoints()) > 2: # numpy array has to be explicitly checked against None + for point in hull_polygon.getPoints(): + converted_points.append(Point(int(point[0] * self._factor), int(point[1] * self._factor))) + item = Item(converted_points) + item.markAsFixedInBin(0) + node_items.append(item) + num_disallowed_areas_added += 1 + + config = NfpConfig() + config.accuracy = 1.0 + config.alignment = NfpConfig.Alignment.DONT_ALIGN + if self._lock_rotation: + config.rotations = [0.0] + + num_bins = nest(node_items, build_plate_bounding_box, spacing, config) + + # Strip the fixed items (previously placed) and the disallowed areas from the results again. + node_items = list(filter(lambda item: not item.isFixed(), node_items)) + + found_solution_for_all = num_bins == 1 + + return found_solution_for_all, node_items + + def createGroupOperationForArrange(self, add_new_nodes_in_scene: bool = True) -> Tuple[GroupedOperation, int]: scene_root = Application.getInstance().getController().getScene().getRoot() - found_solution_for_all, node_items = findNodePlacement(nodes_to_arrange, build_volume, fixed_nodes, factor, - lock_rotation = lock_rotation) + found_solution_for_all, node_items = self.findNodePlacement() not_fit_count = 0 grouped_operation = GroupedOperation() - for node, node_item in zip(nodes_to_arrange, node_items): + for node, node_item in zip(self._nodes_to_arrange, node_items): if add_new_nodes_in_scene: grouped_operation.addOperation(AddSceneNodeOperation(node, scene_root)) @@ -148,40 +139,13 @@ def createGroupOperationForArrange(nodes_to_arrange: List["SceneNode"], rotation_matrix = Matrix() rotation_matrix.setByRotationAxis(node_item.rotation(), Vector(0, -1, 0)) grouped_operation.addOperation(RotateOperation(node, Quaternion.fromMatrix(rotation_matrix))) - grouped_operation.addOperation(TranslateOperation(node, Vector(node_item.translation().x() / factor, 0, - node_item.translation().y() / factor))) + grouped_operation.addOperation( + TranslateOperation(node, Vector(node_item.translation().x() / self._factor, 0, + node_item.translation().y() / self._factor))) else: # We didn't find a spot grouped_operation.addOperation( TranslateOperation(node, Vector(200, node.getWorldPosition().y, -not_fit_count * 20), set_position = True)) not_fit_count += 1 - return grouped_operation, not_fit_count - - -def arrange( - nodes_to_arrange: List["SceneNode"], - build_volume: "BuildVolume", - fixed_nodes: Optional[List["SceneNode"]] = None, - factor=10000, - add_new_nodes_in_scene: bool = False, - lock_rotation: bool = False, - grid_arrange: bool = False -) -> bool: - """ - Find placement for a set of scene nodes, and move them by using a single grouped operation. - :param nodes_to_arrange: The list of nodes that need to be moved. - :param build_volume: The build volume that we want to place the nodes in. It gets size & disallowed areas from this. - :param fixed_nodes: List of nods that should not be moved, but should be used when deciding where the others nodes - are placed. - :param factor: The library that we use is int based. This factor defines how accuracte we want it to be. - :param add_new_nodes_in_scene: Whether to create new scene nodes before applying the transformations and rotations - :param lock_rotation: If set to true the orientation of the object will remain the same - - :return: found_solution_for_all: Whether the algorithm found a place on the buildplate for all the objects - """ - - grouped_operation, not_fit_count = createGroupOperationForArrange(nodes_to_arrange, build_volume, fixed_nodes, - factor, add_new_nodes_in_scene = add_new_nodes_in_scene, lock_rotation = lock_rotation, grid_arrange = grid_arrange) - grouped_operation.push() - return not_fit_count == 0 + return grouped_operation, not_fit_count diff --git a/cura/CuraActions.py b/cura/CuraActions.py index dc18497191..29f50d88b2 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -22,7 +22,10 @@ from cura.Operations.SetParentOperation import SetParentOperation from cura.MultiplyObjectsJob import MultiplyObjectsJob from cura.Settings.SetObjectExtruderOperation import SetObjectExtruderOperation from cura.Settings.ExtruderManager import ExtruderManager -from cura.Arranging.Nest2DArrange import createGroupOperationForArrange + +from cura.Arranging.GridArrange import GridArrange +from cura.Arranging.Nest2DArrange import Nest2DArrange + from cura.Operations.SetBuildPlateNumberOperation import SetBuildPlateNumberOperation @@ -238,7 +241,9 @@ class CuraActions(QObject): if node.callDecoration("isSliceable"): fixed_nodes.append(node) # Add the new nodes to the scene, and arrange them - group_operation, not_fit_count = createGroupOperationForArrange(nodes, application.getBuildVolume(), fixed_nodes, grid_arrange = True) + + arranger = GridArrange(nodes, application.getBuildVolume(), fixed_nodes) + group_operation, not_fit_count = arranger.createGroupOperationForArrange() group_operation.push() # deselect currently selected nodes, and select the new nodes diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index fb4b4cc5d6..54b717b3d0 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -54,7 +54,6 @@ from cura import ApplicationMetadata from cura.API import CuraAPI from cura.API.Account import Account from cura.Arranging.ArrangeObjectsJob import ArrangeObjectsJob -from cura.Arranging.Nest2DArrange import arrange from cura.Machines.MachineErrorChecker import MachineErrorChecker from cura.Machines.Models.BuildPlateModel import BuildPlateModel from cura.Machines.Models.CustomQualityProfilesDropDownMenuModel import CustomQualityProfilesDropDownMenuModel diff --git a/cura/MultiplyObjectsJob.py b/cura/MultiplyObjectsJob.py index 3864b94427..889b6f5d1a 100644 --- a/cura/MultiplyObjectsJob.py +++ b/cura/MultiplyObjectsJob.py @@ -14,7 +14,8 @@ from UM.Operations.TranslateOperation import TranslateOperation from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator from UM.Scene.SceneNode import SceneNode from UM.i18n import i18nCatalog -from cura.Arranging.Nest2DArrange import createGroupOperationForArrange +from cura.Arranging.GridArrange import GridArrange +from cura.Arranging.Nest2DArrange import Nest2DArrange i18n_catalog = i18nCatalog("cura") @@ -77,12 +78,12 @@ class MultiplyObjectsJob(Job): found_solution_for_all = True group_operation = GroupedOperation() if nodes: - group_operation, not_fit_count = createGroupOperationForArrange(nodes, - Application.getInstance().getBuildVolume(), - fixed_nodes, - factor=10000, - add_new_nodes_in_scene=True, - grid_arrange=self._grid_arrange) + if self._grid_arrange: + arranger = GridArrange(nodes, Application.getInstance().getBuildVolume(), fixed_nodes) + else: + arranger = Nest2DArrange(nodes, Application.getInstance().getBuildVolume(), fixed_nodes, factor=1000) + + group_operation, not_fit_count = arranger.createGroupOperationForArrange(add_new_nodes_in_scene=True) if nodes_to_add_without_arrange: for nested_node in nodes_to_add_without_arrange: From f67a6970ddd5a189f148fbf45377d56ba3af89e9 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 24 Aug 2023 08:33:59 +0200 Subject: [PATCH 089/126] Find optimal offset for grid arrange CURA-7951 --- cura/Arranging/GridArrange.py | 243 ++++++++++++++++++++++++---------- 1 file changed, 170 insertions(+), 73 deletions(-) diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index 4866e99b69..82ce7bc224 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -1,11 +1,11 @@ import math -from typing import List, TYPE_CHECKING, Optional, Tuple, Set +from typing import List, TYPE_CHECKING, Tuple, Set if TYPE_CHECKING: from UM.Scene.SceneNode import SceneNode + from cura.BuildVolume import BuildVolume from UM.Application import Application -from UM.Math import AxisAlignedBox from UM.Math.Vector import Vector from UM.Operations.AddSceneNodeOperation import AddSceneNodeOperation from UM.Operations.GroupedOperation import GroupedOperation @@ -22,14 +22,25 @@ class GridArrange(Arranger): self._build_volume_bounding_box = build_volume.getBoundingBox() self._fixed_nodes = fixed_nodes - self._offset_x: float = 10 - self._offset_y: float = 10 + self._margin_x: float = 1 + self._margin_y: float = 1 + self._grid_width = 0 self._grid_height = 0 for node in self._nodes_to_arrange: bounding_box = node.getBoundingBox() self._grid_width = max(self._grid_width, bounding_box.width) self._grid_height = max(self._grid_height, bounding_box.depth) + self._grid_width += self._margin_x + self._grid_height += self._margin_y + + # Round up the grid size to the nearest cm + self._grid_width = math.ceil(self._grid_width / 10) * 10 + self._grid_height = math.ceil(self._grid_height / 10) * 10 + + self._offset_x = 0 + self._offset_y = 0 + self._findOptimalGridOffset() coord_initial_leftover_x = self._build_volume_bounding_box.right + 2 * self._grid_width coord_initial_leftover_y = (self._build_volume_bounding_box.back + self._build_volume_bounding_box.front) * 0.5 @@ -37,39 +48,38 @@ class GridArrange(Arranger): self._initial_leftover_grid_x = math.floor(self._initial_leftover_grid_x) self._initial_leftover_grid_y = math.floor(self._initial_leftover_grid_y) - def createGroupOperationForArrange(self, add_new_nodes_in_scene: bool = True) -> Tuple[GroupedOperation, int]: # Find grid indexes that intersect with fixed objects - fixed_nodes_grid_ids = set() + self._fixed_nodes_grid_ids = set() for node in self._fixed_nodes: - fixed_nodes_grid_ids = fixed_nodes_grid_ids.union(self.intersectingGridIdxInclusive(node.getBoundingBox())) + self._fixed_nodes_grid_ids = self._fixed_nodes_grid_ids.union( + self.intersectingGridIdxInclusive(node.getBoundingBox())) - build_plate_grid_ids = self.intersectingGridIdxExclusive(self._build_volume_bounding_box) + self._build_plate_grid_ids = self.intersectingGridIdxExclusive(self._build_volume_bounding_box) # Filter out the corner grid squares if the build plate shape is elliptic if self._build_volume.getShape() == "elliptic": - build_plate_grid_ids = set(filter(lambda grid_id: self.checkGridUnderDiscSpace(grid_id[0], grid_id[1]), build_plate_grid_ids)) + self._build_plate_grid_ids = set( + filter(lambda grid_id: self.checkGridUnderDiscSpace(grid_id[0], grid_id[1]), + self._build_plate_grid_ids)) - allowed_grid_idx = build_plate_grid_ids.difference(fixed_nodes_grid_ids) + self._allowed_grid_idx = self._build_plate_grid_ids.difference(self._fixed_nodes_grid_ids) + def createGroupOperationForArrange(self, add_new_nodes_in_scene: bool = True) -> Tuple[GroupedOperation, int]: # Find the sequence in which items are placed coord_build_plate_center_x = self._build_volume_bounding_box.width * 0.5 + self._build_volume_bounding_box.left coord_build_plate_center_y = self._build_volume_bounding_box.depth * 0.5 + self._build_volume_bounding_box.back grid_build_plate_center_x, grid_build_plate_center_y = self.coordSpaceToGridSpace(coord_build_plate_center_x, coord_build_plate_center_y) - def distToCenter(grid_id: Tuple[int, int]) -> float: - grid_x, grid_y = grid_id - distance_squared = (grid_build_plate_center_x - grid_x) ** 2 + (grid_build_plate_center_y - grid_y) ** 2 - return distance_squared - - sequence: List[Tuple[int, int]] = list(allowed_grid_idx) - sequence.sort(key=distToCenter) + sequence: List[Tuple[int, int]] = list(self._allowed_grid_idx) + sequence.sort(key=lambda grid_id: (grid_build_plate_center_x - grid_id[0]) ** 2 + ( + grid_build_plate_center_y - grid_id[1]) ** 2) scene_root = Application.getInstance().getController().getScene().getRoot() grouped_operation = GroupedOperation() for grid_id, node in zip(sequence, self._nodes_to_arrange): grouped_operation.addOperation(AddSceneNodeOperation(node, scene_root)) grid_x, grid_y = grid_id - operation = self.moveNodeOnGrid(node, grid_x, grid_y) + operation = self._moveNodeOnGrid(node, grid_x, grid_y) grouped_operation.addOperation(operation) leftover_nodes = self._nodes_to_arrange[len(sequence):] @@ -79,18 +89,103 @@ class GridArrange(Arranger): if add_new_nodes_in_scene: grouped_operation.addOperation(AddSceneNodeOperation(node, scene_root)) # find the first next grid position that isn't occupied by a fixed node - while (self._initial_leftover_grid_x, left_over_grid_y) in fixed_nodes_grid_ids: + while (self._initial_leftover_grid_x, left_over_grid_y) in self._fixed_nodes_grid_ids: left_over_grid_y = left_over_grid_y - 1 - operation = self.moveNodeOnGrid(node, self._initial_leftover_grid_x, left_over_grid_y) + operation = self._moveNodeOnGrid(node, self._initial_leftover_grid_x, left_over_grid_y) grouped_operation.addOperation(operation) left_over_grid_y = left_over_grid_y - 1 + return grouped_operation, len(leftover_nodes) - def moveNodeOnGrid(self, node: "SceneNode", grid_x: int, grid_y: int) -> "Operation.Operation": - coord_grid_x, coord_grid_y = self.gridSpaceToCoordSpace(grid_x, grid_y) - center_grid_x = coord_grid_x + (0.5 * (self._grid_width + self._offset_x)) - center_grid_y = coord_grid_y + (0.5 * (self._grid_height + self._offset_y)) + def _findOptimalGridOffset(self): + if len(self._fixed_nodes) == 0: + self._offset_x = 0 + self._offset_y = 0 + return + + if len(self._fixed_nodes) == 1: + center_grid_x = 0.5 * self._grid_width + self._build_volume_bounding_box.left + center_grid_y = 0.5 * self._grid_height + self._build_volume_bounding_box.back + + bounding_box = self._fixed_nodes[0].getBoundingBox() + center_node_x = (bounding_box.left + bounding_box.right) * 0.5 + center_node_y = (bounding_box.back + bounding_box.front) * 0.5 + + self._offset_x = center_node_x - center_grid_x + self._offset_y = center_node_y - center_grid_y + + return + + class Event: + def __init__(self, coord: float, change: float): + self.coord = coord + self.change = change + + events_horizontal: List[Event] = [] + events_vertical: List[Event] = [] + + for node in self._fixed_nodes: + bounding_box = node.getBoundingBox() + + left = bounding_box.left - self._build_volume_bounding_box.left + right = bounding_box.right - self._build_volume_bounding_box.left + back = bounding_box.back - self._build_volume_bounding_box.back + front = bounding_box.front - self._build_volume_bounding_box.back + + value_left = math.ceil(left / self._grid_width) * self._grid_width - left + value_right = math.ceil(right / self._grid_width) * self._grid_width - right + value_back = math.ceil(back / self._grid_height) * self._grid_height - back + value_front = math.ceil(front / self._grid_height) * self._grid_height - front + + # give nodes a weight according to their size. This + # weight is heuristically chosen to be proportional to + # the number of grid squares the node-boundary occupies + weight = bounding_box.width + bounding_box.depth + + events_horizontal.append(Event(value_left, weight)) + events_horizontal.append(Event(value_right, -weight)) + events_vertical.append(Event(value_back, weight)) + events_vertical.append(Event(value_front, -weight)) + + events_horizontal.sort(key=lambda event: event.coord) + events_vertical.sort(key=lambda event: event.coord) + + def findOptimalOffsetAxis(events: List[Event], interval: float) -> float: + prev_coord = events[-1].coord - interval + + current_offset = 0 + + best_offset = float('inf') + best_coord_length = float('-inf') + best_coord = 0.0 + + for event in events: + coord_length = event.coord - prev_coord + + if current_offset < best_offset or (current_offset == best_offset and coord_length > best_coord_length): + best_offset = current_offset + best_coord_length = coord_length + best_coord = event.coord + + current_offset += event.change + prev_coord = event.coord + + return best_coord - best_coord_length * 0.5 + + center_grid_x = 0.5 * self._grid_width + center_grid_y = 0.5 * self._grid_height + + optimal_center_x = self._grid_width - findOptimalOffsetAxis(events_horizontal, self._grid_width) + optimal_center_y = self._grid_height - findOptimalOffsetAxis(events_vertical, self._grid_height) + + self._offset_x = optimal_center_x - center_grid_x + self._offset_y = optimal_center_y - center_grid_y + + def _moveNodeOnGrid(self, node: "SceneNode", grid_x: int, grid_y: int) -> "Operation.Operation": + coord_grid_x, coord_grid_y = self._gridSpaceToCoordSpace(grid_x, grid_y) + center_grid_x = coord_grid_x + (0.5 * self._grid_width) + center_grid_y = coord_grid_y + (0.5 * self._grid_height) bounding_box = node.getBoundingBox() center_node_x = (bounding_box.left + bounding_box.right) * 0.5 @@ -101,7 +196,7 @@ class GridArrange(Arranger): return TranslateOperation(node, Vector(delta_x, 0, delta_y)) - def getGridCornerPoints(self, bounding_box: "BoundingVolume") -> Tuple[float, float, float, float]: + def _getGridCornerPoints(self, bounding_box: "BoundingVolume") -> Tuple[float, float, float, float]: coord_x1 = bounding_box.left coord_x2 = bounding_box.right coord_y1 = bounding_box.back @@ -111,7 +206,7 @@ class GridArrange(Arranger): return grid_x1, grid_y1, grid_x2, grid_y2 def intersectingGridIdxInclusive(self, bounding_box: "BoundingVolume") -> Set[Tuple[int, int]]: - grid_x1, grid_y1, grid_x2, grid_y2 = self.getGridCornerPoints(bounding_box) + grid_x1, grid_y1, grid_x2, grid_y2 = self._getGridCornerPoints(bounding_box) grid_idx = set() for grid_x in range(math.floor(grid_x1), math.ceil(grid_x2)): for grid_y in range(math.floor(grid_y1), math.ceil(grid_y2)): @@ -119,26 +214,26 @@ class GridArrange(Arranger): return grid_idx def intersectingGridIdxExclusive(self, bounding_box: "BoundingVolume") -> Set[Tuple[int, int]]: - grid_x1, grid_y1, grid_x2, grid_y2 = self.getGridCornerPoints(bounding_box) + grid_x1, grid_y1, grid_x2, grid_y2 = self._getGridCornerPoints(bounding_box) grid_idx = set() for grid_x in range(math.ceil(grid_x1), math.floor(grid_x2)): for grid_y in range(math.ceil(grid_y1), math.floor(grid_y2)): grid_idx.add((grid_x, grid_y)) return grid_idx - def gridSpaceToCoordSpace(self, x: float, y: float) -> Tuple[float, float]: - grid_x = x * (self._grid_width + self._offset_x) + self._build_volume_bounding_box.left - grid_y = y * (self._grid_height + self._offset_y) + self._build_volume_bounding_box.back + def _gridSpaceToCoordSpace(self, x: float, y: float) -> Tuple[float, float]: + grid_x = x * self._grid_width + self._build_volume_bounding_box.left + self._offset_x + grid_y = y * self._grid_height + self._build_volume_bounding_box.back + self._offset_y return grid_x, grid_y def coordSpaceToGridSpace(self, grid_x: float, grid_y: float) -> Tuple[float, float]: - coord_x = (grid_x - self._build_volume_bounding_box.left) / (self._grid_width + self._offset_x) - coord_y = (grid_y - self._build_volume_bounding_box.back) / (self._grid_height + self._offset_y) + coord_x = (grid_x - self._build_volume_bounding_box.left - self._offset_x) / self._grid_width + coord_y = (grid_y - self._build_volume_bounding_box.back - self._offset_y) / self._grid_height return coord_x, coord_y def checkGridUnderDiscSpace(self, grid_x: int, grid_y: int) -> bool: - left, back = self.gridSpaceToCoordSpace(grid_x, grid_y) - right, front = self.gridSpaceToCoordSpace(grid_x + 1, grid_y + 1) + left, back = self._gridSpaceToCoordSpace(grid_x, grid_y) + right, front = self._gridSpaceToCoordSpace(grid_x + 1, grid_y + 1) corners = [(left, back), (right, back), (right, front), (left, front)] return all([self.checkPointUnderDiscSpace(x, y) for x, y in corners]) @@ -165,15 +260,14 @@ class GridArrange(Arranger): disc_y = ((y - self._build_volume_bounding_box.back) / self._build_volume_bounding_box.depth) * 2.0 - 1.0 return disc_x, disc_y - def drawDebugSvg(self): + def _drawDebugSvg(self): with open("Builvolume_test.svg", "w") as f: build_volume_bounding_box = self._build_volume_bounding_box f.write( f"\n") - ellipse = True - if ellipse: + if self._build_volume.getShape() == "elliptic": f.write( f""" """) else: @@ -196,30 +290,32 @@ class GridArrange(Arranger): /> """) - for grid_x in range(0, 100): - for grid_y in range(0, 100): - # if (grid_x, grid_y) in intersecting_grid_idx: - # fill_color = "red" - # elif (grid_x, grid_y) in build_plate_grid_idx: - # fill_color = "green" - # else: - # fill_color = "orange" + for grid_x in range(-10, 10): + for grid_y in range(-10, 10): + if (grid_x, grid_y) in self._allowed_grid_idx: + fill_color = "rgba(0, 255, 0, 0.5)" + elif (grid_x, grid_y) in self._build_plate_grid_ids: + fill_color = "rgba(255, 165, 0, 0.5)" + else: + fill_color = "rgba(255, 0, 0, 0.5)" - coord_grid_x, coord_grid_y = self.gridSpaceToCoordSpace(grid_x, grid_y) + coord_grid_x, coord_grid_y = self._gridSpaceToCoordSpace(grid_x, grid_y) f.write( f""" """) f.write(f""" @@ -237,24 +333,25 @@ class GridArrange(Arranger): fill="red" /> """) - for node in self._nodes_to_arrange: - bounding_box = node.getBoundingBox() - f.write(f""" - - """) - for x in range(math.floor(self._build_volume_bounding_box.left), math.floor(self._build_volume_bounding_box.right), 50): - for y in range(math.floor(self._build_volume_bounding_box.back), math.floor(self._build_volume_bounding_box.front), 50): - color = "green" if self.checkPointUnderDiscSpace(x, y) else "red" - f.write(f""" - - """) - f.write(f"") \ No newline at end of file + f.write(f""" + """) + + # coord_build_plate_center_x = self._build_volume_bounding_box.width * 0.5 + self._build_volume_bounding_box.left + # coord_build_plate_center_y = self._build_volume_bounding_box.depth * 0.5 + self._build_volume_bounding_box.back + # f.write(f""" + # """) + + f.write(f"") From 09d4f083e0f712779d77efaca9a7ed058f0ce182 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Thu, 24 Aug 2023 11:15:34 +0200 Subject: [PATCH 090/126] Include adhesion for 1-at-a-time exclusion shadow CURA-10307 --- cura/Scene/ConvexHullDecorator.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/cura/Scene/ConvexHullDecorator.py b/cura/Scene/ConvexHullDecorator.py index 06ec247ae4..0dbf3ba782 100644 --- a/cura/Scene/ConvexHullDecorator.py +++ b/cura/Scene/ConvexHullDecorator.py @@ -111,11 +111,7 @@ class ConvexHullDecorator(SceneNodeDecorator): # Parent can be None if node is just loaded. if self._isSingularOneAtATimeNode(): - hull = self.getConvexHullHeadFull() - if hull is None: - return None - hull = self._add2DAdhesionMargin(hull) - return hull + return self.getConvexHullHeadFull() return self._compute2DConvexHull() @@ -323,6 +319,7 @@ class ConvexHullDecorator(SceneNodeDecorator): def _compute2DConvexHeadFull(self) -> Optional[Polygon]: convex_hull = self._compute2DConvexHull() + convex_hull = self._add2DAdhesionMargin(convex_hull) if convex_hull: return convex_hull.getMinkowskiHull(self._getHeadAndFans()) return None From eee1eb714b9376694f8542de5ecf3dba1ee045d5 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Thu, 24 Aug 2023 11:17:21 +0200 Subject: [PATCH 091/126] Fixed TiZYX machines head polygon definition --- resources/definitions/tizyx_evy.def.json | 2 +- resources/definitions/tizyx_evy_dual.def.json | 2 +- resources/definitions/tizyx_k25.def.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/definitions/tizyx_evy.def.json b/resources/definitions/tizyx_evy.def.json index 41b2b982be..7ae10f5f1d 100644 --- a/resources/definitions/tizyx_evy.def.json +++ b/resources/definitions/tizyx_evy.def.json @@ -57,7 +57,7 @@ [25, 49], [25, -49], [-25, -49], - [25, 49] + [-25, 49] ] }, "machine_heated_bed": { "default_value": true }, diff --git a/resources/definitions/tizyx_evy_dual.def.json b/resources/definitions/tizyx_evy_dual.def.json index 22046a16ff..7ef3aff2ab 100644 --- a/resources/definitions/tizyx_evy_dual.def.json +++ b/resources/definitions/tizyx_evy_dual.def.json @@ -54,7 +54,7 @@ [25, 49], [25, -49], [-25, -49], - [25, 49] + [-25, 49] ] }, "machine_heated_bed": { "default_value": true }, diff --git a/resources/definitions/tizyx_k25.def.json b/resources/definitions/tizyx_k25.def.json index 60005e8712..fbae8a657d 100644 --- a/resources/definitions/tizyx_k25.def.json +++ b/resources/definitions/tizyx_k25.def.json @@ -51,7 +51,7 @@ [25, 49], [25, -49], [-25, -49], - [25, 49] + [-25, 49] ] }, "machine_heated_bed": { "default_value": true }, From 719b11655ce3e002f04b065439ae3e80ab4e5d73 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 24 Aug 2023 11:24:21 +0200 Subject: [PATCH 092/126] Fix ctrl+z issues CURA-7951` --- cura/Arranging/Arranger.py | 4 ++-- cura/Arranging/GridArrange.py | 2 +- cura/Arranging/Nest2DArrange.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cura/Arranging/Arranger.py b/cura/Arranging/Arranger.py index 684fa1258b..fd93ab1846 100644 --- a/cura/Arranging/Arranger.py +++ b/cura/Arranging/Arranger.py @@ -5,7 +5,7 @@ if TYPE_CHECKING: class Arranger: - def createGroupOperationForArrange(self, add_new_nodes_in_scene: bool = True) -> Tuple["GroupedOperation", int]: + def createGroupOperationForArrange(self, add_new_nodes_in_scene: bool = False) -> Tuple["GroupedOperation", int]: """ Find placement for a set of scene nodes, but don't actually move them just yet. :param add_new_nodes_in_scene: Whether to create new scene nodes before applying the transformations and rotations @@ -16,7 +16,7 @@ class Arranger: """ raise NotImplementedError - def arrange(self, add_new_nodes_in_scene: bool = True) -> bool: + def arrange(self, add_new_nodes_in_scene: bool = False) -> bool: """ Find placement for a set of scene nodes, and move them by using a single grouped operation. :param add_new_nodes_in_scene: Whether to create new scene nodes before applying the transformations and rotations diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index 4866e99b69..9c7f0d31fb 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -37,7 +37,7 @@ class GridArrange(Arranger): self._initial_leftover_grid_x = math.floor(self._initial_leftover_grid_x) self._initial_leftover_grid_y = math.floor(self._initial_leftover_grid_y) - def createGroupOperationForArrange(self, add_new_nodes_in_scene: bool = True) -> Tuple[GroupedOperation, int]: + def createGroupOperationForArrange(self, add_new_nodes_in_scene: bool = False) -> Tuple[GroupedOperation, int]: # Find grid indexes that intersect with fixed objects fixed_nodes_grid_ids = set() for node in self._fixed_nodes: diff --git a/cura/Arranging/Nest2DArrange.py b/cura/Arranging/Nest2DArrange.py index ea45fe0b8e..bad57c5045 100644 --- a/cura/Arranging/Nest2DArrange.py +++ b/cura/Arranging/Nest2DArrange.py @@ -124,7 +124,7 @@ class Nest2DArrange(Arranger): return found_solution_for_all, node_items - def createGroupOperationForArrange(self, add_new_nodes_in_scene: bool = True) -> Tuple[GroupedOperation, int]: + def createGroupOperationForArrange(self, add_new_nodes_in_scene: bool = False) -> Tuple[GroupedOperation, int]: scene_root = Application.getInstance().getController().getScene().getRoot() found_solution_for_all, node_items = self.findNodePlacement() From 1591a2a0c37cd8dc7a443a6f14101ddbf6e605af Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Thu, 24 Aug 2023 11:48:43 +0200 Subject: [PATCH 093/126] ctrl+z for grid CURA-7951 --- cura/Arranging/GridArrange.py | 3 ++- cura/CuraActions.py | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index 9c7f0d31fb..c430de4d73 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -67,7 +67,8 @@ class GridArrange(Arranger): grouped_operation = GroupedOperation() for grid_id, node in zip(sequence, self._nodes_to_arrange): - grouped_operation.addOperation(AddSceneNodeOperation(node, scene_root)) + if add_new_nodes_in_scene: + grouped_operation.addOperation(AddSceneNodeOperation(node, scene_root)) grid_x, grid_y = grid_id operation = self.moveNodeOnGrid(node, grid_x, grid_y) grouped_operation.addOperation(operation) diff --git a/cura/CuraActions.py b/cura/CuraActions.py index 29f50d88b2..9a61a1c4f0 100644 --- a/cura/CuraActions.py +++ b/cura/CuraActions.py @@ -243,7 +243,7 @@ class CuraActions(QObject): # Add the new nodes to the scene, and arrange them arranger = GridArrange(nodes, application.getBuildVolume(), fixed_nodes) - group_operation, not_fit_count = arranger.createGroupOperationForArrange() + group_operation, not_fit_count = arranger.createGroupOperationForArrange(add_new_nodes_in_scene = True) group_operation.push() # deselect currently selected nodes, and select the new nodes From ac78de1227329a35b259cf76a391012cc0699ffc Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 24 Aug 2023 11:55:07 +0200 Subject: [PATCH 094/126] Updated comments CURA-7951 --- cura/Arranging/GridArrange.py | 69 ++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 17 deletions(-) diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index 23c14e248b..3b00f44ddc 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -118,11 +118,40 @@ class GridArrange(Arranger): return + # If there are multiple fixed nodes, an optimal solution is not always possible + # We will try to find an offset that minimizes the number of grid intersections + # with fixed nodes. The algorithm below achieves this by utilizing a scanline + # algorithm. In this algorithm each axis is solved separately as offsetting + # is completely independent in each axis. The comments explaining the algorithm + # below are for the x-axis, but the same applies for the y-axis. + # + # Each node either occupies ceil((node.right - node.right) / grid_width) or + # ceil((node.right - node.right) / grid_width) + 1 grid squares. We will call + # these the node's "footprint". + # + # ┌────────────────┐ + # minimum food print │ NODE │ + # └────────────────┘ + # │ grid 1 │ grid 2 │ grid 3 │ grid 4 | grid 5 | + # ┌────────────────┐ + # maximum food print │ NODE │ + # └────────────────┘ + # + # The algorithm will find the grid offset such that the number of nodes with + # a _minimal_ footprint is _maximized_. + + # The scanline algorithm works as follows, we create events for both end points + # of each node's footprint. The event have two properties, + # - the coordinate: the amount the endpoint can move to the + # left before it crosses a grid line + # - the change: either +1 or -1, indicating whether crossing the grid line + # would result in a minimal footprint node becoming a maximal footprint class Event: def __init__(self, coord: float, change: float): self.coord = coord self.change = change + # create events for both the horizontal and vertical axis events_horizontal: List[Event] = [] events_vertical: List[Event] = [] @@ -152,33 +181,39 @@ class GridArrange(Arranger): events_horizontal.sort(key=lambda event: event.coord) events_vertical.sort(key=lambda event: event.coord) - def findOptimalOffsetAxis(events: List[Event], interval: float) -> float: - prev_coord = events[-1].coord - interval + def findOptimalShiftAxis(events: List[Event], interval: float) -> float: + # executing the actual scanline algorithm + # iteratively go through events (left to right) and keep track of the + # current footprint. The optimal location is the one with the minimal + # footprint. If there are multiple locations with the same minimal + # footprint, the optimal location is the one with the largest range + # between the left and right endpoint of the footprint. + prev_offset = events[-1].coord - interval + current_minimal_footprint_count = 0 - current_offset = 0 - - best_offset = float('inf') - best_coord_length = float('-inf') - best_coord = 0.0 + best_minimal_footprint_count = float('inf') + best_offset_span = float('-inf') + best_offset = 0.0 for event in events: - coord_length = event.coord - prev_coord + offset_span = event.coord - prev_offset - if current_offset < best_offset or (current_offset == best_offset and coord_length > best_coord_length): - best_offset = current_offset - best_coord_length = coord_length - best_coord = event.coord + if current_minimal_footprint_count < best_minimal_footprint_count or ( + current_minimal_footprint_count == best_minimal_footprint_count and offset_span > best_offset_span): + best_minimal_footprint_count = current_minimal_footprint_count + best_offset_span = offset_span + best_offset = event.coord - current_offset += event.change - prev_coord = event.coord + current_minimal_footprint_count += event.change + prev_offset = event.coord - return best_coord - best_coord_length * 0.5 + return best_offset - best_offset_span * 0.5 center_grid_x = 0.5 * self._grid_width center_grid_y = 0.5 * self._grid_height - optimal_center_x = self._grid_width - findOptimalOffsetAxis(events_horizontal, self._grid_width) - optimal_center_y = self._grid_height - findOptimalOffsetAxis(events_vertical, self._grid_height) + optimal_center_x = self._grid_width - findOptimalShiftAxis(events_horizontal, self._grid_width) + optimal_center_y = self._grid_height - findOptimalShiftAxis(events_vertical, self._grid_height) self._offset_x = optimal_center_x - center_grid_x self._offset_y = optimal_center_y - center_grid_y From 34aa631531c55bf2e3b24e9ddb6bead061011f19 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Thu, 24 Aug 2023 16:13:39 +0200 Subject: [PATCH 095/126] Re-add arrange to CuraApplication CURA-7951 --- cura/CuraApplication.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 54b717b3d0..5f2770c3a2 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -114,6 +114,7 @@ from . import CameraAnimation from . import CuraActions from . import PlatformPhysics from . import PrintJobPreviewImageProvider +from .Arranging.Nest2DArrange import Nest2DArrange from .AutoSave import AutoSave from .Machines.Models.CompatibleMachineModel import CompatibleMachineModel from .Machines.Models.MachineListModel import MachineListModel @@ -1974,7 +1975,8 @@ class CuraApplication(QtApplication): if select_models_on_load: Selection.add(node) try: - arrange(nodes_to_arrange, self.getBuildVolume(), fixed_nodes) + arranger = Nest2DArrange(nodes_to_arrange, self.getBuildVolume(), fixed_nodes) + arranger.arrange() except: Logger.logException("e", "Failed to arrange the models") From e8c06ec7838efc89c0c17f30c67be6c02700d7ae Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Thu, 24 Aug 2023 16:34:34 +0200 Subject: [PATCH 096/126] grid arrange adjusted for disallowed area CURA-7951 --- cura/Arranging/GridArrange.py | 52 +++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index 3b00f44ddc..a049c20c82 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -54,6 +54,11 @@ class GridArrange(Arranger): self._fixed_nodes_grid_ids = self._fixed_nodes_grid_ids.union( self.intersectingGridIdxInclusive(node.getBoundingBox())) + #grid indexes that are in disallowed area + for polygon in self._build_volume.getDisallowedAreas(): + self._fixed_nodes_grid_ids = self._fixed_nodes_grid_ids.union( + self._getIntersectingGridIdForPolygon(polygon)) + self._build_plate_grid_ids = self.intersectingGridIdxExclusive(self._build_volume_bounding_box) # Filter out the corner grid squares if the build plate shape is elliptic @@ -241,6 +246,32 @@ class GridArrange(Arranger): grid_x2, grid_y2 = self.coordSpaceToGridSpace(coord_x2, coord_y2) return grid_x1, grid_y1, grid_x2, grid_y2 + def _getIntersectingGridIdForPolygon(self, polygon)-> Set[Tuple[int, int]]: + # (x0, y0) + # | + # v + # ┌─────────────┐ + # │ │ + # │ │ + # └─────────────┘ < (x1, y1) + x0 = float('inf') + y0 = float('inf') + x1 = float('-inf') + y1 = float('-inf') + grid_idx = set() + for [x, y] in polygon.getPoints(): + x0 = min(x0, x) + y0 = min(y0, y) + x1 = max(x1, x) + y1 = max(y1, y) + grid_x1, grid_y1 = self.coordSpaceToGridSpace(x0, y0) + grid_x2, grid_y2 = self.coordSpaceToGridSpace(x1, y1) + + for grid_x in range(math.floor(grid_x1), math.ceil(grid_x2)): + for grid_y in range(math.floor(grid_y1), math.ceil(grid_y2)): + grid_idx.add((grid_x, grid_y)) + return grid_idx + def intersectingGridIdxInclusive(self, bounding_box: "BoundingVolume") -> Set[Tuple[int, int]]: grid_x1, grid_y1, grid_x2, grid_y2 = self._getGridCornerPoints(bounding_box) grid_idx = set() @@ -326,8 +357,25 @@ class GridArrange(Arranger): /> """) - for grid_x in range(-10, 10): - for grid_y in range(-10, 10): + for polygon in self._build_volume.getDisallowedAreas(): + # Extract individual points and convert them to tuples + + path_data = "" + for [x,y] in polygon.getPoints(): + path_data += f"{x},{y} " + + f.write( + f""" + + """) + + for grid_x in range(-10, 100): + for grid_y in range(-10, 100): if (grid_x, grid_y) in self._allowed_grid_idx: fill_color = "rgba(0, 255, 0, 0.5)" elif (grid_x, grid_y) in self._build_plate_grid_ids: From 281e543255f7eeb44993ce8f2b799f681c90bde9 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Fri, 25 Aug 2023 11:27:54 +0200 Subject: [PATCH 097/126] Remove exported file after fail CURA-10180 --- .../RemovableDriveOutputDevice.py | 63 ++++++++++--------- 1 file changed, 35 insertions(+), 28 deletions(-) diff --git a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py index e93473c25f..8c0c50d0b4 100644 --- a/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py +++ b/plugins/RemovableDriveOutputDevice/RemovableDriveOutputDevice.py @@ -1,6 +1,7 @@ # Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import os import os.path from UM.Application import Application @@ -143,38 +144,44 @@ class RemovableDriveOutputDevice(OutputDevice): def _onFinished(self, job): if self._stream: - # Explicitly closing the stream flushes the write-buffer + error = job.getError() try: + # Explicitly closing the stream flushes the write-buffer self._stream.close() - self._stream = None - except: - Logger.logException("w", "An exception occurred while trying to write to removable drive.") - message = Message(catalog.i18nc("@info:status", "Could not save to removable drive {0}: {1}").format(self.getName(),str(job.getError())), - title = catalog.i18nc("@info:title", "Error"), - message_type = Message.MessageType.ERROR) + except Exception as e: + if not error: + # Only log new error if there was no previous one + error = e + + self._stream = None + self._writing = False + self.writeFinished.emit(self) + + if not error: + message = Message( + catalog.i18nc("@info:status", "Saved to Removable Drive {0} as {1}").format(self.getName(), + os.path.basename( + job.getFileName())), + title=catalog.i18nc("@info:title", "File Saved"), + message_type=Message.MessageType.POSITIVE) + message.addAction("eject", catalog.i18nc("@action:button", "Eject"), "eject", + catalog.i18nc("@action", "Eject removable device {0}").format(self.getName())) + message.actionTriggered.connect(self._onActionTriggered) + message.show() + self.writeSuccess.emit(self) + else: + try: + os.remove(job.getFileName()) + except Exception as e: + Logger.logException("e", "Exception when trying to remove incomplete exported file %s", + str(job.getFileName())) + message = Message(catalog.i18nc("@info:status", + "Could not save to removable drive {0}: {1}").format(self.getName(), + str(job.getError())), + title=catalog.i18nc("@info:title", "Error"), + message_type=Message.MessageType.ERROR) message.show() self.writeError.emit(self) - return - - self._writing = False - self.writeFinished.emit(self) - if job.getResult(): - message = Message(catalog.i18nc("@info:status", "Saved to Removable Drive {0} as {1}").format(self.getName(), os.path.basename(job.getFileName())), - title = catalog.i18nc("@info:title", "File Saved"), - message_type = Message.MessageType.POSITIVE) - message.addAction("eject", catalog.i18nc("@action:button", "Eject"), "eject", catalog.i18nc("@action", "Eject removable device {0}").format(self.getName())) - message.actionTriggered.connect(self._onActionTriggered) - message.show() - self.writeSuccess.emit(self) - else: - message = Message(catalog.i18nc("@info:status", - "Could not save to removable drive {0}: {1}").format(self.getName(), - str(job.getError())), - title = catalog.i18nc("@info:title", "Error"), - message_type = Message.MessageType.ERROR) - message.show() - self.writeError.emit(self) - job.getStream().close() def _onActionTriggered(self, message, action): if action == "eject": From 9129a526ba25414570039a12efca3b699c706d43 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Mon, 21 Aug 2023 10:06:51 +0200 Subject: [PATCH 098/126] improve number of iterations CURA-10685 --- cura/Settings/CuraFormulaFunctions.py | 8 ++++---- resources/definitions/fdmprinter.def.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cura/Settings/CuraFormulaFunctions.py b/cura/Settings/CuraFormulaFunctions.py index fd6555e679..8dd96cc03e 100644 --- a/cura/Settings/CuraFormulaFunctions.py +++ b/cura/Settings/CuraFormulaFunctions.py @@ -101,10 +101,10 @@ class CuraFormulaFunctions: def getAnyExtruderPositionWithOrDefault(self, filter_key: str, context: Optional["PropertyEvaluationContext"] = None) -> str: for extruder in self._getActiveExtruders(context): - value = extruder.getRawProperty(filter_key, "value", context=context) - if value is None or not value: - continue - return str(extruder.position) + material_container = extruder.material + value = material_container.getProperty(filter_key, "value", context) + if value is not None: + return extruder.position return self.getDefaultExtruderPosition() # Get the resolve value or value for a given key. diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index ccd92c9ba3..2f4b8cc3e2 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4500,7 +4500,7 @@ "type": "extruder", "default_value": "0", "enabled": "(support_enable or support_meshes_present) and extruders_enabled_count > 1", - "value": "int(defaultExtruderPosition())", + "value": "int(anyExtruderNrWithOrDefault('material_is_support_material'))", "settable_per_mesh": false, "settable_per_extruder": false, "children": From ab8b7c3ab560a84a98476e1b1d04bafde096b85f Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Fri, 25 Aug 2023 15:46:30 +0200 Subject: [PATCH 099/126] name changes CURA-10685 --- cura/CuraApplication.py | 2 +- cura/Settings/CuraFormulaFunctions.py | 6 +++--- docs/profiles/getting_a_setting_value.md | 2 +- resources/definitions/fdmprinter.def.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 64d88d13dc..f44393657f 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -409,7 +409,7 @@ class CuraApplication(QtApplication): SettingFunction.registerOperator("extruderValue", self._cura_formula_functions.getValueInExtruder) SettingFunction.registerOperator("extruderValues", self._cura_formula_functions.getValuesInAllExtruders) - SettingFunction.registerOperator("anyExtruderNrWithOrDefault", self._cura_formula_functions.getAnyExtruderPositionWithOrDefault) + SettingFunction.registerOperator("anyExtruderWithMaterial", self._cura_formula_functions.getExtruderPositionWithMaterial) SettingFunction.registerOperator("resolveOrValue", self._cura_formula_functions.getResolveOrValue) SettingFunction.registerOperator("defaultExtruderPosition", self._cura_formula_functions.getDefaultExtruderPosition) SettingFunction.registerOperator("valueFromContainer", self._cura_formula_functions.getValueFromContainerAtIndex) diff --git a/cura/Settings/CuraFormulaFunctions.py b/cura/Settings/CuraFormulaFunctions.py index 8dd96cc03e..08c24180bb 100644 --- a/cura/Settings/CuraFormulaFunctions.py +++ b/cura/Settings/CuraFormulaFunctions.py @@ -97,14 +97,14 @@ class CuraFormulaFunctions: return result - # Get the first extruder that adheres to a specific (boolean) property, like 'material_is_support_material'. - def getAnyExtruderPositionWithOrDefault(self, filter_key: str, + # Get the first extruder with material that adheres to a specific (boolean) property, like 'material_is_support_material'. + def getExtruderPositionWithMaterial(self, filter_key: str, context: Optional["PropertyEvaluationContext"] = None) -> str: for extruder in self._getActiveExtruders(context): material_container = extruder.material value = material_container.getProperty(filter_key, "value", context) if value is not None: - return extruder.position + return str(extruder.position) return self.getDefaultExtruderPosition() # Get the resolve value or value for a given key. diff --git a/docs/profiles/getting_a_setting_value.md b/docs/profiles/getting_a_setting_value.md index bd106eb2da..ab18be0f42 100644 --- a/docs/profiles/getting_a_setting_value.md +++ b/docs/profiles/getting_a_setting_value.md @@ -54,7 +54,7 @@ There are also a few extra things that can be used in these expressions: * The function `extruderValue(extruder, key)` will evaluate a particular setting for a particular extruder. * The function `resolveOrValue(key)` will perform the full setting evaluation as described in this document for the current context (so if this setting is being evaluated for the second extruder it would perform it as if coming from the second extruder). * The function `defaultExtruderPosition()` will get the first extruder that is not disabled. For instance, if a printer has three extruders but the first is disabled, this would return `1` to indicate the second extruder (0-indexed). -* The function `anyExtruderNrWithOrDefault(key)` will filter the list of extruders on the key, and then give the first index for which it is true, or if none of them are, the default one as specified by the 'default extruder position' function above. +* The function `anyExtruderWithMaterial(key)` will filter the list of extruders on the key of material quality, and then give the first index for which it is true, or if none of them are, the default one as specified by the 'default extruder position' function above. * The function `valueFromContainer(key, index)` will get a setting value from the global stack, but skip the first few containers in that stack. It will skip until it reaches a particular index in the container stack. * The function `extruderValueFromContainer(key, index)` will get a setting value from the current extruder stack, but skip the first few containers in that stack. It will skip until it reaches a particular index in the container stack. diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 2f4b8cc3e2..40d1eb3b1c 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4500,7 +4500,7 @@ "type": "extruder", "default_value": "0", "enabled": "(support_enable or support_meshes_present) and extruders_enabled_count > 1", - "value": "int(anyExtruderNrWithOrDefault('material_is_support_material'))", + "value": "int(anyExtruderWithMaterial('material_is_support_material'))", "settable_per_mesh": false, "settable_per_extruder": false, "children": From 711b4401007cbbcf7455c60114a63d8ee7976049 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Mon, 28 Aug 2023 12:42:16 +0200 Subject: [PATCH 100/126] Update conan version CURA-10446 --- .github/workflows/requirements-conan-package.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/requirements-conan-package.txt b/.github/workflows/requirements-conan-package.txt index 26d167db2b..6b4d4cffc8 100644 --- a/.github/workflows/requirements-conan-package.txt +++ b/.github/workflows/requirements-conan-package.txt @@ -1,2 +1,2 @@ -conan==1.56.0 +conan==1.60.2 sip From 0362f8abe6af827d2af04190ed1628b2a9532879 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Mon, 28 Aug 2023 14:42:04 +0200 Subject: [PATCH 101/126] Revert "Update conan version" This reverts commit 711b4401007cbbcf7455c60114a63d8ee7976049. --- .github/workflows/requirements-conan-package.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/requirements-conan-package.txt b/.github/workflows/requirements-conan-package.txt index 6b4d4cffc8..26d167db2b 100644 --- a/.github/workflows/requirements-conan-package.txt +++ b/.github/workflows/requirements-conan-package.txt @@ -1,2 +1,2 @@ -conan==1.60.2 +conan==1.56.0 sip From 0e67ff38c2655b5240657500ee964811a67db3f6 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 28 Aug 2023 15:19:45 +0200 Subject: [PATCH 102/126] Update windows.yml --- .github/workflows/windows.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 88d9d84e94..df9056d454 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -124,6 +124,11 @@ jobs: - name: Create the Packages (Powershell) run: conan install $Env:CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$Env:ENTERPRISE -o cura:staging=$Env:STAGING --json "cura_inst/conan_install_info.json" + - name: Upload the Package(s) + if: always() + run: | + conan upload "*" -r cura --all -c + - name: Set Environment variables for Cura (Powershell) run: | echo "${Env:WIX}\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append @@ -262,4 +267,4 @@ jobs: success_body: "Installers for ${{ inputs.cura_conan_version }}" failure_title: "Failed to create the Cura distributions" failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}" - secrets: inherit \ No newline at end of file + secrets: inherit From 2b39c73d56312663a5e6050787e9258ff827225f Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 28 Aug 2023 15:20:17 +0200 Subject: [PATCH 103/126] Update linux.yml --- .github/workflows/linux.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 4d58dcee34..5a18199e3c 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -154,6 +154,11 @@ jobs: - name: Create the Packages (Bash) run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING --json "cura_inst/conan_install_info.json" + - name: Upload the Package(s) + if: always() + run: | + conan upload "*" -r cura --all -c + - name: Set Environment variables for Cura (bash) run: | . ./cura_inst/bin/activate_github_actions_env.sh From 608878d7be4d7ecd6ff3a42890c3bc8b9447ee46 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 28 Aug 2023 15:21:09 +0200 Subject: [PATCH 104/126] Update macos.yml --- .github/workflows/macos.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 4690d27878..af1fc3d12b 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -154,6 +154,11 @@ jobs: - name: Create the Packages (Bash) run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING --json "cura_inst/conan_install_info.json" + - name: Upload the Package(s) + if: always() + run: | + conan upload "*" -r cura --all -c + - name: Set Environment variables for Cura (bash) run: | . ./cura_inst/bin/activate_github_actions_env.sh From 7671705c1619f8439056c22d121dcbb6d35ce1cd Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 28 Aug 2023 16:35:27 +0200 Subject: [PATCH 105/126] Update requirements-conan-package.txt --- .github/workflows/requirements-conan-package.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/requirements-conan-package.txt b/.github/workflows/requirements-conan-package.txt index 26d167db2b..5efbf3f18b 100644 --- a/.github/workflows/requirements-conan-package.txt +++ b/.github/workflows/requirements-conan-package.txt @@ -1,2 +1,2 @@ conan==1.56.0 -sip +sip==6.7.9 From d70b209288acf9ade307666823681eba36f2d531 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Mon, 28 Aug 2023 17:32:03 +0200 Subject: [PATCH 106/126] Update requirements-conan-package.txt --- .github/workflows/requirements-conan-package.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/requirements-conan-package.txt b/.github/workflows/requirements-conan-package.txt index 5efbf3f18b..48121932b8 100644 --- a/.github/workflows/requirements-conan-package.txt +++ b/.github/workflows/requirements-conan-package.txt @@ -1,2 +1,2 @@ conan==1.56.0 -sip==6.7.9 +sip==6.7.1 From 3d48e51ac2c55e3852598d7261bd7f1439027cb7 Mon Sep 17 00:00:00 2001 From: Jelle Spijker Date: Tue, 29 Aug 2023 07:53:35 +0200 Subject: [PATCH 107/126] Update requirements-conan-package.txt --- .github/workflows/requirements-conan-package.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/requirements-conan-package.txt b/.github/workflows/requirements-conan-package.txt index 48121932b8..6b4d4cffc8 100644 --- a/.github/workflows/requirements-conan-package.txt +++ b/.github/workflows/requirements-conan-package.txt @@ -1,2 +1,2 @@ -conan==1.56.0 -sip==6.7.1 +conan==1.60.2 +sip From ef4665a55f24ddb842deab5815b891bda385ee62 Mon Sep 17 00:00:00 2001 From: saumyaj3 Date: Tue, 29 Aug 2023 11:12:17 +0000 Subject: [PATCH 108/126] Applied printer-linter format --- .../matterhackers_pulsexe_e444m.def.json | 120 +++++++++--------- 1 file changed, 59 insertions(+), 61 deletions(-) diff --git a/resources/definitions/matterhackers_pulsexe_e444m.def.json b/resources/definitions/matterhackers_pulsexe_e444m.def.json index 05757b0679..fc5d4f6dda 100644 --- a/resources/definitions/matterhackers_pulsexe_e444m.def.json +++ b/resources/definitions/matterhackers_pulsexe_e444m.def.json @@ -1,62 +1,60 @@ -{ - "version": 2, - "name": "Pulse XE E-444M", - "inherits": "fdmprinter", - "metadata": - { - "visible": true, - "author": "Zwitch Guitars", - "manufacturer": "MatterHackers", - "file_formats": "text/x-gcode", - "has_materials": true, - "has_variants": false, - "has_machine_quality": false, - "preferred_material": "generic_pla", - "preferred_quality_type": "normal", - "first_start_actions": [ "MachineSettingsAction" ], - "machine_extruder_trains": - { - "0": "matterhackers_extruder" - } - }, - "overrides": - { - "machine_name": { "default_value": "Pulse XE E-444M" }, - "machine_gcode_flavor": { "default_value": "Marlin" }, - "machine_depth": { "default_value": 220 }, - "machine_height": { "default_value": 215 }, - "machine_width": { "default_value": 250 }, - "gantry_height": { "value": 23 }, - "machine_heated_bed": { "default_value": true }, - "machine_head_with_fans_polygon": - { - "default_value": [[-28, 45], [-28, -18], [40, 45], [40, -18]] - }, - "machine_steps_per_mm_x": {"value": 80}, - "machine_steps_per_mm_y": {"value": 80}, - "machine_steps_per_mm_z": {"value": 400}, - "machine_steps_per_mm_e": {"value": 415}, - "machine_max_feedrate_x": {"value": 300}, - "machine_max_feedrate_y": {"value": 300}, - "machine_max_feedrate_z": {"value": 30}, - "machine_max_feedrate_e": {"value": 75}, - "machine_acceleration": {"value": 1300}, - "material_diameter": { "value": 1.75 }, - - "adhesion_type": { "value": "skirt" }, - "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, - "cool_min_layer_time": { "value": 10 }, - "z_seam_type": { "value": "back" }, - "travel_retract_before_outer_wall": { "value": true }, - "optimize_wall_printing_order": { "value": true }, - "top_bottom_thickness": { "value": "layer_height_0 + layer_height * 3" }, - "wall_thickness": { "value": "line_width * 2" }, - - "speed_print": { "value": 50 }, - "speed_layer_0": { "value": 20.0 }, - - "machine_start_gcode": { "default_value": "G21 ; set units to millimeters\nG90 ; use absolute positioning\nM82 ; absolute extrusion mode\nG28 ; home axes\nM104 S{material_print_temperature_layer_0} ; set extruder temp\nM140 S{material_bed_temperature_layer_0} ; set bed temp\nM190 S{material_bed_temperature_layer_0} ; wait for bed temp\nM109 S{material_print_temperature_layer_0} ; wait for extruder temp\nG29 ; mesh bed leveling\n\nG92 E0\nG1 X5 Y5 Z0.8 F1800\nG1 X100 Z0.3 E25 F900\nG92 E0\nG1 E-2 F2400"}, - "machine_end_gcode": { "default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y{machine_depth}; home X axis and push Y forward\nG28 Z0\nM84 ; disable motors" } - - } +{ + "version": 2, + "name": "Pulse XE E-444M", + "inherits": "fdmprinter", + "metadata": + { + "visible": true, + "author": "Zwitch Guitars", + "manufacturer": "MatterHackers", + "file_formats": "text/x-gcode", + "first_start_actions": [ "MachineSettingsAction" ], + "has_machine_quality": false, + "has_materials": true, + "has_variants": false, + "machine_extruder_trains": { "0": "matterhackers_extruder" }, + "preferred_material": "generic_pla", + "preferred_quality_type": "normal" + }, + "overrides": + { + "adhesion_type": { "value": "skirt" }, + "cool_fan_full_at_height": { "value": "layer_height_0 + 2 * layer_height" }, + "cool_min_layer_time": { "value": 10 }, + "gantry_height": { "value": 23 }, + "machine_acceleration": { "value": 1300 }, + "machine_depth": { "default_value": 220 }, + "machine_end_gcode": { "default_value": "M104 S0 ; turn off extruder\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y{machine_depth}; home X axis and push Y forward\nG28 Z0\nM84 ; disable motors" }, + "machine_gcode_flavor": { "default_value": "Marlin" }, + "machine_head_with_fans_polygon": + { + "default_value": [ + [-28, 45], + [-28, -18], + [40, 45], + [40, -18] + ] + }, + "machine_heated_bed": { "default_value": true }, + "machine_height": { "default_value": 215 }, + "machine_max_feedrate_e": { "value": 75 }, + "machine_max_feedrate_x": { "value": 300 }, + "machine_max_feedrate_y": { "value": 300 }, + "machine_max_feedrate_z": { "value": 30 }, + "machine_name": { "default_value": "Pulse XE E-444M" }, + "machine_start_gcode": { "default_value": "G21 ; set units to millimeters\nG90 ; use absolute positioning\nM82 ; absolute extrusion mode\nG28 ; home axes\nM104 S{material_print_temperature_layer_0} ; set extruder temp\nM140 S{material_bed_temperature_layer_0} ; set bed temp\nM190 S{material_bed_temperature_layer_0} ; wait for bed temp\nM109 S{material_print_temperature_layer_0} ; wait for extruder temp\nG29 ; mesh bed leveling\n\nG92 E0\nG1 X5 Y5 Z0.8 F1800\nG1 X100 Z0.3 E25 F900\nG92 E0\nG1 E-2 F2400" }, + "machine_steps_per_mm_e": { "value": 415 }, + "machine_steps_per_mm_x": { "value": 80 }, + "machine_steps_per_mm_y": { "value": 80 }, + "machine_steps_per_mm_z": { "value": 400 }, + "machine_width": { "default_value": 250 }, + "material_diameter": { "value": 1.75 }, + "optimize_wall_printing_order": { "value": true }, + "speed_layer_0": { "value": 20.0 }, + "speed_print": { "value": 50 }, + "top_bottom_thickness": { "value": "layer_height_0 + layer_height * 3" }, + "travel_retract_before_outer_wall": { "value": true }, + "wall_thickness": { "value": "line_width * 2" }, + "z_seam_type": { "value": "back" } + } } \ No newline at end of file From 6e045e8b37619cea7ff484e6e99b857637204f8c Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Tue, 29 Aug 2023 14:11:36 +0200 Subject: [PATCH 109/126] Put back `getAnyExtruderPositionWithOrDefault` api function CURA-10685 --- cura/CuraApplication.py | 2 ++ cura/Settings/CuraFormulaFunctions.py | 9 +++++++++ docs/profiles/getting_a_setting_value.md | 3 +++ 3 files changed, 14 insertions(+) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index f44393657f..0de3ccc780 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -410,6 +410,8 @@ class CuraApplication(QtApplication): SettingFunction.registerOperator("extruderValue", self._cura_formula_functions.getValueInExtruder) SettingFunction.registerOperator("extruderValues", self._cura_formula_functions.getValuesInAllExtruders) SettingFunction.registerOperator("anyExtruderWithMaterial", self._cura_formula_functions.getExtruderPositionWithMaterial) + SettingFunction.registerOperator("anyExtruderNrWithOrDefault", + self._cura_formula_functions.getAnyExtruderPositionWithOrDefault) SettingFunction.registerOperator("resolveOrValue", self._cura_formula_functions.getResolveOrValue) SettingFunction.registerOperator("defaultExtruderPosition", self._cura_formula_functions.getDefaultExtruderPosition) SettingFunction.registerOperator("valueFromContainer", self._cura_formula_functions.getValueFromContainerAtIndex) diff --git a/cura/Settings/CuraFormulaFunctions.py b/cura/Settings/CuraFormulaFunctions.py index 08c24180bb..d7b6228e09 100644 --- a/cura/Settings/CuraFormulaFunctions.py +++ b/cura/Settings/CuraFormulaFunctions.py @@ -97,6 +97,15 @@ class CuraFormulaFunctions: return result + # Get the first extruder that adheres to a specific (boolean) property, like 'material_is_support_material'. + def getAnyExtruderPositionWithOrDefault(self, filter_key: str, + context: Optional["PropertyEvaluationContext"] = None) -> str: + for extruder in self._getActiveExtruders(context): + value = extruder.getRawProperty(filter_key, "value", context=context) + if value is None or not value: + continue + return str(extruder.position) + # Get the first extruder with material that adheres to a specific (boolean) property, like 'material_is_support_material'. def getExtruderPositionWithMaterial(self, filter_key: str, context: Optional["PropertyEvaluationContext"] = None) -> str: diff --git a/docs/profiles/getting_a_setting_value.md b/docs/profiles/getting_a_setting_value.md index ab18be0f42..7cd912ac45 100644 --- a/docs/profiles/getting_a_setting_value.md +++ b/docs/profiles/getting_a_setting_value.md @@ -54,6 +54,9 @@ There are also a few extra things that can be used in these expressions: * The function `extruderValue(extruder, key)` will evaluate a particular setting for a particular extruder. * The function `resolveOrValue(key)` will perform the full setting evaluation as described in this document for the current context (so if this setting is being evaluated for the second extruder it would perform it as if coming from the second extruder). * The function `defaultExtruderPosition()` will get the first extruder that is not disabled. For instance, if a printer has three extruders but the first is disabled, this would return `1` to indicate the second extruder (0-indexed). +* The function `anyExtruderNrWithOrDefault(key)` will filter the list of extruders on the key, and then give the first + index for which it is true, or if none of them are, the default one as specified by the 'default extruder position' + function above. * The function `anyExtruderWithMaterial(key)` will filter the list of extruders on the key of material quality, and then give the first index for which it is true, or if none of them are, the default one as specified by the 'default extruder position' function above. * The function `valueFromContainer(key, index)` will get a setting value from the global stack, but skip the first few containers in that stack. It will skip until it reaches a particular index in the container stack. * The function `extruderValueFromContainer(key, index)` will get a setting value from the current extruder stack, but skip the first few containers in that stack. It will skip until it reaches a particular index in the container stack. From 0397095789dad159e6ff25eae06a31cbe679941a Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 29 Aug 2023 15:18:59 +0200 Subject: [PATCH 110/126] pyarcus pynest2d and pysavitar version changed conan build fix --- conanfile.py | 66 +++++++++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/conanfile.py b/conanfile.py index 77cecf1134..3c836dae2a 100644 --- a/conanfile.py +++ b/conanfile.py @@ -10,7 +10,7 @@ from conan.tools.env import VirtualRunEnv, Environment, VirtualBuildEnv from conan.tools.scm import Version from conan.errors import ConanInvalidConfiguration, ConanException -required_conan_version = ">=1.54 <=1.56.0 || >=1.58.0 <2.0.0" +required_conan_version = ">=1.58.0 <2.0.0" class CuraConan(ConanFile): @@ -293,6 +293,7 @@ class CuraConan(ConanFile): self.options["pysavitar"].shared = True self.options["pynest2d"].shared = True self.options["cpython"].shared = True + self.options["boost"].header_only = True def validate(self): version = self.conf_info.get("user.cura:version", default = self.version, check_type = str) @@ -300,10 +301,11 @@ class CuraConan(ConanFile): raise ConanInvalidConfiguration("Only versions 5+ are support") def requirements(self): - self.requires("pyarcus/5.2.2") + self.requires("boost/1.82.0") + self.requires("pyarcus/(latest)@ultimaker/cura_10951") self.requires("curaengine/(latest)@ultimaker/testing") - self.requires("pysavitar/5.2.2") - self.requires("pynest2d/5.2.2") + self.requires("pysavitar/(latest)@ultimaker/cura_10951") + self.requires("pynest2d/(latest)@ultimaker/cura_10951") self.requires("uranium/(latest)@ultimaker/testing") self.requires("cura_binary_data/(latest)@ultimaker/testing") self.requires("cpython/3.10.4") @@ -338,7 +340,38 @@ class CuraConan(ConanFile): vr.generate() self._generate_cura_version(os.path.join(self.source_folder, "cura")) + self._generate_about_versions(os.path.join(self.source_folder, "resources","qml", "Dialogs")) + if not self.in_local_cache: + # Copy CuraEngine.exe to bindirs of Virtual Python Environment + curaengine = self.dependencies["curaengine"].cpp_info + copy(self, "CuraEngine.exe", curaengine.bindirs[0], self.source_folder, keep_path = False) + copy(self, "CuraEngine", curaengine.bindirs[0], self.source_folder, keep_path = False) + + # Copy resources of cura_binary_data + cura_binary_data = self.dependencies["cura_binary_data"].cpp_info + copy(self, "*", cura_binary_data.resdirs[0], str(self._share_dir.joinpath("cura")), keep_path = True) + copy(self, "*", cura_binary_data.resdirs[1], str(self._share_dir.joinpath("uranium")), keep_path = True) + if self.settings.os == "Windows": + copy(self, "*", cura_binary_data.resdirs[2], str(self._share_dir.joinpath("windows")), keep_path = True) + + for dependency in self.dependencies.host.values(): + for bindir in dependency.cpp_info.bindirs: + copy(self, "*.dll", bindir, str(self._site_packages), keep_path = False) + for libdir in dependency.cpp_info.libdirs: + copy(self, "*.pyd", libdir, str(self._site_packages), keep_path = False) + copy(self, "*.pyi", libdir, str(self._site_packages), keep_path = False) + copy(self, "*.dylib", libdir, str(self._base_dir.joinpath("lib")), keep_path = False) + + # Copy materials (flat) + rmdir(self, os.path.join(self.source_folder, "resources", "materials")) + fdm_materials = self.dependencies["fdm_materials"].cpp_info + copy(self, "*", fdm_materials.resdirs[0], str(self._share_dir.joinpath("cura"))) + + # Copy internal resources + if self.options.internal: + cura_private_data = self.dependencies["cura_private_data"].cpp_info + copy(self, "*", cura_private_data.resdirs[0], str(self._share_dir.joinpath("cura"))) if self.options.devtools: entitlements_file = "'{}'".format(os.path.join(self.source_folder, "packaging", "MacOS", "cura.entitlements")) @@ -357,8 +390,6 @@ class CuraConan(ConanFile): pot = self.python_requires["translationextractor"].module.ExtractTranslations(self, cpp_info.bindirs[0]) pot.generate() - self._generate_about_versions(os.path.join(self.source_folder, "resources","qml", "Dialogs")) - def build(self): if self.options.devtools: if self.settings.os != "Windows" or self.conf.get("tools.microsoft.bash:path", check_type = str): @@ -370,29 +401,6 @@ class CuraConan(ConanFile): cpp_info = self.dependencies["gettext"].cpp_info self.run(f"{cpp_info.bindirs[0]}/msgfmt {po_file} -o {mo_file} -f", env="conanbuild", ignore_errors=True) - def imports(self): - self.copy("CuraEngine.exe", root_package = "curaengine", src = "@bindirs", dst = "", keep_path = False) - self.copy("CuraEngine", root_package = "curaengine", src = "@bindirs", dst = "", keep_path = False) - - rmdir(self, os.path.join(self.source_folder, "resources", "materials")) - self.copy("*.fdm_material", root_package = "fdm_materials", src = "@resdirs", dst = "resources/materials", keep_path = False) - self.copy("*.sig", root_package = "fdm_materials", src = "@resdirs", dst = "resources/materials", keep_path = False) - - if self.options.internal: - self.copy("*", root_package = "cura_private_data", src = self.deps_cpp_info["cura_private_data"].resdirs[0], - dst = self._share_dir.joinpath("cura", "resources"), keep_path = True) - - # Copy resources of cura_binary_data - self.copy("*", root_package = "cura_binary_data", src = self.deps_cpp_info["cura_binary_data"].resdirs[0], - dst = self._share_dir.joinpath("cura", "resources"), keep_path = True) - self.copy("*", root_package = "cura_binary_data", src = self.deps_cpp_info["cura_binary_data"].resdirs[1], - dst =self._share_dir.joinpath("uranium", "resources"), keep_path = True) - - self.copy("*.dll", src = "@bindirs", dst = self._site_packages) - self.copy("*.pyd", src = "@libdirs", dst = self._site_packages) - self.copy("*.pyi", src = "@libdirs", dst = self._site_packages) - self.copy("*.dylib", src = "@libdirs", dst = self._script_dir) - def deploy(self): # Copy CuraEngine.exe to bindirs of Virtual Python Environment curaengine = self.dependencies["curaengine"].cpp_info From d80e349f0b22985b027ecd376242cf0b5b4f1652 Mon Sep 17 00:00:00 2001 From: "saumya.jain" Date: Tue, 29 Aug 2023 15:27:47 +0200 Subject: [PATCH 111/126] source_folder as root for materials conan build fix --- conanfile.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index 3c836dae2a..1ab7d939af 100644 --- a/conanfile.py +++ b/conanfile.py @@ -366,7 +366,7 @@ class CuraConan(ConanFile): # Copy materials (flat) rmdir(self, os.path.join(self.source_folder, "resources", "materials")) fdm_materials = self.dependencies["fdm_materials"].cpp_info - copy(self, "*", fdm_materials.resdirs[0], str(self._share_dir.joinpath("cura"))) + copy(self, "*", fdm_materials.resdirs[0], self.source_folder) # Copy internal resources if self.options.internal: From cfc4db00a533dafd5237e26de488e58c192e4482 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Wed, 30 Aug 2023 12:41:53 +0200 Subject: [PATCH 112/126] Use descriptive variable name instead of magic number CURA-7951 --- cura/Arranging/GridArrange.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index a049c20c82..d046114fab 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -35,8 +35,9 @@ class GridArrange(Arranger): self._grid_height += self._margin_y # Round up the grid size to the nearest cm - self._grid_width = math.ceil(self._grid_width / 10) * 10 - self._grid_height = math.ceil(self._grid_height / 10) * 10 + grid_precision = 10 # 1cm + self._grid_width = math.ceil(self._grid_width / grid_precision) * grid_precision + self._grid_height = math.ceil(self._grid_height / grid_precision) * grid_precision self._offset_x = 0 self._offset_y = 0 From b3b5ffbf5530ed21b351aaf2ea0e70234d0c0148 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Wed, 30 Aug 2023 12:45:34 +0200 Subject: [PATCH 113/126] Put try catch around actual arranging `arrange` is the function that _could_ fail CURA-7951 --- cura/Arranging/ArrangeObjectsJob.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/cura/Arranging/ArrangeObjectsJob.py b/cura/Arranging/ArrangeObjectsJob.py index b1e0432786..48d2436482 100644 --- a/cura/Arranging/ArrangeObjectsJob.py +++ b/cura/Arranging/ArrangeObjectsJob.py @@ -32,17 +32,18 @@ class ArrangeObjectsJob(Job): title = i18n_catalog.i18nc("@info:title", "Finding Location")) status_message.show() + if self._grid_arrange: + arranger = GridArrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes) + else: + arranger = Nest2DArrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes, + factor=1000) + + found_solution_for_all = False try: - if self._grid_arrange: - arranger = GridArrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes) - else: - arranger = Nest2DArrange(self._nodes, Application.getInstance().getBuildVolume(), self._fixed_nodes, - factor=1000) - found_solution_for_all = arranger.arrange() - except: # If the thread crashes, the message should still close - Logger.logException("e", "Unable to arrange the objects on the buildplate. The arrange algorithm has crashed.") + Logger.logException("e", + "Unable to arrange the objects on the buildplate. The arrange algorithm has crashed.") status_message.hide() From 38a5754c6fd9b32a5fe080eb225367eac51b5452 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Wed, 30 Aug 2023 12:47:56 +0200 Subject: [PATCH 114/126] Mark method functions as private CURA-7951 --- cura/Arranging/GridArrange.py | 36 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index d046114fab..d2eace3c26 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -45,7 +45,8 @@ class GridArrange(Arranger): coord_initial_leftover_x = self._build_volume_bounding_box.right + 2 * self._grid_width coord_initial_leftover_y = (self._build_volume_bounding_box.back + self._build_volume_bounding_box.front) * 0.5 - self._initial_leftover_grid_x, self._initial_leftover_grid_y = self.coordSpaceToGridSpace(coord_initial_leftover_x, coord_initial_leftover_y) + self._initial_leftover_grid_x, self._initial_leftover_grid_y = self._coordSpaceToGridSpace( + coord_initial_leftover_x, coord_initial_leftover_y) self._initial_leftover_grid_x = math.floor(self._initial_leftover_grid_x) self._initial_leftover_grid_y = math.floor(self._initial_leftover_grid_y) @@ -53,19 +54,19 @@ class GridArrange(Arranger): self._fixed_nodes_grid_ids = set() for node in self._fixed_nodes: self._fixed_nodes_grid_ids = self._fixed_nodes_grid_ids.union( - self.intersectingGridIdxInclusive(node.getBoundingBox())) + self._intersectingGridIdxInclusive(node.getBoundingBox())) #grid indexes that are in disallowed area for polygon in self._build_volume.getDisallowedAreas(): self._fixed_nodes_grid_ids = self._fixed_nodes_grid_ids.union( self._getIntersectingGridIdForPolygon(polygon)) - self._build_plate_grid_ids = self.intersectingGridIdxExclusive(self._build_volume_bounding_box) + self._build_plate_grid_ids = self._intersectingGridIdxExclusive(self._build_volume_bounding_box) # Filter out the corner grid squares if the build plate shape is elliptic if self._build_volume.getShape() == "elliptic": self._build_plate_grid_ids = set( - filter(lambda grid_id: self.checkGridUnderDiscSpace(grid_id[0], grid_id[1]), + filter(lambda grid_id: self._checkGridUnderDiscSpace(grid_id[0], grid_id[1]), self._build_plate_grid_ids)) self._allowed_grid_idx = self._build_plate_grid_ids.difference(self._fixed_nodes_grid_ids) @@ -74,7 +75,8 @@ class GridArrange(Arranger): # Find the sequence in which items are placed coord_build_plate_center_x = self._build_volume_bounding_box.width * 0.5 + self._build_volume_bounding_box.left coord_build_plate_center_y = self._build_volume_bounding_box.depth * 0.5 + self._build_volume_bounding_box.back - grid_build_plate_center_x, grid_build_plate_center_y = self.coordSpaceToGridSpace(coord_build_plate_center_x, coord_build_plate_center_y) + grid_build_plate_center_x, grid_build_plate_center_y = self._coordSpaceToGridSpace(coord_build_plate_center_x, + coord_build_plate_center_y) sequence: List[Tuple[int, int]] = list(self._allowed_grid_idx) sequence.sort(key=lambda grid_id: (grid_build_plate_center_x - grid_id[0]) ** 2 + ( @@ -243,8 +245,8 @@ class GridArrange(Arranger): coord_x2 = bounding_box.right coord_y1 = bounding_box.back coord_y2 = bounding_box.front - grid_x1, grid_y1 = self.coordSpaceToGridSpace(coord_x1, coord_y1) - grid_x2, grid_y2 = self.coordSpaceToGridSpace(coord_x2, coord_y2) + grid_x1, grid_y1 = self._coordSpaceToGridSpace(coord_x1, coord_y1) + grid_x2, grid_y2 = self._coordSpaceToGridSpace(coord_x2, coord_y2) return grid_x1, grid_y1, grid_x2, grid_y2 def _getIntersectingGridIdForPolygon(self, polygon)-> Set[Tuple[int, int]]: @@ -265,15 +267,15 @@ class GridArrange(Arranger): y0 = min(y0, y) x1 = max(x1, x) y1 = max(y1, y) - grid_x1, grid_y1 = self.coordSpaceToGridSpace(x0, y0) - grid_x2, grid_y2 = self.coordSpaceToGridSpace(x1, y1) + grid_x1, grid_y1 = self._coordSpaceToGridSpace(x0, y0) + grid_x2, grid_y2 = self._coordSpaceToGridSpace(x1, y1) for grid_x in range(math.floor(grid_x1), math.ceil(grid_x2)): for grid_y in range(math.floor(grid_y1), math.ceil(grid_y2)): grid_idx.add((grid_x, grid_y)) return grid_idx - def intersectingGridIdxInclusive(self, bounding_box: "BoundingVolume") -> Set[Tuple[int, int]]: + def _intersectingGridIdxInclusive(self, bounding_box: "BoundingVolume") -> Set[Tuple[int, int]]: grid_x1, grid_y1, grid_x2, grid_y2 = self._getGridCornerPoints(bounding_box) grid_idx = set() for grid_x in range(math.floor(grid_x1), math.ceil(grid_x2)): @@ -281,7 +283,7 @@ class GridArrange(Arranger): grid_idx.add((grid_x, grid_y)) return grid_idx - def intersectingGridIdxExclusive(self, bounding_box: "BoundingVolume") -> Set[Tuple[int, int]]: + def _intersectingGridIdxExclusive(self, bounding_box: "BoundingVolume") -> Set[Tuple[int, int]]: grid_x1, grid_y1, grid_x2, grid_y2 = self._getGridCornerPoints(bounding_box) grid_idx = set() for grid_x in range(math.ceil(grid_x1), math.floor(grid_x2)): @@ -294,23 +296,23 @@ class GridArrange(Arranger): grid_y = y * self._grid_height + self._build_volume_bounding_box.back + self._offset_y return grid_x, grid_y - def coordSpaceToGridSpace(self, grid_x: float, grid_y: float) -> Tuple[float, float]: + def _coordSpaceToGridSpace(self, grid_x: float, grid_y: float) -> Tuple[float, float]: coord_x = (grid_x - self._build_volume_bounding_box.left - self._offset_x) / self._grid_width coord_y = (grid_y - self._build_volume_bounding_box.back - self._offset_y) / self._grid_height return coord_x, coord_y - def checkGridUnderDiscSpace(self, grid_x: int, grid_y: int) -> bool: + def _checkGridUnderDiscSpace(self, grid_x: int, grid_y: int) -> bool: left, back = self._gridSpaceToCoordSpace(grid_x, grid_y) right, front = self._gridSpaceToCoordSpace(grid_x + 1, grid_y + 1) corners = [(left, back), (right, back), (right, front), (left, front)] - return all([self.checkPointUnderDiscSpace(x, y) for x, y in corners]) + return all([self._checkPointUnderDiscSpace(x, y) for x, y in corners]) - def checkPointUnderDiscSpace(self, x: float, y: float) -> bool: - disc_x, disc_y = self.coordSpaceToDiscSpace(x, y) + def _checkPointUnderDiscSpace(self, x: float, y: float) -> bool: + disc_x, disc_y = self._coordSpaceToDiscSpace(x, y) distance_to_center_squared = disc_x ** 2 + disc_y ** 2 return distance_to_center_squared <= 1.0 - def coordSpaceToDiscSpace(self, x: float, y: float) -> Tuple[float, float]: + def _coordSpaceToDiscSpace(self, x: float, y: float) -> Tuple[float, float]: # Transform coordinate system to # # coord_build_plate_left = -1 From 3e39bbdabd9f154dc6754d23c01006ad5a6cfd08 Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Wed, 30 Aug 2023 12:51:03 +0200 Subject: [PATCH 115/126] Typo CURA-7951 --- cura/Arranging/GridArrange.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index d2eace3c26..8a4606e3f3 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -138,11 +138,11 @@ class GridArrange(Arranger): # these the node's "footprint". # # ┌────────────────┐ - # minimum food print │ NODE │ + # minimum foot-print │ NODE │ # └────────────────┘ # │ grid 1 │ grid 2 │ grid 3 │ grid 4 | grid 5 | # ┌────────────────┐ - # maximum food print │ NODE │ + # maximum foot-print │ NODE │ # └────────────────┘ # # The algorithm will find the grid offset such that the number of nodes with From afc1ba78f5cf239a035a85ea25aff7efd63de7bf Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Wed, 30 Aug 2023 12:52:27 +0200 Subject: [PATCH 116/126] Remove debugging utility function CURA-7951 --- cura/Arranging/GridArrange.py | 113 ---------------------------------- 1 file changed, 113 deletions(-) diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index 8a4606e3f3..95ce2c7190 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -329,116 +329,3 @@ class GridArrange(Arranger): disc_x = ((x - self._build_volume_bounding_box.left) / self._build_volume_bounding_box.width) * 2.0 - 1.0 disc_y = ((y - self._build_volume_bounding_box.back) / self._build_volume_bounding_box.depth) * 2.0 - 1.0 return disc_x, disc_y - - def _drawDebugSvg(self): - with open("Builvolume_test.svg", "w") as f: - build_volume_bounding_box = self._build_volume_bounding_box - - f.write( - f"\n") - - if self._build_volume.getShape() == "elliptic": - f.write( - f""" - - """) - else: - f.write( - f""" - - """) - - for polygon in self._build_volume.getDisallowedAreas(): - # Extract individual points and convert them to tuples - - path_data = "" - for [x,y] in polygon.getPoints(): - path_data += f"{x},{y} " - - f.write( - f""" - - """) - - for grid_x in range(-10, 100): - for grid_y in range(-10, 100): - if (grid_x, grid_y) in self._allowed_grid_idx: - fill_color = "rgba(0, 255, 0, 0.5)" - elif (grid_x, grid_y) in self._build_plate_grid_ids: - fill_color = "rgba(255, 165, 0, 0.5)" - else: - fill_color = "rgba(255, 0, 0, 0.5)" - - coord_grid_x, coord_grid_y = self._gridSpaceToCoordSpace(grid_x, grid_y) - f.write( - f""" - - """) - f.write(f""" - - {grid_x},{grid_y} - - """) - for node in self._fixed_nodes: - bounding_box = node.getBoundingBox() - f.write(f""" - - """) - - f.write(f""" - """) - - # coord_build_plate_center_x = self._build_volume_bounding_box.width * 0.5 + self._build_volume_bounding_box.left - # coord_build_plate_center_y = self._build_volume_bounding_box.depth * 0.5 + self._build_volume_bounding_box.back - # f.write(f""" - # """) - - f.write(f"") From 586739c5479c0363b98468b7fb679294870b3d0c Mon Sep 17 00:00:00 2001 From: "c.lamboo" Date: Wed, 30 Aug 2023 13:06:19 +0200 Subject: [PATCH 117/126] Avoid bool-trap CURA-7951 --- cura/Arranging/Arranger.py | 7 ++++--- cura/Arranging/GridArrange.py | 2 +- cura/Arranging/Nest2DArrange.py | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/cura/Arranging/Arranger.py b/cura/Arranging/Arranger.py index fd93ab1846..f7f9870cf9 100644 --- a/cura/Arranging/Arranger.py +++ b/cura/Arranging/Arranger.py @@ -5,7 +5,7 @@ if TYPE_CHECKING: class Arranger: - def createGroupOperationForArrange(self, add_new_nodes_in_scene: bool = False) -> Tuple["GroupedOperation", int]: + def createGroupOperationForArrange(self, *, add_new_nodes_in_scene: bool = False) -> Tuple["GroupedOperation", int]: """ Find placement for a set of scene nodes, but don't actually move them just yet. :param add_new_nodes_in_scene: Whether to create new scene nodes before applying the transformations and rotations @@ -16,12 +16,13 @@ class Arranger: """ raise NotImplementedError - def arrange(self, add_new_nodes_in_scene: bool = False) -> bool: + def arrange(self, *, add_new_nodes_in_scene: bool = False) -> bool: """ Find placement for a set of scene nodes, and move them by using a single grouped operation. :param add_new_nodes_in_scene: Whether to create new scene nodes before applying the transformations and rotations :return: found_solution_for_all: Whether the algorithm found a place on the buildplate for all the objects """ - grouped_operation, not_fit_count = self.createGroupOperationForArrange(add_new_nodes_in_scene) + grouped_operation, not_fit_count = self.createGroupOperationForArrange( + add_new_nodes_in_scene=add_new_nodes_in_scene) grouped_operation.push() return not_fit_count == 0 diff --git a/cura/Arranging/GridArrange.py b/cura/Arranging/GridArrange.py index 95ce2c7190..493c81b27c 100644 --- a/cura/Arranging/GridArrange.py +++ b/cura/Arranging/GridArrange.py @@ -71,7 +71,7 @@ class GridArrange(Arranger): self._allowed_grid_idx = self._build_plate_grid_ids.difference(self._fixed_nodes_grid_ids) - def createGroupOperationForArrange(self, add_new_nodes_in_scene: bool = False) -> Tuple[GroupedOperation, int]: + def createGroupOperationForArrange(self, *, add_new_nodes_in_scene: bool = False) -> Tuple[GroupedOperation, int]: # Find the sequence in which items are placed coord_build_plate_center_x = self._build_volume_bounding_box.width * 0.5 + self._build_volume_bounding_box.left coord_build_plate_center_y = self._build_volume_bounding_box.depth * 0.5 + self._build_volume_bounding_box.back diff --git a/cura/Arranging/Nest2DArrange.py b/cura/Arranging/Nest2DArrange.py index bad57c5045..5fcd36c1a3 100644 --- a/cura/Arranging/Nest2DArrange.py +++ b/cura/Arranging/Nest2DArrange.py @@ -124,7 +124,7 @@ class Nest2DArrange(Arranger): return found_solution_for_all, node_items - def createGroupOperationForArrange(self, add_new_nodes_in_scene: bool = False) -> Tuple[GroupedOperation, int]: + def createGroupOperationForArrange(self, *, add_new_nodes_in_scene: bool = False) -> Tuple[GroupedOperation, int]: scene_root = Application.getInstance().getController().getScene().getRoot() found_solution_for_all, node_items = self.findNodePlacement() From 1fb7191dd76bbdcbceae47b9581f5e18945be395 Mon Sep 17 00:00:00 2001 From: jellespijker Date: Thu, 31 Aug 2023 05:26:40 +0200 Subject: [PATCH 118/126] Use conf skip_test Contributes to CURA-10951 --- .github/workflows/conan-package-create.yml | 2 +- .github/workflows/conan-package.yml | 2 +- .github/workflows/conan-recipe-export.yml | 2 +- .github/workflows/requirements-conan-package.txt | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/conan-package-create.yml b/.github/workflows/conan-package-create.yml index 701a978cd8..5df9f7377c 100644 --- a/.github/workflows/conan-package-create.yml +++ b/.github/workflows/conan-package-create.yml @@ -147,7 +147,7 @@ jobs: run: conan remote add cura-private https://ultimaker.jfrog.io/artifactory/api/conan/cura-private True - name: Create the Packages - run: conan install ${{ inputs.recipe_id_full }} --build=missing --update + run: conan install ${{ inputs.recipe_id_full }} --build=missing --update -c tools.build:skip_test=True - name: Upload the Package(s) if: ${{ always() && inputs.conan_upload_community }} diff --git a/.github/workflows/conan-package.yml b/.github/workflows/conan-package.yml index 9949621251..b5c135e23e 100644 --- a/.github/workflows/conan-package.yml +++ b/.github/workflows/conan-package.yml @@ -114,7 +114,7 @@ jobs: run: conan config install https://github.com/Ultimaker/conan-config.git - name: Create the Packages - run: conan create . ${{ needs.conan-recipe-version.outputs.recipe_id_full }} --build=missing --update -o ${{ needs.conan-recipe-version.outputs.project_name }}:devtools=True + run: conan create . ${{ needs.conan-recipe-version.outputs.recipe_id_full }} --build=missing --update -o ${{ needs.conan-recipe-version.outputs.project_name }}:devtools=True -c tools.build:skip_test=True - name: Create the latest alias if: always() diff --git a/.github/workflows/conan-recipe-export.yml b/.github/workflows/conan-recipe-export.yml index 869a9de59e..4bd88a99c1 100644 --- a/.github/workflows/conan-recipe-export.yml +++ b/.github/workflows/conan-recipe-export.yml @@ -83,7 +83,7 @@ jobs: - name: Export the Package (binaries) if: ${{ inputs.conan_export_binaries }} - run: conan create . ${{ inputs.recipe_id_full }} --build=missing --update + run: conan create . ${{ inputs.recipe_id_full }} --build=missing --update -c tools.build:skip_test=True - name: Export the Package if: ${{ !inputs.conan_export_binaries }} diff --git a/.github/workflows/requirements-conan-package.txt b/.github/workflows/requirements-conan-package.txt index 6b4d4cffc8..9380d1cb98 100644 --- a/.github/workflows/requirements-conan-package.txt +++ b/.github/workflows/requirements-conan-package.txt @@ -1,2 +1,2 @@ -conan==1.60.2 +conan>=1.60.2,<2.0.0 sip From baafdbfce3740874e13bd4ec7ab574c0d9fda013 Mon Sep 17 00:00:00 2001 From: jellespijker Date: Thu, 31 Aug 2023 05:45:44 +0200 Subject: [PATCH 119/126] Use gcc-13 and new conan-config --- .github/workflows/conan-package-create.yml | 243 +++++----- .github/workflows/conan-package.yml | 29 +- .github/workflows/conan-recipe-export.yml | 161 +++---- .github/workflows/linux.yml | 513 ++++++++++----------- .github/workflows/unit-test.yml | 278 +++++------ .github/workflows/update-translation.yml | 141 +++--- 6 files changed, 683 insertions(+), 682 deletions(-) diff --git a/.github/workflows/conan-package-create.yml b/.github/workflows/conan-package-create.yml index 5df9f7377c..e8329fa7b1 100644 --- a/.github/workflows/conan-package-create.yml +++ b/.github/workflows/conan-package-create.yml @@ -1,158 +1,153 @@ name: Create and Upload Conan package on: - workflow_call: - inputs: - project_name: - required: true - type: string + workflow_call: + inputs: + project_name: + required: true + type: string - recipe_id_full: - required: true - type: string + recipe_id_full: + required: true + type: string - build_id: - required: true - type: number + build_id: + required: true + type: number - build_info: - required: false - default: true - type: boolean + build_info: + required: false + default: true + type: boolean - recipe_id_latest: - required: false - type: string + recipe_id_latest: + required: false + type: string - runs_on: - required: true - type: string + runs_on: + required: true + type: string - python_version: - required: true - type: string + python_version: + required: true + type: string - conan_config_branch: - required: false - type: string + conan_config_branch: + required: false + type: string - conan_logging_level: - required: false - type: string + conan_logging_level: + required: false + type: string - conan_clean_local_cache: - required: false - type: boolean - default: false + conan_clean_local_cache: + required: false + type: boolean + default: false - conan_upload_community: - required: false - default: true - type: boolean + conan_upload_community: + required: false + default: true + type: boolean env: - CONAN_LOGIN_USERNAME: ${{ secrets.CONAN_USER }} - CONAN_PASSWORD: ${{ secrets.CONAN_PASS }} - CONAN_LOG_RUN_TO_OUTPUT: 1 - CONAN_LOGGING_LEVEL: ${{ inputs.conan_logging_level }} - CONAN_NON_INTERACTIVE: 1 + CONAN_LOGIN_USERNAME: ${{ secrets.CONAN_USER }} + CONAN_PASSWORD: ${{ secrets.CONAN_PASS }} + CONAN_LOG_RUN_TO_OUTPUT: 1 + CONAN_LOGGING_LEVEL: ${{ inputs.conan_logging_level }} + CONAN_NON_INTERACTIVE: 1 jobs: - conan-package-create: - runs-on: ${{ inputs.runs_on }} + conan-package-create: + runs-on: ${{ inputs.runs_on }} - steps: - - name: Checkout - uses: actions/checkout@v3 + steps: + - name: Checkout + uses: actions/checkout@v3 - - name: Setup Python and pip - uses: actions/setup-python@v4 - with: - python-version: ${{ inputs.python_version }} - cache: 'pip' - cache-dependency-path: .github/workflows/requirements-conan-package.txt + - name: Setup Python and pip + uses: actions/setup-python@v4 + with: + python-version: ${{ inputs.python_version }} + cache: 'pip' + cache-dependency-path: .github/workflows/requirements-conan-package.txt - - name: Install Python requirements for runner - run: pip install -r https://raw.githubusercontent.com/Ultimaker/Cura/main/.github/workflows/requirements-conan-package.txt - # Note the runner requirements are always installed from the main branch in the Ultimaker/Cura repo + - name: Install Python requirements for runner + run: pip install -r https://raw.githubusercontent.com/Ultimaker/Cura/main/.github/workflows/requirements-conan-package.txt + # Note the runner requirements are always installed from the main branch in the Ultimaker/Cura repo - - name: Use Conan download cache (Bash) - if: ${{ runner.os != 'Windows' }} - run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache" + - name: Use Conan download cache (Bash) + if: ${{ runner.os != 'Windows' }} + run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache" - - name: Use Conan download cache (Powershell) - if: ${{ runner.os == 'Windows' }} - run: conan config set storage.download_cache="C:\Users\runneradmin\.conan\conan_download_cache" + - name: Use Conan download cache (Powershell) + if: ${{ runner.os == 'Windows' }} + run: conan config set storage.download_cache="C:\Users\runneradmin\.conan\conan_download_cache" - - name: Cache Conan local repository packages (Bash) - uses: actions/cache@v3 - if: ${{ runner.os != 'Windows' }} - with: - path: | - $HOME/.conan/data - $HOME/.conan/conan_download_cache - key: conan-${{ inputs.runs_on }}-${{ runner.arch }}-create-cache + - name: Cache Conan local repository packages (Bash) + uses: actions/cache@v3 + if: ${{ runner.os != 'Windows' }} + with: + path: | + $HOME/.conan/data + $HOME/.conan/conan_download_cache + key: conan-${{ inputs.runs_on }}-${{ runner.arch }}-create-cache - - name: Cache Conan local repository packages (Powershell) - uses: actions/cache@v3 - if: ${{ runner.os == 'Windows' }} - with: - path: | - C:\Users\runneradmin\.conan\data - C:\.conan - C:\Users\runneradmin\.conan\conan_download_cache - key: conan-${{ inputs.runs_on }}-${{ runner.arch }}-create-cache + - name: Cache Conan local repository packages (Powershell) + uses: actions/cache@v3 + if: ${{ runner.os == 'Windows' }} + with: + path: | + C:\Users\runneradmin\.conan\data + C:\.conan + C:\Users\runneradmin\.conan\conan_download_cache + key: conan-${{ inputs.runs_on }}-${{ runner.arch }}-create-cache - - name: Install MacOS system requirements - if: ${{ runner.os == 'Macos' }} - run: brew install autoconf automake ninja + - name: Install MacOS system requirements + if: ${{ runner.os == 'Macos' }} + run: brew install autoconf automake ninja - # NOTE: Due to what are probably github issues, we have to remove the cache and reconfigure before the rest. - # This is maybe because grub caches the disk it uses last time, which is recreated each time. - - name: Install Linux system requirements - if: ${{ runner.os == 'Linux' }} - run: | - sudo rm /var/cache/debconf/config.dat - sudo dpkg --configure -a - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y - sudo apt update - sudo apt upgrade - sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config flex bison -y + # NOTE: Due to what are probably github issues, we have to remove the cache and reconfigure before the rest. + # This is maybe because grub caches the disk it uses last time, which is recreated each time. + - name: Install Linux system requirements + if: ${{ runner.os == 'Linux' }} + run: | + sudo rm /var/cache/debconf/config.dat + sudo dpkg --configure -a + sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y + sudo apt update + sudo apt upgrade + sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config flex bison -y - - name: Install GCC-12 on ubuntu-22.04 - if: ${{ startsWith(inputs.runs_on, 'ubuntu-22.04') }} - run: | - sudo apt install g++-12 gcc-12 -y - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12 - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12 + - name: Install GCC-132 on ubuntu + if: ${{ startsWith(inputs.runs_on, 'ubuntu') }} + run: | + sudo apt install g++-13 gcc-13 -y + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 13 - - name: Use GCC-10 on ubuntu-20.04 - if: ${{ startsWith(inputs.runs_on, 'ubuntu-20.04') }} - run: | - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10 + - name: Create the default Conan profile + run: conan profile new default --detect - - name: Create the default Conan profile - run: conan profile new default --detect + - name: Get Conan configuration from branch + if: ${{ inputs.conan_config_branch != '' }} + run: conan config install https://github.com/Ultimaker/conan-config.git -a "-b ${{ inputs.conan_config_branch }}" - - name: Get Conan configuration from branch - if: ${{ inputs.conan_config_branch != '' }} - run: conan config install https://github.com/Ultimaker/conan-config.git -a "-b ${{ inputs.conan_config_branch }}" + - name: Get Conan configuration + run: | + conan config install https://github.com/Ultimaker/conan-config.git + conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}" - - name: Get Conan configuration - if: ${{ inputs.conan_config_branch == '' }} - run: conan config install https://github.com/Ultimaker/conan-config.git + - name: Add Cura private Artifactory remote + run: conan remote add cura-private https://ultimaker.jfrog.io/artifactory/api/conan/cura-private True - - name: Add Cura private Artifactory remote - run: conan remote add cura-private https://ultimaker.jfrog.io/artifactory/api/conan/cura-private True + - name: Create the Packages + run: conan install ${{ inputs.recipe_id_full }} --build=missing --update -c tools.build:skip_test=True - - name: Create the Packages - run: conan install ${{ inputs.recipe_id_full }} --build=missing --update -c tools.build:skip_test=True + - name: Upload the Package(s) + if: ${{ always() && inputs.conan_upload_community }} + run: conan upload ${{ inputs.recipe_id_full }} -r cura --all -c - - name: Upload the Package(s) - if: ${{ always() && inputs.conan_upload_community }} - run: conan upload ${{ inputs.recipe_id_full }} -r cura --all -c - - - name: Upload the Package(s) to the private Artifactory - if: ${{ always() && ! inputs.conan_upload_community }} - run: conan upload ${{ inputs.recipe_id_full }} -r cura-private --all -c + - name: Upload the Package(s) to the private Artifactory + if: ${{ always() && ! inputs.conan_upload_community }} + run: conan upload ${{ inputs.recipe_id_full }} -r cura-private --all -c diff --git a/.github/workflows/conan-package.yml b/.github/workflows/conan-package.yml index b5c135e23e..34652de39b 100644 --- a/.github/workflows/conan-package.yml +++ b/.github/workflows/conan-package.yml @@ -49,15 +49,15 @@ on: - '[1-9].[0-9][0-9].[0-9]*' env: - CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} - CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} - CONAN_LOGIN_USERNAME_CURA_CE: ${{ secrets.CONAN_USER }} - CONAN_PASSWORD_CURA_CE: ${{ secrets.CONAN_PASS }} - CONAN_LOG_RUN_TO_OUTPUT: 1 - CONAN_LOGGING_LEVEL: ${{ inputs.conan_logging_level }} - CONAN_NON_INTERACTIVE: 1 + CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} + CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} + CONAN_LOGIN_USERNAME_CURA_CE: ${{ secrets.CONAN_USER }} + CONAN_PASSWORD_CURA_CE: ${{ secrets.CONAN_PASS }} + CONAN_LOG_RUN_TO_OUTPUT: 1 + CONAN_LOGGING_LEVEL: ${{ inputs.conan_logging_level }} + CONAN_NON_INTERACTIVE: 1 -permissions: {} +permissions: { } jobs: conan-recipe-version: permissions: @@ -103,15 +103,20 @@ jobs: sudo apt update sudo apt upgrade sudo apt install efibootmgr build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config flex bison g++-12 gcc-12 -y - sudo apt install g++-12 gcc-12 -y - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12 - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12 + + - name: Install GCC-13 + run: | + sudo apt install g++-13 gcc-13 -y + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 13 - name: Create the default Conan profile run: conan profile new default --detect --force - name: Get Conan configuration - run: conan config install https://github.com/Ultimaker/conan-config.git + run: | + conan config install https://github.com/Ultimaker/conan-config.git + conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}" - name: Create the Packages run: conan create . ${{ needs.conan-recipe-version.outputs.recipe_id_full }} --build=missing --update -o ${{ needs.conan-recipe-version.outputs.project_name }}:devtools=True -c tools.build:skip_test=True diff --git a/.github/workflows/conan-recipe-export.yml b/.github/workflows/conan-recipe-export.yml index 4bd88a99c1..ba5aaa49a1 100644 --- a/.github/workflows/conan-recipe-export.yml +++ b/.github/workflows/conan-recipe-export.yml @@ -1,106 +1,107 @@ name: Export Conan Recipe to server on: - workflow_call: - inputs: - recipe_id_full: - required: true - type: string + workflow_call: + inputs: + recipe_id_full: + required: true + type: string - recipe_id_latest: - required: false - type: string + recipe_id_latest: + required: false + type: string - runs_on: - required: true - type: string + runs_on: + required: true + type: string - python_version: - required: true - type: string + python_version: + required: true + type: string - conan_config_branch: - required: false - type: string + conan_config_branch: + required: false + type: string - conan_logging_level: - required: false - type: string + conan_logging_level: + required: false + type: string - conan_export_binaries: - required: false - type: boolean + conan_export_binaries: + required: false + type: boolean - conan_upload_community: - required: false - default: true - type: boolean + conan_upload_community: + required: false + default: true + type: boolean env: - CONAN_LOGIN_USERNAME: ${{ secrets.CONAN_USER }} - CONAN_PASSWORD: ${{ secrets.CONAN_PASS }} - CONAN_LOG_RUN_TO_OUTPUT: 1 - CONAN_LOGGING_LEVEL: ${{ inputs.conan_logging_level }} - CONAN_NON_INTERACTIVE: 1 + CONAN_LOGIN_USERNAME: ${{ secrets.CONAN_USER }} + CONAN_PASSWORD: ${{ secrets.CONAN_PASS }} + CONAN_LOG_RUN_TO_OUTPUT: 1 + CONAN_LOGGING_LEVEL: ${{ inputs.conan_logging_level }} + CONAN_NON_INTERACTIVE: 1 jobs: - package-export: - runs-on: ${{ inputs.runs_on }} + package-export: + runs-on: ${{ inputs.runs_on }} - steps: - - name: Checkout project - uses: actions/checkout@v3 + steps: + - name: Checkout project + uses: actions/checkout@v3 - - name: Setup Python and pip - uses: actions/setup-python@v4 - with: - python-version: ${{ inputs.python_version }} - cache: 'pip' - cache-dependency-path: .github/workflows/requirements-conan-package.txt + - name: Setup Python and pip + uses: actions/setup-python@v4 + with: + python-version: ${{ inputs.python_version }} + cache: 'pip' + cache-dependency-path: .github/workflows/requirements-conan-package.txt - - name: Install Python requirements and Create default Conan profile - run: | - pip install -r https://raw.githubusercontent.com/Ultimaker/Cura/main/.github/workflows/requirements-conan-package.txt - conan profile new default --detect - # Note the runner requirements are always installed from the main branch in the Ultimaker/Cura repo + - name: Install Python requirements and Create default Conan profile + run: | + pip install -r https://raw.githubusercontent.com/Ultimaker/Cura/main/.github/workflows/requirements-conan-package.txt + conan profile new default --detect + # Note the runner requirements are always installed from the main branch in the Ultimaker/Cura repo - - name: Cache Conan local repository packages - uses: actions/cache@v3 - with: - path: $HOME/.conan/data - key: ${{ runner.os }}-conan-export-cache + - name: Cache Conan local repository packages + uses: actions/cache@v3 + with: + path: $HOME/.conan/data + key: ${{ runner.os }}-conan-export-cache - - name: Get Conan configuration from branch - if: ${{ inputs.conan_config_branch != '' }} - run: conan config install https://github.com/Ultimaker/conan-config.git -a "-b ${{ inputs.conan_config_branch }}" + - name: Get Conan configuration from branch + if: ${{ inputs.conan_config_branch != '' }} + run: conan config install https://github.com/Ultimaker/conan-config.git -a "-b ${{ inputs.conan_config_branch }}" - - name: Get Conan configuration - if: ${{ inputs.conan_config_branch == '' }} - run: conan config install https://github.com/Ultimaker/conan-config.git + - name: Get Conan configuration + run: | + conan config install https://github.com/Ultimaker/conan-config.git + conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}" - - name: Add Cura private Artifactory remote - run: conan remote add cura-private https://ultimaker.jfrog.io/artifactory/api/conan/cura-private True + - name: Add Cura private Artifactory remote + run: conan remote add cura-private https://ultimaker.jfrog.io/artifactory/api/conan/cura-private True - - name: Export the Package (binaries) - if: ${{ inputs.conan_export_binaries }} - run: conan create . ${{ inputs.recipe_id_full }} --build=missing --update -c tools.build:skip_test=True + - name: Export the Package (binaries) + if: ${{ inputs.conan_export_binaries }} + run: conan create . ${{ inputs.recipe_id_full }} --build=missing --update -c tools.build:skip_test=True - - name: Export the Package - if: ${{ !inputs.conan_export_binaries }} - run: conan export . ${{ inputs.recipe_id_full }} + - name: Export the Package + if: ${{ !inputs.conan_export_binaries }} + run: conan export . ${{ inputs.recipe_id_full }} - - name: Create the latest alias - if: always() - run: conan alias ${{ inputs.recipe_id_latest }} ${{ inputs.recipe_id_full }} + - name: Create the latest alias + if: always() + run: conan alias ${{ inputs.recipe_id_latest }} ${{ inputs.recipe_id_full }} - - name: Upload the Package(s) - if: ${{ always() && inputs.conan_upload_community }} - run: | - conan upload ${{ inputs.recipe_id_full }} -r cura --all -c - conan upload ${{ inputs.recipe_id_latest }} -r cura -c + - name: Upload the Package(s) + if: ${{ always() && inputs.conan_upload_community }} + run: | + conan upload ${{ inputs.recipe_id_full }} -r cura --all -c + conan upload ${{ inputs.recipe_id_latest }} -r cura -c - - name: Upload the Package(s) to the private Artifactory - if: ${{ always() && ! inputs.conan_upload_community }} - run: | - conan upload ${{ inputs.recipe_id_full }} -r cura-private --all -c - conan upload ${{ inputs.recipe_id_latest }} -r cura-private -c + - name: Upload the Package(s) to the private Artifactory + if: ${{ always() && ! inputs.conan_upload_community }} + run: | + conan upload ${{ inputs.recipe_id_full }} -r cura-private --all -c + conan upload ${{ inputs.recipe_id_latest }} -r cura-private -c diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index 5a18199e3c..2e15584299 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -2,270 +2,263 @@ name: Linux Installer run-name: ${{ inputs.cura_conan_version }} for Linux-${{ inputs.architecture }} by @${{ github.actor }} on: - workflow_dispatch: - inputs: - cura_conan_version: - description: 'Cura Conan Version' - default: 'cura/latest@ultimaker/testing' - required: true - type: string - conan_args: - description: 'Conan args: eq.: --require-override' - default: '' - required: false - type: string - enterprise: - description: 'Build Cura as an Enterprise edition' - default: false - required: true - type: boolean - staging: - description: 'Use staging API' - default: false - required: true - type: boolean - architecture: - description: 'Architecture' - required: true - default: 'X64' - type: choice - options: - - X64 - operating_system: - description: 'OS' - required: true - default: 'ubuntu-22.04' - type: choice - options: - - ubuntu-22.04 - - ubuntu-20.04 - workflow_call: - inputs: - cura_conan_version: - description: 'Cura Conan Version' - default: 'cura/latest@ultimaker/testing' - required: true - type: string - conan_args: - description: 'Conan args: eq.: --require-override' - default: '' - required: false - type: string - enterprise: - description: 'Build Cura as an Enterprise edition' - default: false - required: true - type: boolean - staging: - description: 'Use staging API' - default: false - required: true - type: boolean - architecture: - description: 'Architecture' - required: true - default: 'X64' - type: string - operating_system: - description: 'OS' - required: true - default: 'ubuntu-22.04' - type: string + workflow_dispatch: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: choice + options: + - X64 + operating_system: + description: 'OS' + required: true + default: 'ubuntu-22.04' + type: choice + options: + - ubuntu-22.04 + - ubuntu-20.04 + workflow_call: + inputs: + cura_conan_version: + description: 'Cura Conan Version' + default: 'cura/latest@ultimaker/testing' + required: true + type: string + conan_args: + description: 'Conan args: eq.: --require-override' + default: '' + required: false + type: string + enterprise: + description: 'Build Cura as an Enterprise edition' + default: false + required: true + type: boolean + staging: + description: 'Use staging API' + default: false + required: true + type: boolean + architecture: + description: 'Architecture' + required: true + default: 'X64' + type: string + operating_system: + description: 'OS' + required: true + default: 'ubuntu-22.04' + type: string env: - CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} - CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} - GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} - CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }} - ENTERPRISE: ${{ inputs.enterprise }} - STAGING: ${{ inputs.staging }} + CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} + CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} + GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} + CURA_CONAN_VERSION: ${{ inputs.cura_conan_version }} + ENTERPRISE: ${{ inputs.enterprise }} + STAGING: ${{ inputs.staging }} jobs: - cura-installer-create: - runs-on: ${{ inputs.operating_system }} + cura-installer-create: + runs-on: ${{ inputs.operating_system }} - steps: - - name: Checkout - uses: actions/checkout@v3 + steps: + - name: Checkout + uses: actions/checkout@v3 - - name: Setup Python and pip - uses: actions/setup-python@v4 - with: - python-version: '3.10.x' - cache: 'pip' - cache-dependency-path: .github/workflows/requirements-conan-package.txt - - - name: Install Python requirements for runner - run: pip install -r .github/workflows/requirements-conan-package.txt - - - name: Cache Conan local repository packages (Bash) - uses: actions/cache@v3 - with: - path: | - $HOME/.conan/data - $HOME/.conan/conan_download_cache - key: conan-${{ runner.os }}-${{ runner.arch }}-installer-cache - - - name: Hack needed specifically for ubuntu-22.04 from mid-Feb 2023 onwards - if: ${{ startsWith(inputs.operating_system, 'ubuntu-22.04') }} - run: sudo apt remove libodbc2 libodbcinst2 unixodbc-common -y - - # NOTE: Due to what are probably github issues, we have to remove the cache and reconfigure before the rest. - # This is maybe because grub caches the disk it uses last time, which is recreated each time. - - name: Install Linux system requirements - run: | - sudo rm /var/cache/debconf/config.dat - sudo dpkg --configure -a - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y - sudo apt update - sudo apt upgrade - sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config -y - wget --no-check-certificate --quiet https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O $GITHUB_WORKSPACE/appimagetool - chmod +x $GITHUB_WORKSPACE/appimagetool - echo "APPIMAGETOOL_LOCATION=$GITHUB_WORKSPACE/appimagetool" >> $GITHUB_ENV - - - name: Install GCC-12 on ubuntu-22.04 - if: ${{ startsWith(inputs.operating_system, 'ubuntu-22.04') }} - run: | - sudo apt install g++-12 gcc-12 -y - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12 - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12 - - - name: Use GCC-10 on ubuntu-20.04 - if: ${{ startsWith(inputs.operating_system, 'ubuntu-20.04') }} - run: | - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-10 10 - - - name: Create the default Conan profile - run: conan profile new default --detect --force - - - name: Configure GPG Key Linux (Bash) - run: echo -n "$GPG_PRIVATE_KEY" | base64 --decode | gpg --import - - - name: Get Conan configuration - run: | - conan config install https://github.com/Ultimaker/conan-config.git - conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}" - - - name: Use Conan download cache (Bash) - run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache" - - - name: Create the Packages (Bash) - run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING --json "cura_inst/conan_install_info.json" - - - name: Upload the Package(s) - if: always() - run: | - conan upload "*" -r cura --all -c - - - name: Set Environment variables for Cura (bash) - run: | - . ./cura_inst/bin/activate_github_actions_env.sh - . ./cura_inst/bin/activate_github_actions_version_env.sh - - # FIXME: This is a workaround to ensure that we use and pack a shared library for OpenSSL 1.1.1l. We currently compile - # OpenSSL statically for CPython, but our Python Dependenies (such as PyQt6) require a shared library. - # Because Conan won't allow for building the same library with two different options (easily) we need to install it explicitly - # and do a manual copy to the VirtualEnv, such that Pyinstaller can find it. - - - name: Install OpenSSL shared - run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy - - - name: Copy OpenSSL shared (Bash) - run: | - cp ./openssl/lib/*.so* ./cura_inst/bin/ || true - cp ./openssl/lib/*.dylib* ./cura_inst/bin/ || true - - - name: Create the Cura dist - run: pyinstaller ./cura_inst/UltiMaker-Cura.spec - - - name: Output the name file name and extension - id: filename - shell: python - run: | - import os - enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else "" - if "${{ inputs.operating_system }}" == "ubuntu-22.04": - installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-linux-modern-${{ inputs.architecture }}" - else: - installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-linux-${{ inputs.architecture }}" - output_env = os.environ["GITHUB_OUTPUT"] - content = "" - if os.path.exists(output_env): - with open(output_env, "r") as f: - content = f.read() - with open(output_env, "w") as f: - f.write(content) - f.writelines(f"INSTALLER_FILENAME={installer_filename}\n") - - - name: Summarize the used Conan dependencies - shell: python - run: | - import os - import json - from pathlib import Path - - conan_install_info_path = Path("cura_inst/conan_install_info.json") - conan_info = {"installed": []} - if os.path.exists(conan_install_info_path): - with open(conan_install_info_path, "r") as f: - conan_info = json.load(f) - sorted_deps = sorted([dep["recipe"]["id"].replace('#', r' rev: ') for dep in conan_info["installed"]]) - - summary_env = os.environ["GITHUB_STEP_SUMMARY"] - content = "" - if os.path.exists(summary_env): - with open(summary_env, "r") as f: - content = f.read() - - with open(summary_env, "w") as f: - f.write(content) - f.writelines("# ${{ steps.filename.outputs.INSTALLER_FILENAME }}\n") - f.writelines("## Conan packages:\n") - for dep in sorted_deps: - f.writelines(f"`{dep}`\n") - - - name: Summarize the used Python modules - shell: python - run: | - import os - import pkg_resources - summary_env = os.environ["GITHUB_STEP_SUMMARY"] - content = "" - if os.path.exists(summary_env): - with open(summary_env, "r") as f: - content = f.read() - - with open(summary_env, "w") as f: - f.write(content) - f.writelines("## Python modules:\n") - for package in pkg_resources.working_set: - f.writelines(f"`{package.key}/{package.version}`\n") - - - name: Create the Linux AppImage (Bash) - run: | - python ../cura_inst/packaging/AppImage/create_appimage.py ./UltiMaker-Cura $CURA_VERSION_FULL "${{ steps.filename.outputs.INSTALLER_FILENAME }}.AppImage" - chmod +x "${{ steps.filename.outputs.INSTALLER_FILENAME }}.AppImage" - working-directory: dist - - - name: Upload the AppImage - uses: actions/upload-artifact@v3 - with: - name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-AppImage - path: | - dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.AppImage - retention-days: 5 - - notify-export: - if: ${{ always() }} - needs: [ cura-installer-create ] - - uses: ultimaker/cura/.github/workflows/notify.yml@main + - name: Setup Python and pip + uses: actions/setup-python@v4 with: - success: ${{ contains(join(needs.*.result, ','), 'success') }} - success_title: "Create the Cura distributions" - success_body: "Installers for ${{ inputs.cura_conan_version }}" - failure_title: "Failed to create the Cura distributions" - failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}" - secrets: inherit + python-version: '3.10.x' + cache: 'pip' + cache-dependency-path: .github/workflows/requirements-conan-package.txt + + - name: Install Python requirements for runner + run: pip install -r .github/workflows/requirements-conan-package.txt + + - name: Cache Conan local repository packages (Bash) + uses: actions/cache@v3 + with: + path: | + $HOME/.conan/data + $HOME/.conan/conan_download_cache + key: conan-${{ runner.os }}-${{ runner.arch }}-installer-cache + + - name: Hack needed specifically for ubuntu-22.04 from mid-Feb 2023 onwards + if: ${{ startsWith(inputs.operating_system, 'ubuntu-22.04') }} + run: sudo apt remove libodbc2 libodbcinst2 unixodbc-common -y + + # NOTE: Due to what are probably github issues, we have to remove the cache and reconfigure before the rest. + # This is maybe because grub caches the disk it uses last time, which is recreated each time. + - name: Install Linux system requirements + run: | + sudo rm /var/cache/debconf/config.dat + sudo dpkg --configure -a + sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y + sudo apt update + sudo apt upgrade + sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config -y + wget --no-check-certificate --quiet https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage -O $GITHUB_WORKSPACE/appimagetool + chmod +x $GITHUB_WORKSPACE/appimagetool + echo "APPIMAGETOOL_LOCATION=$GITHUB_WORKSPACE/appimagetool" >> $GITHUB_ENV + + - name: Install GCC-13 + run: | + sudo apt install g++-13 gcc-13 -y + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 13 + + - name: Create the default Conan profile + run: conan profile new default --detect --force + + - name: Configure GPG Key Linux (Bash) + run: echo -n "$GPG_PRIVATE_KEY" | base64 --decode | gpg --import + + - name: Get Conan configuration + run: | + conan config install https://github.com/Ultimaker/conan-config.git + conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}" + + - name: Use Conan download cache (Bash) + run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache" + + - name: Create the Packages (Bash) + run: conan install $CURA_CONAN_VERSION ${{ inputs.conan_args }} --build=missing --update -if cura_inst -g VirtualPythonEnv -o cura:enterprise=$ENTERPRISE -o cura:staging=$STAGING --json "cura_inst/conan_install_info.json" + + - name: Upload the Package(s) + if: always() + run: | + conan upload "*" -r cura --all -c + + - name: Set Environment variables for Cura (bash) + run: | + . ./cura_inst/bin/activate_github_actions_env.sh + . ./cura_inst/bin/activate_github_actions_version_env.sh + + # FIXME: This is a workaround to ensure that we use and pack a shared library for OpenSSL 1.1.1l. We currently compile + # OpenSSL statically for CPython, but our Python Dependenies (such as PyQt6) require a shared library. + # Because Conan won't allow for building the same library with two different options (easily) we need to install it explicitly + # and do a manual copy to the VirtualEnv, such that Pyinstaller can find it. + + - name: Install OpenSSL shared + run: conan install openssl/1.1.1l@_/_ --build=missing --update -o openssl:shared=True -g deploy + + - name: Copy OpenSSL shared (Bash) + run: | + cp ./openssl/lib/*.so* ./cura_inst/bin/ || true + cp ./openssl/lib/*.dylib* ./cura_inst/bin/ || true + + - name: Create the Cura dist + run: pyinstaller ./cura_inst/UltiMaker-Cura.spec + + - name: Output the name file name and extension + id: filename + shell: python + run: | + import os + enterprise = "-Enterprise" if "${{ inputs.enterprise }}" == "true" else "" + if "${{ inputs.operating_system }}" == "ubuntu-22.04": + installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-linux-modern-${{ inputs.architecture }}" + else: + installer_filename = f"UltiMaker-Cura-{os.getenv('CURA_VERSION_FULL')}{enterprise}-linux-${{ inputs.architecture }}" + output_env = os.environ["GITHUB_OUTPUT"] + content = "" + if os.path.exists(output_env): + with open(output_env, "r") as f: + content = f.read() + with open(output_env, "w") as f: + f.write(content) + f.writelines(f"INSTALLER_FILENAME={installer_filename}\n") + + - name: Summarize the used Conan dependencies + shell: python + run: | + import os + import json + from pathlib import Path + + conan_install_info_path = Path("cura_inst/conan_install_info.json") + conan_info = {"installed": []} + if os.path.exists(conan_install_info_path): + with open(conan_install_info_path, "r") as f: + conan_info = json.load(f) + sorted_deps = sorted([dep["recipe"]["id"].replace('#', r' rev: ') for dep in conan_info["installed"]]) + + summary_env = os.environ["GITHUB_STEP_SUMMARY"] + content = "" + if os.path.exists(summary_env): + with open(summary_env, "r") as f: + content = f.read() + + with open(summary_env, "w") as f: + f.write(content) + f.writelines("# ${{ steps.filename.outputs.INSTALLER_FILENAME }}\n") + f.writelines("## Conan packages:\n") + for dep in sorted_deps: + f.writelines(f"`{dep}`\n") + + - name: Summarize the used Python modules + shell: python + run: | + import os + import pkg_resources + summary_env = os.environ["GITHUB_STEP_SUMMARY"] + content = "" + if os.path.exists(summary_env): + with open(summary_env, "r") as f: + content = f.read() + + with open(summary_env, "w") as f: + f.write(content) + f.writelines("## Python modules:\n") + for package in pkg_resources.working_set: + f.writelines(f"`{package.key}/{package.version}`\n") + + - name: Create the Linux AppImage (Bash) + run: | + python ../cura_inst/packaging/AppImage/create_appimage.py ./UltiMaker-Cura $CURA_VERSION_FULL "${{ steps.filename.outputs.INSTALLER_FILENAME }}.AppImage" + chmod +x "${{ steps.filename.outputs.INSTALLER_FILENAME }}.AppImage" + working-directory: dist + + - name: Upload the AppImage + uses: actions/upload-artifact@v3 + with: + name: ${{ steps.filename.outputs.INSTALLER_FILENAME }}-AppImage + path: | + dist/${{ steps.filename.outputs.INSTALLER_FILENAME }}.AppImage + retention-days: 5 + + notify-export: + if: ${{ always() }} + needs: [ cura-installer-create ] + + uses: ultimaker/cura/.github/workflows/notify.yml@main + with: + success: ${{ contains(join(needs.*.result, ','), 'success') }} + success_title: "Create the Cura distributions" + success_body: "Installers for ${{ inputs.cura_conan_version }}" + failure_title: "Failed to create the Cura distributions" + failure_body: "Failed to create at least 1 installer for ${{ inputs.cura_conan_version }}" + secrets: inherit diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index f08acbdb04..8321f42a23 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -2,163 +2,165 @@ name: unit-test on: - push: - paths: - - 'plugins/**' - - 'resources/**' - - 'cura/**' - - 'icons/**' - - 'tests/**' - - 'packaging/**' - - '.github/workflows/conan-*.yml' - - '.github/workflows/unit-test.yml' - - '.github/workflows/notify.yml' - - '.github/workflows/requirements-conan-package.txt' - - 'requirements*.txt' - - 'conanfile.py' - - 'conandata.yml' - - 'GitVersion.yml' - - '*.jinja' - branches: - - main - - 'CURA-*' - - '[1-9]+.[0-9]+' - tags: - - '[0-9]+.[0-9]+.[0-9]+' - - '[0-9]+.[0-9]+-beta' - pull_request: - paths: - - 'plugins/**' - - 'resources/**' - - 'cura/**' - - 'icons/**' - - 'tests/**' - - 'packaging/**' - - '.github/workflows/conan-*.yml' - - '.github/workflows/unit-test.yml' - - '.github/workflows/notify.yml' - - '.github/workflows/requirements-conan-package.txt' - - 'requirements*.txt' - - 'conanfile.py' - - 'conandata.yml' - - 'GitVersion.yml' - - '*.jinja' - branches: - - main - - '[1-9]+.[0-9]+' - tags: - - '[0-9]+.[0-9]+.[0-9]+' - - '[0-9]+.[0-9]+-beta' + push: + paths: + - 'plugins/**' + - 'resources/**' + - 'cura/**' + - 'icons/**' + - 'tests/**' + - 'packaging/**' + - '.github/workflows/conan-*.yml' + - '.github/workflows/unit-test.yml' + - '.github/workflows/notify.yml' + - '.github/workflows/requirements-conan-package.txt' + - 'requirements*.txt' + - 'conanfile.py' + - 'conandata.yml' + - 'GitVersion.yml' + - '*.jinja' + branches: + - main + - 'CURA-*' + - '[1-9]+.[0-9]+' + tags: + - '[0-9]+.[0-9]+.[0-9]+' + - '[0-9]+.[0-9]+-beta' + pull_request: + paths: + - 'plugins/**' + - 'resources/**' + - 'cura/**' + - 'icons/**' + - 'tests/**' + - 'packaging/**' + - '.github/workflows/conan-*.yml' + - '.github/workflows/unit-test.yml' + - '.github/workflows/notify.yml' + - '.github/workflows/requirements-conan-package.txt' + - 'requirements*.txt' + - 'conanfile.py' + - 'conandata.yml' + - 'GitVersion.yml' + - '*.jinja' + branches: + - main + - '[1-9]+.[0-9]+' + tags: + - '[0-9]+.[0-9]+.[0-9]+' + - '[0-9]+.[0-9]+-beta' env: - CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} - CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} - CONAN_LOGIN_USERNAME_CURA_CE: ${{ secrets.CONAN_USER }} - CONAN_PASSWORD_CURA_CE: ${{ secrets.CONAN_PASS }} - CONAN_LOG_RUN_TO_OUTPUT: 1 - CONAN_LOGGING_LEVEL: info - CONAN_NON_INTERACTIVE: 1 + CONAN_LOGIN_USERNAME_CURA: ${{ secrets.CONAN_USER }} + CONAN_PASSWORD_CURA: ${{ secrets.CONAN_PASS }} + CONAN_LOGIN_USERNAME_CURA_CE: ${{ secrets.CONAN_USER }} + CONAN_PASSWORD_CURA_CE: ${{ secrets.CONAN_PASS }} + CONAN_LOG_RUN_TO_OUTPUT: 1 + CONAN_LOGGING_LEVEL: info + CONAN_NON_INTERACTIVE: 1 permissions: contents: read jobs: - conan-recipe-version: - uses: ultimaker/cura/.github/workflows/conan-recipe-version.yml@main + conan-recipe-version: + uses: ultimaker/cura/.github/workflows/conan-recipe-version.yml@main + with: + project_name: cura + + testing: + runs-on: ubuntu-22.04 + needs: [ conan-recipe-version ] + + steps: + - name: Checkout + uses: actions/checkout@v3 with: - project_name: cura + fetch-depth: 2 - testing: - runs-on: ubuntu-22.04 - needs: [ conan-recipe-version ] + - name: Setup Python and pip + uses: actions/setup-python@v4 + with: + python-version: '3.11.x' + architecture: 'x64' + cache: 'pip' + cache-dependency-path: .github/workflows/requirements-conan-package.txt - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 2 + - name: Install Python requirements and Create default Conan profile + run: pip install -r requirements-conan-package.txt + working-directory: .github/workflows/ - - name: Setup Python and pip - uses: actions/setup-python@v4 - with: - python-version: '3.11.x' - architecture: 'x64' - cache: 'pip' - cache-dependency-path: .github/workflows/requirements-conan-package.txt + - name: Use Conan download cache (Bash) + if: ${{ runner.os != 'Windows' }} + run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache" - - name: Install Python requirements and Create default Conan profile - run: pip install -r requirements-conan-package.txt - working-directory: .github/workflows/ + - name: Cache Conan local repository packages (Bash) + uses: actions/cache@v3 + if: ${{ runner.os != 'Windows' }} + with: + path: | + $HOME/.conan/data + $HOME/.conan/conan_download_cache + key: conan-${{ runner.os }}-${{ runner.arch }}-unit-cache - - name: Use Conan download cache (Bash) - if: ${{ runner.os != 'Windows' }} - run: conan config set storage.download_cache="$HOME/.conan/conan_download_cache" + # NOTE: Due to what are probably github issues, we have to remove the cache and reconfigure before the rest. + # This is maybe because grub caches the disk it uses last time, which is recreated each time. + - name: Install Linux system requirements + if: ${{ runner.os == 'Linux' }} + run: | + sudo rm /var/cache/debconf/config.dat + sudo dpkg --configure -a + sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y + sudo apt update + sudo apt upgrade + sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config -y - - name: Cache Conan local repository packages (Bash) - uses: actions/cache@v3 - if: ${{ runner.os != 'Windows' }} - with: - path: | - $HOME/.conan/data - $HOME/.conan/conan_download_cache - key: conan-${{ runner.os }}-${{ runner.arch }}-unit-cache + - name: Install GCC-13 + run: | + sudo apt install g++-13 gcc-13 -y + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 13 - # NOTE: Due to what are probably github issues, we have to remove the cache and reconfigure before the rest. - # This is maybe because grub caches the disk it uses last time, which is recreated each time. - - name: Install Linux system requirements - if: ${{ runner.os == 'Linux' }} - run: | - sudo rm /var/cache/debconf/config.dat - sudo dpkg --configure -a - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y - sudo apt update - sudo apt upgrade - sudo apt install build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config -y + - name: Get Conan configuration + run: | + conan config install https://github.com/Ultimaker/conan-config.git + conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}" - - name: Install GCC-12 on ubuntu-22.04 - run: | - sudo apt install g++-12 gcc-12 -y - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12 - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12 - - - name: Get Conan configuration - run: conan config install https://github.com/Ultimaker/conan-config.git + - name: Get Conan profile + run: conan profile new default --detect --force - - name: Get Conan profile - run: conan profile new default --detect --force + - name: Install dependencies + run: conan install . ${{ needs.conan-recipe-version.outputs.recipe_id_full }} --build=missing --update -o cura:devtools=True -g VirtualPythonEnv -if venv - - name: Install dependencies - run: conan install . ${{ needs.conan-recipe-version.outputs.recipe_id_full }} --build=missing --update -o cura:devtools=True -g VirtualPythonEnv -if venv + - name: Upload the Dependency package(s) + run: conan upload "*" -r cura --all -c - - name: Upload the Dependency package(s) - run: conan upload "*" -r cura --all -c + - name: Set Environment variables for Cura (bash) + if: ${{ runner.os != 'Windows' }} + run: | + . ./venv/bin/activate_github_actions_env.sh - - name: Set Environment variables for Cura (bash) - if: ${{ runner.os != 'Windows' }} - run: | - . ./venv/bin/activate_github_actions_env.sh + - name: Run Unit Test + id: run-test + run: | + pytest --junitxml=junit_cura.xml + working-directory: tests - - name: Run Unit Test - id: run-test - run: | - pytest --junitxml=junit_cura.xml - working-directory: tests + - name: Save PR metadata + if: always() + run: | + echo ${{ github.event.number }} > pr-id.txt + echo ${{ github.event.pull_request.head.repo.full_name }} > pr-head-repo.txt + echo ${{ github.event.pull_request.head.ref }} > pr-head-ref.txt + working-directory: tests - - name: Save PR metadata - if: always() - run: | - echo ${{ github.event.number }} > pr-id.txt - echo ${{ github.event.pull_request.head.repo.full_name }} > pr-head-repo.txt - echo ${{ github.event.pull_request.head.ref }} > pr-head-ref.txt - working-directory: tests - - - name: Upload Test Results - if: always() - uses: actions/upload-artifact@v3 - with: - name: test-result - path: | - tests/**/*.xml - tests/pr-id.txt - tests/pr-head-repo.txt - tests/pr-head-ref.txt + - name: Upload Test Results + if: always() + uses: actions/upload-artifact@v3 + with: + name: test-result + path: | + tests/**/*.xml + tests/pr-id.txt + tests/pr-head-repo.txt + tests/pr-head-ref.txt diff --git a/.github/workflows/update-translation.yml b/.github/workflows/update-translation.yml index 65693be937..55ce144666 100644 --- a/.github/workflows/update-translation.yml +++ b/.github/workflows/update-translation.yml @@ -1,82 +1,87 @@ name: update-translations on: - push: - paths: - - 'plugins/**' - - 'resources/**' - - 'cura/**' - - 'icons/**' - - 'tests/**' - - 'packaging/**' - - '.github/workflows/conan-*.yml' - - '.github/workflows/notify.yml' - - '.github/workflows/requirements-conan-package.txt' - - 'requirements*.txt' - - 'conanfile.py' - - 'conandata.yml' - - 'GitVersion.yml' - - '*.jinja' - branches: - - '[1-9].[0-9]' - - '[1-9].[0-9][0-9]' - tags: - - '[1-9].[0-9].[0-9]*' - - '[1-9].[0-9].[0-9]' - - '[1-9].[0-9][0-9].[0-9]*' + push: + paths: + - 'plugins/**' + - 'resources/**' + - 'cura/**' + - 'icons/**' + - 'tests/**' + - 'packaging/**' + - '.github/workflows/conan-*.yml' + - '.github/workflows/notify.yml' + - '.github/workflows/requirements-conan-package.txt' + - 'requirements*.txt' + - 'conanfile.py' + - 'conandata.yml' + - 'GitVersion.yml' + - '*.jinja' + branches: + - '[1-9].[0-9]' + - '[1-9].[0-9][0-9]' + tags: + - '[1-9].[0-9].[0-9]*' + - '[1-9].[0-9].[0-9]' + - '[1-9].[0-9][0-9].[0-9]*' jobs: - update-translations: - name: Update translations + update-translations: + name: Update translations - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v3 + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 - - name: Cache Conan data - id: cache-conan - uses: actions/cache@v3 - with: - path: ~/.conan - key: ${{ runner.os }}-conan + - name: Cache Conan data + id: cache-conan + uses: actions/cache@v3 + with: + path: ~/.conan + key: ${{ runner.os }}-conan - - name: Setup Python and pip - uses: actions/setup-python@v4 - with: - python-version: 3.10.x - cache: pip - cache-dependency-path: .github/workflows/requirements-conan-package.txt + - name: Setup Python and pip + uses: actions/setup-python@v4 + with: + python-version: 3.11.x + cache: pip + cache-dependency-path: .github/workflows/requirements-conan-package.txt - - name: Install Python requirements for runner - run: pip install -r .github/workflows/requirements-conan-package.txt + - name: Install Python requirements for runner + run: pip install -r .github/workflows/requirements-conan-package.txt - # NOTE: Due to what are probably github issues, we have to remove the cache and reconfigure before the rest. - # This is maybe because grub caches the disk it uses last time, which is recreated each time. - - name: Install Linux system requirements - if: ${{ runner.os == 'Linux' }} - run: | - sudo rm /var/cache/debconf/config.dat - sudo dpkg --configure -a - sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y - sudo apt update - sudo apt upgrade - sudo apt install efibootmgr build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config flex bison g++-12 gcc-12 -y - sudo apt install g++-12 gcc-12 -y - sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12 - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12 + # NOTE: Due to what are probably github issues, we have to remove the cache and reconfigure before the rest. + # This is maybe because grub caches the disk it uses last time, which is recreated each time. + - name: Install Linux system requirements + if: ${{ runner.os == 'Linux' }} + run: | + sudo rm /var/cache/debconf/config.dat + sudo dpkg --configure -a + sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y + sudo apt update + sudo apt upgrade + sudo apt install efibootmgr build-essential checkinstall libegl-dev zlib1g-dev libssl-dev ninja-build autoconf libx11-dev libx11-xcb-dev libfontenc-dev libice-dev libsm-dev libxau-dev libxaw7-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxi-dev libxinerama-dev libxkbfile-dev libxmu-dev libxmuu-dev libxpm-dev libxrandr-dev libxrender-dev libxres-dev libxss-dev libxt-dev libxtst-dev libxv-dev libxvmc-dev libxxf86vm-dev xtrans-dev libxcb-render0-dev libxcb-render-util0-dev libxcb-xkb-dev libxcb-icccm4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-shape0-dev libxcb-sync-dev libxcb-xfixes0-dev libxcb-xinerama0-dev xkb-data libxcb-dri3-dev uuid-dev libxcb-util-dev libxkbcommon-x11-dev pkg-config flex bison g++-12 gcc-12 -y - - name: Create the default Conan profile - run: conan profile new default --detect --force + - name: Install GCC-13 + run: | + sudo apt install g++-13 gcc-13 -y + sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13 + sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 13 - - name: Get Conan configuration - run: conan config install https://github.com/Ultimaker/conan-config.git + - name: Create the default Conan profile + run: conan profile new default --detect --force - - name: generate the files using Conan install - run: conan install . --build=missing --update -o cura:devtools=True + - name: Get Conan configuration + run: | + conan config install https://github.com/Ultimaker/conan-config.git + conan config install https://github.com/Ultimaker/conan-config.git -a "-b runner/${{ runner.os }}/${{ runner.arch }}" - - uses: stefanzweifel/git-auto-commit-action@v4 - with: - file_pattern: resources/i18n/*.po resources/i18n/*.pot - status_options: --untracked-files=no - commit_message: update translations + - name: generate the files using Conan install + run: conan install . --build=missing --update -o cura:devtools=True + + - uses: stefanzweifel/git-auto-commit-action@v4 + with: + file_pattern: resources/i18n/*.po resources/i18n/*.pot + status_options: --untracked-files=no + commit_message: update translations From 2b6b43efc08d293c93d6c718be64cd0e01689410 Mon Sep 17 00:00:00 2001 From: MariMakes <40423138+MariMakes@users.noreply.github.com> Date: Fri, 1 Sep 2023 11:40:00 +0200 Subject: [PATCH 120/126] Update MacOS Installation Screen We still had the temporary logo on this screen. Our designers created an updated version. --- packaging/MacOS/cura_background_dmg.png | Bin 390200 -> 427345 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/packaging/MacOS/cura_background_dmg.png b/packaging/MacOS/cura_background_dmg.png index 8f2fb50b051a884ac87740b43c2cfb3108c8f1b5..a293d94bd2a422d8abc5efc1d25f50e06014b7d3 100644 GIT binary patch literal 427345 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

    t2?D=j9bcc;@N8#w&1!iV$j1K&3)aJlrjjdd% zb=4(?9cIV+d%Y+^O#kY#au{J++(@pT2bYG%IWuC9_vCegZ*b4(3vCCT4PtDGx{A{? z;NRFUgBt5B#o8`YVzHCAReJMr&u zFEkd8f&6JHPD7A_pZ*j7^d*J4;NL7Vb`8#{XXP_xr26BTp0muy^8LCm2;sL|bswyP4ujVvK^KbIxuheJ+}|==6xhu8NS3 z;j|IrA0rvXzKBPUySbRA(BKc;f(8E0oe&idW+2p$<+q&N$xK`e_I&e+s3aaQ*vdY5aQI` zM`fzi7N2EzN0=xf@uI_n1f}-$ut%;Z$14Pn$xw!_&U;6fN-Q3$7X^jqmBVy0>1%ht z4DOcD!56781|g5C|GvI3cZYpFE_MRfeLa@2cRny`YIrPBAA$BufYW zl@N`8rFQ)Mw)kWGgHkg2)Hn*^7cKgMe-V-rz1Oc!1dya^4EQhRq`<#S{lI_wQ7OE0 z@$VF1qZ7vjGbUV{+HcHrKk;A0zY~?*6R|oF0$=u;>{=O<@Jk)UZLVz>AnI)WH~z^R zaNWWG140K*&4Nr2ob>ot4ENbr$0f#a|Hl9RSl$OtL^DTe!0x*3Ag)I7RA@i6ga}i| zLPoJOH4(*KK5B1+SVkurdg|pMVs21A9H+vLON^n7XA=_myLk2nw6X#e=FF*nTyNT1 zX?M~TjBrZBW(R|a;l{WW@n}b~8;IIUe%BFso&1mGrzeC%7o$gD!e6wjywg10S^QJI zaXpnU;yZGxL^kFA>AM36Y#tuD2>!e-5m>lh%Oxbte$@-Rqo2-;Y zgNQJa1k2x76;``1wFx@90pr9OWG{lMU)^I1A<@3l(pJY#PAy-n)ZK_VMMi7QpFzMo zw9A3y_fi7?h+JMP{F9LEkB)sXc^t5LgIF6mknIH@igEu3|64bh{1G7J$GD!eWU~-I zPoL!RRS-S!pAjo(5A$)vcwCqGKjQ}edDXB$8lJ(niG`yz>UCziij@sR6ww>_H?i+o z_2#0B|3^Je&UPVPu@~cCvBbRfmpocADf~C%d4T^uw8Ovx{#CCD1qq;w|2g=7+WRN| zC&n6YcSU`L#IyaVI>k-PkAp61lTN6@dfd{>M9t8`{_UtCejESi|z~OsLVFqzx70 zqkT0EO+~~6-e&MA_G_!c3}OToxCg(?VbkBX8ir1=%n}f7>C~b}2}?@NBAtGeKdV&7 z`ZOPg`q<yU0O~A-jcp%6!vve9e9IpO8HQ27#^hOtEM=tWk6}Md*m2K9le`h|5&9 z>Up{!gz+%$L1T@(cs&t;+Yq6OO#X95z@8Bz&~%Oie+ znBrjVu~vw)f-P+iR;Vh!I!e8;NuRZP9n6pY+`H~4s8bjj34*c*A0+g8n4qUCt1FS$ zWQoDMnz5FIE1$!jVv?$x2V2XO&1m3?BqCxW(?xXenBy5n5kDy3zB$P#{;xQ%=uTiE5!zuZ@Ny&som*uNMs8t#Nwo~wGdyNPGVVi~!(DRE0uv7*Me8Wo=UTI_P z&bWh$HvZRq7SBv(zwvLuW&H1T!2c+09xTLSlIwWJec-I4GhRL972$vCC;nZ4J2%)r z#=n_b&tZE7T_H0%eWIXb!q+evcz8p<`+6?^PsmnCnjB=vj}DxU1&`OnEV5iiMG^@W zBer&)Co-*PXEAM}h>f8YnzU~V4iMok|w@zdPn0KboTZrz6~`MzpUguXZ06BglAv z!o6c$_ARwv)Zd@Kr+G;+_pl&Au+}e|OuO3T{Sf%0f(6|{1dZt9Fwcxc6?UMU61nRf zUzvarLTvBQ0}2q%`F@u=;U&T}*WN@Wrx|3!uOx~RdHFF1ZK$gJJV0IZF%akP*9XaV zaYcXGng#GN(UeU#d3S=}>*2@*M69dz(U=Go1}n^z*<)TEBh=5;ZxD=y7Lt964${QA zH$K;QDv!QOF1WB{Q|M?k8Uc{>S-SNh9#D zG%<<)k+q2I@%5AQ2>-i=4hUZS%`9JVq^*jxj82J>$-;>e>5mQz2bJxXx{lb3?HvSLeXc}Ve;J>dw zqDZO|9?_Unv%|SDxjT%Je8M{p{EXpHV9{%azD=PY-s5>_=5cv>MQG>leKgjw+( zex~s0vxOarov7^AS?gNFGS({cP+P7Iqy)$H+MGUyu#8?Zq8<6a9aAW|n97#{fd2-D zxUftUg+A6k(ohi&Vbr-Na%zq50+V5vvmko(_&oJ{-|nB-?LtZM&d}ke;g_lK8)K6m zl17N97n~j@koHxSR)s&h6fzUFcR6N4)b%4Chj!=O20^3|lLLzgih+K7e-;J-`oI-|mTn{aT~T+FxTAnS##=J7RZoMHG^kVfm-sH!_i*#A~tVpd<@clxGZ z#{|^*mvG>FiKZ?UCcd`Li*WCHd;)Cfphbcfq*IKFQfH!0g>I}CH9xXVA((;*C)dWn z3)O?1*31jQe*} z>j}m`Cv?Mui!}ZxX@#O_4zz76$CJAZHpSQmf&av6J$@3#iYI}N|0SY$<3C3E#(%}a zY2)sPw-MhIW6m$t?hbav`{&xJi~s~yOU=@37CW%J?jV1zy;sj=&hw)SUHvFrCJPdB zH-rc}TpM$9vO>2pCoU`VU~>$JLlL5gosyPs^-OYMS6|A(F*QVUjRWu6M6Es^9BdgJ z`yKjWv^3gkmpvIA(V*b&F~9Jixh5ivLbvLBJgs-~Uf8Q2*J7PWlGWslsHjHx$Hd*? z8<;CJOjpGnQRvk8Ib0USZk<&6sIiC5NmITy<~{ufns^OJiPxbGXX*fAxZG8j;|vj2 zSbu-KXYS~7$QGqJjq6E>#)q$9V&OklTmzqA@dj`y zU$*`-VdcVEj5cj%{Kty#U#iGuah*^67f%a}e=LL_{Thx-Q@Obb~Um*;vymgCZrG0wrijy)gvuW$S(;e5S@ zcoW^N-*__lyyufEMoD`DdB;{PGA7>f8EhfIAs$4*a?}w*r&t*uhxQC(Wt2&;F)fpZ ztkxQuzQ;V=A84FWHzyP*L_}tV1vWE*)Gyai*XP`Z_9>%1^M6+!t0IYLot=EUdK`~) zoMuTQ34m_WNh`IMHi#E$fshwbC=fRkvn&E3nlUHS@y0LA+tvs}2UeY+G>`XD-E+x+ z`GrFIvw#k}HoC;L)Wi`wLh#@}FxX+~|HiFH-E@hqWTPI!<~* zJ1BWaRa;CJ$T&sa5VuLV-(0F>Y#y(wEEVUBlfK`3Kd~l7CFY+|4jMds7x8}|`-o+F zvCIeEnOJ0xjChj1*Ovz7k7Bc_`}Njh|n=WOY34j?UDe-D03D! z*e~K+_^&w?_m_p9;V8V#=l8>o)ByalAv?!LCQcX9^~As41Bb*aq{T7wM4V+sCr0mN z1qcY+B7Xyj?eGMtb?Lc){j+!Wh zR&Y`+{!ek;5niv+I&>3xYqTNVJkAXU7BCZH&R+xne78e+&M$--|JGNXSF*r0{x!+p zm$y0$6j)~2l6U}sEPC+s1kVCA&B{TK231n}+A8^Qi8dJm^TzzeLS%eDT@Zm^3W%zT zE)4=3aS;3AjFbLRH*8A&QM`>rq%ad}pAavf*Q?kau7codaeLyR;7NuA-Ea(j46w$wD*uX0e!7r?*J z5&1t~reZ~8lM`g0lm7{QbUceul5y0$jlLK0e8r;H(SeC#)a{-%a5bMzYpj_2!Z*x8 zqbIAdwxSJ?nO=$+#riOiY_Af91AmIWMq-dBPX2fZ(kBtK6CeOPOiRgZ;=%Ybum%b| zHuMN!{y*pB{>7yX?+OB=C#;R^?;$c2()b_aY@OqySFO7{HpTs-hHYjl@y=+Qv0hnj zka6EkgzofElp(nelc07*f6;cd)4vb&tB)=?Mi-Xz{eF-|Y7z+jNF=?6``rv-VJ=Rh zF~fiU`K^kQj&{rp95rk(Oyntvi}zbN?bx>CxyodWo6cIw1(%;c6boeIP$!4Tj$x!2 zayk{J2$N%+Y{pxMn1We1cy|dPgd#AzkC=O=6ZoH|^E!5PwhfAI0W>iU?S;groRct% zF1X#XgM!CDe<`#d_#Y1U5)XXi9}XEGT{!+?Gf@ci!v+}uxqbhEMWoPd%{2U{GF-h5MFoj|M?}f!}QUP*2+#@i}V)%9h`Mu6Qsa2 zp!v-WZ`;3r;J?hnlLEIA|9L7@fqyk8B+8l9n(^C-e_Lu}t3Uq$27jNE*TACwiGPQx zF|kMdoCxUiF}>zft+m~yjfI=kv6-2OXKsqV(Q7x#nPV=U!w&>#J@B85BhI99vxw>p zR6Z&(2Rx*LVY*`+^(4;_ODJ+X_t90!1{8KhEiuGV7B3ZGuV-FrbHxPy4USUmmj!x* zdlUxP^IYdN=w&yVh{?Iy_L&mo264gszw@^DY@UQmOGoSbCJTo0h&Ej@2lWI0IxS_v zL>GBqJLrVWC3s@ZnbjL}xfsWL;hUj9%NawyRh*6S3>lybnM;TDUB?t0tn0j~Ysk7? zj}Y~(1(Q!7;%Exw0}T4R1u5n(*rTCY6lyFqlwgAEswC=)o+3m4eR-j#jerVZ7ay&l z2;*iwuI-^N+f=xQ{y~;(dVcZad@Af0{u!6GF^NsS>4%8nWDs4LVlxMA60C;Ld~4@0 z02FyT=P3%pp*Zh|i0sCoR>mg*ipGON3X7ZEQ z0D|GAoxjqE-yBh6E|&eUNpqkF*9zY9KL}Kw)+$LLMFv>fLwzt3MOE{f0Dk9G^*sj9D|8;p0FZ{ywn@`Nan?%;E+8hd1tz(2-tOo2C; zl>fH$qU+rMDg?W24-a?N+?e!;ZJE!y%nU?bgTG|2c9W70h}hgZKyV690Ls znfMRealSA7%RS<7>OZYnfFb_Jo8U045%xO&shJ`dmMaY7zxP?~ga6O#-A8CqJOKab zzNT?oe=(#h%|sVc-Zh#-DPr%Mt77|HGfAv9o|#HW>O3%HHO3qKjf9Vj7{}Vbj>Y1? zAcVUj^F+$BO8X&B{fG z4o1{awLip%q#pf@dK0)M_S$?h_8BaKx!Pph%B4+`vzSG&)|hD9u*L6%wMzy#Ehd}c zv&}sx|95aV?Xf99j|2?O4h^AV1`|bKs~3aoc>GW2VdVWZ@PBl=9Y&sOb89=NYv2j| z8(<=FpJC0s&K2WqUsLluQ`8>pf_JxQ) zTsr>ShWgTX-S-uI+2e?w&K;Z0>;6k-=%Bu>kb-kcN7d6aCwhTicY%F<6J~{@cJB^&fxjVR>c|rdKXJxJ(56M&*ZeX z3J-tEw!Fb&GsWHQu=pv05$`f*Kn`_0EJ%oya(f@n3oD^;Sy!M-$;Ehpo5Wl&-9c5% zjfn6OvrHxiwggpJXEXJK13>Jt1u%E)WP-=Wdw^ANe}_%`&bRr@Nlf?`&yJR&S7TpY z`I&415I^k@S#LvvV#D55n zu9K_&8~^ppL*XvA%Zd$y&$}!DI()-?Vtms+tU8mMBE!3D?E+Y3GkSQ zA%B|-PAqE}svbK72|=DNL3qri8@|R94Lgs~uuybmskI9tr33$QLdyNO+}^GE_O|K} zruW)TY?rJpb z#5Fv&Ba+-VhXR(->ij`Me0QZt2*Fa=|M1Bl?$dhEHSsb6hdPB*KcCGW7s~I~IR5L6-{}kZdfq(!PAOkI8{!-)xBa z`tArk)w289?an<+Mu@X{+Vy(3L~k5BmP5B*{6m;`;GbCzi@Z^=CZ-)`9{YUSKsoSk z?+gDR<1hRd&HKQAb#{7ySKh0_1!U+Vm1E#nZ?!3n%ND6OIo9)$CAK}D_@|x*QOH3p zyYb5d|5Fvq`k(RNe0-uWzanX7ft-+wHI!(g>-jiAMQpEKMliXfb<2;!Ki+;naDPR( zG7N|CnyQri2R8$_UaBX}}2r;;^4yh-&9imy3&zA`YIRY1)nr8@N^}uIX%! z;s&S5RdM+;+-IdPb`8hoFtd8Uob!zwG$A^sR91XOwlCXa+I7$H4Td7>{?@+M+HMYj zkrg~#7p|AxI|2vL3K9g_X=&^J5b`>=VwP@H%DPe2d15q6)+a;hP-l>a}mqWwRM)2Udy zwxxh!L?IBeLv{&PDN(U-l6X_L&FA4IRu+TD1Zpm0FstL{?H*(mTo0G~i$v6;JBj=5 ztC`hc|FRYX46|sZ&9JvT#*Nt38c&B*6x$<$3x)-kpbJJLgjz$OxT@MD*UZv;;lAG! zf!gy-3Q}S5drA9z!TNDKIxH)V6tw*QpmuybQ~{%`0e$@D*-m6(bkVVtIAxB-^q6laHM_ihoD8LPt3 zRT=y0(0}g=GIU953}P*kgnsfZiY4&4}qPB$q!K$Vpy7TR}zdzqe1dthOwnyw2Q zG!@)M@b`}h#(E@#V`DcCcN}JP#pCDqKDWHn!oLz6S>J^K9Si(v>BRqX4DB)c$6Jyu zID`b&FZ|Q?%gp{w5uHrZ>f9HMrc5$P7piK*dL5+H!eA(`*Nb)}nRM8*$?FgN8%9^# z;b(P{=(h=B8u%ZM*J8+GEOuU_-e&a^|F#TW*7f5G__;F9hRUJceI@>7+?oge**Tls zG`r{m$9U107x(VR%_PmZ6*Li6b8Sjdgi}i3RDfs+4GYRqob{@NRxm8r!LNLmViaJ= z*)8;ny*JbAQVy$=BJu*PS}*<><{-x}z%dmzmuq!IrU>j97vVUx6YLyCfCT66vV9+Y z!Xh7-1pd1y#YCYRr!CjLXL-Z;j}xPHUypOHhy{g<4kB8WI|V1b&D2j(czpEE9>h&H z18!U)DRUP)y)P@x@bW;ZITIW1|U=V;9m zCSp1odQm_k!%@>lbmtH1~ zoi?T=pZ9`+oQXym0E&Dn2*p6G2YdH(Me=tk8`4lcT-@ciyuKNGDW27-8U$h|TuL-{ z)*}$=lK~GpKWrgg?g||{5v&n_-PP{Bzmpb*&W!nq8T+0{BwNF1(8Tw zPLL3TK;y-Bz#tQ@->rhI0d|VVZE?&#&7ju7azZiLu z>}#S6G*LOiP$&w*2VGgAK*X>^R4w?_VJof}gEI-6Wf*o{8wT02HzqBr!2Kl|ct162u+wUc{rb&0P-U7=X?t|m; zShTXcKKK{vD5Mk(5}a9#|9VN7MuN9FN1(7akKvks``g6Wo!yJS?_W{Sk@c&ho4SzK z*{Oa@fw;t-4T5bXJSu}H&A+C7^Q6VXK0C`LqFh@L#=?I+@Gq)2{s-K+en|YAS;C@@ zpHVw4v(zxorSyk9o@;(=w*LM$ez>?3|8wrH%KA2V5S*j8&TFI#hCTs_IL6)K^IzUI zcRle>_DcMZlCS%A2mfnW^8U#G8JlPy5&uQ}ci`UynY0L3F#$SpPP2$sz1O0fM*K#R zhSi#EsBZe2wz=sL4-`>r%aK^9l5y$c6-|Fr=VO6z4--A3mS!CNIq)B;0wV2prO#3J z?gSWMOtkfqFw26ct_{HNxhm`x_%9z+ICZfo%Bpm<5(}+_QTUYjuPQ#vYREkcrQN;q zHy(S?ns>X5DNs|ZSvkVV$oA$Yhue~l;@NIv+Kd1Uu8C`!j&T9-{*C`qQBPM)XVVKw zM?6xG7w-}2F(#pnmA>>sZ5eT4M;E5*MoGl20!Fg|o39jOqO^dqpP!vy_8T z3_VWTBhsBiOd^_6N3N9gJEl%EkoQ#!E3y^*eTX(J!>EztSmcXy&h=9zHIIOaq4AhP zDTiv!&0|7qvMAt!Yb+FBuS;ND%IG);dq$RI2=F>iT=vB$WI`}j?6V`8ODE4L%0(}&$#qx5vgs_PO1s|@dO)mbQ*26^;Tg@o%(Ox&1L-`-0M#$9h+&3; z40h|29Op@#KV1HpzwG@=yTUvxF4RF&o=U2sVL=Zosx~W28L8Dn0jiV=N7Sitfd5t& z`Gx=ZwOjakwCr6YA9pbM#a3(Sz?~dBLc+)FlIi*j|LczwuoWEJtm+?bAc&EX*t+S; zgwigcxn|EBbGEuxO>sOna^U%~4vJ0g7lD`0y`BIA7TJ+{M*?N%`69$mc5`9T-B&RIuwBdtYycd9Q{*uV8 z;IqnxLrdBeDu=AmEV@+1T=Apgz9aIkROX-qEolB>>{Mo#1NTsggN8wi^5UStZO=PaD|mQ&D7Z!NG*iI=qxV2aWY+*c%jb=QI%`JU}FL{hB)QP8&w2v=fTRYan{DhBX7D{meh z5e2@3B*MEQo&mCk0PcF2`8cGRq{wvV;xk*7L}J|mOPw*1Bf3Wu+nf-7Sn~eJu3+vp z67Pxk4<(Hwv1@{%kg^l(H*$UgI1t>}@_QBl3^e}xi3FO4V_qcJdiZbFG z>tEYSP_tn~&C;J=$z?$?r{0?M2lyXDggwoVV+t>edyO#`ZLlQmRaHkr5R+qpry}JG zOc}BdvR0EQeLnJ}a%}AcgHS#(3hM+v$)7Eol5%{UULJNu;-ua7d!R)F?Oad%kG{Vr zZo%|T1+cNkg2(wk_vmixMe?u=4FpbGRD|#?J?&!E5ZEf5Sa44sIURSrSAa#HZ;NM^zaClKPbOaAI;I> zdqB_+1C3ple2g#oPj;JhDVXo_x$V#=8y>-7!ZY`?`T-ZT95TAu_MRAr5eZZ11f&wf zC@>L4hb%``+98a)Er7c7$8}DUXz`Ji@jc|?3=;2Q8H*hQKO$hWaGYRf$!O9|5CpB@ z1bAYW_xyFj-Elo137W1*llvdP)SbLP@m>iA1wo8){FxUvRJz!>i9gpg_I0fHODuf7 zmh6i2?t^exgN|5h&SOJWaV*SV{iY%!#%>^4DreOoKF&$P_^XM?_>-F34C+_-z|8j!pa3)wf$ZSnI zBFtqe;ea@uz7=wWf1Ma-luiC-|QDFXDf|ojFyZ$<$deP(@QZ?{-I*POJXn9ucYR9IcFeh<5w5mJ zn8sP*8u8OddDqQ2;`b6wt#~SAy^o^MY zr&{0^vCghjx3}%@D!R4e!hA7yBmYX_Y69zpCL>sBRG0?k~j|RwLld6%a}g0paFiOA%Bh zp2<_Sd8TBOYQ^FWa~4I_s(NA^lV$suaqgHZ{zuQo%;DQP$t$`CHR>8Y5*A3UR3Z7; ztJ_@0q`JRrb_dkVv&oA|SeciOqi`BMlRJ)`RRL>c?}Y2uFLEE+AyXA8?#D~F%mJ@8 z2{@rj1r9!zjqZ`8lnXntpJ7^6T`XgihmEuPIaatL_tD|izpt;Tgntzxumgo!mAY&G z{M_TvdD9lf1mE;K3L#cY9cd1vcSQ%6__en(4GsSMEwZq|IUiWpB2%z3?zjqDYHr@8 zkJQVMfipO+_~XViJ+lDcrID|GErrr#EXiNlAKimAs`*V6cYzy zfnHE5taz@ly#`*JCrIk>MH-Uu2um=$T1^=xfl!5t^1y!xKg>;$7I;R3r^7!L>zdL& zTrg~iQJ-%2Pv#_4AuKV;INk=gz{0zSRwI`t?c5E_}E~9ea5{M#*6n$+jA*Q zmUX11@jt?mJqA0DIpblIk3C;73dYltMgYZz_%nHXLO^Ly|^7m(hY=nKkRBG|jc@qrZQ>MjS(N{$+Y+ngA>RQ?{d<__NGKQ62(& ziS{-riX>Ji0mFvl3*Qv?z7D?D_!Zrj8tY@l0*HszDA!&!XFchA5Rs@x<3pG1AD=XlC;l-#6)@KA`>OaC$f~~M1OHT&T=DoctLD(Lf7iXg z@n4Dmn(@Erpb%!@M67GB0!42jz}V^P(9l-!pa16e2cG!XqX0Qmm&DEA|KCk$?e)9m z6{jNt{rm$B^VsVXKr&CYIuObm4Z}$=b_e56I{e_j(?0wF8_5D>O_z6g#|YZ#ak643 zbTs$p-qCUW&PgW2+Pb9iCVm-calMXD-u1{85M#DS-BW^V)4F}ak{G*l)7{MQ)P@Bm zLx*igS)!BTmWMHzg1^tI%el8J9)}=*GXFO;sv=_|)j9w7Mzm=42>A5X1_5E`;+njb z93}PNN4&3znm;y$u5tmQ>~zdjWJP=lKzanMl-pw*6$;8OagCG3N!ZN)!+o-l3=IMP zR|Zjh9OH7^9u_9#o|9R-EQS#4Q)OOVS{5VEgivS_l*udTMlRvq!%ky?2+@HPFQj11 z-9_`N;=2wyfLL+j8J%rB_)bTSaNZhc!uGj|T#Kr+9hQQOOs(%RE%(LF%aDYz=h#cj z_XH<|u9CwqvpkHIwpwE|DZMv`%uQ%(tnE&UpE=sN`c@EE+dxpE8<2Bxqji|03yEg0 z*&jy*g(F<|5KkJoS`KcV2>Z6r#cwiW({{#3KOi^oh1Vq;AL5uu;JieFP~0?(CG8oc z+0QvSuE?hO&t$f47aogh@hR>|GNUXt0(pJ0K$Q~wL~dw*#-n-{cT>-f-U+~AGmWBX zit&H1e%cS*fwfboImXjzdCp4X%wub!m-gDtF;!^|7)!b^4Fk+|U;Jl=nCN;X{>S+D zjmFc(zobC44A3b$_%D5fiERF1PUwed^z0;C#cRiySVbSg9G6K;jnNMuEL~oPMEE+)+y2-GA)I_-9Ojd{R-{NdiUy zO7mz-ShvGZ4^V&`k%fTJYqJVvKdGLmQ7C9AsKfU1xsw)t-mhAa zmG-<^rm7Qog>JwcXCH#eg-4WDpyot9Kh2Rjcj-t=vq{mEugv{voi|mqNFH*t8@_*rf^8JR9xK+rU@Y^t! z9#Iae9}c|xU~U>(CE#&H`LMOX&o($v=_BLQ{)vAQ2+oREmkJ#%pMfdg&cs-hWFs6*#DWS^80rNaPfOghSl5x@kD~*O&|4vJ&Z+Pb_O!2Al6Dpt~0E;C&|x&(4KEc zuo%8^)W<hcC$gbDtx_6E3!wR2A1EY>8_1-|C=dZZx4j=S=yhxkGQcUW{ za?x4lcBaiP>@4iW;ZQI79}WSRPK{Tjh`)rrFOic)K9k z0-_)Ie+cFteG9hlT&Zk*=Z5MVs!ewALE zrI~yhF(*O)&>~J@BRh~}V-CZJ{`SgG;&X zk6QVd3)U`w>zT00_qC5{JpYxnmcs z&7?-Hk?H_K`6zdDl;yK~h}7&}6L zi6X3legQ0y^hOaB6{l@}#h<*cGHDEL8M#J0>HVGPYv~W}FXwmM$G`H#`TO`v$wU4* z4Atg}Zv4weuu?c_&>3QE1%B%JJ$8-%ecpVjJY~>^9ojgXsy*$2JZ8Pgks!wUqFW zHMbLE+mCpk_*Xb1C}k>k_5%M68+VGkfA}8;^d{V)tT^$_aBu%6 zCSBhJ6P?Cl;Gc10Xt(k}&rK4v6AOtd2~Km?`iXN1#PsL58gxBZWDnzXz|<7bYwtQ@ z(HLNkY47EBQqOcDDSAYrGDxV;&D8Og|Qz2$x)$Rv6CJ9U6V^* zbHoOl_CVZ>Ywd#+?hlnJB1R+YI^R(gTu%aIVW6f9Wp6GYKPcAh1Q8l}BJ~BXVy4oq z&-{-!cNhJQe|ChgO05VG`jbT>hqo(UgV9-|x+6bWbGxlAX(@x5F+Q{nj@iBrH~(rc_c z2G|Du-boOSjvYG9#3ah~RV4Gq?@K~g5t?;V@YYWrEN zR6X|Y70!wGCNNsbBep|3i1D9Ye8v$W8e_*G`cYirNAEWd(4<&?K`V!G=VM3JjoMFZ ze|~Ib*;@Ol3QB zMa~X%a8$CT#|m4$9{I0>mX#ZiFKL>@|L!O8&kJ|&!R;k{>6xPUJn`S69Q}QTvHcZ1 z;O`Iq+xQ=frasF*_?LUD=hRB$03E;Ujn5shkfz_lf8~=UDjaoT>|np$zZmGB$2eRA zl(>HFf$K!gMV?{Orf@0>vZBC@4q=&vgt4$OLlw^6?iq!bKa z*IUHz$_H&ohw2Nl$sDtKX9*f><)r^UkiZEP-t{J1o{V;)4nke z_c+H)h%buuh<e|s#5e{M*|BykL}Bb;$~bxh%VMZ7$PI5La+N%|BbSZGY4S6 zXw^!*qoJMmBd~GV@FbKrkg?f3i}@S;XG4sDEB+HtYRIb$<3jZMYXk4b|TVzF-asMGtr)FEz1+!Xa7 zRZj-c)a^Rj4p01(-9!?*@HXZ`Ox~DyBvU6nUJNLV|1#;ETWNc*YX|uhE{}icA)}a& zOH39dn~BNYmA)$xKQYH+>fP_eHMAI<;oBMHg{;)Bf4I*=BgO+-fJk6;D-aOlJ;sFb z|7Qo_|NSgzAC4#$;O}$nFZ|zEK!`q{Z~Q+J&Tjv8*y6;-XKy)gOoG3>iktnHMY#6B zKYJ^kq>VV2{Wp1{-Bj{xIwT)8Xl=C#m`-C*5PjZ!8UNx@Ek&uu@}VkH;B=-bVyMeW zeXnQWIo@#s&(rwdX^C zdOF6k-|NULTnEhoYqVlWzHt8kyZg0@yHE8m{IS~R3{v!E^TDVyqKe5%K=&3CVKL&= z0f-1+t@R*?DmP_zd(Y!O;&#ZXA^4VcMhbux?`S;^2JbC3QeU-+pu|Ry(7#8}x8$2r zKCrYfP02<{3}RlIjk=DBfP1@JPy*cd)!`6J#7q%rB){!crR%^q`tR&hW6vC4Mz;#r z!Py-^!mlyw%twBuSiK!O5=rfa%DSc;N)T)kI?2+CC*%YUab#W;1;7ng8&rN{QqzpU5JA|DZF5ivq9m{9nSea|-mbhv;b zH!c(Rm{x-;g#RkngW4|l13xo~C?KA;$fg5rD&p7r5xR|q@Y(UE*rPvHjT8SR{9o~U zg(iKgACNyH-+i0z;Qt-r-gCp;+qeYclO2d0cNJkl7lMeHmS^XBceD4ItfI>09sPL ziL*^Ntw0DdaRPfh|MKq&Xxy%G$4N@Yk;7syG^qHjzCNysqfRRN?J7R(SXT&O-NqJ@ zYb3{dzSv>aadOq^2vw%oN17Sy?+VtI*vY?SrNG}f`zXQ4D#LiGpg0?nN8Y-@wvBY) zvH0^RFzeYxYE|p7VaD8utO>Bky`F3L+=?^ArycHs!Et8~bty?WnSy&*-WK=y-3d#? zw>j6mG`8I(pGt@|$s$1Wb?yF|X_GQk(ep`t3C;lh#U(Cm&e=?kp z3fU+AIu*^4EaD`t>jrX!^gHq25BwuRQouZ)pMTn;30Q85ovR3qR)DHMLQPe$nE(x1lGJoc_$D8H%7_Loq_lgST`q$mddTW_P&#hfcK zI<8BMJs5Nx)wMt4@fa!lp*o>gE1Lltj@ZO7m^bqOR15!c71yjFhADOxYE&-%C-xV) zan;=u|LW6J2)FPGbm3>{citB)EnZ%?OkID3R|6*?FW5k0Idll9c67M~okSY-P}{7# zo;cm2cC$XG2nVGte|`4HlrXVYAGss`QoA%IB)E4wZU4*tJerhZUd}09uw8nOZCnsD`+A+9ip#G@1-2Vjl58DunKNJz z39x#+_Wg-_F)%_zOdQYIwTE8uJ7++zv!iNKKr{#>bDal~TJYu+@VpkoLO6q1Rq3$F zn;5bcyXtg}TgeCeEjW_=+tU$%j`$~;7rAdbfVtl@YCwPp)Xx=DJ|T#K`jVTXZdl|R z#Ur!y$WlaEYA((l346>o%W{=}8zVl+0%SjE8Ldy&$)6dk@DFE!O?IB>sW1+fY)PK| zjNS3VwAaycgN)A}m>3w_k(`->BCZ3o!=i!f@Msfj5S=)#N3PL&at~Th)AscU#QYHl zHz8mGDYR{W`#kWE0o&6maH=D0t1}w=7tipkd8TTtorM3oD48viqj0Xoe_XG}73v0? z7TOffFa;El#be;VZLQdR;{UF)T=Wb(lcK&ultf&b69FT{V33Xie6HlCT;Ia+yq z;$MCoH!Mo{XZ#xfT$f@FNwO8a@r+_W@ISdZAY9Ciicya74>h70(x z`uRAwx{r2GRd(Z=Pf%3ii{fIi7`3Fv9aI|DD@Atd6cI==YC%rkqW~RJ-OM8=W{0Yn z=%Z9`?4iS^&zGL~Ui2uywK=SxYv#bs^^Y2-OoD{lCJpR4q>cb!D-&>fQf8-bKN)8N zD7G-^kZOssVXYa?I)ya%@Rk3o+}R!ST{Dji&`qIVj^OFg0?~mEE@gX$bLd)#yO?$@S;u6E`?*yn0XDAA5TF#4;{=(70>q*+ zn+iGr!VuxS9r!PeNml1^-+Otc=4%Uc@Sn@L`;KUGI|6Hi(}91jJ8o%@i_vE8eEtVT zCeo+I5&ntW&wp=mMosDY&6dr(gnv+q6I>r)Cvkc;2;`e{Tzs8!PuqfHt_~)%*n0=)l0${JT|dHpM9-V^RcyJ z6#yyVq|gF|qOXCJrq9VwbRQZ|b&%db5jMj0cKD@Q2Wq@q%)k4YNCGXZX<|l9MVu7r za5UNqZNshg>+aSWFOH;R@*(4mNS~^F#^ly;NfmLq0iVq02*A##LXN4nY>42l`!`Ff zL?|1SWXfR-OQ@l{#;)d?vHZ8{vENgRjh53<5sb3djyg%yHrx-b-PfnD{RTS=GTm<7f*GuYdif z%Je7x=YjtT{5yVOv2k&E0v;gGeQiK-J5;cpLf%^wK8gR5nzZlFEA}|^#Vax_13Bia zVR2Y44mpYP^)Y+VC1o6QKhcyeVvun+{ptf&-rMdJ82@W9BvG#1#a}*!qv2>`C+s=Z z!fLW{AyOt?`9ixS{^^D|wr}W~$n7l=&u(C&0fl@a%wVo@6$K_xH>kt1C4VS9+G2b~ zCGV{=FENl5qTR6vd@w5N9b6Lzoa<=|z-rHhqOD39?sVRovdLXJ77$#2@+FKTqm}kh z6}g_~gT??+K(4>pb-LQ3J!l(T&yRP6*89-^vt(>u2>cIqNhe?PBpJLuqRh|wkvJV^ z5WU~{R}|QU6b$q#*JP|mb4J+<`sS18gh~Ocn(M{I+`r%NVlj{W%iyKvF75$dZ%2NG z*rnqT%WJzAh5wGNXJi4EzDL;z7n;_wIdeWF*|AeRbVbl<`5UeEhy#i?#aVPm_D{^( zK{`yP79IA5g9Pu5%SH`55a9||EUlJ^!3O~F=s|1}Yqrem1{2rZ?5bWX`1r2+ilkx4 zodhW!4SjKZB|67akgz~J^Nvyq)ncn6KJy;af0|lnd383-xYpi6jCc7QhK_A;1p6*k z$0cN3#@p_J$*G@RWKp#VY7t8z3Jp4Cz{g%Al4SGBJe}d-Ng)YP*q!Akhfr9rm{tdf z*U6`1I51Z1zp7Hy?wT_{L<|IEGIlUZ18*!3lJ4<_I(LtC8vkwl)8wr{Ds-1C1khaL z%rPP$&uK;+TJ&|^mqfzE4>!#G#J`A`hC~LM=dfpjrv1u=F`kNIBJFbV;_9T3?CQLz z@Y_9-xOM;c>`_p1{s;ak+!B~m=QQ52+kAF%Lb|?u>J!C-@IO`e6zgm#zq%ELC4UBJ z_Z}|(*S6i+B&%QK!gT@vwpSKO`kdoe8n1!-u2W=fx)Wst0dT21J8M+(oQ<@C0m zcvwOArf~M2EohOVsdy>;<~X)W30w9F{>5nta&?kX3UGo@q4&-rowgpWje@Y-@{4P; zP%S;uAa3DUupWps2$*YY2{)~~xfbXD_AL^aiQQo^Ab4BvTE}pPgL!@Lk@OYo;EuS? z-3^Ne#x+R1MMxVMbE1i~fxVqdaGc#okL#SG!75n3^0=CFBz=iOQalCp|GOYuPc-1X=n6=fwVQSE;6eqPePGt6=XJdWF25uonX zP5Lz_Y28Fk&LgRNt1Q07*Qn%149J2QMjEbhF1R6*q(RC&HW8QeD2=!*x?{qO>gq)O zg0KM_xKmRR=^YE$Jt}UrjvbC2f#c@l`wL)q^1Sp9onYab)iZWghY*R42LAkRD*-vR zo}o(-gG}J!Wj|}9j{9q4k8yJF05KAecd)yhHmyn_e()a~h=k$zUp|P1w(?*3Yp!LX z-%hUU$Oad}kIE4`PAQuzX%hBkO2TZ2QRFj(+-Tj5uR8Ixn|&EI{&Lt+p2E6jcL$2L8D`6XPUQJ2^qNmyX63N|ku~^Uhrq2@GYIiKoT-bZbYK zRv=TusD@9+uuPuV77VzcrcQEtLH=u>GPIOf=J_SNW%qn^0-@}MrScTj@6TM_!Y*IN ze{<*5>-1$GFcLd$9$-HG$f_1)w)s8zixy@x!d$EFUzfR{%{mwVt(Xz{ihXNOG-IxU zPgM*Ht%H;?3}QN{GB>&V1R#!1(L&%Fo`2uI;_O6zkXS2@SEmc{x#ms62{&N1`f<;- z0djO}G|!~Au@32HPMJFAJ5RBNwPt}taiIwPtT&2+_5e%*kqlr96=$OyAOZA_bK<@4 z)n^fHgIPF|cXJjKN%`JlaMk1G4C&whTe3}lmH0rSLE?0-4b4AU%(sw7yS-lQ za@0i)=SmyrCgLx6G%7uKVODfbbMg+e5cuIzhD+xRR5M(4{?>#@oD=5M-ww~1U=5-? z?~h`hF?U7qE4MXGLe0|?lMolp@NRYG@W_ek3&+%Ab1n|&k!~im-czB(=>nIc=a}?H zG0a9$9|jV6LXB*ggL1ysgC+--ueV}fP+p?EQ|x6J;qwBm+wm-bs;q61BEp8ke-_r) z^L+s~Xk=FUpWVkMJevSqrzOf}f$#eW(9{5&rhPj4%Ilt0ke__Yt~? z)2EH~2v8OvSQB~T8~@B>+u_+0sJmWQl#|&!H`w(MuP3mJT{AX(+vd-;AN=n|RlLw{ z@nXD+c_OJJ`X{M)Kwd@sj|0yeqORJM0lFKbiItR!Pox>-9q7Wf@Kok~^h+Wgp zK6$`NlCHOqQR~Z-SYn&u1IpaW?@w6;4muz1#6MRF)jQ4Ztt#YlLiA>nror@T ze5(L+JjJG$6VMF!_rd$HSS*hzyyH{-lb%TOB#0LtCrh6Lhb}5_mtQtvQ-d_7Jqsqb zAsHW+wCx;0T;hvHpq!)YxP5QTcuZ0x)`9!3vpyf~@;?009i2nqe=h#9ld5_aKWTsC zKLfECq8(#`dR%n$wg!d&9gEK;2MOkDmRF;IR}{JXwZL~FSo(yC?{s|*{xc|@C;5m; zYmZB5d%HTIYEocDOlwGi?$#0Xm>c9#2YFNV$ltsy@jvvi=J^ER=Zd!q8sncfq=_#V zV6U>_20u1Q8ovqLO*(Ksrbtf3eQ?qSZRhc@)1l~r-j{GsfR~gMIpq%*z2cURI87%kG}2TGU9N=%F~az zTATTQVjYdgiP%w<+JS6iAsV@ag+~g7l6&|(F?IXz+&D;WX*#^2^k1)Unp5#0x!1SfSupWEbgm!4* zzr&NGA}n8v4N8pd$|tWBcJlIltFVKVM)##q7)}pW7JNJqZhcqkjZmmF9~-a?#Gv8iQfhVVja*cj$9tks{S#GM^Mg z@2wN^?+nCaRM)m#l(+|$6~}bxv4$$(KcLgU@$Y!P*j)$q1ONM<+5L%sLFy2CTmt-a zub+gWnC1F@;a~UD+>u80{)iG=On-hyZg0^TF-I}k-yA+1Y-3xXC#HeJg89fLSr zU3zkMD7NVn-Ge57KJy@g&>C9|rAI76?G*C=HdR^%ePmG=c*aBp3s4Hm9%DCPPoP`o ze-N+6j6~x?ksju0!z2Xz)e16cnidEgB_bRW0>O6@ZkIBcssr`EJ!uD9(-Sr1S`pIY zl@ZFZsT77JeVMsp_b4&i_sa*7*!xg#>ok`GkLUN`dH}D7HXd(o_^&Qq;%wU~AYFrB z`rUL)@v)t0@c=`E^#cE;obZ4aSKO%trV30fao9aq!k<38#9)8DZes6#_XgBlPJqX4 z1I!&FR)2Yh%QRFSaE!6)?BLa5uJ7Ht^-zx_cyrmXacMJ<7hJKB;8$~c=jRc`=8GgR@MMwlf4AF74j&3afGBi@h} z)DYWq5LK0@AthLK4h5U2a5BaRi9us5YoNu!gd;JgdC~Pm0#Cgs3RwE?$74)1gbI7E z&+8xBdqv;J>@JnyZeT1$Dj?ja8hC8_1W9ecEGqeATMeT%d8! z>{4pZsgSrXG^dCu<-%O&7663^o|DIH-|{x0C~;b@crOIy%|Vz~?&*^FG{`I3$n4G) zD;@YG-1Ye)rw=HitNScp`LrF!gIcw}WO0x7C&Snu!7JwZztvY3^p2X!0#7G1{0{c0HO@J3mL&o?3tLrAgSAB#uGp zTu#8k4%Fg^>WA_49O_|tG?U*Fpnx@mMo=WALGo( zHwu>V(#E8m&p)Yr91#3yEh*fOAuEYF$*_`;j>xrC6Ii5Kf$L(hZw0Kb9u|TvI!#;<6z$TFJ-cxh%PbymcwJSK7iBh3)=?prd*W{C|FItu`A0QS=-aJofSd zrs^5_!3L;ugL5L5SFdcU{d^rMk6%2ZQ;wruP0pk7AM1O-HOVa9U*&2EMZy%jPX_7^ z7_nNiOPLD>_$Px{f?=C@S9oZzhhs~y4BQz4&pv1;(@HGw=M1tjnBt_bv}R!w;xb6K z#hD_29mesV;)<_91+;7Ix}UlbP`x#l9P8vsUZdb|afqBcu4x@7R~tHWUlc zo3wr0jdH!)Lvyb_hDL>LcY?hS#fR>Ou zxV}Y=BI!lj=xi2lU6xl4=sg&7sHk2)a6J%M_i<86uWHHP$Q4> z^$Et8YwyToWP#gtr+`O}oHn!*K@D)$<2C%>@?1Z^FK%xE9J|pB5p<#7s&b7fC`fqu zzK?`NR*|~~W8ixMe!QAGTbsajPy!Qb2)y-e$2h#6@yGz65xM1Zr;MlsFOA#lRRWp> zvS^y3o*Z9Ss3>`iJCl>)N$H&%@2gRvO1h&%)f&4hxH656ul;hF`PF?J`XuXq8E3aF z3=%Ujy53$t%v}#B*iCh=i;YroP4T%>rMM&&`FB4;cd_QaKPeUs#->)7!Y?eUQMWJg zy-5`mJ7EXM789%sHySB8i6ndQKc_oU7yreG>cm`(&-L-`B!>d;vv~CPXm$ z_wyRyIQLmxL#tsmN}!0#o|BA;|31M^HwZHi{9o>^e8vi2$HIu=bHohqEG9@Un3=5_ zd8O?C!S({nJyEduj}AX3g+}LY*i1V}bKhHdJPJp3Bg6$64kGLjVkqdrYpKIH+FYy)SG1a2N_vHWIr%fzTm76kRCN>Ko3~o_W)ZUYJ9o(D9r%R@ z&M`a}KI&&J6^`&<5J!l`Sbs|hcMw`5WKl#&$zn|r8GpZLR6dZfDvjB1)$}&8Vgjjt zf?W$ThWH0BJ7?2^Jmlxk%aj#Gi4=Qlc|$?UHMp2a1Wacf5&uiWhVtmTn{Kwk#^V>< z(_~mg3&H|bh68)pBEz-xJPBYV+GREuKL`JrY$28r+s8Ep%uQ#NExW!v2>wMKf^hvr zh0)(twBn%a`D%WA5E)k8&}|FfDHD1n`)fS^?1u}n1ckFj;UKA9Q2?cJT zu$x#*L|4`}3_RNMHY}V>X;AV5FT+3m$`!Q=v+BTq2mblql=*taH48mIzJRc!xX>Il zg2pi4%TaAH&>5%W5TL*jyNsVM*@b|c$HGiX*woGrQnJ8++{Q6ibjDKz&IA80F#6yh z*l2f!KOV=xm6^b{s_CMA9!-0ZL*MM~&heB-9C`NQ8yu zxJG4?UZ?NB1KvV^#vD4i*f%tlNT~9q4jSSU8Opz^hXiWgbUy7>?W!YP_&lxo70S;m zAX=2{+M=N$D$#;Lz?7a}mQE`z)Bb`TvO`H5yE2Dy`iKFzt{%dr$R_qn#EJLzEN0~D zPHKlZ6%Y_p-29ZqCw+(aI#czO&8gNya*RCLQ$DuVGCD<5)kydziDB_oU&T?o2I{); z#hdZ|#I+SoucDblV0vEQ-+6z+?2X?)+Gj1JyfT?j!DqTQ7du+X3hs_Ac4mW74rN;e zdn9F#p84^!!t0v4MT41;;sfe15=#IlPL*g2aZH3HoJ)+9@Q<~5w?zS4$Uls~sXK2~ zC4s9>Ui)+Yd0-97@i2&r2HB>s&Z|7=l18yC2B zzY)hahi&B`9H*CrNAfZ7FHCvffd*j`Knlfv$_0OgND{5j(?9LN*$bVi@TRoQ0Wb=> z#6SHwbwp2cn@4R&GK8(EVJG|(Y|2dS=@vB`rb>s172CV~m4Y{!e}Xe?T@NCoBjGWz%a8atekTisI`?~#2&HPlJQ}XfYq$Qk^k5Pm z9%CzRBE(b>OoFfEx~$N-bu&#lkI6p$AU^n^5x2uPX|&;A&a1#nRXuR+m0^9Ssy2v= z+TL;7UU$UbC%t>k$0YDW^q&nDG4qOZ!FG7m$4E`Cc{>_Ce1oKpuDfc3jw2qgYt zSH&FBaczDC=fq%vy+c&csQgOqzH)6gOGdGG6M4xwF zCVCp!G$n`K!&*xfq?Sp!rrh98HVVvzp(aOytZ zz%6JPgF_?awLxrK?GCFNbR&s4@$2i04$qDkr6vsK%WH2`oJ|9Gz@{LGqmv+&bw=>! z-yp9SnTLhWic|?)ER30fpzKQo3>>^gBF;p}>aZebw&FqJztUYjN2m<^-CWo27nwX?ryw>+1v}b`7gMmzb ze|~ur6aex32mYPoFSdktUBi=}4j~dg6)s-()xpX$@#MZAQ+tKBvie{cTqTh+q~=UQ2}%Uk@I%0?W}m%c)%3vq`p9Z{`^EJqg1-baZcy&4eWym z|H4(b=9xR_=kcD`7ykdzVBjC)u|wbHVPcd8dp`xncrOr5-L`WTyHRtk+Z}szB;n7% zhHS8QL9IYO@@4;*wLgKg>niR=;i{vSTI!a%TeD?ZljlK_4cL(20muXx+vFv=3G>bO z?o9|&?t8gmFeZ7AggLqQ{a!*KgqwT`#)g~Z%YDHH0?7?{0%Ar>#`B=Twq~ij)!pir z)Th3^)~bJ1t$mIl_r166R`)q)@3m^xs`}TzYOTEw6bKUFNtah`#hstq^U?BuQ5oa( zqnRip{7BeW7De?UA^yi8Ydp)&k-*%%de`G9s$W0X{U4L3^A&VJRLLoV#F$*0RK@>% zYR6x5OhhUfL+}h3&+fNoENqxxFG@pK7^o;aVyG3G407K{O{wfrT zJ=Svc|DwM_z$-A;aqASpwNm5VvS!esXuQ@*AP5$m)p`&?xIDW{0Sr`>LSV7|lF~!& zsBJ~sue1P^LPn}8RK;PE!7JPe-4^v<{AVeC9WRAE8LNp^AT1KBqW->EFe(kO+f4ak z7zbov*tpq-1BVB4QGIkQNwEHc^HV&XFg~_7eQ850puupVcbz%(CV4dXEH7N651iEo;~HeBK(o6Nv9C@eP0c=SRh>AX(yj+W z4`1fWWp0YywvkPJfr0~ARQE!-&oi-M4Ocdc+^e!pHj)fC)InEk?HZ8CFiXcu_C9eq z0hQss2o6-(^6TF%h-oSn7c9Dl@?9 zyvZANT$4|$(E6M}juObZ2WMLT?|P!Dz)@h(;w;z_10GpIn1zoqan!xSz9NqfjIr3J z*i#@0qeBtFgLWAbiv@O39l|%+VkK*Jz=?=zQ5!T6z)FELiCB1^)+;E*7S+T)~}36-!h~6K!WS9g*5-&=cfkd}dDG>;GZWBAH~-qFbkZ zA&iQv4$&uqU;+0oK$5JY9}*^MX9rHSq=mMj=c-S|VGrcUSb*bQ<1r41ik!e8xOZI@ zm#8Q`jZI0#zuT3!;+?26s?45MiW3t@6Kjk>05GZA5eHf8{!}U;g?d|=wy=T%$Rs3n zQJ-OHB~)M7o7c94t!0zD8-3q`jlC73t|JEwR+AFMFBeEXvKnJ6P^+Mx8nKQoHqk!J zt3B}O^@wwkea3)aoTErhWhv6WsjZT+yrbDN;u4B9m|nT=PVZxti5lCHO7iZ471 zu<3BYN-A*{tN%Np!$8HeR*)o;etNE@Ku|ZI)C+{j_(kYXg=W_km++;tAVFse8|*~1 z$e?zBVKKG+ze)zBV4is4%;eGQLZSv2v5pJxftNx84!&8g0%(yUyG!(Ad@vbSj?z>bMmD>$C0BW?3AIA;MA>50}5E-s}ZAb`M~sbeFoHbXWn zp?08*pRosRaUixzMSS@9AN||qRj+?|$0Y4Jays3HAFTQxOy!I!T0`cj=y(j5Y|1@ctSEbE3KL+-#Lv{JCo5pzKs)hFU?e|U6eUHwP zkDO(6i21cwFQcs+2AvpdptooQo>?S8Tuf1l3uDN)K&UD;$A(VjymX~(V^y7Sw|=) z@Bk!lAvssO0V9V-P?fFQFMqJl0k=MY9ky^s%K>bL2){Es)v9@Z(baam%`(-Y6zq2G z;+gzh%6QU8!O#s}m@Zl;hBqDGR2B-W4MM#*31uX`cdcmE<9lUJkj2@Y>okJs=r!%Y zLUwA#3*vgd0v7A^P?7|nAje>}qj7V(Ap|OeutR_iTNo_kO*FMPgJaHVK>&I=Ms)N;F z$j0fZdmf4rehJh~bnMi^K@&-Lz!Yn8^2RY57(|fa1Tm!Sj^;%D@xpaAggPWlR z@W-z<>1_F{1ma8VpwxR_=$~xPEd+Q-rD_h)=KvYD5=Bt-y_{{!HC#jFXd#%*zfD5F zhzD6h<{jqFURxlJ){Dsj*jaK$)r@l==Eu0H0~05vWY12awb%UQP&Lv2^&8W)_vq=o zZ_vF`$j5A^Xl=jt#lw~QKL5?>h76xl#30_ZVu0g0_ddFyA+pEef>iGj3Tm|17C6vk zzVMohm(bN0E%tUFIYHl`LS(y|`rY-vZ=j8<2B_b0{qu&oA+mzGh{Ozi+7gF;mR`T* z=f-H;#>I4|Bav90BDkr=9^?TQQ*?l2=RwV4MJMx4XhUaqbhtyWyLQa_ZITCi&u900 ze4uES8L=ha)Z-_L?Io)L$PiWM$%TcD3cR;`uStLb4#7ka{}g+>?7@vIB4xd{ecuiP z6+}bGW;(jIA+GQJrFHrDnT|wi(@#3*ZP%~O#P&mf^DKS#t|NV7tpzT_DA>LO3zK^r z`~2ZE%R#*AYlMJ6K{yadUCAi$9Os8j?_39LB$r)8)D|$|FJKLbUh#9LAWyIr_G@&& z+`=7uq*NXqxOWxMbRAk(iCea294iD5(*@yN?bEPR=P0;_`-s{UdpqzM!&+0g!ebFN zVybc-fOx=k_=pZTeVo2>Sz#i`VSWy|u!zE3nYM8KyY_!5mEyq&)=FtaX;vU}Fp*%D zN`O>`FohMrgJeE2=*q3lW21PeQD#QA#Vg<-tB1lKjGL1aS0X2WkXLP7%)T8oV@?*% z^=$$H&jJBuZ3%A8eaI39m4I2yIhj4M%9Bd#V^#j-tICccJ_(Lc19o^pXX zHC#h-p!jN^>I?Ht#~ijq4o@alcuj3}$Ph$a^{Or`KSHdyd{+bsKMbMB5W$TJ!WJCWUt(!Qq1&pxMGy)!lHl6F_5Z`ZaU zR9;XuKSgIoNDYiNLify5?GtQ9kqs%oR9n|-7y-h|U&XHw&6%xQaWuf+cjPbE?2tWERzj4NJVRL}X~KJtF#t0LKAJM4cKe%JxEGexh9d1QvZ)u)kDa zYh|4Rakf)c(88@lg_m$+AF0$?A57xZs%7sCvTGb86nA<-LwvyM|Efp}<=(xRO~4#8 zimU~E+WHYwIbd9UxCGlEk%I=Dx$-@jP6(7z=G}DO--Xq^lpo|K%${H}@u?#r zIExyk!i>d!3;OUT1haCv8&ib>AQyV`PT1S2!~)5yD8VBOd``NGq32~>u9l(zId#x0 zaU498tL+6WN|?N7BcSS&rBO2hF~bS5AF=?v@}25ow#EEk&;$_$ z*|i;QgUYN{a#gVwSnY4H+J)MOP8sIII$>WaRrxf7fPD&a@JX91V}zI!Bp(6=dp{~V zTeT38DYU^#kaZw1)&N;tlyCWXoHYrgkMJA*Co%qWw6%f&S;`I}qw-v=pjWxB3%C#y z8+KCcm3*QIq!=2o@X9t;Z94`xH7NK$~v1*row(hHVj4m<;nTPD@idp6{y5#Bx-^J5l7Wkr;H8knA!(MA^>nz8ruspU)0XT z<4pnH2An#bK5Y{jS@&QgA)Wh}pj@@&_EMD6u>8;UgQ|bI4f3PC~X3+G(7E}tz$7-9!0rIHN z)z(A>Z0e`ia-IDuwg=mW&6aD?MYdX0pczqDJjy8ex>5o8Iw4|y6vjiLvgb)v{@v+t zsCegGhH)o}1pIZSiAyYQ++=MOR<)@ipa1Z?7jYt?{f<;|E!zoBHAHnGjSUUZ_RYQ9 zLlU9=)s+dC~g|itR|XZk8)X+#W~K zUh5gQ&`e-R21P|Kwn|mfT-|11LK3i^O*w(3X*YJaK#z@V*Bip2xRdr(&={}g;sMJqKR1a6f$H{KyYiJJ-j zvFua3hpBT&SQYH-P3v3Zy@fNX#Upl*f(CUC5tG$^IAAI{=84a_ATc$&(m_W!^!TqV z#O#l)mY`KS_-NNytG#D)Ab`>cf)>3g8Vr$F&=fF~0(t2hx-m0EvV%EhV&9%nRop9k zFqrNb(evvtp{yga)d28DC9j6mh z9R>SfW%e*-(_e>BT@Sidd#)<3q~bfymL96{AX>qH#RlNHHK+w4*x8(^mt#B}$c`ox zxxaykJy{Y7%Rf?u6IFnZfQ%rDhjuk070HO71hUeaDWag}_=^>TV&*^uaF2FgM%95& zlr}vAB8wGRBE&Wv^|qMFl8ZAO8lah|&Y~;OE6qwJXF1hC`$tqAVuD6Kj%v*L9~D;z zM#V{*-(URRH0?fo+D_hcf)NmDdPBjFN((H`0OH)6Zk;?6`SNN&1Th)V6JhH?dDE)|i2a)yV*2IZ zy@=W*c6?@@{^W}X=(f8KHzf8XMrrb5Yr%Ve>1^7x#`n*T4lkg8_}?x`WR`a9Ist;< zc!AuGqyPH{KBf>H#B~&*zydIagb4>Rvbj;b(XRs*8w=c1P{u^Wk2;sksTLoR|uywV}S)vP0mF2Fv2cCE*P;A;*(Mre#Akk=`c3AX&-iUsVv+eeKI-_;uV`*!T%vQ^b@AZ#@>#5kz|oq zYl{>m{;ML@C4@j|T{3p7_IjoHKj1VJz1iBT`YmQ7`mi9FtP^z$GdhnFQJT%ZY=w$3 z2*(Zd#|+wHm;_D|f}M?ztUbstn4kz$4AKWHFUhfmO&bJom4p8~c$cOa!?#?^V~}}` zh?8g#an(GBngCj}wdTk(ZG7(AXba|}0LP9yEb-cba$y%`laM}$RVobL02$V@U;$hz zgRl_@V!9hvzbYz4zq0CI83sqtsXUC(9_y$gQJ`WJVTOUrA-k&~J8*2NWQzSOQfY<6 zP?@pBR&Ht`(A++a6g`LoU{4=5I_6N>IP)R(#AGY@)PJAUb@rkYkJRY5?s=jiHlO_J zF@E#Uj9RsJ+s48Cce+tZ9KnOJLw%*N(7ws*lV3T?TQ@ACn#hW4LMN2T(l+u~Dn1vm z-3q%(bS6*r>0ft*YGEHj4=W*|3Sh}et8{Gri5+Bdd5;+7x-O6|Bsy+yWb<6s#UW#z zRND9&3h_*=VJr5nHH-F;kyl*&jFn zy>hLMGLhNOzw-k6$#*@-P8(qtrWM@pf-#(|7-oim-rrb zLy)a%m|xTZLWw}zC*%AVnD(k$7>8fvvA`o}tkyaFdyqyF3w;8lnqSzLs4+{b>zt6H zc;mVVY%KUc`6rlC*8ZV>ABVR^=+_fTvN*2F3yHYfB9jw8ADvWHY6*k~4NyJpC0;{( zohXiq2X&I-GF&G#6=s@zmSwO71nhU!a}1;{F(#?F1oYw=BKjb&=4u08SHM_=YaOW8 zun^!Z+~n5EX${@1$q>e41QcVksw*LYls&3sxJ|~83wdDUTw$)EyL442xU=?yY9L(8 zXRc1xqLKoy!;FK%0yvA2rfmzIycp-kWHwjkAH=sxc$oZlgDkgWa*|5FqL!^vfSHN_ z!C_g2O}|_L2-|o<;1V048#rNwN1`PVhGB%0ebog?TSz<$)Pc#V4*gOX*^S{?zG*sOrCBOb9D=Qt`@tyIen)+x%Vowr$U8MGZ zkC03g4N-m9U+&>szkaA{Csl0UcKuo8tlA_N?VgP|STHR9r;~;)Hju-x!+47kuvSKh zPK`SfrUS92^8cb!G5^PjW5Wa0(;9GIm;;@ts%uX+LLe;Ps%1krQGYUiAH%G{)#|#^!{^Kk7L=qE~N$@UzW_ zj+4m}3)ni7o0JuYtSx=X)DpA2&o*|~gE-of)e*~Mh%$Y!6Y8Vbj_OY=7U{BUAw3-X zfM!at#NbS&Ex?V0gbkAXGYaEp9UEB!9Vlhoa-t3-Ow|?@Ml!(^5;~|fM}+JgCEQ3< zDU`sbzg7Sc?opdqv*!P0_Qm{9%@Fk;c#9MoW67+sToj2|c}JZ%N4y}is-{%XQKp$O z28WB#c0F`4-G(GUfJyA!!>Fs)0l83cWYLTY1AGx0WWC5RG9*KgK!vlSPm3rQJ#lb5 zX*or(BXdvHm2mWbsV<4wVR#|_S?t98kIMELKTlMNAzSId7N8>N*T7SU5&YFhz*>q_ zl8(_y-Xn`D6IDUCOe%m6aLP!u>?Kh!D7Li49SO{u9kBgIrda8)F&JqwQ=w3GE~62$ zVoyyd9g#T#oi^zliQ@!NuvMfT(g)qh5*`WJVha}_WZ&z} !VXE-VM^X8vk#@9bD zS2=mZ%KFBvt1nzkUwG%b>XP?3l zi18whdwC1do~7IG8PAXL$}OmgRvmGbW}2+59hM*`0i=sqP34k5`RnT`3V!EzC+QRa zaG2a_%STDB*I&DWZn$z8ZQHaY6It}09$j_M!&7wI-ADPJho{MGHxiCOX0E$*DZl=@ z6=nIKAu1G9j@#}&LZ7|sXf;eF%xeGciwKaZ8XJ!!*Sr66udVLrb67P3L?DA~z83oK z&+Mg}UbrHTliuDC*$@8Bvtb(s%Nt&{lHd5!)#i^oo}O-q@NQKpf|@0)wwC&p_g_|x z_sySpf_5F4MR3W3+rD|2-f_d(jh+S}AGMEL|M?)@`t<|QwV%`cxvjbWrmI%+O)pwW z8`lhGB8y{u`gE4{*01eveh!+5?%R4F0V{|A2u%#_D_S<$ECRd(_NyAK0W*g%8W6WC zq33vo#a^xgjef*j=d<{j!k=n3S|yOK0WSy69f}{(|0@mWms$*Bc6rH4&6=2th4s=N zc%ZaMbHFMgTjfK=$>J-BfDaD$E{F~SXiLQG?2|~z6*!`RDp1%40E9MntjPt~DU1ZU z6LUy>VhjM{)Rj9^3)OX}}`-WiuA#>Kc!!H~xEf z3e$Rm4G{iWr1Os1%_NW#R(CfHlwimT4ocpn@?HS4f>m`Fyj8Xd(FmeBt3p+g$Pw6V zKxcuB)D|$yUl(O^8C2PLLNIZE6oUm!N3gqS7%)1^?93WWf7lk_l*m#h=ne9@|Eq>H zpDDeOC18=xg&f)ZU(J-<#`P4>DQqGuFd}U`z2C9Am$QAUw$@01&SEL-MK<%Biei<7 z08c;&DNg=uK$$J;BboF$DPdL6bb~*&ERM=C3`N1kRTG?zqT#sdxTA9%X*^XhiCJ%5 zAb|u!F^GUAGZ{=qz}KK391KoDt)r5;=a4XQ>XoJf$mC0_?W@^qY*D<}y0y1;<06ia z(27T@ezu=FP)J|7xVg4^{MP60n^ND_ER1{GOz%IqcdmLb?UTLv_QN=Xg9cdfE$gej zt>BB_n*#2%6hKv#j5Iin3^Bdu)vNd|FJD1tI@0)3Kk4T^|I=!E)rWSc$|79QIYPjy z*s&-wLv9N5G&a0|zj({$M4s)6RJFYA?qe=^5t`rnidA&;FRrafT|5#Yef{bcl*nl! zkJo?j$-GqWqF}j)q&b(r^gHL%k2}(K0F8F-VHs4bYv++(bLq04eX$?>+vl1p`5b%j z5BjoP0JDpw-*QYeMDOEY+)uasoAvfy+G23sWy|=UA08(yFLBvhJ5u%AW8{iq@R#(* zb(giS5u$h#RzqH;A-f#OXTRg_2Pa%FDu24>mS5SJN${DDbk22KNAu77eq|H=-0$q5 zT?c0?(Ici*149s$;QxpwzyWDvp2QYns}{+P-Pnb3+X66+72>4_N3u1rmzJqV79W;4 zdOEXFF*J;kgyf4UluJqnSVtvvMcS0FvLR-B0RWNB%a*-MStz5~c}iwW5X6__gdnAa zP#Kd|Zvr8NjO+xwT{R=AIEWZIpb-DP9fBgW>>|F!!l;#2l_}_~XL&f7e9V$c+fL-2 z^hLYo9REf8EWJ_)z*sWyWp86J@KN^gYxK}o--CZkC|ZU{iNczdB1p(>#1aJpDHAh6 zPpV?FQnfDqc;6AQzkghRllOh-LVEXSo=p{6b5z8(M0WqR zN1MbJ41v?sVD^UAmV!j6Z%faCEiHL)Ac`vx>KzXM7WJE7fAZx6O*?bJLs)hnoMZ9m zN! zXt~2=5a%~irM3)m6H0|8T$ZLaYHJV{1N9IgBrq!F^A^ET)KU+$=ORWBb2>4-6vq(4GJ#q@;)Ixj7-m?y zSJyNd#obm6?tCc7su-Ww{-|=An+RM3=lDcG!2Dv-0MqKxLAr4LaPH{X^eH-UY>rOM zc6oB}=QLjyTrURb0k?$$VQe4j4jciw`rKqo zcb0dXs^IC|OnUrQdzn4`w6E^dWqlyR)0t0ABs6U)z>${uKl#;h1yBP^*kjMOg8a>0 z#iIN6!{ORAKkxbZl|3XjwQ>8s6S8ynY`#8?{dL!jR$p?EDx#nGwe|F>5AQC0vHsT^ z*$JH$0l?LYB2t@gc|}e9KKyqFXm3;Pjb?cBFRtk!vH2#se>fs{d}ks%T&hwga(cs+ zBUZ6ZzyI_%Hqy@BCuql>6Efvyyy>bIpeWa%hw8tfAL4dn%JKHzab8`1XlZKz< zexM659;8)41%X0YA-_(k*O8?eydnJ>XPNv}1DOpW8&5KmCpi0GB{$zjI|4 z=u8yw55Q=ZGR32?>cQp%tT8l_*rJC>MywJ9b(QKI1@u*blPby?jW9hTbb`Qy%9qNd zOW>FTuIC@uQB@tm0NwvXz`%XdW?5wbdQK}@sYyQ(`PNL)0Ow^fvi2|*i8BEg)uIZ6 zFKZC>%*nK97;fC02n0!8imk{OY?Fz?Rs#>{J}mo)6^aC}$p~+m7Y*LFqeBO$WP@7) z$PJKVKUR^e{lCzNSUDu}iXq52bgAXYKVxM7E9`^ zYLw>xRn^~S+H4d$^uu4RS-yyuFI_}uuUt&y$4}Aso}8rl`7W&*EAOQSR*o#>)2D?V ze|DOW96w1@Cr*=D5Vq(jfkzSp0+KsI1r**>^y|AH3<%W@iu#SXv%qYGomH{<9g`9P zj{J!{rm052Db-dgoxsNi$g`!Y!ca7A6qYL`QwU>fr(HqOzD#PE5yd2=N?iatg(W9D ztSVtMCu&Wqcdl5c2@}xMEQMMJ08-3TyHo>W1lYbLGx$$4u5OfF^BM}3Euo%+alJ{= zmJ!_xzwh%$>6Xu@Dq2V0ebXqv>n100U;4oez5Oo^k+Ph*tdRqe^u2^c5&~+(|r5AlXB2~a%MSUxPRq%JMvPC@5lp9W|+(bVl5BljJeQZ=;yVD4% z?{~o|NH-_anGct({Ym=z+?W6E&fY5km(Bkp4MA;hC%E-%2k77b(PM-J8W?ofgA;P= zKOf+){{D75_qwfPv~kVirs_OPU}|oYifh@L#ey!7T5-LM!4aVlK?*!bP}(R(N$5*m zL_x=rWn&z1v_zqrMe1J_Nptm}W)bEZ{GkLWCuoFmmU@j<3n-E*u|LAfg<~SwTBA|P zn$kzb7HmGm7@A1Edyng1l_|>L|n~7?`V5P%Vs;go;`qgQiT4jVu5) zB_aBm5?ZLiL<30-`v&bVKQEAZ3HAZTUim*LQ+WzpsCIEAYvFIx)nk|l8#O4eK=_DJmm_5bI2V!ux;)S~zdM*En@y^# zxsaW!`BCmm>?L3nCEW`pRtlY@*DF=VPJH~~TJ0}?hNL5MD0L-SvwV=xT{|QzM;Fp# z&rH+z9v^Sw$thM+PRARvx@+GFNw_`PC+}_cayW>IUgPhbZDCBHI3PhL8MT zNBWeOyVS8JYa#uWzWDO6R@h z&-T*92|Ru(u)yZez0FeoD?jk0Ow4$7HIdr4zG8Ky0-@fK8a@>FDt4Q1pM+Y8|)yUr{Chm7dJjwI$3R%E{)i7*Yqeqt)Ou zG1(uZ)X@;=)MKJZ`nN^jdm=(~S7K|7wFsy=zi)=^*D<6i$KBT`C6 zC7DPyT(=NR^SMep^Y2PyE_=cFq{kuqacRHf+9%8Ml}|(%3~2#xj>M_6F;>KC9zo+ z_5VB{fw*DrU@brMWPVP)exL4neTh& zV)G)@&VImUS%W?(NIn%l0#6sCi0=Pj6KX(wPc3LeI@mbk94TlMV^#|U`w|mjB1_gp znwUBfFqLSE7$rx-9D=t)sNtipSV9ZrlP&f({`Ef9qS&f0Y7_(&DX_%(z@=wCVxY01 zMI9J;p5c1YfXgg>LTdDAkXb&1Adp@NDWhdr)giX2huk?^2S{7mvXHhHVBc$g3|B*D z?|o!e<*_uIwrv`$ZaPbq(Vcr|iRlbXIh%#g`<_E5`6K`Ba5bDg_Sh~Si9j>{gCPmkO;3=(=5_9wx zw@^v#eCTiY(?{RrH%Q%Z{9xUvpu zt0=I%;Qv-`(Xh@2;C6CIcq93-fTGcc;k@FBVLv6Dp}rer)zXV<0MeU8yARGa#C1<4 z$?k(EEQbrpoPc>g@bq*8{!6WoRMid9*L0*9Nak}=w37er=D88~k}!{I_b~>DO{G^z zOBZ6e#XT!TAy)=5C@;|tYfv$)a(xN+>KrJDh~;>}(YzrXnWRFfbxLr7D(Npmu#MOK z-zZfPlpQSZywN2N*+x@x__&M?M2zZ|cP zOY#6_)q;4y_E<~gxic9oNjf%l(s)e? zB%y?(cDG`G(h*an~EqipLtBS!gi8 z@-(dCDFs(-!~zHM7?)Xdr{k%Rr@vwoMjmQyqNE#RwEk^XC^(tVLHNtO&W7ZfBdT&7 zs8vTeY19yldm&yRCP2RN8g4ZLzpDIkz1(S^B}`# z;IYccIBgTj+Y90iT(5fGu-?FhkWt2Y^+k0xHdjj#Ea^-K!*?@jO%+(S@`DGGczy^X zJ;Im0sKK<)a9nfoumBMg*=uhp`0(Eyq&vTJT;m3rW4`JI^&R#1K0KAa&NUhi1sf%D zjv;CL!Fzw{EXID>w0AXaXV`V{WXTTA&Duv-BU!-`DSLNJH({r}C^0a5o9wg4R&Y;7 zjLtoWLSn5$4k+)*rJc*hl0sECbgWIJQ#vkV^nW?Sl%%R}Ev1amuH&@rc6d)>B}>>}`}7mVVgTEE zEd5yjCoL9QOeN~$^O3>9H`Bw|!6V7-IrL@bh&k4$_*iHx)i@N`YB}AOY^qSg*9LX& z%fbcQa&b{my=+P(VfmMgpun0eyjkTd&O+c0aS0jApX&c1;<{pyoOxcw+M5xw_LUrH z0TfQv=2BEDt=Ltx5&d5RV^V;!P%U0RBP<6nzz8IktBR{_Ly16TiD%J^#$mG*RvtqP zWdwtOF3tOijKned3MftvOHF`What>$JjMLJ%E?pvix(}R=U*^N4?IywEH1%Ru%}U& zIl64)GC6T-p7%5)Rb1e#kwfDr>EOgk8XTCB3)TUSf=+nX&ZvC$oQdR+XRUzFifmX1^LK=H@ib=md|b}Mm|Hv&vm~5bs|Hq z_7SQgVlKt)vpoWtg5pu}+n!zw3j~@E#vWVYkOfMV2>^eFLnm6!z#i~@_Gxu1ps}#*rNQqA%VFnTD}}%5w&j& zi#p3r)h7u_*MIT7o6o40v{fJxSxlSRy(9v>w5Pvx9SHtkGeNP_@4G%KW7vB~}8Ez3O1A>F*H!=ICw=AarZtNjn_5g`OBc}Q)r)y_ zY5H=6#oX`d1||3k#X0C&R5GZnB&(QRMdtK9igIx^elaX1w(0C$O{wC(+F>C5!H(^G z-_8{G@0EK6I;KYyPs_d*BKB{x3OaEbquq&(mb@C<>F9$1^fj{vZKB8+8A%D%hiJ98 zE(%EXmxDRt4?FooWXxxG#Gf!g2A00eOLz&Z(y=O{LZKW2vnm3p${eT?Rb&cbi{LB( z>=L=PO6&UND%XqSM3oA}$0#0gc&(%cEwWVwi`u)@xQq9SZfDT=&g^p}PDIqq!X)&> ze~gXD^JX#ZLEt4aV~`rRBK@!>WfiGiDO5ZXuYv*@ivKeq84&jQ({r#)TgJsTDPt&( zL3jnFEI6rs#D0YqOQJDbl2Yj{Fynj;*VU`6*Ch)FTe6g$^9pr7BM`+*CS$_J!37VQd zEy3X3vegDz9Qw@1%#Pt(;^lPnN2y4YRci>91ZDLoh-tOHL>LL4glx)y2P%(3hqkTrtKX_*pLuCid(vkLl8wnq-r}}Z z2m+QFU{Ya_M6C>??xTfo$});bcYAfc73aWh8!dNvGN$o3|u9JfqV2_O0qD)P@|Gncqx9-cWumx4i_@t@cR^zy~A)@K$Un5q(BUOU~`t@Fz z?o5!f2ckEj5f8QqE981iC#6SiwU2z$nS|>zexq_xjG`eOc}i?mBFHEfB8Wpc6!TGu z!8?wHjKB!|E|P_OP4^6%Kvr*H5gN|XEMQS?(ARiC`Zy&;OXN*IwT5qc;mZG^$8ebx zA*f?a6z~!p!`Y3J8X!cu1~>^nWWS`9Ad^=stv$n4RB3hmXia=BtWTd`ifef-MFx4C z1GwV#T^k1~;pBaXa2f3&joGWa2t{F>Izx`Rt>h{uf`y5I6rz9g1+r^HWiJOvtDq89 zb!ChR6-N)mgjH?Nk+dJyze4p?v_8l-jhDShs74w+^`)pg8?+k$*BE4NlY}iPjyWR1|DiOP zC&(R=ThAWIFrj!8ZQZhzQx$gSuE_#<`uXVaLRz+D0iUmr-AXb{ojjcvz1FW>Ognc^ z(%P}bGIx5Oj~zdm5^tSa9k6noG-K&Lz2}ac;C)AC<*A_oUcYjXe&XUWIzDrnpF28B z&mNwm`EJ*)qmWP|=;#o|lcBOoKygI?M+OG9G8PUCvBjPWdYJ#Sn^IWCAl8fWuK}xQ zs{O%4&?~qr)*}RDO+nnAGGO!ElU4iV7x1M3_yuU;31&Zr@?~OePnAwI7b6y;i11o1 za_~iqreT5Ns3$l@CEJ9x4kdNED}b#!<$@b+CPBK@)&aqjiYz@RuM-Bt%n;6#-u-#kNvdVv5xT3RO&x z{~E(s^9&;qZUQ6~DVADB=-c^@%L_$t*U1fJj`LZRM7GMx6l1I*R8RaTODGvEr+nTa z=#&6uR!E5C4!T8v^NOj-r#{FSpg885t_nf)F_wuyA50;k3W+_(-GB$4% zeQYAPy>MWGtXn=v%SRT;>XC(XbovxMwQrhc=H_Yfq6NHs=|Vayk=R|6S)R4a7xB6k zgEVt;o{k+q#c4ai;qjAl>U38TD7y+O(pjGLh^|NXo|Y$`o#r)7U+1kGru8e9$nn`z z{N!`feBxwXG>LlC@hKTKcQjuEZOnS>D54t@wv%w1PYQEde3~r*F~l2Sj{;|H+NQTuw7ZHW{c2m|oSW z4-FtpeGmQSEVlh+TxC^M+C(yW20|~`W|4u&S8k&e)%eM$pW5e&&YtO05FGgofuHG2 zqjOavV@*}rNMzIYf`-VJ1i2CMRnK2qwe=)JQ z$GAa6(!)8^9@*UoPddm;@8q0u=*^LyC;Ouhvz?H@A)dm8Y_e1aW3rji-1G31#7A)5 zaOGI81czs@IyteU%k9dTmW6ZIX-WRtOGaYVlkRzFlGC@AiI^Mr9v+by-C|6AlS!%q zA9LSkfu#z0CG0SWP5S4JFI$sHEcH9mBejw)9(Z~x+eZ50gYoHkdG!ld@Qp88)khvq zU*laWDT+O8{tn_}FW8oTsY;4k`VL8i6E5-~j?;9RpTyVLD6&tcc14^k`c*#DDiJ#- zS_M^;YAxzXeyECd!2vcDIDPf0RXiXYN4&gC*fNN!n%S6ml{07?te)MlOck0(b<30& z(6$VgFnFRsTCH7<)r+i(QW>?1n3FOL$&(GNV-(G?US~O(FAZBUQCc`cULA}x6IC6E zw95j|Lai}G1cKF((=YOTm8y)B+_5~F)KFE8UB!aQ#-J(x ziI3*^W$RVT2FrQT&YirX(r)&^8&(a`rnN)#?MKIHWO#tiJ!`3?=fWOss;kc)K0y!d zJ}#%`=dGoM3r^Fv&7<<&Cyw#KV{-&M|3MREhZZfM70VXMmbFXx(hW;F-PpDJz)X5B zxMmTQx81mp3(q$%n+h#G*ZeGBwusk^E}|D+w47#UMfMz?;Y5h%rE5?XaEUEAh|P;l zAF02lWG441sFs)h#j+K%`8q)4Z3dVZBw^_*YIQ~|Jqcvh2#E&^5(*VkcoM)NTosJ7 zkVDVjC~VyKj9kIE#UkwRx4;}E*h6V2NXdaA>(LPyG-3J70)XNVM-nTvw;@g&!X5cr zH!O70m_+R`g{hv!K{xC#VS5M zeaB!})RTxQ{X2hlYI+P8!Ka)5t~p~x)}XrY7}L>F3%dE|S5=>Mo_ zi2HvZ6@+WK57`Yoj>KXQf7Cd-?%32zpbH z?Qn&aA^J(bc@N5A#~Y$R@<>;UkS&`X#hGB6Zs*N`wFLiH`yGHNTul#D@ls_ zU^5j-26$96h0kMRA11Fvx)8t}s0%AYKlq*u=*p_u2!yeH*FE{tLII0Fm@qN!Z&J5a zzSSEwP*uA3!EtuUYj?S#R4xfIo5U*!QVmkCW)DpG9Aw7NgG;j+6^bQT3G}x0a|r2i z6^q#tCn~h3ZU{0KfTZZP#?;6Hv?8fiLR7_WG5M7f1hSDcO>+z{>qR@mgvQuh%$+Qa z0Jd^lR&@_wF~xinW``8&4DM`M+f;-3ETG5Y;zB-8!qo-=Zv>vxJMYqi_f-rwy`+Cv zEL|j9w~TOlMr^9GUUbefN&8m6{=j5IUc2W1Rv&C$KJUEICQeN^BsT7&<-GlUYW6fw z&CciI(UQRqFK9CIE6y9EwC&(XQ>9Ih@p4@m39@M%Z^-lb@l%p2vK!Y9@%d*D=f`?| z-vH>zUBP_&YrM}2)s>~`C z!-DDL{h1<8VDvKw%WOFcx=aDa-0$5;$nnBYi_ENejHg!u1;DjnYzThkbTu-!`YMP< zD-*TiFFi0z@p#Qo4kO`qN0ShpsQ&BCKV4TW_Z&G*4?c4$^q+-o#f8#>>KYO;^*f2` zKtzhpJ~Qp}i;nuYr=U@4a@m6L7%m*CB7OD6OY(`^HZ9`#*sYy==5ocfw8TpFsju9{ zl!Qi>bn@QYc)az$JSXXKTn&jOFm$%R$`Jc0%!hEM&-2(t0OHN7n{V6S^PJb4e_?Hu zJO6H1P_Mmom~?y;2y7X+#ZazfqAC-Y{<9tjqTr~%5Q72j!NctRGIOOEC{3l5?tbWa z)#}@>U)zjv5aN2(6%j}q^BAPkHves0vxwgNZ`N1srN>*{^WbE@@hK)%?L++~e{Off z6a12UzO}1;b%>&^Rsk7ab;0IBUxud|SXq z)c++^8Y;=`MF48|KW!@$2*IMlMrDcLB;Q2}ewgbS5 zVs)^{SH{R8m}=Zpmqyi*e2X9j$sA#Hyrn0LsUbk$y2~fGhs*HPht;tV|DBu% z!DHkuBPiHRtwS4zeXuNCxPUI)Fw9Two1(QV7SZOlOX%B=ALWPk9;egYc|~~lj>HFF zaKTuX<)K|uXp5|h&jn6aEE}M0Tb5D!hObBW9_O#`Jj}ZfoS-#hgYuGXtLT!AODXNU zErT|~NWlSVzIo^AeKYcnA0A0nVZLzvQt}uTaR&2GZj)+zs!jnQ;C)>cFqHJB%0HD) zszDYaU;gM6Th{<1hG*pxkU@h(fOb`K$GpNO#BeW01(9kgUxR=ToG7wa4;=c_)zF>) z=|V7bECUG!S&7{W#i|0G;RtP%aeVm)^@H~lk$dycEajdyL<~twS1cP=4#@Raw7w|d z(OHv;ot$v1DXQD&KK36z!$nbgKGP_>9MHbqmNo?oF4$bYrOS_NE?SaL+`6InD`i8y zLIY)gDLVR0)UiI#JKec^4tX#v-r_%uY*YBQtZD?nog#nhQwtsDq^Z*SiGMg!o%PmN ztZWGSB8idlHm&61*tT&=+J<18!^9tLW@H0Hzxfx>qA$JgeEa#+H*YKhE2~szFh*3S zV!~lXj5Vyp39*eaByqzmpE{9j21kw!9*ywG>*vKx~aPZ&zn4gT-r zF*R!cMOXb?(p}!hpzg+~Unt&7)wr7qw==U6EELOp!(7y%krc=!ZGDiDV=@fTH@UQ{ zEK9F#_J4cp^_w+Hg6n^T~vo&QUw|8Au(nOHO9vMPlXv3PR9f?gC$dr z6R7nhZ z95Z=+3C4cI04YCON2)nS-zCN~h03<5af#|MC`<5zEHg4him9aX%+e`y9FVFJI%6f) zKBpGa#Rus7vx^=13d!YLMr5*CEoulREocJeHy;|8<1?p04T;FMiRa5NSU=qGk^$PW zYf{yvP!7d6Cl4;_&2j=3)$xrb1LRE^wj{i(y8xx!}kTju) zQF4Ye*hwjy%_JqK8_e2U8i0_3{dRqO_FPu0U#Tnpt1BH;5u-#1|Maa}=*Fw+uMtkw*jvAT z&<#mJWasWy^4DB{?PViXH4dkj*FtZ2*=p)JYGTHHPjFn->IjilBKll1x^zKV7*c?? zK%@cU#uu*4UrS4sTF7~t{zUs?qDZ`oZ-b`<$K+6Lto*<9V%5yneO&o7+dqJFU9ixE z^uc4YO?=v7o8RR2I-NoU#LG@FCerXgLSDdyDx9&2EghKHRnegQ9f+~V9F0`$@+qov zH4f9g^&Hv{%+F!9OhUa~inaU!%7P_dCl-Y!i*J`e)s21*w-I?uS9MaNJPHie@i zToqt++c8z-20DQqsLuyNp+Vhzi9j-`ov|?Vr2^V`*@W}JA-3=ziqKBi3>{RPqE=!R z+c@Sx2biF8GSl_FkQ9hMEX{?-T;=vV;cgfGr%wJ*{Xsmkyf0iAd;!70=C!a<3{)%# z)e9iN2H2U+lNQ$k?=y=or3S*bgunuXwr(Dw1q+CmHY=5Lr@HjOlM_u9R5%h}vK1|% zbt@Lrs*yqZ)+0x0_9X6O3P7d8ZQZm?(tg(i$L69+k&E%%>C^n!bJO&l$0p_RXQ%0$ zRZAr8hdqDYFfCoO!2DUlOwKj^rMz7J{mFKE<4bFznf8~y;{6X3pqX?q>3Cq*w2aTx$={#7?Yva!G&3!j zP=F}ikoCrwuIV%W5S^v11`N9Qbo{+L-@H}J@%C4(C*ulUaLc;8ZtEz2`Zq74-b0Cs z27J%=J=mh8QsP}*U7}E-qZ;#!L3!f9=Au<~F$CbYb+Z8vGrZ4I_5a7#sR;44q{XtV}%TD5)qwSzx@%Dmt1(jlH zDT_(sgy~g*@Rm!up%NT-oCJ}aa={q5BAy^}Aax>@Rw-5>b#sKNxb`LJp4|s5Sn8Gv z@do=SU3-Y5fEpQ6YL2Jz6LU;fV=mbNo1TSw5)$}3X^0@ISFHuIa3up9j0C%p{B(fy zlz`I>WSweg!u^kq(|lJ4O4zcYQ$Q&xAIRGd9(m?CP0w~AD96Mp$(6oH;bha^&RxfC z4#;Lw-{=;*O8al0J2EHtJ#>V3J~=6i7BXFa-Y8vp(HO5?F~|!CI;31PH<6y0u(pxe zN38zumLd}UpPXZrNY>^xny3)Q9X=u0AQPES`sV`{t+gSL&)9g>O!_c>Ll^mlWq$JX zWW}%%Z;g~C3OIqx2GkX=&e*WRxj`WKDk=@ZYc+=?mUfj3Q0C8jj1{@u7f5$$NJ*~t zbKhgL{0DbT&^vFeZvuJEi-+^igL_Zf^Hw*k9H4d;HXVrw-tzgQvD)G?_93b14c$ti z0Ni`d_0Jok2R^zX8YaE*y|mz1udyBEWTZZAFE~zb`8oe8*E`;G zPIX=WHZSKw>~`1>+pE9$_It(?d9^oFKS_sQ{O)8XnW@cfn-=q{Ua-u_b0XJqZ*BU9 zuI49?XY@@!q%$3YFvm5tf8rkw=Wp-2Hr&wl$v2-vSHJi1Jh#bbcI-L9=~=TMdE+`e zXZyw_^x*$_G2eFgQEDo-oaAkm-{poYN4Vc}W?%E4pRN>Aa*&>BK;Ww!9pF%^L(YT? zdigdE=a!sz;3Sz|^PisJFaOTP4VkRBWW3=etMbq8LvyUpp3VKGFQVwb#9m13D;pA< zo>X8R7NEDS2_O3FXX#_Vy2-9dTM{1m#Pf0mcgNGyG%=mB`A&YW>vfln^zDa`P?`U? z8C>~ChpY2y$eG_wH+8-J22Xt6apU^@O9Q^sa$cRfwt`UG0KO;68@VV3u>_vUT)S@w7t+e48L^En)U_yptP6Q&lC^U0u zFLdNA4^$BTFZRrDGLj-Lj1L?F8}YH?iNvu~?2XvOO`mtWz7T4exH6Uke!}+Jm*0t8 zO<3^L;S06uDpYOrV00mYl(?|iM=OXb#8z(AC<5#AtsQQW61XPWCjw7l=l@mpoi%b6 zva6dyJv5h!Ckh3Y46v6331e4F5$+PmELZh0Q?>qUIgsdGfkfU~AW>wyDZF%vxn$*g z-8`vf$^)fi9WXJ73X|>4x4^E7GBa`iH+L78U%dBFPB$M56I)J!T8o}7`g?&}^=1Sg z@>-G~iVLQ1OQA47^_*&EYl)lcIY2~yY}Prem(a6^W@&wcmG?e40Uw1sx<@zf3^YsB z&p&@T?QO8?$mB^gHVp@M>XtP_(zMNA-*Kco8{LhmBAd#jEL%w9o;Y!eC-dByzE?ysM<>5Hp3uicK^FBRbg^$K*DxI zpZc)j`$ z4>X1$=A%(>+=s|$0$^e!OKyUHbz&lWZPJ`x>j>if=$KF~i2&WxGe;Fbv0wV$G)E%a zKEgg)!v@%C&%se7l23m1SSG2Fn7;0s(frfzNZ-J9^JfpxZU4&#I^)r1@emCxo=j8& zr&N`__LeOsT_SUDefcW-$bUOX0Jcwjn z4<1X~3LK9x*B1PUKK{jhbi-B4dq`@oyuP%z-H+e7k8XV7@}8Ts^3WxMLHvLS(T+lP z=ARM$@tx06+Aa{=edAB9%|HE)RK@g#cWY3EdY`g zlOskG9zB2W3e;NxF4L+jPen2azuf45Rqr@MkY#Q;Vclv zDo_@Zs81*$1824OLU`D=@>!+Ns2fO7DA%(+oXetisRpu3&EoT|RZdM8jO)V(IRsV; ze#q?Hq!1Ls%A<$;HvV9EMi>wms{l?mzxFr!Wimce-6LU_lT|S(Bmkx|;h;nE^ome; zjz$Gr$GnDFEuS;ogab~QAt@OqLLRO)Kd6#Duk!gJS1YwS4QvsFox&E8axP{E^FFj> zAm6OD=imw1xO#}b^XM^7+XPCZto^wUrgyfVJJM8PPtz0orYxr*u2y5EA;x^(*+cxD z$HsGoS547%(4p{1e|IkvPv@_>HW61&qIt zRi~Oy#5J7Fm@e~LFpc{n8I+q`eH^_Xxnt2?JtQp+@xp2w)erl^_8n=Lqo8m%pd;$?Wf=P)ZV_|p4IQT=bge(fN=^Dm$7^NA+sBta43V5p^3OgJ(g)kY$w zKli&k^Y0&b-2LD<{p|a8$lXmf231S%R*Ei_VNyVXP9<@&yoH5M4Y~g}qu5 z$I4E0O+6mKO%>v3mY`3>R>ZtX_5ZF&j1=P4sxS_AbygpRz61I4IrI6j@L|}@*xy67 z?UeC*yHzxcR}0vZ3T{Gy?GSmjPl;nS1}#Dc67Q>oid=ylfuJZau|9%WLcyEaEkr{Q z+A&Qk_Ty3vQ#|*n{NIxpRc!2Ei$UH#N{A$3aUxg-#K68^)sNnw#2%^S`&*FMiNS(iy9)hb>oPn)uHpw9_EMkPV&U`Y3m21MwA?; zF`awXlHBGGnx%ikB6i}L{u^GrfVP~qL>}BVnVuDkv6%lO@ryF~=V2h8PUL^nW4M0s z#H4)dk^C%qS~j$RFW$J6&RsXeNVZJ3Rom4oE9pzc!4&@lkRvvs@V`Q6?N+IZI}K!& zg{&9`gp-2PDv8BXe0xbgo>r0Ba+{?l>5&`tV^V11F_swaV zoJp#+ujS>aGX$_ijBmeh%4U0SB+5R7h76zPm%jfQdh^eY(#X()T2J~SlT8gQ=_V~B z-Awwo>uAr>Q*`^ilh#5ek^v-D)~tg3Y}c`Ga*DS7))P%tb4;2_ET^xig-+A8_dYyLx7{GPy_J@;oxrP7D>5MbmQOuH@BM`}ZhBnyy6!oAwAzbtdqYZZyX&aj zaOEi9c-5$E-LROqZ(gEvFrU9H;oe84=+19XWO599;v8RDB!Jt_-6y2%n=QxgOwa=f zEnmW748iVrM}9|{>ICq+w^4v@BE8ha%Z!Q|Av>YZrUHVKGKb1J9bUy%I)1hoXBn5 zasRRMGzHZ}`Qiq1^0XyE8q&+?4rEgafQXSQx8Y=e&3Sy`o4-wON|o4`t)cB(mgemR zMUL4_U_aB4>E^dt(9izP4td87XY*LU$AY!`zhx}jF-wWqRfyB6w2f@nY<(iDH3*dG=h{E&=t~a#mTglvcfVg zgM@^@R_eKI+TgHkn}JvAt&SN|x_T00RDtk9c{sykkv5{5)}aOeuY)gZoG^;u)jlH7 z0&su0C$K5-4KgP$8Qy z;z)zVhE@7wqr|QtA%iPos~)p<$Tpv4Zpj~guWv_k&Vh1QRWpJ8G0?R9qZ&1R1RrCR zM@51GKwo54)VeAUM`2eTqY!Pr8c0GslemTjw(SujUNlD{^`eW%=-Bbo>4qwL;@N3= z?#Nu(vI|@DlqL&$cC*Ca5MH|H!K2MG|2%g(9a_0`q2T8C1Y~~E@o70yr9+2h33+XH0JxEIy4#`ABELRn#6^OpUs=FRNcX1_&V$UX?pA3nxp!C1&l zQ4D7-8xGAYB6Hmbaa*1W6>3l8x<6~V65PkwWs|r37Of;k%peM+%bJ%qkXxo>$}#w5 z=%Mmi03cCtUA>yg0mp+3iV$Q}v1zWOu5bFZ##{$J#cpA-&#>g{_AF)&gPYZNx5z^)vv+9Og&5gu)fKY)rRWQm&v5TDOhgHD`kvKQ9t$R+9H|Iz;_BrCWXGx}P+58USz_CYSvl-B|VW zbSj>9)WP^;F+&>-*k5Qy$LBE;;uiM#+!;GSRm}8ALhZR~MI?#*gDDW6_OSJ0Xx6<2Ud;1~7x((Vk!qh`I6YHOmu0TCzw}LA=d2#gUkRHU{N582CT2|n z%kP!T2I+YhjM5`}j;ADF(pS%(y=pNp8dxB?jpm$0A~&BkEJqsxo9<&eF*l#L0E|zc zq=Uy!HrJgZv!T{p6Nl{)!T+;ebrl(!KgX6Xq^(;P^s%qPUKiY%@NGm+3lY+t8N)aY2ZBj-SD3agze0x7CY^$C$6#8@jx zevQnTyfvxtaVnvUU}EYbYImEzKT?+lVq6pSlp?j_Ad3ub{&NcXyj{Nj;nQ}HtudH_6hf3s02MYMx|#aa#tiULAP76JAzDM zM12#7pj=a=1l-^twp3TN{Xh00#@J(0SllMeeZU(w|M$Uj?f*6p=ss4_grlpPZ0riN zVnhgp)p%l6N?%hTFCKh7b$4Aw@=>n!{gNK`LN-Grk<6jp63zTKwKGWf?9h}BkqDr# z7gqB~POO|Txa{>99Xn&Y5=01eHV{k>bL0twVjV(g)F=6V$Vh5icz|o&46AtRZMVFO zY;t>Squ-nvXoZ6-nXCcw<&WOEZmA2UMB*@M8&)l*jjM-b^28|~8eEW<>t|1Q8F2{& z8S)Jbbm$dVuBPb|^E7j^E31|*;>Vf_?t$@HK0b3=)h=}YIZJ8X@;4cC;sTJY^;;uwSR~sSP4MCR#xmYAG;j#kuQjzy|3P5^c zm^gLH+ML@#(|d@<9f2VRWwG~yudoL)J2QYjDck8XwK7-81F}Xs#6o!F4Dkn*6HK#m zqtH8tOtudLnu_dibIE21u^PT_2|^AxAAilY6WPI79I?7QoGIkO8VJb?|GGM z($-7rviQG`EBZfdkhu3+Z@SOcqaNL-_KW{Bfh?AJC-@lt2wYz*GMYbxamFfR_^h&p z8mFS}sdhH|wC~AI7^~`x+juQYk6h@&a7SA6fK{U?lP5o92{Rc+Q!S@>RVmIvBtmTh z8@Q9SliSE9xP>E8JFT&n0a;?tz5Z{e(Rv%AhjF5dz$pyg&3=o81Y+R{w_dJvC{|`; zw;b9u88vdc2sjtq(@A)Xl$pVCZ8}s}Z>`Tz7_s*waZ;CYv8r%r?nEKbuzC*21X|$W z!>uq`RUs*sRivjM!fUExOGMpX-B-k~BCz#b#d)aaI*`6NcLhs)QmE3YPGX<<-!_D} zlmOIsvK6s4+6E0bj=-5;teW9X3kh!yf`1$9L zHsp6nB9L@=@+2KNI_D6O&Tgu&t40>)M|eH(^rSsg7C{i8kiKML^~hk;?-1?TKSR3@ zo}lrmQ$&_v2JTSlvAmb$n4CFHPd+zY9Lq2iDiykD!w4-~(xLA>HW6$x#66-O|8IkF zH7kK=Q%KN@{R+dbIuh2HLm*-VB778sSo!U-)NVF`JkFZRnfiwk595*UB+25u4I7Z4 z9|bXV7c8mB<`gI!nt!HVM_wImtBP?|mr-S=%4vw=9-BN4O#(s`(vO{~tDpvCF+M|n zA~GT-;%X9**dFhV{NI1q!M}L5>aKJl0V+f}AwbMXRr!d~4qz`bV|2nMktHz_Vj6BL z)#)oEwB_A~qIbzLz`&}gFDp!i^RZ=Jv&t@JOSRio_Ft4!&heYNiq5DHiFKW^4T20_ zif=^B4TIKs8guSK0`SfG<~x6 zWu!%QD^6)NcDX-OtX|bZ7)j?iUIGyb`mt;<_&<}~s1yBPgAWJ)SKlG3{GY;nm(qMT zSxxWTB6AR0txl+VszlVg>w+YVne9ZTz-@CP5NxmhvV*KYW3489Zlj97J z#NRR}YzAtw2FT>_v=O3(1Dr|eWV7_Xs;Q8E|FLmCmWZVG!s7Os-Wy#yz^{D48k(OM z`ocH%%Y(a*)BdA#B*Csz$Em7&$;M^$^nnwUwiA&0e^^7vGM%$>F`Ya;PyhJcgWObP z`9&8mr)##Z;Poq)$ijgI!Z2|KOxSOF%+~fTBb1&a`{ceE1E50G!H9}=4lnM|0Kh;$ zzy4zG112f|0L--x^MFC)dm z)m&?)FCIXu{@hfO4I8PYFh?FRT6)zF>mx{lYq=6Q*khkoIDV${S#HFNwpHQ_2VKTi zl09|o!!XBHxklLY!N_9!+prV@RoxOPNc$Ui{V4I1T(X&=(qyI}VBQ_N= zP@wG@Dgs1-n(Q^ojwZIH0?4Xayh0*W89CQ}Rah#E=gH*k4hC%sb^nK&9O{+$iUDNs zf8|CF&SWH5S*&AN@qe=w!v$%nhy%K+DiwIus#V_{E{b(kO)AQSQ6i3WC+9QqOkeT( z%#qnJ5iuqbty?k3FWJ6|jvPNl5AB|k(?Y%!NFM(e4|e#f3&-fGhF~5XpToyJ#Qyws z!?JW}0X?yAhG*xx^6)dq=_}tkNRK`Tu~QW#Sk{@agsvi zhwJwuYHEJQ971P+%sQwBFlTg&iZ6?SKbdb40a1e2R00@uDro9H$=U%az>1I|fMQ0QN}JmJ}RqVh#?VMMu0xB|BX3b6N033p%}1i7_C3i ze#8xqpZn}p>d;aJY?@H{v9Xd>DA6cNH3cVehd2@SBqiiJ6=TzSslhqH=3=$b{0{my zPVDH;b}mELED_h^I79r%M6-*v7gL|jiOF33W|M}zdWHa5CQAL^36v8x&E14OfRySR zN-7$FW01miweypcO|GU}G0o4dxNBwb8elEaEvkwBuNn)KmMSrdLHhiW@8g2=dMQX) z+Ld?@Z2b-eclCeMyaq~YDMLlAF9s&Zb17mGIVMtXWw^FSX{pdwdr+vYrXu(co2pd5 zuxH3oawZiUC)+T@g{($hIX2oU^|j!n)i8tq$C)SC+HON4CfSE7bWc8$7qH1^OZNPyyMO;sSLdN~&UWb;QbAcm6dJty=`=)GR5cKj0< z168hS=)SNWh8?%9a5YPVEA7?ZUf`FWE4hE1UC;Tqowb^vuCo#W(R~KApKW zV~gc^=a1zt3VCGj@%)5>=$~3+&akk3%QBjpou}uN6pP}n>rrUSS;Mq`)nfks6O$BI zxzcfHVvfJ}oLz{ng3P8i4I#7j>W{hTPUoC1|5 z3b2FiJzJ~O9W4|BVBE-r{_`h>P0AyrxYH%nSw-Isn>%vkZ5yd@Y zu2v^&>SRJK3Zahazy{To5i=GE=S4koWpm1rI46HP+s;ag zYe83RZRrcLXkpR0kQY?HNNvc+9K`Q>Fj3M;W)>FMh`_9w$ax0`ot8OPTZZ?b6rr}D z?G+(|57gT#@HJ7jQ8xu~%>N=uzK$lB(Kvh_$I7S67aXp4HP)TMvCK>6?^{W^2@ZtfQnVXj- z3kT?1j~-(W*{<_+{pj!jU)wDAr>6~k_wn)c99Wo8>9fno80oT2OX<`+(f1!8H#-F} zfGsQ?8sKwQEvAR}9M4-CNNS9QX;03aq8(42%Epks$t#i9t1cR&@#Cj>e^colpE{+i zf;gtI>VCPyjjNZ))XY5FBe=AVB2h<{_p7;MaEj-w#RK@C`HPq_P(&x)KEWLfNSCB2 z-nb<_=s^_@La-vJ)F+1QxGtNh$q9vO2S-GJRX9xGJ+^?5rRpG2tH=sSe!RAWy>jXo zdDda`g6pZ6s`yAW3lj^O+%kly2qKD=4)8msxMaZ|A1p`&5UbiZtrF$RLtrPDf?a3k))rOE zFRy9|RWV5?N~}mt>SeCKC}}vj<5{p%rnuh=S(f!(t3)Lu*R}N6EIuPEm9>vl8Jd5>F))^i97kVv45EGAx1Cu~D%JH1v>V!Zbk z?hUA;5NLaJ19Z~ze@o(uewf^^%>RqZd>qic7?|l;qW?3&pUJ3`R_UrCF~!Pc>6Gn} z5G8ZAs-gS8KqmIFTSYixxwhRYiH?;j$ZHE3Zn|b1V0LaR%F3(?%tTc&Nv)$bF2%AU zqFOk!Dc9zS2auW>FZt7H*qyf`~2OfCh`*n zaDJS-g$tQ4-Lx!y{VP58%oOcAGDo$|u*LsGPMc~e?R@IEKo((gp3?lac<}<>ws~3l z*06kY89R-!6$vgwEIQ>>ROj?qE!nYal1`o~!T!SaOXPI(7+_N(4xPa%@5!V&E$jE2Hu07rOM^k1P{G0B(~b3%ufQmiLPn`uswb zBo%R}=1KHxmZhJ%J?uK}d5Rd@A(#fPP!b*DH1r)NR>((HdiQeEn4{XL29EZ26ys>Ky4LB!(+8N;##xws?0#$&$f85`F_!}Rp8vz zqlPU}Ed#L7PFnJn3Xqwi@p3pFb5T0AFjPPe{;w3A;(@pn$7!KXC4kU~L4iQvDw{FX z6UjYD3^t()I}65D>q3-WI&Kox{$G63;jpT@hosTlh_>l^%d8k?RzkSGUJ`y`wex(0XkN=~2Xry3CMLGfMX;7hjESf)5TtoW^Pw=S7qLgV7C2~bMAa!oY z5y(_rpTsd)FPG!&qP=ril$P`T(1Nn)Bd$$ zSInQOA_QPaLR#I0p~S95Dj&AV(S4hRY+%;IsuG3%m_0tJ>{1moip%-f*=C?FlZXz( z3Q46%M$uDM66VVPJzEyteWCU%w%fr}QgqSlD;OEZR9>;ie^&jA1E;B(z5T)g5e-=? z5^aXa;(fTT(1-5CaI+JA4d3iqWFigRIxWyX-Y@T^j~6VUTn*iK!|9gG6_WC| zQ=xT@#i3z>#@P4Bxtv@lM*F*Nd$QKbMrJ`cM2J6FUgkim$DTH(p^VQT@nuas{9A^}Kh zh(J$PsM5K$%CI?tcBg3Wa${ZzfEMhVLcHpB6-_x34k!dGov@1_o4B4`moZwpDT0_) zL7Uvx<9kHam`sTzQGCo3)eJ=H^r)tQVoESpb5qu z6@vE&gsHsl6#r)hcbf>X+&Y zZh>k$5)ufhETQ&)VvJLhGY$liy^^Nn*)up(PpJ-z+Pp8v0-FS@GHke_vKE>cMsKwm zTR3sOQQU@5NCtz@0&{d&-12wB1G8AtY?^^WWil)42PW@YaXItl1xf99K~Y)Q6mqurGmHT;SSzkzV3WcG6<+n(P`2Oy8n@r5sP^j?^K+ z5~K{w!=(VX)ExscHmhb)x{KrlL{fsLw2D~iLaT=CF$8hP7=byE#{U8#a>eEw zOa;CW5|*=9F3DBf`y1kUdS0vzkZ7h*u{35=j@6@!c+=V?{DUXP>D1{iMH@`IJ~S~$ z5AB+wFWtYNj~t)l^Uq#Nm!CH#`CGoan0FMpv~q6onS-C{9CtLcW_Hc0ose!Nuy!zS zYD4b8!UNcm%WlJp0|C)ljW;An+F<3DVbpH2LKNe>URDIN+eLOdo6) zwP)Xn2C1>48lWon6kNP*volsTA<+1+!x%k2JGTk5s8b44%4hh!W=h~BE~Dp5@NG+E z`YA8<{6M_YDfoI#ksx4W2QYqhOF2EKAa>QYZrLu7IM4fnR zH2A-eCp|Wev3m-a>mEwe5xWJn(mDc>VIteF=xfP3ks1gsBuTITI}Qc^Co3YAKBND) z{E&)$3mA%#K!^|qTZJL?ZSB`wnSIk4TH-kWrdS5RMc9RIKq_O)b^`T&Cf=Sv_Xdwa zzbcAQ4FKf+kM_Jur|=v6&OU)oVFQM-RK*6zA6;U$xnuW#X6vo877#T7XXa2qV`o8; zQEF^4Oi_l#$PJ|xZ%RtXMlKDyL+B`H={|`-_)OoriXuihJ!jB}F66wo=+g*`*^=1_ zkpq~joIU&?=2Ogt)Ow&nWfv?=kwjM$NL4CL)iwl*HWpLX#Mo@*|CU#>#|OlJWLm89L4GB(?1n;W8-jrc3@W<2VEr&HU%D_6 z)BJ5(Pc+p`!h}@%BU&-CkgsT#=}V=A6Yo5ATJrwcr}j^$$9&1j=5=}Mfg6WuqT_Kd9izhwY1@`j+41yb zzS)d|$p!=`nD#S==6G`IG`--$F+RT;^Yq+lIx=y}(t>v2wfdgMP1ta)kr?+VzzQs% ze4C1u5ts%FW*g#}**TaHyf&;~v2JzrIh5LH#7LK(uZEbvUQxuNGz_Ey#uBO9u2K5x zcFDc62e`XRW6XoObVtN(uqsOlAtopwIE#X60A1Ox(<3RQ&5T-y6Ya?9sth|21G4Gx zR6AsMP8JENAu8f_d2#7p0;#!n)Kgny1|#XrZrN}W1LmlIs! zOzixcTuVqGa4q{I6)b@fFF0Z1!Zeq!Rqb@t|D{ecO)07+pFJk$9_5Jy6=AMfmhv66 z)9e4Z#0Y=%e@y_i4Oe9`^+Int#ZWk?stpH`;9FCu=@+LYfRVt_1eG?na#zK@AZ4V@ z@Ee3;+b?VSF?=;&;96Ka0Y1!;=o6V4=09BTX&$?IGCUq}tf;slyZ;kW%l*loCKLQ$ z%UXfBNaR69TZVOv!iM{QWY9RDs!Xkr(8`UXLR`NV8`;|y^0~|}I;`%aL^D)BG}{bV z#UARyXY5oD1*32cVizV)bC(j^K_(UdO#>Wl0D5DwWJu)dfSt|uXpFi@PjG3yvXxvjk2w}%M zumfBH6;LErsxtSf4QqyI-O9zBDwhivETHc{F+uZP69IuJ>ukxQ1@!!;nwbdX*LNJD zBTYq?Jy+!jfajh)OiKm_|jG^m+*W;m_{nhg}$TG9OI3 zXyVtRMIAogkn3j;&B|q)M)+SIImY?xZ!L510z+Q_@BkS6pS5-)hRd)8F?+HCXrBIo z=-ocFP^B!QbDRM5?ZB%bPmsj@qJylbXd;7ORzgX~>THrMXDD*pz?0;i64paNqCgyA zd{Tjfj|)W0@U<0eLZG%a3XQECf~7uHOhML(5wiZ)G_eILQ%;yW>zO=JC<9`EqQ?Vq zK!@Za5&vc;GA=vY23ZSz)9QKp4M6#sdQoK>i&`6~09Q7k(C58sVW|wXn1yme( z*r!2=sY)6&07XJ0VSYl@gMDDT;)E1W)Kgy7g;aozD@qY_o@K zmU&doh)SXUU)g6@LSawT4q%=|2aX5sheRRXDVx>6TF&+)hAEJ2Yex;CnkA87ijI9@ zI}Wk?lFh$K5%EwWc8Je`CacA!j5Sl*R>T?HU7xm^qb(A({9oII?z_Qg5N0^|ziQHL zkqpI*R9S$eLZILWt&F+Kk>Ds^`3WFq!sj7d+iDsr0J8QtU&V+59&nAh{#htjyKlR1 z7GkY-t}60#ib}#}R8|XeAH$TgL!F|1h@FsyloA905T7^W1B?NOfTk{5jK>n7;Jad+ z!7FT5g*B4N)+bet#Za4Q*rzbxz`RJREjfsr@Z+G!IR>|qBj^)EioLex@uZ5WhCzli zBSQ=L;tj*J_wX#OY$~#e#Lmr$cwjM|W&Nga<61h@;ivY^$l-}uRwpl_iTmRERZHly zjU$rw-3~2YmPzTud!}e+b{^KriL74QoU`}PEPt=**TPoQUV0X6`g+=?^4nBxh4vkp zr6-@8k<(qh3BLLFdFPJE{_$CU_V5WsU57omBI}bT%A3OL8lt>tph&QPe2&j*s>2tZ zvy{`;2QL)F_>Uy6qC@O|c>E{L7sdTZhm$KlJ^s(De`B9PrAPa4A^(U9B;t%JTze`X z2~m|nR#%A0+KMIww6S+0xv;<8(0k<*??ssb8R6|(uyr_e`HC%f742&8j*7MbT|2A# zIk={NhdhS>%|1qZFZ=HT>63#F0rwU%zX1bmuClpaXAjnk5GX*Kt3#OC|jbSyF zF7Uau2rP8k4LbGyjeLq1?R0YTXB`enLS-mM&@{(J8=0A&mFuzz>wsuBo!u{zoxi{ksMB(%083 z-)^@ip)wKt->+%=f2#^&1cs{LB}NEYunglZmqE`z8lR*Jigl95ZU2WK!~c8QB2xOq zmE4sK^_T_G*>uGe|CYdPYnP*7kg2yWM*x5wVpYV+eI<`XTY*TeB$_X{DzOYzf;B@olf|Es_pVxG0@ zpx6pQ%KTJMwf#{Q|D#T*!s{LcvSgWJ|3p>%ch{l-+B$BG#i6w2|4bfFIOtSj00>7w zYJ$pK9~jHxMIE|)%LtvGCt2K7TAw>I!%y!!VJjRG@GM=otvNT{-1XGHY5MkKxA#9XjvO}FFmWiwTmCh+Y$3hyg5`2x`~)vsyio3Y=tw5h zS6(zVXO5f*{%^Be{!(8uTZD?!EBHU_JQtL1=|v~mlSAt0TY`+fR6fi?#lEep z6)Tv?JA*;#Yxg!`>Zv{!4ZB4XUYGt`>{g0U0)=$rUGC}guJn6J4+XJC1QasWc<(=c|}XmhDznZ z!ZD-#R+3lF6$`wj=mcG{1~Wpn4rdBEkO^cUCa&fKkP4TfrN3fRUX1c-L|<`?Wr!j$T?#VAY77oGEY!FcW2SfJ zy*e%ilC0-wgwslsge%1{mmN`Kvwi<2UjgxmD26TiAN)OUp_a6nsx`>c1heUuIpBd< z0Ai}ftwA6CM7c$Az){qN^U7oKe+QT_Ht$Bn09Ro14mT-TvYH-y;^_X5zVKU5EdJmz zvr4j~T3kO)VhI!pWXP`(pOmO8;IJ)M2Rl~Ig-l4a4dy^t!pZ8=$`cf$Ri1pB;&Iui zqTER@EO_P0h)PCiu9D2Mt;V>jL^u!C80d#lK^D$8eg?G&9G+tW!l2J2(f>qW6Wq!D zUn^|zWp_;W?u^2c7ZPl);G2ZHq@Blzf7Xr;N|h6MkcJTaNSth2$_GIc!K|^^^`;j_ ze?>89nDykW;v6S4MwYPUu%RZv>Z4`;jr`!X>BPp3In&q=2T)ta`-BC7BB^l2Kfzpz zTN6fQ`U;9wIuV#vzMu=tGdPqemjvr!B|4hSxNUSSrsm0Ft^tzbJdxW9v0D$Bz~zn0 z((_+W&C}@80Y1ljU?9Qp!xgUbwhH|`e8~pfIYbDc(G}f5gnxWF5faLFWtU^ zAKEn~Uwhy%O-!A(iiao`rQa8ASejM+;GW|YNVAz&IzJKBD;h$4V0@Oo^VqoDz2k@+ zKQT{NojK1~A(Wd%(oE9|e`e{qWsrhai z6Q{kr9OA!ihbPAuas#uKhkR2a@B-7WpCPvBC6LVgzoW!O!BBz5l#swhj3IL!i&dO1 z2ZyXalokON|A$FHEG%V|c???=$B#_Fu9rw2E8T0+*Z{HPK+HO3DobT-PD)O` zHQq9jk!1;@3rI98L6=%D7E;9{Mu|v1O{}=UnsV5M1W-~91iy=!2$$-kSNAO(srOnV z0BiPbV>(`{bS*Y@h=2M{*-BFgO>VEF(Tpu(wvRp>%)w9E<^Z!p*RVZ3ovR3gHlrPO z%nV!o!)?%~hDjkyT7Y43e(hiNe^LK|!^Kktf=M+NC-J88n0%(s@Em2AnW>VW-S5dU zhs;K`b%7yzJ8W%e(65@2U|VrotXjdLZLteGZZ|#%s*l=w3ocRM>V)C8jdW7}r{^KxTbX=@>Gj=&JM$2SRsipy_INSX;&FT5E6gt zT;cDaC2PkE7%o)$`?AeTDOEYs{WIx{57ItXm&58H`MT9(i_#Yi@bt;~rouW&Cr-{6 zRT;?Um2*l}*cBrK{MfV8xw=WvPe@qP>vL8up|h3`a(ZM}S8t>!MG5#=Uge~%n@4E> z(UX$)&!+L5Jl&;34XI6d`ta^4Suwhh(~}b}I%k=T4lPm#3qG$v(G*?j$_qwm?~xO9 z{KTo;=MS1n@z#wavUJG+tr;7X^gLPeGO9TWtXWN6jR)3bAxJ1DSLQZF_h<6|js&wK zzkn!ItS~FOT&3rEmCIrWK%Arb1zjK`*57`e2Ll+WsNuLSBaliPRow{D7*Qa@(t=@y zH*v+1`Ok=H zAg+^YmSp)$tkMx=CvsM4BI~#nJMDv@BTFo7=>A6-3WLCt;tLV`6a>;JT*nP^q}I6Y zIwh|T5h?{n@@p;jm?p*-F;~&t?LJm?Ocb(Y0}e_QVput^1bD7z()1PHsng#QZa}4R z77A6q+E9Zsg^B}dl+z$-h|Uz+tiT`BCuHJ-5K5eBHDDI1t%SK|K=E%aONA01#5Z-D z+6kac(ax-nQ%|7vpdfGLvQ_D@@z%q%j*F7q|2fD5U$=39EfP^}UP>w~aqOB+QWy&K z2b*WVxc*D37ZnheF$X)cSl@9~n$L(;5Y40n_7brZ$(ht6a&{aiob)}_zuBC=U;DpZ zq?}V60N5tq2#v%63zCd-8WK+M@8FF3zOBq4v6o((DK$$hxRF@kMBvkaYt=^%y?OmA zPa`U60T;!=fTV4*`NU3`Z&7Jnf0^@fv|$3qlxm}A%fT3f{|g!+&u%eM?niZ!;gtMIe9DunUUbSHJ4yA*Jqz!zdy~2 zMm|YOJj7xWJ6HArJASA=r2VTKnxB~yT}fZq_3cN;(JqHc$!8BYOYoO%8p)*h2Tx4U z)J(a#OU;APOHaGP0h=$eX{~&nV3GEZaSl@E*ztw#S8ekBeM~+EqNxa)|*XgqLG<^`@d>B z->krDdgkwE@PFM}5T?i`N({EiGdpL1Y!7`$baqFTkOtSV#t8Zx+pR9+u#i}m5_|E7 zTkjMkmv)ddxD_{cmAQ_k`ab^d=`i*e`zXOm?TmW@8rS5qhxx%_;n2ElihvTyF)m|6 zP^!k-@;Zulw%g~bDMR}}`dqA5LuPoTO~q}Gd9G}ZV+;W6QPlJMO2dNdU^Z&d)d?N=|84fgUTMm&*oBWohTZ+C_wemXR3%?9 zqIiR!cUI|2I!fB&N}axeL{rp%OkWcCY#>5G3{7}rKw+ntm9CXc0banQjo8?At+>Pz zZoIM<#gnYkhB{H*tH8ME; zi5>zG5nG{k_&vYghg7^DXpa+=8=0w|`pxpwneLwWD)k>e-x*UuWsS7Hx6B{F>R#$kSR?=mOX#KBSJCC?jpU~!TzJk>KG}fOcOO4i71PqMRE1ukPjp(euoFNc*Z>24bW04y z*e_;xMD;Xs@PCFYwfuj;Pu0lA8a%6Jq<2ZRa&^XD9)BkUJ(y`}Ul?(iEnBu=svCNJ zQ1$*x9lBtu?ApRN3YiV?FSU%tu!PLb?F4-lMqL4+UK02CPqLQx;*Aj)Kxr2HqRmgFH8y6mcWy=AFb@?-QJia2k#I#qOmS6EW*Dtv zu?5^XX6(DxDUT8{PWM}HEm1_o(P_Yk5>29f;^zlNkol}vz<{}Cqh_DQhM)j^Eo|03 z0#}v{VTZaZWk89Li`WuiYf(WKn`HBZy}542$CXUrHTwkD?L|G6#OoXPE(JTzO~my3z)Z` zJ3`MMndNiO9?F&2w5@<`PLarzS-j%B5nevBke_;PMxNd`<9!f(nCPq(i+J1S5jrtf zwjJp6Uv*BD7Zm&F?VCsB^gLxET102^+EKB9bt?vW-O9!E{l_QdR9Ea~sf#u)qm!rR z>CtDWY_5!#Hh<60lk7e)!@HWchZirPw1@V(Z7Z5T_N88$F<4wnPV29@DQ7oLCJIBcz@<1~CR=GZys91rkWL(_lcnL?aP4 zY&C!vZf@6i){-=lN1b;Bb1jh`F!l6mv{ z%io{oFMWU7)N=JjX=!4BK7ZeF)6;MK>?rLya+>maD$~1eT25d5-ZVY9caBDfI`rDB zM|kUo!TfjAU-Q`%?Kylpk9cgj!ykOj>MYU3%slNqGS6T9?(wG0Q+aIZ+R5hqJHIzA zYA;!ut1lYj*IhG`2Qo3!ZQ46UU&`&CGK2W=>sHezzcQZQlZ~qe_$@DA&ZA2f(8P)P z=GzQiMa`R5FQWJS{HpwZ`W)}S{<`IK%|%Oi zWApirJ+t(uUpY#<51k~Ou&o*Q>zZ>$mvkt}`Ni)}mg}w^qkhM`Z`;=_f6SX@-tdCa z=4T|&TN>Mr-6!bI?@SaE(`#OL?Q**A(xr_PFQT2hPw*$ce5jG(RJPA#WgmUxdKw!l z;~t-$r`zs2(zJCl+yBkKxQ_09=s4Z|(3BbINHb6G{l&BC-Jf|TgZ@X~bPj#u%LmiA z7{Qsuh&|tM)mWpSLHd&~?GKTL`J?~#ocuL~`-OcAsI~G@rWj4o+SFNBMU${J9 zyZg{wv)na9U-fu_9T(8A{qf_{$i>%f9kaQ{vE%8ftmo@48_5Ix!oM7mJMKTs zfA~M2%R6>W(XC%Qkf%54C_R_)eZRbse)}(;%>IztA8o29Z+zKWx_rxUZnx1Nec}Ei zeD{OL;NC(CtlPINl{fv=+NPa>EbABkD?)YD~8Sr$<&+SicX;#?Gs}v36{#E6-hK4(_;z=l94#yDMulZ z^!Y%7pkvq0%PArLON;PEmJ>G%u@M$$M4st+^*c!Is*%7IOjT7u%WSE{c`KFJE9A(Bm%GCePK%eosbws(UB~S1hQa*sxZ)R?uk2Tfd>DfWrb>Kupwg=Ob z6!I51Jo3y`ewqT1Gwqjs;<>5(tlG49_rmqdWXrmFPFVZMo+(Ptv?cPq6nbape3o=* z`0;az-EaE%e}~{JWIiL2#1?PR@08aQC6ZVMi1leEumb01ZNgX38RR1} zW5e}=3xHn)O7CtY&QK&UXf;e~C97)S4OyL|Z!{z^k-qD%7;65WZAjxRJ#%C}lc?*T zH{{AxXu9U2#k6tdK>mAlxG~Oi7Gwn*vh+adAr|47vG?5AO9q(RG4YABdIMNWyL`YMA5AHol+cq|z zzvrAxdXv7cxp)a}-8fj_-?A9ujjI+m=MFZcvbk>0T=Vy0y8HJwH)OmaG5M=Rg=Adz?j=bsx%jhjHUzz8)zG)~2?`tnv+PpVNdZ%mF zM@oopY_5Ty+;HVsI!7Xy6b~!@_uhsKzwMQ4n(GGKCKCy72yP~m4f#y{e)FT3(Y2Q@ z3w~0rfBW@ovVkY^nn>(Ne|2L+U~`g^W!toBFp*bzpdqE#UOGbG`q(yl!^>8e`i8Ja zxTfDkR+GLG*-fDIv0vRp@3?+lZh!gE!e-pVO&=4P#NKe#a{9{qFU$R;_R~2@&M(}5 zG>aK)Boi98eF>^E=P zNN@U?v-9J8NSQ_IlMFG0|3gDafAiIw=q1}$;N5)YOSUb~V@ho&J^jURZKXH;^x650 zWJ^~xRiwKcQr^fT>1TH{zT*DktCNBUn#W3EtRz!hDPs){idV(|eS1T=P9JAbZ|h>} zJ<4@^Le0(JCy(gfuE`%tG1k8aI;C)qucz`b5xGdk?H92$A zd^mj**aho{_yG7r~?LDBBDMbzKk|hyRZb(UeeD2*Hb z=%@o%MmjGM(rYgnZe*Q?-SGB?P^L<;sLkAPEkGx?$UH^e6T<;G}BVk zg*{VTc8=k%(h`1ImcWN~? z2$=uhxqC*M^YUEmY)JH{-gX{+yr~u^nUbDv{o0{?cKW^VGgr~&n}_LvT{E0WcVaFR zGp8BFs$2j0ApOCwZlM?c_5;F^C^Q{4q?K4n>ZhA3?H%_YZOC5nk>q!&Dyu&zJ<(?y zV%m^d{^gH8WLbVtIscb;T-1=#1N3{J-)%OK$R+RqYpUt5R1Hqm-#@EFDBe)g8{5tikfDlR3GNaUEAE@_Ce{HK3^0e|Md zKWEnP^@docifgL+CgIaE-d#J7(oGF{P5bH6aozUi^jCV#<~2*`rk`9xzjynS&2?*< zs_QYE`_$iE4<4nz`lsgvig@);uBFsp8c&+rzxwabh9FYWx=6baSMrN)Yq=HyR(u)G zFtCDaGSZsg?J&YpU67Cve@e3j>A|MTIbOWe3Jo!eue$6;TCGFh<=dlFs^I@6tY|L? zR@O%hOkPFx{SqKI7H)J`NRb4#k#R|)#;{CowM`G@p|D0)2__|W5+;O<;h{=LY>Sm% zOcU(et&#~3oL1Ro@@00dHiy%#SRRQ5J5|>+*diO1K&MrGB}Ymx0%5c{DXg!I+Sz8& zQ%D*_i6JS$F#U(WJpnCG)w!EDwnUjrYzgveotP4PZd~6Wczj3jxZoB7LQ@LE4m-}1l%O|8NAbDMf0*@l> z=?fRSr<+J(ZQlG#>*!A!@|w0g+}KoL?e2HDD#YTlg}~>l{MPMsW@j7MEabGEpdr2- zXC~Yrkt(X32x+SL#zXMjW+8T8qx4L}D$J2$Z`$^dDwv6E2ESJSFKyiV^@ExGzVBDg zVF|Pcv_hrBwf3?$E)NEu`R9X@s;y}&gValeS)S{*jy6@;{p$aYS&+w)=jM+@yi;}b zrWdU;H9^K#zi?GUK=)bhj`;Xj|FmCT(h%UWX2~w@k2YulO{ot9>SG%n$WISLRNUz}km}%Hcxsf?+9D zi4la-NFYVn8{PX<2C943gh9)Nj;|U;u$*bmz=Rb?ZP$aAXvt9BQ~h5*VG$ouvRR=+gcP|nF7UeSIX(a6WdVFG>paV(B^M1d4B z+HsluS_+AZIT*9YO=E4o^H;C#A@Yo94`Lx&Mdi>_1z6fPd*xeHk8x}khnbA#`%QL0 zGb+3>h=IA~K+4!hTG~h_cS-?CDZWpb_8U{8ssdbMDxJM*kk_wRLMNK4YPz9m=kDVw z8$~vsI~`oqp{p-jk%`>{Pfp5n$7aK9E37ofrJI(~*((S6;ITP*;He2CQd$xg=qo)9 zAXS2Y*z`GbV!k1d%jkLMkEO4brE9mYq@TKC6}{|=m3+gC*2U*GZ@;tYlc)LQ z>3N=>olj3ZkhGm)c+gf6p=mjO;xs>XV4A=3or9G22`_JCdfDZx<;n}jWaa20eSCkh z|D0^ZF-M5?WNUsH-^&RVx%it*uK`BPPf}b#C~8g5ebb%S|V2nQUkYIxQEJ z^F8CW3YH68Qe&~KhmaWxd77>|HZjSwTLMrZv8tqY=O~dcRZ$QBm(6(7j@$1&ZbL{U z^vIuYvCnV%*gj6A6nSq_U3%Rt|7YJxTLwP$j}tU;qRTftf0#ah-=ti9(GtGpbBD74 zY59Ne;Zt_A2SnR@__T};b&3J#NZ)l+369s~C4ZqWet(Ke@~I=R<*M=>_CY(Eco(Bd zRoJwZBE5I}eTB$26;^)z|M?7k`1Nb^KG&u)o2#}q^-j$4?^GS#`Jd0H4>uLu$>!SE zT|3tNeMnw+&8UqcRcM>aq6r63NY%Vl(M`+S4>m;hEuVUpKJvzObn`E)rBD3BVY=<^ zam9ZQ^GgOr793FlkhI*qFja_oV^jTn+bdQ!ZIo(Q+Pbl)Av1avAx0({QYCuB>V?vf zo!n8{dXc`CaQmhul!*5AzyAcLoyaOXR$4I|rRos(6_u^2oYIH>cAqqI@W$1f(q3J@ zyQ#p!WKxy(noE{t@_gN;BlL>*KcdlFLaIjev0vT5H(a?qS9ss`S9_#cCg<3FL1U<(q{W^S7H9;3g0_oa0AoA39K(wuhrmZf=*mR3je@xEW# zob{get^QG}yeh#;uAssh2Q_a0JmPc zeFdGq^W|uYfBHT5=jyL7vnn-e{^^vBh!wVRNSO4U3Wtyzgu0&9EeWItF`?Uosibw2 zTqgIDm~%z;N+g9s3I!ey>9kHEM%)kbLZaUEYvkZo2x)BR4#gshp@FHC~ zgK?tjpdn{+(T1hG@5mf&K5Gem`_T!RJ=qNnsP=NfjO7LAkMfei1+w$02~LlZ@y4YMxn3^mx)Z17)%(?_ z%M{DusX0FK$Q&(N(4lkBUYbZYO*I(4@7NqY(^PrqyJB`$=AM77{||WN2r?F;>VY2y zjFZId(rlc`s_G75xZ0c-89brh&+R2&;;<|r0cS$6;aFK<=L~FdB2<91V@yy*m_D{kh zP8(J(%;)UfJC|?F`p|1urG2lQDxdc~Hfs}?ZX60@)A!is$+5efn+VtC?|fRVqcT{c z*7#IS+J2dqytkJ98W?uE!7NpeUwrY9eDdF~%i99p@@LQ0iH$PJw8bKAk7&-}2b)T4 z+RuCML(@&AchrD%_ra5xx3ZK87RtHuSWar*YO1#K#qUk>t6nf7A9=%BoW}Q_&+dn9 znJq;a1Wt+q#rDlhj4QqS)_ro%L&rneG%PBq8ztXLdwCOqN2_UX>h`Acm~QyG{sT`+ zy4lP2mvS_GH8og;bn&J~0=2={zhsp(WSVdJrFEFkTqVsnj#W2b5Z`#!a(a0~V)x|b z`!ZiK!FlIj?vaMT^0rMw^k;89H;?b*U)mRD+KGLUD{T{)@9Y0*s{p;U4B*#4@kCR> zJ+5=>5i{+jP4o1@hRDKJYzoY<%82(II>`-*r9XT71@!X&?Lm)i6!4(BxMimjEVlce)|WAkcMh{-20=BC6MIT`sTw ziPil3pL;5Qo~o`l{lqFxTMW|Q>Doki)7FB2`!nmf`N=K)=BqbSLu7j#Ic-1qkDq?D zNl;E$%(`pGQTplk-d}-tJUqCA7Y7@rh==w*!wv!=a28eUp8V_4CGeR1m)flp*Mcv) z&?uqc8AxLmq>J!D0_G}l@ugx;E-oA65+f{;EaDn1?<(U#Ymmq4r)GzKzeTU^xEqN% zDF*|wy^om!(qpJ&xhEB

    !Eu#} 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≤E6Lyc@7|F% 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%0A$B&YQMchsuChG@FSrM`Y1mC5)3I54fhaf-uJ* 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%0DBzOs$9t>5fJ9;zv?rHfmQ`+ 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 literal 390200 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

    `(a~fzZ2dvM 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

    o+VqIhW>hrx9(}f&t%7Rc1mi1%B*o{On4jv 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%0A}ru?-fSW+E{(^s9J8VIVLz2 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 N002ovPDHLkV1nTlA&39~ From d29ff932f910f786442cb763a556b8f455414dfd Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Fri, 1 Sep 2023 15:59:06 +0200 Subject: [PATCH 121/126] Added resolve function to resolve the support structure to Tree or Normal support mode, based on the material of the support extruder. --- resources/definitions/fdmprinter.def.json | 1 + 1 file changed, 1 insertion(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 680dd3b6f8..590b8d3f29 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -4580,6 +4580,7 @@ }, "enabled": "support_enable", "default_value": "normal", + "resolve": "extruderValue(support_extruder_nr, 'support_structure')", "settable_per_mesh": false, "settable_per_extruder": false }, From ea87f18e4d0ba499e9fad86986725b530b0a5980 Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Fri, 1 Sep 2023 16:00:48 +0200 Subject: [PATCH 122/126] Changed bottom skin flow to be 95% instead of 90% to improve bottom layer for edge cases in the machine population. This will slightly increase the elephant foot. PP-374 --- resources/definitions/ultimaker.def.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/definitions/ultimaker.def.json b/resources/definitions/ultimaker.def.json index 87168d20ae..1669dd5e00 100644 --- a/resources/definitions/ultimaker.def.json +++ b/resources/definitions/ultimaker.def.json @@ -111,7 +111,7 @@ "skin_angles": { "value": "[] if infill_pattern not in ['cross', 'cross_3d'] else [20, 110]" }, "skin_edge_support_thickness": { "value": "4 * layer_height if infill_sparse_density < 30 else 0" }, "skin_material_flow": { "value": "0.95 * material_flow" }, - "skin_material_flow_layer_0": { "value": "0.9 * material_flow_layer_0" }, + "skin_material_flow_layer_0": { "value": "95" }, "skin_monotonic": { "value": "roofing_layer_count == 0" }, "skin_overlap": { "value": "20" }, "speed_equalize_flow_width_factor": { "value": "110.0" }, From 3128ffb34a4229bb3ba5c1cedb0e5f8522dcb428 Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Fri, 1 Sep 2023 16:01:25 +0200 Subject: [PATCH 123/126] Make 0.2m the default layer height for S line printer (iso 0.15mm). PP-245 --- resources/definitions/ultimaker_s3.def.json | 2 +- resources/definitions/ultimaker_s5.def.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/definitions/ultimaker_s3.def.json b/resources/definitions/ultimaker_s3.def.json index 10aaabd6a7..eeadc38a8b 100644 --- a/resources/definitions/ultimaker_s3.def.json +++ b/resources/definitions/ultimaker_s3.def.json @@ -41,7 +41,7 @@ 0 ], "platform_texture": "UltimakerS3backplate.png", - "preferred_quality_type": "fast", + "preferred_quality_type": "draft", "preferred_variant_name": "AA 0.4", "supported_actions": [ "DiscoverUM3Action" ], "supports_material_export": true, diff --git a/resources/definitions/ultimaker_s5.def.json b/resources/definitions/ultimaker_s5.def.json index 092a16fa6e..16887cfc78 100644 --- a/resources/definitions/ultimaker_s5.def.json +++ b/resources/definitions/ultimaker_s5.def.json @@ -38,7 +38,7 @@ -10 ], "platform_texture": "UltimakerS5backplate.png", - "preferred_quality_type": "fast", + "preferred_quality_type": "draft", "preferred_variant_buildplate_name": "Glass", "preferred_variant_name": "AA 0.4", "supported_actions": [ "DiscoverUM3Action" ], From 84653f08cacb5537a50d8e053f7b361e7837eddd Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Fri, 1 Sep 2023 16:03:33 +0200 Subject: [PATCH 124/126] Added quality and intent profiles for Ultimaker PLA, T-PLA, PETG and ABS. Added extra profile for 0.3mm PETG and ABS. Added quick, engineer and visual intent mode for 0.2mm layer heights (for both AA0.4 and AA0.8 nozzles) PP-245 --- .../um_s3_aa0.4_um-abs_0.06mm_visual.inst.cfg | 17 ++++ ...3_aa0.4_um-abs_0.15mm_engineering.inst.cfg | 28 +++++++ .../um_s3_aa0.4_um-abs_0.15mm_visual.inst.cfg | 24 ++++++ ...s3_aa0.4_um-abs_0.1mm_engineering.inst.cfg | 24 ++++++ .../um_s3_aa0.4_um-abs_0.1mm_visual.inst.cfg | 17 ++++ ...s3_aa0.4_um-abs_0.2mm_engineering.inst.cfg | 28 +++++++ .../um_s3_aa0.4_um-abs_0.2mm_quick.inst.cfg | 29 +++++++ .../um_s3_aa0.4_um-abs_0.2mm_visual.inst.cfg | 24 ++++++ ..._aa0.4_um-petg_0.15mm_engineering.inst.cfg | 28 +++++++ ...3_aa0.4_um-petg_0.1mm_engineering.inst.cfg | 24 ++++++ ...3_aa0.4_um-petg_0.2mm_engineering.inst.cfg | 28 +++++++ .../um_s3_aa0.4_um-petg_0.2mm_quick.inst.cfg | 29 +++++++ .../um_s3_aa0.4_um-petg_0.2mm_visual.inst.cfg | 24 ++++++ .../um_s3_aa0.4_um-pla_0.06mm_visual.inst.cfg | 17 ++++ ...3_aa0.4_um-pla_0.15mm_engineering.inst.cfg | 28 +++++++ .../um_s3_aa0.4_um-pla_0.15mm_visual.inst.cfg | 24 ++++++ ...s3_aa0.4_um-pla_0.1mm_engineering.inst.cfg | 24 ++++++ .../um_s3_aa0.4_um-pla_0.1mm_visual.inst.cfg | 17 ++++ ...s3_aa0.4_um-pla_0.2mm_engineering.inst.cfg | 28 +++++++ .../um_s3_aa0.4_um-pla_0.2mm_quick.inst.cfg | 29 +++++++ .../um_s3_aa0.4_um-pla_0.2mm_visual.inst.cfg | 24 ++++++ .../um_s3_aa0.4_um-pla_0.3mm_quick.inst.cfg | 30 ++++++++ ..._aa0.4_um-tough-pla_0.06mm_visual.inst.cfg | 17 ++++ ...4_um-tough-pla_0.15mm_engineering.inst.cfg | 28 +++++++ ..._aa0.4_um-tough-pla_0.15mm_visual.inst.cfg | 24 ++++++ ....4_um-tough-pla_0.1mm_engineering.inst.cfg | 24 ++++++ ...3_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg | 17 ++++ ....4_um-tough-pla_0.2mm_engineering.inst.cfg | 28 +++++++ ...s3_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg | 29 +++++++ ...3_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg | 24 ++++++ ...s3_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg | 30 ++++++++ ...s3_aa0.8_um-abs_0.2mm_engineering.inst.cfg | 28 +++++++ .../um_s3_aa0.8_um-abs_0.2mm_quick.inst.cfg | 28 +++++++ .../um_s3_aa0.8_um-abs_0.2mm_visual.inst.cfg | 24 ++++++ ...3_aa0.8_um-petg_0.2mm_engineering.inst.cfg | 28 +++++++ .../um_s3_aa0.8_um-petg_0.2mm_quick.inst.cfg | 28 +++++++ .../um_s3_aa0.8_um-petg_0.2mm_visual.inst.cfg | 24 ++++++ ...s3_aa0.8_um-pla_0.2mm_engineering.inst.cfg | 28 +++++++ .../um_s3_aa0.8_um-pla_0.2mm_quick.inst.cfg | 28 +++++++ .../um_s3_aa0.8_um-pla_0.2mm_visual.inst.cfg | 24 ++++++ ....8_um-tough-pla_0.2mm_engineering.inst.cfg | 28 +++++++ ...s3_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg | 28 +++++++ ...3_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg | 24 ++++++ .../um_s5_aa0.4_um-abs_0.06mm_visual.inst.cfg | 17 ++++ ...5_aa0.4_um-abs_0.15mm_engineering.inst.cfg | 28 +++++++ .../um_s5_aa0.4_um-abs_0.15mm_visual.inst.cfg | 24 ++++++ ...s5_aa0.4_um-abs_0.1mm_engineering.inst.cfg | 24 ++++++ .../um_s5_aa0.4_um-abs_0.1mm_visual.inst.cfg | 17 ++++ ...s5_aa0.4_um-abs_0.2mm_engineering.inst.cfg | 28 +++++++ .../um_s5_aa0.4_um-abs_0.2mm_quick.inst.cfg | 29 +++++++ .../um_s5_aa0.4_um-abs_0.2mm_visual.inst.cfg | 24 ++++++ ..._aa0.4_um-petg_0.15mm_engineering.inst.cfg | 28 +++++++ ...5_aa0.4_um-petg_0.1mm_engineering.inst.cfg | 24 ++++++ ...5_aa0.4_um-petg_0.2mm_engineering.inst.cfg | 28 +++++++ .../um_s5_aa0.4_um-petg_0.2mm_quick.inst.cfg | 29 +++++++ .../um_s5_aa0.4_um-petg_0.2mm_visual.inst.cfg | 24 ++++++ .../um_s5_aa0.4_um-pla_0.06mm_visual.inst.cfg | 17 ++++ ...5_aa0.4_um-pla_0.15mm_engineering.inst.cfg | 28 +++++++ .../um_s5_aa0.4_um-pla_0.15mm_visual.inst.cfg | 24 ++++++ ...s5_aa0.4_um-pla_0.1mm_engineering.inst.cfg | 24 ++++++ .../um_s5_aa0.4_um-pla_0.1mm_visual.inst.cfg | 17 ++++ ...s5_aa0.4_um-pla_0.2mm_engineering.inst.cfg | 28 +++++++ .../um_s5_aa0.4_um-pla_0.2mm_quick.inst.cfg | 29 +++++++ .../um_s5_aa0.4_um-pla_0.2mm_visual.inst.cfg | 24 ++++++ .../um_s5_aa0.4_um-pla_0.3mm_quick.inst.cfg | 30 ++++++++ ..._aa0.4_um-tough-pla_0.06mm_visual.inst.cfg | 17 ++++ ...4_um-tough-pla_0.15mm_engineering.inst.cfg | 28 +++++++ ..._aa0.4_um-tough-pla_0.15mm_visual.inst.cfg | 24 ++++++ ....4_um-tough-pla_0.1mm_engineering.inst.cfg | 24 ++++++ ...5_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg | 17 ++++ ....4_um-tough-pla_0.2mm_engineering.inst.cfg | 28 +++++++ ...s5_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg | 29 +++++++ ...5_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg | 24 ++++++ ...s5_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg | 30 ++++++++ ...s5_aa0.8_um-abs_0.2mm_engineering.inst.cfg | 28 +++++++ .../um_s5_aa0.8_um-abs_0.2mm_quick.inst.cfg | 28 +++++++ .../um_s5_aa0.8_um-abs_0.2mm_visual.inst.cfg | 24 ++++++ ...5_aa0.8_um-petg_0.2mm_engineering.inst.cfg | 28 +++++++ .../um_s5_aa0.8_um-petg_0.2mm_quick.inst.cfg | 28 +++++++ .../um_s5_aa0.8_um-petg_0.2mm_visual.inst.cfg | 24 ++++++ ...s5_aa0.8_um-pla_0.2mm_engineering.inst.cfg | 28 +++++++ .../um_s5_aa0.8_um-pla_0.2mm_quick.inst.cfg | 28 +++++++ .../um_s5_aa0.8_um-pla_0.2mm_visual.inst.cfg | 24 ++++++ ....8_um-tough-pla_0.2mm_engineering.inst.cfg | 28 +++++++ ...s5_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg | 28 +++++++ ...5_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg | 24 ++++++ .../um_s3_aa0.25_um-abs_0.1mm.inst.cfg | 20 +++++ .../um_s3_aa0.25_um-petg_0.1mm.inst.cfg | 23 ++++++ .../um_s3_aa0.25_um-pla_0.1mm.inst.cfg | 32 ++++++++ .../um_s3_aa0.25_um-tough-pla_0.1mm.inst.cfg | 31 ++++++++ .../um_s3_aa0.4_abs_0.3mm.inst.cfg | 24 ++++++ .../um_s3_aa0.4_petg_0.3mm.inst.cfg | 21 +++++ .../um_s3_aa0.4_um-abs_0.06mm.inst.cfg | 29 +++++++ .../um_s3_aa0.4_um-abs_0.15mm.inst.cfg | 75 ++++++++++++++++++ .../um_s3_aa0.4_um-abs_0.1mm.inst.cfg | 29 +++++++ .../um_s3_aa0.4_um-abs_0.2mm.inst.cfg | 75 ++++++++++++++++++ .../um_s3_aa0.4_um-abs_0.3mm.inst.cfg | 77 +++++++++++++++++++ .../um_s3_aa0.4_um-petg_0.06mm.inst.cfg | 27 +++++++ .../um_s3_aa0.4_um-petg_0.15mm.inst.cfg | 73 ++++++++++++++++++ .../um_s3_aa0.4_um-petg_0.1mm.inst.cfg | 27 +++++++ .../um_s3_aa0.4_um-petg_0.2mm.inst.cfg | 74 ++++++++++++++++++ .../um_s3_aa0.4_um-petg_0.3mm.inst.cfg | 75 ++++++++++++++++++ .../um_s3_aa0.4_um-pla_0.06mm.inst.cfg | 29 +++++++ .../um_s3_aa0.4_um-pla_0.15mm.inst.cfg | 74 ++++++++++++++++++ .../um_s3_aa0.4_um-pla_0.1mm.inst.cfg | 25 ++++++ .../um_s3_aa0.4_um-pla_0.2mm.inst.cfg | 75 ++++++++++++++++++ .../um_s3_aa0.4_um-pla_0.3mm.inst.cfg | 77 +++++++++++++++++++ .../um_s3_aa0.4_um-tough-pla_0.06mm.inst.cfg | 29 +++++++ .../um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg | 74 ++++++++++++++++++ .../um_s3_aa0.4_um-tough-pla_0.1mm.inst.cfg | 29 +++++++ .../um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg | 75 ++++++++++++++++++ .../um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg | 77 +++++++++++++++++++ .../um_s3_aa0.8_um-abs_0.2mm.inst.cfg | 74 ++++++++++++++++++ .../um_s3_aa0.8_um-abs_0.3mm.inst.cfg | 74 ++++++++++++++++++ .../um_s3_aa0.8_um-abs_0.4mm.inst.cfg | 74 ++++++++++++++++++ .../um_s3_aa0.8_um-petg_0.2mm.inst.cfg | 73 ++++++++++++++++++ .../um_s3_aa0.8_um-petg_0.3mm.inst.cfg | 73 ++++++++++++++++++ .../um_s3_aa0.8_um-petg_0.4mm.inst.cfg | 73 ++++++++++++++++++ .../um_s3_aa0.8_um-pla_0.2mm.inst.cfg | 74 ++++++++++++++++++ .../um_s3_aa0.8_um-pla_0.3mm.inst.cfg | 74 ++++++++++++++++++ .../um_s3_aa0.8_um-pla_0.4mm.inst.cfg | 74 ++++++++++++++++++ .../um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg | 74 ++++++++++++++++++ .../um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg | 74 ++++++++++++++++++ .../um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg | 74 ++++++++++++++++++ .../um_s3_cc0.4_um-pla_0.15mm.inst.cfg | 29 +++++++ .../um_s3_cc0.4_um-pla_0.2mm.inst.cfg | 29 +++++++ .../um_s3_cc0.6_um-pla_0.15mm.inst.cfg | 29 +++++++ .../um_s3_cc0.6_um-pla_0.2mm.inst.cfg | 29 +++++++ .../um_s5_aa0.25_um-abs_0.1mm.inst.cfg | 20 +++++ .../um_s5_aa0.25_um-petg_0.1mm.inst.cfg | 23 ++++++ .../um_s5_aa0.25_um-pla_0.1mm.inst.cfg | 32 ++++++++ .../um_s5_aa0.25_um-tough-pla_0.1mm.inst.cfg | 31 ++++++++ .../um_s5_aa0.4_abs_0.3mm.inst.cfg | 24 ++++++ .../um_s5_aa0.4_petg_0.3mm.inst.cfg | 21 +++++ .../um_s5_aa0.4_um-abs_0.06mm.inst.cfg | 29 +++++++ .../um_s5_aa0.4_um-abs_0.15mm.inst.cfg | 75 ++++++++++++++++++ .../um_s5_aa0.4_um-abs_0.1mm.inst.cfg | 29 +++++++ .../um_s5_aa0.4_um-abs_0.2mm.inst.cfg | 75 ++++++++++++++++++ .../um_s5_aa0.4_um-abs_0.3mm.inst.cfg | 77 +++++++++++++++++++ .../um_s5_aa0.4_um-petg_0.06mm.inst.cfg | 27 +++++++ .../um_s5_aa0.4_um-petg_0.15mm.inst.cfg | 73 ++++++++++++++++++ .../um_s5_aa0.4_um-petg_0.1mm.inst.cfg | 27 +++++++ .../um_s5_aa0.4_um-petg_0.2mm.inst.cfg | 74 ++++++++++++++++++ .../um_s5_aa0.4_um-petg_0.3mm.inst.cfg | 75 ++++++++++++++++++ .../um_s5_aa0.4_um-pla_0.06mm.inst.cfg | 29 +++++++ .../um_s5_aa0.4_um-pla_0.15mm.inst.cfg | 74 ++++++++++++++++++ .../um_s5_aa0.4_um-pla_0.1mm.inst.cfg | 25 ++++++ .../um_s5_aa0.4_um-pla_0.2mm.inst.cfg | 75 ++++++++++++++++++ .../um_s5_aa0.4_um-pla_0.3mm.inst.cfg | 77 +++++++++++++++++++ .../um_s5_aa0.4_um-tough-pla_0.06mm.inst.cfg | 29 +++++++ .../um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg | 74 ++++++++++++++++++ .../um_s5_aa0.4_um-tough-pla_0.1mm.inst.cfg | 29 +++++++ .../um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg | 75 ++++++++++++++++++ .../um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg | 77 +++++++++++++++++++ .../um_s5_aa0.8_um-abs_0.2mm.inst.cfg | 74 ++++++++++++++++++ .../um_s5_aa0.8_um-abs_0.3mm.inst.cfg | 74 ++++++++++++++++++ .../um_s5_aa0.8_um-abs_0.4mm.inst.cfg | 74 ++++++++++++++++++ .../um_s5_aa0.8_um-petg_0.2mm.inst.cfg | 73 ++++++++++++++++++ .../um_s5_aa0.8_um-petg_0.3mm.inst.cfg | 73 ++++++++++++++++++ .../um_s5_aa0.8_um-petg_0.4mm.inst.cfg | 73 ++++++++++++++++++ .../um_s5_aa0.8_um-pla_0.2mm.inst.cfg | 74 ++++++++++++++++++ .../um_s5_aa0.8_um-pla_0.3mm.inst.cfg | 74 ++++++++++++++++++ .../um_s5_aa0.8_um-pla_0.4mm.inst.cfg | 74 ++++++++++++++++++ .../um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg | 74 ++++++++++++++++++ .../um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg | 74 ++++++++++++++++++ .../um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg | 74 ++++++++++++++++++ .../um_s5_cc0.4_um-pla_0.15mm.inst.cfg | 29 +++++++ .../um_s5_cc0.4_um-pla_0.2mm.inst.cfg | 29 +++++++ .../um_s5_cc0.6_um-pla_0.15mm.inst.cfg | 29 +++++++ .../um_s5_cc0.6_um-pla_0.2mm.inst.cfg | 29 +++++++ 170 files changed, 6726 insertions(+) create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_visual.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_engineering.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg create mode 100644 resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.25_um-pla_0.1mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.25_um-tough-pla_0.1mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_cc0.4_um-pla_0.15mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_cc0.4_um-pla_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_cc0.6_um-pla_0.15mm.inst.cfg create mode 100644 resources/quality/ultimaker_s3/um_s3_cc0.6_um-pla_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.25_um-pla_0.1mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.25_um-tough-pla_0.1mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_cc0.4_um-pla_0.15mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_cc0.4_um-pla_0.2mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_cc0.6_um-pla_0.15mm.inst.cfg create mode 100644 resources/quality/ultimaker_s5/um_s5_cc0.6_um-pla_0.2mm.inst.cfg diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm_visual.inst.cfg new file mode 100644 index 0000000000..fb88768bb6 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm_visual.inst.cfg @@ -0,0 +1,17 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_abs +quality_type = high +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +speed_infill = 50 +top_bottom_thickness = 1.05 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm_engineering.inst.cfg new file mode 100644 index 0000000000..e06ccbc3c6 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s3 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_abs +quality_type = fast +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm_visual.inst.cfg new file mode 100644 index 0000000000..b35aba42ee --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_abs +quality_type = fast +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm_engineering.inst.cfg new file mode 100644 index 0000000000..967051c6b6 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm_engineering.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s3 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_abs +quality_type = normal +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +jerk_print = 30 +speed_infill = =speed_print +speed_print = 30 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm_visual.inst.cfg new file mode 100644 index 0000000000..c08c5e37c1 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm_visual.inst.cfg @@ -0,0 +1,17 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_abs +quality_type = normal +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +speed_infill = 50 +top_bottom_thickness = 1.05 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..e5c66d6b88 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s3 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_abs +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_quick.inst.cfg new file mode 100644 index 0000000000..462f061fb8 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_quick.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s3 +name = Quick +version = 4 + +[metadata] +intent_category = quick +material = ultimaker_abs +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_print = 150 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =2 * line_width + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_visual.inst.cfg new file mode 100644 index 0000000000..a2387b9907 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_abs +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm_engineering.inst.cfg new file mode 100644 index 0000000000..0b2c1c3a96 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s3 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_petg +quality_type = fast +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm_engineering.inst.cfg new file mode 100644 index 0000000000..9bf56f69a2 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm_engineering.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s3 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_petg +quality_type = normal +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +jerk_print = 30 +speed_infill = =speed_print +speed_print = 30 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..698fa97fc8 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s3 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_petg +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_quick.inst.cfg new file mode 100644 index 0000000000..8a1e6beac0 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_quick.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s3 +name = Quick +version = 4 + +[metadata] +intent_category = quick +material = ultimaker_petg +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_print = 150 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =2 * line_width + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_visual.inst.cfg new file mode 100644 index 0000000000..7d6dcb30bf --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_petg +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm_visual.inst.cfg new file mode 100644 index 0000000000..63e20e56bd --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm_visual.inst.cfg @@ -0,0 +1,17 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_pla +quality_type = high +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +speed_infill = 50 +top_bottom_thickness = 1.05 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm_engineering.inst.cfg new file mode 100644 index 0000000000..031ab34fa2 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s3 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_pla +quality_type = fast +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm_visual.inst.cfg new file mode 100644 index 0000000000..875b369cae --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_pla +quality_type = fast +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm_engineering.inst.cfg new file mode 100644 index 0000000000..b65a22fbdc --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm_engineering.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s3 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_pla +quality_type = normal +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +jerk_print = 30 +speed_infill = =speed_print +speed_print = 30 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm_visual.inst.cfg new file mode 100644 index 0000000000..a90a1b971d --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm_visual.inst.cfg @@ -0,0 +1,17 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_pla +quality_type = normal +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +speed_infill = 50 +top_bottom_thickness = 1.05 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..1cd8170e8f --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s3 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_quick.inst.cfg new file mode 100644 index 0000000000..46fae84147 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_quick.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s3 +name = Quick +version = 4 + +[metadata] +intent_category = quick +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_print = 150 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =2 * line_width + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_visual.inst.cfg new file mode 100644 index 0000000000..5314f1fc02 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm_quick.inst.cfg new file mode 100644 index 0000000000..45eb00c35f --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm_quick.inst.cfg @@ -0,0 +1,30 @@ +[general] +definition = ultimaker_s3 +name = Quick +version = 4 + +[metadata] +intent_category = quick +is_experimental = True +material = ultimaker_pla +quality_type = verydraft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_print = 150 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =2 * line_width + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm_visual.inst.cfg new file mode 100644 index 0000000000..e2997ae696 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm_visual.inst.cfg @@ -0,0 +1,17 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_tough_pla +quality_type = high +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +speed_infill = 50 +top_bottom_thickness = 1.05 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm_engineering.inst.cfg new file mode 100644 index 0000000000..f5f5a33ca7 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s3 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_tough_pla +quality_type = fast +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg new file mode 100644 index 0000000000..2e6749b72a --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_tough_pla +quality_type = fast +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm_engineering.inst.cfg new file mode 100644 index 0000000000..a57cbf0af0 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm_engineering.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s3 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_tough_pla +quality_type = normal +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +jerk_print = 30 +speed_infill = =speed_print +speed_print = 30 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg new file mode 100644 index 0000000000..48ce65c800 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg @@ -0,0 +1,17 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_tough_pla +quality_type = normal +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +speed_infill = 50 +top_bottom_thickness = 1.05 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..2c2efb74ac --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s3 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_tough_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg new file mode 100644 index 0000000000..384754b8c2 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s3 +name = Quick +version = 4 + +[metadata] +intent_category = quick +material = ultimaker_tough_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_print = 150 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =2 * line_width + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg new file mode 100644 index 0000000000..c1daf2b24f --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_tough_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg new file mode 100644 index 0000000000..fc17df4b34 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg @@ -0,0 +1,30 @@ +[general] +definition = ultimaker_s3 +name = Quick +version = 4 + +[metadata] +intent_category = quick +is_experimental = True +material = ultimaker_tough_pla +quality_type = verydraft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_print = 150 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =2 * line_width + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..60413405bb --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s3 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_abs +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_quick.inst.cfg new file mode 100644 index 0000000000..edb9c3f437 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_quick.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s3 +name = Quick +version = 4 + +[metadata] +intent_category = quick +material = ultimaker_abs +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =wall_line_width_0 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_visual.inst.cfg new file mode 100644 index 0000000000..905cba2365 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_abs +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..5db19be11f --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s3 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_petg +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_quick.inst.cfg new file mode 100644 index 0000000000..de7f5a944c --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_quick.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s3 +name = Quick +version = 4 + +[metadata] +intent_category = quick +material = ultimaker_petg +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =wall_line_width_0 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_visual.inst.cfg new file mode 100644 index 0000000000..9fc9683573 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_petg +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..5361dfeb62 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s3 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_quick.inst.cfg new file mode 100644 index 0000000000..01a7dbbde5 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_quick.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s3 +name = Quick +version = 4 + +[metadata] +intent_category = quick +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =wall_line_width_0 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_visual.inst.cfg new file mode 100644 index 0000000000..c0dc288773 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_engineering.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..c4cad5993d --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s3 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_tough_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg new file mode 100644 index 0000000000..1f449035b6 --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s3 +name = Quick +version = 4 + +[metadata] +intent_category = quick +material = ultimaker_tough_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =wall_line_width_0 + diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg new file mode 100644 index 0000000000..84f9fc86ee --- /dev/null +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s3 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_tough_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm_visual.inst.cfg new file mode 100644 index 0000000000..3866a4593a --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm_visual.inst.cfg @@ -0,0 +1,17 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_abs +quality_type = high +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +speed_infill = 50 +top_bottom_thickness = 1.05 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm_engineering.inst.cfg new file mode 100644 index 0000000000..908186790e --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s5 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_abs +quality_type = fast +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm_visual.inst.cfg new file mode 100644 index 0000000000..5354e3b326 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_abs +quality_type = fast +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm_engineering.inst.cfg new file mode 100644 index 0000000000..b5834b5757 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm_engineering.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s5 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_abs +quality_type = normal +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +jerk_print = 30 +speed_infill = =speed_print +speed_print = 30 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm_visual.inst.cfg new file mode 100644 index 0000000000..63b0273ba5 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm_visual.inst.cfg @@ -0,0 +1,17 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_abs +quality_type = normal +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +speed_infill = 50 +top_bottom_thickness = 1.05 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..c8ead2040c --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s5 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_abs +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_quick.inst.cfg new file mode 100644 index 0000000000..cf808f3f39 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_quick.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s5 +name = Quick +version = 4 + +[metadata] +intent_category = quick +material = ultimaker_abs +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_print = 150 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =2 * line_width + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_visual.inst.cfg new file mode 100644 index 0000000000..c369f8f95d --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_abs +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm_engineering.inst.cfg new file mode 100644 index 0000000000..b0057d80ed --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s5 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_petg +quality_type = fast +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm_engineering.inst.cfg new file mode 100644 index 0000000000..00c264aa32 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm_engineering.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s5 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_petg +quality_type = normal +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +jerk_print = 30 +speed_infill = =speed_print +speed_print = 30 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..da575d938f --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s5 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_petg +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_quick.inst.cfg new file mode 100644 index 0000000000..53751b9d9c --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_quick.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s5 +name = Quick +version = 4 + +[metadata] +intent_category = quick +material = ultimaker_petg +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_print = 150 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =2 * line_width + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_visual.inst.cfg new file mode 100644 index 0000000000..6453c0294c --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_petg +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm_visual.inst.cfg new file mode 100644 index 0000000000..0bb1797b46 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm_visual.inst.cfg @@ -0,0 +1,17 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_pla +quality_type = high +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +speed_infill = 50 +top_bottom_thickness = 1.05 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm_engineering.inst.cfg new file mode 100644 index 0000000000..446f68db01 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s5 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_pla +quality_type = fast +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm_visual.inst.cfg new file mode 100644 index 0000000000..8a798c6ee1 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_pla +quality_type = fast +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm_engineering.inst.cfg new file mode 100644 index 0000000000..0ab18817e0 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm_engineering.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s5 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_pla +quality_type = normal +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +jerk_print = 30 +speed_infill = =speed_print +speed_print = 30 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm_visual.inst.cfg new file mode 100644 index 0000000000..f6b7800386 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm_visual.inst.cfg @@ -0,0 +1,17 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_pla +quality_type = normal +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +speed_infill = 50 +top_bottom_thickness = 1.05 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..248fee213c --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s5 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_quick.inst.cfg new file mode 100644 index 0000000000..1deecdd454 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_quick.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s5 +name = Quick +version = 4 + +[metadata] +intent_category = quick +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_print = 150 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =2 * line_width + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_visual.inst.cfg new file mode 100644 index 0000000000..b44282bf95 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm_quick.inst.cfg new file mode 100644 index 0000000000..222eac8a21 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm_quick.inst.cfg @@ -0,0 +1,30 @@ +[general] +definition = ultimaker_s5 +name = Quick +version = 4 + +[metadata] +intent_category = quick +is_experimental = True +material = ultimaker_pla +quality_type = verydraft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_print = 150 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =2 * line_width + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm_visual.inst.cfg new file mode 100644 index 0000000000..b4516e44dd --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm_visual.inst.cfg @@ -0,0 +1,17 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_tough_pla +quality_type = high +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +speed_infill = 50 +top_bottom_thickness = 1.05 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm_engineering.inst.cfg new file mode 100644 index 0000000000..dd54779d5d --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s5 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_tough_pla +quality_type = fast +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg new file mode 100644 index 0000000000..6163d28bd4 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_tough_pla +quality_type = fast +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm_engineering.inst.cfg new file mode 100644 index 0000000000..5c78ea044d --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm_engineering.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s5 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_tough_pla +quality_type = normal +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +jerk_print = 30 +speed_infill = =speed_print +speed_print = 30 +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg new file mode 100644 index 0000000000..5f73432e1c --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm_visual.inst.cfg @@ -0,0 +1,17 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_tough_pla +quality_type = normal +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +speed_infill = 50 +top_bottom_thickness = 1.05 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..aea6b01bff --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s5 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_tough_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg new file mode 100644 index 0000000000..d9c62b931c --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s5 +name = Quick +version = 4 + +[metadata] +intent_category = quick +material = ultimaker_tough_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_print = 150 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =2 * line_width + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg new file mode 100644 index 0000000000..d8337b9de6 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_tough_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg new file mode 100644 index 0000000000..78998242ad --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg @@ -0,0 +1,30 @@ +[general] +definition = ultimaker_s5 +name = Quick +version = 4 + +[metadata] +intent_category = quick +is_experimental = True +material = ultimaker_tough_pla +quality_type = verydraft +setting_version = 22 +type = intent +variant = AA 0.4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_print = 150 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =2 * line_width + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..8281aefcf0 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s5 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_abs +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_quick.inst.cfg new file mode 100644 index 0000000000..5a02c7951c --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_quick.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s5 +name = Quick +version = 4 + +[metadata] +intent_category = quick +material = ultimaker_abs +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =wall_line_width_0 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_visual.inst.cfg new file mode 100644 index 0000000000..92dc5468d0 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_abs +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..ed5a152040 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s5 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_petg +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_quick.inst.cfg new file mode 100644 index 0000000000..6174e1d6e6 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_quick.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s5 +name = Quick +version = 4 + +[metadata] +intent_category = quick +material = ultimaker_petg +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =wall_line_width_0 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_visual.inst.cfg new file mode 100644 index 0000000000..ff4f7d9444 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_petg +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..9e15b423a2 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s5 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_quick.inst.cfg new file mode 100644 index 0000000000..8e9de05ece --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_quick.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s5 +name = Quick +version = 4 + +[metadata] +intent_category = quick +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =wall_line_width_0 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_visual.inst.cfg new file mode 100644 index 0000000000..c3d82189e6 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_engineering.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_engineering.inst.cfg new file mode 100644 index 0000000000..bf180f24e3 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_engineering.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s5 +name = Accurate +version = 4 + +[metadata] +intent_category = engineering +material = ultimaker_tough_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +infill_sparse_density = 20 +jerk_print = 30 +speed_infill = =speed_print +speed_print = 35 +speed_roofing = =speed_topbottom +speed_topbottom = =speed_print +speed_wall = =speed_print +speed_wall_0 = =speed_wall +speed_wall_x = =speed_wall +top_bottom_thickness = =wall_thickness +wall_thickness = =line_width * 3 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg new file mode 100644 index 0000000000..5bef26d0c8 --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg @@ -0,0 +1,28 @@ +[general] +definition = ultimaker_s5 +name = Quick +version = 4 + +[metadata] +intent_category = quick +material = ultimaker_tough_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False +acceleration_print = 4000 +acceleration_wall = 3000 +acceleration_wall_0 = 2000 +gradual_infill_step_height = =4 * layer_height +gradual_infill_steps = 3 +infill_sparse_density = 40 +jerk_print = 30 +jerk_wall_0 = 30 +speed_wall = =speed_print +speed_wall_0 = 40 +top_bottom_thickness = = 4 * layer_height +wall_thickness = =wall_line_width_0 + diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg new file mode 100644 index 0000000000..ea42d4e8fc --- /dev/null +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s5 +name = Visual +version = 4 + +[metadata] +intent_category = visual +material = ultimaker_tough_pla +quality_type = draft +setting_version = 22 +type = intent +variant = AA 0.8 + +[values] +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 1 +acceleration_print = 2500 +acceleration_wall_0 = 1000 +inset_direction = inside_out +jerk_wall_0 = 20 +speed_infill = 50 +speed_roofing = =math.ceil(speed_wall*(35/50)) +speed_wall_0 = =math.ceil(speed_wall*(25/50)) +top_bottom_thickness = =max(1.2 , layer_height * 6) + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg new file mode 100644 index 0000000000..761ee98519 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-abs_0.1mm.inst.cfg @@ -0,0 +1,20 @@ +[general] +definition = ultimaker_s3 +name = Fine +version = 4 + +[metadata] +material = ultimaker_abs +quality_type = normal +setting_version = 22 +type = quality +variant = AA 0.25 +weight = 0 + +[values] +speed_topbottom = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg new file mode 100644 index 0000000000..1a8de2bc0f --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-petg_0.1mm.inst.cfg @@ -0,0 +1,23 @@ +[general] +definition = ultimaker_s3 +name = Fine +version = 4 + +[metadata] +material = ultimaker_petg +quality_type = normal +setting_version = 22 +type = quality +variant = AA 0.25 +weight = 0 + +[values] +material_print_temperature = =default_material_print_temperature - 5 +speed_infill = =math.ceil(speed_print * 40 / 55) +speed_topbottom = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = 0.8 + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-pla_0.1mm.inst.cfg new file mode 100644 index 0000000000..4d8c8c7d60 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-pla_0.1mm.inst.cfg @@ -0,0 +1,32 @@ +[general] +definition = ultimaker_s3 +name = Fine +version = 4 + +[metadata] +material = ultimaker_pla +quality_type = normal +setting_version = 22 +type = quality +variant = AA 0.25 +weight = 0 + +[values] +brim_width = 8 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 1.4 +material_print_temperature = 190 +retraction_hop = 0.2 +speed_print = 30 +speed_wall = =math.ceil(speed_print * 25 / 30) +speed_wall_0 = =math.ceil(speed_print * 20 / 30) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = 0.72 +travel_avoid_distance = 0.4 +wall_0_inset = 0.015 +wall_0_wipe_dist = 0.25 + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.25_um-tough-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-tough-pla_0.1mm.inst.cfg new file mode 100644 index 0000000000..13a5ab0a9c --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.25_um-tough-pla_0.1mm.inst.cfg @@ -0,0 +1,31 @@ +[general] +definition = ultimaker_s3 +name = Fine +version = 4 + +[metadata] +material = ultimaker_tough_pla +quality_type = normal +setting_version = 22 +type = quality +variant = AA 0.25 +weight = 0 + +[values] +brim_width = 8 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 1.4 +material_print_temperature = =default_material_print_temperature - 15 +speed_print = 30 +speed_topbottom = =math.ceil(speed_print * 20 / 30) +speed_wall = =math.ceil(speed_print * 25 / 30) +speed_wall_0 = =math.ceil(speed_print * 20 / 30) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = 0.72 +wall_0_inset = 0.015 +wall_0_wipe_dist = 0.25 + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.3mm.inst.cfg new file mode 100644 index 0000000000..e908d2de88 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_abs_0.3mm.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s3 +name = Extra Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = generic_abs +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -3 + +[values] +machine_nozzle_heat_up_speed = 1.5 +material_final_print_temperature = =material_print_temperature - 20 +prime_tower_enable = False +raft_airgap = 0.15 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.3mm.inst.cfg new file mode 100644 index 0000000000..95aa7481ec --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_petg_0.3mm.inst.cfg @@ -0,0 +1,21 @@ +[general] +definition = ultimaker_s3 +name = Extra Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = generic_petg +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -3 + +[values] +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg new file mode 100644 index 0000000000..19b593834d --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.06mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s3 +name = Extra Fine +version = 4 + +[metadata] +material = ultimaker_abs +quality_type = high +setting_version = 22 +type = quality +variant = AA 0.4 +weight = 1 + +[values] +machine_nozzle_cool_down_speed = 0.8 +machine_nozzle_heat_up_speed = 1.5 +material_final_print_temperature = =material_print_temperature - 20 +material_print_temperature = =default_material_print_temperature + 5 +prime_tower_enable = False +raft_airgap = 0.15 +speed_infill = =math.ceil(speed_print * 40 / 50) +speed_print = 50 +speed_topbottom = =math.ceil(speed_print * 30 / 50) +speed_wall = =math.ceil(speed_print * 30 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg new file mode 100644 index 0000000000..2cf10a09dd --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg @@ -0,0 +1,75 @@ + + + +[general] +definition = ultimaker_s3 +name = Normal +version = 4 + +[metadata] +material = ultimaker_abs +quality_type = fast +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -1 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,8 +material_max_flowrate = 20 +material_print_temperature = =default_material_print_temperature + 15 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.15 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg new file mode 100644 index 0000000000..200524266b --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.1mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s3 +name = Fine +version = 4 + +[metadata] +material = ultimaker_abs +quality_type = normal +setting_version = 22 +type = quality +variant = AA 0.4 +weight = 0 + +[values] +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_final_print_temperature = =material_print_temperature - 20 +material_print_temperature = =default_material_print_temperature + 10 +prime_tower_enable = False +raft_airgap = 0.15 +speed_infill = =math.ceil(speed_print * 40 / 55) +speed_print = 55 +speed_topbottom = =math.ceil(speed_print * 30 / 55) +speed_wall = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg new file mode 100644 index 0000000000..e44ec41bab --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg @@ -0,0 +1,75 @@ + + + +[general] +definition = ultimaker_s3 +name = Fast +version = 4 + +[metadata] +material = ultimaker_abs +quality_type = draft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -2 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,8 +material_max_flowrate = 20 +material_print_temperature = =default_material_print_temperature + 20 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.15 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg new file mode 100644 index 0000000000..a0cbe2536f --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg @@ -0,0 +1,77 @@ + + + +[general] +definition = ultimaker_s3 +name = Extra Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_abs +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -3 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,8 +material_max_flowrate = 20 +material_print_temperature = =default_material_print_temperature + 22 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.15 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg new file mode 100644 index 0000000000..1b7919bd02 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.06mm.inst.cfg @@ -0,0 +1,27 @@ +[general] +definition = ultimaker_s3 +name = Extra Fine +version = 4 + +[metadata] +material = ultimaker_petg +quality_type = high +setting_version = 22 +type = quality +variant = AA 0.4 +weight = 1 + +[values] +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_print_temperature = =default_material_print_temperature - 10 +speed_infill = =math.ceil(speed_print * 40 / 50) +speed_print = 50 +speed_topbottom = =math.ceil(speed_print * 30 / 50) +speed_wall = =math.ceil(speed_print * 30 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg new file mode 100644 index 0000000000..1b08a08ea5 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg @@ -0,0 +1,73 @@ + + + +[general] +definition = ultimaker_s3 +name = Normal +version = 4 + +[metadata] +material = ultimaker_petg +quality_type = fast +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -1 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,4 +machine_nozzle_heat_up_speed = 1,7 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 20 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg new file mode 100644 index 0000000000..afa05aa2cf --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.1mm.inst.cfg @@ -0,0 +1,27 @@ +[general] +definition = ultimaker_s3 +name = Fine +version = 4 + +[metadata] +material = ultimaker_petg +quality_type = normal +setting_version = 22 +type = quality +variant = AA 0.4 +weight = 0 + +[values] +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_print_temperature = =default_material_print_temperature - 5 +speed_infill = =math.ceil(speed_print * 45 / 55) +speed_print = 55 +speed_topbottom = =math.ceil(speed_print * 30 / 55) +speed_wall = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg new file mode 100644 index 0000000000..da2548236c --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s3 +name = Fast +version = 4 + +[metadata] +material = ultimaker_petg +quality_type = draft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -2 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,4 +machine_nozzle_heat_up_speed = 1,7 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 20 +material_print_temperature = =default_material_print_temperature + 5 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg new file mode 100644 index 0000000000..fdd9959f36 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg @@ -0,0 +1,75 @@ + + + +[general] +definition = ultimaker_s3 +name = Extra Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_petg +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -3 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,4 +machine_nozzle_heat_up_speed = 1,7 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 20 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm.inst.cfg new file mode 100644 index 0000000000..2939389a3c --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.06mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s3 +name = Extra Fine +version = 4 + +[metadata] +material = ultimaker_pla +quality_type = high +setting_version = 22 +type = quality +variant = AA 0.4 +weight = 1 + +[values] +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature - 5 +prime_tower_enable = False +raft_airgap = 0.25 +retraction_prime_speed = =retraction_speed +speed_print = 50 +speed_topbottom = =math.ceil(speed_print * 35 / 50) +speed_wall = =math.ceil(speed_print * 35 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = 1 + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg new file mode 100644 index 0000000000..98ea41e2c4 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s3 +name = Normal +version = 4 + +[metadata] +material = ultimaker_pla +quality_type = fast +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -1 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 12 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm.inst.cfg new file mode 100644 index 0000000000..2b430c1afb --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.1mm.inst.cfg @@ -0,0 +1,25 @@ +[general] +definition = ultimaker_s3 +name = Fine +version = 4 + +[metadata] +material = ultimaker_pla +quality_type = normal +setting_version = 22 +type = quality +variant = AA 0.4 +weight = 0 + +[values] +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +prime_tower_enable = False +raft_airgap = 0.25 +retraction_prime_speed = =retraction_speed +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = 1 + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg new file mode 100644 index 0000000000..e8a50ee27e --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg @@ -0,0 +1,75 @@ + + + +[general] +definition = ultimaker_s3 +name = Fast +version = 4 + +[metadata] +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -2 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 12 +material_print_temperature = =default_material_print_temperature + 5 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg new file mode 100644 index 0000000000..c9f511e9af --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg @@ -0,0 +1,77 @@ + + + +[general] +definition = ultimaker_s3 +name = Extra Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_pla +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -3 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 12 +material_print_temperature = =default_material_print_temperature + 10 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm.inst.cfg new file mode 100644 index 0000000000..02a5085655 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.06mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s3 +name = Extra Fine +version = 4 + +[metadata] +material = ultimaker_tough_pla +quality_type = high +setting_version = 22 +type = quality +variant = AA 0.4 +weight = 1 + +[values] +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature - 15 +prime_tower_enable = False +retraction_prime_speed = =retraction_speed +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = 1.2 + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg new file mode 100644 index 0000000000..2a2a91f5cd --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s3 +name = Normal +version = 4 + +[metadata] +material = ultimaker_tough_pla +quality_type = fast +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -1 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 14 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm.inst.cfg new file mode 100644 index 0000000000..11ef55bdaa --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.1mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s3 +name = Fine +version = 4 + +[metadata] +material = ultimaker_tough_pla +quality_type = normal +setting_version = 22 +type = quality +variant = AA 0.4 +weight = 0 + +[values] +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature - 15 +prime_tower_enable = False +retraction_prime_speed = =retraction_speed +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = 1.2 + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg new file mode 100644 index 0000000000..0836d1240e --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg @@ -0,0 +1,75 @@ + + + +[general] +definition = ultimaker_s3 +name = Fast +version = 4 + +[metadata] +material = ultimaker_tough_pla +quality_type = draft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -2 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 14 +material_print_temperature = =default_material_print_temperature + 5 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg new file mode 100644 index 0000000000..e791a87cc7 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg @@ -0,0 +1,77 @@ + + + +[general] +definition = ultimaker_s3 +name = Extra Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_tough_pla +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -3 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 14 +material_print_temperature = =default_material_print_temperature + 10 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg new file mode 100644 index 0000000000..972d384c3b --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s3 +name = Fast +version = 4 + +[metadata] +material = ultimaker_abs +quality_type = draft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -2 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,8 +material_flow = 93 +material_max_flowrate = 22 +material_print_temperature = =default_material_print_temperature + 20 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.15 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg new file mode 100644 index 0000000000..3dd3b012f7 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s3 +name = Extra Fast +version = 4 + +[metadata] +material = ultimaker_abs +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -3 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,8 +material_flow = 93 +material_max_flowrate = 22 +material_print_temperature = =default_material_print_temperature + 22 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.15 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 75 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/75)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg new file mode 100644 index 0000000000..39d28b29cb --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s3 +name = Sprint +version = 4 + +[metadata] +material = ultimaker_abs +quality_type = superdraft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,8 +material_flow = 93 +material_max_flowrate = 22 +material_print_temperature = =default_material_print_temperature + 25 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.15 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 50 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/50)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg new file mode 100644 index 0000000000..1cd23d77a1 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg @@ -0,0 +1,73 @@ + + + +[general] +definition = ultimaker_s3 +name = Fast +version = 4 + +[metadata] +material = ultimaker_petg +quality_type = draft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -2 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,4 +machine_nozzle_heat_up_speed = 1,7 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 23 +material_print_temperature = =default_material_print_temperature - 5 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = True +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg new file mode 100644 index 0000000000..f4eb15bdfb --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg @@ -0,0 +1,73 @@ + + + +[general] +definition = ultimaker_s3 +name = Extra Fast +version = 4 + +[metadata] +material = ultimaker_petg +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -3 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,4 +machine_nozzle_heat_up_speed = 1,7 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 23 +material_print_temperature = =default_material_print_temperature - 5 +optimize_wall_printing_order = False +prime_tower_enable = True +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 75 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/75)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg new file mode 100644 index 0000000000..ed6a9dd3a6 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg @@ -0,0 +1,73 @@ + + + +[general] +definition = ultimaker_s3 +name = Sprint +version = 4 + +[metadata] +material = ultimaker_petg +quality_type = superdraft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,4 +machine_nozzle_heat_up_speed = 1,7 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 23 +material_print_temperature = =default_material_print_temperature - 5 +optimize_wall_printing_order = False +prime_tower_enable = True +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 50 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/50)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg new file mode 100644 index 0000000000..df2e17c1b5 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s3 +name = Fast +version = 4 + +[metadata] +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -2 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 15 +material_print_temperature = =default_material_print_temperature + 10 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg new file mode 100644 index 0000000000..d0cc030bb2 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s3 +name = Extra Fast +version = 4 + +[metadata] +material = ultimaker_pla +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -3 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 15 +material_print_temperature = =default_material_print_temperature + 10 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 65 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/65)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg new file mode 100644 index 0000000000..00c40d800a --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s3 +name = Sprint +version = 4 + +[metadata] +material = ultimaker_pla +quality_type = superdraft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 15 +material_print_temperature = =default_material_print_temperature + 15 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 45 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/45)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg new file mode 100644 index 0000000000..5f041eae79 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s3 +name = Fast +version = 4 + +[metadata] +material = ultimaker_tough_pla +quality_type = draft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -2 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 17 +material_print_temperature = =default_material_print_temperature + 10 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg new file mode 100644 index 0000000000..11f89d3c72 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s3 +name = Extra Fast +version = 4 + +[metadata] +material = ultimaker_tough_pla +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -3 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 17 +material_print_temperature = =default_material_print_temperature + 10 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 65 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/65)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg new file mode 100644 index 0000000000..6e9d2b803e --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s3 +name = Sprint +version = 4 + +[metadata] +material = ultimaker_tough_pla +quality_type = superdraft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 17 +material_print_temperature = =default_material_print_temperature + 15 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 45 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/45)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s3/um_s3_cc0.4_um-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_cc0.4_um-pla_0.15mm.inst.cfg new file mode 100644 index 0000000000..300e2ebaed --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_cc0.4_um-pla_0.15mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s3 +name = Normal - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_pla +quality_type = fast +setting_version = 22 +type = quality +variant = CC 0.4 +weight = -1 + +[values] +gradual_infill_step_height = =3 * layer_height +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature + 10 +prime_tower_enable = True +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +speed_wall_x = =speed_wall +support_angle = 70 +top_bottom_thickness = =layer_height * 4 + diff --git a/resources/quality/ultimaker_s3/um_s3_cc0.4_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_cc0.4_um-pla_0.2mm.inst.cfg new file mode 100644 index 0000000000..84040ede4e --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_cc0.4_um-pla_0.2mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s3 +name = Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = quality +variant = CC 0.4 +weight = -2 + +[values] +gradual_infill_step_height = =3 * layer_height +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature + 10 +prime_tower_enable = True +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +speed_wall_x = =speed_wall +support_angle = 70 +top_bottom_thickness = =layer_height * 4 + diff --git a/resources/quality/ultimaker_s3/um_s3_cc0.6_um-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_cc0.6_um-pla_0.15mm.inst.cfg new file mode 100644 index 0000000000..e7b72d6cd0 --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_cc0.6_um-pla_0.15mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s3 +name = Normal - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_pla +quality_type = fast +setting_version = 22 +type = quality +variant = CC 0.6 +weight = -1 + +[values] +gradual_infill_step_height = =3 * layer_height +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature + 10 +prime_tower_enable = True +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +speed_wall_x = =speed_wall +support_angle = 70 +top_bottom_thickness = =layer_height * 4 + diff --git a/resources/quality/ultimaker_s3/um_s3_cc0.6_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_cc0.6_um-pla_0.2mm.inst.cfg new file mode 100644 index 0000000000..38c857de5e --- /dev/null +++ b/resources/quality/ultimaker_s3/um_s3_cc0.6_um-pla_0.2mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s3 +name = Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = quality +variant = CC 0.6 +weight = -2 + +[values] +gradual_infill_step_height = =3 * layer_height +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature + 10 +prime_tower_enable = True +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +speed_wall_x = =speed_wall +support_angle = 70 +top_bottom_thickness = =layer_height * 4 + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg new file mode 100644 index 0000000000..e4b42e7587 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-abs_0.1mm.inst.cfg @@ -0,0 +1,20 @@ +[general] +definition = ultimaker_s5 +name = Fine +version = 4 + +[metadata] +material = ultimaker_abs +quality_type = normal +setting_version = 22 +type = quality +variant = AA 0.25 +weight = 0 + +[values] +speed_topbottom = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg new file mode 100644 index 0000000000..42f2bf5d16 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-petg_0.1mm.inst.cfg @@ -0,0 +1,23 @@ +[general] +definition = ultimaker_s5 +name = Fine +version = 4 + +[metadata] +material = ultimaker_petg +quality_type = normal +setting_version = 22 +type = quality +variant = AA 0.25 +weight = 0 + +[values] +material_print_temperature = =default_material_print_temperature - 5 +speed_infill = =math.ceil(speed_print * 40 / 55) +speed_topbottom = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = 0.8 + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-pla_0.1mm.inst.cfg new file mode 100644 index 0000000000..e282ec5eab --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-pla_0.1mm.inst.cfg @@ -0,0 +1,32 @@ +[general] +definition = ultimaker_s5 +name = Fine +version = 4 + +[metadata] +material = ultimaker_pla +quality_type = normal +setting_version = 22 +type = quality +variant = AA 0.25 +weight = 0 + +[values] +brim_width = 8 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 1.4 +material_print_temperature = 190 +retraction_hop = 0.2 +speed_print = 30 +speed_wall = =math.ceil(speed_print * 25 / 30) +speed_wall_0 = =math.ceil(speed_print * 20 / 30) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = 0.72 +travel_avoid_distance = 0.4 +wall_0_inset = 0.015 +wall_0_wipe_dist = 0.25 + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.25_um-tough-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-tough-pla_0.1mm.inst.cfg new file mode 100644 index 0000000000..7eb277b007 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.25_um-tough-pla_0.1mm.inst.cfg @@ -0,0 +1,31 @@ +[general] +definition = ultimaker_s5 +name = Fine +version = 4 + +[metadata] +material = ultimaker_tough_pla +quality_type = normal +setting_version = 22 +type = quality +variant = AA 0.25 +weight = 0 + +[values] +brim_width = 8 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +machine_nozzle_cool_down_speed = 0.9 +machine_nozzle_heat_up_speed = 1.4 +material_print_temperature = =default_material_print_temperature - 15 +speed_print = 30 +speed_topbottom = =math.ceil(speed_print * 20 / 30) +speed_wall = =math.ceil(speed_print * 25 / 30) +speed_wall_0 = =math.ceil(speed_print * 20 / 30) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = 0.72 +wall_0_inset = 0.015 +wall_0_wipe_dist = 0.25 + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.3mm.inst.cfg new file mode 100644 index 0000000000..6063b995cd --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_abs_0.3mm.inst.cfg @@ -0,0 +1,24 @@ +[general] +definition = ultimaker_s5 +name = Extra Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = generic_abs +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -3 + +[values] +machine_nozzle_heat_up_speed = 1.5 +material_final_print_temperature = =material_print_temperature - 20 +prime_tower_enable = False +raft_airgap = 0.15 +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.3mm.inst.cfg new file mode 100644 index 0000000000..1b502797ab --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_petg_0.3mm.inst.cfg @@ -0,0 +1,21 @@ +[general] +definition = ultimaker_s5 +name = Extra Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = generic_petg +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -3 + +[values] +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg new file mode 100644 index 0000000000..eeabba9298 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.06mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s5 +name = Extra Fine +version = 4 + +[metadata] +material = ultimaker_abs +quality_type = high +setting_version = 22 +type = quality +variant = AA 0.4 +weight = 1 + +[values] +machine_nozzle_cool_down_speed = 0.8 +machine_nozzle_heat_up_speed = 1.5 +material_final_print_temperature = =material_print_temperature - 20 +material_print_temperature = =default_material_print_temperature + 5 +prime_tower_enable = False +raft_airgap = 0.15 +speed_infill = =math.ceil(speed_print * 40 / 50) +speed_print = 50 +speed_topbottom = =math.ceil(speed_print * 30 / 50) +speed_wall = =math.ceil(speed_print * 30 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg new file mode 100644 index 0000000000..53e5322ce2 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg @@ -0,0 +1,75 @@ + + + +[general] +definition = ultimaker_s5 +name = Normal +version = 4 + +[metadata] +material = ultimaker_abs +quality_type = fast +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -1 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,8 +material_max_flowrate = 20 +material_print_temperature = =default_material_print_temperature + 15 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.15 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg new file mode 100644 index 0000000000..510e761bbe --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.1mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s5 +name = Fine +version = 4 + +[metadata] +material = ultimaker_abs +quality_type = normal +setting_version = 22 +type = quality +variant = AA 0.4 +weight = 0 + +[values] +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_final_print_temperature = =material_print_temperature - 20 +material_print_temperature = =default_material_print_temperature + 10 +prime_tower_enable = False +raft_airgap = 0.15 +speed_infill = =math.ceil(speed_print * 40 / 55) +speed_print = 55 +speed_topbottom = =math.ceil(speed_print * 30 / 55) +speed_wall = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg new file mode 100644 index 0000000000..3fcecaf99c --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg @@ -0,0 +1,75 @@ + + + +[general] +definition = ultimaker_s5 +name = Fast +version = 4 + +[metadata] +material = ultimaker_abs +quality_type = draft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -2 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,8 +material_max_flowrate = 20 +material_print_temperature = =default_material_print_temperature + 20 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.15 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg new file mode 100644 index 0000000000..5561e1cd85 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg @@ -0,0 +1,77 @@ + + + +[general] +definition = ultimaker_s5 +name = Extra Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_abs +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -3 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,8 +material_max_flowrate = 20 +material_print_temperature = =default_material_print_temperature + 22 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.15 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg new file mode 100644 index 0000000000..9545d34977 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.06mm.inst.cfg @@ -0,0 +1,27 @@ +[general] +definition = ultimaker_s5 +name = Extra Fine +version = 4 + +[metadata] +material = ultimaker_petg +quality_type = high +setting_version = 22 +type = quality +variant = AA 0.4 +weight = 1 + +[values] +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_print_temperature = =default_material_print_temperature - 10 +speed_infill = =math.ceil(speed_print * 40 / 50) +speed_print = 50 +speed_topbottom = =math.ceil(speed_print * 30 / 50) +speed_wall = =math.ceil(speed_print * 30 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg new file mode 100644 index 0000000000..4de3a9fa2b --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg @@ -0,0 +1,73 @@ + + + +[general] +definition = ultimaker_s5 +name = Normal +version = 4 + +[metadata] +material = ultimaker_petg +quality_type = fast +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -1 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,4 +machine_nozzle_heat_up_speed = 1,7 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 20 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg new file mode 100644 index 0000000000..4a20bd76b3 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.1mm.inst.cfg @@ -0,0 +1,27 @@ +[general] +definition = ultimaker_s5 +name = Fine +version = 4 + +[metadata] +material = ultimaker_petg +quality_type = normal +setting_version = 22 +type = quality +variant = AA 0.4 +weight = 0 + +[values] +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +machine_nozzle_cool_down_speed = 0.85 +machine_nozzle_heat_up_speed = 1.5 +material_print_temperature = =default_material_print_temperature - 5 +speed_infill = =math.ceil(speed_print * 45 / 55) +speed_print = 55 +speed_topbottom = =math.ceil(speed_print * 30 / 55) +speed_wall = =math.ceil(speed_print * 30 / 55) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg new file mode 100644 index 0000000000..b3d8b6addd --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s5 +name = Fast +version = 4 + +[metadata] +material = ultimaker_petg +quality_type = draft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -2 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,4 +machine_nozzle_heat_up_speed = 1,7 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 20 +material_print_temperature = =default_material_print_temperature + 5 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg new file mode 100644 index 0000000000..6c8575ba16 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg @@ -0,0 +1,75 @@ + + + +[general] +definition = ultimaker_s5 +name = Extra Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_petg +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -3 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,4 +machine_nozzle_heat_up_speed = 1,7 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 20 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm.inst.cfg new file mode 100644 index 0000000000..c2bb123d04 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.06mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s5 +name = Extra Fine +version = 4 + +[metadata] +material = ultimaker_pla +quality_type = high +setting_version = 22 +type = quality +variant = AA 0.4 +weight = 1 + +[values] +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature - 5 +prime_tower_enable = False +raft_airgap = 0.25 +retraction_prime_speed = =retraction_speed +speed_print = 50 +speed_topbottom = =math.ceil(speed_print * 35 / 50) +speed_wall = =math.ceil(speed_print * 35 / 50) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = 1 + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg new file mode 100644 index 0000000000..82098572ed --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s5 +name = Normal +version = 4 + +[metadata] +material = ultimaker_pla +quality_type = fast +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -1 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 12 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm.inst.cfg new file mode 100644 index 0000000000..1e2820f565 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.1mm.inst.cfg @@ -0,0 +1,25 @@ +[general] +definition = ultimaker_s5 +name = Fine +version = 4 + +[metadata] +material = ultimaker_pla +quality_type = normal +setting_version = 22 +type = quality +variant = AA 0.4 +weight = 0 + +[values] +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +prime_tower_enable = False +raft_airgap = 0.25 +retraction_prime_speed = =retraction_speed +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = 1 + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg new file mode 100644 index 0000000000..846237fd3e --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg @@ -0,0 +1,75 @@ + + + +[general] +definition = ultimaker_s5 +name = Fast +version = 4 + +[metadata] +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -2 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 12 +material_print_temperature = =default_material_print_temperature + 5 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg new file mode 100644 index 0000000000..e834419bdc --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg @@ -0,0 +1,77 @@ + + + +[general] +definition = ultimaker_s5 +name = Extra Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_pla +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -3 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 12 +material_print_temperature = =default_material_print_temperature + 10 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm.inst.cfg new file mode 100644 index 0000000000..d195d3c40f --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.06mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s5 +name = Extra Fine +version = 4 + +[metadata] +material = ultimaker_tough_pla +quality_type = high +setting_version = 22 +type = quality +variant = AA 0.4 +weight = 1 + +[values] +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature - 15 +prime_tower_enable = False +retraction_prime_speed = =retraction_speed +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = 1.2 + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg new file mode 100644 index 0000000000..7c18328639 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s5 +name = Normal +version = 4 + +[metadata] +material = ultimaker_tough_pla +quality_type = fast +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -1 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 14 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm.inst.cfg new file mode 100644 index 0000000000..38b2142353 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.1mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s5 +name = Fine +version = 4 + +[metadata] +material = ultimaker_tough_pla +quality_type = normal +setting_version = 22 +type = quality +variant = AA 0.4 +weight = 0 + +[values] +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature - 15 +prime_tower_enable = False +retraction_prime_speed = =retraction_speed +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_0 = =math.ceil(speed_wall * 35 / 45) +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = 1.2 + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg new file mode 100644 index 0000000000..979e13857b --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg @@ -0,0 +1,75 @@ + + + +[general] +definition = ultimaker_s5 +name = Fast +version = 4 + +[metadata] +material = ultimaker_tough_pla +quality_type = draft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -2 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 14 +material_print_temperature = =default_material_print_temperature + 5 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg new file mode 100644 index 0000000000..c6a1b3bcba --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg @@ -0,0 +1,77 @@ + + + +[general] +definition = ultimaker_s5 +name = Extra Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_tough_pla +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.4 +weight = -3 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_max_flowrate = 14 +material_print_temperature = =default_material_print_temperature + 10 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = False +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_bottom_distance = =support_z_distance +support_interface_enable = True +support_structure = tree +support_top_distance = =support_z_distance +support_z_distance = =math.ceil(0.3/layer_height)*layer_height +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg new file mode 100644 index 0000000000..2631bf1d47 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s5 +name = Fast +version = 4 + +[metadata] +material = ultimaker_abs +quality_type = draft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -2 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,8 +material_flow = 93 +material_max_flowrate = 22 +material_print_temperature = =default_material_print_temperature + 20 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.15 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg new file mode 100644 index 0000000000..ffea1020b4 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s5 +name = Extra Fast +version = 4 + +[metadata] +material = ultimaker_abs +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -3 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,8 +material_flow = 93 +material_max_flowrate = 22 +material_print_temperature = =default_material_print_temperature + 22 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.15 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 75 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/75)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg new file mode 100644 index 0000000000..4b367f630b --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s5 +name = Sprint +version = 4 + +[metadata] +material = ultimaker_abs +quality_type = superdraft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,8 +material_flow = 93 +material_max_flowrate = 22 +material_print_temperature = =default_material_print_temperature + 25 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.15 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 50 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/50)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg new file mode 100644 index 0000000000..ab0b75ce52 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg @@ -0,0 +1,73 @@ + + + +[general] +definition = ultimaker_s5 +name = Fast +version = 4 + +[metadata] +material = ultimaker_petg +quality_type = draft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -2 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,4 +machine_nozzle_heat_up_speed = 1,7 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 23 +material_print_temperature = =default_material_print_temperature - 5 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = True +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg new file mode 100644 index 0000000000..715cfa0771 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg @@ -0,0 +1,73 @@ + + + +[general] +definition = ultimaker_s5 +name = Extra Fast +version = 4 + +[metadata] +material = ultimaker_petg +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -3 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,4 +machine_nozzle_heat_up_speed = 1,7 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 23 +material_print_temperature = =default_material_print_temperature - 5 +optimize_wall_printing_order = False +prime_tower_enable = True +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 75 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/75)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg new file mode 100644 index 0000000000..65b2340c76 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg @@ -0,0 +1,73 @@ + + + +[general] +definition = ultimaker_s5 +name = Sprint +version = 4 + +[metadata] +material = ultimaker_petg +quality_type = superdraft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 4 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,4 +machine_nozzle_heat_up_speed = 1,7 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 23 +material_print_temperature = =default_material_print_temperature - 5 +optimize_wall_printing_order = False +prime_tower_enable = True +retraction_amount = 8 +retraction_prime_speed = 15 +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 50 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/50)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1.2 , layer_height * 6) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg new file mode 100644 index 0000000000..33adecd9b7 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s5 +name = Fast +version = 4 + +[metadata] +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -2 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 15 +material_print_temperature = =default_material_print_temperature + 10 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg new file mode 100644 index 0000000000..0a8b196a65 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s5 +name = Extra Fast +version = 4 + +[metadata] +material = ultimaker_pla +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -3 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 15 +material_print_temperature = =default_material_print_temperature + 10 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 65 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/65)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg new file mode 100644 index 0000000000..e7734de988 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s5 +name = Sprint +version = 4 + +[metadata] +material = ultimaker_pla +quality_type = superdraft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 15 +material_print_temperature = =default_material_print_temperature + 15 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 45 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/45)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg new file mode 100644 index 0000000000..20e775abdc --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s5 +name = Fast +version = 4 + +[metadata] +material = ultimaker_tough_pla +quality_type = draft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -2 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 17 +material_print_temperature = =default_material_print_temperature + 10 +meshfix_maximum_resolution = 0.7 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 100 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/100)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg new file mode 100644 index 0000000000..f08f5c4fdb --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s5 +name = Extra Fast +version = 4 + +[metadata] +material = ultimaker_tough_pla +quality_type = verydraft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -3 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 17 +material_print_temperature = =default_material_print_temperature + 10 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 65 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/65)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg new file mode 100644 index 0000000000..524f9d2a44 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg @@ -0,0 +1,74 @@ + + + +[general] +definition = ultimaker_s5 +name = Sprint +version = 4 + +[metadata] +material = ultimaker_tough_pla +quality_type = superdraft +setting_version = 22 +type = quality +variant = AA 0.8 +weight = -4 + +[values] +_plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0.2 +_plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True +_plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 +acceleration_infill = =acceleration_print +acceleration_layer_0 = =acceleration_wall_0 +acceleration_print = 3500 +acceleration_roofing = =acceleration_wall_0 +acceleration_topbottom = =acceleration_wall +acceleration_wall = =acceleration_infill +acceleration_wall_0 = 1500 +acceleration_wall_x = =acceleration_wall +bridge_skin_speed = =bridge_wall_speed +bridge_sparse_infill_max_density = 50 +bridge_wall_speed = 30 +cool_min_layer_time = 6 +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'grid' +infill_sparse_density = 15 +jerk_infill = =jerk_print +jerk_layer_0 = =jerk_wall_0 +jerk_print = =max(30, speed_print/2) +jerk_roofing = =jerk_wall_0 +jerk_topbottom = =jerk_wall +jerk_wall = =jerk_infill +jerk_wall_0 = =max(30, speed_print/2) +machine_nozzle_cool_down_speed = 1,3 +machine_nozzle_heat_up_speed = 1,9 +material_extrusion_cool_down_speed = 0,7 +material_flow = 93 +material_max_flowrate = 17 +material_print_temperature = =default_material_print_temperature + 15 +optimize_wall_printing_order = False +prime_tower_enable = True +raft_airgap = 0.25 +retraction_amount = 4 +retraction_prime_speed = =retraction_speed +retraction_speed = 45 +skin_no_small_gaps_heuristic = True +small_skin_on_surface = False +small_skin_width = 4 +speed_infill = =speed_print +speed_layer_0 = =speed_roofing +speed_print = 45 +speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_topbottom = =speed_print +speed_wall = =speed_infill +speed_wall_0 = =math.ceil(speed_wall*(35/45)) +speed_wall_x = =speed_wall +support_angle = 70 +support_interface_enable = False +support_structure = tree +top_bottom_thickness = =max(1 , layer_height * 5) +wall_0_wipe_dist = 0.8 +wall_line_width_0 = =line_width * (1 + magic_spiralize * 0.25) +z_seam_relative = True +z_seam_type = back +zig_zaggify_infill = True + diff --git a/resources/quality/ultimaker_s5/um_s5_cc0.4_um-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_cc0.4_um-pla_0.15mm.inst.cfg new file mode 100644 index 0000000000..1204be4c15 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_cc0.4_um-pla_0.15mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s5 +name = Normal - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_pla +quality_type = fast +setting_version = 22 +type = quality +variant = CC 0.4 +weight = -1 + +[values] +gradual_infill_step_height = =3 * layer_height +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature + 10 +prime_tower_enable = True +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +speed_wall_x = =speed_wall +support_angle = 70 +top_bottom_thickness = =layer_height * 4 + diff --git a/resources/quality/ultimaker_s5/um_s5_cc0.4_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_cc0.4_um-pla_0.2mm.inst.cfg new file mode 100644 index 0000000000..6a7d52af4b --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_cc0.4_um-pla_0.2mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s5 +name = Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = quality +variant = CC 0.4 +weight = -2 + +[values] +gradual_infill_step_height = =3 * layer_height +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature + 10 +prime_tower_enable = True +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +speed_wall_x = =speed_wall +support_angle = 70 +top_bottom_thickness = =layer_height * 4 + diff --git a/resources/quality/ultimaker_s5/um_s5_cc0.6_um-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_cc0.6_um-pla_0.15mm.inst.cfg new file mode 100644 index 0000000000..5bf5d910e8 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_cc0.6_um-pla_0.15mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s5 +name = Normal - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_pla +quality_type = fast +setting_version = 22 +type = quality +variant = CC 0.6 +weight = -1 + +[values] +gradual_infill_step_height = =3 * layer_height +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature + 10 +prime_tower_enable = True +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +speed_wall_x = =speed_wall +support_angle = 70 +top_bottom_thickness = =layer_height * 4 + diff --git a/resources/quality/ultimaker_s5/um_s5_cc0.6_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_cc0.6_um-pla_0.2mm.inst.cfg new file mode 100644 index 0000000000..21407b6e66 --- /dev/null +++ b/resources/quality/ultimaker_s5/um_s5_cc0.6_um-pla_0.2mm.inst.cfg @@ -0,0 +1,29 @@ +[general] +definition = ultimaker_s5 +name = Fast - Experimental +version = 4 + +[metadata] +is_experimental = True +material = ultimaker_pla +quality_type = draft +setting_version = 22 +type = quality +variant = CC 0.6 +weight = -2 + +[values] +gradual_infill_step_height = =3 * layer_height +infill_pattern = ='zigzag' if infill_sparse_density > 80 else 'triangles' +machine_nozzle_cool_down_speed = 0.75 +machine_nozzle_heat_up_speed = 1.6 +material_print_temperature = =default_material_print_temperature + 10 +prime_tower_enable = True +speed_print = 45 +speed_topbottom = =math.ceil(speed_print * 35 / 45) +speed_wall = =math.ceil(speed_print * 40 / 45) +speed_wall_0 = =math.ceil(speed_wall * 35 / 40) +speed_wall_x = =speed_wall +support_angle = 70 +top_bottom_thickness = =layer_height * 4 + From a2e6db45f39c4c81076bda4d1533c5cda43340ec Mon Sep 17 00:00:00 2001 From: pkuiper-ultimaker Date: Fri, 1 Sep 2023 14:05:02 +0000 Subject: [PATCH 125/126] Applied printer-linter format --- .../quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg | 3 --- .../ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg | 3 --- .../ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg | 3 --- .../ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg | 3 --- .../quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg | 3 --- .../ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg | 3 --- .../ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg | 3 --- .../ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg | 3 --- .../ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg | 3 --- .../ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg | 3 --- .../ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg | 3 --- .../quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg | 3 --- .../ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg | 3 --- .../ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg | 3 --- .../ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg | 3 --- 48 files changed, 144 deletions(-) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg index 2cf10a09dd..4fee2972e7 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Normal diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg index e44ec41bab..a4cf63b222 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Fast diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg index a0cbe2536f..914204c84d 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Extra Fast - Experimental diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg index 1b08a08ea5..d888451241 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Normal diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg index da2548236c..67ffade648 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Fast diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg index fdd9959f36..6bd21694df 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Extra Fast - Experimental diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg index 98ea41e2c4..3f62c32adc 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Normal diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg index e8a50ee27e..05b598dc73 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Fast diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg index c9f511e9af..2f0a4b37c8 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Extra Fast - Experimental diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg index 2a2a91f5cd..c1b719b7b4 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Normal diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg index 0836d1240e..29a84c7b0a 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Fast diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg index e791a87cc7..fd90e0dac9 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Extra Fast - Experimental diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg index 972d384c3b..4c4c9fd891 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Fast diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg index 3dd3b012f7..10dcb312bb 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Extra Fast diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg index 39d28b29cb..6717db5cc6 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Sprint diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg index 1cd23d77a1..e8fc3464a2 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Fast diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg index f4eb15bdfb..925d302171 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Extra Fast diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg index ed6a9dd3a6..b0ac3869c0 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Sprint diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg index df2e17c1b5..c17ed9289d 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Fast diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg index d0cc030bb2..4c8b653e62 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Extra Fast diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg index 00c40d800a..78ec958f1c 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Sprint diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg index 5f041eae79..3a6f928adf 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Fast diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg index 11f89d3c72..04d234ff65 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Extra Fast diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg index 6e9d2b803e..eeecf0c573 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s3 name = Sprint diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg index 53e5322ce2..19a6b7863a 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Normal diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg index 3fcecaf99c..d0f1130f11 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Fast diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg index 5561e1cd85..dd934c4790 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Extra Fast - Experimental diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg index 4de3a9fa2b..d34a57f342 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Normal diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg index b3d8b6addd..6a70ab73f0 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Fast diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg index 6c8575ba16..a352134f22 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Extra Fast - Experimental diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg index 82098572ed..140e3c3186 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Normal diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg index 846237fd3e..70497f6495 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Fast diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg index e834419bdc..9b4e8e4ddf 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Extra Fast - Experimental diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg index 7c18328639..bec0f162a3 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Normal diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg index 979e13857b..574774e316 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Fast diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg index c6a1b3bcba..7f07e346b6 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Extra Fast - Experimental diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg index 2631bf1d47..0a4b9ee921 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Fast diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg index ffea1020b4..ad3923682e 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Extra Fast diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg index 4b367f630b..1f2c7f62e3 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Sprint diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg index ab0b75ce52..432b6b500b 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Fast diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg index 715cfa0771..8569daefea 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Extra Fast diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg index 65b2340c76..c40271620a 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Sprint diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg index 33adecd9b7..88207f546c 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Fast diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg index 0a8b196a65..27572f5756 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Extra Fast diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg index e7734de988..670e72730e 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Sprint diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg index 20e775abdc..f03f56c356 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Fast diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg index f08f5c4fdb..eb5bb4af0f 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Extra Fast diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg index 524f9d2a44..9a29ee6de3 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg @@ -1,6 +1,3 @@ - - - [general] definition = ultimaker_s5 name = Sprint From f174df9b9ea5ff0d273983ea5aed43fea8186ae0 Mon Sep 17 00:00:00 2001 From: Paul Kuiper <46715907+pkuiper-ultimaker@users.noreply.github.com> Date: Fri, 1 Sep 2023 20:32:43 +0200 Subject: [PATCH 126/126] Added extra speeds and accelerations for prime towers, irioning and self support interface layer. PP-245 --- .../ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm_visual.inst.cfg | 2 +- .../ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_quick.inst.cfg | 2 -- .../ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_visual.inst.cfg | 2 +- .../ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_quick.inst.cfg | 2 -- .../ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_visual.inst.cfg | 2 +- .../ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm_visual.inst.cfg | 2 +- .../ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_quick.inst.cfg | 2 -- .../ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_visual.inst.cfg | 2 +- .../ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm_quick.inst.cfg | 2 -- .../um_s3_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg | 2 +- .../um_s3_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg | 2 -- .../um_s3_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg | 2 +- .../um_s3_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg | 2 -- .../ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_quick.inst.cfg | 2 -- .../ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_visual.inst.cfg | 2 +- .../ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_quick.inst.cfg | 2 -- .../ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_visual.inst.cfg | 2 +- .../ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_quick.inst.cfg | 2 -- .../ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_visual.inst.cfg | 2 +- .../um_s3_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg | 2 -- .../um_s3_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg | 2 +- .../ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm_visual.inst.cfg | 2 +- .../ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_quick.inst.cfg | 2 -- .../ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_visual.inst.cfg | 2 +- .../ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_quick.inst.cfg | 2 -- .../ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_visual.inst.cfg | 2 +- .../ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm_visual.inst.cfg | 2 +- .../ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_quick.inst.cfg | 2 -- .../ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_visual.inst.cfg | 2 +- .../ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm_quick.inst.cfg | 2 -- .../um_s5_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg | 2 +- .../um_s5_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg | 2 -- .../um_s5_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg | 2 +- .../um_s5_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg | 2 -- .../ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_quick.inst.cfg | 2 -- .../ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_visual.inst.cfg | 2 +- .../ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_quick.inst.cfg | 2 -- .../ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_visual.inst.cfg | 2 +- .../ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_quick.inst.cfg | 2 -- .../ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_visual.inst.cfg | 2 +- .../um_s5_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg | 2 -- .../um_s5_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg | 2 +- .../quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg | 6 +++++- .../quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg | 6 +++++- .../quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg | 6 +++++- .../ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg | 6 +++++- .../quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg | 6 +++++- .../quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg | 6 +++++- .../quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg | 6 +++++- .../quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg | 6 +++++- .../quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg | 6 +++++- .../ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg | 6 +++++- .../ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg | 6 +++++- .../ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg | 6 +++++- .../quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg | 6 +++++- .../quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg | 6 +++++- .../quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg | 6 +++++- .../quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg | 6 +++++- .../quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg | 6 +++++- .../quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg | 6 +++++- .../quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg | 6 +++++- .../quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg | 6 +++++- .../quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg | 6 +++++- .../ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg | 6 +++++- .../ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg | 6 +++++- .../ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg | 6 +++++- .../ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg | 6 +++++- .../ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg | 6 +++++- .../ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg | 6 +++++- .../ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg | 6 +++++- .../quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg | 6 +++++- .../ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg | 6 +++++- .../ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg | 6 +++++- .../ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg | 6 +++++- 90 files changed, 262 insertions(+), 110 deletions(-) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm_visual.inst.cfg index b35aba42ee..9d2ad2a8ca 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_quick.inst.cfg index 462f061fb8..259e0ef8cb 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_quick.inst.cfg @@ -13,8 +13,6 @@ variant = AA 0.4 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_visual.inst.cfg index a2387b9907..8cb3b60f94 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_quick.inst.cfg index 8a1e6beac0..d8a435819c 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_quick.inst.cfg @@ -13,8 +13,6 @@ variant = AA 0.4 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_visual.inst.cfg index 7d6dcb30bf..e0df1f7d0f 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm_visual.inst.cfg index 875b369cae..50545d4be9 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_quick.inst.cfg index 46fae84147..ecf32d17b8 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_quick.inst.cfg @@ -13,8 +13,6 @@ variant = AA 0.4 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_visual.inst.cfg index 5314f1fc02..47652f89e9 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm_quick.inst.cfg index 45eb00c35f..acbb98ad5e 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm_quick.inst.cfg @@ -14,8 +14,6 @@ variant = AA 0.4 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg index 2e6749b72a..9ca6216a54 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg index 384754b8c2..ee1030ccbc 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg @@ -13,8 +13,6 @@ variant = AA 0.4 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg index c1daf2b24f..c0a6172ac3 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg index fc17df4b34..a38c9d2e99 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg @@ -14,8 +14,6 @@ variant = AA 0.4 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_quick.inst.cfg index edb9c3f437..d2c679ba21 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_quick.inst.cfg @@ -13,8 +13,6 @@ variant = AA 0.8 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_visual.inst.cfg index 905cba2365..5ca0c38d68 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_quick.inst.cfg index de7f5a944c..ae60552513 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_quick.inst.cfg @@ -13,8 +13,6 @@ variant = AA 0.8 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_visual.inst.cfg index 9fc9683573..60da5eb917 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_quick.inst.cfg index 01a7dbbde5..03a875cef5 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_quick.inst.cfg @@ -13,8 +13,6 @@ variant = AA 0.8 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_visual.inst.cfg index c0dc288773..2e9f8bd87b 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg index 1f449035b6..b6b75a5995 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg @@ -13,8 +13,6 @@ variant = AA 0.8 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg index 84f9fc86ee..f406be1958 100644 --- a/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm_visual.inst.cfg index 5354e3b326..e5eac8992c 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_quick.inst.cfg index cf808f3f39..ec0a92efe7 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_quick.inst.cfg @@ -13,8 +13,6 @@ variant = AA 0.4 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_visual.inst.cfg index c369f8f95d..63b4386e2f 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_quick.inst.cfg index 53751b9d9c..bd9326793d 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_quick.inst.cfg @@ -13,8 +13,6 @@ variant = AA 0.4 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_visual.inst.cfg index 6453c0294c..ea10424026 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm_visual.inst.cfg index 8a798c6ee1..88add2c54c 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_quick.inst.cfg index 1deecdd454..8de69e1dc3 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_quick.inst.cfg @@ -13,8 +13,6 @@ variant = AA 0.4 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_visual.inst.cfg index b44282bf95..7ad908b8a9 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm_quick.inst.cfg index 222eac8a21..e578761b73 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm_quick.inst.cfg @@ -14,8 +14,6 @@ variant = AA 0.4 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg index 6163d28bd4..df0a96e81c 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg index d9c62b931c..75d0bf412a 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_quick.inst.cfg @@ -13,8 +13,6 @@ variant = AA 0.4 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg index d8337b9de6..d5acb79777 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg index 78998242ad..f6506f04d9 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm_quick.inst.cfg @@ -14,8 +14,6 @@ variant = AA 0.4 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_quick.inst.cfg index 5a02c7951c..3e1c36a10e 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_quick.inst.cfg @@ -13,8 +13,6 @@ variant = AA 0.8 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_visual.inst.cfg index 92dc5468d0..e454a17773 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_quick.inst.cfg index 6174e1d6e6..57617613a1 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_quick.inst.cfg @@ -13,8 +13,6 @@ variant = AA 0.8 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_visual.inst.cfg index ff4f7d9444..dac4c2b723 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_quick.inst.cfg index 8e9de05ece..c51d0badf1 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_quick.inst.cfg @@ -13,8 +13,6 @@ variant = AA 0.8 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_visual.inst.cfg index c3d82189e6..79e0432210 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg index 5bef26d0c8..339fcdabdf 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_quick.inst.cfg @@ -13,8 +13,6 @@ variant = AA 0.8 [values] _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = False -acceleration_print = 4000 -acceleration_wall = 3000 acceleration_wall_0 = 2000 gradual_infill_step_height = =4 * layer_height gradual_infill_steps = 3 diff --git a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg index ea42d4e8fc..c448ea51b4 100644 --- a/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg +++ b/resources/intent/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm_visual.inst.cfg @@ -17,7 +17,7 @@ acceleration_print = 2500 acceleration_wall_0 = 1000 inset_direction = inside_out jerk_wall_0 = 20 -speed_infill = 50 +speed_print = 50 speed_roofing = =math.ceil(speed_wall*(35/50)) speed_wall_0 = =math.ceil(speed_wall*(25/50)) top_bottom_thickness = =max(1.2 , layer_height * 6) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg index 4fee2972e7..c973d197c7 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.15mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,8 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg index a4cf63b222..e43c821b68 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.2mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,8 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg index 914204c84d..2e6a43fa19 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-abs_0.3mm.inst.cfg @@ -17,6 +17,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -36,7 +37,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,8 @@ -53,9 +54,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg index d888451241..fba7878625 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.15mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,4 machine_nozzle_heat_up_speed = 1,7 material_extrusion_cool_down_speed = 0,7 @@ -50,9 +51,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg index 67ffade648..9f31fe8ca9 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.2mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,4 machine_nozzle_heat_up_speed = 1,7 material_extrusion_cool_down_speed = 0,7 @@ -51,9 +52,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg index 6bd21694df..aff44b0ffd 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-petg_0.3mm.inst.cfg @@ -17,6 +17,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -36,7 +37,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,4 machine_nozzle_heat_up_speed = 1,7 material_extrusion_cool_down_speed = 0,7 @@ -51,9 +52,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg index 3f62c32adc..9edcd27ee9 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.15mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -51,9 +52,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg index 05b598dc73..e24a076814 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.2mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg index 2f0a4b37c8..3bbc619504 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-pla_0.3mm.inst.cfg @@ -17,6 +17,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -36,7 +37,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -53,9 +54,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg index c1b719b7b4..5686689704 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.15mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -51,9 +52,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg index 29a84c7b0a..1a7577b4cc 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.2mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg index fd90e0dac9..23db0d8882 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.4_um-tough-pla_0.3mm.inst.cfg @@ -17,6 +17,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -36,7 +37,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -53,9 +54,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg index 4c4c9fd891..58ad241ba6 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.2mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,8 @@ -53,9 +54,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg index 10dcb312bb..02b6fa9e85 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.3mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,8 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 75 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/75)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg index 6717db5cc6..18bff1a39a 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-abs_0.4mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,8 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 50 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/50)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg index e8fc3464a2..c29079c72d 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.2mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,4 machine_nozzle_heat_up_speed = 1,7 material_extrusion_cool_down_speed = 0,7 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg index 925d302171..6c631dc44e 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.3mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,4 machine_nozzle_heat_up_speed = 1,7 material_extrusion_cool_down_speed = 0,7 @@ -51,9 +52,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 75 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/75)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg index b0ac3869c0..d7487d9f2b 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-petg_0.4mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,4 machine_nozzle_heat_up_speed = 1,7 material_extrusion_cool_down_speed = 0,7 @@ -51,9 +52,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 50 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/50)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg index c17ed9289d..5ad8dddc00 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.2mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -53,9 +54,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg index 4c8b653e62..274ed54554 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.3mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 65 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/65)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg index 78ec958f1c..492cf7580b 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-pla_0.4mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 45 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/45)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg index 3a6f928adf..89165618b0 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.2mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -53,9 +54,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg index 04d234ff65..7483c994b5 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.3mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 65 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/65)) diff --git a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg index eeecf0c573..99695ec519 100644 --- a/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s3/um_s3_aa0.8_um-tough-pla_0.4mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 45 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/45)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg index 19a6b7863a..016273511a 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.15mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,8 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg index d0f1130f11..ce83812064 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.2mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,8 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg index dd934c4790..6a62cff48e 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-abs_0.3mm.inst.cfg @@ -17,6 +17,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -36,7 +37,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,8 @@ -53,9 +54,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg index d34a57f342..ad8de06a25 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.15mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,4 machine_nozzle_heat_up_speed = 1,7 material_extrusion_cool_down_speed = 0,7 @@ -50,9 +51,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg index 6a70ab73f0..712b01db7c 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.2mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,4 machine_nozzle_heat_up_speed = 1,7 material_extrusion_cool_down_speed = 0,7 @@ -51,9 +52,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg index a352134f22..d6da9b758f 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-petg_0.3mm.inst.cfg @@ -17,6 +17,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -36,7 +37,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,4 machine_nozzle_heat_up_speed = 1,7 material_extrusion_cool_down_speed = 0,7 @@ -51,9 +52,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg index 140e3c3186..97bbfc43f7 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.15mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -51,9 +52,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg index 70497f6495..123ec0c576 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.2mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg index 9b4e8e4ddf..c72c3ad17e 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-pla_0.3mm.inst.cfg @@ -17,6 +17,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -36,7 +37,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -53,9 +54,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg index bec0f162a3..c284eb48e9 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.15mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -51,9 +52,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg index 574774e316..b54ca471b0 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.2mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg index 7f07e346b6..25f0a22fbe 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.4_um-tough-pla_0.3mm.inst.cfg @@ -17,6 +17,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -36,7 +37,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -53,9 +54,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg index 0a4b9ee921..6df6b8c747 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.2mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,8 @@ -53,9 +54,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg index ad3923682e..c0f7c1d90e 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.3mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,8 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 75 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/75)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg index 1f2c7f62e3..a82db91177 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-abs_0.4mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,8 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 50 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/50)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg index 432b6b500b..78584e7c44 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.2mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,4 machine_nozzle_heat_up_speed = 1,7 material_extrusion_cool_down_speed = 0,7 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg index 8569daefea..d6c503a8a7 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.3mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,4 machine_nozzle_heat_up_speed = 1,7 material_extrusion_cool_down_speed = 0,7 @@ -51,9 +52,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 75 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/75)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg index c40271620a..6f1c83fe74 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-petg_0.4mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,4 machine_nozzle_heat_up_speed = 1,7 material_extrusion_cool_down_speed = 0,7 @@ -51,9 +52,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 50 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/50)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg index 88207f546c..9bb022693c 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.2mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -53,9 +54,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg index 27572f5756..46ebe6c961 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.3mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 65 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/65)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg index 670e72730e..32d74d9418 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-pla_0.4mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 45 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/45)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg index f03f56c356..b87fa10da1 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.2mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -53,9 +54,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 100 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/100)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg index eb5bb4af0f..12e49dc993 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.3mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 65 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/65)) diff --git a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg index 9a29ee6de3..0e041dfe8d 100644 --- a/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg +++ b/resources/quality/ultimaker_s5/um_s5_aa0.8_um-tough-pla_0.4mm.inst.cfg @@ -16,6 +16,7 @@ _plugin__curaenginegradualflow__0_1_0__gradual_flow_discretisation_step_size = 0 _plugin__curaenginegradualflow__0_1_0__gradual_flow_enabled = True _plugin__curaenginegradualflow__0_1_0__max_flow_acceleration = 2 acceleration_infill = =acceleration_print +acceleration_ironing = 1000 acceleration_layer_0 = =acceleration_wall_0 acceleration_print = 3500 acceleration_roofing = =acceleration_wall_0 @@ -35,7 +36,7 @@ jerk_print = =max(30, speed_print/2) jerk_roofing = =jerk_wall_0 jerk_topbottom = =jerk_wall jerk_wall = =jerk_infill -jerk_wall_0 = =max(30, speed_print/2) +jerk_wall_0 = =max(30, speed_wall_0/2) machine_nozzle_cool_down_speed = 1,3 machine_nozzle_heat_up_speed = 1,9 material_extrusion_cool_down_speed = 0,7 @@ -52,9 +53,12 @@ skin_no_small_gaps_heuristic = True small_skin_on_surface = False small_skin_width = 4 speed_infill = =speed_print +speed_ironing = 20 speed_layer_0 = =speed_roofing +speed_prime_tower = =speed_wall_0 speed_print = 45 speed_roofing = =math.ceil(speed_wall*(45/100)) +speed_support_interface = =speed_wall_0 speed_topbottom = =speed_print speed_wall = =speed_infill speed_wall_0 = =math.ceil(speed_wall*(35/45))