import os import vtk from pycaster import pycaster import vtk from IPython.display import Image def vtk_show(renderer, width=400, height=300): """ Takes vtkRenderer instance and returns an IPython Image with the rendering. """ renderWindow = vtk.vtkRenderWindow() renderWindow.SetOffScreenRendering(1) renderWindow.AddRenderer(renderer) renderWindow.SetSize(width, height) renderWindow.Render() windowToImageFilter = vtk.vtkWindowToImageFilter() windowToImageFilter.SetInput(renderWindow) windowToImageFilter.Update() writer = vtk.vtkPNGWriter() writer.SetWriteToMemory(1) writer.SetInputConnection(windowToImageFilter.GetOutputPort()) writer.Write() data = str(buffer(writer.GetResult())) return Image(data) def addLine(renderer, p1, p2, color=[0.0, 0.0, 1.0]): line = vtk.vtkLineSource() line.SetPoint1(p1) line.SetPoint2(p2) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(line.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetColor(color) renderer.AddActor(actor) def addPoint(renderer, p, radius=1.0, color=[0.0, 0.0, 0.0]): point = vtk.vtkSphereSource() point.SetCenter(p) point.SetRadius(radius) point.SetPhiResolution(100) point.SetThetaResolution(100) mapper = vtk.vtkPolyDataMapper() mapper.SetInputConnection(point.GetOutputPort()) actor = vtk.vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetColor(color) renderer.AddActor(actor) caster = pycaster.rayCaster.fromSTL("bones.stl", scale=1) mapper = vtk.vtkPolyDataMapper() mapper.SetInput(caster.mesh) actor = vtk.vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetOpacity(0.15) renderer = vtk.vtkRenderer() renderer.AddActor(actor) renderer.SetBackground(1.0, 1.0, 1.0) vtk_show(renderer, 600, 600) pSource = [100.0, 100.0, 0.0] pTarget = [0.0, 0.0, 0.0] addPoint(renderer, pSource, radius=2.0, color=[1.0, 0.0, 0.0]) addPoint(renderer, pTarget, radius=2.0, color=[0.0, 1.0, 0.0]) addLine(renderer, pSource, pTarget) vtk_show(renderer, 600, 600) pointsIntersection = caster.castRay(pSource, pTarget) pointsIntersection caster.calcDistanceInSolid(pSource, pTarget) for p in pointsIntersection: addPoint(renderer, p, radius = 2.0, color=[0.0, 0.0, 1.0]) vtk_show(renderer, 600, 600)