--- /dev/null
+#Name: Dual Temp Test
+#Info: Lower the temperature for the nozzle that is not printing
+#Depend: GCode
+#Type: postprocess
+#Param: printTemperature(float:220.0) Print temperature (C)
+#Param: coolTemperature(float:170.0) Cool nozzle temperature (C)
+#Param: heatupTimeDelay(float:20.0) Heatup nozzle before use (sec)
+
+__copyright__ = "Copyright (C) 2013 David Braam - Released under terms of the AGPLv3 License"
+import re
+import math
+
+def getValue(line, key, default = None):
+ if not key in line or (';' in line and line.find(key) > line.find(';')):
+ return default
+ subPart = line[line.find(key) + 1:]
+ m = re.search('^[0-9]+\.?[0-9]*', subPart)
+ if m is None:
+ return default
+ try:
+ return float(m.group(0))
+ except:
+ return default
+
+with open(filename, "r") as f:
+ lines = f.readlines()
+
+z = 0.
+x = 0.
+y = 0.
+e = 0.
+feedrate = 5000
+currentSectionType = 'CUSTOM'
+activeExtruder = -1
+with open(filename, "w") as f:
+ startIdx = 0
+ idx = 0
+ while idx < len(lines):
+ line = lines[idx]
+ if getValue(line, 'T', None) is not None and getValue(line, 'M', None) is None:
+ nextExtruder = getValue(line, 'T', None)
+ printTime = 0.0
+ sx = x
+ sy = y
+ sz = z
+ for n in xrange(startIdx, idx):
+ line = lines[n]
+ if line.startswith(';'):
+ continue
+ g = getValue(line, 'G', None)
+ if g == 0 or g == 1:
+ nx = getValue(line, 'X', x)
+ ny = getValue(line, 'Y', y)
+ nz = getValue(line, 'Z', z)
+ feedrate = getValue(line, 'F', feedrate)
+ printTime += math.sqrt((nx-x)*(nx-x)+(ny-y)*(ny-y)+(nz-z)*(nz-z)) / feedrate * 60
+ x = nx
+ y = ny
+ z = nz
+ heatupTime = printTime - heatupTimeDelay
+ x = sx
+ y = sy
+ z = sz
+ if heatupTime > 0.0:
+ f.write("M104 T%d S%d\n" % (nextExtruder, coolTemperature))
+ f.write("T%d\n" % (activeExtruder))
+ else:
+ heatupTime = None
+ printTime = 0.0
+ for n in xrange(startIdx, idx):
+ line = lines[n]
+ if line.startswith(';'):
+ f.write(line)
+ continue
+ if heatupTime is not None:
+ g = getValue(line, 'G', None)
+ if g == 0 or g == 1:
+ nx = getValue(line, 'X', x)
+ ny = getValue(line, 'Y', y)
+ nz = getValue(line, 'Z', z)
+ feedrate = getValue(line, 'F', feedrate)
+ printTime += math.sqrt((nx-x)*(nx-x)+(ny-y)*(ny-y)+(nz-z)*(nz-z)) / feedrate * 60
+ if printTime > heatupTime:
+ f.write("M104 T%d S%d\n" % (nextExtruder, printTemperature))
+ f.write("T%d\n" % (activeExtruder))
+ heatupTime = None
+ x = nx
+ y = ny
+ z = nz
+ f.write(line)
+ f.write(lines[idx])
+ startIdx = idx + 1
+ activeExtruder = nextExtruder
+ idx += 1
+ for n in xrange(startIdx, idx):
+ f.write(lines[n])