15#ifndef __vtkMRMLNode_h
16#define __vtkMRMLNode_h
21#include "vtkIdTypeArray.h"
22#include "vtkIntArray.h"
29#include <vtkSmartPointer.h>
30#include <vtkWeakPointer.h>
31class vtkCallbackCommand;
34#include <vtkLoggingMacros.h>
45#ifndef vtkSetMRMLObjectMacro
46#define vtkSetMRMLObjectMacro(node,value) {this->MRMLObserverManager->SetObject ( vtkObjectPointer( &(node)), (value) );};
50#ifndef vtkSetAndObserveMRMLObjectMacro
51#define vtkSetAndObserveMRMLObjectMacro(node,value) {this->MRMLObserverManager->SetAndObserveObject ( vtkObjectPointer( &(node)), (value) );};
54#ifndef vtkSetAndObserveMRMLObjectMacroNoWarning
55#define vtkSetAndObserveMRMLObjectMacroNoWarning(node,value) {this->MRMLObserverManager->SetAndObserveObject ( vtkObjectPointer( &(node)), (value), 0.0, false );};
58#ifndef vtkSetAndObserveMRMLObjectEventsMacro
59#define vtkSetAndObserveMRMLObjectEventsMacro(node,value,events) {this->MRMLObserverManager->SetAndObserveObjectEvents ( vtkObjectPointer( &(node)), (value), (events));};
62#ifndef vtkSetAndObserveMRMLObjectEventsMacroNoWarning
63#define vtkSetAndObserveMRMLObjectEventsMacroNoWarning(node,value,events) {this->MRMLObserverManager->SetAndObserveObjectEvents ( vtkObjectPointer( &(node)), (value), (events), nullptr , false );};
66#ifndef vtkObserveMRMLObjectMacro
67#define vtkObserveMRMLObjectMacro(node) {this->MRMLObserverManager->ObserveObject ( (node) );};
70#ifndef vtkObserveMRMLObjectEventMacro
71#define vtkObserveMRMLObjectEventMacro(node, event) {this->MRMLObserverManager->AddObjectEvent ( (node), (event) );};
74#ifndef vtkObserveMRMLObjectEventMacroNoWarning
75#define vtkObserveMRMLObjectEventMacroNoWarning(node, event) {this->MRMLObserverManager->AddObjectEvent ( (node), (event), 0.0, false );};
78#ifndef vtkObserveMRMLObjectEventsMacro
79#define vtkObserveMRMLObjectEventsMacro(node, events) {this->MRMLObserverManager->AddObjectEvents ( (node), (events) );};
82#ifndef vtkUnObserveMRMLObjectMacro
83#define vtkUnObserveMRMLObjectMacro(node) {this->MRMLObserverManager->RemoveObjectEvents ( (node) );};
86#ifndef vtkSetReferenceStringBodyMacro
87#define vtkSetReferenceStringBodyMacro(name) \
88 vtkDebugMacro(<< this->GetClassName() << " (" << this << "): setting " << #name " to " << (_arg?_arg:"(null)") ); \
89 if ( this->name == nullptr && _arg == nullptr) { return;} \
90 if ( this->name && _arg && (!strcmp(this->name,_arg))) { return;} \
91 std::string oldValue; \
92 if (this->name) { oldValue = this->name; delete [] this->name; } \
95 size_t n = strlen(_arg) + 1; \
96 char *cp1 = new char[n]; \
97 const char *cp2 = (_arg); \
99 do { *cp1++ = *cp2++; } while ( --n ); \
103 this->name = nullptr; \
106 if (this->Scene && this->name) \
108 if (oldValue.size() > 0) \
110 this->Scene->RemoveReferencedNodeID(oldValue.c_str(), this); \
112 this->Scene->AddReferencedNodeID(this->name, this); \
87#define vtkSetReferenceStringBodyMacro(name) \ …
116#ifndef vtkSetReferenceStringMacro
117#define vtkSetReferenceStringMacro(name) \
118virtual void Set##name (const char* _arg) \
120 vtkSetReferenceStringBodyMacro(name)\
117#define vtkSetReferenceStringMacro(name) \ …
124#ifndef vtkCxxSetReferenceStringMacro
125#define vtkCxxSetReferenceStringMacro(class,name) \
126void class::Set##name (const char* _arg) \
128 vtkSetReferenceStringBodyMacro(name); \
125#define vtkCxxSetReferenceStringMacro(class,name) \ …
132#ifndef vtkMRMLNodeNewMacro
133#define vtkMRMLNodeNewMacro(newClass) \
134 vtkStandardNewMacro(newClass); \
135 vtkMRMLNode* newClass::CreateNodeInstance() \
137 return newClass::New(); \
133#define vtkMRMLNodeNewMacro(newClass) \ …
149#ifndef vtkMRMLCopyContentMacro
150#define vtkMRMLCopyContentMacro(thisClassName) \
151 void CopyContent(vtkMRMLNode* node, bool deepCopy=true) override; \
152 bool HasCopyContent() const override \
154 return strcmp(#thisClassName, this->GetClassNameInternal()) == 0; \
150#define vtkMRMLCopyContentMacro(thisClassName) \ …
162#ifndef vtkMRMLCopyContentDefaultMacro
163#define vtkMRMLCopyContentDefaultMacro(thisClassName) \
164 bool HasCopyContent() const override \
166 return strcmp(#thisClassName, this->GetClassNameInternal()) == 0; \
163#define vtkMRMLCopyContentDefaultMacro(thisClassName) \ …
319 return disabledModify;
329 virtual int EndModify(
int previousDisableModifiedEventState)
332 if (!previousDisableModifiedEventState)
336 return this->ModifiedEventPending;
329 virtual int EndModify(
int previousDisableModifiedEventState) {
…}
425 vtkGetStringMacro(
ID);
453 vtkSetStringMacro(SingletonTag);
454 vtkGetStringMacro(SingletonTag);
480 vtkGetMacro(DisableModifiedEvent,
int);
483 this->DisableModifiedEvent = onOff;
499 vtkGetMacro(ModifiedEventPending,
int);
508 std::map< int, int >::iterator it = this->CustomModifiedEventPending.find(eventId);
509 if (it == this->CustomModifiedEventPending.end())
536 Superclass::Modified();
540 ++this->ModifiedEventPending;
553 int oldModifiedEventPending = 0;
555 if ( this->ModifiedEventPending )
557 oldModifiedEventPending += this->ModifiedEventPending;
558 this->ModifiedEventPending = 0;
559 Superclass::Modified();
562 if (!this->CustomModifiedEventPending.empty())
567 std::vector<int> customEventsToInvoke;
568 for (std::map< int, int >::iterator it=this->CustomModifiedEventPending.begin(); it!=this->CustomModifiedEventPending.end(); ++it)
570 oldModifiedEventPending += it->second;
571 customEventsToInvoke.push_back(it->first);
573 this->CustomModifiedEventPending.clear();
574 for (std::vector<int>::iterator it=customEventsToInvoke.begin(); it!=customEventsToInvoke.end(); ++it)
576 this->InvokeEvent(*it);
579 return oldModifiedEventPending;
599 this->InvokeEvent(eventId, callData);
605 ++this->CustomModifiedEventPending[eventId];
690 vtkIntArray *events=
nullptr,
bool observeContentModifiedEvents=
false);
813 std::vector<const char*> &referencedNodeIDs);
916 void PrintSelf(ostream& vtkNotUsed(os), vtkIndent vtkNotUsed(indent))
override {};
944 bool SetProperty(
const std::string& key,
const std::string& value);
995 unsigned long eid,
void *clientData,
void *callData );
999 vtkSetStringMacro( TempURLString );
1000 vtkGetStringMacro( TempURLString );
1045 vtkIntArray *newEvents,
bool newObserveContentModifiedEvents,
vtkMRMLNodeReference* referenceToIgnore);
1053 vtkIntArray* oldConsolidatedEventList, vtkIntArray* newConsolidatedEventList,
1055 vtkMRMLNodeReference* referenceToIgnore, vtkIntArray* newEvents,
bool newObserveContentModifiedEvents);
1141 void SetID(
const char* newID);
1144 char *TempURLString{
nullptr};
1146 char *SingletonTag{
nullptr};
1148 int DisableModifiedEvent{0};
1149 int ModifiedEventPending{0};
1150 std::map<int, int> CustomModifiedEventPending;
1171 this->WasModifying = this->Node->StartModify();
1178 this->Node->EndModify(this->WasModifying);
MRMLNodeModifyBlocker(vtkMRMLNode *node)
vtkWeakPointer< vtkMRMLNode > Node
Class to hold information about a node reference.
void SetReferencingNode(vtkMRMLNode *node)
vtkIntArray * GetStaticEvents() const
bool SetProperty(const std::string &key, const std::string &value)
Set the properties of the reference.
void PrintSelf(ostream &vtkNotUsed(os), vtkIndent vtkNotUsed(indent)) override
vtkMRMLNodeReference(const vtkMRMLNodeReference &)
ContentModifiedObserveType ObserveContentModifiedEvents
vtkWeakPointer< vtkMRMLNode > ReferencingNode
Points to this MRML node (that added the reference)
void SetProperties(const ReferencePropertiesType &properties)
~vtkMRMLNodeReference() override
vtkSmartPointer< vtkIntArray > StaticEvents
Events that should be observed.
void SetReferencedNode(vtkMRMLNode *node)
static vtkMRMLNodeReference * New()
ReferencePropertiesType Properties
vtkMRMLNode * GetReferencingNode() const
char * ReferenceRole
Name of the reference role.
vtkMRMLNode * GetReferencedNode() const
bool RemoveProperty(const std::string &key)
Remove a property from the reference.
bool ClearProperties()
Remove all properties from the reference.
std::string GetProperty(const std::string &key) const
Get the properties of the reference.
void SetStaticEvents(vtkIntArray *events)
Set the events that will be observed when the referenced node will be available.
vtkSmartPointer< vtkMRMLNode > ReferencedNode
The referenced node that is actually observed now.
void operator=(const vtkMRMLNodeReference &)
const ReferencePropertiesType * GetProperties() const
Abstract Superclass for all specific types of MRML nodes.
virtual void UpdateReferences()
The method should remove all pointers and observations to all nodes that are not in the scene anymore...
void DisableModifiedEventOn()
std::vector< vtkSmartPointer< vtkMRMLNodeReference > > NodeReferenceListType
virtual void SetScene(vtkMRMLScene *scene)
This method is for internal use only. Use AddNode method of vtkMRMLScene to add a node to the scene.
virtual int StartModify()
Start modifying the node. Disable Modify events.
vtkMRMLNode * GetNodeReference(const char *referenceRole)
vtkMRMLNode * AddAndObserveNodeReferenceID(const char *referenceRole, const char *referencedNodeID, vtkIntArray *events=nullptr, ContentModifiedObserveType observeContentModifiedEvents=ContentModifiedObserveUndefined)
Add and observe a reference node from this node for a specific referenceRole.
void DisableModifiedEventOff()
virtual void OnNodeReferenceRemoved(vtkMRMLNodeReference *reference)
Called when a referenced node pointer is removed (set to nullptr).
void ParseReferencesAttribute(const char *attValue, std::set< std::string > &references)
virtual void UpdateNodeReferences(const char *referenceRole=nullptr)
virtual void UpdateNthNodeReference(const char *referenceRole, int n)
int GetNumberOfNodeReferenceRoles()
virtual void OnNodeReferenceModified(vtkMRMLNodeReference *reference)
Called when a referenced node pointer is modified.
virtual const char * GetMRMLAttributeNameFromReferenceRole(const char *refRole)
Return the mrml attribute name (if found) associated with a reference role. Return 0 otherwise.
virtual void WriteNodeBodyXML(ostream &of, int indent)
Write this node's body to a MRML file in XML format.
NodeReferenceEventsType NodeReferenceEvents
vtkMRMLNode * AddNodeReferenceID(const char *referenceRole, const char *referencedNodeID)
Convenience method that adds a referencedNodeID at the end of the list.
vtkMRMLNode * UpdateNodeReferenceEventObserver(vtkMRMLNode *oldReferencedNode, vtkMRMLNode *newReferencedNode, vtkIntArray *newEvents, bool newObserveContentModifiedEvents, vtkMRMLNodeReference *referenceToIgnore)
void GetAttributeNames(vtkStringArray *attributeNames)
Get all attribute names. Python-wrappable version.
void ClearNodeReferenceProperties(const std::string &referenceRole)
Remove all node reference properties for a specific referenceRole.
void GetNodeReferenceRoles(std::vector< std::string > &roles)
std::map< std::string, std::string > ReferencePropertiesType
Get the node reference properties for a specific referenceRole.
void SetAddToSceneNoModify(int value)
void RemoveNthNodeReferenceID(const char *referenceRole, int n)
Convenience method that removes the Nth node ID from the list.
std::string GetNthNodeReferenceProperty(const std::string &referenceRole, int n, const std::string &propertyName)
virtual int InvokePendingModifiedEvent()
Invokes any modified events that are pending.
std::map< std::string, NodeReferenceListType > NodeReferencesType
virtual void CopyReferences(vtkMRMLNode *node)
Copy the references of the node into this.
std::string NodeReferencePropertyEncodeString(const std::string &inString)
Encode a node reference property string (replaces special characters by code sequences)
friend class vtkMRMLSceneViewNode
virtual void InvalidateNodeReferences()
virtual void Reset(vtkMRMLNode *defaultNode)
Reset node attributes to the initial state as defined in the constructor or the passed default node.
vtkIntArray * ContentModifiedEvents
std::string XMLAttributeEncodeString(const std::string &inString)
Encode an XML attribute string (replaces special characters by code sequences)
virtual int GetDisableModifiedEvent()
Turn on/off generating InvokeEvent for set macros.
AttributesType Attributes
void RemoveNodeReferenceProperty(const std::string &referenceRole, const std::string &propertyName)
Remove a node reference property for a specific referenceRole.
NodeReferencesType NodeReferences
virtual char * GetSingletonTag()
void SetNodeReferenceProperty(const std::string &referenceRole, const std::string &propertyName, const std::string &value)
Set the node reference property for a specific referenceRole.
ContentModifiedObserveType
@ ContentModifiedObserveDisabled
Do not observe content modified events (default)
@ ContentModifiedObserveUndefined
Observe content modified events if it is enabled in the node reference role.
@ ContentModifiedObserveEnabled
Observe content modified events.
virtual vtkMRMLNode * CreateNodeInstance()=0
Create instance of the default node. Like New only virtual.
int GetNumberOfNodeReferenceProperties(const std::string &referenceRole)
Get the number of node reference properties for a specific referenceRole.
void GetNodeReferences(const char *referenceRole, std::vector< vtkMRMLNode * > &nodes)
Return a list of the referenced nodes.
@ ReferencedNodeModifiedEvent
virtual const char * GetNodeTagName()=0
std::map< std::string, std::string > NodeReferenceMRMLAttributeNames
void RemoveNodeReferenceIDs(const char *referenceRole)
Remove all node IDs and associated nodes for a specific referenceRole.
void RemoveInvalidReferences(const std::set< std::string > &validNodeIDs)
bool HasNodeReferenceID(const char *referenceRole, const char *referencedNodeID)
Return true if referencedNodeID is in the node ID list for a specific referenceRole.
virtual const char * GetTypeDisplayName()
virtual void ReadXMLAttributes(const char **atts)
void GetUpdatedReferencedNodeEventList(int &oldReferencedNodeUseCount, int &newReferencedNodeUseCount, vtkIntArray *oldConsolidatedEventList, vtkIntArray *newConsolidatedEventList, vtkMRMLNode *oldReferencedNode, vtkMRMLNode *newReferencedNode, vtkMRMLNodeReference *referenceToIgnore, vtkIntArray *newEvents, bool newObserveContentModifiedEvents)
virtual void OnNodeAddedToScene()
virtual bool HasCopyContent() const
Returns true if the class supports deep and shallow copying node content.
virtual void SetSceneReferences()
Update the references of the node to the scene.
const char * GetNodeReferenceID(const char *referenceRole)
Utility function that returns the first node id for a specific referenceRole.
virtual void OnNodeReferenceAdded(vtkMRMLNodeReference *reference)
std::map< std::string, NodeReferenceEventList > NodeReferenceEventsType
virtual bool IsReferenceRoleGeneric(const char *refRole)
Return true if the reference role is generic (ends with '/') or false otherwise.
std::string GetNodeReferencePropertyName(const std::string &referenceRole, int propertyIndex)
Get the name of the Nth node reference property for a specific referenceRole.
void SetAttribute(const char *name, const char *value)
Set a name value pair attribute.
const char * GetNthNodeReferenceRole(int n)
void RemoveAttribute(const char *name)
Remove attribute with the specified name.
std::string NodeReferencePropertyDecodeString(const std::string &inString)
Decode a node reference property string.
virtual void CopyContent(vtkMRMLNode *node, bool deepCopy=true)
Copy node contents from another node of the same type. Does not copy node ID, Scene,...
const char * URLEncodeString(const char *inString)
Encode a URL string.
const char * GetNthNodeReferenceID(const char *referenceRole, int n)
Return the string of the Nth node ID for a specific reference role.
virtual int EndModify(int previousDisableModifiedEventState)
End modifying the node.
void CopyWithScene(vtkMRMLNode *node)
Copy everything (including Scene and ID) from another node of the same type.
void GetNodeReferenceIDs(const char *referenceRole, std::vector< const char * > &referencedNodeIDs)
Return a list of the referenced node IDs.
void PrintSelf(ostream &os, vtkIndent indent) override
int GetNumberOfNodeReferences(const char *referenceRole)
Return the number of node IDs for a specific reference role (and nodes as they always have the same s...
vtkMRMLNode * SetAndObserveNthNodeReferenceID(const char *referenceRole, int n, const char *referencedNodeID, vtkIntArray *events=nullptr, ContentModifiedObserveType observeContentModifiedEvents=ContentModifiedObserveUndefined)
Set and observe the Nth node ID for a specific reference role.
const ReferencePropertiesType * GetNodeReferenceProperties(const char *referenceRole)
virtual vtkMRMLScene * GetScene()
Get the scene this node has been added to.
const char * URLDecodeString(const char *inString)
Decode a URL string.
vtkMRMLNode * SetNodeReferenceID(const char *referenceRole, const char *referencedNodeID)
Set a reference to a node with specified nodeID from this node for a specific referenceRole.
vtkObserverManager * MRMLObserverManager
virtual void SetSingletonTag(const char *)
Tag that make this node a singleton in the scene.
virtual void WriteXML(ostream &of, int indent)
vtkCallbackCommand * MRMLCallbackCommand
Holders for MRML callbacks.
int GetNumberOfNthNodeReferenceProperties(const std::string &referenceRole, int n)
vtkWeakPointer< vtkMRMLScene > Scene
vtkMRMLNode * SetAndObserveNodeReferenceID(const char *referenceRole, const char *referencedNodeID, vtkIntArray *events=nullptr, ContentModifiedObserveType observeContentModifiedEvents=ContentModifiedObserveUndefined)
Set and observe a reference node from this node for a specific referenceRole.
std::vector< std::string > GetAttributeNames()
Get all attribute names.
const ReferencePropertiesType * GetNthNodeReferenceProperties(const char *referenceRole, int n)
virtual void UpdateReferenceID(const char *oldID, const char *newID)
Update the stored reference to another node in the scene.
void SetDisableModifiedEvent(int onOff)
const char * GetAttribute(const char *name)
Get value of a name value pair attribute.
virtual const char * GetReferenceRoleFromMRMLAttributeName(const char *attName)
Return the reference role (if found) associated with the attribute name found in a MRML scene file....
void Modified() override
Customized version of Modified() allowing to compress vtkCommand::ModifiedEvent.
void AddNodeReferenceRole(const char *referenceRole, const char *mrmlAttributeName=nullptr, vtkIntArray *events=nullptr, bool observeContentModifiedEvents=false)
Add a referenceRole.
friend class vtkMRMLScene
std::string GetNthNodeReferencePropertyName(const std::string &referenceRole, int referenceIndex, int propertyIndex)
void SetNthNodeReferenceProperty(const std::string &referenceRole, int n, const std::string &propertyName, const std::string &value)
int GetCustomModifiedEventPending(int eventId)
virtual void ProcessChildNode(vtkMRMLNode *)
Set dependencies between this node and a child node when parsing XML file.
int InMRMLCallbackFlag
Flag to avoid event loops.
std::vector< std::string > GetNthNodeReferencePropertyNames(const std::string &referenceRole, int n)
void RemoveNthNodeReferenceProperty(const std::string &referenceRole, int n, const std::string &propertyName)
void operator=(const vtkMRMLNode &)
void ClearNthNodeReferenceProperties(const std::string &referenceRole, int n)
void SetInMRMLCallbackFlag(int flag)
virtual void InvokeCustomModifiedEvent(int eventId, void *callData=nullptr)
This method allows the node to compress events.
std::vector< std::string > GetNodeReferencePropertyNames(const std::string &referenceRole)
Get the names of all node reference properties for a specific referenceRole.
std::map< std::string, std::string > AttributesType
virtual void Copy(vtkMRMLNode *node)
Copy node contents from another node of the same type. Does not copy node ID and Scene....
std::string GetNodeReferenceProperty(const std::string &referenceRole, const std::string &propertyName)
Get the node reference property for a specific referenceRole.
std::string XMLAttributeDecodeString(const std::string &inString)
Decode an XML attribute string.
vtkMRMLNode * GetNthNodeReference(const char *referenceRole, int n)
Get referenced MRML node for a specific referenceRole.
vtkMRMLNode * SetNthNodeReferenceID(const char *referenceRole, int n, const char *referencedNodeID)
Set a N-th reference from this node with specified referencedNodeID for a specific referenceRole.
virtual void UpdateScene(vtkMRMLScene *)
~vtkMRMLNode() override
critical to have a virtual destructor!
vtkMRMLNode(const vtkMRMLNode &)
virtual void ProcessMRMLEvents(vtkObject *caller, unsigned long event, void *callData)
Propagate events generated in mrml.
static void MRMLCallback(vtkObject *caller, unsigned long eid, void *clientData, void *callData)
A set of MRML Nodes that supports serialization and undo/redo.
Manages adding and deleting of observers with events.
vtkSmartPointer< vtkIntArray > StaticEvents
ContentModifiedObserveType ObserveContentModifiedEvents