Difference between revisions of "Documentation/Nightly/ScriptRepository"

From Slicer Wiki
Jump to: navigation, search
Line 96: Line 96:
 
   # Call UpdateSphere whenever the fiducials are changed
 
   # Call UpdateSphere whenever the fiducials are changed
 
   markups.AddObserver("ModifiedEvent", UpdateSphere, 2)
 
   markups.AddObserver("ModifiedEvent", UpdateSphere, 2)
 +
 +
== Add a texture mapped plane to the scene as a model ==
 +
# note that model textures are not exposed in the GUI and are not saved in the scene
 +
 +
# use dummy image data here
 +
e = vtk.vtkImageEllipsoidSource()
 +
 +
scene = slicer.mrmlScene
 +
 +
# Create model node
 +
model = slicer.vtkMRMLModelNode()
 +
model.SetScene(scene)
 +
model.SetName(scene.GenerateUniqueName("2DImageModel"))
 +
 +
planeSource = vtk.vtkPlaneSource()
 +
model.SetAndObservePolyData(planeSource.GetOutput())
 +
 +
# Create display node
 +
modelDisplay = slicer.vtkMRMLModelDisplayNode()
 +
modelDisplay.SetColor(1,1,0) # yellow
 +
modelDisplay.SetBackfaceCulling(0)
 +
modelDisplay.SetScene(scene)
 +
scene.AddNode(modelDisplay)
 +
model.SetAndObserveDisplayNodeID(modelDisplay.GetID())
 +
 +
# Add to scene
 +
modelDisplay.SetAndObserveTextureImageData(e.GetOutput())
 +
scene.AddNode(model)
 +
 +
 +
transform = slicer.vtkMRMLLinearTransformNode()
 +
scene.AddNode(transform)
 +
model.SetAndObserveTransformNodeID(transform.GetID())
 +
 +
vTransform = vtk.vtkTransform()
 +
vTransform.Scale(50,50,50)
 +
vTransform.RotateX(30)
 +
transform.SetAndObserveMatrixTransformToParent(vTransform.GetMatrix())

Revision as of 16:55, 14 March 2014

Home < Documentation < Nightly < ScriptRepository


For the latest Slicer documentation, visit the read-the-docs.



Community-contributed modules

