Slicer 5.9
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
vtkMRMLSequenceBrowserNode.h
Go to the documentation of this file.
1/*==============================================================================
2
3 Program: 3D Slicer
4
5 Copyright (c) Kitware Inc.
6
7 See COPYRIGHT.txt
8 or http://www.slicer.org/copyright/copyright.txt for details.
9
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
15
16 This file was originally developed by Csaba Pinter, PerkLab, Queen's University
17 and was supported through the Applied Cancer Research Unit program of Cancer Care
18 Ontario with funds provided by the Ontario Ministry of Health and Long-Term Care
19
20==============================================================================*/
21
22#ifndef __vtkMRMLSequenceBrowserNode_h
23#define __vtkMRMLSequenceBrowserNode_h
24
25#include "vtkSlicerSequencesModuleMRMLExport.h"
26
27// MRML includes
28#include <vtkMRML.h>
29#include <vtkMRMLNode.h>
30#include <vtkNew.h>
31
32// STD includes
33#include <set>
34#include <map>
35
36class vtkCollection;
38class vtkIntArray;
39
40class VTK_SLICER_SEQUENCES_MODULE_MRML_EXPORT vtkMRMLSequenceBrowserNode : public vtkMRMLNode
41{
42public:
45 void PrintSelf(ostream& os, vtkIndent indent) override;
46
48 enum
49 {
53 };
54
56 // Enum is used so that in the future more modes can be added (e.g., fixed frame rate,
57 // fixed frame rate matching playback frame rate, etc).
64
75
83
86
88 void ReadXMLAttributes( const char** atts) override;
89
91 void WriteXML(ostream& of, int indent) override;
92
94 void Copy(vtkMRMLNode *node) override;
95
97 const char* GetNodeTagName() override {return "SequenceBrowser";};
98
101 std::string SetAndObserveMasterSequenceNodeID(const char *sequenceNodeID);
104
106 std::string AddSynchronizedSequenceNode(const char* synchronizedSequenceNodeId);
107
109 std::string AddSynchronizedSequenceNodeID(const char* synchronizedSequenceNodeId);
110
112 std::string AddSynchronizedSequenceNode(vtkMRMLSequenceNode* synchronizedSequenceNode);
113
115 void RemoveSynchronizedSequenceNode(const char* nodeId);
116
119
121
122 void GetSynchronizedSequenceNodes(std::vector< vtkMRMLSequenceNode* > &synchronizedDataNodes, bool includeMasterNode=false);
123 void GetSynchronizedSequenceNodes(vtkCollection* synchronizedDataNodes, bool includeMasterNode=false);
125
127 int GetNumberOfSynchronizedSequenceNodes(bool includeMasterNode = false);
128
130 bool IsSynchronizedSequenceNode(const char* sequenceNodeId, bool includeMasterNode = false);
131
133
134 bool IsSynchronizedSequenceNodeID(const char* sequenceNodeId, bool includeMasterNode = false);
135 bool IsSynchronizedSequenceNode(vtkMRMLSequenceNode* sequenceNode, bool includeMasterNode = false);
137
139
140 vtkGetMacro(PlaybackActive, bool);
141 vtkSetMacro(PlaybackActive, bool);
142 vtkBooleanMacro(PlaybackActive, bool);
144
146
147 vtkGetMacro(PlaybackRateFps, double);
148 vtkSetMacro(PlaybackRateFps, double);
150
152
153 vtkGetMacro(PlaybackItemSkippingEnabled, bool);
154 vtkSetMacro(PlaybackItemSkippingEnabled, bool);
155 vtkBooleanMacro(PlaybackItemSkippingEnabled, bool);
157
159
160 vtkGetMacro(PlaybackLooped, bool);
161 vtkSetMacro(PlaybackLooped, bool);
162 vtkBooleanMacro(PlaybackLooped, bool);
164
166
167 vtkGetMacro(SelectedItemNumber, int);
168 vtkSetMacro(SelectedItemNumber, int);
170
175 bool SetSelectedItemByIndexValue(const std::string& indexValue, bool exactMatchRequired = true);
176
178
179 vtkGetMacro(RecordingActive, bool);
180 void SetRecordingActive(bool recording);
181 vtkBooleanMacro(RecordingActive, bool);
183
185
186 vtkGetMacro(RecordMasterOnly, bool);
187 vtkSetMacro(RecordMasterOnly, bool);
188 vtkBooleanMacro(RecordMasterOnly, bool);
190
192
193 vtkSetMacro(RecordingSamplingMode, int);
194 void SetRecordingSamplingModeFromString(const char *recordingSamplingModeString);
195 vtkGetMacro(RecordingSamplingMode, int);
196 virtual std::string GetRecordingSamplingModeAsString();
198
200
201 static std::string GetRecordingSamplingModeAsString(int recordingSamplingMode);
202 static int GetRecordingSamplingModeFromString(const std::string &recordingSamplingModeString);
204
206
207 static std::string GetMissingItemModeAsString(int missingItemMode);
208 static MissingItemModeType GetMissingItemModeFromString(const std::string& missingItemModeString);
210
212
213 vtkSetMacro(IndexDisplayMode, int);
214 void SetIndexDisplayModeFromString(const char *indexDisplayModeString);
215 vtkGetMacro(IndexDisplayMode, int);
216 virtual std::string GetIndexDisplayModeAsString();
218
220
221 void SetIndexDisplayFormat(std::string displayFormat);
222 vtkGetMacro(IndexDisplayFormat, std::string);
224
226
227 static std::string GetIndexDisplayModeAsString(int indexDisplayMode);
228 static int GetIndexDisplayModeFromString(const std::string &indexDisplayModeString);
230
232
233 int SelectNextItem(int selectionIncrement=1);
237
240
242 vtkMRMLNode* AddProxyNode(vtkMRMLNode* sourceProxyNode, vtkMRMLSequenceNode* sequenceNode, bool copy=true);
243
246
249 {
250 static bool warningLogged = false;
251 if (!warningLogged)
252 {
253 vtkWarningMacro("vtkMRMLSequenceBrowserNode::GetVirtualOutputDataNode is deprecated, use vtkMRMLSequenceBrowserNode::GetProxyNode method instead");
254 warningLogged = true;
255 }
256 return this->GetProxyNode(sequenceNode);
257 }
258
260 void SetOverwriteTargetNodeName(bool overwrite)
261 {
262 static bool warningLogged = false;
263 if (!warningLogged)
264 {
265 vtkWarningMacro("vtkMRMLSequenceBrowserNode::SetOverwriteTargetNodeName is deprecated,"
266 << " use vtkMRMLSequenceBrowserNode::SetOverwriteProxyName method instead");
267 warningLogged = true;
268 }
269 this->SetOverwriteProxyName(nullptr, overwrite);
270 }
271
273 void SetDeepCopyVirtualNodes(bool deepcopy)
274 {
275 static bool warningLogged = false;
276 if (!warningLogged)
277 {
278 vtkWarningMacro("vtkMRMLSequenceBrowserNode::SetDeepCopyVirtualNodes is deprecated, use vtkMRMLSequenceBrowserNode::SetSaveChanges method instead");
279 warningLogged = true;
280 }
281 this->SetSaveChanges(nullptr, !deepcopy);
282 }
283
286
287 void GetAllProxyNodes(std::vector< vtkMRMLNode* > &nodes);
288 void GetAllProxyNodes(vtkCollection* nodes);
289
291 void GetAllVirtualOutputDataNodes(vtkCollection* nodes)
292 {
293 static bool warningLogged = false;
294 if (!warningLogged)
295 {
296 vtkWarningMacro("vtkMRMLSequenceBrowserNode::GetAllVirtualOutputDataNodes is deprecated,"
297 << " use vtkMRMLSequenceBrowserNode::GetAllProxyNodes method instead");
298 warningLogged = true;
299 }
300 this->GetAllProxyNodes(nodes);
301 }
302
304 bool IsProxyNode(const char* nodeId);
305
307 bool IsProxyNodeID(const char* nodeId);
308
309 // TODO: Should these methods be protected? Probably the "world" shouldn't need to know about the postfixes.
310 void RemoveProxyNode(const std::string& postfix);
311
313
316
318
319 bool GetPlayback(vtkMRMLSequenceNode* sequenceNode);
320 void SetPlayback(vtkMRMLSequenceNode* sequenceNode, bool playback);
322
324
326 void SetRecording(vtkMRMLSequenceNode* sequenceNode, bool recording);
328
330
336 void SetSaveChanges(vtkMRMLSequenceNode* sequenceNode, bool save);
338
340
342 void SetOverwriteProxyName(vtkMRMLSequenceNode* sequenceNode, bool overwrite);
344
346
350 void SetMissingItemMode(vtkMRMLSequenceNode* sequenceNode, MissingItemModeType missingItemMode);
352
354 void ProcessMRMLEvents( vtkObject *caller, unsigned long event, void *callData ) override;
355
357 virtual void SaveProxyNodesState();
358
361 std::string GetFormattedIndexValue(int index);
362
366 static bool ValidateFormatString(std::string& validatedFormat, std::string& prefix, std::string& suffix,
367 const std::string& requestedFormat, const std::string& typeString);
368
369protected:
374
378
380 void OnNodeReferenceAdded(vtkMRMLNodeReference* nodeReference) override;
381
383 void OnNodeReferenceRemoved(vtkMRMLNodeReference* nodeReference) override;
384
387 std::string GetSynchronizationPostfixFromSequenceID(const char* sequenceNodeID);
388
389protected:
390 bool PlaybackActive{false};
391 double PlaybackRateFps{10.0};
393 bool PlaybackLooped{true};
395
396 bool RecordingActive{false};
397 double RecordingTimeOffsetSec; // difference between universal time and index value
399 bool RecordMasterOnly{false};
403
404 // Unique postfixes for storing references to sequence nodes, proxy nodes, and properties
405 // For example, a sequence node reference role name is SEQUENCE_NODE_REFERENCE_ROLE_BASE+synchronizationPostfix
406 std::vector< std::string > SynchronizationPostfixes;
407
408 // Counter that is used for generating the unique (only for this class) proxy node postfix strings
410
411private:
412 struct SynchronizationProperties;
413 std::map< std::string, SynchronizationProperties* > SynchronizationPropertiesMap;
414 SynchronizationProperties* GetSynchronizationPropertiesForSequence(vtkMRMLSequenceNode* sequenceNode);
415 SynchronizationProperties* GetSynchronizationPropertiesForPostfix(const std::string& rolePostfix);
416};
417
418#endif
Class to hold information about a node reference.
void ReadXMLAttributes(const char **atts) override
Set node attributes from name/value pairs.
void GetSynchronizedSequenceNodes(std::vector< vtkMRMLSequenceNode * > &synchronizedDataNodes, bool includeMasterNode=false)
Returns all synchronized sequence nodes (does not include the master sequence node)
void RemoveAllSequenceNodes()
Remove all sequence nodes (including the master sequence node)
virtual std::string GetIndexDisplayModeAsString()
std::string AddSynchronizedSequenceNodeID(const char *synchronizedSequenceNodeId)
Adds a node for synchronized browsing. Returns the new proxy node postfix.
void SetRecordingActive(bool recording)
bool GetOverwriteProxyName(vtkMRMLSequenceNode *sequenceNode)
Overwrite proxy node name with name automatically generated from sequence base name and current item ...
void GetAllProxyNodes(std::vector< vtkMRMLNode * > &nodes)
void WriteXML(ostream &of, int indent) override
Write this node's information to a MRML file in XML format.
void OnNodeReferenceRemoved(vtkMRMLNodeReference *nodeReference) override
Called whenever a node reference is removed.
const char * GetNodeTagName() override
Get unique node XML tag name (like Volume, Model)
std::string AddSynchronizedSequenceNode(vtkMRMLSequenceNode *synchronizedSequenceNode)
Adds a node for synchronized browsing. Returns the new proxy node postfix.
vtkMRMLSequenceBrowserNode(const vtkMRMLSequenceBrowserNode &)
void PrintSelf(ostream &os, vtkIndent indent) override
void Copy(vtkMRMLNode *node) override
Copy the node's attributes to this object.
vtkMRMLNode * CreateNodeInstance() override
Create instance of a GAD node.
std::string GetSynchronizationPostfixFromSequenceID(const char *sequenceNodeID)
std::vector< std::string > SynchronizationPostfixes
static MissingItemModeType GetMissingItemModeFromString(const std::string &missingItemModeString)
void SetRecording(vtkMRMLSequenceNode *sequenceNode, bool recording)
void SetDeepCopyVirtualNodes(bool deepcopy)
Deprecated method!
void SetIndexDisplayModeFromString(const char *indexDisplayModeString)
bool IsSynchronizedSequenceNode(const char *sequenceNodeId, bool includeMasterNode=false)
Deprecated. Use IsSynchronizedSequenceNodeID instead.
void ProcessMRMLEvents(vtkObject *caller, unsigned long event, void *callData) override
Process MRML node events for recording of the proxy nodes.
void GetAllVirtualOutputDataNodes(vtkCollection *nodes)
Deprecated method!
bool SetSelectedItemByIndexValue(const std::string &indexValue, bool exactMatchRequired=true)
virtual std::string GetRecordingSamplingModeAsString()
void GetSynchronizedSequenceNodes(vtkCollection *synchronizedDataNodes, bool includeMasterNode=false)
void OnNodeReferenceAdded(vtkMRMLNodeReference *nodeReference) override
Called whenever a new node reference is added.
void SetOverwriteProxyName(vtkMRMLSequenceNode *sequenceNode, bool overwrite)
static std::string GetRecordingSamplingModeAsString(int recordingSamplingMode)
Helper functions for converting between string and code representation of recording sampling modes.
vtkMRMLNode * GetVirtualOutputDataNode(vtkMRMLSequenceNode *sequenceNode)
Deprecated method!
std::string GetFormattedIndexValue(int index)
int SelectNextItem(int selectionIncrement=1)
Selects a sequence item for display, returns current selected item number.
bool GetSaveChanges(vtkMRMLSequenceNode *sequenceNode)
int GetNumberOfItems()
Returns number of items in the sequence (number of data nodes in master sequence node)
bool GetRecording(vtkMRMLSequenceNode *sequenceNode)
Add new items to the sequence when sequence recording is activated.
bool IsProxyNodeID(const char *nodeId)
Returns true if the nodeId belongs to a proxy node managed by this browser node.
vtkMRMLNode * GetProxyNode(vtkMRMLSequenceNode *sequenceNode)
Get proxy corresponding to a sequence node.
bool IsProxyNode(const char *nodeId)
Deprecated. Use IsProxyNodeID instead.
void SetPlayback(vtkMRMLSequenceNode *sequenceNode, bool playback)
void operator=(const vtkMRMLSequenceBrowserNode &)
vtkMRMLSequenceNode * GetSequenceNode(vtkMRMLNode *proxyNode)
Get sequence node corresponding to a proxy node.
std::string AddSynchronizedSequenceNode(const char *synchronizedSequenceNodeId)
Deprecated. Use AddSynchronizedSequenceNodeID instead.
void SetMissingItemMode(vtkMRMLSequenceNode *sequenceNode, MissingItemModeType missingItemMode)
MissingItemModeType GetMissingItemMode(vtkMRMLSequenceNode *sequenceNode)
bool IsAnySequenceNodeRecording()
Returns true if any of the sequence node is allowed to record.
void SetSaveChanges(vtkMRMLSequenceNode *sequenceNode, bool save)
bool GetPlayback(vtkMRMLSequenceNode *sequenceNode)
Update the proxy node with the content of the sequence.
static std::string GetMissingItemModeAsString(int missingItemMode)
Helper functions for converting between string and code representation of recording sampling modes.
int GetNumberOfSynchronizedSequenceNodes(bool includeMasterNode=false)
Returns number of synchronized sequence nodes.
void GetAllProxyNodes(vtkCollection *nodes)
void RemoveSynchronizedSequenceNode(const char *nodeId)
Removes a node from synchronized browsing.
static vtkMRMLSequenceBrowserNode * New()
static int GetRecordingSamplingModeFromString(const std::string &recordingSamplingModeString)
bool IsSynchronizedSequenceNodeID(const char *sequenceNodeId, bool includeMasterNode=false)
Returns true if the node is selected for synchronized browsing.
std::string GetSynchronizationPostfixFromSequence(vtkMRMLSequenceNode *sequenceNode)
void SetIndexDisplayFormat(std::string displayFormat)
Get/set format of index value display (used if index type is numeric)
IndexDisplayModeType
Modes displaying index for the user.
void RemoveProxyNode(const std::string &postfix)
static int GetIndexDisplayModeFromString(const std::string &indexDisplayModeString)
@ MissingItemSetToDefault
the proxy node is set to the default (empty) node; new item is not created
@ MissingItemCreateFromPrevious
previous item is used for initializing the new item (this is the default mode)
@ MissingItemCreateFromDefault
the new item is created from the default node (typically an empty node)
~vtkMRMLSequenceBrowserNode() override
void SetRecordingSamplingModeFromString(const char *recordingSamplingModeString)
static std::string GetIndexDisplayModeAsString(int indexDisplayMode)
Helper functions for converting between string and code representation of index display modes.
bool IsSynchronizedSequenceNode(vtkMRMLSequenceNode *sequenceNode, bool includeMasterNode=false)
void SetOverwriteTargetNodeName(bool overwrite)
Deprecated method!
vtkMRMLSequenceNode * GetMasterSequenceNode()
Get the sequence data node.
std::string SetAndObserveMasterSequenceNodeID(const char *sequenceNodeID)
virtual void SaveProxyNodesState()
Save state of all proxy nodes that recording is enabled for.
std::string GenerateSynchronizationPostfix()
vtkMRMLNode * AddProxyNode(vtkMRMLNode *sourceProxyNode, vtkMRMLSequenceNode *sequenceNode, bool copy=true)
Adds proxy nodes from another scene (typically from the main scene). The data node is optionally copi...
RecordingSamplingModeType
Modes for determining recording frame rate.
static bool ValidateFormatString(std::string &validatedFormat, std::string &prefix, std::string &suffix, const std::string &requestedFormat, const std::string &typeString)
MRML node for representing a sequence of MRML nodes.