# ICE Revision: $Id$
"""A parsed blockMeshDict"""
from PyFoam.RunDictionary.ParsedParameterFile import ParsedParameterFile
[docs]class ParsedBlockMeshDict(ParsedParameterFile):
""" A parsed version of a blockMeshDict-file. Adds some
convenience-methods to access parts of the file"""
def __init__(self,
name,
backup=False,
debug=False,
doMacroExpansion=False):
ParsedParameterFile.__init__(self,
name,
backup=backup,
debug=debug,
longListOutputThreshold=None,
doMacroExpansion=doMacroExpansion)
[docs] def convertToMeters(self):
try:
return float(self["convertToMeters"])
except KeyError:
return 1
[docs] def vertices(self):
factor=self.convertToMeters()
return [[float(y)*factor for y in x] for x in self["vertices"]]
[docs] def blocks(self):
"""Returns a list with the 8 vertices that define each block"""
result=[]
i=1
while i<len(self["blocks"]):
result.append([int(b) for b in self["blocks"][i]])
if type(self["blocks"][i+1])==str:
i+=6
else:
i+=5
return result
[docs] def patches(self):
"""Returns a dictionary with lists of 4-tuples that define each patch"""
result={}
if "boundary" in self:
# New format in 2.0
for k,d in zip(self["boundary"][0::2],self["boundary"][1::2]):
result[k]=[[int(i) for i in x] for x in d["faces"]]
else:
for i in range(1,len(self["patches"]),3):
result[self["patches"][i]]=[[int(j) for j in x] for x in self["patches"][i+1]]
return result
[docs] def arcs(self):
factor=self.convertToMeters()
result=[]
try:
for i in range(len(self["edges"])):
if str(self["edges"][i])=='arc':
try:
result.append((int(self["edges"][i+1]),
[float(y)*factor for y in self["edges"][i+3]],
int(self["edges"][i+2])))
except ValueError:
result.append((int(self["edges"][i+1]),
[float(y)*factor for y in self["edges"][i+4]],
int(self["edges"][i+2]),
self["edges"][i+3]))
except KeyError:
pass
return result
[docs] def getBounds(self):
v=self.vertices()
mi=[ 1e10, 1e10, 1e10]
ma=[-1e10,-1e10,-1e10]
for p in v:
for i in range(3):
mi[i]=min(p[i],mi[i])
ma[i]=max(p[i],ma[i])
return mi,ma
[docs] def typicalLength(self):
mi,ma=self.getBounds()
biggest=max(ma[0]-mi[0],ma[1]-mi[1],ma[2]-mi[2])
smallest=min(ma[0]-mi[0],ma[1]-mi[1],ma[2]-mi[2])
# return 2*biggest*smallest/(biggest+smallest)
return (biggest+smallest)/2
# Should work with Python3 and Python2