def AddDamageTemplateModel(self,scene,LineLandmarkTransform ):
      # check if already implemented
      if ( self.DamageTemplateModel != None ):
        print "removing", self.DamageTemplateModel.GetName()
        scene.RemoveNode(self.DamageTemplateModel)
      # create sphere and scale
      vtkSphere = vtk.vtkSphereSource()
      vtkSphere.SetRadius(1.) 
      vtkSphere.SetThetaResolution(16)
      vtkSphere.SetPhiResolution(16)
      ScaleAffineTransform = vtk.vtkTransform()
      ScaleAffineTransform.Scale([self.AblationMinorAxis,self.AblationMajorAxis,self.AblationMinorAxis])
      vtkEllipsoid= vtk.vtkTransformFilter()
      vtkEllipsoid.SetInput(vtkSphere.GetOutput() ) 
      vtkEllipsoid.SetTransform( ScaleAffineTransform ) 
      vtkEllipsoid.Update()

      slicertransformFilter = vtk.vtkTransformFilter()
      slicertransformFilter.SetInput(vtkEllipsoid.GetOutput() ) 
      slicertransformFilter.SetTransform( LineLandmarkTransform ) 
      slicertransformFilter.Update()
      dampolyData=slicertransformFilter.GetOutput();

      # Create model node
      self.DamageTemplateModel = slicer.vtkMRMLModelNode()
      self.DamageTemplateModel.SetScene(scene)
      #self.DamageTemplateModel.SetName(scene.GenerateUniqueName("Treatment-%s" % fiducialsNode.GetName()))
      self.DamageTemplateModel.SetName( scene.GenerateUniqueName("Treatment") )
      self.DamageTemplateModel.SetAndObservePolyData(dampolyData)

      # Create display node
      modelDisplay = slicer.vtkMRMLModelDisplayNode()
      modelDisplay.SetColor(1,1,0) # yellow
      modelDisplay.SetOpacity(0.3) 
      modelDisplay.SetScene(scene)
      scene.AddNode(modelDisplay)
      self.DamageTemplateModel.SetAndObserveDisplayNodeID(modelDisplay.GetID())

      # Add to scene
      modelDisplay.SetInputPolyData(self.DamageTemplateModel.GetPolyData())
      scene.AddNode(self.DamageTemplateModel)
Exemplo n.º 2
0
 def generateCylinderPolyData(self, x, y):
     cylinderHeightMm = 80
     cylinderRadiusMm = 1
     cylinderSource = vtk.vtkCylinderSource()
     cylinderSource.SetHeight(cylinderHeightMm)
     cylinderSource.SetRadius(cylinderRadiusMm)
     renderDepthMm = -cylinderHeightMm  # negative because in graphics, negative is depth, positive goes toward the user
     transform = vtk.vtkTransform()
     transform.Translate(x, y, renderDepthMm)
     transform.RotateX(90)  # rotate so that the cylinder follows the z axis
     transformFilter = vtk.vtkTransformFilter()
     transformFilter.SetTransform(transform)
     transformFilter.SetInputConnection(cylinderSource.GetOutputPort(0))
     transformFilter.Update()
     polyData = transformFilter.GetOutput()
     return polyData
