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 self.alwaysSave=False 190 except AttributeError: 191 warning("Old PyQT4-version. Editing might not work as expected") 192 self.editor=QtGui.QTextEdit() 193 self.alwaysSave=True 194 self.saveAction.setEnabled(True) 195 196 self.editor.setFont(QtGui.QFont("Courier")) 197 198 self.editorDock.setWidget(self.editor) 199 self.addDockWidget(QtCore.Qt.RightDockWidgetArea,self.editorDock) 200 self.editorDock.hide() 201 202 self.utilityDock=QtGui.QDockWidget("Utility output", 203 self) 204 self.utilityOutput=QtGui.QTextEdit() 205 self.utilityOutput.setFont(QtGui.QFont("Courier")) 206 self.utilityOutput.setLineWrapMode(QtGui.QTextEdit.NoWrap) 207 self.utilityOutput.setReadOnly(True) 208 self.utilityDock.setWidget(self.utilityOutput) 209 self.utilityDock.setObjectName("UtilityDock") 210 self.utilityDock.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) 211 self.addDockWidget(QtCore.Qt.RightDockWidgetArea,self.utilityDock) 212 self.utilityDock.hide() 213 214 self.worker=None 215 216 self.texteditorAction=self.editorDock.toggleViewAction() 217 self.texteditorAction.setShortcut("Ctrl+E") 218 219 self.utilityAction=self.utilityDock.toggleViewAction() 220 self.utilityAction.setShortcut("Ctrl+U") 221 222 self.displayDock=QtGui.QDockWidget("Display Properties", 223 self) 224 self.displayDock.setObjectName("DisplayPropertiesDock") 225 self.displayDock.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) 226 227 displayStuff=QtGui.QWidget() 228 displayLayout=QtGui.QGridLayout() 229 displayStuff.setLayout(displayLayout) 230 displayLayout.addWidget(QtGui.QLabel("Number scale"),0,0) 231 nrScale=QtGui.QDoubleSpinBox() 232 nrScale.setValue(self.numberScale) 233 nrScale.setMinimum(1e-2) 234 nrScale.setSingleStep(0.1) 235 self.connect(nrScale,QtCore.SIGNAL("valueChanged(double)"),self.numberScaleChanged) 236 displayLayout.addWidget(nrScale,0,1) 237 displayLayout.addWidget(QtGui.QLabel("Point scale"),1,0) 238 ptScale=QtGui.QDoubleSpinBox() 239 ptScale.setValue(self.pointScale) 240 ptScale.setMinimum(1e-2) 241 ptScale.setSingleStep(0.1) 242 self.connect(ptScale,QtCore.SIGNAL("valueChanged(double)"),self.pointScaleChanged) 243 displayLayout.addWidget(ptScale,1,1) 244 displayLayout.addWidget(QtGui.QLabel("Axis label scale"),2,0) 245 axisLScale=QtGui.QDoubleSpinBox() 246 axisLScale.setValue(self.axisLabelScale) 247 axisLScale.setMinimum(1e-2) 248 axisLScale.setSingleStep(0.1) 249 self.connect(axisLScale,QtCore.SIGNAL("valueChanged(double)"),self.axisLabelScaleChanged) 250 displayLayout.addWidget(axisLScale,2,1) 251 displayLayout.addWidget(QtGui.QLabel("Axis tube scale"),3,0) 252 axisTScale=QtGui.QDoubleSpinBox() 253 axisTScale.setValue(self.axisTubeScale) 254 axisTScale.setMinimum(1e-2) 255 axisTScale.setSingleStep(0.1) 256 self.connect(axisTScale,QtCore.SIGNAL("valueChanged(double)"),self.axisTubeScaleChanged) 257 displayLayout.addWidget(axisTScale,3,1) 258 259 displayLayout.setRowStretch(4,10) 260 261 self.displayDock.setWidget(displayStuff) 262 self.addDockWidget(QtCore.Qt.LeftDockWidgetArea,self.displayDock) 263 self.displayDock.hide() 264 265 self.displaypropertiesAction=self.displayDock.toggleViewAction() 266 self.displaypropertiesAction.setShortcut("Ctrl+D") 267 268 self.displayMenu=self.menuBar().addMenu("&Display") 269 self.displayMenu.addAction(self.texteditorAction) 270 self.displayMenu.addAction(self.displaypropertiesAction) 271 self.displayMenu.addAction(self.utilityAction) 272 273 self.utilityMenu=self.menuBar().addMenu("&Utilities") 274 self.utilityMenu.addAction(self.blockMeshAction) 275 self.utilityMenu.addAction(self.checkMeshAction) 276 277 self.rereadButton=QtGui.QPushButton("Reread blockMeshDict") 278 279 try: 280 self.readFile() 281 except Exception,e: 282 warning("While reading",self.fName,"this happened:",e) 283 raise e 284 285 self.ren.ResetCamera() 286 287 self.oldBlock=-1 288 self.blockActor=None 289 self.blockTextActor=None 290 self.blockAxisActor=None 291 292 self.oldPatch=-1 293 self.patchActor=None 294 self.patchTextActor=vtk.vtkTextActor() 295 self.patchTextActor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() 296 self.patchTextActor.GetPositionCoordinate().SetValue(0.05,0.1) 297 self.patchTextActor.GetTextProperty().SetColor(0.,0.,0.) 298 self.patchTextActor.SetInput("Patch: <none>") 299 300 label1=QtGui.QLabel("Block (-1 is none)") 301 subLayout.addWidget(label1,0,0) 302 self.scroll=QtGui.QSlider(QtCore.Qt.Horizontal) 303 self.scroll.setRange(-1,len(self.blocks)-1) 304 self.scroll.setValue(-1) 305 self.scroll.setTickPosition(QtGui.QSlider.TicksBothSides) 306 self.scroll.setTickInterval(1) 307 self.scroll.setSingleStep(1) 308 self.connect(self.scroll,QtCore.SIGNAL("valueChanged(int)"),self.colorBlock) 309 subLayout.addWidget(self.scroll,0,1) 310 311 label2=QtGui.QLabel("Patch (-1 is none)") 312 subLayout.addWidget(label2,1,0) 313 self.scroll2=QtGui.QSlider(QtCore.Qt.Horizontal) 314 self.scroll2.setRange(-1,len(self.patches.keys())-1) 315 self.scroll2.setValue(-1) 316 self.scroll2.setTickPosition(QtGui.QSlider.TicksBothSides) 317 self.scroll2.setTickInterval(1) 318 self.scroll2.setSingleStep(1) 319 self.connect(self.scroll2,QtCore.SIGNAL("valueChanged(int)"),self.colorPatch) 320 subLayout.addWidget(self.scroll2,1,1) 321 322 buttonLayout=QtGui.QHBoxLayout() 323 buttonLayout.addStretch() 324 325 subLayout.addLayout(buttonLayout,2,0,1,2) 326 buttonLayout.addWidget(self.rereadButton) 327 self.connect(self.rereadButton,QtCore.SIGNAL("clicked()"),self.reread) 328 b1=QtGui.QPushButton("Quit") 329 buttonLayout.addWidget(b1) 330 self.connect(b1,QtCore.SIGNAL("clicked()"),self.close) 331 332 self.iren = self.renWin.GetInteractor() 333 self.istyle = vtk.vtkInteractorStyleSwitch() 334 335 self.iren.SetInteractorStyle(self.istyle) 336 self.istyle.SetCurrentStyleToTrackballCamera() 337 338 # self.iren.Initialize() # Seems to be unnecessary and produces segfaults 339 # self.renWin.Render() 340 self.iren.Start() 341 342 self.addProps() 343 344 self.setUnifiedTitleAndToolBarOnMac(True) 345 346 self.restoreGeometry(QtCore.QSettings().value("geometry").toByteArray()) 347 self.restoreState(QtCore.QSettings().value("state").toByteArray()) 348 349 self.setStatus()
350
351 - def blockMesh(self):
352 self.executeUtility("blockMesh")
353
354 - def checkMesh(self):
355 self.executeUtility("checkMesh")
356
357 - def executeUtility(self,util):
358 if self.worker!=None: 359 self.error("There seems to be another worker") 360 361 self.setStatus("Executing "+util) 362 self.blockMeshAction.setEnabled(False) 363 self.checkMeshAction.setEnabled(False) 364 365 self.utilityOutput.clear() 366 self.utilityOutput.append("Running "+util+" on case "+self.caseDir) 367 self.utilityDock.show() 368 369 self.worker=UtilityThread(argv=[util, 370 "-case", 371 self.caseDir], 372 parent=self) 373 self.connect(self.worker,QtCore.SIGNAL("finished()"),self.executionEnded) 374 self.connect(self.worker,QtCore.SIGNAL("newLine(QString)"),self.utilityOutputAppend) 375 self.worker.start()
376
377 - def utilityOutputAppend(self,line):
378 self.utilityOutput.append(line)
379
380 - def executionEnded(self):
381 self.blockMeshAction.setEnabled(True) 382 self.checkMeshAction.setEnabled(True) 383 self.setStatus("Execution of "+self.worker.argv[0]+" finished"+self.worker.status) 384 self.worker=None
385
386 - def setStatus(self,message="Ready"):
387 if self.isWindowModified(): 388 message="blockMesh modified - "+message 389 self.statusBar().showMessage(message)
390
391 - def blockMeshWasModified(self):
392 if not self.saveAction.isEnabled(): 393 self.saveAction.setEnabled(True) 394 if self.rereadAction.isEnabled(): 395 self.rereadAction.setEnabled(False) 396 self.rereadButton.setEnabled(False) 397 398 self.setWindowModified(True) 399 self.setStatus()
400
401 - def readFile(self,resetText=True):
402 if resetText: 403 txt=open(self.fName).read() 404 self.editor.setPlainText(txt) 405 406 self.setWindowModified(False) 407 if not self.alwaysSave: 408 self.saveAction.setEnabled(False) 409 self.rereadAction.setEnabled(True) 410 self.rereadButton.setEnabled(True) 411 412 self.blockMesh=ParsedBlockMeshDict(self.fName, 413 doMacroExpansion=True) 414 415 self.vertices=self.blockMesh.vertices() 416 self.vActors=[None]*len(self.vertices) 417 self.tActors=[None]*len(self.vertices) 418 self.spheres=[None]*len(self.vertices) 419 420 self.blocks=self.blockMesh.blocks() 421 self.patches=self.blockMesh.patches() 422 423 self.vRadius=self.blockMesh.typicalLength()/50 424 425 for i in range(len(self.vertices)): 426 self.addVertex(i) 427 428 self.setAxes() 429 430 self.undefined=[] 431 432 for i in range(len(self.blocks)): 433 self.addBlock(i) 434 435 for a in self.blockMesh.arcs(): 436 self.makeArc(a) 437 438 if len(self.undefined)>0: 439 self.undefinedActor.SetInput("Undefined vertices: "+str(self.undefined)) 440 else: 441 self.undefinedActor.SetInput("") 442 443 self.setStatus("Read file")
444
445 - def saveBlockMesh(self):
446 txt=str(self.editor.toPlainText()) 447 open(self.fName,"w").write(txt) 448 449 self.reread(resetText=False) 450 self.setStatus("Saved file")
451
452 - def addUndefined(self,i):
453 if not i in self.undefined: 454 self.undefined.append(i)
455
456 - def addProps(self):
457 self.ren.AddViewProp(self.axes) 458 self.ren.AddActor2D(self.patchTextActor) 459 self.ren.AddActor2D(self.undefinedActor)
460
461 - def numberScaleChanged(self,scale):
462 self.numberScale=scale 463 for tActor in self.tActors: 464 tActor.SetScale(self.numberScale*self.vRadius,self.numberScale*self.vRadius,self.numberScale*self.vRadius) 465 self.renWin.Render()
466
467 - def pointScaleChanged(self,scale):
468 self.pointScale=scale 469 for sphere in self.spheres: 470 sphere.SetRadius(self.vRadius*self.pointScale) 471 self.renWin.Render()
472
473 - def axisLabelScaleChanged(self,scale):
474 self.axisLabelScale=scale 475 if self.blockTextActor: 476 for t in self.blockTextActor: 477 t.SetScale(self.axisLabelScale*self.vRadius, 478 self.axisLabelScale*self.vRadius, 479 self.axisLabelScale*self.vRadius) 480 self.renWin.Render()
481
482 - def axisTubeScaleChanged(self,scale):
483 self.axisTubeScale=scale 484 if self.blockAxisActor: 485 for t in self.blockAxisActor: 486 t.SetRadius(self.vRadius*self.axisTubeScale) 487 self.renWin.Render()
488
489 - def addPoint(self,coord,factor=1):
490 sphere=vtk.vtkSphereSource() 491 sphere.SetRadius(self.vRadius*factor*self.pointScale) 492 sphere.SetCenter(coord) 493 mapper=vtk.vtkPolyDataMapper() 494 mapper.SetInputConnection(sphere.GetOutputPort()) 495 actor = vtk.vtkActor() 496 actor.SetMapper(mapper) 497 self.ren.AddActor(actor) 498 499 return sphere,actor
500
501 - def addVertex(self,index):
502 coord=self.vertices[index] 503 self.spheres[index],self.vActors[index]=self.addPoint(coord) 504 text=vtk.vtkVectorText() 505 text.SetText(str(index)) 506 tMapper=vtk.vtkPolyDataMapper() 507 tMapper.SetInput(text.GetOutput()) 508 tActor = vtk.vtkFollower() 509 tActor.SetMapper(tMapper) 510 tActor.SetScale(self.numberScale*self.vRadius,self.numberScale*self.vRadius,self.numberScale*self.vRadius) 511 tActor.AddPosition(coord[0]+self.vRadius,coord[1]+self.vRadius,coord[2]+self.vRadius) 512 tActor.SetCamera(self.cam) 513 tActor.GetProperty().SetColor(1.0,0.,0.) 514 self.tActors[index]=tActor 515 self.ren.AddActor(tActor)
516
517 - def addLine(self,index1,index2):
518 try: 519 c1=self.vertices[index1] 520 c2=self.vertices[index2] 521 except: 522 if index1>=len(self.vertices): 523 self.addUndefined(index1) 524 if index2>=len(self.vertices): 525 self.addUndefined(index2) 526 return None 527 line=vtk.vtkLineSource() 528 line.SetPoint1(c1) 529 line.SetPoint2(c2) 530 mapper=vtk.vtkPolyDataMapper() 531 mapper.SetInputConnection(line.GetOutputPort()) 532 actor = vtk.vtkActor() 533 actor.SetMapper(mapper) 534 self.ren.AddActor(actor) 535 return actor
536
537 - def makeDirection(self,index1,index2,label):
538 try: 539 c1=self.vertices[index1] 540 c2=self.vertices[index2] 541 except: 542 return None,None 543 line=vtk.vtkLineSource() 544 line.SetPoint1(c1) 545 line.SetPoint2(c2) 546 tube=vtk.vtkTubeFilter() 547 tube.SetRadius(self.vRadius*self.axisTubeScale) 548 tube.SetNumberOfSides(10) 549 tube.SetInput(line.GetOutput()) 550 text=vtk.vtkVectorText() 551 text.SetText(label) 552 tMapper=vtk.vtkPolyDataMapper() 553 tMapper.SetInput(text.GetOutput()) 554 tActor = vtk.vtkFollower() 555 tActor.SetMapper(tMapper) 556 tActor.SetScale(self.axisLabelScale*self.vRadius, 557 self.axisLabelScale*self.vRadius, 558 self.axisLabelScale*self.vRadius) 559 tActor.AddPosition((c1[0]+c2[0])/2+self.vRadius, 560 (c1[1]+c2[1])/2+self.vRadius, 561 (c1[2]+c2[2])/2+self.vRadius) 562 tActor.SetCamera(self.cam) 563 tActor.GetProperty().SetColor(0.0,0.,0.) 564 return tube,tActor
565
566 - def makeSpline(self,lst):
567 points = vtk.vtkPoints() 568 for i in range(len(lst)): 569 v=lst[i] 570 points.InsertPoint(i,v[0],v[1],v[2]) 571 spline=vtk.vtkParametricSpline() 572 spline.SetPoints(points) 573 spline.ClosedOff() 574 splineSource=vtk.vtkParametricFunctionSource() 575 splineSource.SetParametricFunction(spline) 576 mapper=vtk.vtkPolyDataMapper() 577 mapper.SetInputConnection(splineSource.GetOutputPort()) 578 actor = vtk.vtkActor() 579 actor.SetMapper(mapper) 580 self.ren.AddActor(actor)
581
582 - def makeArc(self,data):
583 try: 584 self.makeSpline([self.vertices[data[0]],data[1],self.vertices[data[2]]]) 585 except: 586 if data[0]>=len(self.vertices): 587 self.addUndefined(data[0]) 588 if data[2]>=len(self.vertices): 589 self.addUndefined(data[2]) 590 591 self.addPoint(data[1],factor=0.5)
592
593 - def makeFace(self,lst):
594 points = vtk.vtkPoints() 595 side = vtk.vtkCellArray() 596 side.InsertNextCell(len(lst)) 597 for i in range(len(lst)): 598 try: 599 v=self.vertices[lst[i]] 600 except: 601 self.addUndefined(lst[i]) 602 return None 603 points.InsertPoint(i,v[0],v[1],v[2]) 604 side.InsertCellPoint(i) 605 result=vtk.vtkPolyData() 606 result.SetPoints(points) 607 result.SetPolys(side) 608 609 return result
610
611 - def addBlock(self,index):
612 b=self.blocks[index] 613 614 self.addLine(b[ 0],b[ 1]) 615 self.addLine(b[ 3],b[ 2]) 616 self.addLine(b[ 7],b[ 6]) 617 self.addLine(b[ 4],b[ 5]) 618 self.addLine(b[ 0],b[ 3]) 619 self.addLine(b[ 1],b[ 2]) 620 self.addLine(b[ 5],b[ 6]) 621 self.addLine(b[ 4],b[ 7]) 622 self.addLine(b[ 0],b[ 4]) 623 self.addLine(b[ 1],b[ 5]) 624 self.addLine(b[ 2],b[ 6]) 625 self.addLine(b[ 3],b[ 7])
626
627 - def setAxes(self):
628 append=vtk.vtkAppendPolyData() 629 for a in self.vActors: 630 if a!=None: 631 append.AddInput(a.GetMapper().GetInput()) 632 self.axes.SetInput(append.GetOutput())
633
634 - def reread(self,resetText=True):
635 self.ren.RemoveAllViewProps() 636 self.patchActor=None 637 self.blockActor=None 638 self.blockAxisActor=None 639 self.blockTextActor=None 640 self.addProps() 641 self.readFile(resetText=resetText) 642 643 tmpBlock=self.scroll.value() 644 if not tmpBlock<len(self.blocks): 645 tmpBlock=len(self.blocks)-1 646 self.scroll.setRange(-1,len(self.blocks)-1) 647 self.scroll.setValue(tmpBlock) 648 self.colorBlock(tmpBlock) 649 650 tmpPatch=self.scroll2.value() 651 if not tmpPatch<len(self.patches.keys()): 652 tmpPatch=len(self.patches.keys())-1 653 self.scroll2.setRange(-1,len(self.patches.keys())-1) 654 self.scroll2.setValue(tmpPatch) 655 self.colorPatch(tmpPatch) 656 657 self.renWin.Render()
658
659 - def colorBlock(self,value):
660 newBlock=int(value) 661 if self.oldBlock>=0 and self.blockActor!=None: 662 self.ren.RemoveActor(self.blockActor) 663 for ta in self.blockTextActor: 664 self.ren.RemoveActor(ta) 665 self.blockActor=None 666 self.blockTextActor=None 667 self.blockAxisActor=None 668 if newBlock>=0: 669 append=vtk.vtkAppendPolyData() 670 append2=vtk.vtkAppendPolyData() 671 b=self.blocks[newBlock] 672 append.AddInput(self.makeFace([b[0],b[1],b[2],b[3]])) 673 append.AddInput(self.makeFace([b[4],b[5],b[6],b[7]])) 674 append.AddInput(self.makeFace([b[0],b[1],b[5],b[4]])) 675 append.AddInput(self.makeFace([b[3],b[2],b[6],b[7]])) 676 append.AddInput(self.makeFace([b[0],b[3],b[7],b[4]])) 677 append.AddInput(self.makeFace([b[1],b[2],b[6],b[5]])) 678 d1,t1=self.makeDirection(b[0],b[1],"x1") 679 append.AddInput(d1.GetOutput()) 680 self.ren.AddActor(t1) 681 d2,t2=self.makeDirection(b[0],b[3],"x2") 682 append.AddInput(d2.GetOutput()) 683 self.ren.AddActor(t2) 684 d3,t3=self.makeDirection(b[0],b[4],"x3") 685 append.AddInput(d3.GetOutput()) 686 self.ren.AddActor(t3) 687 self.blockTextActor=(t1,t2,t3) 688 self.blockAxisActor=(d1,d2,d3) 689 mapper=vtk.vtkPolyDataMapper() 690 mapper.SetInputConnection(append.GetOutputPort()) 691 self.blockActor = vtk.vtkActor() 692 self.blockActor.SetMapper(mapper) 693 self.blockActor.GetProperty().SetColor(0.,1.,0.) 694 self.blockActor.GetProperty().SetOpacity(0.3) 695 self.ren.AddActor(self.blockActor) 696 697 self.oldBlock=newBlock 698 self.renWin.Render()
699
700 - def colorPatch(self,value):
701 newPatch=int(value) 702 if self.oldPatch>=0 and self.patchActor!=None: 703 self.ren.RemoveActor(self.patchActor) 704 self.patchActor=None 705 self.patchTextActor.SetInput("Patch: <none>") 706 if newPatch>=0: 707 name=self.patches.keys()[newPatch] 708 subs=self.patches[name] 709 append=vtk.vtkAppendPolyData() 710 for s in subs: 711 append.AddInput(self.makeFace(s)) 712 mapper=vtk.vtkPolyDataMapper() 713 mapper.SetInputConnection(append.GetOutputPort()) 714 self.patchActor = vtk.vtkActor() 715 self.patchActor.SetMapper(mapper) 716 self.patchActor.GetProperty().SetColor(0.,0.,1.) 717 self.patchActor.GetProperty().SetOpacity(0.3) 718 self.ren.AddActor(self.patchActor) 719 self.patchTextActor.SetInput("Patch: "+name) 720 721 self.oldPatch=newPatch 722 self.renWin.Render()
723
724 - def closeEvent(self,event):
725 print "Closing and saving settings to",QtCore.QSettings().fileName() 726 QtCore.QSettings().setValue("geometry",QtCore.QVariant(self.saveGeometry())) 727 QtCore.QSettings().setValue("state",QtCore.QVariant(self.saveState()))
728
729 -class DisplayBlockMesh(PyFoamApplicationQt4):
730 - def __init__(self):
731 description=""" 732 Reads the contents of a blockMeshDict-file and displays the 733 vertices as spheres (with numbers). The blocks are sketched by 734 lines. One block can be seceted with a slider. It will be 735 displayed as a green cube with the local directions x1,x2 and 736 x3. Also a patch that is selected by a slider will be sketched 737 by blue squares 738 739 This is a new version with a QT-GUI 740 """ 741 super(DisplayBlockMesh,self).__init__(description=description, 742 usage="%prog [options] <blockMeshDict>", 743 interspersed=True, 744 nr=1)
745
746 - def setupGUI(self):
747 bmFile=self.parser.getArgs()[0] 748 if not path.exists(bmFile): 749 self.error(bmFile,"not found") 750 try: 751 self.dialog=DisplayBlockMeshDialog(bmFile) 752 except IOError: 753 self.error("Problem with blockMesh file",bmFile) 754 self.dialog.show()
755