python vtk 3 Drawデータをstlとして読み込む
2670 ワード
1、vtkをインストールする.
2、三次元rawを読み取り、stlとして表示、保存する.
3、生成したstlデータを表示する.
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()