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
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]
40 error("Error while importing modules:",e)
41
42 doImports()
43
56
74
76 self.emit(QtCore.SIGNAL("newLine(QString)"),line)
77
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
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
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]
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
395
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
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
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
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
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
601
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
630 self.insertBlockButton.setEnabled(True)
631
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
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
670 """last part of hex string"""
671 string =""
672 divstring=self.getDivString()
673
674 string = " ) "+ divstring +" simpleGrading (1 1 1)"
675 return string
676
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
688 """total patch string"""
689 string ="\n // added by pyFoam, DisplayBlockMesh\n"
690 string+=self.getPatchString()
691 return string
692
694 string = "( "
695 for patch in self.tmpPatch:
696 string += str(patch) + " "
697 string+= ")"
698 return string
699
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
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
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
727
732
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
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
757
758 self.reread(False)
759
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
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
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
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
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
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
899
900
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
916
919
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
942
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
954
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
1028
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
1040 if not i in self.undefined:
1041 self.undefined.append(i)
1042
1044 self.ren.AddViewProp(self.axes)
1045 self.ren.AddActor2D(self.patchTextActor)
1046 self.ren.AddActor2D(self.undefinedActor)
1047
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
1055 self.pointScale=scale
1056 for sphere in self.spheres:
1057 sphere.SetRadius(self.vRadius*self.pointScale)
1058 self.renWin.Render()
1059
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
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
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
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
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
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
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
1179
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
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
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):
1251
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
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
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
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
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
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
1375