1 """Data structures in Foam-Files that can't be directly represented by Python-Structures"""
2
3 from __future__ import division
4
5 import PyFoam.Basics.FoamFileGenerator
6
7 from copy import deepcopy
8 import string,math
9 import re
10
11 from PyFoam.ThirdParty.six import integer_types,PY3,iteritems
12
13 if PY3:
15 if a<b:
16 return -1
17 elif a==b:
18 return 0
19 else:
20 return 1
21
24 return "'"+str(self)+"'"
25
27 """Implementation to make __cmp__ work again in Python3
28
29 Implementing this method means that these objects are not hashable.
30 But that is OK
31 """
32 return self.__cmp__(other)==0
33
35 "Implementation to make __cmp__ work again in Python3"
36 return self.__cmp__(other)<0
37
40
43
46
49
50 -class Field(FoamDataType):
52 self.val=val
53 self.name=name
54 if type(val) in[list,UnparsedList,BinaryList]:
55 self.uniform=False
56 elif self.name==None:
57 self.uniform=True
58 else:
59 raise TypeError("Type",type(val),"of value",val,"can not be used to determine uniformity")
60
73
75 if other==None or type(other)!=Field:
76 return 1
77 if self.uniform!=other.uniform:
78 return cmp(self.uniform,other.uniform)
79 elif self.name!=other.name:
80 return cmp(self.name,other.name)
81 else:
82 return cmp(self.val,other.val)
83
85 assert(not self.uniform)
86 return self.val[key]
87
89 assert(not self.uniform)
90 self.val[key]=value
91
94
97
99 return "nonuniform "+self.name+" <BINARY DATA>"
100
103
108
111 assert(len(dims)==7)
112 self.dims=list(dims)
113
115 result="[ "
116 for v in self.dims:
117 result+=str(v)+" "
118 result+="]"
119 return result
120
122 if other==None:
123 return 1
124 return cmp(self.dims,other.dims)
125
127 return self.dims[key]
128
131
135
137 return "("+" ".join(["%g"%v for v in self.vals])+")"
138
140 if other==None or not issubclass(type(other),FixedLength):
141 return 1
142 return cmp(self.vals,other.vals)
143
145 return self.vals[key]
146
149
151 return len(self.vals)
152
156
158 x=self
159 if type(y)==Vector:
160 return Vector(x[0]+y[0],x[1]+y[1],x[2]+y[2])
161 elif type(y) in integer_types+(float,):
162 return Vector(x[0]+y,x[1]+y,x[2]+y)
163 else:
164 return NotImplemented
165
167 x=self
168 if type(y) in integer_types+(float,):
169 return Vector(x[0]+y,x[1]+y,x[2]+y)
170 else:
171 return NotImplemented
172
174 x=self
175 if type(y)==Vector:
176 return Vector(x[0]-y[0],x[1]-y[1],x[2]-y[2])
177 elif type(y) in integer_types+(float,):
178 return Vector(x[0]-y,x[1]-y,x[2]-y)
179 else:
180 return NotImplemented
181
183 x=self
184 if type(y) in integer_types+(float,):
185 return Vector(y-x[0],y-x[1],y-x[2])
186 else:
187 return NotImplemented
188
190 x=self
191 if type(y)==Vector:
192 return Vector(x[0]*y[0],x[1]*y[1],x[2]*y[2])
193 elif type(y) in integer_types+(float,):
194 return Vector(x[0]*y,x[1]*y,x[2]*y)
195 else:
196 return NotImplemented
197
199 x=self
200 if type(y) in integer_types+(float,):
201 return Vector(y*x[0],y*x[1],y*x[2])
202 else:
203 return NotImplemented
204
206 x=self
207 if type(y)==Vector:
208 return Vector(x[0]/y[0],x[1]/y[1],x[2]/y[2])
209 elif type(y) in integer_types+(float,):
210 return Vector(x[0]/y,x[1]/y,x[2]/y)
211 else:
212 return NotImplemented
213
216
218 x=self
219 if type(y)==Vector:
220 return Vector(x[1]*y[2]-x[2]*y[1],
221 x[2]*y[0]-x[0]*y[2],
222 x[0]*y[1]-x[1]*y[0])
223 else:
224 return NotImplemented
225
227 x=self
228 return math.sqrt(x[0]*x[0]+x[1]*x[1]+x[2]*x[2])
229
231 x=self
232 return Vector(-x[0],-x[1],-x[2])
233
235 x=self
236 return Vector( x[0], x[1], x[2])
237
239 - def __init__(self,v1,v2,v3,v4,v5,v6,v7,v8,v9):
241
245
247 """This class is in charge of handling redirections to other directories"""
248 - def __init__(self,fullCopy,reference,name):
249 self._fullCopy=fullCopy
250 self._reference=reference
251 self._name=name
252
255
256 - def getContent(self):
257 result=self._fullCopy
258 self._fullCopy=None
259 return result
260
262 return self._reference
263
265 return "$"+self._name
266
268 return float(self._reference)
269
271 """A class that acts like a dictionary, but preserves the order
272 of the entries. Used to beautify the output"""
273
275 dict.__init__(self)
276 self._order=[]
277 self._decoration={}
278 self._regex=[]
279 self._redirects=[]
280
282 isRegex=False
283 if type(key)==str:
284 if key[0]=='"' and key[-1]=='"':
285 isRegex=True
286 if isRegex:
287 exp=re.compile(key[1:-1])
288 self._regex=[(key,exp,value)]+self._regex
289 else:
290 dict.__setitem__(self,key,value)
291 if key not in self._order or isRegex:
292 self._order.append(key)
293
295 try:
296 return dict.__getitem__(self,key)
297 except KeyError:
298 for k,e,v in self._regex:
299 if e.match(key):
300 return v
301 for r in self._redirects:
302 try:
303 return r()[key]
304 except KeyError:
305 pass
306
307 raise KeyError(key)
308
310 dict.__delitem__(self,key)
311 self._order.remove(key)
312 if key in self._decoration:
313 del self._decoration[key]
314
327
329 if dict.__contains__(self,key):
330 return True
331 else:
332 for k,e,v in self._regex:
333 if e.match(key):
334 return True
335 for r in self._redirects:
336 if key in r():
337 return True
338
339 return False
340
343
345 first=True
346 result="{"
347 for k in self.keys():
348 v=self[k]
349 if first:
350 first=False
351 else:
352 result+=", "
353 result+="%s: %s" % (repr(k),repr(v))
354 result+="}"
355 return result
356
358 if key in self:
359 if key not in self._decoration:
360 self._decoration[key]=""
361 self._decoration[key]+=text
362
364 if key in self._decoration:
365 return " \t"+self._decoration[key]
366 else:
367 return ""
368
370 for k,e,v in self._regex:
371 if k==key:
372 return v
373 raise KeyError(key)
374
379
381 """Enables Tuples to be manipulated"""
382
385
387 """A class that encapsulates an unparsed string"""
388
391
394
396 return hash(self.data)
397
399 return self.data<other.data
400
402 """Represents a part of the file with binary data in it"""
405
407 """A class that encapsulates an codestream string"""
408
410 return "#{" + str.__str__(self) + "#}"
411
413 """A class that encapsulates a list that was not parsed for
414 performance reasons"""
415
417 self.data=data
418 self.length=lngth
419
422
424 return cmp(self.data,other.data)
425
427 return self.data==other.data
428
430 return self.data<other.data
431
433 """A class that represents a list that is saved as binary data"""
434
437
438
439