pyNastran  0.5.0
pyNastran BDF Reader/Writer, OP2 Parser, and GUI
demoGui.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 #!/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()
 All Classes Namespaces Files Functions Variables