Slicer 5.9
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
Loading...
Searching...
No Matches
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
77
85
88
90 void ReadXMLAttributes(const char** atts) override;
91
93 void WriteXML(ostream& of, int indent) override;
94
96 void CopyContent(vtkMRMLNode* node, bool deepCopy = true) override;
97
99 const char* GetNodeTagName() override { return "SequenceBrowser"; };
100
103 std::string SetAndObserveMasterSequenceNodeID(const char* sequenceNodeID);
106
108 std::string AddSynchronizedSequenceNode(const char* synchronizedSequenceNodeId);
109
111 std::string AddSynchronizedSequenceNodeID(const char* synchronizedSequenceNodeId);
112
114 std::string AddSynchronizedSequenceNode(vtkMRMLSequenceNode* synchronizedSequenceNode);
115
117 void RemoveSynchronizedSequenceNode(const char* nodeId);
118
121
123
124 void GetSynchronizedSequenceNodes(std::vector<vtkMRMLSequenceNode*>& synchronizedDataNodes, bool includeMasterNode = false);
125 void GetSynchronizedSequenceNodes(vtkCollection* synchronizedDataNodes, bool includeMasterNode = false);
127
129 int GetNumberOfSynchronizedSequenceNodes(bool includeMasterNode = false);
130
132 bool IsSynchronizedSequenceNode(const char* sequenceNodeId, bool includeMasterNode = false);
133
135
136 bool IsSynchronizedSequenceNodeID(const char* sequenceNodeId, bool includeMasterNode = false);
137 bool IsSynchronizedSequenceNode(vtkMRMLSequenceNode* sequenceNode, bool includeMasterNode = false);
139
141
142 vtkGetMacro(PlaybackActive, bool);
143 vtkSetMacro(PlaybackActive, bool);
144 vtkBooleanMacro(PlaybackActive, bool);
146
148
149 vtkGetMacro(PlaybackRateFps, double);
150 vtkSetMacro(PlaybackRateFps, double);
152
154
155 vtkGetMacro(PlaybackItemSkippingEnabled, bool);
156 vtkSetMacro(PlaybackItemSkippingEnabled, bool);
157 vtkBooleanMacro(PlaybackItemSkippingEnabled, bool);
159
161
162 vtkGetMacro(PlaybackLooped, bool);
163 vtkSetMacro(PlaybackLooped, bool);
164 vtkBooleanMacro(PlaybackLooped, bool);
166
168
169 vtkGetMacro(SelectedItemNumber, int);
170 vtkSetMacro(SelectedItemNumber, int);
172
177 bool SetSelectedItemByIndexValue(const std::string& indexValue, bool exactMatchRequired = true);
178
180
181 vtkGetMacro(RecordingActive, bool);
182 void SetRecordingActive(bool recording);
183 vtkBooleanMacro(RecordingActive, bool);
185
187
188 vtkGetMacro(RecordMasterOnly, bool);
189 vtkSetMacro(RecordMasterOnly, bool);
190 vtkBooleanMacro(RecordMasterOnly, bool);
192
194
195 vtkSetMacro(RecordingSamplingMode, int);
196 void SetRecordingSamplingModeFromString(const char* recordingSamplingModeString);
197 vtkGetMacro(RecordingSamplingMode, int);
198 virtual std::string GetRecordingSamplingModeAsString();
200
202
203 static std::string GetRecordingSamplingModeAsString(int recordingSamplingMode);
204 static int GetRecordingSamplingModeFromString(const std::string& recordingSamplingModeString);
206
208
209 static std::string GetMissingItemModeAsString(int missingItemMode);
210 static MissingItemModeType GetMissingItemModeFromString(const std::string& missingItemModeString);
212
214
215 vtkSetMacro(IndexDisplayMode, int);
216 void SetIndexDisplayModeFromString(const char* indexDisplayModeString);
217 vtkGetMacro(IndexDisplayMode, int);
218 virtual std::string GetIndexDisplayModeAsString();
220
222
223 void SetIndexDisplayFormat(std::string displayFormat);
224 vtkGetMacro(IndexDisplayFormat, std::string);
226
228
229 static std::string GetIndexDisplayModeAsString(int indexDisplayMode);
230 static int GetIndexDisplayModeFromString(const std::string& indexDisplayModeString);
232
234
235 int SelectNextItem(int selectionIncrement = 1);
239
242
244 vtkMRMLNode* AddProxyNode(vtkMRMLNode* sourceProxyNode, vtkMRMLSequenceNode* sequenceNode, bool copy = true);
245
248
251 {
252 static bool warningLogged = false;
253 if (!warningLogged)
254 {
255 vtkWarningMacro("vtkMRMLSequenceBrowserNode::GetVirtualOutputDataNode is deprecated, use vtkMRMLSequenceBrowserNode::GetProxyNode method instead");
256 warningLogged = true;
257 }
258 return this->GetProxyNode(sequenceNode);
259 }
260
262 void SetOverwriteTargetNodeName(bool overwrite)
263 {
264 static bool warningLogged = false;
265 if (!warningLogged)
266 {
267 vtkWarningMacro("vtkMRMLSequenceBrowserNode::SetOverwriteTargetNodeName is deprecated," << " use vtkMRMLSequenceBrowserNode::SetOverwriteProxyName method instead");
268 warningLogged = true;
269 }
270 this->SetOverwriteProxyName(nullptr, overwrite);
271 }
272
274 void SetDeepCopyVirtualNodes(bool deepcopy)
275 {
276 static bool warningLogged = false;
277 if (!warningLogged)
278 {
279 vtkWarningMacro("vtkMRMLSequenceBrowserNode::SetDeepCopyVirtualNodes is deprecated, use vtkMRMLSequenceBrowserNode::SetSaveChanges method instead");
280 warningLogged = true;
281 }
282 this->SetSaveChanges(nullptr, !deepcopy);
283 }
284
287
288 void GetAllProxyNodes(std::vector<vtkMRMLNode*>& nodes);
289 void GetAllProxyNodes(vtkCollection* nodes);
290
292 void GetAllVirtualOutputDataNodes(vtkCollection* nodes)
293 {
294 static bool warningLogged = false;
295 if (!warningLogged)
296 {
297 vtkWarningMacro("vtkMRMLSequenceBrowserNode::GetAllVirtualOutputDataNodes is deprecated," << " 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, const std::string& requestedFormat, const std::string& typeString);
367
368protected:
373
377
379 void OnNodeReferenceAdded(vtkMRMLNodeReference* nodeReference) override;
380
382 void OnNodeReferenceRemoved(vtkMRMLNodeReference* nodeReference) override;
383
386 std::string GetSynchronizationPostfixFromSequenceID(const char* sequenceNodeID);
387
388protected:
389 bool PlaybackActive{ false };
390 double PlaybackRateFps{ 10.0 };
392 bool PlaybackLooped{ true };
394
395 double RecordingTimeOffsetSec; // difference between universal time and index value
396 vtkSetMacro(RecordingTimeOffsetSec, double);
397 vtkGetMacro(RecordingTimeOffsetSec, double);
398
399 bool RecordingActive{ false };
400
402 vtkSetMacro(LastSaveProxyNodesStateTimeSec, double);
403 vtkGetMacro(LastSaveProxyNodesStateTimeSec, double);
404
405 bool RecordMasterOnly{ false };
409
410 // Unique postfixes for storing references to sequence nodes, proxy nodes, and properties
411 // For example, a sequence node reference role name is SEQUENCE_NODE_REFERENCE_ROLE_BASE+synchronizationPostfix
412 std::vector<std::string> SynchronizationPostfixes;
413
414 // Counter that is used for generating the unique (only for this class) proxy node postfix strings
416 vtkSetMacro(LastPostfixIndex, int);
417 vtkGetMacro(LastPostfixIndex, int);
418
419private:
420 struct SynchronizationProperties;
421 std::map<std::string, SynchronizationProperties*> SynchronizationPropertiesMap;
422 SynchronizationProperties* GetSynchronizationPropertiesForSequence(vtkMRMLSequenceNode* sequenceNode);
423 SynchronizationProperties* GetSynchronizationPropertiesForPostfix(const std::string& rolePostfix);
424};
425
426#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 CopyContent(vtkMRMLNode *node, bool deepCopy=true) override
Copy the node's attributes to this object.
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
vtkMRMLNode * CreateNodeInstance() override
Create instance of a GAD node.
std::string GetSynchronizationPostfixFromSequenceID(const char *sequenceNodeID)
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.
std::vector< std::string > SynchronizationPostfixes
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)
@ MissingItemIgnore
the proxy node is not modified
@ MissingItemDisplayHidden
if it is a vtkMRMLDisplayNode the proxy node is hidden, otherwise behaves as MissingItemIgnore
~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.