pyNastran  0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
geometryTables.py
Go to the documentation of this file.
00001 ## GNU Lesser General Public License
00002 ## 
00003 ## Program pyNastran - a python interface to NASTRAN files
00004 ## Copyright (C) 2011-2012  Steven Doyle, Al Danial
00005 ## 
00006 ## Authors and copyright holders of pyNastran
00007 ## Steven Doyle <mesheb82@gmail.com>
00008 ## Al Danial    <al.danial@gmail.com>
00009 ## 
00010 ## This file is part of pyNastran.
00011 ## 
00012 ## pyNastran is free software: you can redistribute it and/or modify
00013 ## it under the terms of the GNU Lesser General Public License as published by
00014 ## the Free Software Foundation, either version 3 of the License, or
00015 ## (at your option) any later version.
00016 ## 
00017 ## pyNastran is distributed in the hope that it will be useful,
00018 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
00019 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00020 ## GNU General Public License for more details.
00021 ## 
00022 ## You should have received a copy of the GNU Lesser General Public License
00023 ## along with pyNastran.  If not, see <http://www.gnu.org/licenses/>.
00024 ## 
00025 import sys
00026 from struct import unpack
00027 
00028 from pyNastran.op2.op2Errors import InvalidMarkersError
00029 from pyNastran.op2.tables.geom.geom1 import Geometry1
00030 from pyNastran.op2.tables.geom.geom2 import Geometry2
00031 from pyNastran.op2.tables.geom.geom3 import Geometry3
00032 from pyNastran.op2.tables.geom.geom4 import Geometry4
00033 from pyNastran.op2.tables.ept import EPT
00034 from pyNastran.op2.tables.mpt import MPT
00035 from pyNastran.op2.tables.geom.dynamics import DYNAMICS
00036 from pyNastran.op2.tables.geom.dit import DIT
00037 
00038 class GeomObj(object):
00039     def __init__(self):
00040         pass
00041     def geomFunc(self, data):
00042         pass
00043 
00044 class GeometryTables(Geometry1,Geometry2,Geometry3,Geometry4,EPT,MPT,DIT,
00045                      DYNAMICS):
00046 
00047     def readRecordTable(self,expectedTableName):
00048         """
00049         @note assumes self.iTableMap has already been set
00050         """
00051         if self.makeGeom==False:
00052             self.iTableMap = {}
00053 
00054         tableName = self.readTableName(rewind=False) # GEOM1
00055         self.tableInit(tableName)
00056         #print "*tableName = |%r|" %(tableName)
00057 
00058         self.readMarkers([-1,7])
00059         fields = self.readIntBlock()
00060         #print "fields = ",fields
00061 
00062         self.readMarkers([-2,1,0]) # 2
00063         bufferWords = self.getMarker()
00064         #print "bufferWords = ",bufferWords,bufferWords*4
00065         word = self.readStringBlock()
00066 
00067         iTable = -3
00068         while 1:  ## @todo could this cause an infinite loop...i dont this so...
00069             (tableName,isNextTable,isNextSubTable,isFileDone) = self.readGeomSubTable(iTable)
00070         
00071             if self.checkForNextTable() or isFileDone:
00072                 #sys.exit('end of geom1')
00073                 return
00074             iTable -= 1
00075         ###
00076         sys.exit('end of %s-this should never happen...' %(expectedTableName))
00077 
00078     def checkForNextTable(self):
00079         foundTable = False
00080         #print "---checking---"
00081         word = self.readTableName(rewind=True,debug=False,stopOnFailure=False)
00082         if word != None:
00083             foundTable = True
00084         #print '---checked---'
00085         #print "geomWord = ",word
00086         return foundTable
00087 
00088     def checkFileDone(self,n):
00089         isFileDone = False
00090         #print "tell = ",self.op2.tell()
00091         
00092         nOld = self.op2.tell()
00093         try:
00094             #print self.printSection(60)
00095             self.readMarkers([n,1,0])
00096             markerA = self.getMarker()
00097             markerB = self.getMarker()
00098             #print "markerA=%s markerB=%s" %(markerA,markerB)
00099             #self.readMarkers([0,0])
00100             #print "subtable :) = ",foundSubTable
00101             if [markerA,markerB]==[0,0]:
00102                 isFileDone = True
00103             ###
00104         except:
00105             pass
00106         ###
00107         self.n = nOld
00108         self.op2.seek(self.n)
00109         #print "isFileDone = ",isFileDone
00110         return isFileDone
00111 
00112     def checkForNextSubTable(self,n):
00113         foundSubTable = False
00114         #print "tell = ",self.op2.tell()
00115         
00116         try:
00117             nOld = self.op2.tell()
00118             self.readMarkers([n,1,0])
00119             foundSubTable=True
00120             #print "subtable :) = ",foundSubTable
00121         except InvalidMarkersError:
00122             foundSubTable = False
00123         ###
00124         self.n = nOld
00125         self.op2.seek(self.n)
00126 
00127         return foundSubTable
00128 
00129     def readGeomSubTable(self,iTable):
00130         i=0
00131         isNextTable=False
00132         isNextSubTable=False
00133         self.readMarkers([iTable,1,0])
00134         #print self.iTableMap
00135 
00136         tableName = self.readTableName(rewind=True, stopOnFailure=False)
00137         if tableName:
00138             #print "**tableName = |%r|" %(tableName)
00139             return tableName,isNextTable,isNextSubTable,False
00140 
00141         data = b''
00142         isTableActive=False
00143         while isNextSubTable==False and isNextTable==False:
00144             #print self.printSection(200)
00145             marker = self.getMarker()
00146             #print "marker = ",marker
00147             if marker < 0:
00148                 msg = 'marker is less than 0...'
00149                 raise Exception(msg)
00150             data += self.readBlock()
00151             if not isTableActive:
00152                 tableType = unpack('iii', data[:12])
00153                 data = data[12:]
00154 
00155             #print "iTable=%s lenGeomData=%s" %(iTable,len(data))
00156 
00157             if tableType in self.iTableMap:
00158                 #print "reading  iTable=%-3s with tableType=%s" %(iTable,tableType)
00159                 self.iTableMap[tableType](data)
00160             else:
00161                 if not(tableType[0]==tableType[1]==tableType[2]):
00162                     msg = "skipping %s iTable=%-3s with tableType=%s" %(self.tableName,iTable,tableType)
00163                     #self.skippedCardsFile.write(msg+'\n')
00164                     if self.makeGeom:
00165                         self.log.debug(msg)
00166                     ###
00167                 ###
00168             ###
00169             #self.op2Debug.write('ints = %s\n' %(str(ints)))
00170 
00171             isNextTable = self.checkForNextTable()
00172             isNextSubTable = self.checkForNextSubTable(iTable-1)
00173             isFileDone = self.checkFileDone(iTable-1)
00174             if isFileDone:
00175                 isNextTable=True
00176             
00177             #print "i=%s tell=%s isNextTable=%s isNextSubTable=%s" %(i,self.op2.tell(),isNextTable,isNextSubTable)
00178             #if i==13:
00179             #    sys.exit('stopA')
00180             i+=1
00181             isTableActive=True
00182         ### while
00183         
00184         #print "exiting the geom sub table"
00185         return (tableName,isNextTable,isNextSubTable,isFileDone)
00186 
00187     def readTable_PCOMPTS(self):
00188         #self.iTableMap = {
00189         #                 }
00190         #self.readRecordTable('PCOMPTS')
00191 
00192         tableName = self.readTableName(rewind=False) # PCOMP
00193         self.tableInit(tableName)
00194         self.readMarkers([-1,7])
00195         ints = self.readIntBlock()  # ??? ints
00196         #print(ints)
00197         #data = self.readBlock()
00198         #print self.printBlock(data) 
00199         #print("fields = ",fields)
00200 
00201         #-------------------------------------------
00202         self.readMarkers([-2,1,0]) # 2
00203         self.readMarkers([2]) # 2
00204         strings = self.readStringBlock()  # IPCOMPT
00205         #print(strings)
00206 
00207         #-------------------------------------------
00208         #print "3"
00209         iTable=-3
00210         while 1:
00211             self.readMarkers([iTable,1,0]) # 3
00212             n = self.op2.tell()
00213             try:
00214                 bufferWords = self.getMarker()
00215                 if bufferWords==0:
00216                     self.goto(n)
00217                     #print "returning from table=-3"
00218                     return
00219                 elif bufferWords<0:
00220                     self.goto(n)
00221                 else:
00222                     #print "bufferWords = ",bufferWords,bufferWords*4
00223                     data = self.getData(4)
00224                     bufferSize, = unpack('i',data)
00225 
00226                     #print "bufferSize = ",bufferSize
00227                     data = self.getData(bufferWords*4)
00228                     data = self.getData(4)
00229                 ###
00230             except:
00231                 raise RuntimeError('error in iTable=% of %s...' %(self.iTable,self.tableName))
00232             ###
00233             iTable-=1
00234             ###
00235         ###
00236 
00237     def readTable_SDF(self):
00238         tableName = self.readTableName(rewind=False) # SDF
00239         self.tableInit(tableName)
00240         self.readMarkers([-1,7])
00241         ints = self.readIntBlock()  # ??? ints
00242         #print ints
00243 
00244         #-------------------------------------------
00245         
00246         iTable = -2
00247         
00248         #print "iTable = ",iTable
00249         self.readMarkers([iTable,1,0]) # 2
00250         bufferWords = self.getMarker()
00251         #print "bufferWords = ",bufferWords
00252         data = self.getData(4)
00253         bufferSize, = unpack('i',data)
00254         data = self.getData(bufferWords*4)
00255         #print self.printBlock(data)
00256         data = self.getData(4)
00257         iTable-=1
00258 
00259         self.readMarkers([iTable,1,1]) # 3
00260         bufferWords = self.getMarker() # 12
00261         data = self.getData(4)
00262         bufferSize, = unpack('i',data) # 52
00263         data = self.getData(bufferSize)
00264         #print self.printBlock(data)
00265         data = self.getData(4)
00266         iTable-=1
00267 
00268         self.readMarkers([iTable,1,0]) # 4
00269 
00270 
00271 
00272         #-------------------------------------------
00273         #print self.printSection(240)
00274         #sys.exit('SDF...')
00275 
00276     def readTable_CASECC(self):
00277         tableName = self.readTableName(rewind=False) # CASECC
00278         #print '*tableName = ',tableName
00279         self.tableInit(tableName)
00280         self.readMarkers([-1,7])
00281         data = self.getData(4)
00282         bufferSize, = unpack('i',data)
00283         #print "bufferSize = ",bufferSize
00284         data = self.getData(bufferSize)
00285         #print self.printBlock(data)
00286         data = self.getData(4)
00287         #print "---------------"
00288         
00289         
00290         self.readMarkers([-2,1,0])
00291         bufferWords = self.getMarker()
00292         data = self.getData(4)
00293         bufferSize, = unpack('i',data)
00294         #print "bufferSize = ",bufferSize
00295         data = self.getData(bufferSize)
00296         #print self.printBlock(data)
00297         data = self.getData(4)
00298         
00299         #data = self.readBlock()
00300         #print self.printBlock(data)
00301         #print "---------------"
00302         self.readMarkers([-3,1,0])
00303         bufferWords = self.getMarker()
00304         data = self.getData(4)
00305         bufferSize, = unpack('i',data)
00306         #print "bufferWords = ",bufferWords
00307         #print "bufferSize = ",bufferSize
00308         data = self.getData(bufferSize)
00309         #print self.printBlock(data)
00310         data = self.getData(4)
00311 
00312         #print "---------------"
00313         self.readMarkers([-4,1,0])
00314 
00315 
00316         #print(self.printSection(240))
00317         sys.exit('CASECC...')
00318 
00319     def readTable_OMM2(self):
00320         #-------------------------------------------
00321         tableName = self.readTableName(rewind=False) # PCOMP
00322         self.tableInit(tableName)
00323         self.readMarkers([-1,7])
00324         ints = self.readIntBlock()  # ??? ints
00325         #print ints
00326 
00327         #-------------------------------------------
00328         iTable=-2
00329         while 1:
00330             self.readMarkers([iTable,1,0]) # 2
00331             try:
00332                 n = self.op2.tell()
00333                 #print "iTable = ",iTable
00334                 bufferWords = self.getMarker()
00335                 #print "bufferWords = ",bufferWords
00336                 data = self.getData(4)
00337                 bufferSize, = unpack('i',data)
00338                 #print "bufferSize = ",bufferSize
00339                 data = self.getData(bufferWords*4)
00340                 #print self.printBlock(data)
00341                 data = self.getData(4)
00342                 iTable-=1
00343             except:
00344                 self.goto(n)
00345                 break
00346             ###
00347         ###
00348 
00349         #-------------------------------------------
00350         #print self.printSection(400)
00351         #sys.exit('OMM2...stop...')
00352 
00353     def readTable_DUMMY_GEOM(self,tableName):
00354         self.iTableMap = {}
00355         self.readRecordTable(tableName)
 All Classes Namespaces Files Functions Variables