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