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