<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.slicer.org/w/index.php?action=history&amp;feed=atom&amp;title=Documentation%2F4.6%2FDevelopers%2FSlice_Orientation_Presets</id>
	<title>Documentation/4.6/Developers/Slice Orientation Presets - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.slicer.org/w/index.php?action=history&amp;feed=atom&amp;title=Documentation%2F4.6%2FDevelopers%2FSlice_Orientation_Presets"/>
	<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=Documentation/4.6/Developers/Slice_Orientation_Presets&amp;action=history"/>
	<updated>2026-04-19T06:15:54Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.33.0</generator>
	<entry>
		<id>https://www.slicer.org/w/index.php?title=Documentation/4.6/Developers/Slice_Orientation_Presets&amp;diff=47480&amp;oldid=prev</id>
		<title>UpdateBot: Nightly -&gt; 4.6</title>
		<link rel="alternate" type="text/html" href="https://www.slicer.org/w/index.php?title=Documentation/4.6/Developers/Slice_Orientation_Presets&amp;diff=47480&amp;oldid=prev"/>
		<updated>2016-11-07T06:29:32Z</updated>

		<summary type="html">&lt;p&gt;Nightly -&amp;gt; 4.6&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
Slicer provides an API to manage slice orientation presets.&lt;br /&gt;
&lt;br /&gt;
By default, three slice orientation presets representing the [[Coordinate_systems#Anatomical_coordinate_system|anatomical coordinate system]] are available in Slicer: &amp;lt;code&amp;gt;Axial&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Coronal&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Sagittal&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Feature originally integrated to Slicer core in [http://viewvc.slicer.org/viewvc.cgi/Slicer4?view=revision&amp;amp;revision=25171 r25171] and contributed by:&lt;br /&gt;
* Davide Punzo (Kapteyn astronomical institute)&lt;br /&gt;
* Jean-Christophe Fillion-Robin (Kitware)&lt;br /&gt;
* Andras Lasso (PerkLab, Queen's University). &lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
The [{{doxygen-class-url|vtkMRMLSliceNode}} vtkMRMLSliceNode] class provides the following API for managing slice orientation presets:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bool SetOrientationToAxial()&lt;br /&gt;
bool SetOrientationToSagittal()&lt;br /&gt;
bool SetOrientationToCoronal()&lt;br /&gt;
&lt;br /&gt;
std::string GetOrientation()&lt;br /&gt;
bool SetOrientation(const char* orientation)&lt;br /&gt;
&lt;br /&gt;
std::string GetOrientation(vtkMatrix4x4* sliceToRAS)&lt;br /&gt;
vtkMatrix4x4 *GetSliceToRAS()&lt;br /&gt;
void SetSliceToRAS(vtkMatrix4x4* sliceToRAS)&lt;br /&gt;
&lt;br /&gt;
bool AddSliceOrientationPreset(const std::string &amp;amp;name, vtkMatrix3x3 *orientationMatrix)&lt;br /&gt;
bool RemoveSliceOrientationPreset(const std::string&amp;amp; name)&lt;br /&gt;
bool RenameSliceOrientationPreset(const std::string&amp;amp; name, const std::string&amp;amp; updatedName)&lt;br /&gt;
bool HasSliceOrientationPreset(const std::string&amp;amp; name)&lt;br /&gt;
&lt;br /&gt;
vtkMatrix3x3 *GetSliceOrientationPreset(const std::string&amp;amp; name)&lt;br /&gt;
std::string GetSliceOrientationPresetName(vtkMatrix3x3* orientationMatrix)&lt;br /&gt;
&lt;br /&gt;
void GetSliceOrientationPresetNames(vtkStringArray* presetOrientationNames)&lt;br /&gt;
&lt;br /&gt;
int GetNumberOfSliceOrientationPresets() const&lt;br /&gt;
&lt;br /&gt;
# Convenience static methods&lt;br /&gt;
static void InitializeAxialMatrix(vtkMatrix3x3* orientationMatrix)&lt;br /&gt;
static void InitializeSagittalMatrix(vtkMatrix3x3* orientationMatrix)&lt;br /&gt;
static void InitializeCoronalMatrix(vtkMatrix3x3* orientationMatrix)&lt;br /&gt;
static void AddDefaultSliceOrientationPresets(vtkMRMLScene* scene)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
&lt;br /&gt;
=== Where are slice orientation presets stored ? ===&lt;br /&gt;
&lt;br /&gt;
Every &amp;lt;code&amp;gt;vtkMRMLSliceNode&amp;lt;/code&amp;gt; contains an ordered list of &amp;lt;code&amp;gt;(orientationPresetName, orientationMatrix)&amp;lt;/code&amp;gt; tuples.&lt;br /&gt;
&lt;br /&gt;
The list is automatically initialized with the list of default presets each time a node is created using &amp;lt;code&amp;gt;vtkMRMLScene::CreateNodeByClass(const char* className)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Where are default presets defined ? ===&lt;br /&gt;
&lt;br /&gt;
Each time &amp;lt;code&amp;gt;vtkMRMLApplicationLogic::SetMRMLScene&amp;lt;/code&amp;gt; is invoked, method &amp;lt;code&amp;gt;vtkMRMLSliceNode::AddDefaultSliceOrientationPresets(vtkMRMLScene *scene)&amp;lt;/code&amp;gt;  is called.&lt;br /&gt;
&lt;br /&gt;
Then, method &amp;lt;code&amp;gt;vtkMRMLSliceNode::AddDefaultSliceOrientationPresets(vtkMRMLScene *scene)&amp;lt;/code&amp;gt; ends up adding a default [{{doxygen-class-url|vtkMRMLSliceNode}} vtkMRMLSliceNode] that will be used a template each time &amp;lt;code&amp;gt;vtkMRMLScene::CreateNodeByClass(const char* className)&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Why default presets are not added in the vtkMRMLSliceNode contructor ? ===&lt;br /&gt;
&lt;br /&gt;
Associating the list of default presets to the default &amp;lt;code&amp;gt;vtkMRMLSliceNode&amp;lt;/code&amp;gt; allows to customize the template once and ensure any new node created using &amp;lt;code&amp;gt;vtkMRMLScene::CreateNodeByClass(const char* className)&amp;lt;/code&amp;gt; will have the expected list of presets.&lt;br /&gt;
&lt;br /&gt;
=== How to ensure slice orientation presets are defined in unit tests ? ===&lt;br /&gt;
&lt;br /&gt;
When writing tests that depend on &amp;lt;code&amp;gt;MRMLLogic&amp;lt;/code&amp;gt;, instantiating [{{doxygen-class-url|vtkMRMLApplicationLogic}} vtkMRMLApplicationLogic] is sufficient:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vtkNew&amp;lt;vtkMRMLScene&amp;gt; scene;&lt;br /&gt;
vtkNew&amp;lt;vtkMRMLApplicationLogic&amp;gt; appLogic;&lt;br /&gt;
appLogic-&amp;gt;SetMRMLScene(scene.GetPointer());&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When writing test within that only depend on &amp;lt;code&amp;gt;MRMLCore&amp;lt;/code&amp;gt;, the static method &amp;lt;code&amp;gt;vtkMRMLSliceNode::AddDefaultSliceOrientationPresets(vtkMRMLScene *scene)&amp;lt;/code&amp;gt; is available:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vtkNew&amp;lt;vtkMRMLScene&amp;gt; scene;&lt;br /&gt;
vtkMRMLSliceNode::AddDefaultSliceOrientationPresets(scene.GetPointer());&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== How to instantiate a new vtkMRMLSliceNode ? ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vtkMRMLSliceNode* sliceNode = scene-&amp;gt;CreateNodeByClass(&amp;quot;vtkMRMLSliceNode&amp;quot;);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== What is &amp;quot;Reformat&amp;quot; orientation ? ===&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Reformat&amp;quot; is a reserved orientation name describing an arbitrary orientation matrix that do not correspond to an existing orientation preset.&lt;br /&gt;
&lt;br /&gt;
This means that a preset can '''NOT''' be named &amp;quot;Reformat&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== How to modify and set the orientation presets in Extensions ? ===&lt;br /&gt;
&lt;br /&gt;
Given an extension XXX, it is possible to set, globally, the orientation presets for the SliceNode using: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  vtkSmartPointer&amp;lt;vtkMRMLNode&amp;gt; defaultNode = vtkMRMLSliceNode::SafeDownCast&lt;br /&gt;
      (this-&amp;gt;mrmlScene()-&amp;gt;GetDefaultNodeByClass(&amp;quot;vtkMRMLSliceNode&amp;quot;));&lt;br /&gt;
  if (!defaultNode)&lt;br /&gt;
    {&lt;br /&gt;
    vtkMRMLNode * foo = this-&amp;gt;mrmlScene()-&amp;gt;CreateNodeByClass(&amp;quot;vtkMRMLSliceNode&amp;quot;);&lt;br /&gt;
    defaultNode.TakeReference(foo);&lt;br /&gt;
    this-&amp;gt;mrmlScene()-&amp;gt;AddDefaultNode(defaultNode);&lt;br /&gt;
    }&lt;br /&gt;
  vtkMRMLSliceNode * defaultSliceNode = vtkMRMLSliceNode::SafeDownCast(defaultNode);&lt;br /&gt;
  defaultSliceNode-&amp;gt;RenameSliceOrientationPreset(&amp;quot;Axial&amp;quot;, &amp;quot;XZ&amp;quot;);&lt;br /&gt;
  defaultSliceNode-&amp;gt;RemoveSliceOrientationPreset(&amp;quot;Sagittal&amp;quot;);&lt;br /&gt;
  etc..&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To be noted is that SliceNodes already instantiated must be updated as follow: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  vtkSmartPointer&amp;lt;vtkCollection&amp;gt; sliceNodes = vtkSmartPointer&amp;lt;vtkCollection&amp;gt;::Take&lt;br /&gt;
      (this-&amp;gt;mrmlScene()-&amp;gt;GetNodesByClass(&amp;quot;vtkMRMLSliceNode&amp;quot;));&lt;br /&gt;
&lt;br /&gt;
  for(int i = 0; i &amp;lt; sliceNodes-&amp;gt;GetNumberOfItems(); i++)&lt;br /&gt;
    {&lt;br /&gt;
    vtkMRMLSliceNode* sliceNode =&lt;br /&gt;
        vtkMRMLSliceNode::SafeDownCast(sliceNodes-&amp;gt;GetItemAsObject(i));&lt;br /&gt;
    if (sliceNode)&lt;br /&gt;
      {&lt;br /&gt;
      sliceNode-&amp;gt;DisableModifiedEventOn();&lt;br /&gt;
      sliceNode-&amp;gt;RenameSliceOrientationPreset(&amp;quot;Axial&amp;quot;, &amp;quot;XZ&amp;quot;);&lt;br /&gt;
      sliceNode-&amp;gt;RemoveSliceOrientationPreset(&amp;quot;Sagittal&amp;quot;);&lt;br /&gt;
      etc...&lt;br /&gt;
      sliceNode-&amp;gt;DisableModifiedEventOff();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>UpdateBot</name></author>
		
	</entry>
</feed>