From 3a979903aa5fe0a0a6346244a982356d0e6e27ff Mon Sep 17 00:00:00 2001 From: John Hryb IV Date: Tue, 19 Feb 2019 23:40:36 -0500 Subject: [PATCH 01/30] PostProcessingPlugin Script for 2-1 Dual Extruders - ColorMix 2-1 Marlin Commands: M163 - Set Mix Factor M164 - Save Mix Ability to set a mix ratio or blend at a defined layer or distance. Based on Geeetech's Color mixing software. --- .../PostProcessingPlugin/scripts/ColorMix.py | 190 ++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 plugins/PostProcessingPlugin/scripts/ColorMix.py diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py new file mode 100644 index 0000000000..af64ea2764 --- /dev/null +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -0,0 +1,190 @@ +# 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. +# This script is licensed under the Creative Commons - Attribution - Share Alike (CC BY-SA) terms + +#Authors of the 2-1 ColorMix plug-in / script: +# Written by John Hryb - john.hryb.4@gmail.com + +##history / change-log: +##V1.0.0 + +## Uses - +## M163 - Set Mix Factor +## M164 - Save Mix - saves to T3 as a unique mix + +import re #To perform the search and replace. +from ..Script import Script + +class ColorMix(Script): + def __init__(self): + super().__init__() + + def getSettingDataString(self): + return """{ + "name":"ColorMix 2-1", + "key":"ColorMix 2-1", + "metadata": {}, + "version": 2, + "settings": + { + "a_unitsOfMeasurement": + { + "label": "Units of measurement", + "description": "Input value as mm or layer number.", + "type": "enum", + "options": {"mm":"mm","layer":"Layer"}, + "default_value": "layer" + }, + "b_start_height": + { + "label": "Start Height", + "description": "Value to start at (mm or layer)", + "type": "float", + "default_value": 0, + "minimum_value": "0" + }, + "c_behavior": + { + "label": "Fixed or blend", + "description": "Select Fixed (set new mixture) or Blend mode (dynamic mix)", + "type": "enum", + "options": {"fixed_value":"Fixed","blend_value":"Blend"}, + "default_value": "fixed_value" + }, + "d_finish_height": + { + "label": "Finish Height", + "description": "Value to stop at (mm or layer)", + "type": "float", + "default_value": 0, + "minimum_value": "0", + "minimum_value_warning": "0.1", + "enabled": "c_behavior == 'blend_value'" + }, + "e_mix_start": + { + "label": "Start mix ratio", + "description": "First extruder percentage 0-100", + "type": "float", + "default_value": 100, + "minimum_value": "0", + "minimum_value_warning": "0", + "maximum_value_warning": "100" + }, + "f_mix_finish": + { + "label": "End mix ratio", + "description": "First extruder percentage 0-100 to finish blend", + "type": "float", + "default_value": 0, + "minimum_value": "0", + "minimum_value_warning": "0", + "maximum_value_warning": "100", + "enabled": "c_behavior == 'blend_value'" + }, + "g_notes": + { + "label": "Notes", + "description": "A spot to put a note", + "type": "str", + "default_value": "" + } + } + }""" + def getValue(self, line, key, default = None): #replace default getvalue due to comment-reading feature + if not key in line or (";" in line and line.find(key) > line.find(";") and + not ";ChangeAtZ" in key and not ";LAYER:" in key): + return default + subPart = line[line.find(key) + len(key):] #allows for string lengths larger than 1 + if ";ChangeAtZ" in key: + m = re.search("^[0-4]", subPart) + elif ";LAYER:" in key: + m = re.search("^[+-]?[0-9]*", subPart) + else: + #the minus at the beginning allows for negative values, e.g. for delta printers + m = re.search("^[-]?[0-9]*\.?[0-9]*", subPart) + if m == None: + return default + try: + return float(m.group(0)) + except: + return default + + def execute(self, data): + #get user variables + firstHeight = 0.0 + secondHeight = 0.0 + firstMix = 0.0 + SecondMix = 0.0 + + firstHeight = self.getSettingValueByKey("b_start_height") + secondHeight = self.getSettingValueByKey("d_finish_height") + firstMix = self.getSettingValueByKey("e_mix_start") + SecondMix = self.getSettingValueByKey("f_mix_finish") + + #locals + layer = 0 + + #get layer height + layerHeight = .2 + for active_layer in data: + lines = active_layer.split("\n") + for line in lines: + if ";Layer height: " in line: + layerHeight = self.getValue(line, ";Layer height: ", layerHeight) + break + #get layers to use + startLayer = 0 + endLayer = 0 + if self.getSettingValueByKey("a_unitsOfMeasurement") == "mm": + if firstHeight == 0: + startLayer = 0 + else: + startLayer = firstHeight / layerHeight + if secondHeight == 0: + endLayer = 0 + else: + endLayer = secondHeight / layerHeight + else: #layer height + startLayer = firstHeight + endLayer = secondHeight + #see if one-shot + if self.getSettingValueByKey("c_behavior") == "fixed_value": + endLayer = startLayer + firstExtruderIncrements = 0 + else: #blend + firstExtruderIncrements = (SecondMix - firstMix) / (endLayer - startLayer) + firstExtruderValue = 0 + index = 0 + #start scanning + for active_layer in data: + modified_gcode = "" + lineIndex = 0; + lines = active_layer.split("\n") + for line in lines: + #dont leave blanks + if line != "": + modified_gcode += line + "\n" + # find current layer + if ";LAYER:" in line: + layer = self.getValue(line, ";LAYER:", layer) + if (layer >= startLayer) and (layer <= endLayer): #find layers of interest + if lines[lineIndex + 4] == "T2": #check if needing to delete old data + del lines[(lineIndex + 1):(lineIndex + 5)] + firstExtruderValue = int(((layer - startLayer) * firstExtruderIncrements) + firstMix) + if firstExtruderValue == 100: + modified_gcode += "M163 S0 P1\n" + modified_gcode += "M163 S1 P0\n" + elif firstExtruderValue == 0: + modified_gcode += "M163 S0 P0\n" + modified_gcode += "M163 S1 P1\n" + else: + modified_gcode += "M163 S0 P0.{:02d}\n".format(firstExtruderValue) + modified_gcode += "M163 S1 P0.{:02d}\n".format(100 - firstExtruderValue) + modified_gcode += "M164 S2\n" + modified_gcode += "T2\n" + lineIndex += 1 #for deleting index + data[index] = modified_gcode + index += 1 + return data \ No newline at end of file From 9fae1f29b15f77bfc17a4b2a36cd57ba3d30b1b6 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sat, 9 Mar 2019 20:40:11 -0500 Subject: [PATCH 02/30] Update plugins/PostProcessingPlugin/scripts/ColorMix.py Sure Co-Authored-By: Hrybmo --- plugins/PostProcessingPlugin/scripts/ColorMix.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index af64ea2764..a923918caa 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -28,7 +28,7 @@ class ColorMix(Script): "version": 2, "settings": { - "a_unitsOfMeasurement": + "measurement_units": { "label": "Units of measurement", "description": "Input value as mm or layer number.", @@ -187,4 +187,4 @@ class ColorMix(Script): lineIndex += 1 #for deleting index data[index] = modified_gcode index += 1 - return data \ No newline at end of file + return data From 7921b89f3e44109471f9c1c0d87d6527c88131ff Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sat, 9 Mar 2019 20:40:36 -0500 Subject: [PATCH 03/30] Update plugins/PostProcessingPlugin/scripts/ColorMix.py Sure Co-Authored-By: Hrybmo --- plugins/PostProcessingPlugin/scripts/ColorMix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index a923918caa..766a81efd8 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -36,7 +36,7 @@ class ColorMix(Script): "options": {"mm":"mm","layer":"Layer"}, "default_value": "layer" }, - "b_start_height": + "start_height": { "label": "Start Height", "description": "Value to start at (mm or layer)", From 986f9aa248271bb2ad66d77775d2551f16aef79d Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sat, 9 Mar 2019 20:41:00 -0500 Subject: [PATCH 04/30] Update plugins/PostProcessingPlugin/scripts/ColorMix.py Sure Co-Authored-By: Hrybmo --- plugins/PostProcessingPlugin/scripts/ColorMix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index 766a81efd8..1dc2796c8b 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -44,7 +44,7 @@ class ColorMix(Script): "default_value": 0, "minimum_value": "0" }, - "c_behavior": + "behavior": { "label": "Fixed or blend", "description": "Select Fixed (set new mixture) or Blend mode (dynamic mix)", From ad820ad1e99f90fa2be12befb71e3e73b7f2de00 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sat, 9 Mar 2019 20:41:35 -0500 Subject: [PATCH 05/30] Update plugins/PostProcessingPlugin/scripts/ColorMix.py Okay Co-Authored-By: Hrybmo --- plugins/PostProcessingPlugin/scripts/ColorMix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index 1dc2796c8b..7d36ee60fd 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -52,7 +52,7 @@ class ColorMix(Script): "options": {"fixed_value":"Fixed","blend_value":"Blend"}, "default_value": "fixed_value" }, - "d_finish_height": + "finish_height": { "label": "Finish Height", "description": "Value to stop at (mm or layer)", From 8086adf9ba63b6fb3ec18fffa1cac2401eb3f60f Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sat, 9 Mar 2019 20:41:54 -0500 Subject: [PATCH 06/30] Update plugins/PostProcessingPlugin/scripts/ColorMix.py Okay Co-Authored-By: Hrybmo --- plugins/PostProcessingPlugin/scripts/ColorMix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index 7d36ee60fd..4ffb17b2a5 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -62,7 +62,7 @@ class ColorMix(Script): "minimum_value_warning": "0.1", "enabled": "c_behavior == 'blend_value'" }, - "e_mix_start": + "mix_start_ratio": { "label": "Start mix ratio", "description": "First extruder percentage 0-100", From 87154238a18fc80dafd3a474f420f4fb9bc51f87 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sat, 9 Mar 2019 20:42:40 -0500 Subject: [PATCH 07/30] Update plugins/PostProcessingPlugin/scripts/ColorMix.py Okay Co-Authored-By: Hrybmo --- plugins/PostProcessingPlugin/scripts/ColorMix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index 4ffb17b2a5..8a89c3bc20 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -72,7 +72,7 @@ class ColorMix(Script): "minimum_value_warning": "0", "maximum_value_warning": "100" }, - "f_mix_finish": + "mix_finish_ratio": { "label": "End mix ratio", "description": "First extruder percentage 0-100 to finish blend", From 151d40664f28730bd84f780b88d263bdda5e9f71 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sat, 9 Mar 2019 20:45:18 -0500 Subject: [PATCH 08/30] Update plugins/PostProcessingPlugin/scripts/ColorMix.py It's not functional, just a spot to put info if needed. Co-Authored-By: Hrybmo --- plugins/PostProcessingPlugin/scripts/ColorMix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index 8a89c3bc20..e12b011ab2 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -83,7 +83,7 @@ class ColorMix(Script): "maximum_value_warning": "100", "enabled": "c_behavior == 'blend_value'" }, - "g_notes": + "notes": { "label": "Notes", "description": "A spot to put a note", From 186e715d1657764559c3e58752af3b3bc0ff5c2b Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sat, 9 Mar 2019 20:45:34 -0500 Subject: [PATCH 09/30] Update plugins/PostProcessingPlugin/scripts/ColorMix.py Okay Co-Authored-By: Hrybmo --- plugins/PostProcessingPlugin/scripts/ColorMix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index e12b011ab2..252384473f 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -118,7 +118,7 @@ class ColorMix(Script): firstMix = 0.0 SecondMix = 0.0 - firstHeight = self.getSettingValueByKey("b_start_height") + firstHeight = self.getSettingValueByKey("start_height") secondHeight = self.getSettingValueByKey("d_finish_height") firstMix = self.getSettingValueByKey("e_mix_start") SecondMix = self.getSettingValueByKey("f_mix_finish") From fadc8bb6243bb6a6c66a805cbec44409c89a90c8 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sat, 9 Mar 2019 20:45:49 -0500 Subject: [PATCH 10/30] Update plugins/PostProcessingPlugin/scripts/ColorMix.py Sure Co-Authored-By: Hrybmo --- plugins/PostProcessingPlugin/scripts/ColorMix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index 252384473f..bb94b066df 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -119,7 +119,7 @@ class ColorMix(Script): SecondMix = 0.0 firstHeight = self.getSettingValueByKey("start_height") - secondHeight = self.getSettingValueByKey("d_finish_height") + secondHeight = self.getSettingValueByKey("finish_height") firstMix = self.getSettingValueByKey("e_mix_start") SecondMix = self.getSettingValueByKey("f_mix_finish") From d19f1f497a308ec8085864863ecedf6f9dd6f9bd Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sat, 9 Mar 2019 20:46:00 -0500 Subject: [PATCH 11/30] Update plugins/PostProcessingPlugin/scripts/ColorMix.py Okay Co-Authored-By: Hrybmo --- plugins/PostProcessingPlugin/scripts/ColorMix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index bb94b066df..888ac6dd9a 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -120,7 +120,7 @@ class ColorMix(Script): firstHeight = self.getSettingValueByKey("start_height") secondHeight = self.getSettingValueByKey("finish_height") - firstMix = self.getSettingValueByKey("e_mix_start") + firstMix = self.getSettingValueByKey("mix_start_ratio") SecondMix = self.getSettingValueByKey("f_mix_finish") #locals From 0875498a1266c628cbd451f89342aef31ccd88b7 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sat, 9 Mar 2019 20:46:20 -0500 Subject: [PATCH 12/30] Update plugins/PostProcessingPlugin/scripts/ColorMix.py Sure Co-Authored-By: Hrybmo --- plugins/PostProcessingPlugin/scripts/ColorMix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index 888ac6dd9a..9cc9b703d0 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -121,7 +121,7 @@ class ColorMix(Script): firstHeight = self.getSettingValueByKey("start_height") secondHeight = self.getSettingValueByKey("finish_height") firstMix = self.getSettingValueByKey("mix_start_ratio") - SecondMix = self.getSettingValueByKey("f_mix_finish") + SecondMix = self.getSettingValueByKey("mix_finish_ratio") #locals layer = 0 From 3b763e5552aa94e1f7951bb97360dca8ee4bcdee Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sat, 9 Mar 2019 20:46:34 -0500 Subject: [PATCH 13/30] Update plugins/PostProcessingPlugin/scripts/ColorMix.py OKay Co-Authored-By: Hrybmo --- plugins/PostProcessingPlugin/scripts/ColorMix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index 9cc9b703d0..4a2ff718bb 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -137,7 +137,7 @@ class ColorMix(Script): #get layers to use startLayer = 0 endLayer = 0 - if self.getSettingValueByKey("a_unitsOfMeasurement") == "mm": + if self.getSettingValueByKey("measurement_units") == "mm": if firstHeight == 0: startLayer = 0 else: From 1eb1bce583bfcb7259a982c493fde9561c4bfca2 Mon Sep 17 00:00:00 2001 From: Diego Prado Gesto Date: Sat, 9 Mar 2019 20:46:54 -0500 Subject: [PATCH 14/30] Update plugins/PostProcessingPlugin/scripts/ColorMix.py Okay Co-Authored-By: Hrybmo --- plugins/PostProcessingPlugin/scripts/ColorMix.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index 4a2ff718bb..1152ba70da 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -150,7 +150,7 @@ class ColorMix(Script): startLayer = firstHeight endLayer = secondHeight #see if one-shot - if self.getSettingValueByKey("c_behavior") == "fixed_value": + if self.getSettingValueByKey("behavior") == "fixed_value": endLayer = startLayer firstExtruderIncrements = 0 else: #blend From da1a5d1be649673f922c0c13cd9fdae7caf0395e Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Tue, 10 Dec 2019 14:44:31 +0100 Subject: [PATCH 15/30] Log error on failed machine creation An error message will be generated when machine creation fails while switching printer types in the printer configuration menu. CURA-6127 --- cura/Settings/MachineManager.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index de6e270a86..f8e609af77 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1241,6 +1241,7 @@ class MachineManager(QObject): if not new_machine: new_machine = CuraStackBuilder.createMachine(machine_definition_id + "_sync", machine_definition_id) if not new_machine: + Logger.log("e", "Failed to create new machine when switching configuration.") return for metadata_key in self._global_container_stack.getMetaData(): From da6d4e618624c535764cd29bb0e0fc196ae24bad Mon Sep 17 00:00:00 2001 From: Nino van Hooff Date: Tue, 10 Dec 2019 15:57:15 +0100 Subject: [PATCH 16/30] Log app display name, version, api version and build type when starting Only build type was requested, but I figured: why not all the things? Also fixes an arg typo CURA-7011 --- cura/CuraApplication.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index ef5f987b85..0e80ff4c61 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -170,7 +170,7 @@ class CuraApplication(QtApplication): app_display_name = ApplicationMetadata.CuraAppDisplayName, version = ApplicationMetadata.CuraVersion, api_version = ApplicationMetadata.CuraSDKVersion, - buildtype = ApplicationMetadata.CuraBuildType, + build_type = ApplicationMetadata.CuraBuildType, is_debug_mode = ApplicationMetadata.CuraDebugMode, tray_icon_name = "cura-icon-32.png", **kwargs) From d09f3492dbb9f9b99fc43cb02b51347ba0752596 Mon Sep 17 00:00:00 2001 From: Nino van Hooff Date: Tue, 10 Dec 2019 15:59:57 +0100 Subject: [PATCH 17/30] Add enterprise splash screen. Added it as a png, which might be a bit overkill but it could also could be hard getting strokes / shadows exactly right otherwise. Also Allows for more visual distinction of the background later CURA-7011 --- cura/UI/CuraSplashScreen.py | 18 +++++++++++------- resources/images/cura_enterprise.png | Bin 0 -> 28000 bytes 2 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 resources/images/cura_enterprise.png diff --git a/cura/UI/CuraSplashScreen.py b/cura/UI/CuraSplashScreen.py index 05231c106d..c979553ca1 100644 --- a/cura/UI/CuraSplashScreen.py +++ b/cura/UI/CuraSplashScreen.py @@ -7,14 +7,21 @@ from PyQt5.QtWidgets import QSplashScreen from UM.Resources import Resources from UM.Application import Application +from cura import ApplicationMetadata class CuraSplashScreen(QSplashScreen): def __init__(self): super().__init__() self._scale = 0.7 + self._version_y_offset = 0 # when extra visual elements are in the background image, move version text down + + if ApplicationMetadata.IsEnterpriseVersion: + splash_image = QPixmap(Resources.getPath(Resources.Images, "cura_enterprise.png")) + self._version_y_offset = 32 + else: + splash_image = QPixmap(Resources.getPath(Resources.Images, "cura.png")) - splash_image = QPixmap(Resources.getPath(Resources.Images, "cura.png")) self.setPixmap(splash_image) self._current_message = "" @@ -52,20 +59,17 @@ class CuraSplashScreen(QSplashScreen): painter.setRenderHint(QPainter.Antialiasing, True) version = Application.getInstance().getVersion().split("-") - buildtype = Application.getInstance().getBuildType() - if buildtype: - version[0] += " (%s)" % buildtype # Draw version text font = QFont() # Using system-default font here - font.setPixelSize(37) + font.setPixelSize(18) painter.setFont(font) - painter.drawText(60, 66, 330 * self._scale, 230 * self._scale, Qt.AlignLeft | Qt.AlignTop, version[0]) + painter.drawText(60, 66 + self._version_y_offset, 330 * self._scale, 230 * self._scale, Qt.AlignLeft | Qt.AlignTop, version[0]) if len(version) > 1: font.setPixelSize(16) painter.setFont(font) painter.setPen(QColor(200, 200, 200, 255)) - painter.drawText(247, 105, 330 * self._scale, 255 * self._scale, Qt.AlignLeft | Qt.AlignTop, version[1]) + painter.drawText(247, 105 + self._version_y_offset, 330 * self._scale, 255 * self._scale, Qt.AlignLeft | Qt.AlignTop, version[1]) painter.setPen(QColor(255, 255, 255, 255)) # Draw the loading image diff --git a/resources/images/cura_enterprise.png b/resources/images/cura_enterprise.png new file mode 100644 index 0000000000000000000000000000000000000000..0b24223a0badcc7a758da013e26cd27f120c15e7 GIT binary patch literal 28000 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 Date: Tue, 10 Dec 2019 16:27:30 +0100 Subject: [PATCH 18/30] Update enterprise splash screen background CURA-7011 --- cura/UI/CuraSplashScreen.py | 4 ++-- resources/images/cura_enterprise.png | Bin 28000 -> 28320 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/UI/CuraSplashScreen.py b/cura/UI/CuraSplashScreen.py index c979553ca1..70df454e7d 100644 --- a/cura/UI/CuraSplashScreen.py +++ b/cura/UI/CuraSplashScreen.py @@ -18,7 +18,7 @@ class CuraSplashScreen(QSplashScreen): if ApplicationMetadata.IsEnterpriseVersion: splash_image = QPixmap(Resources.getPath(Resources.Images, "cura_enterprise.png")) - self._version_y_offset = 32 + self._version_y_offset = 26 else: splash_image = QPixmap(Resources.getPath(Resources.Images, "cura.png")) @@ -64,7 +64,7 @@ class CuraSplashScreen(QSplashScreen): font = QFont() # Using system-default font here font.setPixelSize(18) painter.setFont(font) - painter.drawText(60, 66 + self._version_y_offset, 330 * self._scale, 230 * self._scale, Qt.AlignLeft | Qt.AlignTop, version[0]) + painter.drawText(60, 70 + self._version_y_offset, 330 * self._scale, 230 * self._scale, Qt.AlignLeft | Qt.AlignTop, version[0]) if len(version) > 1: font.setPixelSize(16) painter.setFont(font) diff --git a/resources/images/cura_enterprise.png b/resources/images/cura_enterprise.png index 0b24223a0badcc7a758da013e26cd27f120c15e7..789e0ae215ccce4dd7c6426d1c9b32d01ffe27e8 100644 GIT binary patch literal 28320 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 bUJmGZMdyzZ2fi9k{~_n;!CRQa4N3R~E9shl literal 28000 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 Date: Wed, 11 Dec 2019 11:55:25 +0100 Subject: [PATCH 19/30] Connect materialsChanged signal for printers without variants Fixes duplicated materials not showing up for third party printers CURA-7012 --- cura/Machines/MachineNode.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cura/Machines/MachineNode.py b/cura/Machines/MachineNode.py index 92f71b409b..cee71160d2 100644 --- a/cura/Machines/MachineNode.py +++ b/cura/Machines/MachineNode.py @@ -162,6 +162,7 @@ class MachineNode(ContainerNode): container_registry = ContainerRegistry.getInstance() if not self.has_variants: self.variants["empty"] = VariantNode("empty_variant", machine = self) + self.variants["empty"].materialsChanged.connect(self.materialsChanged) else: # Find all the variants for this definition ID. variants = container_registry.findInstanceContainersMetadata(type = "variant", definition = self.container_id, hardware_type = "nozzle") From 2e4ee73d2fa172035e117695e7b549f8501db93b Mon Sep 17 00:00:00 2001 From: Nino van Hooff Date: Wed, 11 Dec 2019 16:21:35 +0100 Subject: [PATCH 20/30] Add "Enterprise" to the app display name. Will also end up in the main window title and at the top of the debug log. app_name remains unchanged. CURA-7011 --- cura/ApplicationMetadata.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/cura/ApplicationMetadata.py b/cura/ApplicationMetadata.py index 427cc77e65..eb6ab66296 100644 --- a/cura/ApplicationMetadata.py +++ b/cura/ApplicationMetadata.py @@ -22,13 +22,6 @@ try: except ImportError: CuraAppName = DEFAULT_CURA_APP_NAME -try: - from cura.CuraVersion import CuraAppDisplayName # type: ignore - if CuraAppDisplayName == "": - CuraAppDisplayName = DEFAULT_CURA_DISPLAY_NAME -except ImportError: - CuraAppDisplayName = DEFAULT_CURA_DISPLAY_NAME - try: from cura.CuraVersion import CuraVersion # type: ignore if CuraVersion == "": @@ -53,3 +46,13 @@ except ImportError: # Various convenience flags indicating what kind of Cura build it is. __ENTERPRISE_VERSION_TYPE = "enterprise" IsEnterpriseVersion = CuraBuildType.lower() == __ENTERPRISE_VERSION_TYPE + +try: + from cura.CuraVersion import CuraAppDisplayName # type: ignore + if CuraAppDisplayName == "": + if IsEnterpriseVersion: + CuraAppDisplayName = DEFAULT_CURA_DISPLAY_NAME + " Enterprise" + else: + CuraAppDisplayName = DEFAULT_CURA_DISPLAY_NAME +except ImportError: + CuraAppDisplayName = DEFAULT_CURA_DISPLAY_NAME From 171609f9de311736c5a9e6f30235ce330664a074 Mon Sep 17 00:00:00 2001 From: Nino van Hooff Date: Wed, 11 Dec 2019 16:25:57 +0100 Subject: [PATCH 21/30] Refactor: Add "Enterprise" to the app display name. CURA-7011 --- cura/ApplicationMetadata.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cura/ApplicationMetadata.py b/cura/ApplicationMetadata.py index eb6ab66296..01e6769d8e 100644 --- a/cura/ApplicationMetadata.py +++ b/cura/ApplicationMetadata.py @@ -50,9 +50,9 @@ IsEnterpriseVersion = CuraBuildType.lower() == __ENTERPRISE_VERSION_TYPE try: from cura.CuraVersion import CuraAppDisplayName # type: ignore if CuraAppDisplayName == "": + CuraAppDisplayName = DEFAULT_CURA_DISPLAY_NAME if IsEnterpriseVersion: - CuraAppDisplayName = DEFAULT_CURA_DISPLAY_NAME + " Enterprise" - else: - CuraAppDisplayName = DEFAULT_CURA_DISPLAY_NAME + CuraAppDisplayName = CuraAppDisplayName + " Enterprise" + except ImportError: CuraAppDisplayName = DEFAULT_CURA_DISPLAY_NAME From fcaac91d5b33e22b3b845f03c806724d135f2ae3 Mon Sep 17 00:00:00 2001 From: Nino van Hooff Date: Wed, 11 Dec 2019 16:26:17 +0100 Subject: [PATCH 22/30] Add "Enterprise" About dialog CURA-7011 --- resources/qml/Dialogs/AboutDialog.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Dialogs/AboutDialog.qml b/resources/qml/Dialogs/AboutDialog.qml index a5622aa2c9..aa0a58aa8d 100644 --- a/resources/qml/Dialogs/AboutDialog.qml +++ b/resources/qml/Dialogs/AboutDialog.qml @@ -12,7 +12,7 @@ UM.Dialog id: base //: About dialog title - title: catalog.i18nc("@title:window","About Cura") + title: catalog.i18nc("@title:window","About " + catalog.i18nc("@title:window", CuraApplication.applicationDisplayName)) minimumWidth: 500 * screenScaleFactor minimumHeight: 650 * screenScaleFactor From e1e65b43b3ce473234ff2f9d93223e6e4718da10 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Thu, 12 Dec 2019 14:06:06 +0100 Subject: [PATCH 23/30] Remove gitlab-ci.yml --- .gitlab-ci.yml | 16 ---------------- 1 file changed, 16 deletions(-) delete mode 100644 .gitlab-ci.yml diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 6c5bc61cbe..0000000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,16 +0,0 @@ -image: registry.gitlab.com/ultimaker/cura/cura-build-environment:centos7 - -stages: - - build - -build and test linux: - stage: build - tags: - - cura - - docker - - linux - script: - - docker/build.sh - artifacts: - paths: - - build From 4d8c19ccc87c1f437ff9832588fef6fc62de3d27 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Thu, 12 Dec 2019 14:37:18 +0100 Subject: [PATCH 24/30] Always add Enterprise to name if Enterprise version. part of CURA-7011 --- cura/ApplicationMetadata.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/ApplicationMetadata.py b/cura/ApplicationMetadata.py index 01e6769d8e..8da64beead 100644 --- a/cura/ApplicationMetadata.py +++ b/cura/ApplicationMetadata.py @@ -51,8 +51,8 @@ try: from cura.CuraVersion import CuraAppDisplayName # type: ignore if CuraAppDisplayName == "": CuraAppDisplayName = DEFAULT_CURA_DISPLAY_NAME - if IsEnterpriseVersion: - CuraAppDisplayName = CuraAppDisplayName + " Enterprise" + if IsEnterpriseVersion: + CuraAppDisplayName = CuraAppDisplayName + " Enterprise" except ImportError: CuraAppDisplayName = DEFAULT_CURA_DISPLAY_NAME From e54ce8643b65597a82b6f508e5c8de4fe67a4fc4 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 13 Dec 2019 10:44:29 +0100 Subject: [PATCH 25/30] Don't wrap str unnecessarily Just an inefficiency that I found. --- plugins/UM3NetworkPrinting/src/Network/ZeroConfClient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Network/ZeroConfClient.py b/plugins/UM3NetworkPrinting/src/Network/ZeroConfClient.py index 421246fb95..205a71b5cb 100644 --- a/plugins/UM3NetworkPrinting/src/Network/ZeroConfClient.py +++ b/plugins/UM3NetworkPrinting/src/Network/ZeroConfClient.py @@ -129,7 +129,7 @@ class ZeroConfClient: type_of_device = info.properties.get(b"type", None) if type_of_device: if type_of_device == b"printer": - address = '.'.join(map(lambda n: str(n), info.address)) + address = '.'.join(map(str, info.address)) self.addedNetworkCluster.emit(str(name), address, info.properties) else: Logger.log("w", "The type of the found device is '%s', not 'printer'." % type_of_device) From 5ea60823f568a18a31fcdd8f653c1cc4235c886c Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Fri, 13 Dec 2019 10:54:01 +0100 Subject: [PATCH 26/30] Don't crash if address is still none after getting info This can happen (starting somewhere between zeroconf version 21.0 and 24.0). Contributes to issue CURA-7032. --- plugins/UM3NetworkPrinting/src/Network/ZeroConfClient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/UM3NetworkPrinting/src/Network/ZeroConfClient.py b/plugins/UM3NetworkPrinting/src/Network/ZeroConfClient.py index 205a71b5cb..bfc2725fb0 100644 --- a/plugins/UM3NetworkPrinting/src/Network/ZeroConfClient.py +++ b/plugins/UM3NetworkPrinting/src/Network/ZeroConfClient.py @@ -125,7 +125,7 @@ class ZeroConfClient: if not info.address: info = zero_conf.get_service_info(service_type, name) - if info: + if info and info.address: type_of_device = info.properties.get(b"type", None) if type_of_device: if type_of_device == b"printer": From 2b6b7a1f815212b1bf022a1cbbf5f1401704799c Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 13 Dec 2019 11:30:34 +0100 Subject: [PATCH 27/30] Fix lost settings on sync to diff printer type When syncing to a different printer type only the global user changes where kept, while the per-extruder user changes were not copied at all, since the extruder list is empty before the new machine becomes active. This commit fixes this problem by keeping a copy of the per-extruder user changes before the new machine (of different type) is activated. The copied user changes are then transfered to the new global stack after the new machine is set as active. CURA-6127 --- cura/Settings/MachineManager.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index f8e609af77..ece3e1ce92 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1257,8 +1257,19 @@ class MachineManager(QObject): new_machine.setMetaDataEntry("hidden", False) self._global_container_stack.setMetaDataEntry("hidden", True) + # The new_machine only has the global user changes and not the per-extruder user changes (since it has an empty + # extruderList before it becomes active). Keep a temporary copy of the per-extruder user changes and transfer + # it to the user changes of the new machine after the new_machine becomes active. + per_extruder_user_changes = {} + for extruder_name, extruder_stack in self._global_container_stack.extruders.items(): + per_extruder_user_changes[extruder_name] = extruder_stack.userChanges + self.setActiveMachine(new_machine.getId()) + # Apply the per-extruder userChanges to the new_machine (which is of different type than the previous one). + for extruder_name in self._global_container_stack.extruders.keys(): + self._global_container_stack.extruders[extruder_name].setUserChanges(per_extruder_user_changes[extruder_name]) + @pyqtSlot(QObject) def applyRemoteConfiguration(self, configuration: PrinterConfigurationModel) -> None: if self._global_container_stack is None: From 44e7cb7108187ccaca1b1026cf33b9ced488da45 Mon Sep 17 00:00:00 2001 From: Remco Burema Date: Fri, 13 Dec 2019 13:52:24 +0100 Subject: [PATCH 28/30] Replace deprecated code. --- cura/Settings/MachineManager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index de6e270a86..446cbff14d 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1008,9 +1008,9 @@ class MachineManager(QObject): # Set quality and quality_changes for each ExtruderStack for position, node in quality_group.nodes_for_extruders.items(): - self._global_container_stack.extruders[str(position)].quality = node.container + self._global_container_stack.extruderList[position].quality = node.container if empty_quality_changes: - self._global_container_stack.extruders[str(position)].qualityChanges = empty_quality_changes_container + self._global_container_stack.extruderList[position].qualityChanges = empty_quality_changes_container self.activeQualityGroupChanged.emit() self.activeQualityChangesGroupChanged.emit() From 9d62a281f7cc51a0173576a1dbf0662766cc32ae Mon Sep 17 00:00:00 2001 From: Jaime van Kessel Date: Fri, 13 Dec 2019 14:56:02 +0100 Subject: [PATCH 29/30] Remove unused imports --- cura/CuraApplication.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 0e80ff4c61..93f7fa97ff 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -67,11 +67,9 @@ from cura.Scene.BuildPlateDecorator import BuildPlateDecorator from cura.Scene.ConvexHullDecorator import ConvexHullDecorator from cura.Scene.CuraSceneController import CuraSceneController from cura.Scene.CuraSceneNode import CuraSceneNode -from cura.Scene.GCodeListDecorator import GCodeListDecorator + from cura.Scene.SliceableObjectDecorator import SliceableObjectDecorator from cura.Scene import ZOffsetDecorator - -from cura.Machines.ContainerTree import ContainerTree from cura.Machines.MachineErrorChecker import MachineErrorChecker from cura.Machines.Models.BuildPlateModel import BuildPlateModel From 409dc98299d15960df42c801e3ac3ae58a6e109a Mon Sep 17 00:00:00 2001 From: Kostas Karmas Date: Fri, 13 Dec 2019 15:00:22 +0100 Subject: [PATCH 30/30] Keep global settings on sync to diff printer type In addition to the per-extruder user changes, copy the global user changes to the new_machine. CURA-6127 --- cura/Settings/MachineManager.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index ece3e1ce92..989a92d8f9 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1257,16 +1257,19 @@ class MachineManager(QObject): new_machine.setMetaDataEntry("hidden", False) self._global_container_stack.setMetaDataEntry("hidden", True) - # The new_machine only has the global user changes and not the per-extruder user changes (since it has an empty - # extruderList before it becomes active). Keep a temporary copy of the per-extruder user changes and transfer - # it to the user changes of the new machine after the new_machine becomes active. + # The new_machine does not contain user changes (global or per-extruder user changes). + # Keep a temporary copy of the global and per-extruder user changes and transfer them to the user changes + # of the new machine after the new_machine becomes active. + global_user_changes = self._global_container_stack.userChanges per_extruder_user_changes = {} for extruder_name, extruder_stack in self._global_container_stack.extruders.items(): per_extruder_user_changes[extruder_name] = extruder_stack.userChanges self.setActiveMachine(new_machine.getId()) - # Apply the per-extruder userChanges to the new_machine (which is of different type than the previous one). + # Apply the global and per-extruder userChanges to the new_machine (which is of different type than the + # previous one). + self._global_container_stack.setUserChanges(global_user_changes) for extruder_name in self._global_container_stack.extruders.keys(): self._global_container_stack.extruders[extruder_name].setUserChanges(per_extruder_user_changes[extruder_name])