2013-04-01 19 views
6

Đối với những người muốn xuất một mảng có khối lượng 3D đơn giản (cùng với trục) sang tệp .vtk (hoặc .vtr) để xử lý hậu và hiển thị trong Paraview hoặc Mayavi có một mô-đun nhỏ gọi là PyEVTK thực hiện chính xác điều đó. Mô-đun này hỗ trợ dữ liệu có cấu trúc và không có cấu trúc, vv .. Thật không may, mặc dù mã hoạt động tốt trong các hệ thống dựa trên Unix nhưng tôi không thể làm cho nó hoạt động (bị treo) trên bất kỳ cài đặt cửa sổ nào. Ive đã liên hệ với nhà phát triển nhưng đề xuất của anh ấy không hoạt độngXuất một tập tin 3D thành một tệp VTK để xem trong Paraview/Mayavi

Vì vậy, câu hỏi của tôi là: Làm cách nào để sử dụng chức năng from vtk.util import numpy_support để xuất mảng 3D (chức năng không hỗ trợ mảng 3D) vào tệp .vtk? Có một cách đơn giản để làm điều đó mà không cần tạo vtkDatasets vv vv?

Cảm ơn rất nhiều!

+0

Mayavi có thể hiển thị mảng numpy 3d và xuất nó sang một vài định dạng 3D. Tôi không chắc chắn những gì bạn sau khi – theta

+0

Paraview không làm việc với mảng numpy và đặc biệt là nếu bạn muốn ném một mảng 3D rectilinear với trục của nó ở đó. Dữ liệu như vậy cần phải được chuyển đổi sang một định dạng như .vtr đầu tiên. Chuyển đổi này là những gì Im sau. Bất kỳ ý tưởng? Bạn cũng có ý nghĩa gì về Mayavi hỗ trợ mảng có nhiều mảng? Ý tưởng là tạo một tệp từ một mảng được tạo ra bên ngoài Mayavi và nhập nó vào phần mềm như một tệp – somada141

+0

ParaView làm việc với numpy (đọc hướng dẫn về "Bộ lọc lập trình Python") và Mayavi có thể đọc các mảng rất nhiều, và xuất nó sang các định dạng 3D khác nhau (được BTW hỗ trợ bởi ParaView) – theta

Trả lời

6

Đó là mãi mãi và tôi đã hoàn toàn quên hỏi câu hỏi này nhưng tôi đã kết thúc tìm ra nó. Tôi đã viết một bài về nó trong blog của tôi (PyScience) cung cấp một hướng dẫn về cách chuyển đổi giữa NumPy và VTK. Đừng hãy xem nếu quan tâm:

pyscience.wordpress.com/2014/09/06/numpy-to-vtk-converting-your-numpy-arrays-to-vtk-arrays-and-files/

+0

Tôi muốn nói với bạn về cái này @ somada141, tôi đang cố gắng này ngay bây giờ trong python 3.5 và sáng tìm lỗi - bạn vẫn đang làm việc với các phương pháp này? – kevinkayaks

+0

@kevinkayaks cuối cùng tôi đã kiểm tra hỗ trợ Python 3 cho nhiều thư viện đó là một chút tồi tệ nhưng cảm thấy tự do để tiếp cận. Vì SO hỗ trợ không, hãy gửi thư cho tôi theo số tại Gmail nếu bạn cần trợ giúp. – somada141

2

Đây không phải là câu trả lời trực tiếp cho câu hỏi của bạn, nhưng nếu bạn có tvtk (nếu bạn có mayavi, bạn nên có nó), bạn có thể sử dụng nó để ghi dữ liệu của bạn sang định dạng vtk. (Xem: http://code.enthought.com/projects/files/ETS3_API/enthought.tvtk.misc.html)

Nó không sử dụng PyEVTK và nó hỗ trợ một loạt các nguồn dữ liệu (nhiều hơn là cấu trúc và không có cấu trúc lưới), vì vậy nó có thể sẽ hoạt động ở những nơi khác.

Như một ví dụ nhanh (giao diện mlab Mayavi có thể làm điều này nhiều ít tiết, đặc biệt là nếu bạn đã sử dụng nó.):

import numpy as np 
from enthought.tvtk.api import tvtk, write_data 

data = np.random.random((10,10,10)) 

grid = tvtk.ImageData(spacing=(10, 5, -10), origin=(100, 350, 200), 
         dimensions=data.shape) 
grid.point_data.scalars = np.ravel(order='F') 
grid.point_data.scalars.name = 'Test Data' 

# Writes legacy ".vtk" format if filename ends with "vtk", otherwise 
# this will write data using the newer xml-based format. 
write_data(grid, 'test.vtk') 

Và một phần của tập tin đầu ra:

# vtk DataFile Version 3.0 
vtk output 
ASCII 
DATASET STRUCTURED_POINTS 
DIMENSIONS 10 10 10 
SPACING 10 5 -10 
ORIGIN 100 350 200 
POINT_DATA 1000 
SCALARS Test%20Data double 
LOOKUP_TABLE default 
0.598189 0.228948 0.346975 0.948916 0.0109774 0.30281 0.643976 0.17398 0.374673 
0.295613 0.664072 0.307974 0.802966 0.836823 0.827732 0.895217 0.104437 0.292796 
0.604939 0.96141 0.0837524 0.498616 0.608173 0.446545 0.364019 0.222914 0.514992 
... 
... 
+0

Cảm ơn rất nhiều về phản ứng Joe! Điều đó dường như đang làm những gì tôi muốn nhiều hơn hoặc ít hơn.Tôi chỉ cần sử dụng một định dạng cho lưới không đồng nhất nhưng Im chắc chắn tôi sẽ kéo cái đó ra :) – somada141

