Slicer 5.13
Slicer is a multi-platform, free and open source software package for visualization and medical image computing
Loading...
Searching...
No Matches
vtkSlicerLayerDMLogic.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 __vtkSlicerLayerDMLogic_h
22#define __vtkSlicerLayerDMLogic_h
23
24#include "vtkSlicerLayerDMModuleLogicExport.h"
25
26// Slicer includes
28#include <vtkMRMLScene.h>
30
32
35class VTK_SLICER_LAYERDM_MODULE_LOGIC_EXPORT vtkSlicerLayerDMLogic : public vtkSlicerModuleLogic
36{
37public:
40 void PrintSelf(ostream& os, vtkIndent indent) override;
41
43 void operator=(const vtkSlicerLayerDMLogic&) = delete;
44
46 void RegisterNodes() override;
47
50
53
56
60 const std::string& singletonId,
61 const std::function<void(vtkMRMLLayerDMWidgetEventTranslationNode*)>& configureF);
62
68
74 static void CreateDefaultEventTranslation(vtkMRMLNode* node, const std::string& singletonId, const std::function<void(vtkMRMLLayerDMWidgetEventTranslationNode*)>& configureF);
75
77 static std::string GetEventTranslationRole();
78
80 static std::string GetDisplayRole();
81
84 template <typename T>
85 static void RegisterNodeIfNeeded(vtkMRMLScene* scene);
86
88 template <typename T>
89 static T* GetDisplayNode(vtkMRMLNode* node);
90
92 template <typename T>
93 static T* GetReferenceNode(vtkMRMLNode* node, const char* role);
94
97 template <typename T>
98 static T* GetReferenceNode(vtkMRMLNode* node);
99
101 template <typename T>
102 static std::vector<T*> GetReferenceNodes(vtkMRMLNode* node, const char* role);
103
106 template <typename T>
107 static std::vector<T*> GetReferenceNodes(vtkMRMLNode* node);
108
115 template <typename T>
116 static T* CreateDisplayNode(vtkMRMLNode* node, bool allowMultiple = false);
117
125 template <typename T>
126 static T* CreateReferenceNode(vtkMRMLNode* node, const char* role, bool allowMultiple = false);
127
136 template <typename T>
137 static T* CreateReferenceNode(vtkMRMLNode* node, bool allowMultiple = false);
138
143 template <typename T>
144 static T* AddReferenceNode(vtkMRMLNode* node, T* nodeRef, const char* role);
145
146 template <typename T>
147 static T* SetReferenceNode(vtkMRMLNode* node, T* nodeRef, const char* role);
148
149 template <typename T>
150 static T* SetNthReferenceNode(vtkMRMLNode* node, T* nodeRef, const char* role, int nthRef);
152
153protected:
155 ~vtkSlicerLayerDMLogic() override = default;
156
157private:
158 template <typename T>
159 static T* ModifyNodeReference(vtkMRMLNode* node, vtkMRMLNode* nodeRef, const std::function<void()>& modifyF)
160 {
161 if (!node || !nodeRef)
162 {
163 return nullptr;
164 }
165
166 modifyF();
167 return T::SafeDownCast(nodeRef);
168 }
169
170 static constexpr auto EventTranslationRole{ "widgetEventTranslation" };
171 static constexpr auto DisplayRole{ "display" }; // copied from vtkMRMLDisplayableNode
172};
173
174//----------------------------------------------------------------------------
175template <typename T>
177{
178 if (!scene)
179 {
180 return;
181 }
182
183 vtkNew<T> node;
184 if (!scene->IsNodeClassRegistered(node.Get()->GetClassName()))
185 {
186 scene->RegisterNodeClass(node.Get());
187 }
188}
189
190template <typename T>
192{
193 if (!node)
194 {
195 return {};
196 }
197
198 return GetReferenceNode<T>(node, DisplayRole);
199}
200
201template <typename T>
203{
204 const auto referenceNodes = GetReferenceNodes<T>(node, role);
205 return referenceNodes.empty() ? nullptr : referenceNodes[0];
206}
207
208template <typename T>
210{
211 return GetReferenceNode<T>(node, T::GetReferenceRole());
212}
213
214template <typename T>
215std::vector<T*> vtkSlicerLayerDMLogic::GetReferenceNodes(vtkMRMLNode* node, const char* role)
216{
217 if (!node)
218 {
219 return {};
220 }
221
222 std::vector<T*> referenceNodes;
223 for (int i_node = 0; i_node < node->GetNumberOfNodeReferences(role); i_node++)
224 {
225 if (auto refNode = T::SafeDownCast(node->GetNthNodeReference(role, i_node)))
226 {
227 referenceNodes.emplace_back(refNode);
228 }
229 }
230 return referenceNodes;
231}
232
233template <typename T>
235{
236 return GetReferenceNodes<T>(node, T::GetReferenceRole());
237}
238
239template <typename T>
241{
242 if (!node)
243 {
244 return {};
245 }
246
247 return CreateReferenceNode<T>(node, DisplayRole, allowMultiple);
248}
249
250template <typename T>
251T* vtkSlicerLayerDMLogic::CreateReferenceNode(vtkMRMLNode* node, const char* role, bool allowMultiple)
252{
253 auto scene = node ? node->GetScene() : nullptr;
254 if (!node || !scene)
255 {
256 return {};
257 }
258
259 auto nodeRef = GetReferenceNode<T>(node, role);
260 if (nodeRef && !allowMultiple)
261 {
262 return nodeRef;
263 }
264
265 nodeRef = T::SafeDownCast(scene->AddNewNodeByClass(vtkSmartPointer<T>::New()->GetClassName()));
266 return AddReferenceNode<T>(node, nodeRef, role);
267}
268
269template <typename T>
271{
272 return CreateReferenceNode<T>(node, T::GetReferenceRole(), allowMultiple);
273}
274
275template <typename T>
276T* vtkSlicerLayerDMLogic::AddReferenceNode(vtkMRMLNode* node, T* nodeRef, const char* role)
277{
278 return ModifyNodeReference<T>(node, nodeRef, [=] { node->AddAndObserveNodeReferenceID(role, nodeRef->GetID()); });
279}
280
281template <typename T>
282T* vtkSlicerLayerDMLogic::SetReferenceNode(vtkMRMLNode* node, T* nodeRef, const char* role)
283{
284 return ModifyNodeReference<T>(node, nodeRef, [=] { node->SetAndObserveNodeReferenceID(role, nodeRef->GetID()); });
285}
286
287template <typename T>
288T* vtkSlicerLayerDMLogic::SetNthReferenceNode(vtkMRMLNode* node, T* nodeRef, const char* role, int nthRef)
289{
290 return ModifyNodeReference<T>(node, nodeRef, [=] { node->SetAndObserveNthNodeReferenceID(role, nthRef, nodeRef->GetID()); });
291}
292
293#endif
Abstract Superclass for all specific types of MRML nodes.
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.
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.
virtual vtkMRMLScene * GetScene()
Get the scene this node has been added to.
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.
vtkMRMLNode * GetNthNodeReference(const char *referenceRole, int n)
Get referenced MRML node for a specific referenceRole.
A set of MRML Nodes that supports serialization and undo/redo.
bool IsNodeClassRegistered(const std::string &className)
Return True if className is a registered node.
vtkMRMLNode * AddNewNodeByClass(std::string className, std::string nodeBaseName="")
Instantiate and add a node to the scene.
void RegisterNodeClass(vtkMRMLNode *node, const char *tagName)
Register a node class to the scene so that the scene can later create the same node type from a tag o...
void operator=(const vtkSlicerLayerDMLogic &)=delete
static void SetWidgetEventTranslationNode(vtkMRMLNode *node, vtkMRMLLayerDMWidgetEventTranslationNode *translationNode)
Attach a translation node ref to the input node.
static T * SetReferenceNode(vtkMRMLNode *node, T *nodeRef, const char *role)
static T * GetDisplayNode(vtkMRMLNode *node)
static T * GetReferenceNode(vtkMRMLNode *node, const char *role)
static void CreateDefaultEventTranslation(vtkMRMLNode *node, const std::string &singletonId, const std::function< void(vtkMRMLLayerDMWidgetEventTranslationNode *)> &configureF)
void PrintSelf(ostream &os, vtkIndent indent) override
static T * CreateDisplayNode(vtkMRMLNode *node, bool allowMultiple=false)
static T * CreateReferenceNode(vtkMRMLNode *node, const char *role, bool allowMultiple=false)
static vtkMRMLLayerDMWidgetEventTranslationNode * GetWidgetEventTranslationSingleton(vtkMRMLScene *scene, const std::string &singletonId, const std::function< void(vtkMRMLLayerDMWidgetEventTranslationNode *)> &configureF)
static vtkMRMLLayerDMWidgetEventTranslationNode * GetWidgetEventTranslationNode(vtkMRMLNode *node)
void RegisterNodes() override
Registers the LayerDM MRML nodes in the scene.
vtkSlicerLayerDMLogic()=default
static vtkMRMLLayerDMWidgetEventTranslationNode * GetWidgetEventTranslationSingleton(vtkMRMLScene *scene, const std::string &singletonId)
Get the singleton translation node with given ID if it exists in the scene.
static vtkMRMLLayerDMWidgetEventTranslationNode * CreateWidgetEventTranslationSingleton(vtkMRMLScene *scene, const std::string &singletonId)
static T * AddReferenceNode(vtkMRMLNode *node, T *nodeRef, const char *role)
static void RegisterNodeIfNeeded(vtkMRMLScene *scene)
static T * SetNthReferenceNode(vtkMRMLNode *node, T *nodeRef, const char *role, int nthRef)
vtkSlicerLayerDMLogic(const vtkSlicerLayerDMLogic &)=delete
static std::string GetDisplayRole()
static std::vector< T * > GetReferenceNodes(vtkMRMLNode *node, const char *role)
static std::string GetEventTranslationRole()
static vtkSlicerLayerDMLogic * New()
~vtkSlicerLayerDMLogic() override=default