#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: coolTemperatureDifference(float:50.0) Drop idle nozzle temperature (C)
#Param: heatupTimeDelay(float:20.0) Heatup nozzle before use (sec)
+#Param: zHop(float:0.0) Raise Z when reheating active extruder (mm)
-__copyright__ = "Copyright (C) 2013 David Braam - Released under terms of the AGPLv3 License"
+
+__copyright__ = "Copyright (C) 2013 David Braam, Copyright (C) 2016 Clinton Ebadi <clinton@unknownlamer.org> - Released under terms of the AGPLv3 License"
import re
import math
+from Cura.util import profile
def getValue(line, key, default = None):
if not key in line or (';' in line and line.find(key) > line.find(';')):
x = 0.
y = 0.
e = 0.
-feedrate = 5000
+feedrate = float(profile.getProfileSetting('print_speed'))
+wipeTowerP = profile.getProfileSetting('wipe_tower') == 'True'
currentSectionType = 'CUSTOM'
activeExtruder = -1
+
+# todo: move custom gcode to here
+# detect priming tower and inject reheat there
+
+# grab setting from the profile, add a tag at the end of postSwitch,
+# inject right before the move that sets E0
+
+# todo: use 2nd/3rd/etc extruder temp if available (arrays are alright...)
+printTemperature = float(profile.getProfileSetting('print_temperature'))
+coolTemperature = printTemperature - coolTemperatureDifference
with open(filename, "w") as f:
- startIdx = 0
- idx = 0
- while idx < len(lines):
+ # skip start gcode
+ idx = lines.index (';LAYER:0\n')
+ startIdx = idx
+ for line in lines[0:idx+1]:
+ if getValue(line, 'T', None) is not None and getValue(line, 'M', None) is None:
+ activeExtruder = getValue(line, 'T', None)
+ f.write (line)
+ 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)
x = nx
y = ny
z = nz
- heatupTime = printTime - heatupTimeDelay
+ heatupTime = max (printTime - heatupTimeDelay, 0.0)
+ heatupBlocked = True # do not reheat until active extruder is heated
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
+
+ f.write("M104 T%d S%d\n" % (nextExtruder, coolTemperature))
+ f.write("T%d\n" % (activeExtruder))
+
printTime = 0.0
for n in xrange(startIdx, idx):
line = lines[n]
if line.startswith(';'):
f.write(line)
continue
+ # find where the newly activated extruder is unspooled and block until fully reheated
+ if getValue(line, 'G', None) is not None and getValue (line, 'E', 666) == 0.0:
+ # todo: if wipeTowerP, only
+ # wait for a few degrees below
+ # printTemperature and allow
+ # it to finish heating while
+ # priming
+ if zHop > 0.0:
+ f.write ("G91\nG0 Z%.3f\n" % zHop)
+ f.write("M109 T%d S%d\n" % (activeExtruder, printTemperature))
+ if zHop > 0.0:
+ f.write ("G0 Z%.3f\nG90\n" % -zHop)
+ heatupBlocked = False
if heatupTime is not None:
g = getValue(line, 'G', None)
if g == 0 or g == 1:
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:
+ if (printTime > heatupTime) and (not heatupBlocked):
f.write("M104 T%d S%d\n" % (nextExtruder, printTemperature))
f.write("T%d\n" % (activeExtruder))
heatupTime = None
z = nz
f.write(line)
f.write(lines[idx])
- startIdx = idx + 1
+ startIdx = idx + 1
activeExtruder = nextExtruder
idx += 1
for n in xrange(startIdx, idx):