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