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/14] 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/14] 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/14] 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/14] 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/14] 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/14] 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/14] 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/14] 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/14] 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/14] 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/14] 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/14] 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/14] 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/14] 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