0

TVTK của Mayavi có một cách xinh đẹp của tập tin văn bản VTK. Dưới đây là một ví dụ thử nghiệm tôi đã viết cho bản thân mình sau tài liệu @Joe và tvtk. Lợi thế nó có hơn evtk, là sự hỗ trợ cho cả ascii và html.Hope nó sẽ giúp người khác.

from tvtk.api import tvtk, write_data 
import numpy as np 

#data = np.random.random((3, 3, 3)) 
# 
#i = tvtk.ImageData(spacing=(1, 1, 1), origin=(0, 0, 0)) 
#i.point_data.scalars = data.ravel() 
#i.point_data.scalars.name = 'scalars' 
#i.dimensions = data.shape 
# 
#w = tvtk.XMLImageDataWriter(input=i, file_name='spoints3d.vti') 
#w.write() 

points = np.array([[0,0,0], [1,0,0], [1,1,0], [0,1,0]], 'f') 
(n1, n2) = points.shape 
poly_edge = np.array([[0,1,2,3]]) 

print n1, n2 
## Scalar Data 
#temperature = np.array([10., 20., 30., 40.]) 
#pressure = np.random.rand(n1) 
# 
## Vector Data 
#velocity = np.random.rand(n1,n2) 
#force  = np.random.rand(n1,n2) 
# 
##Tensor Data with 
comp = 5 
stress = np.random.rand(n1,comp) 
# 
#print stress.shape 
## The TVTK dataset. 
mesh = tvtk.PolyData(points=points, polys=poly_edge) 
# 
## Data 0 # scalar data 
#mesh.point_data.scalars = temperature 
#mesh.point_data.scalars.name = 'Temperature' 
# 
## Data 1 # additional scalar data 
#mesh.point_data.add_array(pressure) 
#mesh.point_data.get_array(1).name = 'Pressure' 
#mesh.update() 
# 
## Data 2 # Vector data 
#mesh.point_data.vectors = velocity 
#mesh.point_data.vectors.name = 'Velocity' 
#mesh.update() 
# 
## Data 3 additional vector data 
#mesh.point_data.add_array(force) 
#mesh.point_data.get_array(3).name = 'Force' 
#mesh.update() 

mesh.point_data.tensors = stress 
mesh.point_data.tensors.name = 'Stress' 

# Data 4 additional tensor Data 
#mesh.point_data.add_array(stress) 
#mesh.point_data.get_array(4).name = 'Stress' 
#mesh.update() 

write_data(mesh, 'polydata.vtk') 

# XML format 
# Method 1 
#write_data(mesh, 'polydata') 

# Method 2 
#w = tvtk.XMLPolyDataWriter(input=mesh, file_name='polydata.vtk') 
#w.write() 
1

Tôi biết có hơi muộn và tôi thích hướng dẫn của bạn @ somada141. Điều này cũng có tác dụng.

def numpy2VTK(img, spacing=[1.0, 1.0, 1.0]): 
# evolved from code from Stou S., 
# on http://www.siafoo.net/snippet/314 
# This function, as the name suggests, converts numpy array to VTK 
importer = vtk.vtkImageImport() 

img_data = img.astype('uint8') 
img_string = img_data.tostring() # type short 
dim = img.shape 

importer.CopyImportVoidPointer(img_string, len(img_string)) 
importer.SetDataScalarType(VTK_UNSIGNED_CHAR) 
importer.SetNumberOfScalarComponents(1) 

extent = importer.GetDataExtent() 
importer.SetDataExtent(extent[0], extent[0] + dim[2] - 1, 
         extent[2], extent[2] + dim[1] - 1, 
         extent[4], extent[4] + dim[0] - 1) 
importer.SetWholeExtent(extent[0], extent[0] + dim[2] - 1, 
         extent[2], extent[2] + dim[1] - 1, 
         extent[4], extent[4] + dim[0] - 1) 

importer.SetDataSpacing(spacing[0], spacing[1], spacing[2]) 
importer.SetDataOrigin(0, 0, 0) 


return importer 

Hy vọng điều đó sẽ hữu ích!

+0

hey cổ vũ Rick! Tôi đã không nhìn thấy cách tiếp cận này trước đây. Bạn đang sử dụng phiên bản VTK nào cho điều này? – somada141

+0

hey @ somada141 Tôi hiện đang sử dụng VTK 7. Mặc dù Sidh của nó;) –

Các vấn đề liên quan