python vtk 3 Drawデータをstlとして読み込む

2670 ワード

1、vtkをインストールする.
2、三次元rawを読み取り、stlとして表示、保存する.
import vtk

# Read 3D RAW image
reader=vtk.vtkImageReader()
# reader.SetDataScalarType(vtk.VTK_UNSIGNED_SHORT)  # unsigned int16
reader.SetDataScalarType(vtk.VTK_UNSIGNED_CHAR)  # unsigned int8
reader.SetFileName('test.raw')
reader.SetNumberOfScalarComponents(1)
reader.SetFileDimensionality(3)
reader.SetDataByteOrderToLittleEndian()
reader.SetDataExtent(0,487,0,487,0,331)  #  image size 488*488*332
reader.SetDataSpacing(0.25, 0.25, 0.25)  # Volume Pixel
reader.Update()

# Visualization
contour=vtk.vtkMarchingCubes()  # vtk.vtkContourFilter()
contour.SetInputConnection(reader.GetOutputPort())
contour.ComputeNormalsOn()
contour.SetValue(0,1)

mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(contour.GetOutputPort())
mapper.ScalarVisibilityOff()

actor = vtk.vtkActor()
actor.SetMapper(mapper)

renderer=vtk.vtkRenderer()
renderer.SetBackground([0.5, 0.5, 0.5])
renderer.AddActor(actor)

window = vtk.vtkRenderWindow()
window.SetSize(640, 640)
window.AddRenderer(renderer)

# Create interactor, add window & add observers
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(window)

# Start renderer & interactor
window.Render()
interactor.Initialize()
interactor.Start()

# Write in STL
triangle = vtk.vtkTriangleFilter()
triangle.SetInputConnection(contour.GetOutputPort())
triangle.PassVertsOff()
triangle.PassLinesOff()

decimation=vtk.vtkQuadricDecimation()
decimation.SetInputConnection(triangle.GetOutputPort())

clean=vtk.vtkCleanPolyData()
clean.SetInputConnection(triangle.GetOutputPort())

triangle2 = vtk.vtkTriangleFilter()
triangle2.SetInputConnection(clean.GetOutputPort())
triangle2.PassVertsOff()
triangle2.PassLinesOff()

stlWriter = vtk.vtkSTLWriter()
stlWriter.SetInputConnection(triangle2.GetOutputPort())
stlWriter.SetFileName("Test.stl")
stlWriter.Write()

3、生成したstlデータを表示する.
## Read and show STL
# Read and display for verification
reader = vtk.vtkSTLReader()
reader.SetFileName("Test.stl")
 
mapper = vtk.vtkPolyDataMapper()
if vtk.VTK_MAJOR_VERSION <= 5:
    mapper.SetInput(reader.GetOutput())
else:
    mapper.SetInputConnection(reader.GetOutputPort())
 
actor = vtk.vtkActor()
actor.SetMapper(mapper)
 
# Create a rendering window and renderer
ren = vtk.vtkRenderer()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(ren)
 
# Create a renderwindowinteractor
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
 
# Assign actor to the renderer
ren.AddActor(actor)
 
# Enable user interface interactor
iren.Initialize()
renWin.Render()
iren.Start()