def adjustColorFunction(colorTransferFunction, scalarVolumeDisplayNode): if scalarVolumeDisplayNode: colorNode = scalarVolumeDisplayNode.GetColorNode() window = scalarVolumeDisplayNode.GetWindow() cnctf = colorNode.GetColorTransferFunction() ctf = vtk.vtkColorTransferFunction() d = [0.,0.,0.] num = colorNode.GetNumberOfColors() rng = cnctf.GetRange()[1] colorTransferFunction.RemoveAllPoints() for i in xrange(num): cnctf.GetColor(rng*i/(num-1),d) colorTransferFunction.AddRGBPoint(window*i/(num-1), d[0],d[1],d[2])
def addDefaultVolumeProperty(self): # create a volume property node in the scene if needed. This is used # for the color transfer function and can be manipulated in the # Slicer Volume Rendering module widget volumePropertyNode = slicer.util.getNode('ShaderVolumeProperty') if not volumePropertyNode: volumePropertyNode = slicer.vtkMRMLVolumePropertyNode() volumePropertyNode.SetName('ShaderVolumeProperty') scalarOpacity = vtk.vtkPiecewiseFunction() points = ( (-1024., 0.), (20., 0.), (300., 1.), (3532., 1.) ) for point in points: scalarOpacity.AddPoint(*point) volumePropertyNode.SetScalarOpacity(scalarOpacity) colorTransfer = vtk.vtkColorTransferFunction() colors = ( (-1024., (0., 0., 0.)), (3., (0., 0., 0.)), (131., (1., 1., 0.)) ) colors = ( (-1024., (0., 0., 0.)), (-984., (0., 0., 0.)), (469., (1., 1., 1.)) ) for intensity,rgb in colors: colorTransfer.AddRGBPoint(intensity, *rgb) volumePropertyNode.SetScalarOpacity(scalarOpacity) volumePropertyNode.SetColor(colorTransfer, 0) slicer.mrmlScene.AddNode(volumePropertyNode) self.volumePropertyNode = volumePropertyNode
def addDefaultVolumeProperty(self): # create a volume property node in the scene if needed. This is used # for the color transfer function and can be manipulated in the # Slicer Volume Rendering module widget volumePropertyNode = slicer.util.getNode('ShaderVolumeProperty') if not volumePropertyNode: volumePropertyNode = slicer.vtkMRMLVolumePropertyNode() volumePropertyNode.SetName('ShaderVolumeProperty') scalarOpacity = vtk.vtkPiecewiseFunction() points = ((-1024., 0.), (20., 0.), (300., 1.), (3532., 1.)) for point in points: scalarOpacity.AddPoint(*point) volumePropertyNode.SetScalarOpacity(scalarOpacity) colorTransfer = vtk.vtkColorTransferFunction() colors = ((-1024., (0., 0., 0.)), (3., (0., 0., 0.)), (131., (1., 1., 0.))) colors = ((-1024., (0., 0., 0.)), (-984., (0., 0., 0.)), (469., (1., 1., 1.))) for intensity, rgb in colors: colorTransfer.AddRGBPoint(intensity, *rgb) volumePropertyNode.SetScalarOpacity(scalarOpacity) volumePropertyNode.SetColor(colorTransfer, 0) slicer.mrmlScene.AddNode(volumePropertyNode) self.volumePropertyNode = volumePropertyNode
def onVolumeAdded(self,volumeNode): print("A volume was added!!") volumeNode.AddObserver("ModifiedEvent",self.onVolumeModified) ''' It is assumed that the volume was created with respect to the Reference The matrix associated with the volume must have the following structure sx 0 0 ox 0 sy 0 oy 0 0 sz oz with sx, sy, and sz >0 This is checked and if it is not true is modified. By default Slicer add a volume with a ijkToRas matrix of the form: -1 0 0 0 -1 0 0 0 1 In this case we want a ijkToRAS matrix equal to identity because we want to place the volume with respect to the Reference. ReferenceToRAS matrix is calculated during registration ''' matrix=vtk.vtkMatrix4x4() volumeNode.GetIJKToRASMatrix(matrix) print matrix sx = matrix.GetElement(0,0) if (sx<0): ox=matrix.GetElement(0,3) matrix.SetElement(0,0,-sx) matrix.SetElement(0,3,-ox) sy = matrix.GetElement(1,1) if (sy<0): oy=matrix.GetElement(1,3) matrix.SetElement(1,1,-sy) matrix.SetElement(1,3,-oy) volumeNode.SetIJKToRASMatrix(matrix) print matrix # Volumes are placed under the Reference coordinate system referenceToRASNode=slicer.util.getNode("ReferenceToRAS") if referenceToRASNode==None: referenceToRASNode=slicer.vtkMRMLLinearTransformNode() slicer.mrmlScene.AddNode(referenceToRASNode) referenceToRASNode.SetName("ReferenceToRAS") volumeNode.SetAndObserveTransformNodeID(referenceToRASNode.GetID()) volumeNode.SetDisplayVisibility(True) volumePropertyNode=slicer.vtkMRMLVolumePropertyNode() slicer.mrmlScene.RegisterNodeClass(volumePropertyNode); # the scalar opacity mapping function is configured # it is a ramp with opacity of 0 equal to zero and opacity of 1 equal to 1. scalarOpacity = vtk.vtkPiecewiseFunction() scalarOpacity.AddPoint(self.scalarRange[0],0.) scalarOpacity.AddPoint(self.windowLevelMinMax[0],0.) scalarOpacity.AddPoint(self.windowLevelMinMax[1],1.) scalarOpacity.AddPoint(self.scalarRange[1],1.) volumePropertyNode.SetScalarOpacity(scalarOpacity); # the color function is configured # zero is associated to the scalar zero and 1 to the scalar 255 colorTransfer = vtk.vtkColorTransferFunction() black=[0., 0., 0.] white=[1.,1.,1.] colorTransfer.AddRGBPoint(self.scalarRange[0],black[0],black[1],black[2]) colorTransfer.AddRGBPoint(self.windowLevelMinMax[0], black[0], black[1], black[2]) colorTransfer.AddRGBPoint(self.windowLevelMinMax[1], white[0], white[1], white[2]); colorTransfer.AddRGBPoint(self.scalarRange[1], white[0], white[1], white[2]); volumePropertyNode.SetColor(colorTransfer) vtkVolumeProperty=volumePropertyNode.GetVolumeProperty() vtkVolumeProperty.SetInterpolationTypeToNearest(); vtkVolumeProperty.ShadeOn(); vtkVolumeProperty.SetAmbient(0.30); vtkVolumeProperty.SetDiffuse(0.60); vtkVolumeProperty.SetSpecular(0.50); vtkVolumeProperty.SetSpecularPower(40); slicer.mrmlScene.AddNode(volumePropertyNode) # The volume rendering display node is created vrDisplayNode=slicer.vtkMRMLCPURayCastVolumeRenderingDisplayNode() vrDisplayNode.SetAndObserveVolumeNodeID(volumeNode.GetID()) vrDisplayNode.SetAndObserveVolumePropertyNodeID(volumePropertyNode.GetID()) slicer.mrmlScene.AddNode(vrDisplayNode) vrDisplayNode.SetVisibility(True) vrDisplayNode.AddObserver("ModifiedEvent",self.onVolumeRenderingModified) vrDisplayNode.Modified() vrDisplayNode.UpdateScene(slicer.mrmlScene)