Package PyFoam :: Package Basics :: Module FoamFileGenerator
[hide private]
[frames] | no frames]

Source Code for Module PyFoam.Basics.FoamFileGenerator

  1  #  ICE Revision: $Id: FoamFileGenerator.py 7822 2007-08-24 09:28:02Z bgschaid $  
  2  """Transform a Python data-structure into a OpenFOAM-File-Representation""" 
  3   
  4  from PyFoam.Error import error 
  5  from PyFoam.Basics.DataStructures import Vector,Field,Dimension,DictProxy 
  6   
7 -class FoamFileGenerator(object):
8 """Class that generates a OpenFOAM-compatible representation of a 9 data-structure""" 10
11 - def __init__(self,data,header=None):
12 """@param data: data structure that will be turned into a 13 Foam-compatible file 14 @param header: header information that is to be prepended 15 """ 16 17 self.data=data 18 self.header=header
19
20 - def __str__(self):
21 """turns the data into a string""" 22 result="" 23 if self.header: 24 result+="FoamFile\n{\n"+self.strDict(self.header,indent=1)+"}\n\n" 25 26 if type(self.data) in [dict,DictProxy]: 27 result+=self.strDict(self.data) 28 elif type(self.data)==list: 29 result+=self.strList(self.data) 30 elif self.data==None: 31 raise "GeneratorError","<None> found" 32 else: 33 result+=self.strPrimitive(self.data) 34 35 return result
36
37 - def strPrimitive(self,pri):
38 if type(pri) in [int,float,long,str]: 39 return str(pri) 40 elif type(pri)==bool: 41 if pri: 42 return "yes" 43 else: 44 return "no" 45 elif pri.__class__ in [Vector,Dimension,Field]: 46 return str(pri) 47 else: 48 error("List, Dict or valid primitve expected,",type(self.data),"found in",self.data)
49
50 - def strDict(self,dic,indent=0):
51 s="" 52 if type(dic)==DictProxy: 53 order=dic._order 54 else: 55 order=dic.keys() 56 order.sort() 57 58 for k in order: 59 v=dic[k] 60 if k.find("anonymValue")==0: 61 k="" 62 63 s+=(" "*indent)+k 64 if type(v)==str: 65 s+=" "+v+";\n" 66 elif type(v) in [dict,DictProxy]: 67 s+="\n"+(" "*indent)+"{\n" 68 s+=self.strDict(v,indent+2) 69 s+=(" "*indent)+"}\n" 70 elif type(v)==list: 71 s+="\n" 72 s+=self.strList(v,indent+2)+";\n" 73 elif type(v)==tuple: 74 s+=" "+self.strTuple(v,indent+2)+";\n" 75 elif type(v) in [int,float,long]: 76 s+=" "+str(v)+";\n" 77 elif v.__class__ in [Vector,Dimension,Field]: 78 s+=" "+str(v)+";\n" 79 else: 80 error("Unhandled type",type(v)," for",v) 81 return s
82
83 - def strList(self,lst,indent=0):
84 s="" 85 86 theLen=len(lst) 87 88 if len(lst)>2 and len(lst)%2==0: 89 if type(lst[0])==str and (type(lst[1]) in [dict,DictProxy]): 90 theLen=len(lst)/2 91 92 isVector=False 93 if len(lst)==3: 94 isVector=True 95 for l in lst: 96 try: 97 val=float(l) 98 except (ValueError,TypeError): 99 isVector=False 100 101 if isVector: 102 s+="( %s %s %s )" % tuple(lst) 103 else: 104 s+=(" "*indent)+str(theLen)+"\n" 105 s+=(" "*indent)+"(\n" 106 for v in lst: 107 if type(v)==str: 108 s+=(" "*(indent+2))+v+"\n" 109 elif type(v) in [dict,DictProxy]: 110 s+="\n"+(" "*(indent+2))+"{\n" 111 s+=self.strDict(v,indent+4) 112 s+="\n"+(" "*(indent+2))+"}\n" 113 elif type(v)==list: 114 s+="\n" 115 s+=self.strList(v,indent+2) 116 elif type(v)==tuple: 117 s+=" "+self.strTuple(v,indent+2)+" " 118 else: 119 s+=(" "*(indent+2))+str(v)+"\n" 120 121 s+=(" "*indent)+")\n" 122 123 return s
124
125 - def strTuple(self,lst,indent=0):
126 s="" 127 128 for v in lst: 129 if type(v)==str: 130 s+=v+" " 131 elif type(v) in [dict,DictProxy]: 132 s+="{\n" 133 s+=self.strDict(v,indent+4) 134 s+=(" "*(indent+2))+"} " 135 elif type(v)==list: 136 s+=" " 137 s+=self.strList(v,indent+2) 138 else: 139 s+=(" "*(indent+2))+str(v)+" " 140 141 return s
142