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 vtkPolyData
byłoby to również rozwiązanie.
Odpowiedzi:
1 dla odpowiedzi № 1Zupeł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.