Usage: save the .py file to a directory, add the directory to the additional module paths in the Slicer application settings (choose in the menu: Edit / Application settings, click Modules, click >> next to Additional module paths, click Add, and choose the .py file's location).

Segmentation

  • FillRoi.py: Fill a region of interest in a labelmap volume with a constant value. This can be used after an automatic segmentation for removing certain regions of a volume.

Filters

DICOM

Informatics

  • MarkupsInfo.py: Compute the total length between all the points of a markup list.
  • LineProfile.py: Compute intensity profile in a volume along a line.

Community-contributed examples

Usage: Copy-paste the shown code lines or linked .py file contents into Python console in Slicer.

Capture

  • Get a MRML node in the scene based on the node name and call methods of that object. For the MRHead sample data:
 vol=slicer.util.getNode('MR*')
 vol.GetImageData().GetDimensions()
  • Capture the full Slicer screen and save it into a file
 img = qt.QPixmap.grabWidget(slicer.util.mainWindow()).toImage()
 img.save('c:/tmp/test.png')

Launching Slicer

  • How to open an .mrb file with Slicer at the command line?
 Slicer.exe --python-code "slicer.util.loadScene( 'f:/2013-08-23-Scene.mrb' )"
  • How to run a script in the Slicer environment in batch mode (without showing any graphical user interface)?
 Slicer.exe --python-code "doSomething; doSomethingElse; etc." --testing --no-splash --no-main-window

DICOM

  • How to access tags of DICOM images imported into Slicer? For example, to print the first patient's first study's first series' "0020,0032" field:
 db=slicer.dicomDatabase
 patientList=db.patients()
 studyList=db.studiesForPatient(patientList[0])
 seriesList=db.seriesForStudy(studyList[0])
 fileList=db.filesForSeries(seriesList[0])
 print db.fileValue(fileList[0],'0020,0032')

Toolbar functions

  • How to turn on slice intersections in the crosshair menu on the toolbar:
 viewNodes = slicer.mrmlScene.GetNodesByClass('vtkMRMLSliceCompositeNode')
 viewNodes.UnRegister(slicer.mrmlScene)
 viewNodes.InitTraversal()
 viewNode = viewNodes.GetNextItemAsObject()
 while viewNode:
   viewNode.SetSliceIntersectionVisibility(1)
   viewNode = viewNodes.GetNextItemAsObject()

How to find similar functions? For this one I searched for "slice intersections" text in the whole slicer source code, found that the function is implemented in Base\QTGUI\qSlicerViewersToolBar.cxx, then translated the qSlicerViewersToolBarPrivate::setSliceIntersectionVisible(bool visible) method to Python.

Manipulating objects in the slice viewer

  • How to define/edit a circular region of interest in a slice viewer?

Drop two markup points on a slice view and copy-paste the code below into the Python console. After this, as you move the markups you’ll see a circle following the markups.

 # Update the sphere from the fiducial points
 def UpdateSphere(param1, param2):  
   centerPointCoord = [0.0, 0.0, 0.0]
   markups.GetNthFiducialPosition(0,centerPointCoord)
   circumferencePointCoord = [0.0, 0.0, 0.0]
   markups.GetNthFiducialPosition(1,circumferencePointCoord)
   sphere.SetCenter(centerPointCoord)
   radius=math.sqrt((centerPointCoord[0]-circumferencePointCoord[0])**2+(centerPointCoord[1]-circumferencePointCoord[1])**2+(centerPointCoord[2]-circumferencePointCoord[2])**2)
   sphere.SetRadius(radius)
   sphere.SetPhiResolution(30)
   sphere.SetThetaResolution(30)
   sphere.Update()
 
 # Get a reference to the markup
 markups=slicer.util.getNode('F')
 # Create the sphere that will intersect the slice viewer
 sphere = vtk.vtkSphereSource()
 # Initial positioning of the sphere
 UpdateSphere(0,0)
 # Create model node and add to scene
 model = slicer.vtkMRMLModelNode()
 model.SetAndObservePolyData(sphere.GetOutput())
 modelDisplay = slicer.vtkMRMLModelDisplayNode()
 modelDisplay.SetSliceIntersectionVisibility(True) # Show in slice view
 modelDisplay.SetVisibility(False) # Hide in 3D view
 slicer.mrmlScene.AddNode(modelDisplay)
 model.SetAndObserveDisplayNodeID(modelDisplay.GetID())
 modelDisplay.SetInputPolyData(model.GetPolyData())
 slicer.mrmlScene.AddNode(model) 
 # Call UpdateSphere whenever the fiducials are changed
 markups.AddObserver("ModifiedEvent", UpdateSphere, 2)

Add a texture mapped plane to the scene as a model

  1. note that model textures are not exposed in the GUI and are not saved in the scene
  1. use dummy image data here

e = vtk.vtkImageEllipsoidSource()

scene = slicer.mrmlScene

  1. Create model node

model = slicer.vtkMRMLModelNode() model.SetScene(scene) model.SetName(scene.GenerateUniqueName("2DImageModel"))

planeSource = vtk.vtkPlaneSource() model.SetAndObservePolyData(planeSource.GetOutput())

  1. Create display node

modelDisplay = slicer.vtkMRMLModelDisplayNode() modelDisplay.SetColor(1,1,0) # yellow modelDisplay.SetBackfaceCulling(0) modelDisplay.SetScene(scene) scene.AddNode(modelDisplay) model.SetAndObserveDisplayNodeID(modelDisplay.GetID())

  1. Add to scene

modelDisplay.SetAndObserveTextureImageData(e.GetOutput()) scene.AddNode(model)


transform = slicer.vtkMRMLLinearTransformNode() scene.AddNode(transform) model.SetAndObserveTransformNodeID(transform.GetID())

vTransform = vtk.vtkTransform() vTransform.Scale(50,50,50) vTransform.RotateX(30) transform.SetAndObserveMatrixTransformToParent(vTransform.GetMatrix())