demoPyMXSTypeInterop.py

demoPyMXSTypeInterop.py
1 '''
2  Demonstrates how to interoperate corresponding MAXScript types from Python and vice versa
3 '''
4 import MaxPlus
5 from pymxs import runtime as rt
6 
7 
8 def _ShowPyObject(obj):
9  print type(obj), obj,
10 
11 
12 def _ShowMXSObject(obj):
13  print repr(obj),
14 
15 
16 def _RunMXS(code_buff):
17  import textwrap
18  for line in textwrap.dedent(code_buff).split('\n'):
19  if line:
21 
22 
23 def CreateArray():
24  arr = rt.Array(*range(3))
25  _ShowMXSObject(arr)
26  print
27 
28  return arr
29 
30 
31 def IterateArray(arr):
32  for i in arr:
33  _ShowMXSObject(i)
34  print
35 
36 
37 def IndexArray(arr):
38  first_elem = arr[0]
39  _ShowMXSObject(first_elem)
40  last_elem = arr[-1]
41  _ShowMXSObject(last_elem)
42  print
43 
44 
45 def ManipulateArray(arr):
46  rt.append(arr, "foo")
47  _ShowMXSObject(arr)
48  rt.deleteItem(arr, arr.count)
49  print
50 
51 
52 def ArrayToList(arr):
53  arr_as_list = list(arr)
54  _ShowPyObject(arr_as_list)
55  print
56 
57  return arr_as_list
58 
59 
60 def ArrayToTuple(arr):
61  arr_as_tuple = tuple(arr)
62  _ShowPyObject(arr_as_tuple)
63  print
64 
65  return arr_as_tuple
66 
67 
68 def ListToArray(list_obj):
69  arr = rt.Array(*list_obj)
70  _ShowMXSObject(arr)
71  print
72 
73  return arr
74 
75 
76 def TupleToArray(tuple_obj):
77  arr = rt.Array(*tuple_obj)
78  _ShowMXSObject(arr)
79  print
80 
81  return arr
82 
83 
84 def ArrayInterop():
85  print "#Create Array:"
86  arr = CreateArray()
87 
88  print "#Iterate Array:"
89  IterateArray(arr)
90 
91  print "#Index Array:"
92  IndexArray(arr)
93 
94  print "#Manipulate Array"
95  ManipulateArray(arr)
96 
97  print "#Array to Lit:"
98  arr_as_list = ArrayToList(arr)
99 
100  print "#Array to Tuple:"
101  arr_as_tuple = ArrayToTuple(arr)
102 
103  print "#List to Array:"
104  list_as_arr = ListToArray(arr_as_list)
105 
106  print "#Tuple To Array:"
107  tuple_as_arr = TupleToArray(arr_as_tuple)
108 
109 
110 def CreateBitArray():
111  barr = rt.BitArray(1, 3, rt.Name("range"), 5, 7)
112  _ShowMXSObject(barr)
113  print
114 
115  return barr
116 
117 
118 def IterateBitArray(barr):
119  for i in barr:
120  _ShowMXSObject(i)
121  print
122 
123 
124 def IndexBitArray(barr):
125  first_elem = barr[0]
126  _ShowMXSObject(first_elem)
127  last_elem = barr[-1]
128  _ShowMXSObject(last_elem)
129  print
130 
131 
132 def ManipulateBitArray(barr):
133  barr[1] = True
134  barr[-2] = True
135  _ShowMXSObject(barr)
136  barr[1] = False
137  barr[-2] = False
138  print
139 
140 
141 def BitArrayInterop():
142  print "#Create BitArray"
143  barr = CreateBitArray()
144 
145  print "#Iterate BitArray"
146  IterateBitArray(barr)
147 
148  print "#Index BitArray"
149  IndexBitArray(barr)
150 
151  print "#Manipulate BitArray"
152  ManipulateBitArray(barr)
153 
154 
155 def ImportPythonInMXS():
156  return r"""
157  bi = python.import "__builtin__"
158  """
159 
160 
161 def CreateListInMXS():
162  return r"""
163  my_list = bi.list #(1, 2, 3)
164  format "% %\n" (bi.type my_list) my_list
165  """
166 
167 
168 def CreateTupleInMXS():
169  return r"""
170  my_tuple = bi.tuple #(4, 5, 6)
171  format "% %\n" (bi.type my_tuple) my_tuple
172  """
173 
174 
175 def IndexListInMXS():
176  return r"""
177  format "% %\n" my_list[1] my_list[bi.len(my_list)]
178  """
179 
180 
181 def IndexTupleInMXS():
182  return r"""
183  format "% %\n" my_Tuple[1] my_Tuple[bi.len(my_tuple)]
184  """
185 
186 
187 def ManipulateListInMXS():
188  return r"""
189  my_list.append(my_tuple)
190  format "%\n" (my_list as string)
191  my_list.pop()
192  """
193 
194 
195 def ListToArrayInMXS():
196  return r"""
197  list_as_arr = my_list as array
198  format "% %\n" (classof list_as_arr) list_as_arr
199  """
200 
201 
202 def TupleToArrayInMXS():
203  return r"""
204  tuple_as_arr = my_tuple as array
205  format "% %\n" (classof tuple_as_arr) tuple_as_arr
206  """
207 
208 
209 def ListInteropInMXS():
210  print "#Create List:"
211  _RunMXS(CreateListInMXS())
212 
213  print "#Index List:"
214  _RunMXS(IndexListInMXS())
215 
216  print "#Manipulate List:"
217  _RunMXS(ManipulateListInMXS())
218 
219  print "#List to Array:"
220  _RunMXS(ListToArrayInMXS())
221 
222 
223 def TupleInteropInMXS():
224  print "#Create Tuple:"
225  _RunMXS(CreateTupleInMXS())
226 
227  print "#Index Tuple:"
228  _RunMXS(IndexTupleInMXS())
229 
230  print "#Tuple to Array:"
231  _RunMXS(TupleToArrayInMXS())
232 
233 
234 def CreateDictInMXS():
235  # creates a Python native dict in MXS
236  return r"""
237  my_dict = bi.dict a:1 b:2 c:3
238  format "% %\n" (bi.type my_dict) my_dict
239  """
240 
241 
242 def ManipulateDictInMXS():
243  return r"""
244  my_dict["d"] = 4
245  format "%\n" (my_dict as string)
246  my_dict.__delitem__("d")
247  """
248 
249 def CreateMXSDictInPy():
250  # creates a native MXS dict in Python
251  # by default MXS dictionaries use name values for keys,
252  # unless we specify string or integer:
253  mxsdict = rt.Dictionary(rt.name('string'))
254  mxsdict['one']=1
255  mxsdict['two']=2
256  mxsdict['three']=3
257  return mxsdict
258 
259 def MXSDictToPyDict(mxsdict):
260  # convert native MXS dict to Python dict
261  pydict = {str(key):mxsdict[key] for key in mxsdict.keys}
262  return pydict
263 
264 def DictInteropInMXS():
265  print "#Create Dict:"
266  _RunMXS(CreateDictInMXS())
267 
268  print "#Manipulate Dict:"
269  _RunMXS(ManipulateDictInMXS())
270 
271  print "Create MXS Dict:"
272  mxsdict = CreateMXSDictInPy()
273  print mxsdict
274 
275  print "Convert MXS Dict to Py Dict:"
276  pydict = MXSDictToPyDict(mxsdict)
277  print pydict
278 
279 
280 def main():
281  _RunMXS(ImportPythonInMXS())
282  ArrayInterop()
283  BitArrayInterop()
284  ListInteropInMXS()
285  TupleInteropInMXS()
286  DictInteropInMXS()
287 
288 
289 if __name__ == '__main__':
290  main()