0
|
1 from __future__ import division
|
|
2 from TLUtility import dict_scale, dict_max
|
|
3
|
|
4 import sys
|
|
5 sys.path.append('../light8')
|
|
6
|
|
7 import Patch
|
|
8
|
|
9 class Submaster:
|
|
10 "Contain a dictionary of levels, but you didn't need to know that"
|
135
|
11 def __init__(self, name, leveldict=None):
|
0
|
12 self.name = name
|
|
13 if leveldict:
|
|
14 self.levels = leveldict
|
|
15 else:
|
|
16 self.levels = {}
|
|
17 self.reload()
|
|
18 def reload(self):
|
|
19 try:
|
|
20 self.levels.clear()
|
|
21 subfile = file("subs/%s" % self.name)
|
|
22 for line in subfile.readlines():
|
|
23 if not line.strip(): # if line is only whitespace
|
|
24 continue # "did i say newspace?"
|
|
25
|
|
26 try:
|
|
27 name, val = line.split(':')
|
|
28 name = name.strip()
|
|
29 self.levels[name] = float(val)
|
|
30 except ValueError:
|
|
31 print "(%s) Error with this line: %s" % (self.name,
|
|
32 line[:-1])
|
|
33 except IOError:
|
|
34 print "Can't read file for sub: %s" % self.name
|
|
35 def save(self):
|
|
36 subfile = file("subs/%s" % self.name, 'w')
|
|
37 names = self.levels.keys()
|
|
38 names.sort()
|
|
39 for name in names:
|
|
40 val = self.levels[name]
|
|
41 subfile.write("%s : %s\n" % (name, val))
|
|
42 def set_level(self, channelname, level, save=1):
|
|
43 self.levels[Patch.resolve_name(channelname)] = level
|
|
44 if save:
|
|
45 self.save()
|
|
46 def set_all_levels(self, leveldict):
|
|
47 self.levels.clear()
|
|
48 for k, v in leveldict.items():
|
|
49 self.set_level(k, v, save=0)
|
|
50 self.save()
|
|
51 def get_levels(self):
|
|
52 return self.levels
|
|
53 def __mul__(self, scalar):
|
|
54 return Submaster("%s*%s" % (self.name, scalar),
|
135
|
55 dict_scale(self.levels, scalar))
|
0
|
56 __rmul__ = __mul__
|
|
57 def max(self, *othersubs):
|
|
58 return sub_maxes(self, *othersubs)
|
|
59 def __repr__(self):
|
138
|
60 levels = ' '.join(["%s:%.2f" % item for item in self.levels.items()])
|
|
61 return "<'%s': [%s]>" % (self.name, levels)
|
0
|
62 def get_dmx_list(self):
|
|
63 leveldict = self.get_levels() # gets levels of sub contents
|
|
64
|
|
65 levels = [0] * 68
|
|
66 for k, v in leveldict.items():
|
138
|
67 dmxchan = Patch.get_dmx_channel(k) - 1
|
|
68 levels[dmxchan] = max(v, levels[dmxchan])
|
0
|
69
|
|
70 return levels
|
138
|
71 def normalize_patch_names(self):
|
|
72 # possibly busted -- don't use unless you know what you're doing
|
|
73 self.set_all_levels(self.levels.copy())
|
0
|
74
|
|
75 def sub_maxes(*subs):
|
|
76 return Submaster("max(%r)" % (subs,),
|
135
|
77 dict_max(*[sub.levels for sub in subs]))
|
0
|
78
|
|
79 class Submasters:
|
|
80 "Collection o' Submaster objects"
|
|
81 def __init__(self):
|
|
82 self.submasters = {}
|
|
83
|
|
84 import os
|
|
85 files = os.listdir('subs')
|
|
86
|
|
87 for filename in files:
|
138
|
88 # we don't want these files
|
|
89 if filename.startswith('.') or filename.endswith('~') or \
|
|
90 filename.startswith('CVS'):
|
0
|
91 continue
|
|
92 self.submasters[filename] = Submaster(filename)
|
|
93 def get_all_subs(self):
|
|
94 "All Submaster objects"
|
135
|
95 return self.submasters.values()
|
0
|
96 def get_sub_by_name(self, name):
|
|
97 "Makes a new sub if there isn't one."
|
|
98 return self.submasters.get(name, Submaster(name))
|
|
99 __getitem__ = get_sub_by_name
|
|
100
|
|
101 if __name__ == "__main__":
|
|
102 Patch.reload_data()
|
|
103 s = Submasters()
|
|
104 print s.get_all_subs()
|
138
|
105 if 0: # turn this on to normalize all subs
|
|
106 for sub in s.get_all_subs():
|
|
107 print "before", sub
|
|
108 sub.normalize_patch_names()
|
|
109 sub.save()
|
|
110 print "after", sub
|