Slicer 5.13
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
Loading...
Searching...
No Matches
vtkMRMLLayerDMNodeReferenceObserver.h
Go to the documentation of this file.
1/*==============================================================================
2
3 Program: 3D Slicer
4
5 Copyright (c) Kitware SAS
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 Thibault Pelletier, Kitware SAS,
17 and was partially funded by ANR grants ANR-22-CE45-0034 and ANR-18-RHUS-005.
18
19==============================================================================*/
20
21#ifndef __vtkMRMLLayerDMNodeReferenceObserver_h
22#define __vtkMRMLLayerDMNodeReferenceObserver_h
23
24// LayerDM includes
25#include "vtkSlicerLayerDMModuleMRMLExport.h"
26
27// VTK includes
28#include <vtkObject.h>
29#include <vtkSmartPointer.h>
30#include <vtkWeakPointer.h>
31
32// STL includes
33#include <functional>
34#include <map>
35#include <set>
36#include <vector>
37
38class vtkMRMLNode;
40class vtkMRMLScene;
41
45class VTK_SLICER_LAYERDM_MODULE_MRML_EXPORT vtkMRMLLayerDMNodeReferenceObserver : public vtkObject
46{
47public:
59 using RefT = std::tuple<vtkWeakPointer<vtkMRMLNode>, std::string>;
60
66
68 vtkTypeMacro(vtkMRMLLayerDMNodeReferenceObserver, vtkObject);
69 void PrintSelf(ostream& os, vtkIndent indent) override;
70
73 std::vector<RefT> GetNodeToReferences(vtkMRMLNode* node) const;
74 std::vector<RefT> GetNodeFromReferences(vtkMRMLNode* node) const;
76
81 int GetReferenceToSize() const;
83 int GetNumberOfNodes() const;
85
89 using CallBackT = std::function<void(vtkMRMLNode*, vtkMRMLNode*, const std::string&, int eventType)>;
90 void SetReferenceModifiedCallBack(const CallBackT& modifiedCallback);
92
94 void SetScene(vtkMRMLScene* scene);
95
96protected:
99
100private:
102 void operator=(const vtkMRMLLayerDMNodeReferenceObserver&);
103
104 void UpdateFromScene();
105 void OnNodeRemoved(vtkMRMLNode* node);
106 void OnNodeAdded(vtkMRMLNode* node);
107 void OnReferenceAdded(vtkMRMLNode* fromNode, vtkMRMLNode* toNode, const std::string& role);
108 void OnReferenceRemoved(vtkMRMLNode* fromNode, vtkMRMLNode* toNode, const std::string& role);
109 void RemoveOutdatedReferences(vtkMRMLNode* fromNode);
110 void OnReferenceModified(vtkMRMLNode* fromNode, vtkMRMLNode* toNode, const std::string& role);
111
112 static std::vector<RefT> GetNodeReferencesFromScene(vtkMRMLNode* node);
113 void TriggerReferenceAdded(vtkMRMLNode* fromNode, vtkMRMLNode* toNode, const std::string& role) const;
114 void TriggerReferenceRemoved(vtkMRMLNode* fromNode, vtkMRMLNode* toNode, const std::string& role) const;
115 static void TriggerCallback(const CallBackT& callback, vtkMRMLNode* fromNode, vtkMRMLNode* toNode, const std::string& role, int eventType);
116
117 vtkWeakPointer<vtkMRMLScene> Scene;
118 vtkSmartPointer<vtkMRMLLayerDMObjectEventObserver> Observer;
119
127 std::map<vtkSmartPointer<vtkMRMLNode>, std::vector<RefT>> NodeToReferences;
128 std::map<vtkSmartPointer<vtkMRMLNode>, std::vector<RefT>> NodeFromReferences;
130
131 std::set<vtkSmartPointer<vtkMRMLNode>> Nodes;
132
133 CallBackT ReferenceModifiedCallback;
134};
135
136#endif
std::function< void(vtkMRMLNode *, vtkMRMLNode *, const std::string &, int eventType)> CallBackT
std::tuple< vtkWeakPointer< vtkMRMLNode >, std::string > RefT
void SetReferenceModifiedCallBack(const CallBackT &modifiedCallback)
void SetScene(vtkMRMLScene *scene)
Setting the MRML scene will trigger node added / removed callbacks if they are set.
std::vector< RefT > GetNodeFromReferences(vtkMRMLNode *node) const
void PrintSelf(ostream &os, vtkIndent indent) override
std::vector< RefT > GetNodeToReferences(vtkMRMLNode *node) const
static vtkMRMLLayerDMNodeReferenceObserver * New()
VTK object observer with one callback endpoint when an event is triggered. Can observe multiple objec...
Abstract Superclass for all specific types of MRML nodes.
A set of MRML Nodes that supports serialization and undo/redo.