Merge branch 'master' of https://github.com/Hrybmo/Cura into Hrybmo-master

This commit is contained in:
Tim Kuipers 2020-02-26 15:31:58 +01:00
commit 14d351e185

View file

@ -6,14 +6,22 @@
#Authors of the 2-1 ColorMix plug-in / script: #Authors of the 2-1 ColorMix plug-in / script:
# Written by John Hryb - john.hryb.4@gmail.com # Written by John Hryb - john.hryb.4@gmail.com
##history / change-log: #history / change-log:
##V1.0.0 #V1.0.0 - Initial
#V1.1.0 -
## Uses - # additions:
## M163 - Set Mix Factor #Object number - To select individual models or all when using "one at a time" print sequence
## M164 - Save Mix - saves to T3 as a unique mix #V1.2.0
# fixed layer heights Cura starts at 1 while G-code starts at 0
import re #To perform the search and replace. # 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 from ..Script import Script
class ColorMix(Script): class ColorMix(Script):
@ -22,20 +30,28 @@ class ColorMix(Script):
def getSettingDataString(self): def getSettingDataString(self):
return """{ return """{
"name":"ColorMix 2-1", "name":"ColorMix 2-1 V1.2.1",
"key":"ColorMix 2-1", "key":"ColorMix 2-1",
"metadata": {}, "metadata": {},
"version": 2, "version": 2,
"settings": "settings":
{ {
"measurement_units": "unitsOfMeasurement":
{ {
"label": "Units of measurement", "label": "Units",
"description": "Input value as mm or layer number.", "description": "Input value as mm or layer number.",
"type": "enum", "type": "enum",
"options": {"mm":"mm","layer":"Layer"}, "options": {"mm":"mm","layer":"Layer"},
"default_value": "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": "start_height":
{ {
"label": "Start Height", "label": "Start Height",
@ -59,10 +75,10 @@ class ColorMix(Script):
"type": "float", "type": "float",
"default_value": 0, "default_value": 0,
"minimum_value": "0", "minimum_value": "0",
"minimum_value_warning": "0.1", "minimum_value_warning": "start_height",
"enabled": "c_behavior == 'blend_value'" "enabled": "behavior == 'blend_value'"
}, },
"mix_start_ratio": "mix_start":
{ {
"label": "Start mix ratio", "label": "Start mix ratio",
"description": "First extruder percentage 0-100", "description": "First extruder percentage 0-100",
@ -72,7 +88,7 @@ class ColorMix(Script):
"minimum_value_warning": "0", "minimum_value_warning": "0",
"maximum_value_warning": "100" "maximum_value_warning": "100"
}, },
"mix_finish_ratio": "mix_finish":
{ {
"label": "End mix ratio", "label": "End mix ratio",
"description": "First extruder percentage 0-100 to finish blend", "description": "First extruder percentage 0-100 to finish blend",
@ -81,14 +97,7 @@ class ColorMix(Script):
"minimum_value": "0", "minimum_value": "0",
"minimum_value_warning": "0", "minimum_value_warning": "0",
"maximum_value_warning": "100", "maximum_value_warning": "100",
"enabled": "c_behavior == 'blend_value'" "enabled": "behavior == 'blend_value'"
},
"notes":
{
"label": "Notes",
"description": "A spot to put a note",
"type": "str",
"default_value": ""
} }
} }
}""" }"""
@ -112,52 +121,53 @@ class ColorMix(Script):
return default return default
def execute(self, data): def execute(self, data):
#get user variables
firstHeight = 0.0
secondHeight = 0.0
firstMix = 0.0
SecondMix = 0.0
firstHeight = self.getSettingValueByKey("start_height") firstHeight = self.getSettingValueByKey("start_height")
secondHeight = self.getSettingValueByKey("finish_height") secondHeight = self.getSettingValueByKey("finish_height")
firstMix = self.getSettingValueByKey("mix_start_ratio") firstMix = self.getSettingValueByKey("mix_start")
SecondMix = self.getSettingValueByKey("mix_finish_ratio") secondMix = self.getSettingValueByKey("mix_finish")
modelOfInterest = self.getSettingValueByKey("objectNumber")
#locals
layer = 0
#get layer height #get layer height
layerHeight = .2 layerHeight = 0
for active_layer in data: for active_layer in data:
lines = active_layer.split("\n") lines = active_layer.split("\n")
for line in lines: for line in lines:
if ";Layer height: " in line: if ";Layer height: " in line:
layerHeight = self.getValue(line, ";Layer height: ", layerHeight) layerHeight = self.getValue(line, ";Layer height: ", layerHeight)
break break
if layerHeight != 0:
break
#default layerHeight if not found
if layerHeight == 0:
layerHeight = .2
#get layers to use #get layers to use
startLayer = 0 startLayer = 0
endLayer = 0 endLayer = 0
if self.getSettingValueByKey("measurement_units") == "mm": if self.getSettingValueByKey("unitsOfMeasurement") == "mm":
if firstHeight == 0: startLayer = round(firstHeight / layerHeight)
startLayer = 0 endLayer = round(secondHeight / layerHeight)
else: else: #layer height shifts down by one for g-code
startLayer = firstHeight / layerHeight if firstHeight <= 0:
if secondHeight == 0: firstHeight = 1
endLayer = 0 if secondHeight <= 0:
else: secondHeight = 1
endLayer = secondHeight / layerHeight startLayer = firstHeight - 1
else: #layer height endLayer = secondHeight - 1
startLayer = firstHeight
endLayer = secondHeight
#see if one-shot #see if one-shot
if self.getSettingValueByKey("behavior") == "fixed_value": if self.getSettingValueByKey("behavior") == "fixed_value":
endLayer = startLayer endLayer = startLayer
firstExtruderIncrements = 0 firstExtruderIncrements = 0
else: #blend else: #blend
firstExtruderIncrements = (SecondMix - firstMix) / (endLayer - startLayer) firstExtruderIncrements = (secondMix - firstMix) / (endLayer - startLayer)
firstExtruderValue = 0 firstExtruderValue = 0
index = 0 index = 0
#start scanning #start scanning
layer = -1
modelNumber = 0
for active_layer in data: for active_layer in data:
modified_gcode = "" modified_gcode = ""
lineIndex = 0; lineIndex = 0;
@ -169,22 +179,30 @@ class ColorMix(Script):
# find current layer # find current layer
if ";LAYER:" in line: if ";LAYER:" in line:
layer = self.getValue(line, ";LAYER:", layer) layer = self.getValue(line, ";LAYER:", layer)
if (layer >= startLayer) and (layer <= endLayer): #find layers of interest #get model number by layer 0 repeats
if lines[lineIndex + 4] == "T2": #check if needing to delete old data if(layer == 0):
del lines[(lineIndex + 1):(lineIndex + 5)] modelNumber = modelNumber + 1
firstExtruderValue = int(((layer - startLayer) * firstExtruderIncrements) + firstMix) #search for layers to manipulate
if firstExtruderValue == 100: if (layer >= startLayer) and (layer <= endLayer):
modified_gcode += "M163 S0 P1\n" #make sure correct model is selected
modified_gcode += "M163 S1 P0\n" if (modelOfInterest == 0) or (modelOfInterest == modelNumber):
elif firstExtruderValue == 0: #Delete old data if required
modified_gcode += "M163 S0 P0\n" if lines[lineIndex + 4] == "T2":
modified_gcode += "M163 S1 P1\n" del lines[(lineIndex + 1):(lineIndex + 5)]
else: #add mixing commands
modified_gcode += "M163 S0 P0.{:02d}\n".format(firstExtruderValue) firstExtruderValue = int(((layer - startLayer) * firstExtruderIncrements) + firstMix)
modified_gcode += "M163 S1 P0.{:02d}\n".format(100 - firstExtruderValue) if firstExtruderValue == 100:
modified_gcode += "M164 S2\n" modified_gcode += "M163 S0 P1\n"
modified_gcode += "T2\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 lineIndex += 1 #for deleting index
data[index] = modified_gcode data[index] = modified_gcode
index += 1 index += 1
return data return data