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)
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 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)
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()
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()