1 """
2 New implementation of DisplayBlockMesh using PyQT4
3 """
4
5 from PyFoam.RunDictionary.ParsedBlockMeshDict import ParsedBlockMeshDict
6 from PyFoam.Applications.PyFoamApplicationQt4 import PyFoamApplicationQt4
7 from PyFoam.Error import error,warning
8 from PyFoam.RunDictionary.SolutionDirectory import NoTouchSolutionDirectory
9 from PyFoam.Execution.BasicRunner import BasicRunner
10
11 import sys
12 from os import path
13
15 try:
16 global QtGui,QtCore
17 from PyQt4 import QtGui,QtCore
18 global vtk
19 try:
20 import vtk
21 print "Using system-VTK"
22 except ImportError:
23 print "Trying VTK implementation from Paraview"
24 from paraview import vtk
25 global QVTKRenderWindowInteractor
26 from vtk.qt4 import QVTKRenderWindowInteractor
27 except ImportError,e:
28 error("Error while importing modules:",e)
29
30 doImports()
31
44
53 try:
54 runner=ReportToThreadRunner(argv=self.argv,
55 thread=self)
56 runner.start()
57 if not runner.runOK():
58 self.status=" - Problem"
59
60 except IOError:
61 self.status=" - OS Problem"
62
64 self.emit(QtCore.SIGNAL("newLine(QString)"),line)
65
68 super(DisplayBlockMeshDialog,self).__init__(None)
69 self.fName=fName
70
71 self.numberScale=2
72 self.pointScale=1
73 self.axisLabelScale=1
74 self.axisTubeScale=0.5
75
76 self.setWindowTitle("%s[*] - DisplayBlockMesh" % fName)
77
78 self.caseDir=None
79 try:
80 caseDir=path.sep+apply(path.join,path.abspath(fName).split(path.sep)[:-3])
81 isOK=NoTouchSolutionDirectory(caseDir)
82 if isOK:
83 self.caseDir=caseDir
84 self.setWindowTitle("Case %s[*] - DisplayBlockMesh" % caseDir.split(path.sep)[-1])
85 except:
86 pass
87
88 central = QtGui.QWidget()
89 self.setCentralWidget(central)
90
91 layout = QtGui.QVBoxLayout()
92 central.setLayout(layout)
93 self.renInteractor=QVTKRenderWindowInteractor.QVTKRenderWindowInteractor(central)
94
95 self.renInteractor.Start()
96
97 layout.addWidget(self.renInteractor)
98
99 mainDock=QtGui.QDockWidget("Main controls",
100 self)
101 mainDock.setObjectName("MainControlsDock")
102 mainDock.setFeatures(QtGui.QDockWidget.DockWidgetFloatable | QtGui.QDockWidget.DockWidgetMovable)
103 mainDock.setAllowedAreas(QtCore.Qt.TopDockWidgetArea | QtCore.Qt.BottomDockWidgetArea)
104 mainDockWidget=QtGui.QWidget()
105 mainDock.setWidget(mainDockWidget)
106
107 subLayout=QtGui.QGridLayout()
108 mainDockWidget.setLayout(subLayout)
109 self.addDockWidget(QtCore.Qt.BottomDockWidgetArea, mainDock)
110
111 self.renInteractor.show()
112 self.renWin = self.renInteractor.GetRenderWindow()
113 self.ren = vtk.vtkRenderer()
114 self.renWin.AddRenderer(self.ren)
115 self.renWin.SetSize(600, 600)
116 self.ren.SetBackground(0.7, 0.7, 0.7)
117 self.ren.ResetCamera()
118 self.cam = self.ren.GetActiveCamera()
119 self.axes = vtk.vtkCubeAxesActor2D()
120 self.axes.SetCamera(self.ren.GetActiveCamera())
121
122 self.undefinedActor=vtk.vtkTextActor()
123 self.undefinedActor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay()
124 self.undefinedActor.GetPositionCoordinate().SetValue(0.05,0.2)
125 self.undefinedActor.GetTextProperty().SetColor(1.,0.,0.)
126 self.undefinedActor.SetInput("")
127
128 self.rereadAction=QtGui.QAction("&Reread",
129 self)
130 self.rereadAction.setShortcut("Ctrl+R")
131 self.rereadAction.setToolTip("Reread the blockMesh-file")
132 self.connect(self.rereadAction,
133 QtCore.SIGNAL("triggered()"),
134 self.reread)
135
136 self.blockMeshAction=QtGui.QAction("&BlockMesh",
137 self)
138 self.blockMeshAction.setShortcut("Ctrl+B")
139 self.blockMeshAction.setToolTip("Execute blockMesh-Utility")
140 self.connect(self.blockMeshAction,
141 QtCore.SIGNAL("triggered()"),
142 self.blockMesh)
143
144 self.checkMeshAction=QtGui.QAction("Chec&kMesh",
145 self)
146 self.checkMeshAction.setShortcut("Ctrl+K")
147 self.checkMeshAction.setToolTip("Execute checkMesh-Utility")
148 self.connect(self.checkMeshAction,
149 QtCore.SIGNAL("triggered()"),
150 self.checkMesh)
151 if self.caseDir==None:
152 self.blockMeshAction.setEnabled(False)
153 self.checkMeshAction.setEnabled(False)
154
155 self.quitAction=QtGui.QAction("&Quit",
156 self)
157
158 self.quitAction.setShortcut("Ctrl+Q")
159 self.quitAction.setToolTip("Quit this program")
160 self.connect(self.quitAction,
161 QtCore.SIGNAL("triggered()"),
162 self.close)
163
164 self.saveAction=QtGui.QAction("&Save",
165 self)
166
167 self.saveAction.setShortcut(QtGui.QKeySequence.Save)
168 self.saveAction.setToolTip("Save the blockmesh from the editor")
169 self.connect(self.saveAction,
170 QtCore.SIGNAL("triggered()"),
171 self.saveBlockMesh)
172 self.saveAction.setEnabled(False)
173
174 self.fileMenu=self.menuBar().addMenu("&Blockmesh file")
175 self.fileMenu.addAction(self.rereadAction)
176 self.fileMenu.addAction(self.saveAction)
177 self.fileMenu.addSeparator()
178 self.fileMenu.addAction(self.quitAction)
179
180 self.editorDock=QtGui.QDockWidget("Edit blockMesh",
181 self)
182 self.editorDock.setObjectName("EditorDock")
183 self.editorDock.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea)
184
185 try:
186 self.editor=QtGui.QPlainTextEdit()
187 self.editor.setLineWrapMode(QtGui.QPlainTextEdit.NoWrap)
188 self.editor.textChanged.connect(self.blockMeshWasModified)
189 except AttributeError:
190 warning("Old PyQT4-version. Editing might not work as expected")
191 self.editor=QtGui.QTextEdit()
192
193 self.editor.setFont(QtGui.QFont("Courier"))
194
195 self.editorDock.setWidget(self.editor)
196 self.addDockWidget(QtCore.Qt.RightDockWidgetArea,self.editorDock)
197 self.editorDock.hide()
198
199 self.utilityDock=QtGui.QDockWidget("Utility output",
200 self)
201 self.utilityOutput=QtGui.QTextEdit()
202 self.utilityOutput.setFont(QtGui.QFont("Courier"))
203 self.utilityOutput.setLineWrapMode(QtGui.QTextEdit.NoWrap)
204 self.utilityOutput.setReadOnly(True)
205 self.utilityDock.setWidget(self.utilityOutput)
206 self.utilityDock.setObjectName("UtilityDock")
207 self.utilityDock.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea)
208 self.addDockWidget(QtCore.Qt.RightDockWidgetArea,self.utilityDock)
209 self.utilityDock.hide()
210
211 self.worker=None
212
213 self.texteditorAction=self.editorDock.toggleViewAction()
214 self.texteditorAction.setShortcut("Ctrl+E")
215
216 self.utilityAction=self.utilityDock.toggleViewAction()
217 self.utilityAction.setShortcut("Ctrl+U")
218
219 self.displayDock=QtGui.QDockWidget("Display Properties",
220 self)
221 self.displayDock.setObjectName("DisplayPropertiesDock")
222 self.displayDock.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea)
223
224 displayStuff=QtGui.QWidget()
225 displayLayout=QtGui.QGridLayout()
226 displayStuff.setLayout(displayLayout)
227 displayLayout.addWidget(QtGui.QLabel("Number scale"),0,0)
228 nrScale=QtGui.QDoubleSpinBox()
229 nrScale.setValue(self.numberScale)
230 nrScale.setMinimum(1e-2)
231 nrScale.setSingleStep(0.1)
232 self.connect(nrScale,QtCore.SIGNAL("valueChanged(double)"),self.numberScaleChanged)
233 displayLayout.addWidget(nrScale,0,1)
234 displayLayout.addWidget(QtGui.QLabel("Point scale"),1,0)
235 ptScale=QtGui.QDoubleSpinBox()
236 ptScale.setValue(self.pointScale)
237 ptScale.setMinimum(1e-2)
238 ptScale.setSingleStep(0.1)
239 self.connect(ptScale,QtCore.SIGNAL("valueChanged(double)"),self.pointScaleChanged)
240 displayLayout.addWidget(ptScale,1,1)
241 displayLayout.addWidget(QtGui.QLabel("Axis label scale"),2,0)
242 axisLScale=QtGui.QDoubleSpinBox()
243 axisLScale.setValue(self.axisLabelScale)
244 axisLScale.setMinimum(1e-2)
245 axisLScale.setSingleStep(0.1)
246 self.connect(axisLScale,QtCore.SIGNAL("valueChanged(double)"),self.axisLabelScaleChanged)
247 displayLayout.addWidget(axisLScale,2,1)
248 displayLayout.addWidget(QtGui.QLabel("Axis tube scale"),3,0)
249 axisTScale=QtGui.QDoubleSpinBox()
250 axisTScale.setValue(self.axisTubeScale)
251 axisTScale.setMinimum(1e-2)
252 axisTScale.setSingleStep(0.1)
253 self.connect(axisTScale,QtCore.SIGNAL("valueChanged(double)"),self.axisTubeScaleChanged)
254 displayLayout.addWidget(axisTScale,3,1)
255
256 displayLayout.setRowStretch(4,10)
257
258 self.displayDock.setWidget(displayStuff)
259 self.addDockWidget(QtCore.Qt.LeftDockWidgetArea,self.displayDock)
260 self.displayDock.hide()
261
262 self.displaypropertiesAction=self.displayDock.toggleViewAction()
263 self.displaypropertiesAction.setShortcut("Ctrl+D")
264
265 self.displayMenu=self.menuBar().addMenu("&Display")
266 self.displayMenu.addAction(self.texteditorAction)
267 self.displayMenu.addAction(self.displaypropertiesAction)
268 self.displayMenu.addAction(self.utilityAction)
269
270 self.utilityMenu=self.menuBar().addMenu("&Utilities")
271 self.utilityMenu.addAction(self.blockMeshAction)
272 self.utilityMenu.addAction(self.checkMeshAction)
273
274 self.rereadButton=QtGui.QPushButton("Reread blockMeshDict")
275
276 try:
277 self.readFile()
278 except Exception,e:
279 warning("While reading",self.fName,"this happened:",e)
280 raise e
281
282 self.ren.ResetCamera()
283
284 self.oldBlock=-1
285 self.blockActor=None
286 self.blockTextActor=None
287 self.blockAxisActor=None
288
289 self.oldPatch=-1
290 self.patchActor=None
291 self.patchTextActor=vtk.vtkTextActor()
292 self.patchTextActor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay()
293 self.patchTextActor.GetPositionCoordinate().SetValue(0.05,0.1)
294 self.patchTextActor.GetTextProperty().SetColor(0.,0.,0.)
295 self.patchTextActor.SetInput("Patch: <none>")
296
297 label1=QtGui.QLabel("Block (-1 is none)")
298 subLayout.addWidget(label1,0,0)
299 self.scroll=QtGui.QSlider(QtCore.Qt.Horizontal)
300 self.scroll.setRange(-1,len(self.blocks)-1)
301 self.scroll.setValue(-1)
302 self.scroll.setTickPosition(QtGui.QSlider.TicksBothSides)
303 self.scroll.setTickInterval(1)
304 self.scroll.setSingleStep(1)
305 self.connect(self.scroll,QtCore.SIGNAL("valueChanged(int)"),self.colorBlock)
306 subLayout.addWidget(self.scroll,0,1)
307
308 label2=QtGui.QLabel("Patch (-1 is none)")
309 subLayout.addWidget(label2,1,0)
310 self.scroll2=QtGui.QSlider(QtCore.Qt.Horizontal)
311 self.scroll2.setRange(-1,len(self.patches.keys())-1)
312 self.scroll2.setValue(-1)
313 self.scroll2.setTickPosition(QtGui.QSlider.TicksBothSides)
314 self.scroll2.setTickInterval(1)
315 self.scroll2.setSingleStep(1)
316 self.connect(self.scroll2,QtCore.SIGNAL("valueChanged(int)"),self.colorPatch)
317 subLayout.addWidget(self.scroll2,1,1)
318
319 buttonLayout=QtGui.QHBoxLayout()
320 buttonLayout.addStretch()
321
322 subLayout.addLayout(buttonLayout,2,0,1,2)
323 buttonLayout.addWidget(self.rereadButton)
324 self.connect(self.rereadButton,QtCore.SIGNAL("clicked()"),self.reread)
325 b1=QtGui.QPushButton("Quit")
326 buttonLayout.addWidget(b1)
327 self.connect(b1,QtCore.SIGNAL("clicked()"),self.close)
328
329 self.iren = self.renWin.GetInteractor()
330 self.istyle = vtk.vtkInteractorStyleSwitch()
331
332 self.iren.SetInteractorStyle(self.istyle)
333 self.istyle.SetCurrentStyleToTrackballCamera()
334
335
336
337 self.iren.Start()
338
339 self.addProps()
340
341 self.setUnifiedTitleAndToolBarOnMac(True)
342
343 self.restoreGeometry(QtCore.QSettings().value("geometry").toByteArray())
344 self.restoreState(QtCore.QSettings().value("state").toByteArray())
345
346 self.setStatus()
347
350
353
355 if self.worker!=None:
356 self.error("There seems to be another worker")
357
358 self.setStatus("Executing "+util)
359 self.blockMeshAction.setEnabled(False)
360 self.checkMeshAction.setEnabled(False)
361
362 self.utilityOutput.clear()
363 self.utilityOutput.append("Running "+util+" on case "+self.caseDir)
364 self.utilityDock.show()
365
366 self.worker=UtilityThread(argv=[util,
367 "-case",
368 self.caseDir],
369 parent=self)
370 self.connect(self.worker,QtCore.SIGNAL("finished()"),self.executionEnded)
371 self.connect(self.worker,QtCore.SIGNAL("newLine(QString)"),self.utilityOutputAppend)
372 self.worker.start()
373
376
378 self.blockMeshAction.setEnabled(True)
379 self.checkMeshAction.setEnabled(True)
380 self.setStatus("Execution of "+self.worker.argv[0]+" finished"+self.worker.status)
381 self.worker=None
382
384 if self.isWindowModified():
385 message="blockMesh modified - "+message
386 self.statusBar().showMessage(message)
387
389 if not self.saveAction.isEnabled():
390 self.saveAction.setEnabled(True)
391 if self.rereadAction.isEnabled():
392 self.rereadAction.setEnabled(False)
393 self.rereadButton.setEnabled(False)
394
395 self.setWindowModified(True)
396 self.setStatus()
397
439
441 txt=str(self.editor.toPlainText())
442 open(self.fName,"w").write(txt)
443
444 self.reread(resetText=False)
445 self.setStatus("Saved file")
446
448 if not i in self.undefined:
449 self.undefined.append(i)
450
452 self.ren.AddViewProp(self.axes)
453 self.ren.AddActor2D(self.patchTextActor)
454 self.ren.AddActor2D(self.undefinedActor)
455
457 self.numberScale=scale
458 for tActor in self.tActors:
459 tActor.SetScale(self.numberScale*self.vRadius,self.numberScale*self.vRadius,self.numberScale*self.vRadius)
460 self.renWin.Render()
461
463 self.pointScale=scale
464 for sphere in self.spheres:
465 sphere.SetRadius(self.vRadius*self.pointScale)
466 self.renWin.Render()
467
469 self.axisLabelScale=scale
470 if self.blockTextActor:
471 for t in self.blockTextActor:
472 t.SetScale(self.axisLabelScale*self.vRadius,
473 self.axisLabelScale*self.vRadius,
474 self.axisLabelScale*self.vRadius)
475 self.renWin.Render()
476
478 self.axisTubeScale=scale
479 if self.blockAxisActor:
480 for t in self.blockAxisActor:
481 t.SetRadius(self.vRadius*self.axisTubeScale)
482 self.renWin.Render()
483
485 sphere=vtk.vtkSphereSource()
486 sphere.SetRadius(self.vRadius*factor*self.pointScale)
487 sphere.SetCenter(coord)
488 mapper=vtk.vtkPolyDataMapper()
489 mapper.SetInputConnection(sphere.GetOutputPort())
490 actor = vtk.vtkActor()
491 actor.SetMapper(mapper)
492 self.ren.AddActor(actor)
493
494 return sphere,actor
495
497 coord=self.vertices[index]
498 self.spheres[index],self.vActors[index]=self.addPoint(coord)
499 text=vtk.vtkVectorText()
500 text.SetText(str(index))
501 tMapper=vtk.vtkPolyDataMapper()
502 tMapper.SetInput(text.GetOutput())
503 tActor = vtk.vtkFollower()
504 tActor.SetMapper(tMapper)
505 tActor.SetScale(self.numberScale*self.vRadius,self.numberScale*self.vRadius,self.numberScale*self.vRadius)
506 tActor.AddPosition(coord[0]+self.vRadius,coord[1]+self.vRadius,coord[2]+self.vRadius)
507 tActor.SetCamera(self.cam)
508 tActor.GetProperty().SetColor(1.0,0.,0.)
509 self.tActors[index]=tActor
510 self.ren.AddActor(tActor)
511
513 try:
514 c1=self.vertices[index1]
515 c2=self.vertices[index2]
516 except:
517 if index1>=len(self.vertices):
518 self.addUndefined(index1)
519 if index2>=len(self.vertices):
520 self.addUndefined(index2)
521 return None
522 line=vtk.vtkLineSource()
523 line.SetPoint1(c1)
524 line.SetPoint2(c2)
525 mapper=vtk.vtkPolyDataMapper()
526 mapper.SetInputConnection(line.GetOutputPort())
527 actor = vtk.vtkActor()
528 actor.SetMapper(mapper)
529 self.ren.AddActor(actor)
530 return actor
531
533 try:
534 c1=self.vertices[index1]
535 c2=self.vertices[index2]
536 except:
537 return None,None
538 line=vtk.vtkLineSource()
539 line.SetPoint1(c1)
540 line.SetPoint2(c2)
541 tube=vtk.vtkTubeFilter()
542 tube.SetRadius(self.vRadius*self.axisTubeScale)
543 tube.SetNumberOfSides(10)
544 tube.SetInput(line.GetOutput())
545 text=vtk.vtkVectorText()
546 text.SetText(label)
547 tMapper=vtk.vtkPolyDataMapper()
548 tMapper.SetInput(text.GetOutput())
549 tActor = vtk.vtkFollower()
550 tActor.SetMapper(tMapper)
551 tActor.SetScale(self.axisLabelScale*self.vRadius,
552 self.axisLabelScale*self.vRadius,
553 self.axisLabelScale*self.vRadius)
554 tActor.AddPosition((c1[0]+c2[0])/2+self.vRadius,
555 (c1[1]+c2[1])/2+self.vRadius,
556 (c1[2]+c2[2])/2+self.vRadius)
557 tActor.SetCamera(self.cam)
558 tActor.GetProperty().SetColor(0.0,0.,0.)
559 return tube,tActor
560
562 points = vtk.vtkPoints()
563 for i in range(len(lst)):
564 v=lst[i]
565 points.InsertPoint(i,v[0],v[1],v[2])
566 spline=vtk.vtkParametricSpline()
567 spline.SetPoints(points)
568 spline.ClosedOff()
569 splineSource=vtk.vtkParametricFunctionSource()
570 splineSource.SetParametricFunction(spline)
571 mapper=vtk.vtkPolyDataMapper()
572 mapper.SetInputConnection(splineSource.GetOutputPort())
573 actor = vtk.vtkActor()
574 actor.SetMapper(mapper)
575 self.ren.AddActor(actor)
576
587
589 points = vtk.vtkPoints()
590 side = vtk.vtkCellArray()
591 side.InsertNextCell(len(lst))
592 for i in range(len(lst)):
593 try:
594 v=self.vertices[lst[i]]
595 except:
596 self.addUndefined(lst[i])
597 return None
598 points.InsertPoint(i,v[0],v[1],v[2])
599 side.InsertCellPoint(i)
600 result=vtk.vtkPolyData()
601 result.SetPoints(points)
602 result.SetPolys(side)
603
604 return result
605
607 b=self.blocks[index]
608
609 self.addLine(b[ 0],b[ 1])
610 self.addLine(b[ 3],b[ 2])
611 self.addLine(b[ 7],b[ 6])
612 self.addLine(b[ 4],b[ 5])
613 self.addLine(b[ 0],b[ 3])
614 self.addLine(b[ 1],b[ 2])
615 self.addLine(b[ 5],b[ 6])
616 self.addLine(b[ 4],b[ 7])
617 self.addLine(b[ 0],b[ 4])
618 self.addLine(b[ 1],b[ 5])
619 self.addLine(b[ 2],b[ 6])
620 self.addLine(b[ 3],b[ 7])
621
623 append=vtk.vtkAppendPolyData()
624 for a in self.vActors:
625 if a!=None:
626 append.AddInput(a.GetMapper().GetInput())
627 self.axes.SetInput(append.GetOutput())
628
629 - def reread(self,resetText=True):
630 self.ren.RemoveAllViewProps()
631 self.patchActor=None
632 self.blockActor=None
633 self.blockAxisActor=None
634 self.blockTextActor=None
635 self.addProps()
636 self.readFile(resetText=resetText)
637
638 tmpBlock=self.scroll.value()
639 if not tmpBlock<len(self.blocks):
640 tmpBlock=len(self.blocks)-1
641 self.scroll.setRange(-1,len(self.blocks)-1)
642 self.scroll.setValue(tmpBlock)
643 self.colorBlock(tmpBlock)
644
645 tmpPatch=self.scroll2.value()
646 if not tmpPatch<len(self.patches.keys()):
647 tmpPatch=len(self.patches.keys())-1
648 self.scroll2.setRange(-1,len(self.patches.keys())-1)
649 self.scroll2.setValue(tmpPatch)
650 self.colorPatch(tmpPatch)
651
652 self.renWin.Render()
653
655 newBlock=int(value)
656 if self.oldBlock>=0 and self.blockActor!=None:
657 self.ren.RemoveActor(self.blockActor)
658 for ta in self.blockTextActor:
659 self.ren.RemoveActor(ta)
660 self.blockActor=None
661 self.blockTextActor=None
662 self.blockAxisActor=None
663 if newBlock>=0:
664 append=vtk.vtkAppendPolyData()
665 append2=vtk.vtkAppendPolyData()
666 b=self.blocks[newBlock]
667 append.AddInput(self.makeFace([b[0],b[1],b[2],b[3]]))
668 append.AddInput(self.makeFace([b[4],b[5],b[6],b[7]]))
669 append.AddInput(self.makeFace([b[0],b[1],b[5],b[4]]))
670 append.AddInput(self.makeFace([b[3],b[2],b[6],b[7]]))
671 append.AddInput(self.makeFace([b[0],b[3],b[7],b[4]]))
672 append.AddInput(self.makeFace([b[1],b[2],b[6],b[5]]))
673 d1,t1=self.makeDirection(b[0],b[1],"x1")
674 append.AddInput(d1.GetOutput())
675 self.ren.AddActor(t1)
676 d2,t2=self.makeDirection(b[0],b[3],"x2")
677 append.AddInput(d2.GetOutput())
678 self.ren.AddActor(t2)
679 d3,t3=self.makeDirection(b[0],b[4],"x3")
680 append.AddInput(d3.GetOutput())
681 self.ren.AddActor(t3)
682 self.blockTextActor=(t1,t2,t3)
683 self.blockAxisActor=(d1,d2,d3)
684 mapper=vtk.vtkPolyDataMapper()
685 mapper.SetInputConnection(append.GetOutputPort())
686 self.blockActor = vtk.vtkActor()
687 self.blockActor.SetMapper(mapper)
688 self.blockActor.GetProperty().SetColor(0.,1.,0.)
689 self.blockActor.GetProperty().SetOpacity(0.3)
690 self.ren.AddActor(self.blockActor)
691
692 self.oldBlock=newBlock
693 self.renWin.Render()
694
696 newPatch=int(value)
697 if self.oldPatch>=0 and self.patchActor!=None:
698 self.ren.RemoveActor(self.patchActor)
699 self.patchActor=None
700 self.patchTextActor.SetInput("Patch: <none>")
701 if newPatch>=0:
702 name=self.patches.keys()[newPatch]
703 subs=self.patches[name]
704 append=vtk.vtkAppendPolyData()
705 for s in subs:
706 append.AddInput(self.makeFace(s))
707 mapper=vtk.vtkPolyDataMapper()
708 mapper.SetInputConnection(append.GetOutputPort())
709 self.patchActor = vtk.vtkActor()
710 self.patchActor.SetMapper(mapper)
711 self.patchActor.GetProperty().SetColor(0.,0.,1.)
712 self.patchActor.GetProperty().SetOpacity(0.3)
713 self.ren.AddActor(self.patchActor)
714 self.patchTextActor.SetInput("Patch: "+name)
715
716 self.oldPatch=newPatch
717 self.renWin.Render()
718
720 print "Closing and saving settings to",QtCore.QSettings().fileName()
721 QtCore.QSettings().setValue("geometry",QtCore.QVariant(self.saveGeometry()))
722 QtCore.QSettings().setValue("state",QtCore.QVariant(self.saveState()))
723
726 description="""
727 Reads the contents of a blockMeshDict-file and displays the
728 vertices as spheres (with numbers). The blocks are sketched by
729 lines. One block can be seceted with a slider. It will be
730 displayed as a green cube with the local directions x1,x2 and
731 x3. Also a patch that is selected by a slider will be sketched
732 by blue squares
733
734 This is a new version with a QT-GUI
735 """
736 super(DisplayBlockMesh,self).__init__(description=description,
737 usage="%prog [options] <blockMeshDict>",
738 interspersed=True,
739 nr=1)
740
742 bmFile=self.parser.getArgs()[0]
743 if not path.exists(bmFile):
744 self.error(bmFile,"not found")
745 try:
746 self.dialog=DisplayBlockMeshDialog(bmFile)
747 except IOError:
748 self.error("Problem with blockMesh file",bmFile)
749 self.dialog.show()
750