05cf520f380d3ce640643c593ce8ce30e9cd971f
[clinton/3d-models.git] / cura / dual_temp_lower.py
1 #Name: Dual Temp Test
2 #Info: Lower the temperature for the nozzle that is not printing
3 #Depend: GCode
4 #Type: postprocess
5 #Param: printTemperature(float:220.0) Print temperature (C)
6 #Param: coolTemperature(float:170.0) Cool nozzle temperature (C)
7 #Param: heatupTimeDelay(float:20.0) Heatup nozzle before use (sec)
8
9 __copyright__ = "Copyright (C) 2013 David Braam - Released under terms of the AGPLv3 License"
10 import re
11 import math
12
13 def getValue(line, key, default = None):
14 if not key in line or (';' in line and line.find(key) > line.find(';')):
15 return default
16 subPart = line[line.find(key) + 1:]
17 m = re.search('^[0-9]+\.?[0-9]*', subPart)
18 if m is None:
19 return default
20 try:
21 return float(m.group(0))
22 except:
23 return default
24
25 with open(filename, "r") as f:
26 lines = f.readlines()
27
28 z = 0.
29 x = 0.
30 y = 0.
31 e = 0.
32 feedrate = 5000
33 currentSectionType = 'CUSTOM'
34 activeExtruder = -1
35 with open(filename, "w") as f:
36 startIdx = 0
37 idx = 0
38 while idx < len(lines):
39 line = lines[idx]
40 if getValue(line, 'T', None) is not None and getValue(line, 'M', None) is None:
41 nextExtruder = getValue(line, 'T', None)
42 printTime = 0.0
43 sx = x
44 sy = y
45 sz = z
46 for n in xrange(startIdx, idx):
47 line = lines[n]
48 if line.startswith(';'):
49 continue
50 g = getValue(line, 'G', None)
51 if g == 0 or g == 1:
52 nx = getValue(line, 'X', x)
53 ny = getValue(line, 'Y', y)
54 nz = getValue(line, 'Z', z)
55 feedrate = getValue(line, 'F', feedrate)
56 printTime += math.sqrt((nx-x)*(nx-x)+(ny-y)*(ny-y)+(nz-z)*(nz-z)) / feedrate * 60
57 x = nx
58 y = ny
59 z = nz
60 heatupTime = printTime - heatupTimeDelay
61 x = sx
62 y = sy
63 z = sz
64 if heatupTime > 0.0:
65 f.write("M104 T%d S%d\n" % (nextExtruder, coolTemperature))
66 f.write("T%d\n" % (activeExtruder))
67 else:
68 heatupTime = None
69 printTime = 0.0
70 for n in xrange(startIdx, idx):
71 line = lines[n]
72 if line.startswith(';'):
73 f.write(line)
74 continue
75 if heatupTime is not None:
76 g = getValue(line, 'G', None)
77 if g == 0 or g == 1:
78 nx = getValue(line, 'X', x)
79 ny = getValue(line, 'Y', y)
80 nz = getValue(line, 'Z', z)
81 feedrate = getValue(line, 'F', feedrate)
82 printTime += math.sqrt((nx-x)*(nx-x)+(ny-y)*(ny-y)+(nz-z)*(nz-z)) / feedrate * 60
83 if printTime > heatupTime:
84 f.write("M104 T%d S%d\n" % (nextExtruder, printTemperature))
85 f.write("T%d\n" % (activeExtruder))
86 heatupTime = None
87 x = nx
88 y = ny
89 z = nz
90 f.write(line)
91 f.write(lines[idx])
92 startIdx = idx + 1
93 activeExtruder = nextExtruder
94 idx += 1
95 for n in xrange(startIdx, idx):
96 f.write(lines[n])