pyNastran
0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
|
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)