多边形创建
传统VTK 文件包含五个部分:
文件版本和标识符。这一部分包含# vtk DataFileVersion x.x
,除了版本号x.x
之外,该行必须与显示的完全相同。
标题。标题由以行尾字符\n
终止的字符组成。最大为256个字符,可用于描述数据并包括任何其它相关信息。
文件格式。文件格式描述文件的类型,可以是ASCII 或者二进制。在此行上,必须出现单个单词ASCII
或者BINARY
数据集结构。几何部分描述了数据集的几何和拓扑。这部分以包含关键字DATASET
的行开头,后跟描述数据集类型的关键字。然后根据数据集的类型,其他关键字/数据组合将定义实际数据。
数据集属性。以关键字POINT_DATA
或CELL_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): renderer = vtk.vtkRenderer() renderWindow = vtk.vtkRenderWindow() renderWindow.AddRenderer(renderer) renderWindowInteractor = vtk.vtkRenderWindowInteractor() renderWindowInteractor.SetRenderWindow(renderWindow)
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() iren = renderWindow.GetInteractor() style = vtk.vtkInteractorStyleTrackballCamera() style.SetDefaultRenderer(renderer) iren.SetInteractorStyle(style) axesActor = vtk.vtkAxesActor() axes_widget = vtk.vtkOrientationMarkerWidget() axes_widget.SetOrientationMarker(axesActor) axes_widget.SetInteractor(iren) axes_widget.EnabledOn() axes_widget.InteractiveOff() 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) renderer.AddActor(actor)
renderer.ResetCamera() renderWindowInteractor.Start()
if __name__ == '__main__': main(path='vtk_text.vtk')
|