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