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 self.alwaysSave=False
190 except AttributeError:
191 warning("Old PyQT4-version. Editing might not work as expected")
192 self.editor=QtGui.QTextEdit()
193 self.alwaysSave=True
194 self.saveAction.setEnabled(True)
195
196 self.editor.setFont(QtGui.QFont("Courier"))
197
198 self.editorDock.setWidget(self.editor)
199 self.addDockWidget(QtCore.Qt.RightDockWidgetArea,self.editorDock)
200 self.editorDock.hide()
201
202 self.utilityDock=QtGui.QDockWidget("Utility output",
203 self)
204 self.utilityOutput=QtGui.QTextEdit()
205 self.utilityOutput.setFont(QtGui.QFont("Courier"))
206 self.utilityOutput.setLineWrapMode(QtGui.QTextEdit.NoWrap)
207 self.utilityOutput.setReadOnly(True)
208 self.utilityDock.setWidget(self.utilityOutput)
209 self.utilityDock.setObjectName("UtilityDock")
210 self.utilityDock.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea)
211 self.addDockWidget(QtCore.Qt.RightDockWidgetArea,self.utilityDock)
212 self.utilityDock.hide()
213
214 self.worker=None
215
216 self.texteditorAction=self.editorDock.toggleViewAction()
217 self.texteditorAction.setShortcut("Ctrl+E")
218
219 self.utilityAction=self.utilityDock.toggleViewAction()
220 self.utilityAction.setShortcut("Ctrl+U")
221
222 self.displayDock=QtGui.QDockWidget("Display Properties",
223 self)
224 self.displayDock.setObjectName("DisplayPropertiesDock")
225 self.displayDock.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea | QtCore.Qt.RightDockWidgetArea)
226
227 displayStuff=QtGui.QWidget()
228 displayLayout=QtGui.QGridLayout()
229 displayStuff.setLayout(displayLayout)
230 displayLayout.addWidget(QtGui.QLabel("Number scale"),0,0)
231 nrScale=QtGui.QDoubleSpinBox()
232 nrScale.setValue(self.numberScale)
233 nrScale.setMinimum(1e-2)
234 nrScale.setSingleStep(0.1)
235 self.connect(nrScale,QtCore.SIGNAL("valueChanged(double)"),self.numberScaleChanged)
236 displayLayout.addWidget(nrScale,0,1)
237 displayLayout.addWidget(QtGui.QLabel("Point scale"),1,0)
238 ptScale=QtGui.QDoubleSpinBox()
239 ptScale.setValue(self.pointScale)
240 ptScale.setMinimum(1e-2)
241 ptScale.setSingleStep(0.1)
242 self.connect(ptScale,QtCore.SIGNAL("valueChanged(double)"),self.pointScaleChanged)
243 displayLayout.addWidget(ptScale,1,1)
244 displayLayout.addWidget(QtGui.QLabel("Axis label scale"),2,0)
245 axisLScale=QtGui.QDoubleSpinBox()
246 axisLScale.setValue(self.axisLabelScale)
247 axisLScale.setMinimum(1e-2)
248 axisLScale.setSingleStep(0.1)
249 self.connect(axisLScale,QtCore.SIGNAL("valueChanged(double)"),self.axisLabelScaleChanged)
250 displayLayout.addWidget(axisLScale,2,1)
251 displayLayout.addWidget(QtGui.QLabel("Axis tube scale"),3,0)
252 axisTScale=QtGui.QDoubleSpinBox()
253 axisTScale.setValue(self.axisTubeScale)
254 axisTScale.setMinimum(1e-2)
255 axisTScale.setSingleStep(0.1)
256 self.connect(axisTScale,QtCore.SIGNAL("valueChanged(double)"),self.axisTubeScaleChanged)
257 displayLayout.addWidget(axisTScale,3,1)
258
259 displayLayout.setRowStretch(4,10)
260
261 self.displayDock.setWidget(displayStuff)
262 self.addDockWidget(QtCore.Qt.LeftDockWidgetArea,self.displayDock)
263 self.displayDock.hide()
264
265 self.displaypropertiesAction=self.displayDock.toggleViewAction()
266 self.displaypropertiesAction.setShortcut("Ctrl+D")
267
268 self.displayMenu=self.menuBar().addMenu("&Display")
269 self.displayMenu.addAction(self.texteditorAction)
270 self.displayMenu.addAction(self.displaypropertiesAction)
271 self.displayMenu.addAction(self.utilityAction)
272
273 self.utilityMenu=self.menuBar().addMenu("&Utilities")
274 self.utilityMenu.addAction(self.blockMeshAction)
275 self.utilityMenu.addAction(self.checkMeshAction)
276
277 self.rereadButton=QtGui.QPushButton("Reread blockMeshDict")
278
279 try:
280 self.readFile()
281 except Exception,e:
282 warning("While reading",self.fName,"this happened:",e)
283 raise e
284
285 self.ren.ResetCamera()
286
287 self.oldBlock=-1
288 self.blockActor=None
289 self.blockTextActor=None
290 self.blockAxisActor=None
291
292 self.oldPatch=-1
293 self.patchActor=None
294 self.patchTextActor=vtk.vtkTextActor()
295 self.patchTextActor.GetPositionCoordinate().SetCoordinateSystemToNormalizedDisplay()
296 self.patchTextActor.GetPositionCoordinate().SetValue(0.05,0.1)
297 self.patchTextActor.GetTextProperty().SetColor(0.,0.,0.)
298 self.patchTextActor.SetInput("Patch: <none>")
299
300 label1=QtGui.QLabel("Block (-1 is none)")
301 subLayout.addWidget(label1,0,0)
302 self.scroll=QtGui.QSlider(QtCore.Qt.Horizontal)
303 self.scroll.setRange(-1,len(self.blocks)-1)
304 self.scroll.setValue(-1)
305 self.scroll.setTickPosition(QtGui.QSlider.TicksBothSides)
306 self.scroll.setTickInterval(1)
307 self.scroll.setSingleStep(1)
308 self.connect(self.scroll,QtCore.SIGNAL("valueChanged(int)"),self.colorBlock)
309 subLayout.addWidget(self.scroll,0,1)
310
311 label2=QtGui.QLabel("Patch (-1 is none)")
312 subLayout.addWidget(label2,1,0)
313 self.scroll2=QtGui.QSlider(QtCore.Qt.Horizontal)
314 self.scroll2.setRange(-1,len(self.patches.keys())-1)
315 self.scroll2.setValue(-1)
316 self.scroll2.setTickPosition(QtGui.QSlider.TicksBothSides)
317 self.scroll2.setTickInterval(1)
318 self.scroll2.setSingleStep(1)
319 self.connect(self.scroll2,QtCore.SIGNAL("valueChanged(int)"),self.colorPatch)
320 subLayout.addWidget(self.scroll2,1,1)
321
322 buttonLayout=QtGui.QHBoxLayout()
323 buttonLayout.addStretch()
324
325 subLayout.addLayout(buttonLayout,2,0,1,2)
326 buttonLayout.addWidget(self.rereadButton)
327 self.connect(self.rereadButton,QtCore.SIGNAL("clicked()"),self.reread)
328 b1=QtGui.QPushButton("Quit")
329 buttonLayout.addWidget(b1)
330 self.connect(b1,QtCore.SIGNAL("clicked()"),self.close)
331
332 self.iren = self.renWin.GetInteractor()
333 self.istyle = vtk.vtkInteractorStyleSwitch()
334
335 self.iren.SetInteractorStyle(self.istyle)
336 self.istyle.SetCurrentStyleToTrackballCamera()
337
338
339
340 self.iren.Start()
341
342 self.addProps()
343
344 self.setUnifiedTitleAndToolBarOnMac(True)
345
346 self.restoreGeometry(QtCore.QSettings().value("geometry").toByteArray())
347 self.restoreState(QtCore.QSettings().value("state").toByteArray())
348
349 self.setStatus()
350
353
356
358 if self.worker!=None:
359 self.error("There seems to be another worker")
360
361 self.setStatus("Executing "+util)
362 self.blockMeshAction.setEnabled(False)
363 self.checkMeshAction.setEnabled(False)
364
365 self.utilityOutput.clear()
366 self.utilityOutput.append("Running "+util+" on case "+self.caseDir)
367 self.utilityDock.show()
368
369 self.worker=UtilityThread(argv=[util,
370 "-case",
371 self.caseDir],
372 parent=self)
373 self.connect(self.worker,QtCore.SIGNAL("finished()"),self.executionEnded)
374 self.connect(self.worker,QtCore.SIGNAL("newLine(QString)"),self.utilityOutputAppend)
375 self.worker.start()
376
379
381 self.blockMeshAction.setEnabled(True)
382 self.checkMeshAction.setEnabled(True)
383 self.setStatus("Execution of "+self.worker.argv[0]+" finished"+self.worker.status)
384 self.worker=None
385
387 if self.isWindowModified():
388 message="blockMesh modified - "+message
389 self.statusBar().showMessage(message)
390
392 if not self.saveAction.isEnabled():
393 self.saveAction.setEnabled(True)
394 if self.rereadAction.isEnabled():
395 self.rereadAction.setEnabled(False)
396 self.rereadButton.setEnabled(False)
397
398 self.setWindowModified(True)
399 self.setStatus()
400
444
446 txt=str(self.editor.toPlainText())
447 open(self.fName,"w").write(txt)
448
449 self.reread(resetText=False)
450 self.setStatus("Saved file")
451
453 if not i in self.undefined:
454 self.undefined.append(i)
455
457 self.ren.AddViewProp(self.axes)
458 self.ren.AddActor2D(self.patchTextActor)
459 self.ren.AddActor2D(self.undefinedActor)
460
462 self.numberScale=scale
463 for tActor in self.tActors:
464 tActor.SetScale(self.numberScale*self.vRadius,self.numberScale*self.vRadius,self.numberScale*self.vRadius)
465 self.renWin.Render()
466
468 self.pointScale=scale
469 for sphere in self.spheres:
470 sphere.SetRadius(self.vRadius*self.pointScale)
471 self.renWin.Render()
472
474 self.axisLabelScale=scale
475 if self.blockTextActor:
476 for t in self.blockTextActor:
477 t.SetScale(self.axisLabelScale*self.vRadius,
478 self.axisLabelScale*self.vRadius,
479 self.axisLabelScale*self.vRadius)
480 self.renWin.Render()
481
483 self.axisTubeScale=scale
484 if self.blockAxisActor:
485 for t in self.blockAxisActor:
486 t.SetRadius(self.vRadius*self.axisTubeScale)
487 self.renWin.Render()
488
490 sphere=vtk.vtkSphereSource()
491 sphere.SetRadius(self.vRadius*factor*self.pointScale)
492 sphere.SetCenter(coord)
493 mapper=vtk.vtkPolyDataMapper()
494 mapper.SetInputConnection(sphere.GetOutputPort())
495 actor = vtk.vtkActor()
496 actor.SetMapper(mapper)
497 self.ren.AddActor(actor)
498
499 return sphere,actor
500
502 coord=self.vertices[index]
503 self.spheres[index],self.vActors[index]=self.addPoint(coord)
504 text=vtk.vtkVectorText()
505 text.SetText(str(index))
506 tMapper=vtk.vtkPolyDataMapper()
507 tMapper.SetInput(text.GetOutput())
508 tActor = vtk.vtkFollower()
509 tActor.SetMapper(tMapper)
510 tActor.SetScale(self.numberScale*self.vRadius,self.numberScale*self.vRadius,self.numberScale*self.vRadius)
511 tActor.AddPosition(coord[0]+self.vRadius,coord[1]+self.vRadius,coord[2]+self.vRadius)
512 tActor.SetCamera(self.cam)
513 tActor.GetProperty().SetColor(1.0,0.,0.)
514 self.tActors[index]=tActor
515 self.ren.AddActor(tActor)
516
518 try:
519 c1=self.vertices[index1]
520 c2=self.vertices[index2]
521 except:
522 if index1>=len(self.vertices):
523 self.addUndefined(index1)
524 if index2>=len(self.vertices):
525 self.addUndefined(index2)
526 return None
527 line=vtk.vtkLineSource()
528 line.SetPoint1(c1)
529 line.SetPoint2(c2)
530 mapper=vtk.vtkPolyDataMapper()
531 mapper.SetInputConnection(line.GetOutputPort())
532 actor = vtk.vtkActor()
533 actor.SetMapper(mapper)
534 self.ren.AddActor(actor)
535 return actor
536
538 try:
539 c1=self.vertices[index1]
540 c2=self.vertices[index2]
541 except:
542 return None,None
543 line=vtk.vtkLineSource()
544 line.SetPoint1(c1)
545 line.SetPoint2(c2)
546 tube=vtk.vtkTubeFilter()
547 tube.SetRadius(self.vRadius*self.axisTubeScale)
548 tube.SetNumberOfSides(10)
549 tube.SetInput(line.GetOutput())
550 text=vtk.vtkVectorText()
551 text.SetText(label)
552 tMapper=vtk.vtkPolyDataMapper()
553 tMapper.SetInput(text.GetOutput())
554 tActor = vtk.vtkFollower()
555 tActor.SetMapper(tMapper)
556 tActor.SetScale(self.axisLabelScale*self.vRadius,
557 self.axisLabelScale*self.vRadius,
558 self.axisLabelScale*self.vRadius)
559 tActor.AddPosition((c1[0]+c2[0])/2+self.vRadius,
560 (c1[1]+c2[1])/2+self.vRadius,
561 (c1[2]+c2[2])/2+self.vRadius)
562 tActor.SetCamera(self.cam)
563 tActor.GetProperty().SetColor(0.0,0.,0.)
564 return tube,tActor
565
567 points = vtk.vtkPoints()
568 for i in range(len(lst)):
569 v=lst[i]
570 points.InsertPoint(i,v[0],v[1],v[2])
571 spline=vtk.vtkParametricSpline()
572 spline.SetPoints(points)
573 spline.ClosedOff()
574 splineSource=vtk.vtkParametricFunctionSource()
575 splineSource.SetParametricFunction(spline)
576 mapper=vtk.vtkPolyDataMapper()
577 mapper.SetInputConnection(splineSource.GetOutputPort())
578 actor = vtk.vtkActor()
579 actor.SetMapper(mapper)
580 self.ren.AddActor(actor)
581
592
594 points = vtk.vtkPoints()
595 side = vtk.vtkCellArray()
596 side.InsertNextCell(len(lst))
597 for i in range(len(lst)):
598 try:
599 v=self.vertices[lst[i]]
600 except:
601 self.addUndefined(lst[i])
602 return None
603 points.InsertPoint(i,v[0],v[1],v[2])
604 side.InsertCellPoint(i)
605 result=vtk.vtkPolyData()
606 result.SetPoints(points)
607 result.SetPolys(side)
608
609 return result
610
612 b=self.blocks[index]
613
614 self.addLine(b[ 0],b[ 1])
615 self.addLine(b[ 3],b[ 2])
616 self.addLine(b[ 7],b[ 6])
617 self.addLine(b[ 4],b[ 5])
618 self.addLine(b[ 0],b[ 3])
619 self.addLine(b[ 1],b[ 2])
620 self.addLine(b[ 5],b[ 6])
621 self.addLine(b[ 4],b[ 7])
622 self.addLine(b[ 0],b[ 4])
623 self.addLine(b[ 1],b[ 5])
624 self.addLine(b[ 2],b[ 6])
625 self.addLine(b[ 3],b[ 7])
626
628 append=vtk.vtkAppendPolyData()
629 for a in self.vActors:
630 if a!=None:
631 append.AddInput(a.GetMapper().GetInput())
632 self.axes.SetInput(append.GetOutput())
633
634 - def reread(self,resetText=True):
658
660 newBlock=int(value)
661 if self.oldBlock>=0 and self.blockActor!=None:
662 self.ren.RemoveActor(self.blockActor)
663 for ta in self.blockTextActor:
664 self.ren.RemoveActor(ta)
665 self.blockActor=None
666 self.blockTextActor=None
667 self.blockAxisActor=None
668 if newBlock>=0:
669 append=vtk.vtkAppendPolyData()
670 append2=vtk.vtkAppendPolyData()
671 b=self.blocks[newBlock]
672 append.AddInput(self.makeFace([b[0],b[1],b[2],b[3]]))
673 append.AddInput(self.makeFace([b[4],b[5],b[6],b[7]]))
674 append.AddInput(self.makeFace([b[0],b[1],b[5],b[4]]))
675 append.AddInput(self.makeFace([b[3],b[2],b[6],b[7]]))
676 append.AddInput(self.makeFace([b[0],b[3],b[7],b[4]]))
677 append.AddInput(self.makeFace([b[1],b[2],b[6],b[5]]))
678 d1,t1=self.makeDirection(b[0],b[1],"x1")
679 append.AddInput(d1.GetOutput())
680 self.ren.AddActor(t1)
681 d2,t2=self.makeDirection(b[0],b[3],"x2")
682 append.AddInput(d2.GetOutput())
683 self.ren.AddActor(t2)
684 d3,t3=self.makeDirection(b[0],b[4],"x3")
685 append.AddInput(d3.GetOutput())
686 self.ren.AddActor(t3)
687 self.blockTextActor=(t1,t2,t3)
688 self.blockAxisActor=(d1,d2,d3)
689 mapper=vtk.vtkPolyDataMapper()
690 mapper.SetInputConnection(append.GetOutputPort())
691 self.blockActor = vtk.vtkActor()
692 self.blockActor.SetMapper(mapper)
693 self.blockActor.GetProperty().SetColor(0.,1.,0.)
694 self.blockActor.GetProperty().SetOpacity(0.3)
695 self.ren.AddActor(self.blockActor)
696
697 self.oldBlock=newBlock
698 self.renWin.Render()
699
701 newPatch=int(value)
702 if self.oldPatch>=0 and self.patchActor!=None:
703 self.ren.RemoveActor(self.patchActor)
704 self.patchActor=None
705 self.patchTextActor.SetInput("Patch: <none>")
706 if newPatch>=0:
707 name=self.patches.keys()[newPatch]
708 subs=self.patches[name]
709 append=vtk.vtkAppendPolyData()
710 for s in subs:
711 append.AddInput(self.makeFace(s))
712 mapper=vtk.vtkPolyDataMapper()
713 mapper.SetInputConnection(append.GetOutputPort())
714 self.patchActor = vtk.vtkActor()
715 self.patchActor.SetMapper(mapper)
716 self.patchActor.GetProperty().SetColor(0.,0.,1.)
717 self.patchActor.GetProperty().SetOpacity(0.3)
718 self.ren.AddActor(self.patchActor)
719 self.patchTextActor.SetInput("Patch: "+name)
720
721 self.oldPatch=newPatch
722 self.renWin.Render()
723
725 print "Closing and saving settings to",QtCore.QSettings().fileName()
726 QtCore.QSettings().setValue("geometry",QtCore.QVariant(self.saveGeometry()))
727 QtCore.QSettings().setValue("state",QtCore.QVariant(self.saveState()))
728
731 description="""
732 Reads the contents of a blockMeshDict-file and displays the
733 vertices as spheres (with numbers). The blocks are sketched by
734 lines. One block can be seceted with a slider. It will be
735 displayed as a green cube with the local directions x1,x2 and
736 x3. Also a patch that is selected by a slider will be sketched
737 by blue squares
738
739 This is a new version with a QT-GUI
740 """
741 super(DisplayBlockMesh,self).__init__(description=description,
742 usage="%prog [options] <blockMeshDict>",
743 interspersed=True,
744 nr=1)
745
747 bmFile=self.parser.getArgs()[0]
748 if not path.exists(bmFile):
749 self.error(bmFile,"not found")
750 try:
751 self.dialog=DisplayBlockMeshDialog(bmFile)
752 except IOError:
753 self.error("Problem with blockMesh file",bmFile)
754 self.dialog.show()
755