From 88c2e37ce45f97402372762296b3582cbcd1807e Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Mon, 12 Mar 2018 10:25:39 +0000 Subject: [PATCH 01/39] Added wall_min_flow and wall_min_flow_retract settings. Wall lines whose flow is < wall_min_flow are converted into travel moves. --- resources/definitions/fdmprinter.def.json | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index aef5533ead..d350024d17 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1181,6 +1181,28 @@ "value": "travel_compensate_overlapping_walls_enabled", "limit_to_extruder": "wall_x_extruder_nr", "settable_per_mesh": true + }, + "wall_min_flow": + { + "label": "Minimum Wall Flow", + "description": "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting you must have the wall overlap compensation enabled and also print the outer before inner walls.", + "unit": "%", + "minimum_value": "0", + "maximum_value": "100", + "default_value": 0, + "type": "float", + "settable_per_mesh": false, + "settable_per_extruder": true + }, + "wall_min_flow_retract": + { + "label": "Prefer Retract", + "description": "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold.", + "type": "bool", + "default_value": false, + "enabled": "wall_min_flow > 0", + "settable_per_mesh": false, + "settable_per_extruder": true } } }, From 4aa89068d71933b6082197adb03025cef4b64185 Mon Sep 17 00:00:00 2001 From: Mark Burton Date: Tue, 13 Mar 2018 19:00:27 +0000 Subject: [PATCH 02/39] Now, wall_min_flow and wall_min_flow_retract are hidden if overlap compensation is disabled. --- resources/definitions/fdmprinter.def.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index d350024d17..9ed52c81b5 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1185,12 +1185,13 @@ "wall_min_flow": { "label": "Minimum Wall Flow", - "description": "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting you must have the wall overlap compensation enabled and also print the outer before inner walls.", + "description": "Minimum allowed percentage flow for a wall line. The wall overlap compensation reduces a wall's flow when it lies close to an existing wall. Walls whose flow is less than this value will be replaced with a travel move. When using this setting, you must enable the wall overlap compensation and print the outer wall before inner walls.", "unit": "%", "minimum_value": "0", "maximum_value": "100", "default_value": 0, "type": "float", + "enabled": "travel_compensate_overlapping_walls_0_enabled or travel_compensate_overlapping_walls_x_enabled", "settable_per_mesh": false, "settable_per_extruder": true }, @@ -1200,7 +1201,7 @@ "description": "If enabled, retraction is used rather than combing for travel moves that replace walls whose flow is below the minimum flow threshold.", "type": "bool", "default_value": false, - "enabled": "wall_min_flow > 0", + "enabled": "(travel_compensate_overlapping_walls_0_enabled or travel_compensate_overlapping_walls_x_enabled) and wall_min_flow > 0", "settable_per_mesh": false, "settable_per_extruder": true } From 87555a38c42ca343afccf8c09ff06cd1407ddb54 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 25 May 2018 21:40:30 +0200 Subject: [PATCH 03/39] Fix text rendering in the ConfigurationMenu --- resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml | 1 + .../qml/Menus/ConfigurationMenu/PrintCoreConfiguration.qml | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml b/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml index be8c8bcb45..6f0130d5ca 100644 --- a/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml +++ b/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml @@ -92,6 +92,7 @@ Rectangle anchors.verticalCenter: buildplateIcon.verticalCenter anchors.leftMargin: Math.round(UM.Theme.getSize("default_margin").height / 2) text: configuration.buildplateConfiguration + renderType: Text.NativeRendering color: textColor } } diff --git a/resources/qml/Menus/ConfigurationMenu/PrintCoreConfiguration.qml b/resources/qml/Menus/ConfigurationMenu/PrintCoreConfiguration.qml index ca1b666e69..97b5bee745 100644 --- a/resources/qml/Menus/ConfigurationMenu/PrintCoreConfiguration.qml +++ b/resources/qml/Menus/ConfigurationMenu/PrintCoreConfiguration.qml @@ -26,6 +26,7 @@ Column { id: extruderLabel text: catalog.i18nc("@label:extruder label", "Extruder") + renderType: Text.NativeRendering elide: Text.ElideRight anchors.left: parent.left font: UM.Theme.getFont("default") @@ -59,6 +60,7 @@ Column id: extruderNumberText anchors.centerIn: parent text: printCoreConfiguration.position + 1 + renderType: Text.NativeRendering font: UM.Theme.getFont("default") color: mainColor } @@ -69,6 +71,7 @@ Column { id: materialLabel text: printCoreConfiguration.material.name + renderType: Text.NativeRendering elide: Text.ElideRight width: parent.width font: UM.Theme.getFont("default_bold") @@ -79,6 +82,7 @@ Column { id: printCoreTypeLabel text: printCoreConfiguration.hotendID + renderType: Text.NativeRendering elide: Text.ElideRight width: parent.width font: UM.Theme.getFont("default") From 94813d9e0d10076f6b13a779cb48e1e570670ebb Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 25 May 2018 21:40:57 +0200 Subject: [PATCH 04/39] Fix untranslatable text --- resources/qml/Menus/ConfigurationMenu/SyncButton.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Menus/ConfigurationMenu/SyncButton.qml b/resources/qml/Menus/ConfigurationMenu/SyncButton.qml index 078acb65b2..3099d684c1 100644 --- a/resources/qml/Menus/ConfigurationMenu/SyncButton.qml +++ b/resources/qml/Menus/ConfigurationMenu/SyncButton.qml @@ -13,7 +13,7 @@ Button id: base property var outputDevice: null property var matched: updateOnSync() - text: matched == true ? "Yes" : "No" + text: matched == true ? catalog.i18nc("@label:extruder label", "Yes") : catalog.i18nc("@label:extruder label", "No") width: parent.width height: parent.height From 6a7812a18f2533f152e4effcaa291a33bd5b18f4 Mon Sep 17 00:00:00 2001 From: Mark Date: Mon, 28 May 2018 15:27:22 +0200 Subject: [PATCH 05/39] Textual fix for Marketing --- plugins/ModelChecker/ModelChecker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/ModelChecker/ModelChecker.py b/plugins/ModelChecker/ModelChecker.py index 297844a0a3..d2c2eefac2 100644 --- a/plugins/ModelChecker/ModelChecker.py +++ b/plugins/ModelChecker/ModelChecker.py @@ -27,7 +27,7 @@ class ModelChecker(QObject, Extension): self._caution_message = Message("", #Message text gets set when the message gets shown, to display the models in question. lifetime = 0, - title = catalog.i18nc("@info:title", "Model Checker Warning")) + title = catalog.i18nc("@info:title", "3D Model Assistant")) Application.getInstance().initializationFinished.connect(self._pluginsInitialized) Application.getInstance().getController().getScene().sceneChanged.connect(self._onChanged) From 6a3eec07e2b3fe68e1b9265761383b07532184d5 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Mon, 28 May 2018 16:03:05 +0200 Subject: [PATCH 06/39] Message stack shows properly messages CURA-4952 --- .../FirmwareUpdateCheckerJob.py | 20 +++++++++++++------ resources/themes/cura-light/styles.qml | 2 +- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 66ee43209f..19b77c1181 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -63,13 +63,21 @@ class FirmwareUpdateCheckerJob(Job): # notify the user when no new firmware version is available. if (checked_version != "") and (checked_version != current_version): Logger.log("i", "SHOWING FIRMWARE UPDATE MESSAGE") - message = Message(i18n_catalog.i18nc("@info Don't translate {machine_name}, since it gets replaced by a printer name!", "New features are available for your {machine_name}! It is recommended to update the firmware on your printer.").format(machine_name = machine_name), - title = i18n_catalog.i18nc("@info:title The %s gets replaced with the printer name.", "New %s firmware available") % machine_name) - message.addAction("download", i18n_catalog.i18nc("@action:button", "How to update"), "[no_icon]", "[no_description]") - # If we do this in a cool way, the download url should be available in the JSON file - if self._set_download_url_callback: - self._set_download_url_callback("https://ultimaker.com/en/resources/23129-updating-the-firmware?utm_source=cura&utm_medium=software&utm_campaign=hw-update") + footer_text = i18n_catalog.i18nc("@action:info", "Read more on how to update printer firmware") + footer_link = "?url=https://ultimaker.com/en/resources/23129-updating-the-firmware?utm_source=cura&utm_medium=software&utm_campaign=hw-update" + + footer_message = footer_text + " " + footer_link + + message = Message(i18n_catalog.i18nc( + "@info Don't translate {machine_name}, since it gets replaced by a printer name!", + "New features are available for your {machine_name}! It is recommended to update the firmware on your printer.").format( + machine_name=machine_name), + title=i18n_catalog.i18nc( + "@info:title The %s gets replaced with the printer name.", + "New %s firmware available") % machine_name, + footer = footer_message) + message.actionTriggered.connect(self._callback) message.show() diff --git a/resources/themes/cura-light/styles.qml b/resources/themes/cura-light/styles.qml index 14e7d196a7..b71ddd2d86 100755 --- a/resources/themes/cura-light/styles.qml +++ b/resources/themes/cura-light/styles.qml @@ -532,7 +532,7 @@ QtObject { SequentialAnimation on x { id: xAnim - property int animEndPoint: Theme.getSize("message").width - (Theme.getSize("default_margin").width * 2) - Theme.getSize("progressbar_control").width + property int animEndPoint: Theme.getSize("message").width - Math.round((Theme.getSize("default_margin").width * 2.5)) - Theme.getSize("progressbar_control").width running: control.indeterminate && control.visible loops: Animation.Infinite NumberAnimation { from: 0; to: xAnim.animEndPoint; duration: 2000;} From 8a35d52ddd6d0c71a92ac299de644d07799d8176 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Mon, 28 May 2018 17:21:08 +0200 Subject: [PATCH 07/39] Rename "cura_version" to "sdk_version" --- plugins/Toolbox/src/Toolbox.py | 17 ++-- resources/bundled_packages.json | 132 ++++++++++++++++---------------- 2 files changed, 76 insertions(+), 73 deletions(-) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index ea6bdf791c..e540bce523 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -36,13 +36,16 @@ class Toolbox(QObject, Extension): self._application = Application.getInstance() self._package_manager = None self._plugin_registry = Application.getInstance().getPluginRegistry() - self._packages_api_root = self._getPackagesApiRoot() - self._packages_version = self._getPackagesVersion() - self._api_version = 1 - self._api_url = "{api_root}/cura-packages/v{api_version}/cura/v{package_version}".format( - api_root = self._packages_api_root, - api_version = self._api_version, - package_version = self._packages_version + + self._sdk_version = self._getPackagesVersion() + + self._cloud_api_version = 1 + self._cloud_api_root = self._getPackagesApiRoot() + + self._api_url = "{cloud_api_root}/cura-packages/v{cloud_api_version}/cura/v{sdk_version}".format( + cloud_api_root = self._cloud_api_root, + cloud_api_version = self._cloud_api_version, + sdk_version = self._sdk_version ) # Network: diff --git a/resources/bundled_packages.json b/resources/bundled_packages.json index a63d08ddab..ab6bf7e925 100644 --- a/resources/bundled_packages.json +++ b/resources/bundled_packages.json @@ -6,7 +6,7 @@ "display_name": "3MF Reader", "description": "Provides support for reading 3MF files.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -23,7 +23,7 @@ "display_name": "3MF Writer", "description": "Provides support for writing 3MF files.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -40,7 +40,7 @@ "display_name": "Change Log", "description": "Shows changes since latest checked version.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -57,7 +57,7 @@ "display_name": "CuraEngine Backend", "description": "Provides the link to the CuraEngine slicing backend.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -74,7 +74,7 @@ "display_name": "Cura Profile Reader", "description": "Provides support for importing Cura profiles.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -91,7 +91,7 @@ "display_name": "Cura Profile Writer", "description": "Provides support for exporting Cura profiles.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -108,7 +108,7 @@ "display_name": "Firmware Update Checker", "description": "Checks for firmware updates.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -125,7 +125,7 @@ "display_name": "Compressed G-code Reader", "description": "Reads g-code from a compressed archive.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -142,7 +142,7 @@ "display_name": "Compressed G-code Writer", "description": "Writes g-code to a compressed archive.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -159,7 +159,7 @@ "display_name": "G-Code Profile Reader", "description": "Provides support for importing profiles from g-code files.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -176,7 +176,7 @@ "display_name": "G-Code Reader", "description": "Allows loading and displaying G-code files.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "VictorLarchenko", @@ -193,7 +193,7 @@ "display_name": "G-Code Writer", "description": "Writes g-code to a file.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -210,7 +210,7 @@ "display_name": "Image Reader", "description": "Enables ability to generate printable geometry from 2D image files.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -227,7 +227,7 @@ "display_name": "Legacy Cura Profile Reader", "description": "Provides support for importing profiles from legacy Cura versions.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -244,7 +244,7 @@ "display_name": "Machine Settings Action", "description": "Provides a way to change machine settings (such as build volume, nozzle size, etc.).", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "fieldOfView", @@ -261,7 +261,7 @@ "display_name": "Model Checker", "description": "Checks models and print configuration for possible printing issues and give suggestions.", "package_version": "0.1.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -278,7 +278,7 @@ "display_name": "Monitor Stage", "description": "Provides a monitor stage in Cura.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -295,7 +295,7 @@ "display_name": "Per-Object Settings Tool", "description": "Provides the per-model settings.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -312,7 +312,7 @@ "display_name": "Post Processing", "description": "Extension that allows for user created scripts for post processing.", "package_version": "2.2.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -329,7 +329,7 @@ "display_name": "Prepare Stage", "description": "Provides a prepare stage in Cura.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -346,7 +346,7 @@ "display_name": "Removable Drive Output Device", "description": "Provides removable drive hotplugging and writing support.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -363,7 +363,7 @@ "display_name": "Simulation View", "description": "Provides the Simulation view.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -380,7 +380,7 @@ "display_name": "Slice Info", "description": "Submits anonymous slice info. Can be disabled through preferences.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -397,7 +397,7 @@ "display_name": "Solid View", "description": "Provides a normal solid mesh view.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -414,7 +414,7 @@ "display_name": "Support Eraser Tool", "description": "Creates an eraser mesh to block the printing of support in certain places.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -431,7 +431,7 @@ "display_name": "Toolbox", "description": "Find, manage and install new Cura packages.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -448,7 +448,7 @@ "display_name": "UFP Writer", "description": "Provides support for writing Ultimaker Format Packages.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -465,7 +465,7 @@ "display_name": "Ultimaker Machine Actions", "description": "Provides machine actions for Ultimaker machines (such as bed leveling wizard, selecting upgrades, etc.).", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -482,7 +482,7 @@ "display_name": "UM3 Network Printing", "description": "Manages network connections to Ultimaker 3 printers.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -499,7 +499,7 @@ "display_name": "USB Printing", "description": "Accepts G-Code and sends them to a printer. Plugin can also update firmware.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -516,7 +516,7 @@ "display_name": "User Agreement", "description": "Ask the user once if he/she agrees with our license.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -533,7 +533,7 @@ "display_name": "Version Upgrade 2.1 to 2.2", "description": "Upgrades configurations from Cura 2.1 to Cura 2.2.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -550,7 +550,7 @@ "display_name": "Version Upgrade 2.2 to 2.4", "description": "Upgrades configurations from Cura 2.2 to Cura 2.4.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -567,7 +567,7 @@ "display_name": "Version Upgrade 2.5 to 2.6", "description": "Upgrades configurations from Cura 2.5 to Cura 2.6.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -584,7 +584,7 @@ "display_name": "Version Upgrade 2.6 to 2.7", "description": "Upgrades configurations from Cura 2.6 to Cura 2.7.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -601,7 +601,7 @@ "display_name": "Version Upgrade 2.7 to 3.0", "description": "Upgrades configurations from Cura 2.7 to Cura 3.0.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -618,7 +618,7 @@ "display_name": "Version Upgrade 3.0 to 3.1", "description": "Upgrades configurations from Cura 3.0 to Cura 3.1.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -635,7 +635,7 @@ "display_name": "Version Upgrade 3.2 to 3.3", "description": "Upgrades configurations from Cura 3.2 to Cura 3.3.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -652,7 +652,7 @@ "display_name": "Version Upgrade 3.3 to 3.4", "description": "Upgrades configurations from Cura 3.3 to Cura 3.4.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -669,7 +669,7 @@ "display_name": "X3D Reader", "description": "Provides support for reading X3D files.", "package_version": "0.5.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "SevaAlekseyev", @@ -686,7 +686,7 @@ "display_name": "XML Material Profiles", "description": "Provides capabilities to read and write XML-based material profiles.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -703,7 +703,7 @@ "display_name": "X-Ray View", "description": "Provides the X-Ray view.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com", "author": { "author_id": "Ultimaker", @@ -720,7 +720,7 @@ "display_name": "Dagoma Chromatik PLA", "description": "Filament testé et approuvé pour les imprimantes 3D Dagoma. Chromatik est l'idéal pour débuter et suivre les tutoriels premiers pas. Il vous offre qualité et résistance pour chacune de vos impressions.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://dagoma.fr/boutique/filaments.html", "author": { "author_id": "Dagoma", @@ -737,7 +737,7 @@ "display_name": "FABtotum ABS", "description": "This material is easy to be extruded but it is not the simplest to use. It is one of the most used in 3D printing to get very well finished objects. It is not sustainable and its smoke can be dangerous if inhaled. The reason to prefer this filament to PLA is mainly because of its precision and mechanical specs. ABS (for plastic) stands for Acrylonitrile Butadiene Styrene and it is a thermoplastic which is widely used in everyday objects. It can be printed with any FFF 3D printer which can get to high temperatures as it must be extruded in a range between 220° and 245°, so it’s compatible with all versions of the FABtotum Personal fabricator.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=40", "author": { "author_id": "FABtotum", @@ -754,7 +754,7 @@ "display_name": "FABtotum Nylon", "description": "When 3D printing started this material was not listed among the extrudable filaments. It is flexible as well as resistant to tractions. It is well known for its uses in textile but also in industries which require a strong and flexible material. There are different kinds of Nylon: 3D printing mostly uses Nylon 6 and Nylon 6.6, which are the most common. It requires higher temperatures to be printed, so a 3D printer must be able to reach them (around 240°C): the FABtotum, of course, can.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=53", "author": { "author_id": "FABtotum", @@ -771,7 +771,7 @@ "display_name": "FABtotum PLA", "description": "It is the most common filament used for 3D printing. It is studied to be bio-degradable as it comes from corn starch’s sugar mainly. It is completely made of renewable sources and has no footprint on polluting. PLA stands for PolyLactic Acid and it is a thermoplastic that today is still considered the easiest material to be 3D printed. It can be extruded at lower temperatures: the standard range of FABtotum’s one is between 185° and 195°.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=39", "author": { "author_id": "FABtotum", @@ -788,7 +788,7 @@ "display_name": "FABtotum TPU Shore 98A", "description": "", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://store.fabtotum.com/eu/products/filaments.html?filament_type=66", "author": { "author_id": "FABtotum", @@ -805,7 +805,7 @@ "display_name": "Fiberlogy HD PLA", "description": "With our HD PLA you have many more options. You can use this material in two ways. Choose the one you like best. You can use it as a normal PLA and get prints characterized by a very good adhesion between the layers and high precision. You can also make your prints acquire similar properties to that of ABS – better impact resistance and high temperature resistance. All you need is an oven. Yes, an oven! By annealing our HD PLA in an oven, in accordance with the manual, you will avoid all the inconveniences of printing with ABS, such as unpleasant odour or hazardous fumes.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "http://fiberlogy.com/en/fiberlogy-filaments/filament-hd-pla/", "author": { "author_id": "Fiberlogy", @@ -822,7 +822,7 @@ "display_name": "Filo3D PLA", "description": "Fast, safe and reliable printing. PLA is ideal for the fast and reliable printing of parts and prototypes with a great surface quality.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://dagoma.fr", "author": { "author_id": "Dagoma", @@ -839,7 +839,7 @@ "display_name": "IMADE3D JellyBOX PETG", "description": "", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "http://shop.imade3d.com/filament.html", "author": { "author_id": "IMADE3D", @@ -856,7 +856,7 @@ "display_name": "IMADE3D JellyBOX PLA", "description": "", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "http://shop.imade3d.com/filament.html", "author": { "author_id": "IMADE3D", @@ -873,7 +873,7 @@ "display_name": "Octofiber PLA", "description": "PLA material from Octofiber.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://nl.octofiber.com/3d-printing-filament/pla.html", "author": { "author_id": "Octofiber", @@ -890,7 +890,7 @@ "display_name": "PolyFlex™ PLA", "description": "PolyFlex™ is a highly flexible yet easy to print 3D printing material. Featuring good elasticity and a large strain-to- failure, PolyFlex™ opens up a completely new realm of applications.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "http://www.polymaker.com/shop/polyflex/", "author": { "author_id": "Polymaker", @@ -907,7 +907,7 @@ "display_name": "PolyMax™ PLA", "description": "PolyMax™ PLA is a 3D printing material with excellent mechanical properties and printing quality. PolyMax™ PLA has an impact resistance of up to nine times that of regular PLA, and better overall mechanical properties than ABS.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "http://www.polymaker.com/shop/polymax/", "author": { "author_id": "Polymaker", @@ -924,7 +924,7 @@ "display_name": "PolyPlus™ PLA True Colour", "description": "PolyPlus™ PLA is a premium PLA designed for all desktop FDM/FFF 3D printers. It is produced with our patented Jam-Free™ technology that ensures consistent extrusion and prevents jams.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "http://www.polymaker.com/shop/polyplus-true-colour/", "author": { "author_id": "Polymaker", @@ -941,7 +941,7 @@ "display_name": "PolyWood™ PLA", "description": "PolyWood™ is a wood mimic printing material that contains no actual wood ensuring a clean Jam-Free™ printing experience.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "http://www.polymaker.com/shop/polywood/", "author": { "author_id": "Polymaker", @@ -958,7 +958,7 @@ "display_name": "Ultimaker ABS", "description": "Example package for material and quality profiles for Ultimaker materials.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com/products/materials/abs", "author": { "author_id": "Ultimaker", @@ -977,7 +977,7 @@ "display_name": "Ultimaker CPE", "description": "Example package for material and quality profiles for Ultimaker materials.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com/products/materials/abs", "author": { "author_id": "Ultimaker", @@ -996,7 +996,7 @@ "display_name": "Ultimaker Nylon", "description": "Example package for material and quality profiles for Ultimaker materials.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com/products/materials/abs", "author": { "author_id": "Ultimaker", @@ -1015,7 +1015,7 @@ "display_name": "Ultimaker PC", "description": "Example package for material and quality profiles for Ultimaker materials.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com/products/materials/pc", "author": { "author_id": "Ultimaker", @@ -1034,7 +1034,7 @@ "display_name": "Ultimaker PLA", "description": "Example package for material and quality profiles for Ultimaker materials.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com/products/materials/abs", "author": { "author_id": "Ultimaker", @@ -1053,7 +1053,7 @@ "display_name": "Ultimaker PVA", "description": "Example package for material and quality profiles for Ultimaker materials.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://ultimaker.com/products/materials/abs", "author": { "author_id": "Ultimaker", @@ -1072,7 +1072,7 @@ "display_name": "Vertex Delta ABS", "description": "ABS material and quality files for the Delta Vertex K8800.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://vertex3dprinter.eu", "author": { "author_id": "Velleman", @@ -1089,7 +1089,7 @@ "display_name": "Vertex Delta PET", "description": "ABS material and quality files for the Delta Vertex K8800.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://vertex3dprinter.eu", "author": { "author_id": "Velleman", @@ -1106,7 +1106,7 @@ "display_name": "Vertex Delta PLA", "description": "ABS material and quality files for the Delta Vertex K8800.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://vertex3dprinter.eu", "author": { "author_id": "Velleman", @@ -1123,7 +1123,7 @@ "display_name": "Vertex Delta TPU", "description": "ABS material and quality files for the Delta Vertex K8800.", "package_version": "1.0.0", - "cura_version": 4, + "sdk_version": 4, "website": "https://vertex3dprinter.eu", "author": { "author_id": "Velleman", From 3b0b6d300b0abe6571c35955040d0a3192a61019 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Mon, 28 May 2018 17:34:12 +0200 Subject: [PATCH 08/39] Only set user-specified job name when the editting is finished CURA-5280 --- resources/qml/JobSpecs.qml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/resources/qml/JobSpecs.qml b/resources/qml/JobSpecs.qml index 579f9bcc05..f9ce286706 100644 --- a/resources/qml/JobSpecs.qml +++ b/resources/qml/JobSpecs.qml @@ -80,10 +80,8 @@ Item { property int unremovableSpacing: 5 text: PrintInformation.jobName horizontalAlignment: TextInput.AlignRight - onTextChanged: { - PrintInformation.setJobName(text, true); - } onEditingFinished: { + PrintInformation.setJobName(text, true); if (printJobTextfield.text != ''){ printJobTextfield.focus = false; } From ac1dfcf15d913ed25a582d82e34921d4322145da Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 28 May 2018 22:52:49 +0200 Subject: [PATCH 09/39] Make headers non-transparent --- plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml b/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml index 229ab5afb3..b4219d53bf 100644 --- a/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml +++ b/plugins/Toolbox/resources/qml/ToolboxCompatibilityChart.qml @@ -31,8 +31,9 @@ Item frameVisible: false selectionMode: 0 model: packageData.supported_configs - headerDelegate: Item + headerDelegate: Rectangle { + color: UM.Theme.getColor("sidebar") height: UM.Theme.getSize("toolbox_chart_row").height Label { From 504889b472418f8565fda946ec5413043a7dcace Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 29 May 2018 07:31:39 +0200 Subject: [PATCH 10/39] Remove Alternate Cross 3D Pockets setting It is no longer used in the new implementation of cross infill. --- resources/definitions/fdmprinter.def.json | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 0d6c1eaa7b..570b6c8625 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5772,16 +5772,6 @@ "limit_to_extruder": "infill_extruder_nr", "settable_per_mesh": true }, - "cross_infill_apply_pockets_alternatingly": - { - "label": "Alternate Cross 3D Pockets", - "description": "Only apply pockets at half of the four-way crossings in the cross 3D pattern and alternate the location of the pockets between heights where the pattern is touching itself.", - "type": "bool", - "default_value": true, - "enabled": "infill_pattern == 'cross_3d'", - "limit_to_extruder": "infill_extruder_nr", - "settable_per_mesh": true - }, "cross_infill_density_image": { "label": "Cross Infill Density Image", From 8a6996e920d6dde3a98fddf4a80ee078a24db385 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Tue, 29 May 2018 09:32:06 +0200 Subject: [PATCH 11/39] If an object does not have a convex hull, it does not crash the ArrangeObjectsJob --- cura/Arranging/ArrangeObjectsJob.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cura/Arranging/ArrangeObjectsJob.py b/cura/Arranging/ArrangeObjectsJob.py index 01a91a3c22..08fd1985a9 100644 --- a/cura/Arranging/ArrangeObjectsJob.py +++ b/cura/Arranging/ArrangeObjectsJob.py @@ -43,6 +43,9 @@ class ArrangeObjectsJob(Job): nodes_arr = [] # fill with (size, node, offset_shape_arr, hull_shape_arr) for node in self._nodes: offset_shape_arr, hull_shape_arr = ShapeArray.fromNode(node, min_offset = self._min_offset) + if offset_shape_arr is None: + Logger.log("w", "Node [%s] could not be converted to an array for arranging...", str(node)) + continue nodes_arr.append((offset_shape_arr.arr.shape[0] * offset_shape_arr.arr.shape[1], node, offset_shape_arr, hull_shape_arr)) # Sort the nodes with the biggest area first. From 9627eb0fc101616d94073450a0e31b3c309af021 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 29 May 2018 10:45:44 +0200 Subject: [PATCH 12/39] Only exclude explicitly specified materials in the "exclude_materials" field CURA-5344 --- cura/Machines/MaterialManager.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cura/Machines/MaterialManager.py b/cura/Machines/MaterialManager.py index 8b74596667..ff666f392d 100644 --- a/cura/Machines/MaterialManager.py +++ b/cura/Machines/MaterialManager.py @@ -291,9 +291,10 @@ class MaterialManager(QObject): material_id_metadata_dict = dict() for node in nodes_to_check: if node is not None: + # Only exclude the materials that are explicitly specified in the "exclude_materials" field. + # Do not exclude other materials that are of the same type. for material_id, node in node.material_map.items(): - fallback_id = self.getFallbackMaterialIdByMaterialType(node.metadata["material"]) - if fallback_id in machine_exclude_materials: + if material_id in machine_exclude_materials: Logger.log("d", "Exclude material [%s] for machine [%s]", material_id, machine_definition.getId()) continue From 1c3bae3fe478e6e30df7be4bdce76729224c66bd Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 29 May 2018 10:52:04 +0200 Subject: [PATCH 13/39] Show keep/discard dialog upon material change if there are user changes CURA-5417 --- cura/Settings/MachineManager.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 78f462d8e9..44f9f04740 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1331,6 +1331,10 @@ class MachineManager(QObject): self._setMaterial(position, container_node) self._updateQualityWithMaterial() + # See if we need to show the Discard or Keep changes screen + if self.hasUserSettings and Preferences.getInstance().getValue("cura/active_mode") == 1: + self._application.discardOrKeepProfileChanges() + @pyqtSlot(str, str) def setVariantByName(self, position: str, variant_name: str) -> None: machine_definition_id = self._global_container_stack.definition.id From 77feb95191317a6e7bf077127a6a4d3293f67955 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 29 May 2018 11:05:55 +0200 Subject: [PATCH 14/39] Don't crash when failing to reload file Now it shows a message that it failed to load the file. --- cura/CuraApplication.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 5db616ab3b..ed4336a9a0 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -1500,11 +1500,15 @@ class CuraApplication(QtApplication): def _reloadMeshFinished(self, job): # TODO; This needs to be fixed properly. We now make the assumption that we only load a single mesh! - mesh_data = job.getResult()[0].getMeshData() - if mesh_data: - job._node.setMeshData(mesh_data) - else: + job_result = job.getResult() + if len(job_result) == 0: + Logger.log("e", "Reloading the mesh failed.") + return + mesh_data = job_result[0].getMeshData() + if not mesh_data: Logger.log("w", "Could not find a mesh in reloaded node.") + return + job._node.setMeshData(mesh_data) def _openFile(self, filename): self.readLocalFile(QUrl.fromLocalFile(filename)) From 373555fa4a16eafbec5e9986d1f88d837af204d1 Mon Sep 17 00:00:00 2001 From: Tim Kuipers Date: Wed, 28 Feb 2018 16:26:11 +0100 Subject: [PATCH 15/39] settings for infill support --- resources/definitions/fdmprinter.def.json | 24 +++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index fc8395a8dc..4ab08d2f24 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -1807,6 +1807,30 @@ "limit_to_extruder": "infill_extruder_nr", "settable_per_mesh": true }, + "infill_support_enabled": + { + "label": "Infill Support", + "description": "Print infill structures only where tops of the model should be supported. Enabling this reduces print time and material usage, but leads to ununiform object strength.", + "type": "bool", + "default_value": false, + "enabled": "infill_sparse_density > 0", + "limit_to_extruder": "infill_extruder_nr", + "settable_per_mesh": true + }, + "infill_support_angle": + { + "label": "Infill Overhang Angle", + "description": "The minimum angle of internal overhangs for which infill is added. At a value of 0° objects are totally filled with infill, 90° will not provide any infill.", + "unit": "°", + "type": "float", + "minimum_value": "0", + "minimum_value_warning": "2", + "maximum_value": "90", + "default_value": 40, + "enabled": "infill_sparse_density > 0 and infill_support_enabled", + "limit_to_extruder": "infill_extruder_nr", + "settable_per_mesh": true + }, "skin_preshrink": { "label": "Skin Removal Width", From ab2503834bda73e51ce4950d91f5739f5ae9bdd2 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 29 May 2018 11:31:13 +0200 Subject: [PATCH 16/39] Remove Hollow Out Objects setting It has been replaced by Infill Support. Contributes to issue CURA-5108. --- resources/definitions/fdmprinter.def.json | 8 -------- 1 file changed, 8 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index 4ab08d2f24..292748433e 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5942,14 +5942,6 @@ "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": true }, - "infill_hollow": - { - "label": "Hollow Out Objects", - "description": "Remove all infill and make the inside of the object eligible for support.", - "type": "bool", - "default_value": false, - "settable_per_mesh": true - }, "magic_fuzzy_skin_enabled": { "label": "Fuzzy Skin", From db16a6275f43ce9a51326ea9ddcaa80f8ab3a4c9 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 29 May 2018 11:51:54 +0200 Subject: [PATCH 17/39] Add version upgrade for infill_hollow -> infill_support The functionality is more or less the same, so in an attempt to keep people's profiles as similar as possible we translate this setting to the newer implementation. --- .../VersionUpgrade33to34/VersionUpgrade33to34.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade33to34/VersionUpgrade33to34.py b/plugins/VersionUpgrade/VersionUpgrade33to34/VersionUpgrade33to34.py index 17abace547..16f17c5e36 100644 --- a/plugins/VersionUpgrade/VersionUpgrade33to34/VersionUpgrade33to34.py +++ b/plugins/VersionUpgrade/VersionUpgrade33to34/VersionUpgrade33to34.py @@ -6,6 +6,9 @@ import io #To serialise the preference files afterwards. from UM.VersionUpgrade import VersionUpgrade #We're inheriting from this. +_renamed_settings = { + "infill_hollow": "infill_support_enabled" +} ## Upgrades configurations from the state they were in at version 3.3 to the # state they should be in at version 3.4. @@ -38,6 +41,13 @@ class VersionUpgrade33to34(VersionUpgrade): # Update version number. parser["general"]["version"] = "4" + #Renamed settings. + if "values" in parser: + for original, replacement in _renamed_settings.items(): + if original in parser["value"]: + parser["value"][replacement] = parser["value"][original] + del parser["value"][original] + result = io.StringIO() parser.write(result) - return [filename], [result.getvalue()] + return [filename], [result.getvalue()] \ No newline at end of file From 0d89240bca0c57ac7d6d6486fca9ecc35248fce1 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 29 May 2018 11:57:14 +0200 Subject: [PATCH 18/39] Copy support angle to infill support angle if used for hollow infill This keeps the new profile as close to the profile in the previous version as possible. Contributes to issue CURA-5108. --- .../VersionUpgrade33to34/VersionUpgrade33to34.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/plugins/VersionUpgrade/VersionUpgrade33to34/VersionUpgrade33to34.py b/plugins/VersionUpgrade/VersionUpgrade33to34/VersionUpgrade33to34.py index 16f17c5e36..e2241fd195 100644 --- a/plugins/VersionUpgrade/VersionUpgrade33to34/VersionUpgrade33to34.py +++ b/plugins/VersionUpgrade/VersionUpgrade33to34/VersionUpgrade33to34.py @@ -41,12 +41,16 @@ class VersionUpgrade33to34(VersionUpgrade): # Update version number. parser["general"]["version"] = "4" - #Renamed settings. if "values" in parser: + #If infill_hollow was enabled and the overhang angle was adjusted, copy that overhang angle to the new infill support angle. + if "infill_hollow" in parser["values"] and parser["values"]["infill_hollow"] and "support_angle" in parser["values"]: + parser["values"]["infill_support_angle"] = parser["values"]["support_angle"] + + #Renamed settings. for original, replacement in _renamed_settings.items(): - if original in parser["value"]: - parser["value"][replacement] = parser["value"][original] - del parser["value"][original] + if original in parser["values"]: + parser["values"][replacement] = parser["values"][original] + del parser["values"][original] result = io.StringIO() parser.write(result) From 3614da0f9d33a69b5ef904999f1ba50d96bdf3d1 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Tue, 29 May 2018 13:22:59 +0200 Subject: [PATCH 19/39] Replace infill_hollow by infill_support_enabled It's not the exact same functionality, but very similar and equally expert. Contributes to issue CURA-5108. --- resources/setting_visibility/expert.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/setting_visibility/expert.cfg b/resources/setting_visibility/expert.cfg index 6d6b84883c..be0950ec6f 100644 --- a/resources/setting_visibility/expert.cfg +++ b/resources/setting_visibility/expert.cfg @@ -87,6 +87,7 @@ gradual_infill_steps gradual_infill_step_height infill_before_walls min_infill_area +infill_support_enabled skin_preshrink top_skin_preshrink bottom_skin_preshrink @@ -369,7 +370,6 @@ spaghetti_infill_extra_volume support_conical_enabled support_conical_angle support_conical_min_width -infill_hollow magic_fuzzy_skin_enabled magic_fuzzy_skin_thickness magic_fuzzy_skin_point_density From 7cf2832183d7cdd5550aac83012119e69b58c495 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 29 May 2018 13:43:08 +0200 Subject: [PATCH 20/39] Fix quality_group is None check in _setQualityGroup() CURA-5423 --- cura/Settings/MachineManager.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 44f9f04740..84ffc8aaf4 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1032,6 +1032,10 @@ class MachineManager(QObject): self.activeQualityChangesGroupChanged.emit() def _setQualityGroup(self, quality_group, empty_quality_changes: bool = True) -> None: + if quality_group is None: + self._setEmptyQuality() + return + if quality_group.node_for_global.getContainer() is None: return for node in quality_group.nodes_for_extruders.values(): @@ -1042,10 +1046,6 @@ class MachineManager(QObject): if empty_quality_changes: self._current_quality_changes_group = None - if quality_group is None: - self._setEmptyQuality() - return - # Set quality and quality_changes for the GlobalStack self._global_container_stack.quality = quality_group.node_for_global.getContainer() if empty_quality_changes: From fed0a015eefd87c4ca0cf63c78cffe249dcc7b91 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 29 May 2018 15:56:00 +0200 Subject: [PATCH 21/39] Clear is_user_specified_job_name flag when setting a project file name CURA-5280 --- cura/PrintInformation.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 2c9f6511fa..9239dec8b7 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -329,6 +329,8 @@ class PrintInformation(QObject): baseNameChanged = pyqtSignal() def setBaseName(self, base_name: str, is_project_file: bool = False): + self._is_user_specified_job_name = False + # Ensure that we don't use entire path but only filename name = os.path.basename(base_name) From c77ea76b214a20ee814f24d4e319fe8967e9d70c Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Tue, 29 May 2018 16:34:36 +0200 Subject: [PATCH 22/39] CURA-5357 Drag & dribble multiple packages like a plugable trickle, yo Also improved interfacing with `CuraVersion.py` --- plugins/Toolbox/src/Toolbox.py | 62 ++++++++++++++++++++-------------- resources/qml/Cura.qml | 15 ++++---- 2 files changed, 46 insertions(+), 31 deletions(-) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index e540bce523..b9e7f8f94d 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -28,7 +28,8 @@ i18n_catalog = i18nCatalog("cura") ## The Toolbox class is responsible of communicating with the server through the API class Toolbox(QObject, Extension): - DEFAULT_PACKAGES_API_ROOT = "https://api.ultimaker.com" + DEFAULT_CLOUD_API_ROOT = "https://api.ultimaker.com" + DEFAULT_CLOUD_API_VERSION = 1 def __init__(self, parent=None) -> None: super().__init__(parent) @@ -37,16 +38,10 @@ class Toolbox(QObject, Extension): self._package_manager = None self._plugin_registry = Application.getInstance().getPluginRegistry() - self._sdk_version = self._getPackagesVersion() - - self._cloud_api_version = 1 - self._cloud_api_root = self._getPackagesApiRoot() - - self._api_url = "{cloud_api_root}/cura-packages/v{cloud_api_version}/cura/v{sdk_version}".format( - cloud_api_root = self._cloud_api_root, - cloud_api_version = self._cloud_api_version, - sdk_version = self._sdk_version - ) + self._sdk_version = None + self._cloud_api_version = None + self._cloud_api_root = None + self._api_url = None # Network: self._get_packages_request = None @@ -67,12 +62,7 @@ class Toolbox(QObject, Extension): ) ) ] - self._request_urls = { - "authors": QUrl("{base_url}/authors".format(base_url = self._api_url)), - "packages": QUrl("{base_url}/packages".format(base_url = self._api_url)), - "plugins_showcase": QUrl("{base_url}/showcase".format(base_url = self._api_url)), - "materials_showcase": QUrl("{base_url}/showcase".format(base_url = self._api_url)) - } + self._request_urls = {} self._to_update = [] # Package_ids that are waiting to be updated # Data: @@ -164,22 +154,44 @@ class Toolbox(QObject, Extension): # this is initialized. Therefore, we wait until the application is ready. def _onAppInitialized(self) -> None: self._package_manager = Application.getInstance().getCuraPackageManager() + self._sdk_version = self._getSDKVersion() + self._cloud_api_version = self._getCloudAPIVersion() + self._cloud_api_root = self._getCloudAPIRoot() + self._api_url = "{cloud_api_root}/cura-packages/v{cloud_api_version}/cura/v{sdk_version}".format( + cloud_api_root=self._cloud_api_root, + cloud_api_version=self._cloud_api_version, + sdk_version=self._sdk_version + ) + self._request_urls = { + "authors": QUrl("{base_url}/authors".format(base_url=self._api_url)), + "packages": QUrl("{base_url}/packages".format(base_url=self._api_url)), + "plugins_showcase": QUrl("{base_url}/showcase".format(base_url=self._api_url)), + "materials_showcase": QUrl("{base_url}/showcase".format(base_url=self._api_url)) + } # Get the API root for the packages API depending on Cura version settings. - def _getPackagesApiRoot(self) -> str: + def _getCloudAPIRoot(self) -> str: if not hasattr(cura, "CuraVersion"): - return self.DEFAULT_PACKAGES_API_ROOT - if not hasattr(cura.CuraVersion, "CuraPackagesApiRoot"): - return self.DEFAULT_PACKAGES_API_ROOT - return cura.CuraVersion.CuraPackagesApiRoot + return self.DEFAULT_CLOUD_API_ROOT + if not hasattr(cura.CuraVersion, "CuraCloudAPIRoot"): + return self.DEFAULT_CLOUD_API_ROOT + return cura.CuraVersion.CuraCloudAPIRoot + + # Get the cloud API version from CuraVersion + def _getCloudAPIVersion(self) -> int: + if not hasattr(cura, "CuraVersion"): + return self.DEFAULT_CLOUD_API_VERSION + if not hasattr(cura.CuraVersion, "CuraCloudAPIVersion"): + return self.DEFAULT_CLOUD_API_VERSION + return cura.CuraVersion.CuraCloudAPIVersion # Get the packages version depending on Cura version settings. - def _getPackagesVersion(self) -> int: + def _getSDKVersion(self) -> int: if not hasattr(cura, "CuraVersion"): return self._plugin_registry.APIVersion - if not hasattr(cura.CuraVersion, "CuraPackagesVersion"): + if not hasattr(cura.CuraVersion, "CuraSDKVersion"): return self._plugin_registry.APIVersion - return cura.CuraVersion.CuraPackagesVersion + return cura.CuraVersion.CuraSDKVersion @pyqtSlot() def browsePackages(self) -> None: diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index e1cc4f6e45..b8f289278c 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -323,10 +323,11 @@ UM.MainWindow { if (drop.urls.length > 0) { - // As the drop area also supports plugins, first check if it's a plugin that was dropped. - if (drop.urls.length == 1) + + var nonPackages = []; + for (var i = 0; i < drop.urls.length; i++) { - var filename = drop.urls[0]; + var filename = drop.urls[i]; if (filename.endsWith(".curapackage")) { // Try to install plugin & close. @@ -334,11 +335,13 @@ UM.MainWindow packageInstallDialog.text = catalog.i18nc("@label", "This package will be installed after restarting."); packageInstallDialog.icon = StandardIcon.Information; packageInstallDialog.open(); - return; + } + else + { + others.push(filename); } } - - openDialog.handleOpenFileUrls(drop.urls); + openDialog.handleOpenFileUrls(nonPackages); } } } From b46a08f566b573dee767d1216fc9c340e350e02b Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 29 May 2018 18:15:16 +0200 Subject: [PATCH 23/39] Add Reft and Right side aligned action buttons to the message box CURA-4952 --- cura/CuraApplication.py | 2 +- .../FirmwareUpdateCheckerJob.py | 14 ++++++++++++-- plugins/SliceInfoPlugin/SliceInfo.py | 5 +++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ed4336a9a0..34b6b5cde1 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -452,7 +452,7 @@ class CuraApplication(QtApplication): ## A reusable dialogbox # - showMessageBox = pyqtSignal(str, str, str, str, str, int, int, arguments = ["title", "footer", "text", "informativeText", "detailedText", "buttons", "icon"]) + showMessageBox = pyqtSignal(str, str, str, str, int, int, arguments = ["title", "text", "informativeText", "detailedText", "buttons", "icon"]) def messageBox(self, title, text, informativeText = "", detailedText = "", buttons = QMessageBox.Ok, icon = QMessageBox.NoIcon, callback = None, callback_arguments = []): self._message_box_callback = callback diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 19b77c1181..089d1847ed 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -75,9 +75,19 @@ class FirmwareUpdateCheckerJob(Job): machine_name=machine_name), title=i18n_catalog.i18nc( "@info:title The %s gets replaced with the printer name.", - "New %s firmware available") % machine_name, - footer = footer_message) + "New %s firmware available") % machine_name) + message.addAction("download", + i18n_catalog.i18nc("@action:button", "How to update"), + "[no_icon]", + "[no_description]", + button_style=Message.ActionButtonStyle.LINK, + button_align=Message.ActionButtonStyle.BUTTON_ALIGN_LEFT) + + + # If we do this in a cool way, the download url should be available in the JSON file + if self._set_download_url_callback: + self._set_download_url_callback("https://ultimaker.com/en/resources/20500-upgrade-firmware") message.actionTriggered.connect(self._callback) message.show() diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index 82e07da464..b0525bdbfa 100755 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -46,10 +46,11 @@ class SliceInfo(QObject, Extension): dismissable = False, title = catalog.i18nc("@info:title", "Collecting Data")) - self.send_slice_info_message.addAction("Dismiss", name = catalog.i18nc("@action:button", "Allow"), icon = None, - description = catalog.i18nc("@action:tooltip", "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing.")) self.send_slice_info_message.addAction("MoreInfo", name = catalog.i18nc("@action:button", "More info"), icon = None, description = catalog.i18nc("@action:tooltip", "See more information on what data Cura sends."), button_style = Message.ActionButtonStyle.LINK) + + self.send_slice_info_message.addAction("Dismiss", name = catalog.i18nc("@action:button", "Allow"), icon = None, + description = catalog.i18nc("@action:tooltip", "Allow Cura to send anonymized usage statistics to help prioritize future improvements to Cura. Some of your preferences and settings are sent, the Cura version and a hash of the models you're slicing.")) self.send_slice_info_message.actionTriggered.connect(self.messageActionTriggered) self.send_slice_info_message.show() From 4d6753a1f163d78a9fe61756c94d22e674887a46 Mon Sep 17 00:00:00 2001 From: Aleksei S Date: Tue, 29 May 2018 18:33:38 +0200 Subject: [PATCH 24/39] remove unused code lines in firmware checker CURA-4952 --- plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py index 089d1847ed..ce4fb8c92f 100644 --- a/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py +++ b/plugins/FirmwareUpdateChecker/FirmwareUpdateCheckerJob.py @@ -64,11 +64,6 @@ class FirmwareUpdateCheckerJob(Job): if (checked_version != "") and (checked_version != current_version): Logger.log("i", "SHOWING FIRMWARE UPDATE MESSAGE") - footer_text = i18n_catalog.i18nc("@action:info", "Read more on how to update printer firmware") - footer_link = "?url=https://ultimaker.com/en/resources/23129-updating-the-firmware?utm_source=cura&utm_medium=software&utm_campaign=hw-update" - - footer_message = footer_text + " " + footer_link - message = Message(i18n_catalog.i18nc( "@info Don't translate {machine_name}, since it gets replaced by a printer name!", "New features are available for your {machine_name}! It is recommended to update the firmware on your printer.").format( From 80d4989843f4c629a562d9816cabeaa276e2a110 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 30 May 2018 09:03:34 +0200 Subject: [PATCH 25/39] Show keep/discard user settings dialog upon variant change CURA-5417 --- cura/Settings/MachineManager.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 84ffc8aaf4..5c87b6ffba 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1350,6 +1350,10 @@ class MachineManager(QObject): self._updateMaterialWithVariant(position) self._updateQualityWithMaterial() + # See if we need to show the Discard or Keep changes screen + if self.hasUserSettings and Preferences.getInstance().getValue("cura/active_mode") == 1: + self._application.discardOrKeepProfileChanges() + @pyqtSlot(str) def setQualityGroupByQualityType(self, quality_type: str) -> None: if self._global_container_stack is None: From 11db13aa2851e1c51b70b66ca37301a6d4968c76 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 29 May 2018 15:56:00 +0200 Subject: [PATCH 26/39] Clear is_user_specified_job_name flag when setting a project file name CURA-5280 --- cura/PrintInformation.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/PrintInformation.py b/cura/PrintInformation.py index 2c9f6511fa..9239dec8b7 100644 --- a/cura/PrintInformation.py +++ b/cura/PrintInformation.py @@ -329,6 +329,8 @@ class PrintInformation(QObject): baseNameChanged = pyqtSignal() def setBaseName(self, base_name: str, is_project_file: bool = False): + self._is_user_specified_job_name = False + # Ensure that we don't use entire path but only filename name = os.path.basename(base_name) From 13b3e4afa5c00ab3baab0570d318467f50fdf688 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Tue, 29 May 2018 16:34:36 +0200 Subject: [PATCH 27/39] CURA-5357 Drag & dribble multiple packages like a plugable trickle, yo Also improved interfacing with `CuraVersion.py` --- plugins/Toolbox/src/Toolbox.py | 62 ++++++++++++++++++++-------------- resources/qml/Cura.qml | 15 ++++---- 2 files changed, 46 insertions(+), 31 deletions(-) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index e540bce523..b9e7f8f94d 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -28,7 +28,8 @@ i18n_catalog = i18nCatalog("cura") ## The Toolbox class is responsible of communicating with the server through the API class Toolbox(QObject, Extension): - DEFAULT_PACKAGES_API_ROOT = "https://api.ultimaker.com" + DEFAULT_CLOUD_API_ROOT = "https://api.ultimaker.com" + DEFAULT_CLOUD_API_VERSION = 1 def __init__(self, parent=None) -> None: super().__init__(parent) @@ -37,16 +38,10 @@ class Toolbox(QObject, Extension): self._package_manager = None self._plugin_registry = Application.getInstance().getPluginRegistry() - self._sdk_version = self._getPackagesVersion() - - self._cloud_api_version = 1 - self._cloud_api_root = self._getPackagesApiRoot() - - self._api_url = "{cloud_api_root}/cura-packages/v{cloud_api_version}/cura/v{sdk_version}".format( - cloud_api_root = self._cloud_api_root, - cloud_api_version = self._cloud_api_version, - sdk_version = self._sdk_version - ) + self._sdk_version = None + self._cloud_api_version = None + self._cloud_api_root = None + self._api_url = None # Network: self._get_packages_request = None @@ -67,12 +62,7 @@ class Toolbox(QObject, Extension): ) ) ] - self._request_urls = { - "authors": QUrl("{base_url}/authors".format(base_url = self._api_url)), - "packages": QUrl("{base_url}/packages".format(base_url = self._api_url)), - "plugins_showcase": QUrl("{base_url}/showcase".format(base_url = self._api_url)), - "materials_showcase": QUrl("{base_url}/showcase".format(base_url = self._api_url)) - } + self._request_urls = {} self._to_update = [] # Package_ids that are waiting to be updated # Data: @@ -164,22 +154,44 @@ class Toolbox(QObject, Extension): # this is initialized. Therefore, we wait until the application is ready. def _onAppInitialized(self) -> None: self._package_manager = Application.getInstance().getCuraPackageManager() + self._sdk_version = self._getSDKVersion() + self._cloud_api_version = self._getCloudAPIVersion() + self._cloud_api_root = self._getCloudAPIRoot() + self._api_url = "{cloud_api_root}/cura-packages/v{cloud_api_version}/cura/v{sdk_version}".format( + cloud_api_root=self._cloud_api_root, + cloud_api_version=self._cloud_api_version, + sdk_version=self._sdk_version + ) + self._request_urls = { + "authors": QUrl("{base_url}/authors".format(base_url=self._api_url)), + "packages": QUrl("{base_url}/packages".format(base_url=self._api_url)), + "plugins_showcase": QUrl("{base_url}/showcase".format(base_url=self._api_url)), + "materials_showcase": QUrl("{base_url}/showcase".format(base_url=self._api_url)) + } # Get the API root for the packages API depending on Cura version settings. - def _getPackagesApiRoot(self) -> str: + def _getCloudAPIRoot(self) -> str: if not hasattr(cura, "CuraVersion"): - return self.DEFAULT_PACKAGES_API_ROOT - if not hasattr(cura.CuraVersion, "CuraPackagesApiRoot"): - return self.DEFAULT_PACKAGES_API_ROOT - return cura.CuraVersion.CuraPackagesApiRoot + return self.DEFAULT_CLOUD_API_ROOT + if not hasattr(cura.CuraVersion, "CuraCloudAPIRoot"): + return self.DEFAULT_CLOUD_API_ROOT + return cura.CuraVersion.CuraCloudAPIRoot + + # Get the cloud API version from CuraVersion + def _getCloudAPIVersion(self) -> int: + if not hasattr(cura, "CuraVersion"): + return self.DEFAULT_CLOUD_API_VERSION + if not hasattr(cura.CuraVersion, "CuraCloudAPIVersion"): + return self.DEFAULT_CLOUD_API_VERSION + return cura.CuraVersion.CuraCloudAPIVersion # Get the packages version depending on Cura version settings. - def _getPackagesVersion(self) -> int: + def _getSDKVersion(self) -> int: if not hasattr(cura, "CuraVersion"): return self._plugin_registry.APIVersion - if not hasattr(cura.CuraVersion, "CuraPackagesVersion"): + if not hasattr(cura.CuraVersion, "CuraSDKVersion"): return self._plugin_registry.APIVersion - return cura.CuraVersion.CuraPackagesVersion + return cura.CuraVersion.CuraSDKVersion @pyqtSlot() def browsePackages(self) -> None: diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index e1cc4f6e45..b8f289278c 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -323,10 +323,11 @@ UM.MainWindow { if (drop.urls.length > 0) { - // As the drop area also supports plugins, first check if it's a plugin that was dropped. - if (drop.urls.length == 1) + + var nonPackages = []; + for (var i = 0; i < drop.urls.length; i++) { - var filename = drop.urls[0]; + var filename = drop.urls[i]; if (filename.endsWith(".curapackage")) { // Try to install plugin & close. @@ -334,11 +335,13 @@ UM.MainWindow packageInstallDialog.text = catalog.i18nc("@label", "This package will be installed after restarting."); packageInstallDialog.icon = StandardIcon.Information; packageInstallDialog.open(); - return; + } + else + { + others.push(filename); } } - - openDialog.handleOpenFileUrls(drop.urls); + openDialog.handleOpenFileUrls(nonPackages); } } } From 9223122fc8af07bf209eb85a947e351e0d617262 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 30 May 2018 09:13:25 +0200 Subject: [PATCH 28/39] Add CuraCloudAPIRoot into CuraVersion.py.in and CMakeLists.txt CURA-5357 --- CMakeLists.txt | 2 ++ cura/CuraVersion.py.in | 1 + 2 files changed, 3 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 96efd68a2f..079b44890a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,8 @@ endif() set(CURA_VERSION "master" CACHE STRING "Version name of Cura") set(CURA_BUILDTYPE "" CACHE STRING "Build type of Cura, eg. 'PPA'") set(CURA_PACKAGES_VERSION "" CACHE STRING "Packages version of Cura") +set(CURA_CLOUD_API_ROOT "" CACHE STRING "Alternative cloud API root of Cura") + configure_file(${CMAKE_SOURCE_DIR}/cura.desktop.in ${CMAKE_BINARY_DIR}/cura.desktop @ONLY) configure_file(cura/CuraVersion.py.in CuraVersion.py @ONLY) diff --git a/cura/CuraVersion.py.in b/cura/CuraVersion.py.in index f45a24cae9..3077ad5441 100644 --- a/cura/CuraVersion.py.in +++ b/cura/CuraVersion.py.in @@ -5,3 +5,4 @@ CuraVersion = "@CURA_VERSION@" CuraBuildType = "@CURA_BUILDTYPE@" CuraDebugMode = True if "@_cura_debugmode@" == "ON" else False CuraPackagesVersion = "@CURA_PACKAGES_VERSION@" +CuraCloudAPIRoot = "@CURA_CLOUD_API_ROOT@" From fae9bc838b4a9cb8d293b3785db5f5da4ce290c0 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 30 May 2018 09:18:43 +0200 Subject: [PATCH 29/39] Update CURA_* setups in CuraVersion.py.in and CMakeLists.txt CURA-5357 --- CMakeLists.txt | 5 +++-- cura/CuraVersion.py.in | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 079b44890a..9e9bf4b538 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,8 +19,9 @@ endif() set(CURA_VERSION "master" CACHE STRING "Version name of Cura") set(CURA_BUILDTYPE "" CACHE STRING "Build type of Cura, eg. 'PPA'") -set(CURA_PACKAGES_VERSION "" CACHE STRING "Packages version of Cura") -set(CURA_CLOUD_API_ROOT "" CACHE STRING "Alternative cloud API root of Cura") +set(CURA_SDK_VERSION "" CACHE STRING "SDK version of Cura") +set(CURA_CLOUD_API_ROOT "" CACHE STRING "Alternative Cura cloud API root") +set(CURA_CLOUD_API_VERSION "" CACHE STRING "Alternative Cura cloud API version") configure_file(${CMAKE_SOURCE_DIR}/cura.desktop.in ${CMAKE_BINARY_DIR}/cura.desktop @ONLY) configure_file(cura/CuraVersion.py.in CuraVersion.py @ONLY) diff --git a/cura/CuraVersion.py.in b/cura/CuraVersion.py.in index 3077ad5441..226b2183f2 100644 --- a/cura/CuraVersion.py.in +++ b/cura/CuraVersion.py.in @@ -4,5 +4,6 @@ CuraVersion = "@CURA_VERSION@" CuraBuildType = "@CURA_BUILDTYPE@" CuraDebugMode = True if "@_cura_debugmode@" == "ON" else False -CuraPackagesVersion = "@CURA_PACKAGES_VERSION@" +CuraSDKVersion = "@CURA_SDK_VERSION@" CuraCloudAPIRoot = "@CURA_CLOUD_API_ROOT@" +CuraCloudAPIVersion = "@CURA_CLOUD_API_VERSION@" From f1bb0e58e725d884a1d56cf5d7eeffff3372d388 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Wed, 30 May 2018 09:20:00 +0200 Subject: [PATCH 30/39] Do not use CuraVersion data if strings are empty CURA-5357 --- plugins/Toolbox/src/Toolbox.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index b9e7f8f94d..b019dfccbe 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -175,6 +175,8 @@ class Toolbox(QObject, Extension): return self.DEFAULT_CLOUD_API_ROOT if not hasattr(cura.CuraVersion, "CuraCloudAPIRoot"): return self.DEFAULT_CLOUD_API_ROOT + if not cura.CuraVersion.CuraCloudAPIRoot: + return self.DEFAULT_CLOUD_API_ROOT return cura.CuraVersion.CuraCloudAPIRoot # Get the cloud API version from CuraVersion @@ -183,6 +185,8 @@ class Toolbox(QObject, Extension): return self.DEFAULT_CLOUD_API_VERSION if not hasattr(cura.CuraVersion, "CuraCloudAPIVersion"): return self.DEFAULT_CLOUD_API_VERSION + if not cura.CuraVersion.CuraCloudAPIVersion: + return self.DEFAULT_CLOUD_API_VERSION return cura.CuraVersion.CuraCloudAPIVersion # Get the packages version depending on Cura version settings. @@ -191,6 +195,8 @@ class Toolbox(QObject, Extension): return self._plugin_registry.APIVersion if not hasattr(cura.CuraVersion, "CuraSDKVersion"): return self._plugin_registry.APIVersion + if not cura.CuraVersion.CuraSDKVersion: + return self._plugin_registry.APIVersion return cura.CuraVersion.CuraSDKVersion @pyqtSlot() From a616e923676a48cf36e3a4511c55630341a1ebda Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 30 May 2018 09:44:33 +0200 Subject: [PATCH 31/39] CURA-5357 fix boo boo, rename variable --- resources/qml/Cura.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index b8f289278c..dce106e219 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -338,7 +338,7 @@ UM.MainWindow } else { - others.push(filename); + nonPackages.push(filename); } } openDialog.handleOpenFileUrls(nonPackages); From 3395610b677e8be30f116a411e722a910b86a30a Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 30 May 2018 09:44:33 +0200 Subject: [PATCH 32/39] CURA-5357 fix boo boo, rename variable --- resources/qml/Cura.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index b8f289278c..dce106e219 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -338,7 +338,7 @@ UM.MainWindow } else { - others.push(filename); + nonPackages.push(filename); } } openDialog.handleOpenFileUrls(nonPackages); From 6ea5924c95f8b8a2d6521d35df3568b146c5f73f Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 30 May 2018 10:35:50 +0200 Subject: [PATCH 33/39] Remove Try Multiple Line Thicknesses setting This setting is now always enabled, hard-coded in the engine. --- resources/definitions/fdmprinter.def.json | 8 -------- 1 file changed, 8 deletions(-) diff --git a/resources/definitions/fdmprinter.def.json b/resources/definitions/fdmprinter.def.json index b3932de827..5ad478bfc3 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -6678,14 +6678,6 @@ "type": "float", "enabled": "bridge_settings_enabled and bridge_enable_more_layers", "settable_per_mesh": true - }, - "wall_try_line_thickness": - { - "label": "Try Multiple Line Thicknesses", - "description": "When creating inner walls, try various line thicknesses to fit the wall lines better in narrow spaces. This reduces or increases the inner wall line width by up to 0.01mm.", - "default_value": false, - "type": "bool", - "settable_per_mesh": true } } }, From ed0a0dd7651d90c271b87b05e87427253a2d0583 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Wed, 30 May 2018 10:58:19 +0200 Subject: [PATCH 34/39] Fix multiply object in a rare case that an object is just too big --- cura/MultiplyObjectsJob.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cura/MultiplyObjectsJob.py b/cura/MultiplyObjectsJob.py index 46f7f56f8a..af24036eeb 100644 --- a/cura/MultiplyObjectsJob.py +++ b/cura/MultiplyObjectsJob.py @@ -1,6 +1,8 @@ -# Copyright (c) 2017 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. +import copy + from UM.Job import Job from UM.Operations.GroupedOperation import GroupedOperation from UM.Message import Message @@ -64,6 +66,8 @@ class MultiplyObjectsJob(Job): # We do place the nodes one by one, as we want to yield in between. if not node_too_big: new_node, solution_found = arranger.findNodePlacement(current_node, offset_shape_arr, hull_shape_arr) + else: + new_node = copy.deepcopy(node) if node_too_big or not solution_found: found_solution_for_all = False new_location = new_node.getPosition() From 86d4f0583cccb869978084a67c6093267c2356fc Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 30 May 2018 13:15:32 +0200 Subject: [PATCH 35/39] Make showing of support density image dependent on support pattern Because that's what it's actually depending on. Contributes to issue CURA-4513. --- 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 5ad478bfc3..25fe841ee4 100644 --- a/resources/definitions/fdmprinter.def.json +++ b/resources/definitions/fdmprinter.def.json @@ -5812,7 +5812,7 @@ "description": "The file location of an image of which the brightness values determine the minimal density at the corresponding location in the support.", "type": "str", "default_value": "", - "enabled": "infill_pattern == 'cross' or infill_pattern == 'cross_3d'", + "enabled": "support_pattern == 'cross' or support_pattern == 'cross_3d'", "limit_to_extruder": "support_infill_extruder_nr", "settable_per_mesh": false, "settable_per_extruder": true From 00fe18008586fb33aeed1df9dc684f5f5d35d113 Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Wed, 30 May 2018 16:29:55 +0200 Subject: [PATCH 36/39] Hide Toolbox Showcase & Materials for 3.4 --- plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml | 4 ++++ plugins/Toolbox/resources/qml/ToolboxHeader.qml | 3 +++ 2 files changed, 7 insertions(+) diff --git a/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml b/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml index 170fd10fc7..69e508cd55 100644 --- a/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml +++ b/plugins/Toolbox/resources/qml/ToolboxDownloadsPage.qml @@ -18,6 +18,8 @@ ScrollView spacing: UM.Theme.getSize("default_margin").height padding: UM.Theme.getSize("wide_margin").height height: childrenRect.height + 2 * padding + + /* Hide for 3.4 ToolboxDownloadsShowcase { id: showcase @@ -29,6 +31,8 @@ ScrollView width: parent.width height: UM.Theme.getSize("default_lining").height } + */ + ToolboxDownloadsGrid { id: allPlugins diff --git a/plugins/Toolbox/resources/qml/ToolboxHeader.qml b/plugins/Toolbox/resources/qml/ToolboxHeader.qml index 88495e3f63..ee4241beaf 100644 --- a/plugins/Toolbox/resources/qml/ToolboxHeader.qml +++ b/plugins/Toolbox/resources/qml/ToolboxHeader.qml @@ -33,6 +33,8 @@ Item toolbox.viewPage = "overview" } } + + /* Hide for 3.4 ToolboxTabButton { text: catalog.i18nc("@title:tab", "Materials") @@ -45,6 +47,7 @@ Item toolbox.viewPage = "overview" } } + */ } ToolboxTabButton { From 33e49bebbed34cc7a18eab33ab0f38ba2fd140d7 Mon Sep 17 00:00:00 2001 From: Ruben D Date: Thu, 31 May 2018 10:59:17 +0200 Subject: [PATCH 37/39] Don't connect when aborting while the signal is not yet connected Do this using try-except so that it is thread safe. --- plugins/Toolbox/src/Toolbox.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index b019dfccbe..13daeced2c 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -404,7 +404,10 @@ class Toolbox(QObject, Extension): def resetDownload(self) -> None: if self._download_reply: - self._download_reply.downloadProgress.disconnect(self._onDownloadProgress) + try: + self._download_reply.downloadProgress.disconnect(self._onDownloadProgress) + except TypeError: #Raised when the method is not connected to the signal yet. + pass #Don't need to disconnect. self._download_reply.abort() self._download_reply = None self._download_request = None From 416f695610ffc931e8517b5998a0002cab99abb8 Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Thu, 31 May 2018 11:52:36 +0200 Subject: [PATCH 38/39] Canceling sending job to cluster no longer results in "still sending print" message. Previously it would always show this, requiring a restart of Cura before print could be sent. CL-913 --- plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py | 4 ++++ plugins/UM3NetworkPrinting/PrintWindow.qml | 1 + 2 files changed, 5 insertions(+) diff --git a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py index 282d507e09..4c63115bb4 100644 --- a/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py +++ b/plugins/UM3NetworkPrinting/ClusterUM3OutputDevice.py @@ -148,6 +148,10 @@ class ClusterUM3OutputDevice(NetworkedPrinterOutputDevice): def selectPrinter(self, target_printer: str = "") -> None: self._sending_job.send(target_printer) + @pyqtSlot() + def cancelPrintSelection(self) -> None: + self._sending_gcode = False + ## Greenlet to send a job to the printer over the network. # # This greenlet gets called asynchronously in requestWrite. It is a diff --git a/plugins/UM3NetworkPrinting/PrintWindow.qml b/plugins/UM3NetworkPrinting/PrintWindow.qml index 5b011d98c4..0553db0eb2 100644 --- a/plugins/UM3NetworkPrinting/PrintWindow.qml +++ b/plugins/UM3NetworkPrinting/PrintWindow.qml @@ -90,6 +90,7 @@ UM.Dialog onClicked: { base.visible = false; printerSelectionCombobox.currentIndex = 0 + OutputDevice.cancelPrintSelection() } } ] From a468fc2cc4a42778c137b11029b8dfb3bfc8032c Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 31 May 2018 12:21:51 +0200 Subject: [PATCH 39/39] Only load loading.gif when needed Toolbox crashes on Mac OS X due to reaching the max limit of file handlers. This seems to be caused by the loading the "loading.gif" animation image. Probably because many widgets are created and each of them has an animation image, and Qt (5.8?) seems to load everything at the same time. --- plugins/Toolbox/resources/qml/ToolboxProgressButton.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml b/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml index b598bd96d0..2744e40ec9 100644 --- a/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml +++ b/plugins/Toolbox/resources/qml/ToolboxProgressButton.qml @@ -150,7 +150,7 @@ Item { id: loader visible: active - source: "../images/loading.gif" + source: visible ? "../images/loading.gif" : "" width: UM.Theme.getSize("toolbox_loader").width height: UM.Theme.getSize("toolbox_loader").height anchors.right: button.left