【VTK+有限元后处理】可视化结果云图
创始人
2024-02-01 04:09:59

构建vtkUnstructuredGrid对象

为了读取不同格式的有限元计算结果文件,我们先写一个FEDataModel类来管理有限元的几何拓扑和属性信息。

class FEDataModel:"""有限元数据模型类"""def __init__(self):self.nodes = []  # 节点几何坐标self.elements = []  # 单元拓扑信息self.scalars = {}  # 节点标量属性self.vectors = {}  # 节点向量属性self.ugrid = vtk.vtkUnstructuredGrid()  # 用于VTK可视化的数据模型self.ugrid.Allocate(100)def read_inp(self, filename):with open(filename) as f:node_flag, element_flag = False, Falsefor line in f.readlines():line = line.replace('\n', '').replace(' ', '')if '*ELEMENT' in line:node_flag, element_flag = False, Truecontinueelif '*NODE' in line:node_flag, element_flag = True, Falsecontinueelif '*' in line:node_flag, element_flag = False, Falsecontinueif node_flag:self.nodes.append(list(map(lambda x: float(x), line.split(',')))[1:])elif element_flag:self.elements.append(list(map(lambda x: int(x) - 1, line.split(',')))[1:])# print(len(self.nodes), len(self.elements))nodes = vtk.vtkPoints()for i in range(0, len(self.nodes)):nodes.InsertPoint(i, self.nodes[i])for i in range(0, len(self.elements)):if len(self.elements[i]) == 4:  # 四面体单元self.ugrid.InsertNextCell(vtk.VTK_TETRA, 4, self.elements[i])elif len(self.elements[i]) == 6:  # 六面体单元self.ugrid.InsertNextCell(vtk.VTK_POLYGON, 6, self.elements[i])elif len(self.elements[i]) == 3:  # 三角面片单元self.ugrid.InsertNextCell(vtk.VTK_TRIANGLE, 3, self.elements[i])else:print("FEDataModel构建中遇到错误单元类型!")self.ugrid.SetPoints(nodes)def read_ntl(self, filename):with open(filename) as f:lines = f.readlines()attribute_name = ''.join(lines[0].split(' ')[1:-1])scalar = []for line in lines[4:]:line = line.replace('\n', '').split(' ')scalar.append(float(line[-1]))self.scalars[attribute_name] = scalar# print(attribute_name + ' scalar number: ' + str(len(scalar)))# 存储标量值scalars = vtk.vtkFloatArray()scalars.SetName(attribute_name)for i in range(0, len(scalar)):scalars.InsertTuple1(i, scalar[i])# 设定每个节点的标量值self.ugrid.GetPointData().SetScalars(scalars)def display(self):renderer = vtk.vtkRenderer()renWin = vtk.vtkRenderWindow()renWin.AddRenderer(renderer)iren = vtk.vtkRenderWindowInteractor()iren.SetRenderWindow(renWin)colors = vtk.vtkNamedColors()ugridMapper = vtk.vtkDataSetMapper()ugridMapper.SetInputData(self.ugrid)ugridActor = vtk.vtkActor()ugridActor.SetMapper(ugridMapper)ugridActor.GetProperty().SetColor(colors.GetColor3d("Peacock"))ugridActor.GetProperty().EdgeVisibilityOn()renderer.AddActor(ugridActor)renderer.SetBackground(colors.GetColor3d("Beige"))renderer.ResetCamera()renderer.GetActiveCamera().Elevation(60.0)renderer.GetActiveCamera().Azimuth(30.0)renderer.GetActiveCamera().Dolly(1.2)renWin.SetSize(640, 480)# Interact with the data.renWin.Render()iren.Start()

这个类的作用是,方便我们读取并构建用于在VTK中显示的vtkUnstructuredGrid类对象。vtkUnstructuredGrid类是VTK中的非结构化网格类,可用于有限元分析、计算几何和几何建模这类领域。

vtkUnstructuredGrid类详情参见:VTK笔记-使用vtkUnstructuredGrid类构建非结构化数据。

其中read_inp成员函数和read_ntl成员函数分别用于读取从ProCAST软件中导出的inp文件(存储有限元的几何拓扑数据)和ntl文件(存储有限元的节点属性数据,如温度、应力等)。

存储vtkUnstructuredGrid对象

为了能一次性读取有限元模型整体数据,我们可以将其保存为vtk格式的文件。

writer = vtk.vtkUnstructuredGridWriter()
writer.SetFileName(save_fn)
writer.SetInputData(self.FEModel.ugrid)
writer.Write()
writer.Update()

下一次只需读取对应的vtk文件即可。

reader = vtk.vtkUnstructuredGridReader()
reader.SetFileName(read_fn)
reader.Update()
self.FEModel.ugrid = reader.GetOutput()

云图可视化

可视化节点属性数据(标量场),关键代码如下:

def drawScalarField(self, scalar_mapper, scalarRange, title):# 定义颜色映射表lut = vtk.vtkLookupTable()lut.SetHueRange(0.67, 0.0)  # 色调范围从红色到蓝色# lut.SetAlphaRange(1.0, 1.0) # 透明度范围# lut.SetValueRange(1.0, 1.0)# lut.SetSaturationRange(1.0, 1.0) # 颜色饱和度# lut.SetNumberOfTableValues(256)lut.SetNumberOfColors(256)  # 颜色个数# lut.SetRange(scalarRange)lut.Build()scalar_mapper.SetScalarRange(scalarRange)scalar_mapper.SetLookupTable(lut)scalar_actor = vtk.vtkActor()scalar_actor.SetMapper(scalar_mapper)self.renderer.AddActor(scalar_actor)# 色标带scalarBar = vtk.vtkScalarBarActor()scalarBar.SetLookupTable(scalar_mapper.GetLookupTable())  # 将颜色查找表传入窗口中的色标带scalarBar.SetTitle(title)scalarBar.SetNumberOfLabels(5)self.renderer.AddActor2D(scalarBar)

结果展示

在这里插入图片描述

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...