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

Source Code for Module PyFoam.Applications.DisplayBlockMeshQt

  1  """ 
  2  New implementation of DisplayBlockMesh using PyQT4 
  3  """ 
  4   
  5  from PyFoam.RunDictionary.ParsedBlockMeshDict import ParsedBlockMeshDict 
  6  from PyFoam.Applications.PyFoamApplicationQt4 import PyFoamApplicationQt4 
  7  from PyFoam.Error import error,warning 
  8  from PyFoam.RunDictionary.SolutionDirectory import NoTouchSolutionDirectory 
  9  from PyFoam.Execution.BasicRunner import BasicRunner 
 10   
 11  import sys 
 12  from os import path 
 13   
14 -def doImports():
15 try: 16 global QtGui,QtCore 17 from PyQt4 import QtGui,QtCore 18 global vtk 19 20 global usedVTK 21 22 try: 23 import vtk 24 usedVTK="Using system-VTK" 25 except ImportError: 26 usedVTK="Trying VTK implementation from Paraview" 27 from paraview import vtk 28 global QVTKRenderWindowInteractor 29 from vtk.qt4 import QVTKRenderWindowInteractor 30 except ImportError,e: 31 error("Error while importing modules:",e)
32 33 doImports() 34
35 -class ReportToThreadRunner(BasicRunner):
36 - def __init__(self, 37 argv, 38 thread):
39 BasicRunner.__init__(self, 40 argv=argv, 41 noLog=True, 42 silent=True) 43 self.thread=thread
44
45 - def lineHandle(self,line):
46 self.thread.append(line)
47
48 -class UtilityThread(QtCore.QThread):
49 - def __init__(self, 50 argv, 51 parent):
52 super(UtilityThread,self).__init__(parent) 53 self.argv=argv 54 self.status=""
55 - def run(self):
56 try: 57 runner=ReportToThreadRunner(argv=self.argv, 58 thread=self) 59 runner.start() 60 if not runner.runOK(): 61 self.status=" - Problem" 62 63 except IOError: 64 self.status=" - OS Problem"
65
66 - def append(self,line):
67 self.emit(QtCore.SIGNAL("newLine(QString)"),line)
68
69 -class DisplayBlockMeshDialog(QtGui.QMainWindow):
70 - def __init__(self,fName):
71 super(DisplayBlockMeshDialog,self).__init__(None) 72 self.fName=fName 73 74 self.numberScale=2 75 self.pointScale=1 76 self.axisLabelScale=1 77 self.axisTubeScale=0.5 78 79 self.setWindowTitle("%s[*] - DisplayBlockMesh" % fName) 80 81 self.caseDir=None 82 try: 83 caseDir=path.sep+apply(path.join,path.abspath(fName).split(path.sep)[:-3]) 84 isOK=NoTouchSolutionDirectory(caseDir) 85 if isOK: 86 self.caseDir=caseDir 87 self.setWindowTitle("Case %s[*] - DisplayBlockMesh" % caseDir.split(path.sep)[-1]) 88 except: 89 pass 90 91 central = QtGui.QWidget() 92 self.setCentralWidget(central) 93 94 layout = QtGui.QVBoxLayout() 95 central.setLayout(layout) 96 self.renInteractor=QVTKRenderWindowInteractor.QVTKRenderWindowInteractor(central) 97 # self.renInteractor.Initialize() # this creates a segfault for old PyQt 98 self.renInteractor.Start() 99 100 layout.addWidget(self.renInteractor) 101 102 mainDock=QtGui.QDockWidget("Main controls", 103 self) 104 mainDock.setObjectName("MainControlsDock") 105 mainDock.setFeatures(QtGui.QDockWidget.DockWidgetFloatable | QtGui.QDockWidget.DockWidgetMovable) 106 mainDock.setAllowedAreas(QtCore.Qt.TopDockWidgetArea | QtCore.Qt.BottomDockWidgetArea) 107 mainDockWidget=QtGui.QWidget() 108 mainDock.setWidget(mainDockWidget) 109 110 subLayout=QtGui.QGridLayout() 111 mainDockWidget.setLayout(subLayout) 112 self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, mainDock) 113 114 self.renInteractor.show() 115 self.renWin = self.renInteractor.GetRenderWindow() 116 self.ren = vtk.vtkRenderer() 117 self.renWin.AddRenderer(self.ren) 118 self.renWin.SetSize(600, 600) 119 self.ren.SetBackground(0.7, 0.7, 0.7) 120 self.ren.ResetCamera() 121 self.cam = self.ren.GetActiveCamera() 122 self.axes = vtk.vtkCubeAxesActor2D() 123 self.axes.SetCamera(self.ren.GetActiveCamera()) 124 125 self.undefinedActor=vtk.vtkTextActor() 126 self.undefinedActor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() 127 self.undefinedActor.GetPositionCoordinate().SetValue(0.05,0.2) 128 self.undefinedActor.GetTextProperty().SetColor(1.,0.,0.) 129 self.undefinedActor.SetInput("") 130 131 self.rereadAction=QtGui.QAction("&Reread", 132 self) 133 self.rereadAction.setShortcut("Ctrl+R") 134 self.rereadAction.setToolTip("Reread the blockMesh-file") 135 self.connect(self.rereadAction, 136 QtCore.SIGNAL("triggered()"), 137 self.reread) 138 139 self.blockMeshAction=QtGui.QAction("&BlockMesh", 140 self) 141 self.blockMeshAction.setShortcut("Ctrl+B") 142 self.blockMeshAction.setToolTip("Execute blockMesh-Utility") 143 self.connect(self.blockMeshAction, 144 QtCore.SIGNAL("triggered()"), 145 self.blockMesh) 146 147 self.checkMeshAction=QtGui.QAction("Chec&kMesh", 148 self) 149 self.checkMeshAction.setShortcut("Ctrl+K") 150 self.checkMeshAction.setToolTip("Execute checkMesh-Utility") 151 self.connect(self.checkMeshAction, 152 QtCore.SIGNAL("triggered()"), 153 self.checkMesh) 154 if self.caseDir==None: 155 self.blockMeshAction.setEnabled(False) 156 self.checkMeshAction.setEnabled(False) 157 158 self.quitAction=QtGui.QAction("&Quit", 159 self) 160 161 self.quitAction.setShortcut("Ctrl+Q") 162 self.quitAction.setToolTip("Quit this program") 163 self.connect(self.quitAction, 164 QtCore.SIGNAL("triggered()"), 165 self.close) 166 167 self.saveAction=QtGui.QAction("&Save", 168 self) 169 170 self.saveAction.setShortcut(QtGui.QKeySequence.Save) 171 self.saveAction.setToolTip("Save the blockmesh from the editor") 172 self.connect(self.saveAction, 173 QtCore.SIGNAL("triggered()"), 174 self.saveBlockMesh) 175 self.saveAction.setEnabled(False) 176 177 self.fileMenu=self.menuBar().addMenu("&Blockmesh file") 178 self.fileMenu.addAction(self.rereadAction) 179 self.fileMenu.addAction(self.saveAction) 180 self.fileMenu.addSeparator() 181 self.fileMenu.addAction(self.quitAction) 182 183 self.editorDock=QtGui.QDockWidget("Edit blockMesh", 184 self) 185 self.editorDock.setObjectName("EditorDock") 186 self.editorDock.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) 187 188 try: 189 self.editor=QtGui.QPlainTextEdit() 190 self.editor.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap) 191 self.editor.textChanged.connect(self.blockMeshWasModified) 192 self.alwaysSave=False 193 except AttributeError: 194 warning("Old PyQT4-version. Editing might not work as expected") 195 self.editor=QtGui.QTextEdit() 196 self.alwaysSave=True 197 self.saveAction.setEnabled(True) 198 199 self.editor.setFont(QtGui.QFont("Courier")) 200 201 self.editorDock.setWidget(self.editor) 202 self.addDockWidget(QtCore.Qt.RightDockWidgetArea,self.editorDock) 203 self.editorDock.hide() 204 205 self.utilityDock=QtGui.QDockWidget("Utility output", 206 self) 207 self.utilityOutput=QtGui.QTextEdit() 208 self.utilityOutput.setFont(QtGui.QFont("Courier")) 209 self.utilityOutput.setLineWrapMode(QtGui.QTextEdit.NoWrap) 210 self.utilityOutput.setReadOnly(True) 211 self.utilityDock.setWidget(self.utilityOutput) 212 self.utilityDock.setObjectName("UtilityDock") 213 self.utilityDock.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) 214 self.addDockWidget(QtCore.Qt.RightDockWidgetArea,self.utilityDock) 215 self.utilityDock.hide() 216 217 self.worker=None 218 219 self.texteditorAction=self.editorDock.toggleViewAction() 220 self.texteditorAction.setShortcut("Ctrl+E") 221 222 self.utilityAction=self.utilityDock.toggleViewAction() 223 self.utilityAction.setShortcut("Ctrl+U") 224 225 self.displayDock=QtGui.QDockWidget("Display Properties", 226 self) 227 self.displayDock.setObjectName("DisplayPropertiesDock") 228 self.displayDock.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) 229 230 displayStuff=QtGui.QWidget() 231 displayLayout=QtGui.QGridLayout() 232 displayStuff.setLayout(displayLayout) 233 displayLayout.addWidget(QtGui.QLabel("Number scale"),0,0) 234 nrScale=QtGui.QDoubleSpinBox() 235 nrScale.setValue(self.numberScale) 236 nrScale.setMinimum(1e-2) 237 nrScale.setSingleStep(0.1) 238 self.connect(nrScale,QtCore.SIGNAL("valueChanged(double)"),self.numberScaleChanged) 239 displayLayout.addWidget(nrScale,0,1) 240 displayLayout.addWidget(QtGui.QLabel("Point scale"),1,0) 241 ptScale=QtGui.QDoubleSpinBox() 242 ptScale.setValue(self.pointScale) 243 ptScale.setMinimum(1e-2) 244 ptScale.setSingleStep(0.1) 245 self.connect(ptScale,QtCore.SIGNAL("valueChanged(double)"),self.pointScaleChanged) 246 displayLayout.addWidget(ptScale,1,1) 247 displayLayout.addWidget(QtGui.QLabel("Axis label scale"),2,0) 248 axisLScale=QtGui.QDoubleSpinBox() 249 axisLScale.setValue(self.axisLabelScale) 250 axisLScale.setMinimum(1e-2) 251 axisLScale.setSingleStep(0.1) 252 self.connect(axisLScale,QtCore.SIGNAL("valueChanged(double)"),self.axisLabelScaleChanged) 253 displayLayout.addWidget(axisLScale,2,1) 254 displayLayout.addWidget(QtGui.QLabel("Axis tube scale"),3,0) 255 axisTScale=QtGui.QDoubleSpinBox() 256 axisTScale.setValue(self.axisTubeScale) 257 axisTScale.setMinimum(1e-2) 258 axisTScale.setSingleStep(0.1) 259 self.connect(axisTScale,QtCore.SIGNAL("valueChanged(double)"),self.axisTubeScaleChanged) 260 displayLayout.addWidget(axisTScale,3,1) 261 262 displayLayout.setRowStretch(4,10) 263 264 self.displayDock.setWidget(displayStuff) 265 self.addDockWidget(QtCore.Qt.LeftDockWidgetArea,self.displayDock) 266 self.displayDock.hide() 267 268 self.displaypropertiesAction=self.displayDock.toggleViewAction() 269 self.displaypropertiesAction.setShortcut("Ctrl+D") 270 271 self.displayMenu=self.menuBar().addMenu("&Display") 272 self.displayMenu.addAction(self.texteditorAction) 273 self.displayMenu.addAction(self.displaypropertiesAction) 274 self.displayMenu.addAction(self.utilityAction) 275 276 self.utilityMenu=self.menuBar().addMenu("&Utilities") 277 self.utilityMenu.addAction(self.blockMeshAction) 278 self.utilityMenu.addAction(self.checkMeshAction) 279 280 self.rereadButton=QtGui.QPushButton("Reread blockMeshDict") 281 282 try: 283 self.readFile() 284 except Exception,e: 285 warning("While reading",self.fName,"this happened:",e) 286 raise e 287 288 self.ren.ResetCamera() 289 290 self.oldBlock=-1 291 self.blockActor=None 292 self.blockTextActor=None 293 self.blockAxisActor=None 294 295 self.oldPatch=-1 296 self.patchActor=None 297 self.patchTextActor=vtk.vtkTextActor() 298 self.patchTextActor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() 299 self.patchTextActor.GetPositionCoordinate().SetValue(0.05,0.1) 300 self.patchTextActor.GetTextProperty().SetColor(0.,0.,0.) 301 self.patchTextActor.SetInput("Patch: <none>") 302 303 label1=QtGui.QLabel("Block (-1 is none)") 304 subLayout.addWidget(label1,0,0) 305 self.scroll=QtGui.QSlider(QtCore.Qt.Horizontal) 306 self.scroll.setRange(-1,len(self.blocks)-1) 307 self.scroll.setValue(-1) 308 self.scroll.setTickPosition(QtGui.QSlider.TicksBothSides) 309 self.scroll.setTickInterval(1) 310 self.scroll.setSingleStep(1) 311 self.connect(self.scroll,QtCore.SIGNAL("valueChanged(int)"),self.colorBlock) 312 subLayout.addWidget(self.scroll,0,1) 313 314 label2=QtGui.QLabel("Patch (-1 is none)") 315 subLayout.addWidget(label2,1,0) 316 self.scroll2=QtGui.QSlider(QtCore.Qt.Horizontal) 317 self.scroll2.setRange(-1,len(self.patches.keys())-1) 318 self.scroll2.setValue(-1) 319 self.scroll2.setTickPosition(QtGui.QSlider.TicksBothSides) 320 self.scroll2.setTickInterval(1) 321 self.scroll2.setSingleStep(1) 322 self.connect(self.scroll2,QtCore.SIGNAL("valueChanged(int)"),self.colorPatch) 323 subLayout.addWidget(self.scroll2,1,1) 324 325 buttonLayout=QtGui.QHBoxLayout() 326 buttonLayout.addStretch() 327 328 subLayout.addLayout(buttonLayout,2,0,1,2) 329 buttonLayout.addWidget(self.rereadButton) 330 self.connect(self.rereadButton,QtCore.SIGNAL("clicked()"),self.reread) 331 b1=QtGui.QPushButton("Quit") 332 buttonLayout.addWidget(b1) 333 self.connect(b1,QtCore.SIGNAL("clicked()"),self.close) 334 335 self.iren = self.renWin.GetInteractor() 336 self.istyle = vtk.vtkInteractorStyleSwitch() 337 338 self.iren.SetInteractorStyle(self.istyle) 339 self.istyle.SetCurrentStyleToTrackballCamera() 340 341 # self.iren.Initialize() # Seems to be unnecessary and produces segfaults 342 # self.renWin.Render() 343 self.iren.Start() 344 345 self.addProps() 346 347 self.setUnifiedTitleAndToolBarOnMac(True) 348 349 self.restoreGeometry(QtCore.QSettings().value("geometry").toByteArray()) 350 self.restoreState(QtCore.QSettings().value("state").toByteArray()) 351 352 self.setStatus()
353
354 - def blockMesh(self):
355 self.executeUtility("blockMesh")
356
357 - def checkMesh(self):
358 self.executeUtility("checkMesh")
359
360 - def executeUtility(self,util):
361 if self.worker!=None: 362 self.error("There seems to be another worker") 363 364 self.setStatus("Executing "+util) 365 self.blockMeshAction.setEnabled(False) 366 self.checkMeshAction.setEnabled(False) 367 368 self.utilityOutput.clear() 369 self.utilityOutput.append("Running "+util+" on case "+self.caseDir) 370 self.utilityDock.show() 371 372 self.worker=UtilityThread(argv=[util, 373 "-case", 374 self.caseDir], 375 parent=self) 376 self.connect(self.worker,QtCore.SIGNAL("finished()"),self.executionEnded) 377 self.connect(self.worker,QtCore.SIGNAL("newLine(QString)"),self.utilityOutputAppend) 378 self.worker.start()
379
380 - def utilityOutputAppend(self,line):
381 self.utilityOutput.append(line)
382
383 - def executionEnded(self):
384 self.blockMeshAction.setEnabled(True) 385 self.checkMeshAction.setEnabled(True) 386 self.setStatus("Execution of "+self.worker.argv[0]+" finished"+self.worker.status) 387 self.worker=None
388
389 - def setStatus(self,message="Ready"):
390 if self.isWindowModified(): 391 message="blockMesh modified - "+message 392 self.statusBar().showMessage(message)
393
394 - def blockMeshWasModified(self):
395 if not self.saveAction.isEnabled(): 396 self.saveAction.setEnabled(True) 397 if self.rereadAction.isEnabled(): 398 self.rereadAction.setEnabled(False) 399 self.rereadButton.setEnabled(False) 400 401 self.setWindowModified(True) 402 self.setStatus()
403
404 - def readFile(self,resetText=True):
405 if resetText: 406 txt=open(self.fName).read() 407 self.editor.setPlainText(txt) 408 409 self.setWindowModified(False) 410 if not self.alwaysSave: 411 self.saveAction.setEnabled(False) 412 self.rereadAction.setEnabled(True) 413 self.rereadButton.setEnabled(True) 414 415 self.blockMesh=ParsedBlockMeshDict(self.fName, 416 doMacroExpansion=True) 417 418 self.vertices=self.blockMesh.vertices() 419 self.vActors=[None]*len(self.vertices) 420 self.tActors=[None]*len(self.vertices) 421 self.spheres=[None]*len(self.vertices) 422 423 self.blocks=self.blockMesh.blocks() 424 self.patches=self.blockMesh.patches() 425 426 self.vRadius=self.blockMesh.typicalLength()/50 427 428 for i in range(len(self.vertices)): 429 self.addVertex(i) 430 431 self.setAxes() 432 433 self.undefined=[] 434 435 for i in range(len(self.blocks)): 436 self.addBlock(i) 437 438 for a in self.blockMesh.arcs(): 439 self.makeArc(a) 440 441 if len(self.undefined)>0: 442 self.undefinedActor.SetInput("Undefined vertices: "+str(self.undefined)) 443 else: 444 self.undefinedActor.SetInput("") 445 446 self.setStatus("Read file")
447
448 - def saveBlockMesh(self):
449 txt=str(self.editor.toPlainText()) 450 open(self.fName,"w").write(txt) 451 452 self.reread(resetText=False) 453 self.setStatus("Saved file")
454
455 - def addUndefined(self,i):
456 if not i in self.undefined: 457 self.undefined.append(i)
458
459 - def addProps(self):
460 self.ren.AddViewProp(self.axes) 461 self.ren.AddActor2D(self.patchTextActor) 462 self.ren.AddActor2D(self.undefinedActor)
463
464 - def numberScaleChanged(self,scale):
465 self.numberScale=scale 466 for tActor in self.tActors: 467 tActor.SetScale(self.numberScale*self.vRadius,self.numberScale*self.vRadius,self.numberScale*self.vRadius) 468 self.renWin.Render()
469
470 - def pointScaleChanged(self,scale):
471 self.pointScale=scale 472 for sphere in self.spheres: 473 sphere.SetRadius(self.vRadius*self.pointScale) 474 self.renWin.Render()
475
476 - def axisLabelScaleChanged(self,scale):
477 self.axisLabelScale=scale 478 if self.blockTextActor: 479 for t in self.blockTextActor: 480 t.SetScale(self.axisLabelScale*self.vRadius, 481 self.axisLabelScale*self.vRadius, 482 self.axisLabelScale*self.vRadius) 483 self.renWin.Render()
484
485 - def axisTubeScaleChanged(self,scale):
486 self.axisTubeScale=scale 487 if self.blockAxisActor: 488 for t in self.blockAxisActor: 489 t.SetRadius(self.vRadius*self.axisTubeScale) 490 self.renWin.Render()
491
492 - def addPoint(self,coord,factor=1):
493 sphere=vtk.vtkSphereSource() 494 sphere.SetRadius(self.vRadius*factor*self.pointScale) 495 sphere.SetCenter(coord) 496 mapper=vtk.vtkPolyDataMapper() 497 mapper.SetInputConnection(sphere.GetOutputPort()) 498 actor = vtk.vtkActor() 499 actor.SetMapper(mapper) 500 self.ren.AddActor(actor) 501 502 return sphere,actor
503
504 - def addVertex(self,index):
505 coord=self.vertices[index] 506 self.spheres[index],self.vActors[index]=self.addPoint(coord) 507 text=vtk.vtkVectorText() 508 text.SetText(str(index)) 509 tMapper=vtk.vtkPolyDataMapper() 510 tMapper.SetInput(text.GetOutput()) 511 tActor = vtk.vtkFollower() 512 tActor.SetMapper(tMapper) 513 tActor.SetScale(self.numberScale*self.vRadius,self.numberScale*self.vRadius,self.numberScale*self.vRadius) 514 tActor.AddPosition(coord[0]+self.vRadius,coord[1]+self.vRadius,coord[2]+self.vRadius) 515 tActor.SetCamera(self.cam) 516 tActor.GetProperty().SetColor(1.0,0.,0.) 517 self.tActors[index]=tActor 518 self.ren.AddActor(tActor)
519
520 - def addLine(self,index1,index2):
521 try: 522 c1=self.vertices[index1] 523 c2=self.vertices[index2] 524 except: 525 if index1>=len(self.vertices): 526 self.addUndefined(index1) 527 if index2>=len(self.vertices): 528 self.addUndefined(index2) 529 return None 530 line=vtk.vtkLineSource() 531 line.SetPoint1(c1) 532 line.SetPoint2(c2) 533 mapper=vtk.vtkPolyDataMapper() 534 mapper.SetInputConnection(line.GetOutputPort()) 535 actor = vtk.vtkActor() 536 actor.SetMapper(mapper) 537 self.ren.AddActor(actor) 538 return actor
539
540 - def makeDirection(self,index1,index2,label):
541 try: 542 c1=self.vertices[index1] 543 c2=self.vertices[index2] 544 except: 545 return None,None 546 line=vtk.vtkLineSource() 547 line.SetPoint1(c1) 548 line.SetPoint2(c2) 549 tube=vtk.vtkTubeFilter() 550 tube.SetRadius(self.vRadius*self.axisTubeScale) 551 tube.SetNumberOfSides(10) 552 tube.SetInput(line.GetOutput()) 553 text=vtk.vtkVectorText() 554 text.SetText(label) 555 tMapper=vtk.vtkPolyDataMapper() 556 tMapper.SetInput(text.GetOutput()) 557 tActor = vtk.vtkFollower() 558 tActor.SetMapper(tMapper) 559 tActor.SetScale(self.axisLabelScale*self.vRadius, 560 self.axisLabelScale*self.vRadius, 561 self.axisLabelScale*self.vRadius) 562 tActor.AddPosition((c1[0]+c2[0])/2+self.vRadius, 563 (c1[1]+c2[1])/2+self.vRadius, 564 (c1[2]+c2[2])/2+self.vRadius) 565 tActor.SetCamera(self.cam) 566 tActor.GetProperty().SetColor(0.0,0.,0.) 567 return tube,tActor
568
569 - def makeSpline(self,lst):
570 points = vtk.vtkPoints() 571 for i in range(len(lst)): 572 v=lst[i] 573 points.InsertPoint(i,v[0],v[1],v[2]) 574 spline=vtk.vtkParametricSpline() 575 spline.SetPoints(points) 576 spline.ClosedOff() 577 splineSource=vtk.vtkParametricFunctionSource() 578 splineSource.SetParametricFunction(spline) 579 mapper=vtk.vtkPolyDataMapper() 580 mapper.SetInputConnection(splineSource.GetOutputPort()) 581 actor = vtk.vtkActor() 582 actor.SetMapper(mapper) 583 self.ren.AddActor(actor)
584
585 - def makeArc(self,data):
586 try: 587 self.makeSpline([self.vertices[data[0]],data[1],self.vertices[data[2]]]) 588 except: 589 if data[0]>=len(self.vertices): 590 self.addUndefined(data[0]) 591 if data[2]>=len(self.vertices): 592 self.addUndefined(data[2]) 593 594 self.addPoint(data[1],factor=0.5)
595
596 - def makeFace(self,lst):
597 points = vtk.vtkPoints() 598 side = vtk.vtkCellArray() 599 side.InsertNextCell(len(lst)) 600 for i in range(len(lst)): 601 try: 602 v=self.vertices[lst[i]] 603 except: 604 self.addUndefined(lst[i]) 605 return None 606 points.InsertPoint(i,v[0],v[1],v[2]) 607 side.InsertCellPoint(i) 608 result=vtk.vtkPolyData() 609 result.SetPoints(points) 610 result.SetPolys(side) 611 612 return result
613
614 - def addBlock(self,index):
615 b=self.blocks[index] 616 617 self.addLine(b[ 0],b[ 1]) 618 self.addLine(b[ 3],b[ 2]) 619 self.addLine(b[ 7],b[ 6]) 620 self.addLine(b[ 4],b[ 5]) 621 self.addLine(b[ 0],b[ 3]) 622 self.addLine(b[ 1],b[ 2]) 623 self.addLine(b[ 5],b[ 6]) 624 self.addLine(b[ 4],b[ 7]) 625 self.addLine(b[ 0],b[ 4]) 626 self.addLine(b[ 1],b[ 5]) 627 self.addLine(b[ 2],b[ 6]) 628 self.addLine(b[ 3],b[ 7])
629
630 - def setAxes(self):
631 append=vtk.vtkAppendPolyData() 632 for a in self.vActors: 633 if a!=None: 634 append.AddInput(a.GetMapper().GetInput()) 635 self.axes.SetInput(append.GetOutput())
636
637 - def reread(self,resetText=True):
638 self.ren.RemoveAllViewProps() 639 self.patchActor=None 640 self.blockActor=None 641 self.blockAxisActor=None 642 self.blockTextActor=None 643 self.addProps() 644 self.readFile(resetText=resetText) 645 646 tmpBlock=self.scroll.value() 647 if not tmpBlock<len(self.blocks): 648 tmpBlock=len(self.blocks)-1 649 self.scroll.setRange(-1,len(self.blocks)-1) 650 self.scroll.setValue(tmpBlock) 651 self.colorBlock(tmpBlock) 652 653 tmpPatch=self.scroll2.value() 654 if not tmpPatch<len(self.patches.keys()): 655 tmpPatch=len(self.patches.keys())-1 656 self.scroll2.setRange(-1,len(self.patches.keys())-1) 657 self.scroll2.setValue(tmpPatch) 658 self.colorPatch(tmpPatch) 659 660 self.renWin.Render()
661
662 - def colorBlock(self,value):
663 newBlock=int(value) 664 if self.oldBlock>=0 and self.blockActor!=None: 665 self.ren.RemoveActor(self.blockActor) 666 for ta in self.blockTextActor: 667 self.ren.RemoveActor(ta) 668 self.blockActor=None 669 self.blockTextActor=None 670 self.blockAxisActor=None 671 if newBlock>=0: 672 append=vtk.vtkAppendPolyData() 673 append2=vtk.vtkAppendPolyData() 674 b=self.blocks[newBlock] 675 append.AddInput(self.makeFace([b[0],b[1],b[2],b[3]])) 676 append.AddInput(self.makeFace([b[4],b[5],b[6],b[7]])) 677 append.AddInput(self.makeFace([b[0],b[1],b[5],b[4]])) 678 append.AddInput(self.makeFace([b[3],b[2],b[6],b[7]])) 679 append.AddInput(self.makeFace([b[0],b[3],b[7],b[4]])) 680 append.AddInput(self.makeFace([b[1],b[2],b[6],b[5]])) 681 d1,t1=self.makeDirection(b[0],b[1],"x1") 682 append.AddInput(d1.GetOutput()) 683 self.ren.AddActor(t1) 684 d2,t2=self.makeDirection(b[0],b[3],"x2") 685 append.AddInput(d2.GetOutput()) 686 self.ren.AddActor(t2) 687 d3,t3=self.makeDirection(b[0],b[4],"x3") 688 append.AddInput(d3.GetOutput()) 689 self.ren.AddActor(t3) 690 self.blockTextActor=(t1,t2,t3) 691 self.blockAxisActor=(d1,d2,d3) 692 mapper=vtk.vtkPolyDataMapper() 693 mapper.SetInputConnection(append.GetOutputPort()) 694 self.blockActor = vtk.vtkActor() 695 self.blockActor.SetMapper(mapper) 696 self.blockActor.GetProperty().SetColor(0.,1.,0.) 697 self.blockActor.GetProperty().SetOpacity(0.3) 698 self.ren.AddActor(self.blockActor) 699 700 self.oldBlock=newBlock 701 self.renWin.Render()
702
703 - def colorPatch(self,value):
704 newPatch=int(value) 705 if self.oldPatch>=0 and self.patchActor!=None: 706 self.ren.RemoveActor(self.patchActor) 707 self.patchActor=None 708 self.patchTextActor.SetInput("Patch: <none>") 709 if newPatch>=0: 710 name=self.patches.keys()[newPatch] 711 subs=self.patches[name] 712 append=vtk.vtkAppendPolyData() 713 for s in subs: 714 append.AddInput(self.makeFace(s)) 715 mapper=vtk.vtkPolyDataMapper() 716 mapper.SetInputConnection(append.GetOutputPort()) 717 self.patchActor = vtk.vtkActor() 718 self.patchActor.SetMapper(mapper) 719 self.patchActor.GetProperty().SetColor(0.,0.,1.) 720 self.patchActor.GetProperty().SetOpacity(0.3) 721 self.ren.AddActor(self.patchActor) 722 self.patchTextActor.SetInput("Patch: "+name) 723 724 self.oldPatch=newPatch 725 self.renWin.Render()
726
727 - def closeEvent(self,event):
728 print "Closing and saving settings to",QtCore.QSettings().fileName() 729 QtCore.QSettings().setValue("geometry",QtCore.QVariant(self.saveGeometry())) 730 QtCore.QSettings().setValue("state",QtCore.QVariant(self.saveState()))
731
732 -class DisplayBlockMesh(PyFoamApplicationQt4):
733 - def __init__(self):
734 description="""\ 735 Reads the contents of a blockMeshDict-file and displays the vertices 736 as spheres (with numbers). The blocks are sketched by lines. One block 737 can be seceted with a slider. It will be displayed as a green cube 738 with the local directions x1,x2 and x3. Also a patch that is selected 739 by a slider will be sketched by blue squares 740 741 This is a new version with a QT-GUI 742 """ 743 744 super(DisplayBlockMesh,self).__init__(description=description, 745 usage="%prog [options] <blockMeshDict>", 746 interspersed=True, 747 nr=1)
748
749 - def setupGUI(self):
750 print usedVTK 751 752 bmFile=self.parser.getArgs()[0] 753 if not path.exists(bmFile): 754 self.error(bmFile,"not found") 755 try: 756 self.dialog=DisplayBlockMeshDialog(bmFile) 757 except IOError: 758 self.error("Problem with blockMesh file",bmFile) 759 self.dialog.show()
760