import os import vtk def loadSTL(filenameSTL): readerSTL = vtk.vtkSTLReader() readerSTL.SetFileName(filenameSTL) # 'update' the reader i.e. read the .stl file readerSTL.Update() polydata = readerSTL.GetOutput() # If there are no points in 'vtkPolyData' something went wrong if polydata.GetNumberOfPoints() == 0: raise ValueError( "No point data could be loaded from '" + filenameSTL) return None return polydata 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) mesh = loadSTL("sphereHollow.stl") mapper = vtk.vtkPolyDataMapper() mapper.SetInput(mesh) actor = vtk.vtkActor() actor.SetMapper(mapper) actor.GetProperty().SetOpacity(0.25) renderer = vtk.vtkRenderer() renderer.AddActor(actor) renderer.SetBackground(1.0, 1.0, 1.0) vtk_show(renderer) pSource = [-50.0, 0.0, 0.0] pTarget = [50.0, 0.0, 0.0] addPoint(renderer, pSource, color=[1.0, 0.0, 0.0]) addPoint(renderer, pTarget, color=[0.0, 1.0, 0.0]) addLine(renderer, pSource, pTarget) vtk_show(renderer) obbTree = vtk.vtkOBBTree() obbTree.SetDataSet(mesh) obbTree.BuildLocator() pointsVTKintersection = vtk.vtkPoints() obbTree.IntersectWithLine(pSource, pTarget, pointsVTKintersection, None) pointsVTKIntersectionData = pointsVTKintersection.GetData() noPointsVTKIntersection = pointsVTKIntersectionData.GetNumberOfTuples() pointsIntersection = [] for idx in range(noPointsVTKIntersection): _tup = pointsVTKIntersectionData.GetTuple3(idx) pointsIntersection.append(_tup) for p in pointsIntersection: addPoint(renderer, p, color=[0.0, 0.0, 1.0]) vtk_show(renderer)