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 #!/usr/bin/env python 00026 00027 # This example shows how to manually construct unstructured grids 00028 # using Python. Unstructured grids require explicit point and cell 00029 # representations, so every point and cell must be created, and then 00030 # added to the vtkUnstructuredGrid instance. 00031 00032 import wx 00033 import vtk 00034 from vtk import (vtkTriangle,vtkQuad,vtkTetra,vtkWedge,vtkHexahedron, 00035 vtkQuadraticTriangle,vtkQuadraticQuad,vtkQuadraticTetra,vtkQuadraticWedge,vtkQuadraticHexahedron) 00036 00037 00038 import sys 00039 import pyNastran 00040 from pyNastran.bdf.bdf import (BDF, CAERO1, CQUAD4, CQUAD8, CTRIA3, CTRIA6, 00041 CTETRA4, CTETRA10, CPENTA6, CPENTA15, 00042 CHEXA8, CHEXA20, CONM2, LineElement, 00043 SpringElement) 00044 from mouseStyle import MouseStyle 00045 00046 00047 def getScreenCorner(x,y): 00048 #print "wx.GetDisplaySize() = ",wx.GetDisplaySize() 00049 (xScreen,yScreen) = wx.GetDisplaySize() 00050 xCorner = (xScreen-x)//2 00051 yCorner = (yScreen-y)//2 00052 return(xCorner,yCorner) 00053 00054 version = pyNastran.__version__ 00055 bdfFileName = sys.argv[1] 00056 00057 00058 class FrameVTK(object): 00059 def __init__(self,isEdges): 00060 self.isEdges = isEdges # surface wireframe 00061 self.loadGeometry(bdfFileName) 00062 self.main() 00063 00064 def getColors(self): 00065 pass 00066 #Merger = vtk.vtkMergeFilter() 00067 #Filter = vtk.vtkGeometryFilter() 00068 #Filter.SetInput(self.aQuadGrid) 00069 00070 00071 00072 #Filter = vtk.vtkRotationFilter() 00073 #Filter.SetCenter(0.,0.,0.) 00074 #Filter.SetNumberOfCopies(1) 00075 #Filter.SetInput(aQuadGrid) 00076 #Filter.Update() 00077 00078 def getEdges(self): 00079 edges = vtk.vtkExtractEdges() 00080 edges.SetInput(self.grid) 00081 self.edgeMapper = vtk.vtkPolyDataMapper() 00082 self.edgeMapper.SetInput(edges.GetOutput()) 00083 #self.edgeMapper.EdgeVisibilityOff() 00084 00085 self.edgeActor = vtk.vtkActor() 00086 self.edgeActor.SetMapper(self.edgeMapper) 00087 self.edgeActor.GetProperty().SetColor(0,0,0) 00088 prop = self.edgeActor.GetProperty() 00089 #prop.SetLineWidth(0.0) 00090 if self.isEdges: 00091 prop.EdgeVisibilityOn() 00092 else: 00093 prop.EdgeVisibilityOff() 00094 00095 self.rend.AddActor(self.edgeActor) 00096 00097 vtk.vtkPolyDataMapper().SetResolveCoincidentTopologyToPolygonOffset() 00098 print "visible = ",prop.GetEdgeVisibility() 00099 #self.edgeActor.Update() 00100 00101 00102 def addGeometry(self): 00103 aQuadMapper = vtk.vtkDataSetMapper() 00104 aQuadMapper.SetInput(self.grid) 00105 #aQuadMapper.SetInput(Filter.GetOutput()) 00106 geometryActor = vtk.vtkActor() 00107 geometryActor.SetMapper(aQuadMapper) 00108 #geometryActor.AddPosition(2, 0, 2) 00109 #geometryActor.GetProperty().SetDiffuseColor(0, 0, 1) # blue 00110 geometryActor.GetProperty().SetDiffuseColor(1, 0, 0) # red 00111 self.rend.AddActor(geometryActor) 00112 00113 def addAltGeometry(self): 00114 aQuadMapper = vtk.vtkDataSetMapper() 00115 aQuadMapper.SetInput(self.grid2) 00116 #aQuadMapper.SetInput(Filter.GetOutput()) 00117 geometryActor = vtk.vtkActor() 00118 geometryActor.SetMapper(aQuadMapper) 00119 #geometryActor.AddPosition(2, 0, 2) 00120 #geometryActor.GetProperty().SetDiffuseColor(0, 0, 1) # blue 00121 geometryActor.GetProperty().SetDiffuseColor(1, 1, 0) # green 00122 self.rend.AddActor(geometryActor) 00123 vtk.vtkPolyDataMapper().SetResolveCoincidentTopologyToPolygonOffset() 00124 00125 def main(self): 00126 self.rend = vtk.vtkRenderer() 00127 self.addGeometry() 00128 self.addAltGeometry() 00129 00130 # Create the usual rendering stuff. 00131 if self.isEdges: 00132 self.getEdges() 00133 self.rend.GetActiveCamera().ParallelProjectionOn() 00134 self.rend.SetBackground(.1, .2, .4) 00135 self.rend.ResetCamera() 00136 00137 self.renWin = vtk.vtkRenderWindow() 00138 self.renWin.AddRenderer(self.rend) 00139 00140 cam = self.rend.GetActiveCamera() 00141 mouseArgs = {'pipeline':self,'camera':cam} 00142 00143 xSize = 500 00144 ySize = 400 00145 k = wx.App(False) # required to get screen resolution; will be True in final gui 00146 (x,y) = getScreenCorner(xSize,ySize) 00147 self.renWin.SetSize(xSize,ySize) 00148 self.renWin.SetPosition(x,y) 00149 00150 00151 iren = vtk.vtkRenderWindowInteractor() 00152 mouseStyle = MouseStyle(mouseArgs,iren) 00153 iren.SetInteractorStyle(mouseStyle) 00154 iren.SetRenderWindow(self.renWin) 00155 00156 iren.AddObserver("KeyPressEvent", mouseStyle.OnKeyPress) 00157 00158 print "type(ren) = ",type(self.rend) 00159 #self.rend.GetActiveCamera().Zoom(2.0) 00160 00161 # Render the scene and start interaction. 00162 iren.Initialize() 00163 self.renWin.Render() 00164 self.renWin.SetWindowName("pyNastran v%s - %s" %(version,bdfFileName)) 00165 iren.Start() 00166 00167 def loadGeometry(self,bdf_filename): 00168 model = BDF() 00169 model.readBDF(bdf_filename) 00170 00171 nNodes = model.nNodes() 00172 nElements = model.nElements() 00173 nCAeros = model.nCAeros() 00174 00175 #print "nNodes = ",nNodes 00176 print "nElements = ",nElements 00177 00178 self.grid = vtk.vtkUnstructuredGrid() 00179 self.grid2 = vtk.vtkUnstructuredGrid() 00180 #self.aQuadGrid.Allocate(nElements+nNodes, 1000) 00181 00182 if 'CONM2' in model.cardCount: 00183 nCONM2 = model.cardCount['CONM2'] 00184 else: 00185 nCONM2 = 0 00186 self.grid.Allocate(nElements, 1000) 00187 self.grid2.Allocate(nCAeros +nCONM2, 1000) 00188 00189 points = vtk.vtkPoints() 00190 points.SetNumberOfPoints(nNodes) 00191 nidMap = {} 00192 i=0 00193 #elem.SetNumberOfPoints(nNodes) 00194 for nid,node in sorted(model.nodes.iteritems()): 00195 #print "i = ",i 00196 point = node.Position() 00197 #print "point = ",point 00198 #sys.stdout.flush() 00199 #aVoxel = vtk.vtkPixel() 00200 #print "made voxel"; sys.stdout.flush() 00201 points.InsertPoint(i, *point) 00202 00203 #print str(element) 00204 00205 #elem = vtk.vtkVertex() 00206 #elem.GetPointIds().SetId(0, i) 00207 #self.aQuadGrid.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) 00208 00209 nidMap[nid] = i 00210 i+=1 00211 00212 j = 0 00213 points2 = vtk.vtkPoints() 00214 points2.SetNumberOfPoints(nCAeros*4+nCONM2) 00215 for eid,element in sorted(model.caeros.iteritems()): 00216 if isinstance(element,CAERO1): 00217 cpoints = element.Points() 00218 elem = vtkQuad() 00219 elem.GetPointIds().SetId(0, j) 00220 elem.GetPointIds().SetId(1, j+1) 00221 elem.GetPointIds().SetId(2, j+2) 00222 elem.GetPointIds().SetId(3, j+3) 00223 points2.InsertPoint(j, *cpoints[0]) 00224 points2.InsertPoint(j+1, *cpoints[1]) 00225 points2.InsertPoint(j+2, *cpoints[2]) 00226 points2.InsertPoint(j+3, *cpoints[3]) 00227 self.grid2.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) 00228 j+=4 00229 self.mapElements(points,points2,nidMap,model,j) 00230 00231 def mapElements(self,points,points2,nidMap,model,j): 00232 for eid,element in sorted(model.elements.iteritems()): 00233 if isinstance(element,CTRIA3): 00234 #print "ctria3" 00235 elem = vtkTriangle() 00236 nodeIDs = element.nodeIDs() 00237 elem.GetPointIds().SetId(0, nidMap[nodeIDs[0]]) 00238 elem.GetPointIds().SetId(1, nidMap[nodeIDs[1]]) 00239 elem.GetPointIds().SetId(2, nidMap[nodeIDs[2]]) 00240 self.grid.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) 00241 elif isinstance(element,CTRIA6): 00242 nodeIDs = element.nodeIDs() 00243 if None not in nodeIDs: 00244 elem = vtkQuadraticTriangle() 00245 elem.GetPointIds().SetId(3, nidMap[nodeIDs[3]]) 00246 elem.GetPointIds().SetId(4, nidMap[nodeIDs[4]]) 00247 elem.GetPointIds().SetId(5, nidMap[nodeIDs[5]]) 00248 else: 00249 elem = vtkTriangle() 00250 elem.GetPointIds().SetId(0, nidMap[nodeIDs[0]]) 00251 elem.GetPointIds().SetId(1, nidMap[nodeIDs[1]]) 00252 elem.GetPointIds().SetId(2, nidMap[nodeIDs[2]]) 00253 self.grid.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) 00254 elif isinstance(element,CQUAD4): 00255 nodeIDs = element.nodeIDs() 00256 elem = vtkQuad() 00257 elem.GetPointIds().SetId(0, nidMap[nodeIDs[0]]) 00258 elem.GetPointIds().SetId(1, nidMap[nodeIDs[1]]) 00259 elem.GetPointIds().SetId(2, nidMap[nodeIDs[2]]) 00260 elem.GetPointIds().SetId(3, nidMap[nodeIDs[3]]) 00261 self.grid.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) 00262 elif isinstance(element,CQUAD8): 00263 nodeIDs = element.nodeIDs() 00264 if None not in nodeIDs: 00265 elem = vtkQuadraticQuad() 00266 elem.GetPointIds().SetId(4, nidMap[nodeIDs[4]]) 00267 elem.GetPointIds().SetId(5, nidMap[nodeIDs[5]]) 00268 elem.GetPointIds().SetId(6, nidMap[nodeIDs[6]]) 00269 elem.GetPointIds().SetId(7, nidMap[nodeIDs[7]]) 00270 else: 00271 elem = vtkQuad() 00272 elem.GetPointIds().SetId(0, nidMap[nodeIDs[0]]) 00273 elem.GetPointIds().SetId(1, nidMap[nodeIDs[1]]) 00274 elem.GetPointIds().SetId(2, nidMap[nodeIDs[2]]) 00275 elem.GetPointIds().SetId(3, nidMap[nodeIDs[3]]) 00276 self.grid.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) 00277 elif isinstance(element,CTETRA4): 00278 elem = vtkTetra() 00279 nodeIDs = element.nodeIDs() 00280 elem.GetPointIds().SetId(0, nidMap[nodeIDs[0]]) 00281 elem.GetPointIds().SetId(1, nidMap[nodeIDs[1]]) 00282 elem.GetPointIds().SetId(2, nidMap[nodeIDs[2]]) 00283 elem.GetPointIds().SetId(3, nidMap[nodeIDs[3]]) 00284 self.grid.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) 00285 elif isinstance(element,CTETRA10): 00286 nodeIDs = element.nodeIDs() 00287 if None not in nodeIDs: 00288 elem = vtkQuadraticTetra() 00289 elem.GetPointIds().SetId(4, nidMap[nodeIDs[4]]) 00290 elem.GetPointIds().SetId(5, nidMap[nodeIDs[5]]) 00291 elem.GetPointIds().SetId(6, nidMap[nodeIDs[6]]) 00292 elem.GetPointIds().SetId(7, nidMap[nodeIDs[7]]) 00293 elem.GetPointIds().SetId(8, nidMap[nodeIDs[8]]) 00294 elem.GetPointIds().SetId(9, nidMap[nodeIDs[9]]) 00295 else: 00296 elem = vtkTetra() 00297 elem.GetPointIds().SetId(0, nidMap[nodeIDs[0]]) 00298 elem.GetPointIds().SetId(1, nidMap[nodeIDs[1]]) 00299 elem.GetPointIds().SetId(2, nidMap[nodeIDs[2]]) 00300 elem.GetPointIds().SetId(3, nidMap[nodeIDs[3]]) 00301 self.grid.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) 00302 elif isinstance(element,CPENTA6): 00303 elem = vtkWedge() 00304 nodeIDs = element.nodeIDs() 00305 elem.GetPointIds().SetId(0, nidMap[nodeIDs[0]]) 00306 elem.GetPointIds().SetId(1, nidMap[nodeIDs[1]]) 00307 elem.GetPointIds().SetId(2, nidMap[nodeIDs[2]]) 00308 elem.GetPointIds().SetId(3, nidMap[nodeIDs[3]]) 00309 elem.GetPointIds().SetId(4, nidMap[nodeIDs[4]]) 00310 elem.GetPointIds().SetId(5, nidMap[nodeIDs[5]]) 00311 self.grid.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) 00312 00313 elif isinstance(element,CPENTA15): 00314 nodeIDs = element.nodeIDs() 00315 if None not in nodeIDs: 00316 elem = vtkQuadraticWedge() 00317 elem.GetPointIds().SetId(6, nidMap[nodeIDs[6]]) 00318 elem.GetPointIds().SetId(7, nidMap[nodeIDs[7]]) 00319 elem.GetPointIds().SetId(8, nidMap[nodeIDs[8]]) 00320 elem.GetPointIds().SetId(9, nidMap[nodeIDs[9]]) 00321 elem.GetPointIds().SetId(10, nidMap[nodeIDs[10]]) 00322 elem.GetPointIds().SetId(11, nidMap[nodeIDs[11]]) 00323 elem.GetPointIds().SetId(12, nidMap[nodeIDs[12]]) 00324 elem.GetPointIds().SetId(13, nidMap[nodeIDs[13]]) 00325 elem.GetPointIds().SetId(14, nidMap[nodeIDs[14]]) 00326 else: 00327 elem = vtkWedge() 00328 elem.GetPointIds().SetId(0, nidMap[nodeIDs[0]]) 00329 elem.GetPointIds().SetId(1, nidMap[nodeIDs[1]]) 00330 elem.GetPointIds().SetId(2, nidMap[nodeIDs[2]]) 00331 elem.GetPointIds().SetId(3, nidMap[nodeIDs[3]]) 00332 elem.GetPointIds().SetId(4, nidMap[nodeIDs[4]]) 00333 elem.GetPointIds().SetId(5, nidMap[nodeIDs[5]]) 00334 self.grid.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) 00335 elif isinstance(element,CHEXA8): 00336 nodeIDs = element.nodeIDs() 00337 elem = vtkHexahedron() 00338 elem.GetPointIds().SetId(0, nidMap[nodeIDs[0]]) 00339 elem.GetPointIds().SetId(1, nidMap[nodeIDs[1]]) 00340 elem.GetPointIds().SetId(2, nidMap[nodeIDs[2]]) 00341 elem.GetPointIds().SetId(3, nidMap[nodeIDs[3]]) 00342 elem.GetPointIds().SetId(4, nidMap[nodeIDs[4]]) 00343 elem.GetPointIds().SetId(5, nidMap[nodeIDs[5]]) 00344 elem.GetPointIds().SetId(6, nidMap[nodeIDs[6]]) 00345 elem.GetPointIds().SetId(7, nidMap[nodeIDs[7]]) 00346 self.grid.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) 00347 elif isinstance(element,CHEXA20): 00348 nodeIDs = element.nodeIDs() 00349 #print "nodeIDs = ",nodeIDs 00350 if None not in nodeIDs: 00351 elem = vtkQuadraticHexahedron() 00352 elem.GetPointIds().SetId(8, nidMap[nodeIDs[8]]) 00353 elem.GetPointIds().SetId(9, nidMap[nodeIDs[9]]) 00354 elem.GetPointIds().SetId(10, nidMap[nodeIDs[10]]) 00355 elem.GetPointIds().SetId(11, nidMap[nodeIDs[11]]) 00356 elem.GetPointIds().SetId(12, nidMap[nodeIDs[12]]) 00357 elem.GetPointIds().SetId(13, nidMap[nodeIDs[13]]) 00358 elem.GetPointIds().SetId(14, nidMap[nodeIDs[14]]) 00359 elem.GetPointIds().SetId(15, nidMap[nodeIDs[15]]) 00360 elem.GetPointIds().SetId(16, nidMap[nodeIDs[16]]) 00361 elem.GetPointIds().SetId(17, nidMap[nodeIDs[17]]) 00362 elem.GetPointIds().SetId(18, nidMap[nodeIDs[18]]) 00363 elem.GetPointIds().SetId(19, nidMap[nodeIDs[19]]) 00364 else: 00365 elem = vtkHexahedron() 00366 00367 elem.GetPointIds().SetId(0, nidMap[nodeIDs[0]]) 00368 elem.GetPointIds().SetId(1, nidMap[nodeIDs[1]]) 00369 elem.GetPointIds().SetId(2, nidMap[nodeIDs[2]]) 00370 elem.GetPointIds().SetId(3, nidMap[nodeIDs[3]]) 00371 elem.GetPointIds().SetId(4, nidMap[nodeIDs[4]]) 00372 elem.GetPointIds().SetId(5, nidMap[nodeIDs[5]]) 00373 elem.GetPointIds().SetId(6, nidMap[nodeIDs[6]]) 00374 elem.GetPointIds().SetId(7, nidMap[nodeIDs[7]]) 00375 self.grid.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) 00376 elif isinstance(element,LineElement) or isinstance(element,SpringElement): 00377 elem = vtk.vtkLine() 00378 nodeIDs = element.nodeIDs() 00379 elem.GetPointIds().SetId(0, nidMap[nodeIDs[0]]) 00380 elem.GetPointIds().SetId(1, nidMap[nodeIDs[1]]) 00381 self.grid.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) 00382 ### 00383 elif isinstance(element,CONM2): # not perfectly located 00384 nid = element.Nid() 00385 c = element.Centroid() 00386 elem = vtk.vtkVertex() 00387 #elem = vtk.vtkSphere() 00388 #elem.SetRadius(1.0) 00389 #print str(element) 00390 00391 points2.InsertPoint(j, *c) 00392 elem.GetPointIds().SetId(0, j) 00393 #elem.SetCenter(points.GetPoint(nidMap[nid])) 00394 self.grid2.InsertNextCell(elem.GetCellType(), elem.GetPointIds()) 00395 j+=1 00396 else: 00397 print "skipping %s" %(element.type) 00398 00399 ### 00400 self.grid.SetPoints(points) 00401 self.grid2.SetPoints(points2) 00402 self.grid.Update() 00403 self.grid2.Update() 00404 00405 def takePicture(self): 00406 """ 00407 doesnt work... 00408 """ 00409 #imageName = 'image.tiff' 00410 imageName = 'image.png' 00411 self.captureImage(imageName) 00412 print "took picture %s" %(imageName) 00413 00414 def captureImage(self,imageName): 00415 """ 00416 doesnt work... 00417 """ 00418 w2i = vtk.vtkWindowToImageFilter() 00419 #writer = vtk.vtkTIFFWriter() 00420 writer = vtk.vtkPNGWriter() 00421 w2i.SetInput(self.renWin) 00422 w2i.Update() 00423 writer.SetInputConnection(w2i.GetOutputPort()) 00424 self.renWin.Render() 00425 writer.SetFileName(imageName) 00426 writer.Write() 00427 00428 def main(): 00429 isEdges = False 00430 p = FrameVTK(isEdges) 00431 00432 if __name__=='__main__': 00433 main()