diff --git a/plugins/PostProcessingPlugin/scripts/ColorMix.py b/plugins/PostProcessingPlugin/scripts/ColorMix.py index 1152ba70da..28a21b952c 100644 --- a/plugins/PostProcessingPlugin/scripts/ColorMix.py +++ b/plugins/PostProcessingPlugin/scripts/ColorMix.py @@ -6,14 +6,22 @@ #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. +#history / change-log: +#V1.0.0 - Initial +#V1.1.0 - + # additions: + #Object number - To select individual models or all when using "one at a time" print sequence +#V1.2.0 + # fixed layer heights Cura starts at 1 while G-code starts at 0 + # removed notes + # changed Units of measurement to Units +#V1.2.1 + # Fixed mm bug when not in multiples of layer height +# Uses - +# M163 - Set Mix Factor +# M164 - Save Mix - saves to T2 as a unique mix + +import re #To perform the search and replace. from ..Script import Script class ColorMix(Script): @@ -22,20 +30,28 @@ class ColorMix(Script): def getSettingDataString(self): return """{ - "name":"ColorMix 2-1", + "name":"ColorMix 2-1 V1.2.1", "key":"ColorMix 2-1", "metadata": {}, "version": 2, "settings": { - "measurement_units": + "unitsOfMeasurement": { - "label": "Units of measurement", + "label": "Units", "description": "Input value as mm or layer number.", "type": "enum", "options": {"mm":"mm","layer":"Layer"}, "default_value": "layer" }, + "objectNumber": + { + "label": "Object Number", + "description": "Select model to apply to for print one at a time print sequence. 0 = everything", + "type": "int", + "default_value": 0, + "minimum_value": "0" + }, "start_height": { "label": "Start Height", @@ -59,10 +75,10 @@ class ColorMix(Script): "type": "float", "default_value": 0, "minimum_value": "0", - "minimum_value_warning": "0.1", - "enabled": "c_behavior == 'blend_value'" + "minimum_value_warning": "start_height", + "enabled": "behavior == 'blend_value'" }, - "mix_start_ratio": + "mix_start": { "label": "Start mix ratio", "description": "First extruder percentage 0-100", @@ -72,7 +88,7 @@ class ColorMix(Script): "minimum_value_warning": "0", "maximum_value_warning": "100" }, - "mix_finish_ratio": + "mix_finish": { "label": "End mix ratio", "description": "First extruder percentage 0-100 to finish blend", @@ -81,14 +97,7 @@ class ColorMix(Script): "minimum_value": "0", "minimum_value_warning": "0", "maximum_value_warning": "100", - "enabled": "c_behavior == 'blend_value'" - }, - "notes": - { - "label": "Notes", - "description": "A spot to put a note", - "type": "str", - "default_value": "" + "enabled": "behavior == 'blend_value'" } } }""" @@ -112,52 +121,53 @@ class ColorMix(Script): return default def execute(self, data): - #get user variables - firstHeight = 0.0 - secondHeight = 0.0 - firstMix = 0.0 - SecondMix = 0.0 firstHeight = self.getSettingValueByKey("start_height") secondHeight = self.getSettingValueByKey("finish_height") - firstMix = self.getSettingValueByKey("mix_start_ratio") - SecondMix = self.getSettingValueByKey("mix_finish_ratio") - - #locals - layer = 0 - + firstMix = self.getSettingValueByKey("mix_start") + secondMix = self.getSettingValueByKey("mix_finish") + modelOfInterest = self.getSettingValueByKey("objectNumber") + #get layer height - layerHeight = .2 + layerHeight = 0 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 + if layerHeight != 0: + break + + #default layerHeight if not found + if layerHeight == 0: + layerHeight = .2 + #get layers to use startLayer = 0 endLayer = 0 - if self.getSettingValueByKey("measurement_units") == "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 + if self.getSettingValueByKey("unitsOfMeasurement") == "mm": + startLayer = round(firstHeight / layerHeight) + endLayer = round(secondHeight / layerHeight) + else: #layer height shifts down by one for g-code + if firstHeight <= 0: + firstHeight = 1 + if secondHeight <= 0: + secondHeight = 1 + startLayer = firstHeight - 1 + endLayer = secondHeight - 1 #see if one-shot if self.getSettingValueByKey("behavior") == "fixed_value": endLayer = startLayer firstExtruderIncrements = 0 else: #blend - firstExtruderIncrements = (SecondMix - firstMix) / (endLayer - startLayer) + firstExtruderIncrements = (secondMix - firstMix) / (endLayer - startLayer) firstExtruderValue = 0 index = 0 + #start scanning + layer = -1 + modelNumber = 0 for active_layer in data: modified_gcode = "" lineIndex = 0; @@ -169,22 +179,30 @@ class ColorMix(Script): # 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" + #get model number by layer 0 repeats + if(layer == 0): + modelNumber = modelNumber + 1 + #search for layers to manipulate + if (layer >= startLayer) and (layer <= endLayer): + #make sure correct model is selected + if (modelOfInterest == 0) or (modelOfInterest == modelNumber): + #Delete old data if required + if lines[lineIndex + 4] == "T2": + del lines[(lineIndex + 1):(lineIndex + 5)] + #add mixing commands + 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 + return data \ No newline at end of file