annotate flax/TLUtility.py @ 124:8de8a2f467db

The "T" function now creates TimedEvents with LinearBlenders for you The "T" function now creates TimedEvents with LinearBlenders for you (using the same LinearBlender). Thus, we don't need to specify linear anymore. The timeline seek bar was reading the length of track1 instead of the whole timeline. This is fixed.
author dmcc
date Fri, 13 Jun 2003 15:55:54 +0000
parents 45b12307c695
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
45b12307c695 Initial revision
drewp
parents:
diff changeset
1 """Collected utility functions, many are taken from Drew's utils.py in
45b12307c695 Initial revision
drewp
parents:
diff changeset
2 Cuisine CVS and Hiss's Utility.py."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
3
45b12307c695 Initial revision
drewp
parents:
diff changeset
4 from __future__ import generators
45b12307c695 Initial revision
drewp
parents:
diff changeset
5 import sys
45b12307c695 Initial revision
drewp
parents:
diff changeset
6
45b12307c695 Initial revision
drewp
parents:
diff changeset
7 __author__ = "David McClosky <dmcc@bigasterisk.com>, " + \
45b12307c695 Initial revision
drewp
parents:
diff changeset
8 "Drew Perttula <drewp@bigasterisk.com>"
45b12307c695 Initial revision
drewp
parents:
diff changeset
9 __cvsid__ = "$Id: TLUtility.py,v 1.1 2003/05/25 08:25:35 dmcc Exp $"
45b12307c695 Initial revision
drewp
parents:
diff changeset
10 __version__ = "$Revision: 1.1 $"[11:-2]
45b12307c695 Initial revision
drewp
parents:
diff changeset
11
45b12307c695 Initial revision
drewp
parents:
diff changeset
12 def make_attributes_from_args(*argnames):
45b12307c695 Initial revision
drewp
parents:
diff changeset
13 """
45b12307c695 Initial revision
drewp
parents:
diff changeset
14 This function simulates the effect of running
45b12307c695 Initial revision
drewp
parents:
diff changeset
15 self.foo=foo
45b12307c695 Initial revision
drewp
parents:
diff changeset
16 for each of the given argument names ('foo' in the example just
45b12307c695 Initial revision
drewp
parents:
diff changeset
17 now). Now you can write:
45b12307c695 Initial revision
drewp
parents:
diff changeset
18 def __init__(self,foo,bar,baz):
45b12307c695 Initial revision
drewp
parents:
diff changeset
19 copy_to_attributes('foo','bar','baz')
45b12307c695 Initial revision
drewp
parents:
diff changeset
20 ...
45b12307c695 Initial revision
drewp
parents:
diff changeset
21 instead of:
45b12307c695 Initial revision
drewp
parents:
diff changeset
22 def __init__(self,foo,bar,baz):
45b12307c695 Initial revision
drewp
parents:
diff changeset
23 self.foo=foo
45b12307c695 Initial revision
drewp
parents:
diff changeset
24 self.bar=bar
45b12307c695 Initial revision
drewp
parents:
diff changeset
25 self.baz=baz
45b12307c695 Initial revision
drewp
parents:
diff changeset
26 ...
45b12307c695 Initial revision
drewp
parents:
diff changeset
27 """
45b12307c695 Initial revision
drewp
parents:
diff changeset
28
45b12307c695 Initial revision
drewp
parents:
diff changeset
29 callerlocals=sys._getframe(1).f_locals
45b12307c695 Initial revision
drewp
parents:
diff changeset
30 callerself=callerlocals['self']
45b12307c695 Initial revision
drewp
parents:
diff changeset
31 for a in argnames:
45b12307c695 Initial revision
drewp
parents:
diff changeset
32 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
33 setattr(callerself,a,callerlocals[a])
45b12307c695 Initial revision
drewp
parents:
diff changeset
34 except KeyError:
45b12307c695 Initial revision
drewp
parents:
diff changeset
35 raise KeyError, "Function has no argument '%s'" % a
45b12307c695 Initial revision
drewp
parents:
diff changeset
36
45b12307c695 Initial revision
drewp
parents:
diff changeset
37 def enumerate(*collections):
45b12307c695 Initial revision
drewp
parents:
diff changeset
38 """Generates an indexed series: (0,coll[0]), (1,coll[1]) ...
45b12307c695 Initial revision
drewp
parents:
diff changeset
39
45b12307c695 Initial revision
drewp
parents:
diff changeset
40 this is a multi-list version of the code from the PEP:
45b12307c695 Initial revision
drewp
parents:
diff changeset
41 enumerate(a,b) gives (0,a[0],b[0]), (1,a[1],b[1]) ...
45b12307c695 Initial revision
drewp
parents:
diff changeset
42 """
45b12307c695 Initial revision
drewp
parents:
diff changeset
43 i = 0
45b12307c695 Initial revision
drewp
parents:
diff changeset
44 iters = [iter(collection) for collection in collections]
45b12307c695 Initial revision
drewp
parents:
diff changeset
45 while 1:
45b12307c695 Initial revision
drewp
parents:
diff changeset
46 yield [i,] + [iterator.next() for iterator in iters]
45b12307c695 Initial revision
drewp
parents:
diff changeset
47 i += 1
45b12307c695 Initial revision
drewp
parents:
diff changeset
48
45b12307c695 Initial revision
drewp
parents:
diff changeset
49 def dumpobj(o):
45b12307c695 Initial revision
drewp
parents:
diff changeset
50 """Prints all the object's non-callable attributes"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
51 print repr(o)
45b12307c695 Initial revision
drewp
parents:
diff changeset
52 for a in [x for x in dir(o) if not callable(getattr(o, x))]:
45b12307c695 Initial revision
drewp
parents:
diff changeset
53 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
54 print " %20s: %s " % (a, getattr(o, a))
45b12307c695 Initial revision
drewp
parents:
diff changeset
55 except:
45b12307c695 Initial revision
drewp
parents:
diff changeset
56 pass
45b12307c695 Initial revision
drewp
parents:
diff changeset
57 print ""
45b12307c695 Initial revision
drewp
parents:
diff changeset
58
45b12307c695 Initial revision
drewp
parents:
diff changeset
59 def dict_filter_update(d, **newitems):
45b12307c695 Initial revision
drewp
parents:
diff changeset
60 """Adds a set of new keys and values to dictionary 'd' if the values are
45b12307c695 Initial revision
drewp
parents:
diff changeset
61 true:
45b12307c695 Initial revision
drewp
parents:
diff changeset
62
45b12307c695 Initial revision
drewp
parents:
diff changeset
63 >>> some_dict = {}
45b12307c695 Initial revision
drewp
parents:
diff changeset
64 >>> dict_filter_update(some_dict, a=None, b=0, c=1, e={}, s='hello')
45b12307c695 Initial revision
drewp
parents:
diff changeset
65 >>> some_dict
45b12307c695 Initial revision
drewp
parents:
diff changeset
66 {'c': 1, 's': 'hello'}
45b12307c695 Initial revision
drewp
parents:
diff changeset
67 """
45b12307c695 Initial revision
drewp
parents:
diff changeset
68 for k, v in newitems.items():
45b12307c695 Initial revision
drewp
parents:
diff changeset
69 if v: d[k] = v
45b12307c695 Initial revision
drewp
parents:
diff changeset
70
45b12307c695 Initial revision
drewp
parents:
diff changeset
71 def try_get_logger(channel):
45b12307c695 Initial revision
drewp
parents:
diff changeset
72 """Tries to get a logger with the channel 'channel'. Will return a
45b12307c695 Initial revision
drewp
parents:
diff changeset
73 silent DummyClass if logging is not available."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
74 try:
45b12307c695 Initial revision
drewp
parents:
diff changeset
75 import logging
45b12307c695 Initial revision
drewp
parents:
diff changeset
76 log = logging.getLogger(channel)
45b12307c695 Initial revision
drewp
parents:
diff changeset
77 except ImportError:
45b12307c695 Initial revision
drewp
parents:
diff changeset
78 log = DummyClass()
45b12307c695 Initial revision
drewp
parents:
diff changeset
79 return log
45b12307c695 Initial revision
drewp
parents:
diff changeset
80
45b12307c695 Initial revision
drewp
parents:
diff changeset
81 class DummyClass:
45b12307c695 Initial revision
drewp
parents:
diff changeset
82 """A class that can be instantiated but never used. It is intended to
45b12307c695 Initial revision
drewp
parents:
diff changeset
83 be replaced when information is available.
45b12307c695 Initial revision
drewp
parents:
diff changeset
84
45b12307c695 Initial revision
drewp
parents:
diff changeset
85 Usage:
45b12307c695 Initial revision
drewp
parents:
diff changeset
86 >>> d = DummyClass(1, 2, x="xyzzy")
45b12307c695 Initial revision
drewp
parents:
diff changeset
87 >>> d.someattr
45b12307c695 Initial revision
drewp
parents:
diff changeset
88 Traceback (most recent call last):
45b12307c695 Initial revision
drewp
parents:
diff changeset
89 File "<stdin>", line 1, in ?
45b12307c695 Initial revision
drewp
parents:
diff changeset
90 File "Utility.py", line 33, in __getattr__
45b12307c695 Initial revision
drewp
parents:
diff changeset
91 raise AttributeError, "Attempted usage of a DummyClass: %s" % key
45b12307c695 Initial revision
drewp
parents:
diff changeset
92 AttributeError: Attempted usage of a DummyClass: someattr
45b12307c695 Initial revision
drewp
parents:
diff changeset
93 >>> d.somefunction()
45b12307c695 Initial revision
drewp
parents:
diff changeset
94 Traceback (most recent call last):
45b12307c695 Initial revision
drewp
parents:
diff changeset
95 File "<stdin>", line 1, in ?
45b12307c695 Initial revision
drewp
parents:
diff changeset
96 File "Utility.py", line 33, in __getattr__
45b12307c695 Initial revision
drewp
parents:
diff changeset
97 raise AttributeError, "Attempted usage of a DummyClass: %s" % key
45b12307c695 Initial revision
drewp
parents:
diff changeset
98 AttributeError: Attempted usage of a DummyClass: somefunction"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
99 def __init__(self, use_warnings=1, raise_exceptions=0, **kw):
45b12307c695 Initial revision
drewp
parents:
diff changeset
100 """Constructs a DummyClass"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
101 make_attributes_from_args('use_warnings', 'raise_exceptions')
45b12307c695 Initial revision
drewp
parents:
diff changeset
102 def __getattr__(self, key):
45b12307c695 Initial revision
drewp
parents:
diff changeset
103 """Raises an exception to warn the user that a Dummy is not being
45b12307c695 Initial revision
drewp
parents:
diff changeset
104 replaced in time."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
105 if key == "__del__":
45b12307c695 Initial revision
drewp
parents:
diff changeset
106 return
45b12307c695 Initial revision
drewp
parents:
diff changeset
107 msg = "Attempted usage of '%s' on a DummyClass" % key
45b12307c695 Initial revision
drewp
parents:
diff changeset
108 if self.use_warnings:
45b12307c695 Initial revision
drewp
parents:
diff changeset
109 import warnings
45b12307c695 Initial revision
drewp
parents:
diff changeset
110 warnings.warn(msg)
45b12307c695 Initial revision
drewp
parents:
diff changeset
111 if self.raise_exceptions:
45b12307c695 Initial revision
drewp
parents:
diff changeset
112 raise AttributeError, msg
45b12307c695 Initial revision
drewp
parents:
diff changeset
113 return lambda *args, **kw: self.bogus_function()
45b12307c695 Initial revision
drewp
parents:
diff changeset
114 def bogus_function(self):
45b12307c695 Initial revision
drewp
parents:
diff changeset
115 pass
45b12307c695 Initial revision
drewp
parents:
diff changeset
116
45b12307c695 Initial revision
drewp
parents:
diff changeset
117 class ClassyDict(dict):
45b12307c695 Initial revision
drewp
parents:
diff changeset
118 """A dict that accepts attribute-style access as well (for keys
45b12307c695 Initial revision
drewp
parents:
diff changeset
119 that are legal names, obviously). I used to call this Struct, but
45b12307c695 Initial revision
drewp
parents:
diff changeset
120 chose the more colorful name to avoid confusion with the struct
45b12307c695 Initial revision
drewp
parents:
diff changeset
121 module."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
122 def __getattr__(self, a):
45b12307c695 Initial revision
drewp
parents:
diff changeset
123 return self[a]
45b12307c695 Initial revision
drewp
parents:
diff changeset
124 def __setattr__(self, a, v):
45b12307c695 Initial revision
drewp
parents:
diff changeset
125 self[a] = v
45b12307c695 Initial revision
drewp
parents:
diff changeset
126 def __delattr__(self, a):
45b12307c695 Initial revision
drewp
parents:
diff changeset
127 del self[a]
45b12307c695 Initial revision
drewp
parents:
diff changeset
128
45b12307c695 Initial revision
drewp
parents:
diff changeset
129 def trace(func):
45b12307c695 Initial revision
drewp
parents:
diff changeset
130 """Good old fashioned Lisp-style tracing. Example usage:
45b12307c695 Initial revision
drewp
parents:
diff changeset
131
45b12307c695 Initial revision
drewp
parents:
diff changeset
132 >>> def f(a, b, c=3):
45b12307c695 Initial revision
drewp
parents:
diff changeset
133 >>> print a, b, c
45b12307c695 Initial revision
drewp
parents:
diff changeset
134 >>> return a + b
45b12307c695 Initial revision
drewp
parents:
diff changeset
135 >>>
45b12307c695 Initial revision
drewp
parents:
diff changeset
136 >>>
45b12307c695 Initial revision
drewp
parents:
diff changeset
137 >>> f = trace(f)
45b12307c695 Initial revision
drewp
parents:
diff changeset
138 >>> f(1, 2)
45b12307c695 Initial revision
drewp
parents:
diff changeset
139 |>> f called args: [1, 2]
45b12307c695 Initial revision
drewp
parents:
diff changeset
140 1 2 3
45b12307c695 Initial revision
drewp
parents:
diff changeset
141 <<| f returned 3
45b12307c695 Initial revision
drewp
parents:
diff changeset
142 3
45b12307c695 Initial revision
drewp
parents:
diff changeset
143
45b12307c695 Initial revision
drewp
parents:
diff changeset
144 TODO: print out default keywords (maybe)
45b12307c695 Initial revision
drewp
parents:
diff changeset
145 indent for recursive call like the lisp version (possible use of
45b12307c695 Initial revision
drewp
parents:
diff changeset
146 generators?)"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
147 name = func.func_name
45b12307c695 Initial revision
drewp
parents:
diff changeset
148 def tracer(*args, **kw):
45b12307c695 Initial revision
drewp
parents:
diff changeset
149 s = '|>> %s called' % name
45b12307c695 Initial revision
drewp
parents:
diff changeset
150 if args:
45b12307c695 Initial revision
drewp
parents:
diff changeset
151 s += ' args: %r' % list(args)
45b12307c695 Initial revision
drewp
parents:
diff changeset
152 if kw:
45b12307c695 Initial revision
drewp
parents:
diff changeset
153 s += ' kw: %r' % kw
45b12307c695 Initial revision
drewp
parents:
diff changeset
154 print s
45b12307c695 Initial revision
drewp
parents:
diff changeset
155 ret = func(*args, **kw)
45b12307c695 Initial revision
drewp
parents:
diff changeset
156 print '<<| %s returned %s' % (name, ret)
45b12307c695 Initial revision
drewp
parents:
diff changeset
157 return ret
45b12307c695 Initial revision
drewp
parents:
diff changeset
158 return tracer
45b12307c695 Initial revision
drewp
parents:
diff changeset
159
45b12307c695 Initial revision
drewp
parents:
diff changeset
160 # these functions taken from old light8 code
45b12307c695 Initial revision
drewp
parents:
diff changeset
161 def dict_max(*dicts):
45b12307c695 Initial revision
drewp
parents:
diff changeset
162 """
45b12307c695 Initial revision
drewp
parents:
diff changeset
163 ({'a' : 5, 'b' : 9}, {'a' : 10, 'b' : 4})
45b12307c695 Initial revision
drewp
parents:
diff changeset
164 returns ==> {'a' : 10, 'b' : 9}
45b12307c695 Initial revision
drewp
parents:
diff changeset
165 """
45b12307c695 Initial revision
drewp
parents:
diff changeset
166 newdict = {}
45b12307c695 Initial revision
drewp
parents:
diff changeset
167 for d in dicts:
45b12307c695 Initial revision
drewp
parents:
diff changeset
168 for k,v in d.items():
45b12307c695 Initial revision
drewp
parents:
diff changeset
169 newdict[k] = max(v, newdict.get(k, 0))
45b12307c695 Initial revision
drewp
parents:
diff changeset
170 return newdict
45b12307c695 Initial revision
drewp
parents:
diff changeset
171
45b12307c695 Initial revision
drewp
parents:
diff changeset
172 def dict_scale(d,scl):
45b12307c695 Initial revision
drewp
parents:
diff changeset
173 """scales all values in dict and returns a new dict"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
174 return dict([(k,v*scl) for k,v in d.items()])
45b12307c695 Initial revision
drewp
parents:
diff changeset
175
45b12307c695 Initial revision
drewp
parents:
diff changeset
176 def dict_subset(d, dkeys, default=0):
45b12307c695 Initial revision
drewp
parents:
diff changeset
177 """Subset of dictionary d: only the keys in dkeys. If you plan on omitting
45b12307c695 Initial revision
drewp
parents:
diff changeset
178 keys, make sure you like the default."""
45b12307c695 Initial revision
drewp
parents:
diff changeset
179 newd = {} # dirty variables!
45b12307c695 Initial revision
drewp
parents:
diff changeset
180 for k in dkeys:
45b12307c695 Initial revision
drewp
parents:
diff changeset
181 newd[k] = d.get(k, default)
45b12307c695 Initial revision
drewp
parents:
diff changeset
182 return newd
45b12307c695 Initial revision
drewp
parents:
diff changeset
183
45b12307c695 Initial revision
drewp
parents:
diff changeset
184 # functions specific to Timeline
45b12307c695 Initial revision
drewp
parents:
diff changeset
185 # TBD
45b12307c695 Initial revision
drewp
parents:
diff changeset
186 def last_less_than(array, x):
45b12307c695 Initial revision
drewp
parents:
diff changeset
187 """array must be sorted"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
188 best = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
189 for elt in array:
45b12307c695 Initial revision
drewp
parents:
diff changeset
190 if elt <= x:
45b12307c695 Initial revision
drewp
parents:
diff changeset
191 best = elt
45b12307c695 Initial revision
drewp
parents:
diff changeset
192 elif best is not None:
45b12307c695 Initial revision
drewp
parents:
diff changeset
193 return best
45b12307c695 Initial revision
drewp
parents:
diff changeset
194 return best
45b12307c695 Initial revision
drewp
parents:
diff changeset
195
45b12307c695 Initial revision
drewp
parents:
diff changeset
196 # TBD
45b12307c695 Initial revision
drewp
parents:
diff changeset
197 def first_greater_than(array, x):
45b12307c695 Initial revision
drewp
parents:
diff changeset
198 """array must be sorted"""
45b12307c695 Initial revision
drewp
parents:
diff changeset
199 array_rev = array[:]
45b12307c695 Initial revision
drewp
parents:
diff changeset
200 array_rev.reverse()
45b12307c695 Initial revision
drewp
parents:
diff changeset
201 best = None
45b12307c695 Initial revision
drewp
parents:
diff changeset
202 for elt in array_rev:
45b12307c695 Initial revision
drewp
parents:
diff changeset
203 if elt >= x:
45b12307c695 Initial revision
drewp
parents:
diff changeset
204 best = elt
45b12307c695 Initial revision
drewp
parents:
diff changeset
205 elif best is not None:
45b12307c695 Initial revision
drewp
parents:
diff changeset
206 return best
45b12307c695 Initial revision
drewp
parents:
diff changeset
207 return best
45b12307c695 Initial revision
drewp
parents:
diff changeset
208
45b12307c695 Initial revision
drewp
parents:
diff changeset
209