def planeModel(self, scene, normal, origin, name, color): """ Create a plane model node which can be viewed in the 3D View """ #A plane source plane = vtk.vtkPlane() plane.SetOrigin(origin) plane.SetNormal(normal) planeSample = vtk.vtkSampleFunction() planeSample.SetImplicitFunction(plane) planeSample.SetModelBounds(-100,100,-100,100,-100,100) planeSample.SetSampleDimensions(100,100,100) planeSample.ComputeNormalsOff() planeContour = vtk.vtkContourFilter() planeContour.SetInput(planeSample.GetOutput()) # Create plane model node planeNode = slicer.vtkMRMLModelNode() planeNode.SetScene(scene) planeNode.SetName(name) planeNode.SetAndObservePolyData(planeContour.GetOutput()) # Create plane display model node planeModelDisplay = slicer.vtkMRMLModelDisplayNode() planeModelDisplay.SetColor(color) planeModelDisplay.SetBackfaceCulling(0) planeModelDisplay.SetScene(scene) scene.AddNode(planeModelDisplay) planeNode.SetAndObserveDisplayNodeID(planeModelDisplay.GetID()) #Add to scene planeModelDisplay.SetInputPolyData(planeContour.GetOutput()) scene.AddNode(planeNode) return plane
def CreateBackLine(self, ruler, ROI, implicitPlane): """ Creates the polydata for where the cutting plane hits the the back of the ROI. This backline will be used to close the catheter path allowing for the specification of Towards or Away from the face ASSERTION: that the ruler's second point will be closest to the front of our mask. """ roiPoints = self.utility.GetROIPoints(ROI) frontExtentIndex = self.utility.GetClosestExtent(ruler, ROI) backExtentIndex = self.utility.GetOppositeExtent(frontExtentIndex) #Creating an implict plane for the back of the ROI ROICenterPoint = [0, 0, 0] ROI.GetXYZ(ROICenterPoint) backNormal = self.utility.GetVector(ROICenterPoint, roiPoints[backExtentIndex]) backPlane = vtk.vtkPlane() backPlane.SetNormal(backNormal) backPlane.SetOrigin(roiPoints[backExtentIndex]) #Finding the Intercept of this and the CuttingPlane sampleFunction = vtk.vtkSampleFunction() sampleFunction.SetSampleDimensions(10, 10, 10) sampleFunction.SetImplicitFunction(backPlane) bounds = self.utility.ExpandExtents(self.utility.GetROIExtents(ROI), 1) sampleFunction.SetModelBounds(bounds) sampleFunction.Update() contourFilter = vtk.vtkContourFilter() contourFilter.SetInputConnection(sampleFunction.GetOutputPort()) contourFilter.GenerateValues(1, 1, 1) contourFilter.Update() cutter = vtk.vtkCutter() cutter.SetInputConnection(contourFilter.GetOutputPort()) cutter.SetCutFunction(implicitPlane) cutter.GenerateValues(1, 1, 1) cutter.Update() self.listOfBackLines.append(cutter.GetOutput()) PATH = self.ROOTPATH + "\\doc\\DebugPolyData\\" + "BackLine-" + str( len(self.listOfBackLines)) self.utility.PolyDataWriter(self.listOfBackLines[-1], PATH + ".vtk")
def CreateBackLine(self, ruler, ROI, implicitPlane): """ Creates the polydata for where the cutting plane hits the the back of the ROI. This backline will be used to close the catheter path allowing for the specification of Towards or Away from the face ASSERTION: that the ruler's second point will be closest to the front of our mask. """ roiPoints = self.utility.GetROIPoints(ROI) frontExtentIndex = self.utility.GetClosestExtent(ruler, ROI) backExtentIndex = self.utility.GetOppositeExtent(frontExtentIndex) # Creating an implict plane for the back of the ROI ROICenterPoint = [0, 0, 0] ROI.GetXYZ(ROICenterPoint) backNormal = self.utility.GetVector(ROICenterPoint, roiPoints[backExtentIndex]) backPlane = vtk.vtkPlane() backPlane.SetNormal(backNormal) backPlane.SetOrigin(roiPoints[backExtentIndex]) # Finding the Intercept of this and the CuttingPlane sampleFunction = vtk.vtkSampleFunction() sampleFunction.SetSampleDimensions(10, 10, 10) sampleFunction.SetImplicitFunction(backPlane) bounds = self.utility.ExpandExtents(self.utility.GetROIExtents(ROI), 1) sampleFunction.SetModelBounds(bounds) sampleFunction.Update() contourFilter = vtk.vtkContourFilter() contourFilter.SetInputConnection(sampleFunction.GetOutputPort()) contourFilter.GenerateValues(1, 1, 1) contourFilter.Update() cutter = vtk.vtkCutter() cutter.SetInputConnection(contourFilter.GetOutputPort()) cutter.SetCutFunction(implicitPlane) cutter.GenerateValues(1, 1, 1) cutter.Update() self.listOfBackLines.append(cutter.GetOutput()) PATH = self.ROOTPATH + "\\doc\\DebugPolyData\\" + "BackLine-" + str(len(self.listOfBackLines)) self.utility.PolyDataWriter(self.listOfBackLines[-1], PATH + ".vtk")
def DisplayImplicit(self,name,implicitFunction, ROI=None, Extents=None): """This function takes an implicitFunction and displays it within the ROI It will return the modelDisplaynode assosiated with in so that attributes can be changed """ sampleFunction=vtk.vtkSampleFunction() sampleFunction.SetSampleDimensions(70,70,70) sampleFunction.SetImplicitFunction(implicitFunction) ROIExtents=[0,0,0,0,0,0] if ROI==None: ROIExtents=Extents else: ROIExtents=self.GetROIExtents(ROI) sampleFunction.SetModelBounds(ROIExtents) sampleFunction.Update() contourFilter=vtk.vtkContourFilter() contourFilter.SetInputConnection(sampleFunction.GetOutputPort()) contourFilter.GenerateValues(1,0,0) contourFilter.Update() polyData=contourFilter.GetOutput() modelDisplayNode=self.DisplayPolyData(name,polyData) return modelDisplayNode
def DisplayImplicit(self, name, implicitFunction, ROI=None, Extents=None): """This function takes an implicitFunction and displays it within the ROI It will return the modelDisplaynode assosiated with in so that attributes can be changed """ sampleFunction = vtk.vtkSampleFunction() sampleFunction.SetSampleDimensions(70, 70, 70) sampleFunction.SetImplicitFunction(implicitFunction) ROIExtents = [0, 0, 0, 0, 0, 0] if ROI == None: ROIExtents = Extents else: ROIExtents = self.GetROIExtents(ROI) sampleFunction.SetModelBounds(ROIExtents) sampleFunction.Update() contourFilter = vtk.vtkContourFilter() contourFilter.SetInputConnection(sampleFunction.GetOutputPort()) contourFilter.GenerateValues(1, 0, 0) contourFilter.Update() polyData = contourFilter.GetOutput() modelDisplayNode = self.DisplayPolyData(name, polyData) return modelDisplayNode
def iceCream(self): # based on iceCream.py from VTK/Examples/Modelling # This example demonstrates how to use boolean combinations of implicit # functions to create a model of an ice cream cone. import vtk from vtk.util.colors import chocolate, mint # Create implicit function primitives. These have been carefully # placed to give the effect that we want. We are going to use various # combinations of these functions to create the shape we want; for # example, we use planes intersected with a cone (which is infinite in # extent) to get a finite cone. cone = vtk.vtkCone() cone.SetAngle(20) vertPlane = vtk.vtkPlane() vertPlane.SetOrigin(.1, 0, 0) vertPlane.SetNormal(-1, 0, 0) basePlane = vtk.vtkPlane() basePlane.SetOrigin(1.2, 0, 0) basePlane.SetNormal(1, 0, 0) iceCream = vtk.vtkSphere() iceCream.SetCenter(1.333, 0, 0) iceCream.SetRadius(0.5) bite = vtk.vtkSphere() bite.SetCenter(1.5, 0, 0.5) bite.SetRadius(0.25) # Combine primitives to build ice-cream cone. Clip the cone with planes. theCone = vtk.vtkImplicitBoolean() theCone.SetOperationTypeToIntersection() theCone.AddFunction(cone) theCone.AddFunction(vertPlane) theCone.AddFunction(basePlane) # Take a bite out of the ice cream. theCream = vtk.vtkImplicitBoolean() theCream.SetOperationTypeToDifference() theCream.AddFunction(iceCream) theCream.AddFunction(bite) # The sample function generates a distance function from the implicit # function (which in this case is the cone). This is then contoured to # get a polygonal surface. theConeSample = vtk.vtkSampleFunction() theConeSample.SetImplicitFunction(theCone) theConeSample.SetModelBounds(-1, 1.5, -1.25, 1.25, -1.25, 1.25) theConeSample.SetSampleDimensions(60, 60, 60) theConeSample.ComputeNormalsOff() theConeSurface = vtk.vtkContourFilter() theConeSurface.SetInputConnection(theConeSample.GetOutputPort()) theConeSurface.SetValue(0, 0.0) coneMapper = vtk.vtkPolyDataMapper() coneMapper.SetInputConnection(theConeSurface.GetOutputPort()) coneMapper.ScalarVisibilityOff() coneActor = vtk.vtkActor() coneActor.SetMapper(coneMapper) coneActor.GetProperty().SetColor(chocolate) # The same here for the ice cream. theCreamSample = vtk.vtkSampleFunction() theCreamSample.SetImplicitFunction(theCream) theCreamSample.SetModelBounds(0, 2.5, -1.25, 1.25, -1.25, 1.25) theCreamSample.SetSampleDimensions(60, 60, 60) theCreamSample.ComputeNormalsOff() theCreamSurface = vtk.vtkContourFilter() theCreamSurface.SetInputConnection(theCreamSample.GetOutputPort()) theCreamSurface.SetValue(0, 0.0) creamMapper = vtk.vtkPolyDataMapper() creamMapper.SetInputConnection(theCreamSurface.GetOutputPort()) creamMapper.ScalarVisibilityOff() creamActor = vtk.vtkActor() creamActor.SetMapper(creamMapper) creamActor.GetProperty().SetColor(mint) # Create the usual rendering stuff ren = vtk.vtkRenderer() renWin = vtk.vtkRenderWindow() renWin.AddRenderer(ren) iren = vtk.vtkRenderWindowInteractor() iren.SetRenderWindow(renWin) # Add the actors to the renderer, set the background and size ren.AddActor(coneActor) ren.AddActor(creamActor) ren.SetBackground(1, 1, 1) renWin.SetSize(500, 500) ren.ResetCamera() ren.GetActiveCamera().Roll(90) ren.GetActiveCamera().Dolly(1.5) ren.ResetCameraClippingRange() iren.Initialize() renWin.Render() iren.Start() return iren