Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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")
Ejemplo n.º 3
0
    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")
Ejemplo n.º 4
0
 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
Ejemplo n.º 5
0
 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
Ejemplo n.º 6
0
  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