Exemplo n.º 3
0
 def generateCylinderPolyData(self,x,y):
   cylinderHeightMm = 80
   cylinderRadiusMm = 1
   cylinderSource = vtk.vtkCylinderSource()
   cylinderSource.SetHeight(cylinderHeightMm)
   cylinderSource.SetRadius(cylinderRadiusMm)
   renderDepthMm = -cylinderHeightMm # negative because in graphics, negative is depth, positive goes toward the user
   transform = vtk.vtkTransform()
   transform.Translate(x,y,renderDepthMm)
   transform.RotateX(90) # rotate so that the cylinder follows the z axis
   transformFilter = vtk.vtkTransformFilter()
   transformFilter.SetTransform(transform)
   transformFilter.SetInputConnection(cylinderSource.GetOutputPort(0))
   transformFilter.Update()
   polyData = transformFilter.GetOutput()
   return polyData
  def AddApplicatorTrajectoryModel(self,scene,LineLandmarkTransform ):
      # check if already implemented
      if ( self.ApplicatorTrajectoryModel != None ):
        print "removing", self.ApplicatorTrajectoryModel.GetName()
        scene.RemoveNode(self.ApplicatorTrajectoryModel)

      # Define applicator tip
      vtkCylinder = vtk.vtkCylinderSource()
      vtkCylinder.SetHeight(10.*self.DiffusingTipLength); 
      vtkCylinder.SetRadius(0.1*self.DiffusingTipRadius);
      vtkCylinder.SetCenter(0.0,  10.*self.DiffusingTipLength/2.0, 0.0);
      vtkCylinder.SetResolution(16);

      # transform
      slicertransformFilter = vtk.vtkTransformFilter()
      slicertransformFilter.SetInput(vtkCylinder.GetOutput() ) 
      slicertransformFilter.SetTransform( LineLandmarkTransform ) 
      slicertransformFilter.Update()
      apppolyData=slicertransformFilter.GetOutput();

      # add to scene
      self.ApplicatorTrajectoryModel = slicer.vtkMRMLModelNode()
      self.ApplicatorTrajectoryModel.SetScene(scene)
      #self.ApplicatorTrajectoryModel.SetName(scene.GenerateUniqueName("Applicator-%s" % fiducialsNode.GetName()))
      self.ApplicatorTrajectoryModel.SetName("ApplicatorTrajectory" )
      self.ApplicatorTrajectoryModel.SetAndObservePolyData(apppolyData)

      # Create display node
      modelDisplay = slicer.vtkMRMLModelDisplayNode()
      modelDisplay.SetColor(1,0.5,0) # red
      modelDisplay.SetScene(scene)
      scene.AddNode(modelDisplay)
      self.ApplicatorTrajectoryModel.SetAndObserveDisplayNodeID(modelDisplay.GetID())

      # Add to scene
      modelDisplay.SetInputPolyData(self.ApplicatorTrajectoryModel.GetPolyData())
      scene.AddNode(self.ApplicatorTrajectoryModel)
Exemplo n.º 5
0
    def CreateSlit(self, normal, pathPolydata, ruler, ROI, slitSize):
        """ Here we are going to create a boxSource , the size of the 2*ROI in the X,Y
    and the size of the slit Size in the Z. 
    We are then going to translate the box source to its correct location in slicer
    As always to visualize , a DEBUG option can be set at the top.
    x is L->R, y is P->A, z is I->S
    """
        # Cube Creation
        roiPoints = self.utility.GetROIPoints(ROI)
        frontExtentIndex = self.utility.GetClosestExtent(ruler, ROI)
        backExtentIndex = self.utility.GetOppositeExtent(frontExtentIndex)
        pointA = numpy.array(roiPoints[frontExtentIndex])
        pointB = numpy.array(roiPoints[backExtentIndex])
        yDist = numpy.linalg.norm(pointA - pointB)
        numPoints = pathPolydata.GetNumberOfPoints()
        pointA = numpy.array(pathPolydata.GetPoint(0))
        pointB = numpy.array(pathPolydata.GetPoint(numPoints - 1))
        xDist = numpy.linalg.norm(pointA - pointB)
        zDist = slitSize  # Rewording the parameter to make it easier to understand
        slitCube = vtk.vtkCubeSource()
        slitCube.SetBounds(0, xDist, -yDist, yDist, -zDist / 2, zDist / 2)  # (Xmin, Xmax, Ymin, Ymax,Zmin, Zmax)

        # Transforming Cube
        transformFilter = vtk.vtkTransformFilter()
        transform = vtk.vtkTransform()
        matrix = vtk.vtkMatrix4x4()
        pointA = numpy.array(pathPolydata.GetPoint(0))
        pointB = numpy.array(pathPolydata.GetPoint(numPoints - 1))
        xVector = pointA - pointB
        xDist = numpy.linalg.norm(pointA - pointB)
        xUnitVector = (xVector[0] / xDist, xVector[1] / xDist, xVector[2] / xDist)

        yVector = self.utility.GetRulerVector(ruler)
        yDist = numpy.linalg.norm(yVector)
        yUnitVector = (yVector[0] / yDist, yVector[1] / yDist, yVector[2] / yDist)

        zVector = numpy.cross(xVector, yVector)
        zDist = numpy.linalg.norm(zVector)
        zUnitVector = (zVector[0] / zDist, zVector[1] / zDist, zVector[2] / zDist)

        origin = pointA = numpy.array(pathPolydata.GetPoint(numPoints - 1))

        matrix.DeepCopy(
            (
                xUnitVector[0],
                yUnitVector[0],
                zUnitVector[0],
                origin[0],
                xUnitVector[1],
                yUnitVector[1],
                zUnitVector[1],
                origin[1],
                xUnitVector[2],
                yUnitVector[2],
                zUnitVector[2],
                origin[2],
                0,
                0,
                0,
                1,
            )
        )

        transform.SetMatrix(matrix)
        transformFilter.SetTransform(transform)
        transformFilter.SetInputConnection(slitCube.GetOutputPort())
        transformFilter.Update()
        self.slitPlanes.append(transformFilter.GetOutput())
        if len(self.slitPlanes) == self.numberOfPaths and self.DEBUG_SLITPLANES == True:
            for i in range(self.numberOfPaths):
                self.utility.DisplayPolyData("Slit" + str(i), self.slitPlanes[i])
        return transformFilter.GetOutput()
