Mercurial > code > home > repos > light9
annotate flax/Submaster.py @ 166:7ccf1d10804b
lots more notes
author | drewp |
---|---|
date | Tue, 08 Jul 2003 09:19:10 +0000 |
parents | 1fe54442db38 |
children | 79bc84310e80 |
rev | line source |
---|---|
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" | |
165
1fe54442db38
get_all_subs sorts, and puts some elements at the end
drewp
parents:
138
diff
changeset
|
95 l = self.submasters.items() |
1fe54442db38
get_all_subs sorts, and puts some elements at the end
drewp
parents:
138
diff
changeset
|
96 l.sort() |
1fe54442db38
get_all_subs sorts, and puts some elements at the end
drewp
parents:
138
diff
changeset
|
97 l = [x[1] for x in l] |
1fe54442db38
get_all_subs sorts, and puts some elements at the end
drewp
parents:
138
diff
changeset
|
98 songs = [] |
1fe54442db38
get_all_subs sorts, and puts some elements at the end
drewp
parents:
138
diff
changeset
|
99 notsongs = [] |
1fe54442db38
get_all_subs sorts, and puts some elements at the end
drewp
parents:
138
diff
changeset
|
100 for s in l: |
1fe54442db38
get_all_subs sorts, and puts some elements at the end
drewp
parents:
138
diff
changeset
|
101 if s.name.startswith('song'): |
1fe54442db38
get_all_subs sorts, and puts some elements at the end
drewp
parents:
138
diff
changeset
|
102 songs.append(s) |
1fe54442db38
get_all_subs sorts, and puts some elements at the end
drewp
parents:
138
diff
changeset
|
103 else: |
1fe54442db38
get_all_subs sorts, and puts some elements at the end
drewp
parents:
138
diff
changeset
|
104 notsongs.append(s) |
1fe54442db38
get_all_subs sorts, and puts some elements at the end
drewp
parents:
138
diff
changeset
|
105 combined = notsongs + songs |
1fe54442db38
get_all_subs sorts, and puts some elements at the end
drewp
parents:
138
diff
changeset
|
106 return combined |
0 | 107 def get_sub_by_name(self, name): |
108 "Makes a new sub if there isn't one." | |
109 return self.submasters.get(name, Submaster(name)) | |
110 __getitem__ = get_sub_by_name | |
111 | |
112 if __name__ == "__main__": | |
113 Patch.reload_data() | |
114 s = Submasters() | |
115 print s.get_all_subs() | |
138 | 116 if 0: # turn this on to normalize all subs |
117 for sub in s.get_all_subs(): | |
118 print "before", sub | |
119 sub.normalize_patch_names() | |
120 sub.save() | |
121 print "after", sub |