from __future__ import print_function
from six import iteritems
from six.moves import range
import copy
from math import sin, cos
from numpy import array, radians, dot, zeros
[docs]class LaWGS_Panel(object):
"""
:param rotate: rotates the patch
:param translate: translates the patch
:param scale: scales the patch
"""
def __init__(self, key, header, group):
#print("key=%s \nheader=|%s|" % (key, header)) # ,iSymG
(ID, nline, npnt, isyml, rx, ry, rz, tx, ty, tz, xScale,
yScale, zScale, iSymG) = header.strip().split()
print("ID=%s name=%s imax=%s jmax=%s" % (ID, key, nline, npnt))
print("Rotate = <%s,%s,%s>" % (rx, ry, rz))
print("Translate = <%s,%s,%s>" % (tx, ty, rz))
print("Scale = <%s,%s,%s>" % (xScale, yScale, zScale))
self.name = key
self.rotate = array([rx, ry, rz], 'd')
self.translate = array([tx, ty, tz], 'd')
self.scale = array([xScale, yScale, zScale], 'd')
npnt = int(npnt)
nline = int(nline)
self.nCols = npnt
self.nRows = nline
nGroupLines = npnt // 2 # self.nCols
isSingleLine = False
if npnt % 2 == 1: # self.nCols
isSingleLine = True
#nGroupLines+=1
#X = array((nRows,nCols))
#Y = array((nRows,nCols))
#Z = array((nRows,nCols))
points = []
irow = 0
#print "*****",group[-1]
for iline in range(self.nRows):
for row in range(nGroupLines):
line = group[irow]
#print " line = ",line
(x1, y1, z1, x2, y2, z2) = line.strip().split()
points.append(array([x1, y1, z1], 'd'))
points.append(array([x2, y2, z2], 'd'))
#print "points[%s]=%s" %(i,points[i])
#print "points[%s]=%s" %(i+1,points[i+1])
#print "---"
irow += 1
if isSingleLine:
line = group[irow]
#print "*line = ",line
(x1, y1, z1) = line.strip().split()
points.append(array([x1, y1, z1], 'd'))
irow += 1
#for i,point in enumerate(points):
#print "point[%s] = %s" %(i,point)
n = 0
#for n,point in enumerate(points):
Points = []
for i in range(self.nRows):
points2 = []
for j in range(self.nCols):
points2.append(points[n])
#jj = n%self.nCols
#ii = n/self.nCols
#print "n=%-2s i=%-2s j=%-2s ii=%-2s jj=%-2s" %(n,i,j,ii,jj)
n += 1
Points.append(points2)
#print "len(points[%s]) = %s" %(j,len(points2))
self.points = Points
#print "len(self.points) = %s" %(len(self.points))
[docs] def buildRotationMatrix(self, r):
"""
Form the rotation matrix used for geometrical transformations
Taken from NASA TM 85767 defining LaWGS.
"""
# rotation angles, degrees
#r = radians([self.phi,self.theta,self.psi])
#print "self.rotate = ",self.rotate
r = [radians(ri) for ri in self.rotate]
cPhi = cos(r[0])
sPhi = sin(r[0])
cTheta = cos(r[1])
sTheta = sin(r[1])
cPsi = cos(r[2])
sPsi = sin(r[2])
rot = zeros((3, 3), 'd')
#print rot
rot[0, 0] = cTheta * cPsi
rot[1, 0] = cTheta * sPsi
rot[2, 0] = -sTheta
rot[0, 1] = -sPsi * cPhi + sTheta * cPsi * sPhi
rot[1, 1] = cPsi * cPhi + sTheta * sPsi * sPhi
rot[2, 1] = cTheta * sPhi
rot[0, 2] = sPsi * sPhi + sTheta * cPsi * cPhi
rot[1, 2] = -cPsi * sPhi + sTheta * sPsi * cPhi
rot[2, 2] = cTheta * cPhi
return rot
[docs] def updatePoints(self):
rot = self.buildRotationMatrix(self.rotate)
scale = self.scale
translate = self.translate
points = self.points
Points2 = copy.deepcopy(points)
print("size(points) = (%s,%s)\n" % (len(points), len(points[0])))
for i in range(self.nRows):
#points2 = []
for j in range(self.nCols):
Points2[i][j] = scale * (dot(rot, points[i][j]) + translate)
self.Points = Points2
[docs] def get_points(self):
Points = []
for i in range(self.nRows):
#points2 = []
for j in range(self.nCols):
Points.append(self.Points[i][j])
return Points, len(Points)
[docs] def get_elements(self, pointI):
n = (self.nRows - 1) * (self.nCols - 1)
#print "name=%s n=%s nout=%s" %(self.name,n)
elements = []
for i in range(self.nRows - 1):
for j in range(self.nCols - 1):
elements.append(self.getElement(pointI, i, j))
assert n == len(elements)
return elements, n
[docs] def getElement(self, pointI, j, i):
p1 = (j) * self.nCols + (i) + pointI
p2 = (j) * self.nCols + (i + 1) + pointI
p3 = (j + 1) * self.nCols + (i + 1) + pointI
p4 = (j + 1) * self.nCols + (i) + pointI
return [p1, p2, p3, p4]
[docs] def write_as_plot3d(self, f):
X = []
Y = []
Z = []
for i in range(self.nRows):
#points2 = []
for j in range(self.nCols):
(x, y, z) = self.Points[i][j]
X.append(x)
Y.append(y)
Z.append(z)
msg = ''
for x in X:
msg += '%s ' % (x)
f.write(msg + '\n')
msg = ''
for y in Y:
msg += '%s ' % (y)
f.write(msg + '\n')
msg = ''
for z in Z:
msg += '%s ' % (z)
f.write(msg + '\n')
[docs]class LaWGS(object):
modelType = 'LaWGS'
def __init__(self, filename='tmx1242.wgs'):
self.filename = filename
[docs] def readLaWGS(self):
lawgs = open(self.filename, 'r')
lines = lawgs.readlines()
nlines = len(lines)
groups = {}
name = ''
group = []
header = ''
i = 1
while i < nlines:
line = lines[i].rstrip()
if line.strip() == '':
#print "found blank line, breaking..."
break
#print line
if "'" in line:
#print "if"
groups[name] = [header, group]
name = line.strip("' \t\r\n")
header = lines[i + 1].rstrip()
group = []
i += 1
else:
group.append(line)
i += 1
groups[name] = [header, group]
del groups['']
self.panels = {}
for key, headerGroup in sorted(iteritems(groups)):
header, group = headerGroup
#if key=='BODY':
if 1:
panel = LaWGS_Panel(key, header, group)
panel.updatePoints()
self.panels[key] = panel
[docs] def getPointsElements(self):
points = []
elements = []
pointI = 0
for (name, panel) in sorted(iteritems(self.panels)):
(pointsI, pointi) = panel.get_points()
(elementsI, n) = panel.get_elements(pointI)
#print "elementsI = ",elementsI
points += pointsI
elements += elementsI
pointI += pointi
#print "name=%s len(AllElements)=%s len(allPoints)=%s" %(name,len(elements),len(points))
#for point in points:
#print point
return points, elements
[docs] def write_as_plot3d(self, p3dname):
f = open(p3dname, 'wb')
f.write('%s\n' % (len(self.panels)))
for (name, panel) in sorted(iteritems(self.panels)):
f.write('%s %s 1\n' % (panel.nRows, panel.nCols))
for (name, panel) in sorted(iteritems(self.panels)):
panel.write_as_plot3d(f)
if __name__ == '__main__': # pragma: no cover
lawgs = LaWGS('tmx1242.wgs')
lawgs.readLaWGS()