/ / Konwertuj działkę mayavi mlab.contour3d na vtkPolyData - python, vtk, mayavi

Konwertuj mayavi mlab.contour3d działka na vtkPolyData - python, vtk, mayavi

Próbuję uzyskać triangulację vtkPolyData od mlab.contour3d wątek. ja używam mayavi ponieważ wydaje się, że jest to najszybszy sposób na zdobycie minimalne powierzchnie poprawnie triangulowany. Potrzebuję tego jako vtkPolyData ponieważ chcę zapisać go jako plik .stl.

Oto MWE mojego kodu:

import numpy as np
from mayavi import mlab

def fun(x, y, z):
return np.cos(x) + np.cos(y) + np.cos(z)

x, y, z = np.mgrid[-1:1:100j, -1:1:100j, -1:1:100j]
contour = mlab.contour3d(x, y, z, fun)
mlab.show()

Z czego to czerpię mayavi to powierzchnia, która jest już triangulowana i wyświetlana za pomocą VTK (lub tvtk), więc powinno być możliwe uzyskanie vtkPolyData stamtąd. Ale jedynym sposobem, jaki do tej pory znalazłem, jest użycie mlab.savefig(test.obj) aby wyeksportować plik .obj (co jest złe, ponieważ zapisywanie pliku za każdym razem wymaga czasu mayavi Interfejs użytkownika zostanie otwarty) i ponownie zaimportuj ten plik za pomocą vtkOBJReader, co daje mi vtkPolyData Chcę.

Czy ktoś zna prostszy sposób na zrobienie tego?

edycja: Aby jeszcze bardziej wyjaśnić mój problem: mogę uzyskać dostęp do danych z wizualizacji, np. z mayavi.tools.pipeline.get_vtk_src(), ale ma postać vtkImageData. Jeśli ktoś zna sposób na konwersję tego vtkPolyDatabyłoby to również rozwiązanie.

Odpowiedzi:

1 dla odpowiedzi № 1

Zupełnie przypadkiem znalazłem rozwiązanie.

import numpy as np
from mayavi import mlab

def fun(x, y, z):
return np.cos(x) + np.cos(y) + np.cos(z)

x, y, z = np.mgrid[-1:1:100j, -1:1:100j, -1:1:100j]
contour = mlab.contour3d(x, y, z, fun)
actor = contour.actor.actors[0]
polydata = tvtk.to_vtk(actor.mapper.input)  # solution
mlab.show()

Wydaje się, że sztuczka polega na uzyskaniu dostępu do programu mapującego z potoku, którym jest PolyDataMapper. Potem po prostu używam tvtk.to_vtk() funkcja, dzięki czemu mogę kontynuować vtk który wolę ponad tvtk, przynajmniej na razie.