import os.path
import numpy as np
from collections import OrderedDict
import MatlabFuncs as m
[docs]def expread(filename):
"""
EXPREAD - read a file exp and build a Structure
This routine reads a file .exp and builds a list of dicts containing the
fields x and y corresponding to the coordinates, one for the filename of
the exp file, for the density, for the nodes, and a field closed to
indicate if the domain is closed.
The first argument is the .exp file to be read and the second one (optional)
indicate if the last point shall be read (1 to read it, 0 not to).
Usage:
contours=expread(filename)
Example:
contours=expread('domainoutline.exp')
contours=expread('domainoutline.exp')
See also EXPDOC, EXPWRITEASVERTICES
"""
#some checks
if not os.path.exists(filename):
raise OSError("expread error message: file '%s' not found!" % filename)
#initialize number of profile
contours=[]
#open file
fid=open(filename,'r')
#loop over the number of profiles
while True:
#update number of profiles
contour=OrderedDict()
#Get file name
A=fid.readline()
while A=='\n':
A=fid.readline()
if not A:
break
A=A.split(None,1)
if not (len(A) == 2 and m.strcmp(A[0],'##') and m.strncmp(A[1],'Name:',5)):
break
if len(A[1])>5:
contour['name']=A[1][5:-1]
else:
contour['name']=''
#Get Icon
A=fid.readline().split(None,1)
if not (len(A) == 2 and m.strcmp(A[0],'##') and m.strncmp(A[1],'Icon:',5)):
break
#Get Info
A=fid.readline().split()
if not (len(A) == 4 and m.strcmp(A[0],'#') and m.strcmp(A[1],'Points')):
break
#Get number of nodes and density
A=fid.readline().split()
contour['nods']=int(A[0])
contour['density']=float(A[1])
#Get Info
A=fid.readline().split()
if not (len(A) == 5 and m.strcmp(A[0],'#') and m.strcmp(A[1],'X') and m.strcmp(A[2],'pos')
and m.strcmp(A[3],'Y') and m.strcmp(A[4],'pos')):
break
#Get Coordinates
contour['x']=np.empty(contour['nods'])
contour['y']=np.empty(contour['nods'])
for i in xrange(int(contour['nods'])):
A=fid.readline().split()
contour['x'][i]=float(A[0])
contour['y'][i]=float(A[1])
#Check if closed
if (contour['nods'] > 1) and \
(contour['x'][-1] == contour['x'][0]) and \
(contour['y'][-1] == contour['y'][0]):
contour['closed']=True
else:
contour['closed']=False
contours.append(contour)
#close file
fid.close()
return contours