gpt4 book ai didi

python - 使用 python-vtk 将多个遗留 ASCII .vtk 文件组合成一个文件

转载 作者:太空宇宙 更新时间:2023-11-04 01:37:22 25 4
gpt4 key购买 nike

在我的计算过程中,我保存了一堆与单个时间步长相关的 .vtk 文件。每个文件都使用 POLYDATA ASCII 文件格式描述一个多面体(我定义的一个 C++ 类)。多面体由多面体类的一个简单成员函数编写。

为了避免为我需要可视化的多面体集合定义一个全新的类并弄乱我的 C++ 代码,我想将多个 .vtk 文件合并到一个 .vtk 文件中。

使用 python-vtk 给我带来了一些问题:

from vtk import * 

reader = vtkPolyDataReader()
reader.SetFileName("file1.vtk")

reader.Update()
polyData1 = reader.GetOutput()

reader.SetFileName('file2.vtk')

reader.Update()
polyData2 = reader.GetOutput()


# Expand the output points

points1 = polyData1.GetPoints()

points2 = polyData2.GetPoints()

insertPosition = points1.GetNumberOfPoints()

for i in xrange(points2.GetNumberOfPoints()):
insertPoint = points2.GetPoint(i)
points1.InsertPoint(insertPosition,
insertPoint[0], insertPoint[1], insertPoint[2])
insertPosition += 1

print points1.GetNumberOfPoints()

# Change the cell ids of every cell in the polydata2 to correspond with
# the new points (appended point array)

increment = points1.GetNumberOfPoints();

for i in xrange(polyData2.GetNumberOfCells()):
cell = polyData2.GetCell(i)
cellIds = cell.GetPointIds()
for j in xrange(cellIds.GetNumberOfIds()):
oldId = cellIds.GetId(j)
cellIds.SetId(j, oldId + increment)


polyData1.Allocate(polyData1.GetNumberOfCells(), 1)

for i in xrange(polyData2.GetNumberOfCells()):
cell = polyData2.GetCell(i)
polyData1.InsertNextCell(cell.GetCellType(), cell.GetPointIds())


writer = vtkPolyDataWriter()
writer.SetFileName("output.vtk")
writer.SetInput(polyData1)
writer.Write()

通过这样做,我将得到重复的点,没关系。问题在于此脚本在以下 .vtk 文件上执行:

文件1:

# vtk DataFile Version 2.0
surface written 2011-12-19T15:30:18
ASCII

DATASET POLYDATA
POINTS 8 float
0.48999999999999999112 0.4000000000000000222 0.5999999999999999778
0.48999999999999999112 0.5 0.5999999999999999778
0.48999999999999999112 0.5 0.69999999999999995559
0.48999999999999999112 0.4000000000000000222 0.69999999999999995559
0.5 0.5 0.5999999999999999778
0.5 0.5 0.69999999999999995559
0.5 0.4000000000000000222 0.69999999999999995559
0.5 0.4000000000000000222 0.5999999999999999778

POLYGONS 6 30
4 0 1 2 3
4 4 5 6 7
4 4 1 2 5
4 6 5 2 3
4 7 0 1 4
4 0 7 6 3

CELL_DATA 6
FIELD attributes 1
zone 1 6 float
1 1 1 1 1 1

文件2:

# vtk DataFile Version 2.0
surface written 2011-12-19T15:30:18
ASCII

DATASET POLYDATA
POINTS 8 float
0.58999999999999996891 0.5999999999999999778 0.5
0.58999999999999996891 0.69999999999999995559 0.5
0.58999999999999996891 0.69999999999999995559 0.5999999999999999778
0.58999999999999996891 0.5999999999999999778 0.5999999999999999778
0.5999999999999999778 0.69999999999999995559 0.5
0.5999999999999999778 0.69999999999999995559 0.5999999999999999778
0.5999999999999999778 0.5999999999999999778 0.5999999999999999778
0.5999999999999999778 0.5999999999999999778 0.5

POLYGONS 6 30
4 0 1 2 3
4 4 5 6 7
4 4 1 2 5
4 6 5 2 3
4 7 0 1 4
4 0 7 6 3

CELL_DATA 6
FIELD attributes 1
zone 1 6 float
1 1 1 1 1 1

导致点具有大约 8 个坐标和根本不添加的单元格(面)。

是我的问题还是 vtkArray 的 python 包装器和类似的 vtkObjects 没有被迭代的选项?

最佳答案

您应该考虑使用 vtkAppendPolyData合并文件。

from vtk import * 

reader = vtkPolyDataReader()
append = vtkAppendPolyData()

filenames = ['file1.vtk', 'file2.vtk']
for file in filenames:
reader.SetFileName(file)
reader.Update()
polydata = vtkPolyData()
polydata.ShallowCopy(reader.GetOutput())
append.AddInputData(polydata)

append.Update()

writer = vtkPolyDataWriter()
writer.SetFileName('output.vtk')
writer.SetInput(append.GetOutput())
writer.Write()

另请注意,第二次调用读取器将使用第二个输入文件覆盖第一个输入文件的输出数据集。如果你想使用同一个阅读器,你必须做一个 ShallowCopy(如上面的脚本)。

关于python - 使用 python-vtk 将多个遗留 ASCII .vtk 文件组合成一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8573113/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com