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.RunDictionary.ParsedParameterFile import ParsedParameterFile 
   7  from PyFoam.Applications.PyFoamApplicationQt4 import PyFoamApplicationQt4 
   8  from PyFoam.Error import error,warning 
   9  from PyFoam.RunDictionary.SolutionDirectory import NoTouchSolutionDirectory 
  10  from PyFoam.Execution.BasicRunner import BasicRunner 
  11  from PyFoam.Basics.TemplateFile import TemplateFile 
  12   
  13  from os import path 
  14  from optparse import OptionGroup 
  15   
  16  from PyFoam.ThirdParty.six import print_ 
  17   
  18  import sys 
  19   
20 -def doImports():
21 try: 22 global QtGui,QtCore 23 from PyQt4 import QtGui,QtCore 24 global vtk 25 26 global usedVTK 27 28 try: 29 import vtk 30 usedVTK="Using system-VTK" 31 except ImportError: 32 usedVTK="Trying VTK implementation from Paraview" 33 from paraview import vtk 34 global QVTKRenderWindowInteractor 35 from vtk.qt4 import QVTKRenderWindowInteractor 36 except ImportError: 37 e = sys.exc_info()[1] # Needed because python 2.5 does not support 'as e' 38 error("Error while importing modules:",e)
39 40 doImports() 41
42 -class ReportToThreadRunner(BasicRunner):
43 - def __init__(self, 44 argv, 45 thread):
46 BasicRunner.__init__(self, 47 argv=argv, 48 noLog=True, 49 silent=True) 50 self.thread=thread
51
52 - def lineHandle(self,line):
53 self.thread.append(line)
54
55 -class UtilityThread(QtCore.QThread):
56 - def __init__(self, 57 argv, 58 parent):
59 super(UtilityThread,self).__init__(parent) 60 self.argv=argv 61 self.status=""
62 - def run(self):
63 try: 64 runner=ReportToThreadRunner(argv=self.argv, 65 thread=self) 66 runner.start() 67 if not runner.runOK(): 68 self.status=" - Problem" 69 70 except IOError: 71 self.status=" - OS Problem"
72
73 - def append(self,line):
74 self.emit(QtCore.SIGNAL("newLine(QString)"),line)
75
76 -class DisplayBlockMeshDialog(QtGui.QMainWindow):
77 - def __init__(self, 78 fName, 79 valuesFile=None):
80 super(DisplayBlockMeshDialog,self).__init__(None) 81 self.fName=fName 82 self.vName=valuesFile 83 84 self.numberScale=2 85 self.pointScale=1 86 self.axisLabelScale=1 87 self.axisTubeScale=0.5 88 89 titleString="%s[*] - DisplayBlockMesh" % fName 90 91 if self.vName: 92 titleString+="(Values: %s)" % path.basename(self.vName) 93 94 self.setWindowTitle(titleString) 95 96 self.caseDir=None 97 try: 98 caseDir=path.sep+path.join(*path.abspath(fName).split(path.sep)[:-3]) 99 isOK=NoTouchSolutionDirectory(caseDir) 100 if isOK: 101 self.caseDir=caseDir 102 self.setWindowTitle("Case %s[*] - DisplayBlockMesh" % caseDir.split(path.sep)[-1]) 103 except: 104 pass 105 106 central = QtGui.QWidget() 107 self.setCentralWidget(central) 108 109 layout = QtGui.QVBoxLayout() 110 central.setLayout(layout) 111 self.renInteractor=QVTKRenderWindowInteractor.QVTKRenderWindowInteractor(central) 112 # self.renInteractor.Initialize() # this creates a segfault for old PyQt 113 self.renInteractor.Start() 114 115 layout.addWidget(self.renInteractor) 116 117 mainDock=QtGui.QDockWidget("Main controls", 118 self) 119 mainDock.setObjectName("MainControlsDock") 120 mainDock.setFeatures(QtGui.QDockWidget.DockWidgetFloatable | QtGui.QDockWidget.DockWidgetMovable) 121 mainDock.setAllowedAreas(QtCore.Qt.TopDockWidgetArea | QtCore.Qt.BottomDockWidgetArea) 122 mainDockWidget=QtGui.QWidget() 123 mainDock.setWidget(mainDockWidget) 124 125 subLayout=QtGui.QGridLayout() 126 mainDockWidget.setLayout(subLayout) 127 self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, mainDock) 128 129 self.renInteractor.show() 130 self.renWin = self.renInteractor.GetRenderWindow() 131 self.ren = vtk.vtkRenderer() 132 self.renWin.AddRenderer(self.ren) 133 self.renWin.SetSize(600, 600) 134 self.ren.SetBackground(0.7, 0.7, 0.7) 135 self.ren.ResetCamera() 136 self.cam = self.ren.GetActiveCamera() 137 self.axes = vtk.vtkCubeAxesActor2D() 138 self.axes.SetCamera(self.ren.GetActiveCamera()) 139 140 self.undefinedActor=vtk.vtkTextActor() 141 self.undefinedActor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() 142 self.undefinedActor.GetPositionCoordinate().SetValue(0.05,0.2) 143 self.undefinedActor.GetTextProperty().SetColor(1.,0.,0.) 144 self.undefinedActor.SetInput("") 145 146 self.rereadAction=QtGui.QAction("&Reread", 147 self) 148 self.rereadAction.setShortcut("Ctrl+R") 149 self.rereadAction.setToolTip("Reread the blockMesh-file") 150 self.connect(self.rereadAction, 151 QtCore.SIGNAL("triggered()"), 152 self.reread) 153 154 self.blockMeshAction=QtGui.QAction("&BlockMesh", 155 self) 156 self.blockMeshAction.setShortcut("Ctrl+B") 157 self.blockMeshAction.setToolTip("Execute blockMesh-Utility") 158 self.connect(self.blockMeshAction, 159 QtCore.SIGNAL("triggered()"), 160 self.blockMesh) 161 162 self.checkMeshAction=QtGui.QAction("Chec&kMesh", 163 self) 164 self.checkMeshAction.setShortcut("Ctrl+K") 165 self.checkMeshAction.setToolTip("Execute checkMesh-Utility") 166 self.connect(self.checkMeshAction, 167 QtCore.SIGNAL("triggered()"), 168 self.checkMesh) 169 if self.caseDir==None: 170 self.blockMeshAction.setEnabled(False) 171 self.checkMeshAction.setEnabled(False) 172 173 self.quitAction=QtGui.QAction("&Quit", 174 self) 175 176 self.quitAction.setShortcut("Ctrl+Q") 177 self.quitAction.setToolTip("Quit this program") 178 self.connect(self.quitAction, 179 QtCore.SIGNAL("triggered()"), 180 self.close) 181 182 self.saveAction=QtGui.QAction("&Save", 183 self) 184 185 self.saveAction.setShortcut(QtGui.QKeySequence.Save) 186 self.saveAction.setToolTip("Save the blockmesh from the editor") 187 self.connect(self.saveAction, 188 QtCore.SIGNAL("triggered()"), 189 self.saveBlockMesh) 190 self.saveAction.setEnabled(False) 191 192 self.fileMenu=self.menuBar().addMenu("&Blockmesh file") 193 self.fileMenu.addAction(self.rereadAction) 194 self.fileMenu.addAction(self.saveAction) 195 self.fileMenu.addSeparator() 196 self.fileMenu.addAction(self.quitAction) 197 198 editTitle="Edit blockMesh" 199 if self.vName: 200 editTitle+=" - template" 201 202 self.editorDock=QtGui.QDockWidget(editTitle, 203 self) 204 self.editorDock.setObjectName("EditorDock") 205 self.editorDock.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) 206 207 try: 208 self.editor=QtGui.QPlainTextEdit() 209 self.editor.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap) 210 self.editor.textChanged.connect(self.blockMeshWasModified) 211 self.alwaysSave=False 212 except AttributeError: 213 warning("Old PyQT4-version. Editing might not work as expected") 214 self.editor=QtGui.QTextEdit() 215 self.alwaysSave=True 216 self.saveAction.setEnabled(True) 217 218 self.editor.setFont(QtGui.QFont("Courier")) 219 220 self.editorDock.setWidget(self.editor) 221 self.addDockWidget(QtCore.Qt.RightDockWidgetArea,self.editorDock) 222 self.editorDock.hide() 223 224 if self.vName: 225 self.vEditorDock=QtGui.QDockWidget("Values file", 226 self) 227 self.vEditorDock.setObjectName("VEditorDock") 228 self.vEditorDock.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) 229 230 try: 231 self.vEditor=QtGui.QPlainTextEdit() 232 self.vEditor.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap) 233 self.vEditor.textChanged.connect(self.blockMeshWasModified) 234 except AttributeError: 235 warning("Old PyQT4-version. Editing might not work as expected") 236 self.vEditor=QtGui.QTextEdit() 237 238 self.vEditor.setFont(QtGui.QFont("Courier")) 239 240 self.vEditorDock.setWidget(self.vEditor) 241 self.addDockWidget(QtCore.Qt.RightDockWidgetArea,self.vEditorDock) 242 self.vEditorDock.hide() 243 244 self.utilityDock=QtGui.QDockWidget("Utility output", 245 self) 246 self.utilityOutput=QtGui.QTextEdit() 247 self.utilityOutput.setFont(QtGui.QFont("Courier")) 248 self.utilityOutput.setLineWrapMode(QtGui.QTextEdit.NoWrap) 249 self.utilityOutput.setReadOnly(True) 250 self.utilityDock.setWidget(self.utilityOutput) 251 self.utilityDock.setObjectName("UtilityDock") 252 self.utilityDock.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) 253 self.addDockWidget(QtCore.Qt.RightDockWidgetArea,self.utilityDock) 254 self.utilityDock.hide() 255 256 self.worker=None 257 258 self.texteditorAction=self.editorDock.toggleViewAction() 259 self.texteditorAction.setShortcut("Ctrl+E") 260 261 if self.vName: 262 self.textveditorAction=self.vEditorDock.toggleViewAction() 263 self.textveditorAction.setShortcut("Ctrl+F") 264 265 self.utilityAction=self.utilityDock.toggleViewAction() 266 self.utilityAction.setShortcut("Ctrl+U") 267 268 self.displayDock=QtGui.QDockWidget("Display Properties", 269 self) 270 self.displayDock.setObjectName("DisplayPropertiesDock") 271 self.displayDock.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) 272 273 displayStuff=QtGui.QWidget() 274 displayLayout=QtGui.QGridLayout() 275 displayStuff.setLayout(displayLayout) 276 displayLayout.addWidget(QtGui.QLabel("Number scale"),0,0) 277 nrScale=QtGui.QDoubleSpinBox() 278 nrScale.setValue(self.numberScale) 279 nrScale.setMinimum(1e-2) 280 nrScale.setSingleStep(0.1) 281 self.connect(nrScale,QtCore.SIGNAL("valueChanged(double)"),self.numberScaleChanged) 282 displayLayout.addWidget(nrScale,0,1) 283 displayLayout.addWidget(QtGui.QLabel("Point scale"),1,0) 284 ptScale=QtGui.QDoubleSpinBox() 285 ptScale.setValue(self.pointScale) 286 ptScale.setMinimum(1e-2) 287 ptScale.setSingleStep(0.1) 288 self.connect(ptScale,QtCore.SIGNAL("valueChanged(double)"),self.pointScaleChanged) 289 displayLayout.addWidget(ptScale,1,1) 290 displayLayout.addWidget(QtGui.QLabel("Axis label scale"),2,0) 291 axisLScale=QtGui.QDoubleSpinBox() 292 axisLScale.setValue(self.axisLabelScale) 293 axisLScale.setMinimum(1e-2) 294 axisLScale.setSingleStep(0.1) 295 self.connect(axisLScale,QtCore.SIGNAL("valueChanged(double)"),self.axisLabelScaleChanged) 296 displayLayout.addWidget(axisLScale,2,1) 297 displayLayout.addWidget(QtGui.QLabel("Axis tube scale"),3,0) 298 axisTScale=QtGui.QDoubleSpinBox() 299 axisTScale.setValue(self.axisTubeScale) 300 axisTScale.setMinimum(1e-2) 301 axisTScale.setSingleStep(0.1) 302 self.connect(axisTScale,QtCore.SIGNAL("valueChanged(double)"),self.axisTubeScaleChanged) 303 displayLayout.addWidget(axisTScale,3,1) 304 305 displayLayout.setRowStretch(4,10) 306 307 self.displayDock.setWidget(displayStuff) 308 self.addDockWidget(QtCore.Qt.LeftDockWidgetArea,self.displayDock) 309 self.displayDock.hide() 310 311 self.displaypropertiesAction=self.displayDock.toggleViewAction() 312 self.displaypropertiesAction.setShortcut("Ctrl+D") 313 314 self.displayMenu=self.menuBar().addMenu("&Display") 315 self.displayMenu.addAction(self.texteditorAction) 316 self.displayMenu.addAction(self.displaypropertiesAction) 317 self.displayMenu.addAction(self.utilityAction) 318 if self.vName: 319 self.displayMenu.addAction(self.textveditorAction) 320 321 self.utilityMenu=self.menuBar().addMenu("&Utilities") 322 self.utilityMenu.addAction(self.blockMeshAction) 323 self.utilityMenu.addAction(self.checkMeshAction) 324 325 self.rereadButton=QtGui.QPushButton("Reread blockMeshDict") 326 327 try: 328 self.readFile() 329 except Exception: 330 e = sys.exc_info()[1] # Needed because python 2.5 does not support 'as e' 331 warning("While reading",self.fName,"this happened:",e) 332 raise e 333 334 self.ren.ResetCamera() 335 336 self.oldBlock=-1 337 self.blockActor=None 338 self.blockTextActor=None 339 self.blockAxisActor=None 340 341 self.oldPatch=-1 342 self.patchActor=None 343 self.patchTextActor=vtk.vtkTextActor() 344 self.patchTextActor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay() 345 self.patchTextActor.GetPositionCoordinate().SetValue(0.05,0.1) 346 self.patchTextActor.GetTextProperty().SetColor(0.,0.,0.) 347 self.patchTextActor.SetInput("Patch: <none>") 348 349 label1=QtGui.QLabel("Block (-1 is none)") 350 subLayout.addWidget(label1,0,0) 351 self.scroll=QtGui.QSlider(QtCore.Qt.Horizontal) 352 self.scroll.setRange(-1,len(self.blocks)-1) 353 self.scroll.setValue(-1) 354 self.scroll.setTickPosition(QtGui.QSlider.TicksBothSides) 355 self.scroll.setTickInterval(1) 356 self.scroll.setSingleStep(1) 357 self.connect(self.scroll,QtCore.SIGNAL("valueChanged(int)"),self.colorBlock) 358 subLayout.addWidget(self.scroll,0,1) 359 360 label2=QtGui.QLabel("Patch (-1 is none)") 361 subLayout.addWidget(label2,1,0) 362 self.scroll2=QtGui.QSlider(QtCore.Qt.Horizontal) 363 self.scroll2.setRange(-1,len(list(self.patches.keys()))-1) 364 self.scroll2.setValue(-1) 365 self.scroll2.setTickPosition(QtGui.QSlider.TicksBothSides) 366 self.scroll2.setTickInterval(1) 367 self.scroll2.setSingleStep(1) 368 self.connect(self.scroll2,QtCore.SIGNAL("valueChanged(int)"),self.colorPatch) 369 subLayout.addWidget(self.scroll2,1,1) 370 371 buttonLayout=QtGui.QHBoxLayout() 372 buttonLayout.addStretch() 373 374 subLayout.addLayout(buttonLayout,2,0,1,2) 375 buttonLayout.addWidget(self.rereadButton) 376 self.connect(self.rereadButton,QtCore.SIGNAL("clicked()"),self.reread) 377 b1=QtGui.QPushButton("Quit") 378 buttonLayout.addWidget(b1) 379 self.connect(b1,QtCore.SIGNAL("clicked()"),self.close) 380 381 self.iren = self.renWin.GetInteractor() 382 self.istyle = vtk.vtkInteractorStyleSwitch() 383 384 self.iren.SetInteractorStyle(self.istyle) 385 self.istyle.SetCurrentStyleToTrackballCamera() 386 387 # self.iren.Initialize() # Seems to be unnecessary and produces segfaults 388 # self.renWin.Render() 389 self.iren.Start() 390 391 self.addProps() 392 393 self.setUnifiedTitleAndToolBarOnMac(True) 394 395 self.restoreGeometry(QtCore.QSettings().value("geometry").toByteArray()) 396 self.restoreState(QtCore.QSettings().value("state").toByteArray()) 397 398 self.setStatus() 399 400 self.setupBlockingGui() 401 402 self.reread()
403
404 - def setupBlockingGui(self):
405 """sets up the GUI to add the Blocking functions.""" 406 self.isBlocking = False 407 self.isPatching = False 408 self.tmpBlock = [] 409 self.redLineActors = [] 410 self.tmpBlockActor = None 411 412 self.tmpPatch = [] 413 self.tmpPatchActor = None 414 415 self.tmpGlyphActor = None 416 417 self.renInteractor.GetPicker().AddObserver('PickEvent', self.PickEvent) 418 419 self.blockingDock=QtGui.QDockWidget("GUI Blocking", 420 self) 421 self.blockingDock.setObjectName("BlockingDock") 422 self.blockingDock.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea) 423 424 displayStuff=QtGui.QWidget() 425 displayLayout=QtGui.QGridLayout() 426 displayStuff.setLayout(displayLayout) 427 428 """Define Block""" 429 self.defineBlockButton=QtGui.QPushButton("Define Block") 430 displayLayout.addWidget(self.defineBlockButton,0,0) 431 self.connect(self.defineBlockButton,QtCore.SIGNAL("clicked()"),self.defineBlock) 432 433 """Insert Block""" 434 self.insertBlockButton=QtGui.QPushButton("Insert Block") 435 self.insertBlockButton.setEnabled(False) 436 displayLayout.addWidget(self.insertBlockButton,0,1) 437 self.connect(self.insertBlockButton,QtCore.SIGNAL("clicked()"),self.insertBlock) 438 439 displayLayout.addWidget(QtGui.QLabel("Press 'p' to select vertices"),1,0,1,4,QtCore.Qt.AlignLeft) 440 441 """Division Spin Box""" 442 self.blockdivx = 1; 443 self.blockdivy = 1; 444 self.blockdivz = 1; 445 446 447 self.blockDivSpinX=QtGui.QDoubleSpinBox() 448 self.blockDivSpinX.setValue(self.blockdivx) 449 self.blockDivSpinX.setMinimum(1) 450 self.blockDivSpinX.setSingleStep(1) 451 self.blockDivSpinX.setDecimals(0) 452 453 454 self.blockDivSpinY=QtGui.QDoubleSpinBox() 455 self.blockDivSpinY.setValue(self.blockdivy) 456 self.blockDivSpinY.setMinimum(1) 457 self.blockDivSpinY.setSingleStep(1) 458 self.blockDivSpinY.setDecimals(0) 459 460 461 self.blockDivSpinZ=QtGui.QDoubleSpinBox() 462 self.blockDivSpinZ.setValue(self.blockdivz) 463 self.blockDivSpinZ.setMinimum(1) 464 self.blockDivSpinZ.setSingleStep(1) 465 self.blockDivSpinZ.setDecimals(0) 466 467 divLayout = QtGui.QHBoxLayout() 468 divWidget = QtGui.QWidget() 469 displayLayout.addWidget(QtGui.QLabel("Block Division"),2,0) 470 divLayout.addWidget(self.blockDivSpinX) 471 divLayout.addWidget(self.blockDivSpinY) 472 divLayout.addWidget(self.blockDivSpinZ) 473 divWidget.setLayout(divLayout) 474 displayLayout.addWidget(divWidget,2,1,1,3) 475 476 """Text Editor""" 477 478 self.hexeditor=QtGui.QTextEdit() 479 self.hexeditor.setFont(QtGui.QFont("Courier")) 480 self.hexeditor.setLineWrapMode(QtGui.QTextEdit.NoWrap) 481 self.hexeditor.setReadOnly(True) 482 #self.hexeditor.textChanged.connect(self.blockMeshWasModified) 483 displayLayout.addWidget(self.hexeditor,3,0,1,4) 484 485 """patch button""" 486 self.definePatchButton=QtGui.QPushButton("Define Patch") 487 displayLayout.addWidget(self.definePatchButton,4,0) 488 self.connect(self.definePatchButton,QtCore.SIGNAL("clicked()"),self.definePatch) 489 490 self.insertPatchButton=QtGui.QPushButton("Insert Patch") 491 displayLayout.addWidget(self.insertPatchButton,5,0) 492 self.connect(self.insertPatchButton,QtCore.SIGNAL("clicked()"),self.insertPatch) 493 self.insertPatchButton.setEnabled(False) 494 495 self.reverseNormalButton=QtGui.QPushButton("Reverse Normal") 496 displayLayout.addWidget(self.reverseNormalButton,4,1) 497 self.connect(self.reverseNormalButton,QtCore.SIGNAL("clicked()"),self.reverseNormal) 498 self.reverseNormalButton.setEnabled(False) 499 500 self.selectPatchBox=QtGui.QComboBox() 501 displayLayout.addWidget(self.selectPatchBox,4,2,1,2) 502 503 for str in self.patches.keys(): 504 self.selectPatchBox.addItem(str) 505 506 self.blockingDock.setWidget(displayStuff) 507 self.addDockWidget(QtCore.Qt.RightDockWidgetArea,self.blockingDock) 508 self.blockingDock.hide() 509 510 self.blockingGuiAction=self.blockingDock.toggleViewAction() 511 self.blockingGuiAction.setShortcut("Ctrl+G") 512 self.displayMenu.addAction(self.blockingGuiAction) 513 self.blockingGuiAction.setEnabled(True)
514
515 - def AddBlockToDict(self):
516 """Adds block to dict, using pyFoam functions""" 517 msgBox = QtGui.QMessageBox() 518 msgBox.setText("The document has been modified.") 519 msgBox.setInformativeText("Do you want to save your changes?") 520 msgBox.setStandardButtons(QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel) 521 msgBox.setDefaultButton(QtGui.QMessageBox.Ok) 522 ret = msgBox.exec_() 523 524 if(ret==QtGui.QMessageBox.Ok): 525 self.blockMesh["blocks"].append("hex") 526 self.blockMesh["blocks"].append(self.tmpBlock) 527 self.blockMesh["blocks"].append(self.getDivString()) 528 self.blockMesh["blocks"].append("simpleGrading") 529 self.blockMesh["blocks"].append("(1 1 1)") 530 self.blockMesh.writeFile() 531 self.reread()
532
533 - def AddBlockToText(self):
534 """Inserts block into opened dict""" 535 msgBox = QtGui.QMessageBox() 536 msgBox.setText("The document has been modified.") 537 msgBox.setInformativeText("Do you want to save your changes?") 538 msgBox.setStandardButtons(QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel) 539 msgBox.setDefaultButton(QtGui.QMessageBox.Ok) 540 ret = msgBox.exec_() 541 542 if(ret==QtGui.QMessageBox.Ok): 543 txt=str(self.editor.toPlainText()) 544 p1=txt.find("blocks") 545 p2=txt.find("(",p1+1) 546 if p1>=0 and p2>=0: 547 txt=txt[:p2+1]+self.getTotalHexString()+txt[p2+1:] 548 self.editor.setPlainText(txt) 549 self.saveBlockMesh()
550
551 - def AddPatchToText(self):
552 """Inserts patch into opened dict""" 553 msgBox = QtGui.QMessageBox() 554 msgBox.setText("The document has been modified.") 555 msgBox.setInformativeText("Do you want to save your changes?") 556 msgBox.setStandardButtons(QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel) 557 msgBox.setDefaultButton(QtGui.QMessageBox.Ok) 558 ret = msgBox.exec_() 559 560 if(ret==QtGui.QMessageBox.Ok): 561 txt=str(self.editor.toPlainText()) 562 patchname = self.selectPatchBox.currentText() 563 self.setStatus("Adding to patch "+patchname) 564 p1=txt.find(patchname) 565 p2=txt.find("{",p1+1) 566 p3=txt.find("(",p1+1) 567 568 success=False 569 570 if p1>=0 and p2>=0 and (p3<0 or p3>p2): 571 p11=txt.find("faces",p2) 572 p22=txt.find("(",p11+1) 573 if p11>=0 and p22>=0: 574 success=True 575 txt=txt[:p22+1]+self.getTotalPatchString()+txt[p22+1:] 576 elif p1>=0 and p3>=0: 577 # old blockMeshFormat 578 success=True 579 txt=txt[:p3+1]+self.getTotalPatchString()+txt[p3+1:] 580 581 if success: 582 self.editor.setPlainText(txt) 583 self.saveBlockMesh() 584 else: 585 self.setStatus("Could not insert into patch",patchname)
586
587 - def PickEvent(self, obj, evt):
588 """Callback for picking event""" 589 if(self.isBlocking): 590 self.pickBlockVertice() 591 if(self.isPatching): 592 self.pickPatchVertice() 593 return 1
594
595 - def pickBlockVertice(self):
596 """pick a sphere and add point to block""" 597 i=self.pickVertice() 598 if(i==None): 599 return 600 601 if (len(self.tmpBlock)<=0 or self.tmpBlock[-1] != i): 602 self.tmpBlock.append(i) 603 self.hexeditor.moveCursor(QtGui.QTextCursor.End) 604 self.hexeditor.insertPlainText(str(self.tmpBlock[-1]) + " ") 605 n=len(self.tmpBlock) 606 if(n>1): 607 if(n==5): 608 self.addTmpBlockingLine(self.tmpBlock[n-5],self.tmpBlock[-1]) 609 self.addTmpBlockingLine(self.tmpBlock[0],self.tmpBlock[3]) 610 elif(n>5): 611 self.addTmpBlockingLine(self.tmpBlock[n-5],self.tmpBlock[-1]) 612 self.addTmpBlockingLine(self.tmpBlock[-2],self.tmpBlock[-1]) 613 else: 614 self.addTmpBlockingLine(self.tmpBlock[-2],self.tmpBlock[-1]) 615 616 if(len(self.tmpBlock)>=8): 617 self.isBlocking=False 618 self.hexeditor.moveCursor(QtGui.QTextCursor.End) 619 self.hexeditor.insertPlainText(self.getEndHexString()) 620 self.setStatus("Block finished") 621 self.showTmpBlock() 622 #self.AddBlockToDict() 623 self.insertBlockButton.setEnabled(True)
624
625 - def pickPatchVertice(self):
626 """pick a sphere and add point to vertice""" 627 i=self.pickVertice() 628 if(i==None): 629 return 630 631 if (len(self.tmpPatch)<=0 or self.tmpPatch[-1] != i): 632 self.tmpPatch.append(i) 633 self.hexeditor.moveCursor(QtGui.QTextCursor.End) 634 self.hexeditor.insertPlainText(str(self.tmpPatch[-1]) + " ") 635 n=len(self.tmpPatch) 636 if(n>1): 637 if(n>3): 638 self.addTmpBlockingLine(self.tmpPatch[0],self.tmpPatch[-1]) 639 self.addTmpBlockingLine(self.tmpPatch[-2],self.tmpPatch[-1]) 640 else: 641 self.addTmpBlockingLine(self.tmpPatch[-2],self.tmpPatch[-1]) 642 643 if(len(self.tmpPatch)>=4): 644 self.isPatching=False 645 self.hexeditor.moveCursor(QtGui.QTextCursor.End) 646 self.hexeditor.insertPlainText(")") 647 self.setStatus("Patch finished") 648 self.showTmpPatch() 649 self.insertPatchButton.setEnabled(True) 650 self.reverseNormalButton.setEnabled(True)
651
652 - def pickVertice(self):
653 """pick a vertice, returns Null if invalid""" 654 picker = self.renInteractor.GetPicker() 655 source = picker.GetActor().GetMapper().GetInput().GetProducerPort().GetProducer() 656 if(source.__class__.__name__=="vtkSphereSource"): 657 for i in range(len(self.vActors)): 658 if(self.vActors[i]==picker.GetActor()): 659 return i 660 return None
661
662 - def getEndHexString(self):
663 """last part of hex string""" 664 string ="" 665 divstring=self.getDivString() 666 # + " " + str(self.blockDivSpinY.value()) + " " + str(self.blockDivSpinZ.value()) + " )" 667 string = " ) "+ divstring +" simpleGrading (1 1 1)" 668 return string
669
670 - def getTotalHexString(self):
671 """total block hex string""" 672 string ="\n // added by pyFoam, DisplayBlockMesh\n" 673 string =string + " hex ( " 674 for blk in self.tmpBlock: 675 string += str(blk) + " " 676 divstring=self.getDivString() 677 string = string + self.getEndHexString() 678 return string
679
680 - def getTotalPatchString(self):
681 """total patch string""" 682 string ="\n // added by pyFoam, DisplayBlockMesh\n" 683 string+=self.getPatchString() 684 return string
685
686 - def getPatchString(self):
687 string = "( " 688 for patch in self.tmpPatch: 689 string += str(patch) + " " 690 string+= ")" 691 return string
692
693 - def getDivString(self):
694 """block division string""" 695 divstring="(" + "{val:g}".format(val=self.blockDivSpinX.value()) 696 divstring=divstring + " {val:g}".format(val=self.blockDivSpinY.value()) 697 divstring=divstring + " {val:g})".format(val=self.blockDivSpinZ.value()) 698 return divstring
699
700 - def defineBlock(self):
701 """callback for create block button""" 702 self.isBlocking = not self.isBlocking 703 if(self.isBlocking): 704 self.startBlocking() 705 else: 706 self.resetBlocking()
707
708 - def definePatch(self):
709 """Callback for create patch button""" 710 self.isPatching = not self.isPatching 711 if(self.isPatching): 712 self.startPatch() 713 else: 714 self.resetPatch()
715
716 - def insertBlock(self):
717 """inserts new block""" 718 self.AddBlockToText() 719 self.resetBlocking()
720
721 - def insertPatch(self):
722 """inserts new patch""" 723 self.AddPatchToText() 724 self.resetPatch()
725
726 - def startBlocking(self):
727 """start blocking""" 728 self.resetBlocking() 729 self.resetPatch() 730 731 self.renInteractor.setFocus() 732 self.isBlocking = True 733 self.defineBlockButton.setText("Reset Block") 734 self.hexeditor.append("hex ( ") 735 self.setStatus("Start hex")
736
737 - def resetBlocking(self):
738 """rest block""" 739 self.isBlocking = False 740 self.defineBlockButton.setText("Define Block") 741 742 for act in self.redLineActors: 743 self.ren.RemoveActor(act) 744 self.redLineActors = [] 745 self.tmpBlock = [] 746 self.hexeditor.clear() 747 self.insertBlockButton.setEnabled(False) 748 self.ren.RemoveActor(self.tmpBlockActor) 749 #cellpicker = vtk.vtkCellPicker() 750 #picker = self.renInteractor.GetPicker() 751 self.reread(False)
752
753 - def startPatch(self):
754 """start define patch""" 755 self.resetBlocking() 756 self.resetPatch() 757 758 self.renInteractor.setFocus() 759 self.isPatching = True 760 self.definePatchButton.setText("Reset Patch") 761 self.hexeditor.append("( ") 762 return
763
764 - def resetPatch(self):
765 """rest patch""" 766 self.isPatching = False 767 self.definePatchButton.setText("Define Patch") 768 self.tmpPatch = [] 769 for act in self.redLineActors: 770 self.ren.RemoveActor(act) 771 self.ren.RemoveActor(self.tmpGlyphActor) 772 self.redLineActors = [] 773 self.hexeditor.clear() 774 self.insertPatchButton.setEnabled(False) 775 self.reverseNormalButton.setEnabled(False) 776 self.ren.RemoveActor(self.tmpBlockActor) 777 self.reread(False) 778 return;
779
780 - def reverseNormal(self):
781 self.tmpPatch.reverse() 782 self.ren.RemoveActor(self.tmpGlyphActor) 783 self.ren.RemoveActor(self.tmpBlockActor) 784 self.showTmpPatch() 785 self.hexeditor.clear() 786 self.hexeditor.append(self.getPatchString())
787
788 - def addTmpBlockingLine(self,index1,index2):
789 """Add a colored line to show blocking progress""" 790 try: 791 c1=self.vertices[index1] 792 c2=self.vertices[index2] 793 except: 794 if index1>=len(self.vertices): 795 self.addUndefined(index1) 796 if index2>=len(self.vertices): 797 self.addUndefined(index2) 798 return None 799 line=vtk.vtkLineSource() 800 line.SetPoint1(c1) 801 line.SetPoint2(c2) 802 mapper=vtk.vtkPolyDataMapper() 803 mapper.SetInputConnection(line.GetOutputPort()) 804 805 property = vtk.vtkProperty(); 806 property.SetColor(0, 255, 50); 807 808 actor = vtk.vtkActor() 809 actor.SetMapper(mapper) 810 actor.SetProperty(property); 811 812 self.redLineActors.append(actor) 813 814 self.ren.AddActor(actor) 815 return actor
816
817 - def showTmpBlock(self):
818 """Add a colored block""" 819 append=vtk.vtkAppendPolyData() 820 append2=vtk.vtkAppendPolyData() 821 b=self.tmpBlock 822 append.AddInput(self.makeFace([b[0],b[1],b[2],b[3]])) 823 append.AddInput(self.makeFace([b[4],b[5],b[6],b[7]])) 824 append.AddInput(self.makeFace([b[0],b[1],b[5],b[4]])) 825 append.AddInput(self.makeFace([b[3],b[2],b[6],b[7]])) 826 append.AddInput(self.makeFace([b[0],b[3],b[7],b[4]])) 827 append.AddInput(self.makeFace([b[1],b[2],b[6],b[5]])) 828 mapper=vtk.vtkPolyDataMapper() 829 mapper.SetInputConnection(append.GetOutputPort()) 830 self.tmpBlockActor = vtk.vtkActor() 831 self.tmpBlockActor.SetMapper(mapper) 832 self.tmpBlockActor.GetProperty().SetColor(0.,1.,0.1) 833 self.tmpBlockActor.GetProperty().SetOpacity(0.3) 834 self.ren.AddActor(self.tmpBlockActor) 835 836 self.renWin.Render()
837
838 - def showTmpPatch(self):
839 """Add a colored patch""" 840 append=vtk.vtkAppendPolyData() 841 b=self.tmpPatch 842 append.AddInput(self.makeFace([b[0],b[1],b[2],b[3]])) 843 mapper=vtk.vtkPolyDataMapper() 844 mapper.SetInputConnection(append.GetOutputPort()) 845 self.tmpBlockActor = vtk.vtkActor() 846 self.tmpBlockActor.SetMapper(mapper) 847 self.tmpBlockActor.GetProperty().SetColor(0.,1.,0.1) 848 self.tmpBlockActor.GetProperty().SetOpacity(0.3) 849 self.ren.AddActor(self.tmpBlockActor) 850 851 852 planeNormals = vtk.vtkPolyDataNormals() 853 planeNormals.SetInputConnection(append.GetOutputPort()) 854 planeMapper = vtk.vtkDataSetMapper() 855 planeMapper.SetInputConnection(planeNormals.GetOutputPort()) 856 857 arrowSource = vtk.vtkArrowSource() 858 859 arrowGlyph = vtk.vtkGlyph3D() 860 arrowGlyph.ScalingOn() 861 arrowGlyph.SetScaleFactor(self.blockMesh.typicalLength()/4) 862 arrowGlyph.SetVectorModeToUseNormal() 863 arrowGlyph.SetScaleModeToScaleByVector() 864 arrowGlyph.OrientOn() 865 arrowGlyph.SetSourceConnection(arrowSource.GetOutputPort()) 866 arrowGlyph.SetInputConnection(planeNormals.GetOutputPort()) 867 868 """ 869 870 871 872 >>> 873 >>> # Specify the shape of the glyph 874 >>> vtkArrowSource arrowSource 875 >>> 876 >>> vtkGlyph3D arrowGlyph 877 >>> arrowGlyph ScalingOn 878 >>> arrowGlyph SetScaleFactor 0.7 879 >>> arrowGlyph SetVectorModeToUseNormal 880 >>> arrowGlyph SetScaleModeToScaleByVector 881 >>> arrowGlyph OrientOn 882 >>> arrowGlyph SetSourceConnection [arrowSource GetOutputPort] 883 >>> arrowGlyph SetInputConnection [planeNormals GetOutputPort] 884 >>> 885 >>> vtkDataSetMapper arrowGlyphMapper 886 >>> arrowGlyphMapper SetInputConnection [arrowGlyph GetOutputPort] 887 >>> 888 >>> vtkActor glyphActor 889 >>> glyphActor SetMapper arrowGlyphMapper 890 """ 891 #actor = vtk.vtkActor() 892 #actor.SetMapper(planeMapper); 893 #self.ren.AddActor(actor) 894 895 glyphMapper = vtk.vtkPolyDataMapper() 896 glyphMapper.SetInputConnection(arrowGlyph.GetOutputPort()); 897 898 self.tmpGlyphActor = vtk.vtkActor() 899 self.tmpGlyphActor.SetMapper(glyphMapper); 900 901 self.tmpGlyphActor.GetProperty().SetColor(0., 1., 0.) 902 903 self.ren.AddActor(self.tmpGlyphActor) 904 905 self.renWin.Render()
906
907 - def blockMesh(self):
908 self.executeUtility("blockMesh")
909
910 - def checkMesh(self):
911 self.executeUtility("checkMesh")
912
913 - def executeUtility(self,util):
914 if self.worker!=None: 915 self.error("There seems to be another worker") 916 917 self.setStatus("Executing "+util) 918 self.blockMeshAction.setEnabled(False) 919 self.checkMeshAction.setEnabled(False) 920 921 self.utilityOutput.clear() 922 self.utilityOutput.append("Running "+util+" on case "+self.caseDir) 923 self.utilityDock.show() 924 925 self.worker=UtilityThread(argv=[util, 926 "-case", 927 self.caseDir], 928 parent=self) 929 self.connect(self.worker,QtCore.SIGNAL("finished()"),self.executionEnded) 930 self.connect(self.worker,QtCore.SIGNAL("newLine(QString)"),self.utilityOutputAppend) 931 self.worker.start()
932
933 - def utilityOutputAppend(self,line):
934 self.utilityOutput.append(line)
935
936 - def executionEnded(self):
937 self.blockMeshAction.setEnabled(True) 938 self.checkMeshAction.setEnabled(True) 939 self.setStatus("Execution of "+self.worker.argv[0]+" finished"+self.worker.status) 940 self.worker=None
941
942 - def setStatus(self,message="Ready"):
943 if self.isWindowModified(): 944 message="blockMesh modified - "+message 945 print_("Status:",message) 946 self.statusBar().showMessage(message)
947
948 - def blockMeshWasModified(self):
949 if not self.saveAction.isEnabled(): 950 self.saveAction.setEnabled(True) 951 if self.rereadAction.isEnabled(): 952 self.rereadAction.setEnabled(False) 953 self.rereadButton.setEnabled(False) 954 955 self.setWindowModified(True) 956 self.setStatus()
957
958 - def readFile(self,resetText=True):
959 if resetText: 960 txt=open(self.fName).read() 961 self.editor.setPlainText(txt) 962 if self.vName: 963 txt=open(self.vName).read() 964 self.vEditor.setPlainText(txt) 965 966 self.setWindowModified(False) 967 if not self.alwaysSave: 968 self.saveAction.setEnabled(False) 969 self.rereadAction.setEnabled(True) 970 self.rereadButton.setEnabled(True) 971 972 bFile=self.fName 973 if self.vName: 974 print_("Evaluating template") 975 bFile=path.splitext(self.fName)[0] 976 template=TemplateFile(self.fName) 977 978 if path.exists(self.vName): 979 vals=ParsedParameterFile(self.vName, 980 noHeader=True, 981 doMacroExpansion=True).getValueDict() 982 else: 983 vals={} 984 txt=template.getString(vals) 985 open(bFile,"w").write(txt) 986 987 self.blockMesh=ParsedBlockMeshDict(bFile, 988 doMacroExpansion=True) 989 990 self.vertices=self.blockMesh.vertices() 991 self.vActors=[None]*len(self.vertices) 992 self.tActors=[None]*len(self.vertices) 993 self.spheres=[None]*len(self.vertices) 994 995 self.blocks=self.blockMesh.blocks() 996 self.patches=self.blockMesh.patches() 997 998 self.vRadius=self.blockMesh.typicalLength()/50 999 1000 for i in range(len(self.vertices)): 1001 self.addVertex(i) 1002 1003 self.setAxes() 1004 1005 self.undefined=[] 1006 1007 for i in range(len(self.blocks)): 1008 self.addBlock(i) 1009 1010 for a in self.blockMesh.arcs(): 1011 self.makeArc(a) 1012 1013 if len(self.undefined)>0: 1014 self.undefinedActor.SetInput("Undefined vertices: "+str(self.undefined)) 1015 else: 1016 self.undefinedActor.SetInput("") 1017 1018 self.setStatus("Read file")
1019
1020 - def saveBlockMesh(self):
1021 txt=str(self.editor.toPlainText()) 1022 open(self.fName,"w").write(txt) 1023 if self.vName: 1024 txt=str(self.vEditor.toPlainText()) 1025 open(self.vName,"w").write(txt) 1026 1027 self.reread(resetText=False) 1028 self.setStatus("Saved file")
1029
1030 - def addUndefined(self,i):
1031 if not i in self.undefined: 1032 self.undefined.append(i)
1033
1034 - def addProps(self):
1035 self.ren.AddViewProp(self.axes) 1036 self.ren.AddActor2D(self.patchTextActor) 1037 self.ren.AddActor2D(self.undefinedActor)
1038
1039 - def numberScaleChanged(self,scale):
1040 self.numberScale=scale 1041 for tActor in self.tActors: 1042 tActor.SetScale(self.numberScale*self.vRadius,self.numberScale*self.vRadius,self.numberScale*self.vRadius) 1043 self.renWin.Render()
1044
1045 - def pointScaleChanged(self,scale):
1046 self.pointScale=scale 1047 for sphere in self.spheres: 1048 sphere.SetRadius(self.vRadius*self.pointScale) 1049 self.renWin.Render()
1050
1051 - def axisLabelScaleChanged(self,scale):
1052 self.axisLabelScale=scale 1053 if self.blockTextActor: 1054 for t in self.blockTextActor: 1055 t.SetScale(self.axisLabelScale*self.vRadius, 1056 self.axisLabelScale*self.vRadius, 1057 self.axisLabelScale*self.vRadius) 1058 self.renWin.Render()
1059
1060 - def axisTubeScaleChanged(self,scale):
1061 self.axisTubeScale=scale 1062 if self.blockAxisActor: 1063 for t in self.blockAxisActor: 1064 t.SetRadius(self.vRadius*self.axisTubeScale) 1065 self.renWin.Render()
1066
1067 - def addPoint(self,coord,factor=1):
1068 sphere=vtk.vtkSphereSource() 1069 sphere.SetRadius(self.vRadius*factor*self.pointScale) 1070 sphere.SetCenter(coord) 1071 mapper=vtk.vtkPolyDataMapper() 1072 mapper.SetInputConnection(sphere.GetOutputPort()) 1073 actor = vtk.vtkActor() 1074 actor.SetMapper(mapper) 1075 self.ren.AddActor(actor) 1076 1077 return sphere,actor
1078
1079 - def addVertex(self,index):
1080 coord=self.vertices[index] 1081 self.spheres[index],self.vActors[index]=self.addPoint(coord) 1082 text=vtk.vtkVectorText() 1083 text.SetText(str(index)) 1084 tMapper=vtk.vtkPolyDataMapper() 1085 tMapper.SetInput(text.GetOutput()) 1086 tActor = vtk.vtkFollower() 1087 tActor.SetMapper(tMapper) 1088 tActor.SetScale(self.numberScale*self.vRadius,self.numberScale*self.vRadius,self.numberScale*self.vRadius) 1089 tActor.AddPosition(coord[0]+self.vRadius,coord[1]+self.vRadius,coord[2]+self.vRadius) 1090 tActor.SetCamera(self.cam) 1091 tActor.GetProperty().SetColor(1.0,0.,0.) 1092 self.tActors[index]=tActor 1093 self.ren.AddActor(tActor)
1094
1095 - def addLine(self,index1,index2):
1096 try: 1097 c1=self.vertices[index1] 1098 c2=self.vertices[index2] 1099 except: 1100 if index1>=len(self.vertices): 1101 self.addUndefined(index1) 1102 if index2>=len(self.vertices): 1103 self.addUndefined(index2) 1104 return None 1105 line=vtk.vtkLineSource() 1106 line.SetPoint1(c1) 1107 line.SetPoint2(c2) 1108 mapper=vtk.vtkPolyDataMapper() 1109 mapper.SetInputConnection(line.GetOutputPort()) 1110 actor = vtk.vtkActor() 1111 actor.SetMapper(mapper) 1112 self.ren.AddActor(actor) 1113 return actor
1114
1115 - def makeDirection(self,index1,index2,label):
1116 try: 1117 c1=self.vertices[index1] 1118 c2=self.vertices[index2] 1119 except: 1120 return None,None 1121 line=vtk.vtkLineSource() 1122 line.SetPoint1(c1) 1123 line.SetPoint2(c2) 1124 tube=vtk.vtkTubeFilter() 1125 tube.SetRadius(self.vRadius*self.axisTubeScale) 1126 tube.SetNumberOfSides(10) 1127 tube.SetInput(line.GetOutput()) 1128 text=vtk.vtkVectorText() 1129 text.SetText(label) 1130 tMapper=vtk.vtkPolyDataMapper() 1131 tMapper.SetInput(text.GetOutput()) 1132 tActor = vtk.vtkFollower() 1133 tActor.SetMapper(tMapper) 1134 tActor.SetScale(self.axisLabelScale*self.vRadius, 1135 self.axisLabelScale*self.vRadius, 1136 self.axisLabelScale*self.vRadius) 1137 tActor.AddPosition((c1[0]+c2[0])/2+self.vRadius, 1138 (c1[1]+c2[1])/2+self.vRadius, 1139 (c1[2]+c2[2])/2+self.vRadius) 1140 tActor.SetCamera(self.cam) 1141 tActor.GetProperty().SetColor(0.0,0.,0.) 1142 return tube,tActor
1143
1144 - def makeSpline(self,lst):
1145 points = vtk.vtkPoints() 1146 for i in range(len(lst)): 1147 v=lst[i] 1148 points.InsertPoint(i,v[0],v[1],v[2]) 1149 spline=vtk.vtkParametricSpline() 1150 spline.SetPoints(points) 1151 spline.ClosedOff() 1152 splineSource=vtk.vtkParametricFunctionSource() 1153 splineSource.SetParametricFunction(spline) 1154 mapper=vtk.vtkPolyDataMapper() 1155 mapper.SetInputConnection(splineSource.GetOutputPort()) 1156 actor = vtk.vtkActor() 1157 actor.SetMapper(mapper) 1158 self.ren.AddActor(actor)
1159
1160 - def makeArc(self,data):
1161 try: 1162 self.makeSpline([self.vertices[data[0]],data[1],self.vertices[data[2]]]) 1163 except: 1164 if data[0]>=len(self.vertices): 1165 self.addUndefined(data[0]) 1166 if data[2]>=len(self.vertices): 1167 self.addUndefined(data[2]) 1168 1169 self.addPoint(data[1],factor=0.5)
1170
1171 - def makeFace(self,lst):
1172 points = vtk.vtkPoints() 1173 side = vtk.vtkCellArray() 1174 side.InsertNextCell(len(lst)) 1175 for i in range(len(lst)): 1176 try: 1177 v=self.vertices[lst[i]] 1178 except: 1179 self.addUndefined(lst[i]) 1180 return None 1181 points.InsertPoint(i,v[0],v[1],v[2]) 1182 side.InsertCellPoint(i) 1183 result=vtk.vtkPolyData() 1184 result.SetPoints(points) 1185 result.SetPolys(side) 1186 1187 return result
1188
1189 - def addBlock(self,index):
1190 b=self.blocks[index] 1191 1192 self.addLine(b[ 0],b[ 1]) 1193 self.addLine(b[ 3],b[ 2]) 1194 self.addLine(b[ 7],b[ 6]) 1195 self.addLine(b[ 4],b[ 5]) 1196 self.addLine(b[ 0],b[ 3]) 1197 self.addLine(b[ 1],b[ 2]) 1198 self.addLine(b[ 5],b[ 6]) 1199 self.addLine(b[ 4],b[ 7]) 1200 self.addLine(b[ 0],b[ 4]) 1201 self.addLine(b[ 1],b[ 5]) 1202 self.addLine(b[ 2],b[ 6]) 1203 self.addLine(b[ 3],b[ 7])
1204
1205 - def setAxes(self):
1206 append=vtk.vtkAppendPolyData() 1207 for a in self.vActors: 1208 if a!=None: 1209 append.AddInput(a.GetMapper().GetInput()) 1210 self.axes.SetInput(append.GetOutput())
1211
1212 - def reread(self,resetText=True):
1213 self.ren.RemoveAllViewProps() 1214 self.patchActor=None 1215 self.blockActor=None 1216 self.blockAxisActor=None 1217 self.blockTextActor=None 1218 self.addProps() 1219 try: 1220 self.readFile(resetText=resetText) 1221 1222 tmpBlock=self.scroll.value() 1223 if not tmpBlock<len(self.blocks): 1224 tmpBlock=len(self.blocks)-1 1225 self.scroll.setRange(-1,len(self.blocks)-1) 1226 self.scroll.setValue(tmpBlock) 1227 self.colorBlock(tmpBlock) 1228 1229 tmpPatch=self.scroll2.value() 1230 if not tmpPatch<len(list(self.patches.keys())): 1231 tmpPatch=len(list(self.patches.keys()))-1 1232 self.scroll2.setRange(-1,len(list(self.patches.keys()))-1) 1233 self.scroll2.setValue(tmpPatch) 1234 self.colorPatch(tmpPatch) 1235 1236 self.renWin.Render() 1237 except Exception: 1238 e = sys.exc_info()[1] # Needed because python 2.5 does not support 'as e' 1239 print_("Problem rereading:",e) 1240 self.setStatus("Problem:"+str(e)) 1241 raise e
1242
1243 - def colorBlock(self,value):
1244 newBlock=int(value) 1245 if self.oldBlock>=0 and self.blockActor!=None: 1246 self.ren.RemoveActor(self.blockActor) 1247 for ta in self.blockTextActor: 1248 self.ren.RemoveActor(ta) 1249 self.blockActor=None 1250 self.blockTextActor=None 1251 self.blockAxisActor=None 1252 if newBlock>=0: 1253 append=vtk.vtkAppendPolyData() 1254 append2=vtk.vtkAppendPolyData() 1255 b=self.blocks[newBlock] 1256 append.AddInput(self.makeFace([b[0],b[1],b[2],b[3]])) 1257 append.AddInput(self.makeFace([b[4],b[5],b[6],b[7]])) 1258 append.AddInput(self.makeFace([b[0],b[1],b[5],b[4]])) 1259 append.AddInput(self.makeFace([b[3],b[2],b[6],b[7]])) 1260 append.AddInput(self.makeFace([b[0],b[3],b[7],b[4]])) 1261 append.AddInput(self.makeFace([b[1],b[2],b[6],b[5]])) 1262 d1,t1=self.makeDirection(b[0],b[1],"x1") 1263 append.AddInput(d1.GetOutput()) 1264 self.ren.AddActor(t1) 1265 d2,t2=self.makeDirection(b[0],b[3],"x2") 1266 append.AddInput(d2.GetOutput()) 1267 self.ren.AddActor(t2) 1268 d3,t3=self.makeDirection(b[0],b[4],"x3") 1269 append.AddInput(d3.GetOutput()) 1270 self.ren.AddActor(t3) 1271 self.blockTextActor=(t1,t2,t3) 1272 self.blockAxisActor=(d1,d2,d3) 1273 mapper=vtk.vtkPolyDataMapper() 1274 mapper.SetInputConnection(append.GetOutputPort()) 1275 self.blockActor = vtk.vtkActor() 1276 self.blockActor.SetMapper(mapper) 1277 self.blockActor.GetProperty().SetColor(0.,1.,0.) 1278 self.blockActor.GetProperty().SetOpacity(0.3) 1279 self.ren.AddActor(self.blockActor) 1280 1281 self.oldBlock=newBlock 1282 self.renWin.Render()
1283
1284 - def colorPatch(self,value):
1285 newPatch=int(value) 1286 if self.oldPatch>=0 and self.patchActor!=None: 1287 self.ren.RemoveActor(self.patchActor) 1288 self.patchActor=None 1289 self.patchTextActor.SetInput("Patch: <none>") 1290 if newPatch>=0: 1291 name=list(self.patches.keys())[newPatch] 1292 subs=self.patches[name] 1293 append=vtk.vtkAppendPolyData() 1294 for s in subs: 1295 append.AddInput(self.makeFace(s)) 1296 mapper=vtk.vtkPolyDataMapper() 1297 mapper.SetInputConnection(append.GetOutputPort()) 1298 self.patchActor = vtk.vtkActor() 1299 self.patchActor.SetMapper(mapper) 1300 self.patchActor.GetProperty().SetColor(0.,0.,1.) 1301 self.patchActor.GetProperty().SetOpacity(0.3) 1302 self.ren.AddActor(self.patchActor) 1303 self.patchTextActor.SetInput("Patch: "+name) 1304 1305 self.oldPatch=newPatch 1306 self.renWin.Render()
1307
1308 - def closeEvent(self,event):
1309 print_("Closing and saving settings to",QtCore.QSettings().fileName()) 1310 QtCore.QSettings().setValue("geometry",QtCore.QVariant(self.saveGeometry())) 1311 QtCore.QSettings().setValue("state",QtCore.QVariant(self.saveState()))
1312
1313 -class DisplayBlockMesh(PyFoamApplicationQt4):
1314 - def __init__(self):
1315 description="""\ 1316 Reads the contents of a blockMeshDict-file and displays the vertices 1317 as spheres (with numbers). The blocks are sketched by lines. One block 1318 can be seceted with a slider. It will be displayed as a green cube 1319 with the local directions x1,x2 and x3. Also a patch that is selected 1320 by a slider will be sketched by blue squares 1321 1322 This is a new version with a QT-GUI 1323 """ 1324 1325 super(DisplayBlockMesh,self).__init__(description=description, 1326 usage="%prog [options] <blockMeshDict>", 1327 interspersed=True, 1328 nr=1)
1329
1330 - def addOptions(self):
1331 template=OptionGroup(self.parser, 1332 "Template mode", 1333 "Additional input for template mode where the edited file is a template that can be processed with the pyFoamFromTemplate.py-utility") 1334 template.add_option("--values-file", 1335 dest="valuesFile", 1336 action="store", 1337 default=None, 1338 help="File with the values to be used in the template. If specified the application runs in template mode") 1339 1340 self.parser.add_option_group(template)
1341
1342 - def setupGUI(self):
1343 print_(usedVTK) 1344 1345 bmFile=self.parser.getArgs()[0] 1346 if not path.exists(bmFile): 1347 self.error(bmFile,"not found") 1348 1349 if self.opts.valuesFile: 1350 print_("Running in template mode") 1351 if path.splitext(bmFile)[1]=="": 1352 self.error("Specified template file",bmFile, 1353 "has no extension") 1354 try: 1355 self.dialog=DisplayBlockMeshDialog(bmFile, 1356 valuesFile=self.opts.valuesFile) 1357 except IOError: 1358 self.error("Problem with blockMesh file",bmFile) 1359 self.dialog.show()
1360 1361 # Should work with Python3 and Python2 1362