构建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)

结果展示

【VTK+有限元后处理】可视化结果云图相关推荐

  1. 【VTK+有限元后处理】实时剖切视图

    目的 实现后处理结果云图的平面剖切视图. 方法 通过使用vtkPlaneWidget控件交互,得到剖切平面,通过vtkClipDataSet完成对vtkUnstructuredGrid有限元结果数据的 ...

  2. 【VTK+有限元后处理】符号化矢量场绘制

    目的 符号化有限元模型的节点矢量属性(应力等),将其可视化显示. 代码 构建drawVectorField函数,用于矢量场的符号化显示.代码如下: def drawVectorField(self, ...

  3. CAx软件开发技术专题:后处理可视化常用算法

    后处理可视化是CAx软件的重要组成模块.开源代码VTK以其跨平台.丰富的数据结构与算法.可扩展性.易用性等特点而逐渐成为了CAx软件后处理首选的技术方案. 虽然VTK提供了相对完备的后处理功能,但要用 ...

  4. R语言ggplot2可视化:通过水平半小提琴图(Horizontal Half Violin Plots)和抖动数据点( jittered data)可视化雨云图(Rain Cloud plots)

    R语言ggplot2可视化:通过水平半小提琴图(Horizontal Half Violin Plots)和抖动数据点( jittered data)可视化雨云图(Rain Cloud plots) ...

  5. R语言ggplot2可视化:通过水平半小提琴图和抖动数据点可视化雨云图(Rain Cloud plots)、自定义雨云图中数据点的颜色(数据点的颜色和半小提琴图一致)

    R语言ggplot2可视化:通过水平半小提琴图和抖动数据点可视化雨云图(Rain Cloud plots).自定义雨云图中数据点的颜色(数据点的颜色和半小提琴图一致) 目录

  6. VTK:八叉树可视化用法实战

    VTK:八叉树可视化用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkCallbackCommand ...

  7. 使用Python获取春节档电影影评,制作可视化词云图

    Python获取春节档电影影评,制作可视化词云图 前言 准备工作 采集数据部分 基本思路流程 代码实战 可视化词云图 代码展示 效果展示 前言 春节电影听巳月说都还可以,我不信,我觉得还是要看看看过的 ...

  8. 文本数据“关键词渲染”的高频词可视化——词云图。

    目录 前言: 官方示例: 实践示例: 背景说明:基于电影用户评论的数据,通过其中关键词出现的频率做出词云图,从而让阅览者一目了然的看出该电影的正反面评价,甚至电影的分类标签. 数据预处理 1.首先将我 ...

  9. 数据可视化——词云图

    本文目的:将爬取的评论数据进行分词,然后使用词云图进行可视化操作. 使用到的工具:结巴中文分词.Wordcloud库 首先介绍一下两个工具,其中结巴中文分词是一个专门将中文句子进行分词的第三方库,当然 ...

最新文章

  1. 我的世界源代码python_用Python写的游戏《我的世界》 还原初代世界
  2. dom contains 包含关系
  3. java8 stream index_Java8的stream用法整理
  4. 抢那么多封面,有那么多钱发红包吗?
  5. python二维列表转字典_在Python中字符串、列表、元组、字典之间的相互转换
  6. LINUX下载编译libfaac
  7. 阿里马涛:重新定义云时代的开源操作系统
  8. oracle数据库使用odbc导出到access失败
  9. 并发相关随笔(持续更新)
  10. 计算机的管理员关机命令,电脑定时自动关机命令怎么使用?
  11. 【文章整理】一文看懂Cola架构和DDD
  12. 免费在线云服务CAD编辑软件AutoCAD易
  13. d作者d语言中组件式编程
  14. ESP32学习笔记(1)——搭建环境、编译烧写(Windows+VS Code)
  15. Rstudio(4.0.5 )安装Rtool40
  16. PS怎么修改数字如 2011变为2013
  17. 《王道》数据结构之绪论(一)
  18. DCG【Dual Conversion Gain】是什么?
  19. 75道程序员面试逻辑智力测试题内附详细答案
  20. eclipse和idea导出jar包

热门文章

  1. 六、MySQL数据库面试题(2021最新版)20210907
  2. VSCode vue : 无法加载文件 C:\Users\XXX\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本
  3. Docker学习教程(非常详细)
  4. 51单片机实现智能报警器
  5. matlab nsct工具箱,非下采样Contourlet变换工具包 nsct_toolbox (from matlab central)
  6. 实现 Lip-sync
  7. 连接远程数据库失败Access denied for user ‘root‘@‘xxx.xxx.xx.xxx‘
  8. BCB 给图片的16进制中叠加字符,图片字符叠加器,图片字符叠加软件
  9. PHP网络设计建站工作室程序源码
  10. java给图片加水印_java如何给图片加水印