多边形创建

传统VTK 文件包含五个部分:

  • 文件版本和标识符。这一部分包含# vtk DataFileVersion x.x,除了版本号x.x之外,该行必须与显示的完全相同。

  • 标题。标题由以行尾字符\n终止的字符组成。最大为256个字符,可用于描述数据并包括任何其它相关信息。

  • 文件格式。文件格式描述文件的类型,可以是ASCII 或者二进制。在此行上,必须出现单个单词ASCII或者BINARY

  • 数据集结构。几何部分描述了数据集的几何和拓扑。这部分以包含关键字DATASET 的行开头,后跟描述数据集类型的关键字。然后根据数据集的类型,其他关键字/数据组合将定义实际数据。

  • 数据集属性。以关键字POINT_DATACELL_DATA开头,后跟一个整数,分别指定点或单元的数量。(先出现POINT_DATA还是CELL_DATA都没关系)。然后,其他关键字/数据组合定义实际的数据集属性值(即标量,向量,张量,法线,纹理坐标或字段数据)。

1
2
3
4
5
6
7
8
9
10
11
12
13
# vtk DataFile Version 1.0
Vibrational modes of plate
ASCII

DATASET POLYDATA
POINTS 8 float
0.0 0.0 0.0
1.0 0.0 0.0
1.0 1.0 0.0
0.0 1.0 0.0

POLYGONS 1 5
4 0 1 2 3

其中Polygons中的数据是需要保持逆时针或者顺时针的顺序(注意:虽然顺时针和逆时针都可以成功建立一个面,但是为了避免在复杂模型上的混淆,还是按照官网推荐的节点顺序(可看番外篇(一))建立比较好)。如上图所示,第一个坐标点是原点,第二个坐标点是在 x 方向上位置为 1.0 的点,第三个点的坐标是(1.0, 1.0, 0),第四个坐标点是在 y 方向上位置为 1.0 的点。则它们的顺序可以是:0123,0321。其展示的图形是一个正方形:

但是如果我们将其顺序变成 0213 (图中1324)排列:

可以发现,它的图形并不是一个正方形了。

随后我们再增加一面,作为底面,只需要在POINTS 8 float里面加入两个坐标点(0.0, 0.0, 1.0)(1.0, 0.0, 1.0),然后在POLYGONS 2 10中加入新的面,如:0154。我们就可以得到底面了:

按照此规则我们可以得到一个完整的正方体:


那么我们可以试图把ABAQUS中生成的.inp文件,根据ABAQUS中mesh的网格序号规则,转为.vtk文件。但是这里是使用了Ploygonal data, 实际上我们还可以选择Structured Points, Structured Grid, Rectilinear Grid, Unstructured Grid, Field。对于有限元的学习和使用,我们选择Unstructured Grid是最方便的,因为它的兼容性更高一些。

我们还需要验证几个功能,包括网格边线的显示,CELL的颜色赋予等等。在之后的使用中,我们就使用Unstructured Grid格式的数据集来学习。

下面是完整代码,通过python显示.vtk文件。其中,我们读取的数据集是由Poligonal data格式组成的,所以就使用了vtkPolyDataReader来读取数据集。通过actor.VisibilityOff()可以隐藏模型。

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import vtk

def main(path):
# 1.创建RenderWindow窗口
renderer = vtk.vtkRenderer()
renderWindow = vtk.vtkRenderWindow()
renderWindow.AddRenderer(renderer)
renderWindowInteractor = vtk.vtkRenderWindowInteractor()
renderWindowInteractor.SetRenderWindow(renderWindow)

# 2.创建render
renderer = vtk.vtkRenderer()
renderer.SetBackground(1.0, 1.0, 1.0) # 设置页面底部颜色值
renderer.SetBackground2(0.1, 0.2, 0.4) # 设置页面顶部颜色值
renderer.SetGradientBackground(1) # 开启渐变色背景设置
renderWindow.AddRenderer(renderer)
renderWindow.Render()
# 3.设置交互方式
iren = renderWindow.GetInteractor()
style = vtk.vtkInteractorStyleTrackballCamera()
style.SetDefaultRenderer(renderer)
iren.SetInteractorStyle(style)
# 4.添加世界坐标系
axesActor = vtk.vtkAxesActor()
axes_widget = vtk.vtkOrientationMarkerWidget()
axes_widget.SetOrientationMarker(axesActor)
axes_widget.SetInteractor(iren)
axes_widget.EnabledOn()
axes_widget.InteractiveOff() # 坐标系是否可移动
# 5.读取VTK文件
vtkReader = vtk.vtkPolyDataReader()
vtkReader.SetFileName(path)
vtkReader.ReadAllVectorsOn()
vtkReader.ReadAllScalarsOn()
vtkReader.Update()

vtkMapper = vtk.vtkPolyDataMapper()
vtkMapper.SetInputConnection(vtkReader.GetOutputPort())
actor = vtk.vtkActor()
actor.SetMapper(vtkMapper)
# actor.VisibilityOff()
renderer.AddActor(actor)

renderer.ResetCamera()
renderWindowInteractor.Start()


if __name__ == '__main__':
main(path='vtk_text.vtk')