目的
实现后处理结果云图的平面剖切视图。
方法
通过使用vtkPlaneWidget
控件交互,得到剖切平面,通过vtkClipDataSet
完成对vtkUnstructuredGrid
有限元结果数据的剖切操作。渲染管线如下图所示$^{[1]}$。
代码实现
首先,我们先写一个创建vtkPlaneWidget控件的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| def clipFEModel_planeWidget(self, ugrid): self.planeWidget = vtk.vtkPlaneWidget() self.planeWidget.SetInteractor(self.interactor) self.planeWidget.SetInputData(ugrid) self.planeWidget.SetResolution(1) self.planeWidget.GetPlaneProperty().SetColor(.2, .8, 0.1) self.planeWidget.GetPlaneProperty().SetOpacity(1) self.planeWidget.GetPlaneProperty().SetLineWidth(4) self.planeWidget.GetHandleProperty().SetColor(0, .4, .7) self.planeWidget.GetHandleProperty().SetPointSize(1) self.planeWidget.GetHandleProperty().SetLineWidth(1) self.planeWidget.NormalToZAxisOn() self.planeWidget.SetRepresentationToWireframe() self.planeWidget.SetCenter(ugrid.GetCenter()) self.planeWidget.SetPlaceFactor(1.0) self.planeWidget.PlaceWidget() self.planeWidget.On()
self.planeWidget.AddObserver(vtk.vtkCommand.InteractionEvent, vtkPlaneCall(self, ugrid))
|
上面代码中,通过self.planeWidget.AddObserver(vtk.vtkCommand.InteractionEvent, vtkPlaneCall(self, ugrid))
,设置了平面控件的回调函数,传入ugrid参数,即我们的vtkUnstructuredGrid
有限元剖切对象。回调类vtkPlaneCall
定义如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| class vtkPlaneCall: def __init__(self, sceneManager, ugrid): self.sceneManager = sceneManager self.ugrid = ugrid self.clippingPlane = vtk.vtkPlane()
def __call__(self, caller, ev): caller.GetPlane(self.clippingPlane)
clipper = vtk.vtkClipDataSet() clipper.SetClipFunction(self.clippingPlane) clipper.SetInputData(self.ugrid) clipper.GenerateClippedOutputOn() clipper.Update()
insideMapper = vtk.vtkDataSetMapper() insideMapper.SetInputData(clipper.GetOutput()) insideMapper.ScalarVisibilityOn()
self.sceneManager.drawOutline(self.ugrid)
scalarRange = clipper.GetOutput().GetPointData().GetScalars().GetRange() title = clipper.GetOutput().GetPointData().GetScalars().GetName() self.sceneManager.drawScalarField(insideMapper, scalarRange, title) self.sceneManager.display()
|
这里的sceneManager
参数为显示管理类,主要用于可视化渲染。drawScalarField
函数为云图绘制函数,具体实现细节参加:【VTK+有限元后处理】可视化结果云图。
结果
![GIF 2022-11-19 16-18-47](D:\OneDrive\桌面\GIF 2022-11-19 16-18-47.gif)
参考
[1] 陈航. 基于Qt和VTK的铸造有限元后处理可视化系统研发[D]. 湖北:华中科技大学,2018. DOI:10.7666/d.D01542051.