Package PyFoam :: Package Applications :: Module DisplayBlockMesh
[hide private]
[frames] | no frames]

Source Code for Module PyFoam.Applications.DisplayBlockMesh

  1  """ 
  2  Old implementation using Tkinter. This is no longer supported. 
  3  If possible use the Qt-Variant 
  4  """ 
  5   
  6  import sys 
  7   
  8  from PyFoam.RunDictionary.ParsedBlockMeshDict import ParsedBlockMeshDict 
  9  from PyFoam.Applications.PyFoamApplication import PyFoamApplication 
 10  from PyFoam.Error import error,warning 
 11   
12 -def doImports():
13 try: 14 global Tkinter 15 import Tkinter 16 global vtk 17 try: 18 import vtk 19 print "Using system-VTK" 20 except ImportError: 21 print "Trying VTK implementation from Paraview" 22 from paraview import vtk 23 global vtkTkRenderWindowInteractor 24 from vtk.tk.vtkTkRenderWindowInteractor import vtkTkRenderWindowInteractor 25 except ImportError,e: 26 error("Error while importing modules:",e)
27
28 -class DisplayBlockMesh(PyFoamApplication):
29 - def __init__(self):
30 description="""\ 31 Reads the contents of a blockMeshDict-file and displays the vertices 32 as spheres (with numbers). The blocks are sketched by lines. One block 33 can be seceted with a slider. It will be displayed as a green cube 34 with the local directions x1,x2 and x3. Also a patch that is selected 35 by a slider will be sketched by blue squares. This implementation 36 uses Tkinter and is no longer activly developed. Use the QT-version. 37 """ 38 PyFoamApplication.__init__(self, 39 description=description, 40 usage="%prog [options] <blockMeshDict>", 41 interspersed=True, 42 nr=1)
43
44 - def run(self):
45 doImports() 46 47 self.renWin = vtk.vtkRenderWindow() 48 self.ren = vtk.vtkRenderer() 49 self.renWin.AddRenderer(self.ren) 50 self.renWin.SetSize(600, 600) 51 self.ren.SetBackground(0.7, 0.7, 0.7) 52 self.ren.ResetCamera() 53 self.cam = self.ren.GetActiveCamera() 54 55 self.axes = vtk.vtkCubeAxesActor2D() 56 self.axes.SetCamera(self.ren.GetActiveCamera()) 57 58 self.undefinedActor=vtk.vtkTextActor() 59 self.undefinedActor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() 60 self.undefinedActor.GetPositionCoordinate().SetValue(0.05,0.2) 61 self.undefinedActor.GetTextProperty().SetColor(1.,0.,0.) 62 self.undefinedActor.SetInput("") 63 64 try: 65 self.readFile() 66 except Exception,e: 67 warning("While reading",self.parser.getArgs()[0],"this happened:",e) 68 raise e 69 70 self.ren.ResetCamera() 71 72 self.root = Tkinter.Tk() 73 self.root.withdraw() 74 75 # Create the toplevel window 76 self.top = Tkinter.Toplevel(self.root) 77 self.top.title("blockMesh-Viewer") 78 self.top.protocol("WM_DELETE_WINDOW", self.quit) 79 80 # Create some frames 81 self.f1 = Tkinter.Frame(self.top) 82 self.f2 = Tkinter.Frame(self.top) 83 84 self.f1.pack(side="top", anchor="n", expand=1, fill="both") 85 self.f2.pack(side="bottom", anchor="s", expand="f", fill="x") 86 87 # Create the Tk render widget, and bind the events 88 self.rw = vtkTkRenderWindowInteractor(self.f1, width=400, height=400, rw=self.renWin) 89 self.rw.pack(expand="t", fill="both") 90 91 self.blockHigh=Tkinter.IntVar() 92 self.blockHigh.set(-1) 93 94 self.oldBlock=-1 95 self.blockActor=None 96 self.blockTextActor=None 97 98 self.patchHigh=Tkinter.IntVar() 99 self.patchHigh.set(-1) 100 101 self.oldPatch=-1 102 self.patchActor=None 103 self.patchTextActor=vtk.vtkTextActor() 104 self.patchTextActor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() 105 self.patchTextActor.GetPositionCoordinate().SetValue(0.05,0.1) 106 self.patchTextActor.GetTextProperty().SetColor(0.,0.,0.) 107 self.patchTextActor.SetInput("Patch: <none>") 108 109 self.scroll=Tkinter.Scale(self.f2,orient='horizontal', 110 from_=-1,to=len(self.blocks)-1,resolution=1,tickinterval=1, 111 label="Block (-1 is none)", 112 variable=self.blockHigh,command=self.colorBlock) 113 114 self.scroll.pack(side="top", expand="t", fill="x") 115 116 self.scroll2=Tkinter.Scale(self.f2,orient='horizontal', 117 from_=-1,to=len(self.patches.keys())-1,resolution=1,tickinterval=1, 118 label="Patch (-1 is none)", 119 variable=self.patchHigh,command=self.colorPatch) 120 121 self.scroll2.pack(side="top", expand="t", fill="x") 122 123 self.f3 = Tkinter.Frame(self.f2) 124 self.f3.pack(side="bottom", anchor="s", expand="f", fill="x") 125 126 self.b1 = Tkinter.Button(self.f3, text="Quit", command=self.quit) 127 self.b1.pack(side="left", expand="t", fill="x") 128 self.b2 = Tkinter.Button(self.f3, text="Reread blockMeshDict", command=self.reread) 129 self.b2.pack(side="left", expand="t", fill="x") 130 131 self.root.update() 132 133 self.iren = self.renWin.GetInteractor() 134 self.istyle = vtk.vtkInteractorStyleSwitch() 135 136 self.iren.SetInteractorStyle(self.istyle) 137 self.istyle.SetCurrentStyleToTrackballCamera() 138 139 self.addProps() 140 141 self.iren.Initialize() 142 self.renWin.Render() 143 self.iren.Start() 144 145 self.root.mainloop()
146
147 - def readFile(self):
148 self.blockMesh=ParsedBlockMeshDict(self.parser.getArgs()[0]) 149 150 self.vertices=self.blockMesh.vertices() 151 self.vActors=[None]*len(self.vertices) 152 153 self.blocks=self.blockMesh.blocks() 154 self.patches=self.blockMesh.patches() 155 156 self.vRadius=self.blockMesh.typicalLength()/50 157 158 for i in range(len(self.vertices)): 159 self.addVertex(i) 160 161 self.setAxes() 162 163 self.undefined=[] 164 165 for i in range(len(self.blocks)): 166 self.addBlock(i) 167 168 for a in self.blockMesh.arcs(): 169 self.makeArc(a) 170 171 if len(self.undefined)>0: 172 self.undefinedActor.SetInput("Undefined vertices: "+str(self.undefined)) 173 else: 174 self.undefinedActor.SetInput("")
175
176 - def addUndefined(self,i):
177 if not i in self.undefined: 178 self.undefined.append(i)
179
180 - def addProps(self):
181 self.ren.AddViewProp(self.axes) 182 self.ren.AddActor2D(self.patchTextActor) 183 self.ren.AddActor2D(self.undefinedActor)
184
185 - def addPoint(self,coord,factor=1):
186 sphere=vtk.vtkSphereSource() 187 sphere.SetRadius(self.vRadius*factor) 188 sphere.SetCenter(coord) 189 mapper=vtk.vtkPolyDataMapper() 190 mapper.SetInputConnection(sphere.GetOutputPort()) 191 actor = vtk.vtkActor() 192 actor.SetMapper(mapper) 193 self.ren.AddActor(actor) 194 195 return actor
196
197 - def addVertex(self,index):
198 coord=self.vertices[index] 199 self.vActors[index]=self.addPoint(coord) 200 text=vtk.vtkVectorText() 201 text.SetText(str(index)) 202 tMapper=vtk.vtkPolyDataMapper() 203 tMapper.SetInput(text.GetOutput()) 204 tActor = vtk.vtkFollower() 205 tActor.SetMapper(tMapper) 206 tActor.SetScale(2*self.vRadius,2*self.vRadius,2*self.vRadius) 207 tActor.AddPosition(coord[0]+self.vRadius,coord[1]+self.vRadius,coord[2]+self.vRadius) 208 tActor.SetCamera(self.cam) 209 tActor.GetProperty().SetColor(1.0,0.,0.) 210 self.ren.AddActor(tActor)
211
212 - def addLine(self,index1,index2):
213 try: 214 c1=self.vertices[index1] 215 c2=self.vertices[index2] 216 except: 217 if index1>=len(self.vertices): 218 self.addUndefined(index1) 219 if index2>=len(self.vertices): 220 self.addUndefined(index2) 221 return None 222 line=vtk.vtkLineSource() 223 line.SetPoint1(c1) 224 line.SetPoint2(c2) 225 mapper=vtk.vtkPolyDataMapper() 226 mapper.SetInputConnection(line.GetOutputPort()) 227 actor = vtk.vtkActor() 228 actor.SetMapper(mapper) 229 self.ren.AddActor(actor) 230 return actor
231
232 - def makeDirection(self,index1,index2,label):
233 try: 234 c1=self.vertices[index1] 235 c2=self.vertices[index2] 236 except: 237 return None,None 238 line=vtk.vtkLineSource() 239 line.SetPoint1(c1) 240 line.SetPoint2(c2) 241 tube=vtk.vtkTubeFilter() 242 tube.SetRadius(self.vRadius*0.5) 243 tube.SetNumberOfSides(10) 244 tube.SetInput(line.GetOutput()) 245 text=vtk.vtkVectorText() 246 text.SetText(label) 247 tMapper=vtk.vtkPolyDataMapper() 248 tMapper.SetInput(text.GetOutput()) 249 tActor = vtk.vtkFollower() 250 tActor.SetMapper(tMapper) 251 tActor.SetScale(self.vRadius,self.vRadius,self.vRadius) 252 tActor.AddPosition((c1[0]+c2[0])/2+self.vRadius,(c1[1]+c2[1])/2+self.vRadius,(c1[2]+c2[2])/2+self.vRadius) 253 tActor.SetCamera(self.cam) 254 tActor.GetProperty().SetColor(0.0,0.,0.) 255 return tube.GetOutput(),tActor
256
257 - def makeSpline(self,lst):
258 points = vtk.vtkPoints() 259 for i in range(len(lst)): 260 v=lst[i] 261 points.InsertPoint(i,v[0],v[1],v[2]) 262 spline=vtk.vtkParametricSpline() 263 spline.SetPoints(points) 264 spline.ClosedOff() 265 splineSource=vtk.vtkParametricFunctionSource() 266 splineSource.SetParametricFunction(spline) 267 mapper=vtk.vtkPolyDataMapper() 268 mapper.SetInputConnection(splineSource.GetOutputPort()) 269 actor = vtk.vtkActor() 270 actor.SetMapper(mapper) 271 self.ren.AddActor(actor)
272
273 - def makeArc(self,data):
274 try: 275 self.makeSpline([self.vertices[data[0]],data[1],self.vertices[data[2]]]) 276 except: 277 if data[0]>=len(self.vertices): 278 self.addUndefined(data[0]) 279 if data[2]>=len(self.vertices): 280 self.addUndefined(data[2]) 281 282 self.addPoint(data[1],factor=0.5)
283
284 - def makeFace(self,lst):
285 points = vtk.vtkPoints() 286 side = vtk.vtkCellArray() 287 side.InsertNextCell(len(lst)) 288 for i in range(len(lst)): 289 try: 290 v=self.vertices[lst[i]] 291 except: 292 self.addUndefined(lst[i]) 293 return None 294 points.InsertPoint(i,v[0],v[1],v[2]) 295 side.InsertCellPoint(i) 296 result=vtk.vtkPolyData() 297 result.SetPoints(points) 298 result.SetPolys(side) 299 300 return result
301
302 - def addBlock(self,index):
303 b=self.blocks[index] 304 305 self.addLine(b[ 0],b[ 1]) 306 self.addLine(b[ 3],b[ 2]) 307 self.addLine(b[ 7],b[ 6]) 308 self.addLine(b[ 4],b[ 5]) 309 self.addLine(b[ 0],b[ 3]) 310 self.addLine(b[ 1],b[ 2]) 311 self.addLine(b[ 5],b[ 6]) 312 self.addLine(b[ 4],b[ 7]) 313 self.addLine(b[ 0],b[ 4]) 314 self.addLine(b[ 1],b[ 5]) 315 self.addLine(b[ 2],b[ 6]) 316 self.addLine(b[ 3],b[ 7])
317
318 - def setAxes(self):
319 append=vtk.vtkAppendPolyData() 320 for a in self.vActors: 321 if a!=None: 322 append.AddInput(a.GetMapper().GetInput()) 323 self.axes.SetInput(append.GetOutput())
324 325 326 # Define a quit method that exits cleanly.
327 - def quit(self):
328 self.root.quit()
329
330 - def reread(self):
331 self.ren.RemoveAllViewProps() 332 self.patchActor=None 333 self.blockActor=None 334 self.blockTextActor=None 335 self.addProps() 336 self.readFile() 337 338 tmpBlock=int(self.blockHigh.get()) 339 if not tmpBlock<len(self.blocks): 340 tmpBlock=len(self.blocks)-1 341 self.scroll.config(to=len(self.blocks)-1) 342 self.blockHigh.set(tmpBlock) 343 self.colorBlock(tmpBlock) 344 345 tmpPatch=int(self.patchHigh.get()) 346 if not tmpPatch<len(self.patches.keys()): 347 tmpPatch=len(self.patches.keys())-1 348 self.scroll2.config(to=len(self.patches.keys())-1) 349 self.patchHigh.set(tmpPatch) 350 self.colorPatch(tmpPatch) 351 352 self.renWin.Render()
353
354 - def colorBlock(self,value):
355 newBlock=int(value) 356 if self.oldBlock>=0 and self.blockActor!=None: 357 self.ren.RemoveActor(self.blockActor) 358 for ta in self.blockTextActor: 359 self.ren.RemoveActor(ta) 360 self.blockActor=None 361 self.blockTextActor=None 362 if newBlock>=0: 363 append=vtk.vtkAppendPolyData() 364 append2=vtk.vtkAppendPolyData() 365 b=self.blocks[newBlock] 366 append.AddInput(self.makeFace([b[0],b[1],b[2],b[3]])) 367 append.AddInput(self.makeFace([b[4],b[5],b[6],b[7]])) 368 append.AddInput(self.makeFace([b[0],b[1],b[5],b[4]])) 369 append.AddInput(self.makeFace([b[3],b[2],b[6],b[7]])) 370 append.AddInput(self.makeFace([b[0],b[3],b[7],b[4]])) 371 append.AddInput(self.makeFace([b[1],b[2],b[6],b[5]])) 372 d,t1=self.makeDirection(b[0],b[1],"x1") 373 append.AddInput(d) 374 self.ren.AddActor(t1) 375 d,t2=self.makeDirection(b[0],b[3],"x2") 376 append.AddInput(d) 377 self.ren.AddActor(t2) 378 d,t3=self.makeDirection(b[0],b[4],"x3") 379 append.AddInput(d) 380 self.ren.AddActor(t3) 381 self.blockTextActor=(t1,t2,t3) 382 mapper=vtk.vtkPolyDataMapper() 383 mapper.SetInputConnection(append.GetOutputPort()) 384 self.blockActor = vtk.vtkActor() 385 self.blockActor.SetMapper(mapper) 386 self.blockActor.GetProperty().SetColor(0.,1.,0.) 387 self.blockActor.GetProperty().SetOpacity(0.3) 388 self.ren.AddActor(self.blockActor) 389 390 self.oldBlock=newBlock 391 self.renWin.Render()
392
393 - def colorPatch(self,value):
394 newPatch=int(value) 395 if self.oldPatch>=0 and self.patchActor!=None: 396 self.ren.RemoveActor(self.patchActor) 397 self.patchActor=None 398 self.patchTextActor.SetInput("Patch: <none>") 399 if newPatch>=0: 400 name=self.patches.keys()[newPatch] 401 subs=self.patches[name] 402 append=vtk.vtkAppendPolyData() 403 for s in subs: 404 append.AddInput(self.makeFace(s)) 405 mapper=vtk.vtkPolyDataMapper() 406 mapper.SetInputConnection(append.GetOutputPort()) 407 self.patchActor = vtk.vtkActor() 408 self.patchActor.SetMapper(mapper) 409 self.patchActor.GetProperty().SetColor(0.,0.,1.) 410 self.patchActor.GetProperty().SetOpacity(0.3) 411 self.ren.AddActor(self.patchActor) 412 self.patchTextActor.SetInput("Patch: "+name) 413 414 self.oldPatch=newPatch 415 self.renWin.Render()
416