Exemplo n.º 6
0
    def CreateSlit(self, normal, pathPolydata, ruler, ROI, slitSize):
        """ Here we are going to create a boxSource , the size of the 2*ROI in the X,Y
    and the size of the slit Size in the Z. 
    We are then going to translate the box source to its correct location in slicer
    As always to visualize , a DEBUG option can be set at the top.
    x is L->R, y is P->A, z is I->S
    """
        #Cube Creation
        roiPoints = self.utility.GetROIPoints(ROI)
        frontExtentIndex = self.utility.GetClosestExtent(ruler, ROI)
        backExtentIndex = self.utility.GetOppositeExtent(frontExtentIndex)
        pointA = numpy.array(roiPoints[frontExtentIndex])
        pointB = numpy.array(roiPoints[backExtentIndex])
        yDist = numpy.linalg.norm(pointA - pointB)
        numPoints = pathPolydata.GetNumberOfPoints()
        pointA = numpy.array(pathPolydata.GetPoint(0))
        pointB = numpy.array(pathPolydata.GetPoint(numPoints - 1))
        xDist = numpy.linalg.norm(pointA - pointB)
        zDist = slitSize  #Rewording the parameter to make it easier to understand
        slitCube = vtk.vtkCubeSource()
        slitCube.SetBounds(0, xDist, -yDist, yDist, -zDist / 2,
                           zDist / 2)  # (Xmin, Xmax, Ymin, Ymax,Zmin, Zmax)

        #Transforming Cube
        transformFilter = vtk.vtkTransformFilter()
        transform = vtk.vtkTransform()
        matrix = vtk.vtkMatrix4x4()
        pointA = numpy.array(pathPolydata.GetPoint(0))
        pointB = numpy.array(pathPolydata.GetPoint(numPoints - 1))
        xVector = pointA - pointB
        xDist = numpy.linalg.norm(pointA - pointB)
        xUnitVector = (xVector[0] / xDist, xVector[1] / xDist,
                       xVector[2] / xDist)

        yVector = self.utility.GetRulerVector(ruler)
        yDist = numpy.linalg.norm(yVector)
        yUnitVector = (yVector[0] / yDist, yVector[1] / yDist,
                       yVector[2] / yDist)

        zVector = numpy.cross(xVector, yVector)
        zDist = numpy.linalg.norm(zVector)
        zUnitVector = (zVector[0] / zDist, zVector[1] / zDist,
                       zVector[2] / zDist)

        origin = pointA = numpy.array(pathPolydata.GetPoint(numPoints - 1))

        matrix.DeepCopy(
            (xUnitVector[0], yUnitVector[0], zUnitVector[0], origin[0],
             xUnitVector[1], yUnitVector[1], zUnitVector[1], origin[1],
             xUnitVector[2], yUnitVector[2], zUnitVector[2], origin[2], 0, 0,
             0, 1))

        transform.SetMatrix(matrix)
        transformFilter.SetTransform(transform)
        transformFilter.SetInputConnection(slitCube.GetOutputPort())
        transformFilter.Update()
        self.slitPlanes.append(transformFilter.GetOutput())
        if len(self.slitPlanes
               ) == self.numberOfPaths and self.DEBUG_SLITPLANES == True:
            for i in range(self.numberOfPaths):
                self.utility.DisplayPolyData("Slit" + str(i),
                                             self.slitPlanes[i])
        return transformFilter.GetOutput()