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
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]
38 error("Error while importing modules:",e)
39
40 doImports()
41
54
72
74 self.emit(QtCore.SIGNAL("newLine(QString)"),line)
75
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
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]
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
388
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
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
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
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
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
594
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
623 self.insertBlockButton.setEnabled(True)
624
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
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
663 """last part of hex string"""
664 string =""
665 divstring=self.getDivString()
666
667 string = " ) "+ divstring +" simpleGrading (1 1 1)"
668 return string
669
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
681 """total patch string"""
682 string ="\n // added by pyFoam, DisplayBlockMesh\n"
683 string+=self.getPatchString()
684 return string
685
687 string = "( "
688 for patch in self.tmpPatch:
689 string += str(patch) + " "
690 string+= ")"
691 return string
692
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
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
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
720
725
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
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
750
751 self.reread(False)
752
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
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
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
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
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
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
892
893
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
909
912
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
935
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
947
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
1019
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
1031 if not i in self.undefined:
1032 self.undefined.append(i)
1033
1035 self.ren.AddViewProp(self.axes)
1036 self.ren.AddActor2D(self.patchTextActor)
1037 self.ren.AddActor2D(self.undefinedActor)
1038
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
1046 self.pointScale=scale
1047 for sphere in self.spheres:
1048 sphere.SetRadius(self.vRadius*self.pointScale)
1049 self.renWin.Render()
1050
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
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
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
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
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
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
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
1170
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
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
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]
1239 print_("Problem rereading:",e)
1240 self.setStatus("Problem:"+str(e))
1241 raise e
1242
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
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
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
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
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
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
1362