使用VTK Python API,将多个标量添加到非结构化网格单元

时间:2015-06-02 13:04:51

标签: python c++ vtk

这个Python脚本:

import numpy as np
import vtk
from vtk.util.numpy_support import numpy_to_vtk

# Open a file, and create an unstructured grid.
filename = 'example.vtk'
writer = vtk.vtkUnstructuredGridWriter()
writer.SetFileName(filename)
grid = vtk.vtkUnstructuredGrid()

# Create 3 points
A,B,C = (0,0,0), (0,1,0), (1,0,0)
points = np.array( (A,B,C) )
vtk_points = vtk.vtkPoints()
vtk_points.SetData( numpy_to_vtk(points) )
grid.SetPoints(vtk_points)

# Cells: just 1 triangle
ntriangles = 1
npoints_per_triangle = 3
cells = np.array( [npoints_per_triangle, 0, 1, 2] )
vtk_cells = vtk.vtkCellArray()
id_array = vtk.vtkIdTypeArray()
id_array.SetVoidArray(cells, len(cells), 1)
vtk_cells.SetCells(ntriangles, id_array)

# Cell types: just 1 triangle.
cell_types = np.array( [vtk.VTK_TRIANGLE] , 'B')
vtk_cell_types = numpy_to_vtk(cell_types)

# Cell locations: the triangle is in `cells` at index 0.
cell_locations = np.array( [0,])
vtk_cell_locations = numpy_to_vtk(cell_locations, deep=1,
                                   array_type=vtk.VTK_ID_TYPE)

# Cells: add to grid
grid.SetCells(vtk_cell_types, vtk_cell_locations, vtk_cells)
data = grid.GetCellData()

# Add scalar data to the triangle
data.SetActiveScalars('foo')
foo = np.array( [11.,] )
vtk_foo = numpy_to_vtk(foo)
vtk_foo.SetName("foo")
data.SetScalars(vtk_foo)

# Add other scalar data to the triangle
data.SetActiveScalars('bar')
bar = np.array( [12.,] )
vtk_bar = numpy_to_vtk(bar)
vtk_bar.SetName("bar")
data.SetScalars(vtk_bar)

# Write to file.
writer.SetInput(grid)
writer.Write()

print open(filename).read()

制作文件:

# vtk DataFile Version 3.0
vtk output
ASCII
DATASET UNSTRUCTURED_GRID
POINTS 3 long
0 0 0 0 1 0 1 0 0 

CELLS 1 4
3 0 1 2 

CELL_TYPES 1
5

CELL_DATA 1
SCALARS bar double
LOOKUP_TABLE default
12 
FIELD FieldData 1
foo 1 1 double
11 

但我希望CELL_DATA部分为:

CELL_DATA 1
SCALARS foo double
LOOKUP_TABLE default
11 
SCALARS bar double
LOOKUP_TABLE default
12 

修改

查看源代码(WriteCellDataWriteScalarData及更深层次),似乎不可能。

2 个答案:

答案 0 :(得分:2)

根据我的阅读,vtk无法写出多个SCALARS,但可以阅读。 (真是个好API!)。

我会继续使用好的pyvtk(也可以使用adavange):

import pyvtk

filename = 'example.vtk'
title = 'Unstructured Grid Example'

points = [[0,0,0],[0,1,0],[0,0,1]]
triangles = [[0,1,2]]
grid = pyvtk.UnstructuredGrid(points, triangle=triangles)

celldata = pyvtk.CellData( pyvtk.Scalars([11.,], name="foo"),
                           pyvtk.Scalars([12.,], name="bar")) 

vtk = pyvtk.VtkData(grid, celldata, title)
vtk.tofile(filename)

print open(filename).read()

哪种产品:

# vtk DataFile Version 2.0
Unstructured Grid Example
ASCII
DATASET UNSTRUCTURED_GRID
POINTS 3 int
0 0 0
0 1 0
0 0 1
CELLS 1 4
3 0 1 2
CELL_TYPES 1
5
CELL_DATA 1
SCALARS foo float 1
LOOKUP_TABLE default
11.0
SCALARS bar float 1
LOOKUP_TABLE default
12.0

答案 1 :(得分:0)