def initialize(self): self.layoutManager = slicer.app.layoutManager() self.threeDWidget = self.layoutManager.threeDWidget(0) self.threeDView = self.threeDWidget.threeDView() self.renderWindow = self.threeDView.renderWindow() self.renderers = self.renderWindow.GetRenderers() self.renderer = self.renderers.GetFirstRenderer() self.polydata = vtk.vtkPolyData() self.points = vtk.vtkPoints() self.planeSource = vtk.vtkPlaneSource() self.mapper = vtk.vtkPolyDataMapper() self.actor = vtk.vtkActor() self.renderer.AddViewProp(self.actor) self.renderWindow.AddRenderer(self.renderer)
def initialize(self): self.layoutManager=slicer.app.layoutManager() self.threeDWidget=self.layoutManager.threeDWidget(0) self.threeDView=self.threeDWidget.threeDView() self.renderWindow=self.threeDView.renderWindow() self.renderers=self.renderWindow.GetRenderers() self.renderer=self.renderers.GetFirstRenderer() self.polydata = vtk.vtkPolyData() self.points = vtk.vtkPoints() self.planeSource = vtk.vtkPlaneSource() self.mapper = vtk.vtkPolyDataMapper() self.actor = vtk.vtkActor() self.renderer.AddViewProp(self.actor) self.renderWindow.AddRenderer(self.renderer)
def __init__(self): self.scene = slicer.mrmlScene self.scene.SetUndoOn() self.scene.SaveStateForUndo(self.scene.GetNodes()) self.currentSlice = Slice('/luscinia/ProstateStudy/invivo/Patient59/loupas/RadialImagesCC_imwrite/arfi_ts3_26.57.png') # yay, adding images to slicer planeSource = vtk.vtkPlaneSource() planeSource.SetCenter(self.currentSlice.x, self.currentSlice.y, self.currentSlice.z) reader = vtk.vtkPNGReader() reader.SetFileName(self.currentSlice.name) # model node self.model = slicer.vtkMRMLModelNode() self.model.SetScene(self.scene) self.model.SetName(self.currentSlice.name) self.model.SetAndObservePolyData(planeSource.GetOutput()) # model display node self.modelDisplay = slicer.vtkMRMLModelDisplayNode() self.modelDisplay.BackfaceCullingOff() # so plane can be seen from both front and back face self.modelDisplay.SetScene(self.scene) self.scene.AddNode(self.modelDisplay) # connecting model node w/ its model display node self.model.SetAndObserveDisplayNodeID(self.modelDisplay.GetID()) # adding tiff file as texture to modelDisplay self.modelDisplay.SetAndObserveTextureImageData(reader.GetOutput()) self.scene.AddNode(self.model) # now doing a linear transform to set coordinates and orientation of plane self.transform = slicer.vtkMRMLLinearTransformNode() self.scene.AddNode(self.transform) self.model.SetAndObserveTransformNodeID(self.transform.GetID()) vTransform = vtk.vtkTransform() vTransform.Scale(150, 150, 150) vTransform.RotateX(0) vTransform.RotateY(0) vTransform.RotateZ(0) self.transform.SetAndObserveMatrixTransformToParent(vTransform.GetMatrix())
def selectSlice(self, index): self.scene.Undo() self.scene.SaveStateForUndo(self.scene.GetNodes()) imgFilePrefix = './data/test' imgFileSuffix = '.tiff' # yay, adding images to slicer planeSource = vtk.vtkPlaneSource() reader = vtk.vtkTIFFReader() reader.SetFileName(imgFilePrefix + str(self.imageList[index]) + imgFileSuffix) #reader.CanReadFile('imgFilePrefix + str(self.imageList[0]) + imgFileSuffix') # model node model = slicer.vtkMRMLModelNode() model.SetScene(self.scene) model.SetName("test " + str(self.imageList[index]) + "cow") model.SetAndObservePolyData(planeSource.GetOutput()) # model display node modelDisplay = slicer.vtkMRMLModelDisplayNode() modelDisplay.BackfaceCullingOff() # so plane can be seen from both front and back face modelDisplay.SetScene(self.scene) self.scene.AddNode(modelDisplay) # connecting model node w/ its model display node model.SetAndObserveDisplayNodeID(modelDisplay.GetID()) # adding tiff file as texture to modelDisplay modelDisplay.SetAndObserveTextureImageData(reader.GetOutput()) self.scene.AddNode(model) # now doing a linear transform to set coordinates and orientation of plane transform = slicer.vtkMRMLLinearTransformNode() self.scene.AddNode(transform) model.SetAndObserveTransformNodeID(transform.GetID()) vTransform = vtk.vtkTransform() vTransform.Scale(150, 150, 150) vTransform.RotateX(self.rotateXList[index]) vTransform.RotateY(self.rotateYList[index]) vTransform.RotateZ(self.rotateZList[index]) transform.SetAndObserveMatrixTransformToParent(vTransform.GetMatrix())
def PointsToPlanePolyData( self, inPoints, reverse ): # Create the oriented bounding box # This gives us one plane on the bounding box, not the plane of best fit corner = [ 0, 0, 0 ] maxVector = [ 0, 0, 0 ] midVector = [ 0, 0, 0 ] minVector = [ 0, 0, 0 ] size = [ 0, 0, 0 ] obb = vtk.vtkOBBTree() obb.ComputeOBB( inPoints, corner, maxVector, midVector, minVector, size ) # Calculate the mean of the points on the plane base = self.CalculateMean( inPoints ) relBase = [ 0, 0, 0 ] # Find the projection of the mean point in the minVector direction vtk.vtkMath().Subtract( base, corner, relBase ) normal = minVector[:] vtk.vtkMath().Normalize( normal ) dot = vtk.vtkMath().Dot( relBase, normal ) dot = 0 proj = normal[:] vtk.vtkMath().MultiplyScalar( proj, dot ) print dot # Find the points on the plane origin = [ 0, 0, 0 ] point1 = [ 0, 0, 0 ] point2 = [ 0, 0, 0 ] vtk.vtkMath().Add( corner, proj, origin ) vtk.vtkMath().Add( origin, maxVector, point1 ) vtk.vtkMath().Add( origin, midVector, point2 ) # Construct the plane plane = vtk.vtkPlaneSource() plane.SetOrigin( origin ) plane.SetPoint1( point1 ) plane.SetPoint2( point2 ) plane.Update() return plane.GetOutput()
def updateScene(self): #self.scene.Undo() #self.scene.SaveStateForUndo(self.scene.GetNodes()) self.scene.RemoveNode(self.transform) self.scene.RemoveNode(self.modelDisplay) self.scene.RemoveNode(self.model) planeSource = vtk.vtkPlaneSource() planeSource.SetCenter(self.currentSlice.x, self.currentSlice.y, self.currentSlice.z) reader = vtk.vtkPNGReader() reader.SetFileName(self.currentSlice.name) # model node self.model = slicer.vtkMRMLModelNode() self.model.SetScene(self.scene) self.model.SetName(self.currentSlice.name) self.model.SetAndObservePolyData(planeSource.GetOutput()) # model display node self.modelDisplay = slicer.vtkMRMLModelDisplayNode() self.modelDisplay.BackfaceCullingOff() # so plane can be seen from both front and back face self.modelDisplay.SetScene(self.scene) self.scene.AddNode(self.modelDisplay) # connecting model node w/ its model display node self.model.SetAndObserveDisplayNodeID(self.modelDisplay.GetID()) # adding tiff file as texture to modelDisplay self.modelDisplay.SetAndObserveTextureImageData(reader.GetOutput()) self.scene.AddNode(self.model) # now doing a linear transform to set coordinates and orientation of plane self.transform = slicer.vtkMRMLLinearTransformNode() self.scene.AddNode(self.transform) self.model.SetAndObserveTransformNodeID(self.transform.GetID()) vTransform = vtk.vtkTransform() vTransform.Scale(self.currentSlice.scaling, self.currentSlice.scaling, self.currentSlice.scaling) vTransform.RotateX(self.currentSlice.xAngle) vTransform.RotateY(self.currentSlice.yAngle) vTransform.RotateZ(self.currentSlice.zAngle) self.transform.SetAndObserveMatrixTransformToParent(vTransform.GetMatrix())
def takeUSSnapshot2(self): snapshotDisp=slicer.vtkMRMLModelDisplayNode() slicer.mrmlScene.AddNode(snapshotDisp) snapshotDisp.SetScene(slicer.mrmlScene) snapshotDisp.SetDisableModifiedEvent(1) snapshotDisp.SetOpacity(1.0) snapshotDisp.SetColor(1.0,1.0,1.0) snapshotDisp.SetAmbient(1.0) snapshotDisp.SetBackfaceCulling(0) snapshotDisp.SetDiffuse(0) snapshotDisp.SetSaveWithScene(0) snapshotDisp.SetDisableModifiedEvent(0) name="Snapshot" + str(self.numberOfUltrasoundSnapshotsTaken) self.numberOfUltrasoundSnapshotsTaken = self.numberOfUltrasoundSnapshotsTaken + 1 snapshotModel=slicer.vtkMRMLModelNode() snapshotModel.SetName(name) snapshotModel.SetDescription("Live Ultrasound Snapshot") snapshotModel.SetScene(slicer.mrmlScene) snapshotModel.SetAndObserveDisplayNodeID(snapshotDisp.GetID()) snapshotModel.SetHideFromEditors(0) snapshotModel.SetSaveWithScene(0) slicer.mrmlScene.AddNode(snapshotModel) image_RAS=slicer.util.getNode("Image_Reference") dim=[0,0,0] imageData=image_RAS.GetImageData() imageData.GetDimensions(dim) plane=vtk.vtkPlaneSource() plane.Update() snapshotModel.SetAndObservePolyData(plane.GetOutput()) slicePolyData=snapshotModel.GetPolyData() slicePoints=slicePolyData.GetPoints() # In parent transform is saved the ReferenceToRAS transform parentTransform=vtk.vtkTransform() parentTransform.Identity() if not image_RAS.GetParentTransformNode()==None: parentMatrix=vtk.vtkMatrix4x4() parentTransformNode=image_RAS.GetParentTransformNode() parentTransformNode.GetMatrixTransformToWorld(parentMatrix) #aux=parentTransform.GetMatrix() #aux.DeepCopy(parentMatrix) #parentTransform.Update() parentTransform.SetMatrix(parentMatrix) inImageTransform=vtk.vtkTransform() inImageTransform.Identity() image_RAS.GetIJKToRASMatrix(inImageTransform.GetMatrix()) tImageToRAS=vtk.vtkTransform() tImageToRAS.Identity() tImageToRAS.PostMultiply() tImageToRAS.Concatenate(inImageTransform) tImageToRAS.Concatenate(parentTransform) tImageToRAS.Update() point1Image=[0.0,0.0,0.0,1.0] point2Image=[dim[0],0.0,0.0,1.0] point3Image=[0.0,dim[1],0.0,1.0] point4Image=[dim[0],dim[1],0.0,1.0] point1RAS=[0.0,0.0,0.0,0.0] point2RAS=[0.0,0.0,0.0,0.0] point3RAS=[0.0,0.0,0.0,0.0] point4RAS=[0.0,0.0,0.0,0.0] tImageToRAS.MultiplyPoint(point1Image,point1RAS) tImageToRAS.MultiplyPoint(point2Image,point2RAS) tImageToRAS.MultiplyPoint(point3Image,point3RAS) tImageToRAS.MultiplyPoint(point4Image,point4RAS) p1RAS=[point1RAS[0],point1RAS[1],point1RAS[2]] p2RAS=[point2RAS[0],point2RAS[1],point2RAS[2]] p3RAS=[point3RAS[0],point3RAS[1],point3RAS[2]] p4RAS=[point4RAS[0],point4RAS[1],point4RAS[2]] slicePoints.SetPoint(0,p1RAS) slicePoints.SetPoint(1,p2RAS) slicePoints.SetPoint(2,p3RAS) slicePoints.SetPoint(3,p4RAS) ## Add image texture. image=vtk.vtkImageData() image.DeepCopy(imageData) modelDisplayNode=snapshotModel.GetModelDisplayNode() modelDisplayNode.SetAndObserveTextureImageData(image)
def planeLandmarks(self, Landmark1Value, Landmark2Value, Landmark3Value, slider, sliderOpacity): self.initialize() # Limit the number of 3 landmarks to define a plane # Keep the coordinates of the landmarks listCoord = list() fidNode = slicer.mrmlScene.GetNodeByID('vtkMRMLMarkupsFiducialNode1') self.coord = numpy.zeros(3) if Landmark1Value != "List of fiducials": fidNode.GetNthFiducialPosition(int(Landmark1Value)-1, self.coord) listCoord.append(self.coord) print self.coord print listCoord r1 = self.coord[0] a1 = self.coord[1] s1 = self.coord[2] # Limit the number of 3 landmarks to define a plane # Keep the coordinates of the landmarks listCoord = list() fidNode = slicer.mrmlScene.GetNodeByID('vtkMRMLMarkupsFiducialNode1') self.coord = numpy.zeros(3) if Landmark2Value != "List of fiducials": fidNode.GetNthFiducialPosition(int(Landmark2Value)-1, self.coord) listCoord.append(self.coord) print self.coord print listCoord r2 = self.coord[0] a2 = self.coord[1] s2 = self.coord[2] # Limit the number of 3 landmarks to define a plane # Keep the coordinates of the landmarks listCoord = list() fidNode = slicer.mrmlScene.GetNodeByID('vtkMRMLMarkupsFiducialNode1') self.coord = numpy.zeros(3) if Landmark3Value != "List of fiducials": fidNode.GetNthFiducialPosition(int(Landmark3Value)-1, self.coord) listCoord.append(self.coord) print self.coord print listCoord r3 = self.coord[0] a3 = self.coord[1] s3 = self.coord[2] A = (r1,a1,s1) B = (r2,a2,s2) C = (r3,a3,s3) # Vn = Vectorial Product (AB, BC) # Normal N = Vn/norm(Vn) points = vtk.vtkPoints() points.InsertNextPoint(r1,a1,s1) points.InsertNextPoint(r2,a2,s2) points.InsertNextPoint(r3,a3,s3) polydata = vtk.vtkPolyData() polydata.SetPoints(points) centerOfMass = vtk.vtkCenterOfMass() centerOfMass.SetInputData(polydata) centerOfMass.SetUseScalarsAsWeights(False) centerOfMass.Update() G = centerOfMass.GetCenter() print "Center of mass = ",G # Vector GA GA = numpy.matrix([[0],[0],[0]]) GA[0] = A[0]-G[0] GA[1] = A[1]-G[1] GA[2] = A[2]-G[2] print "GA = ", GA # Vector BG GB = numpy.matrix([[0],[0],[0]]) GB[0] = B[0]-G[0] GB[1] = B[1]-G[1] GB[2] = B[2]-G[2] print "GB = ", GB # Vector CG GC = numpy.matrix([[0],[0],[0]]) GC[0] = C[0]-G[0] GC[1] = C[1]-G[1] GC[2] = C[2]-G[2] print "GC = ", GC self.N = self.normalLandmarks(GA,GB) D = numpy.matrix([[0],[0],[0]]) E = numpy.matrix([[0],[0],[0]]) F = numpy.matrix([[0],[0],[0]]) D[0] = slider*GA[0] + G[0] D[1] = slider*GA[1] + G[1] D[2] = slider*GA[2] + G[2] print "Slider value : ", slider print "D = ",D E[0] = slider*GB[0] + G[0] E[1] = slider*GB[1] + G[1] E[2] = slider*GB[2] + G[2] print "E = ",E F[0] = slider*GC[0] + G[0] F[1] = slider*GC[1] + G[1] F[2] = slider*GC[2] + G[2] print "F = ",F self.renderWindow.AddRenderer(self.renderer) planeSource = vtk.vtkPlaneSource() planeSource.SetNormal(self.N[0],self.N[1],self.N[2]) planeSource.SetOrigin(D[0],D[1],D[2]) planeSource.SetPoint1(E[0],E[1],E[2]) planeSource.SetPoint2(F[0],F[1],F[2]) planeSource.Update() plane = planeSource.GetOutput() mapper = vtk.vtkPolyDataMapper() mapper.SetInputData(plane) self.actor.SetMapper(mapper) self.actor.GetProperty().SetColor(0, 0.4, 0.8) self.actor.GetProperty().SetOpacity(sliderOpacity) self.renderer.AddActor(self.actor) self.renderWindow.Render()
def takeUSSnapshot2(self,name): snapshotDisp = slicer.vtkMRMLModelDisplayNode() slicer.mrmlScene.AddNode(snapshotDisp) snapshotDisp.SetScene(slicer.mrmlScene) snapshotDisp.SetDisableModifiedEvent(1) snapshotDisp.SetOpacity(1.0) snapshotDisp.SetColor(1.0, 1.0, 1.0) snapshotDisp.SetAmbient(1.0) snapshotDisp.SetBackfaceCulling(0) snapshotDisp.SetDiffuse(0) snapshotDisp.SetSaveWithScene(0) snapshotDisp.SetDisableModifiedEvent(0) snapshotModel = slicer.vtkMRMLModelNode() snapshotModel.SetName(name) snapshotModel.SetDescription("Live Ultrasound Snapshot") snapshotModel.SetScene(slicer.mrmlScene) snapshotModel.SetAndObserveDisplayNodeID(snapshotDisp.GetID()) snapshotModel.SetHideFromEditors(0) snapshotModel.SetSaveWithScene(0) slicer.mrmlScene.AddNode(snapshotModel) image_RAS = slicer.util.getNode("Image_Image") dim = [0, 0, 0] imageData = image_RAS.GetImageData() imageData.GetDimensions(dim) plane = vtk.vtkPlaneSource() plane.Update() snapshotModel.SetAndObservePolyData(plane.GetOutput()) slicePolyData = snapshotModel.GetPolyData() slicePoints = slicePolyData.GetPoints() # In parent transform is saved the ReferenceToRAS transform parentTransform = vtk.vtkTransform() parentTransform.Identity() if not image_RAS.GetParentTransformNode() == None: parentMatrix = vtk.vtkMatrix4x4() parentTransformNode = image_RAS.GetParentTransformNode() parentTransformNode.GetMatrixTransformToWorld(parentMatrix) # aux=parentTransform.GetMatrix() # aux.DeepCopy(parentMatrix) # parentTransform.Update() parentTransform.SetMatrix(parentMatrix) inImageTransform = vtk.vtkTransform() inImageTransform.Identity() image_RAS.GetIJKToRASMatrix(inImageTransform.GetMatrix()) tImageToRAS = vtk.vtkTransform() tImageToRAS.Identity() tImageToRAS.PostMultiply() tImageToRAS.Concatenate(inImageTransform) tImageToRAS.Concatenate(parentTransform) tImageToRAS.Update() point1Image = [0.0, 0.0, 0.0, 1.0] point2Image = [dim[0], 0.0, 0.0, 1.0] point3Image = [0.0, dim[1], 0.0, 1.0] point4Image = [dim[0], dim[1], 0.0, 1.0] point1RAS = [0.0, 0.0, 0.0, 0.0] point2RAS = [0.0, 0.0, 0.0, 0.0] point3RAS = [0.0, 0.0, 0.0, 0.0] point4RAS = [0.0, 0.0, 0.0, 0.0] tImageToRAS.MultiplyPoint(point1Image, point1RAS) tImageToRAS.MultiplyPoint(point2Image, point2RAS) tImageToRAS.MultiplyPoint(point3Image, point3RAS) tImageToRAS.MultiplyPoint(point4Image, point4RAS) p1RAS = [point1RAS[0], point1RAS[1], point1RAS[2]] p2RAS = [point2RAS[0], point2RAS[1], point2RAS[2]] p3RAS = [point3RAS[0], point3RAS[1], point3RAS[2]] p4RAS = [point4RAS[0], point4RAS[1], point4RAS[2]] slicePoints.SetPoint(0, p1RAS) slicePoints.SetPoint(1, p2RAS) slicePoints.SetPoint(2, p3RAS) slicePoints.SetPoint(3, p4RAS) # # Add image texture. image = vtk.vtkImageData() image.DeepCopy(imageData) modelDisplayNode = snapshotModel.GetModelDisplayNode() modelDisplayNode.SetAndObserveTextureImageData(image) snapshotTexture = slicer.vtkMRMLScalarVolumeNode() snapshotTexture.SetAndObserveImageData(image) snapshotTexture.SetName(name + "_Texture") slicer.mrmlScene.AddNode(snapshotTexture) snapshotTexture.CopyOrientation( image_RAS ) snapshotTextureDisplayNode = slicer.vtkMRMLScalarVolumeDisplayNode() snapshotTextureDisplayNode.SetName(name + "_TextureDisplay") snapshotTextureDisplayNode.SetAutoWindowLevel(0); snapshotTextureDisplayNode.SetWindow(256); snapshotTextureDisplayNode.SetLevel(128); snapshotTextureDisplayNode.SetDefaultColorMap(); slicer.mrmlScene.AddNode(snapshotTextureDisplayNode) snapshotTexture.AddAndObserveDisplayNodeID( snapshotTextureDisplayNode.GetID() ) snapshotModel.SetAttribute( "TextureNodeID", snapshotTexture.GetID() ) snapshotModelDisplayNode= snapshotModel.GetModelDisplayNode() snapshotModelDisplayNode.SetAndObserveTextureImageData( snapshotTexture.GetImageData() )