2014-02-01 4 views
6

У меня есть набор данных, хранящихся в VTK-файле, который представляет собой разрез домена со скалярными точечными данными в массиве. Я пытаюсь создать контурный график упомянутого скаляра, чтобы он выглядел так же, как приложенная фотография с использованием ParaView. Я лучше придерживаюсь библиотек vtk, чем использовать что-то еще, например Matplotlib, так как я думаю, что они вообще улучшают визуализацию. Preview of what I want to achieve.Контурный график из данных в файле vtk с использованием Python

Я просмотрел несколько примеров в режиме онлайн, но ни один из них не работает для меня (никаких ошибок не возникает, все, что у меня получается, - это пустой рендер только с фоном), все, что я смог сделать, это поверхностный график данных (например: here).

Вот текущая версия кода у меня есть (очень похожий на тот, который успешно производит поверхностный участок):

# import data 
reader = vtk.vtkDataSetReader() 
reader.SetFileName('inputDataFiles/k_zCut.vtk') 
reader.ReadAllVectorsOn() 
reader.ReadAllScalarsOn() 
reader.Update() 

# access data 
data = reader.GetOutput() 
d = data.GetPointData() 
array=d.GetArray('k') 

# create the filter 
contours = vtk.vtkContourFilter() 
contours.SetInput(reader.GetOutput()) 
contours.GenerateValues(5,1.,5.) 

# create the mapper 
mapper = vtk.vtkPolyDataMapper() 
mapper.SetInput(contours.GetOutput()) 
mapper.ScalarVisibilityOff() 
mapper.SetScalarRange(1., 5.) 

# create the actor 
actor = vtk.vtkActor() 
actor.SetMapper(mapper) 

# create a rendering window and renderer 
ren = vtk.vtkRenderer() 
ren.SetBackground(0.329412, 0.34902, 0.427451) #Paraview blue 

# Assign actor to the renderer 
ren.AddActor(actor) 

renWin = vtk.vtkRenderWindow() 
renWin.AddRenderer(ren) 
renWin.SetSize(750, 750) 

# create a renderwindowinteractor 
iren = vtk.vtkRenderWindowInteractor() 
iren.SetRenderWindow(renWin) 

# render 
renWin.Render() 

# screenshot 
w2if = vtk.vtkWindowToImageFilter() 
w2if.SetInput(renWin) 
w2if.Update() 
w2if.SetMagnification(5.) 

writer = vtk.vtkPNGWriter() 
writer.SetFileName("screenshot.png") 
writer.SetInput(w2if.GetOutput()) 
writer.Write() 

# Enable user interface interactor 
iren.Initialize() 
iren.Start() 

Ниже вы можете увидеть сокращенную часть моего входного файла. Любая помощь будет высоко ценится.

# vtk DataFile Version 2.0 
sampleSurface 
ASCII 
DATASET POLYDATA 
POINTS 34813 float 
0 0 0 
0 -0.000191589 0 
0.000264399 0.000157061 0 
0 0.000313389 0 
0.000264347 -0.000191923 0 
0 -0.000383178 0 
-0.000395709 0 0 
-0.000395709 0.000156695 0 
3.60174e-05 0.000486922 0 
0.000528387 0 0 

POLYGONS 69284 277136 
3 4105 4371 3861 
3 4102 3861 4371 
3 4656 4371 4373 
3 4105 4373 4371 
3 3624 3861 3390 
3 3621 3390 3861 
3 4105 3863 3861 
3 3624 3861 3863 
3 3188 3390 2990 
3 3187 2990 3390 
3 3624 3390 3391 
3 3188 3391 3390 

POINT_DATA 34813 
FIELD attributes 1 
k 1 34813 float 
0.849464 0.391519 1.52947 1.05206 0.391519 0.253736 1.39481 1.39481 0.636517 1.21019 
0.640193 0.114295 1.12557 0.644143 0.629569 0.114295 0.485032 0.477396 1.39961 0.0860201 
1.66665 1.24058 1.45939 0.483719 1.01318 0.163198 0.317574 0.792821 0.317125 0.658835 

ответ

5

Если вы хотите использовать более «вещий» интерфейс для ВТК, consider using mayavi/tvtk/mlab. (В любом случае, VTK - отличный выбор для этого!)

tvtk - это немного более пифоническое, низкоуровневое связывание с python для VTK с несколькими действительно хорошими функциями (например, прозрачное использование массивов numpy).

Mayavi и mlab предоставляют более высокоуровневый интерфейс для VTK.

Фрагмент файла данных, который вы показали недействительна, как есть, но если мы будем использовать схожий:

# vtk DataFile Version 2.0 
Simple VTK file example 
ASCII 

DATASET POLYDATA 
POINTS 9 float 
3.0 0.0 0.0 
1.0 1.0 0.0 
0.0 3.0 0.0 
3.0 0.0 1.0 
1.0 1.0 1.0 
0.0 3.0 1.0 
3.0 2.0 2.0 
2.0 2.0 2.0 
2.0 3.0 2.0 

TRIANGLE_STRIPS 2 14 
6 0 3 1 4 2 5 
6 3 6 4 7 5 8 

POINT_DATA 9 
SCALARS nodal float 
LOOKUP_TABLE default 
0.0 0.1 0.0 0.3 0.6 0.3 0.8 1.0 0.8 

Rendering контуры на поверхности может быть столь же просто, как:

from mayavi import mlab 

source = mlab.pipeline.open('test.vtk') 
lines = mlab.pipeline.contour_surface(source) 

mlab.show() 

enter image description here

Или мы можем получить немного фантазер:

from mayavi import mlab 

# Make a figure with a black background 
fig = mlab.figure(bgcolor=(0,0,0)) 
# Also see methods like: fig.scene.z_plus_view(), etc 
fig.scene.camera.azimuth(215) 

source = mlab.pipeline.open('test.vtk') 
# Show the surface, colored by the scalars 
surf = mlab.pipeline.surface(source) 
# Draw contours of the scalars on the surface 
lines = mlab.pipeline.contour_surface(source) 

mlab.show() 

enter image description here

+0

Hi! Большое спасибо за ответ. Похоже, что майави гораздо проще использовать, я посмотрю на него. Я боюсь, что у меня нет большого контроля над входным файлом, он приходит как есть. Не могли бы вы объяснить, как он «недействителен»? – Artur

+0

@Artur - Я думаю, это просто потому, что вы усекали части файла, чтобы показывать в своем вопросе, не изменяя количество в каждом заголовке раздела. Исходный файл, вероятно, отлично. (Например, 'POINTS 34813 float' должен быть' POINTS 10 float', поскольку перечислены только 10 пунктов.) Также часть POLYGONS представляет собой список указателей в точках, поэтому все указанные номера недействительны, поскольку они 're больше 10. Опять же, исходный файл, вероятно, прекрасно, просто то, что вы дали в качестве примера в своем вопросе, недействительно точно так же, как и оно. –

+0

Привет! Вы правы, я просто вырезал кусочки из него, чтобы сделать его компактным, на самом деле это слишком долго, чтобы его можно было опубликовать. Я намеренно оставил фактическое количество очков и полисов, поскольку я думал, что это может иметь значение. – Artur

Смежные вопросы