Slicer  5.0
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
vtkSlicerApplicationLogicRequests.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Copyright (c) Brigham and Women's Hospital (BWH) All Rights Reserved.
4 
5  See License.txt or http://www.slicer.org/copyright/copyright.txt for details.
6 
7 ==========================================================================*/
10 
11 #ifndef __vtkSlicerApplicationLogicRequests_h
12 #define __vtkSlicerApplicationLogicRequests_h
13 
14 #include <vtkMRMLDisplayNode.h>
17 #include <vtkMRMLModelNode.h>
18 #include <vtkMRMLStorageNode.h>
20 #include <vtkMRMLTableNode.h>
21 
22 //----------------------------------------------------------------------------
24 {
25 public:
27  {
28  m_UID = 0;
29  }
30 
31  DataRequest(int uid)
32  {
33  m_UID = uid;
34  }
35 
36  virtual ~DataRequest() = default;
37 
39 
40  int GetUID()const{return m_UID;}
41 
42 protected:
43  vtkMTimeType m_UID;
44 };
45 
46 //----------------------------------------------------------------------------
48 {
49 public:
50  ReadDataRequestFile(const std::string& node, const std::string& filename,
51  int displayData, int deleteFile, int uid = 0)
52  : DataRequest(uid)
53  {
54  m_TargetNode = node;
55  m_Filename = filename;
56  m_DisplayData = displayData;
57  m_DeleteFile = deleteFile;
58  }
59 
60  void Execute(vtkSlicerApplicationLogic* appLogic) override
61  {
62  // This method needs to read the data into the specific type of node and set up an
63  // appropriate storage and display node.
64 
65  vtkMRMLNode *nd = appLogic->GetMRMLScene()->GetNodeByID(m_TargetNode.c_str());
66  vtkDebugWithObjectMacro(appLogic, "ProcessReadNodeData: read data request node id = " << nd->GetID());
67 
68  vtkSmartPointer<vtkMRMLStorageNode> storageNode;
69 #ifdef Slicer_BUILD_CLI_SUPPORT
71 #endif
72 
73  bool useURI = appLogic->GetMRMLScene()->GetCacheManager()->IsRemoteReference(m_Filename.c_str());
74 
76  if (storableNode)
77  {
78  int numStorageNodes = storableNode->GetNumberOfStorageNodes();
79  for (int n = 0; n < numStorageNodes; n++)
80  {
81  vtkMRMLStorageNode *testStorageNode = storableNode->GetNthStorageNode(n);
82  if (testStorageNode)
83  {
84  if (useURI && testStorageNode->GetURI() != nullptr)
85  {
86  if (m_Filename.compare(testStorageNode->GetURI()) == 0)
87  {
88  // found a storage node for the remote file
89  vtkDebugWithObjectMacro(appLogic, "ProcessReadNodeData: found a storage node with the right URI: " << testStorageNode->GetURI());
90  storageNode = testStorageNode;
91  break;
92  }
93  }
94  else if (testStorageNode->GetFileName() != nullptr &&
95  m_Filename.compare(testStorageNode->GetFileName()) == 0)
96  {
97  // found the right storage node for a local file
98  vtkDebugWithObjectMacro(appLogic, "ProcessReadNodeData: found a storage node with the right filename: " << testStorageNode->GetFileName());
99  storageNode = testStorageNode;
100  break;
101  }
102  }
103  }
104 
105  // if there wasn't already a matching storage node on the node, make one
106  bool createdNewStorageNode = false;
107  if (storageNode.GetPointer() == nullptr)
108  {
109  // Read the data into the referenced node
110  if (itksys::SystemTools::FileExists(m_Filename.c_str()))
111  {
112  // file is there on disk
113  storableNode->AddDefaultStorageNode(m_Filename.c_str());
114  storageNode = storableNode->GetStorageNode();
115  createdNewStorageNode = (storageNode != nullptr);
116  }
117  }
118 
119  // Have the storage node read the data into the current node
120  if (storageNode.GetPointer() != nullptr)
121  {
122  try
123  {
124  vtkDebugWithObjectMacro(appLogic, "ProcessReadNodeData: about to call read data, " \
125  "storage node's read state is " << storageNode->GetReadStateAsString());
126  if (useURI)
127  {
128  storageNode->SetURI(m_Filename.c_str());
129  vtkDebugWithObjectMacro(appLogic, "ProcessReadNodeData: calling ReadData on the storage node " \
130  << storageNode->GetID() << ", uri = " << storageNode->GetURI());
131  storageNode->ReadData(nd, /*temporary*/true);
132  if (createdNewStorageNode)
133  {
134  storageNode->SetURI(nullptr); // clear temporary URI
135  }
136  }
137  else
138  {
139  storageNode->SetFileName(m_Filename.c_str());
140  vtkDebugWithObjectMacro(appLogic, "ProcessReadNodeData: calling ReadData on the storage node " \
141  << storageNode->GetID() << ", filename = " << storageNode->GetFileName());
142  storageNode->ReadData(nd, /*temporary*/true);
143  if (createdNewStorageNode)
144  {
145  storageNode->SetFileName(nullptr); // clear temp file name
146  }
147  }
148  }
149  catch (itk::ExceptionObject& exc)
150  {
151  vtkErrorWithObjectMacro(appLogic, "Exception while reading " << m_Filename << ", " << exc);
152  }
153  catch (...)
154  {
155  vtkErrorWithObjectMacro(appLogic, "Unknown exception while reading " << m_Filename);
156  }
157  }
158  }
159 #ifdef Slicer_BUILD_CLI_SUPPORT
160  // if the node was a CommandLineModule node, then read the file
161  // (no storage node for these, yet)
162  if (clp)
163  {
165  }
166 #endif
167 
168  // Delete the file if requested
169  if (m_DeleteFile)
170  {
171  int removed;
172  // is it a shared memory location?
173  if (m_Filename.find("slicer:") != std::string::npos)
174  {
175  removed = 1;
176  }
177  else
178  {
179  removed = static_cast<bool>(itksys::SystemTools::RemoveFile(m_Filename.c_str()));
180  }
181  if (!removed)
182  {
183  vtkGenericWarningMacro("Unable to delete temporary file " << m_Filename);
184  }
185  }
186 
187 
188  // Get the right type of display node. Only create a display node
189  // if one does not exist already
190  //
191  vtkMRMLDisplayableNode *displayableNode =
193  if (displayableNode)
194  {
195  // Create a default display node if no display node exists for the node yet.
196  displayableNode->CreateDefaultDisplayNodes();
197  }
198 
199  // Cause the any observers to fire (we may have avoided calling
200  // modified on the node)
201  //
202  nd->Modified();
203 
204  // If scalar volume, set the volume as the active volume and
205  // propagate selection.
206  //
207  // Models are always displayed when loaded above.
208  //
209  // Tensors? Vectors?
210  if (m_DisplayData)
211  {
212  if (vtkMRMLLabelMapVolumeNode::SafeDownCast(nd) != nullptr)
213  {
215  appLogic->PropagateVolumeSelection();
216  }
217  else if (vtkMRMLScalarVolumeNode::SafeDownCast(nd) != nullptr)
218  {
219  appLogic->GetSelectionNode()->SetActiveVolumeID(m_TargetNode.c_str());
220  // make sure win/level gets calculated
222  if (displayNode)
223  {
224  displayNode->Modified();
225  }
226  appLogic->PropagateVolumeSelection();
227  }
228  else if (vtkMRMLTableNode::SafeDownCast(nd) != nullptr)
229  {
230  appLogic->GetSelectionNode()->SetActiveTableID(m_TargetNode.c_str());
231  appLogic->PropagateTableSelection();
232  }
233  }
234  }
235 
236 protected:
237  std::string m_TargetNode;
238  std::string m_Filename;
241 };
242 
243 //----------------------------------------------------------------------------
245 {
246 public:
247  ReadDataRequestScene(const std::vector<std::string>& targetNodes,
248  const std::vector<std::string>& sourceNodes,
249  const std::string& filename,
250  int displayData, int deleteFile,
251  int uid = 0)
252  : DataRequest(uid)
253  {
254  m_TargetNodes = targetNodes;
255  m_SourceNodes = sourceNodes;
256  m_Filename = filename;
257  m_DisplayData = displayData;
258  m_DeleteFile = deleteFile;
259  }
260 
261  void Execute(vtkSlicerApplicationLogic* appLogic) override
262  {
263  if (m_SourceNodes.size() != m_TargetNodes.size())
264  {
265  // Can't do ID remapping if the two node lists are different
266  // sizes. Just import the scene. (This is where we would put to
267  // the code to load into a node hierarchy (with a corresponding
268  // change in the conditional above)).
269  appLogic->GetMRMLScene()->SetURL(m_Filename.c_str());
270  appLogic->GetMRMLScene()->Import();
271 
272  // Delete the file if requested
273  if (m_DeleteFile)
274  {
275  int removed;
276  removed = static_cast<bool>(itksys::SystemTools::RemoveFile(m_Filename.c_str()));
277  if (!removed)
278  {
279  std::stringstream information;
280  information << "Unable to delete temporary file "
281  << m_Filename << std::endl;
282  vtkGenericWarningMacro( << information.str().c_str() );
283  }
284  }
285 
286  return;
287  }
288 
289  vtkNew<vtkMRMLScene> miniscene;
290  miniscene->SetURL(m_Filename.c_str() );
291  miniscene->Import();
292 
293  // iterate over the list of nodes specified to read
294  std::vector<std::string>::const_iterator tit;
295  std::vector<std::string>::const_iterator sit;
296 
297  tit = m_TargetNodes.begin();
298  sit = m_SourceNodes.begin();
299 
301 
302  while (sit != m_SourceNodes.end())
303  {
304  vtkMRMLNode *source = miniscene->GetNodeByID((*sit).c_str());
305  vtkMRMLNode *target = appLogic->GetMRMLScene()->GetNodeByID( (*tit).c_str() );
306 
307  if (source && target)
308  {
309  // save old storage info (in case user has custom file name already
310  // defined for this node, don't use the one from the miniscene since it
311  // was only used to read/write the temp area).
312  vtkMRMLStorableNode *storableTarget = vtkMRMLStorableNode::SafeDownCast(target);
313  if ( storableTarget )
314  {
315  const char *oldStorageNodeID = storableTarget->GetStorageNodeID();
316  target->Copy(source);
317  storableTarget->SetAndObserveStorageNodeID(oldStorageNodeID);
318  }
319  else
320  {
321  target->Copy(source);
322  }
323 
324  // if the source node is a model hierarchy node, then also copy
325  // and remap any child nodes of the target that are not in the
326  // target list (nodes that had no source equivalent before the
327  // module ran).
332  if (smhnd && tmhnd)
333  {
334  // get the model node and display node BEFORE we add nodes to
335  // the target scene
336  vtkMRMLModelNode *smnd = smhnd->GetModelNode();
337  vtkMRMLDisplayNode *sdnd = smhnd->GetDisplayNode();
338 
339  // add the model and display referenced by source model hierarchy node
340  if (smnd)
341  {
342  // set the model node to be modified, as it was read from a temp
343  // location
344  //smnd->SetModifiedSinceRead(1);
345  // get display node BEFORE we add nodes to the target scene
346  vtkMRMLDisplayNode *sdnd1 = smnd->GetDisplayNode();
347 
348  vtkMRMLNode *tmodel = appLogic->GetMRMLScene()->CopyNode(smnd);
351  tmhnd->SetModelNodeID( mnd->GetID() );
352 
353  if (sdnd1)
354  {
355  vtkMRMLNode *tdnd = appLogic->GetMRMLScene()->CopyNode(sdnd1);
356  mnd->SetAndObserveDisplayNodeID( tdnd->GetID() );
357  }
358  }
359 
360  if (sdnd)
361  {
362  vtkMRMLNode *dnd = appLogic->GetMRMLScene()->CopyNode(sdnd);
363  tmhnd->SetAndObserveDisplayNodeID( dnd->GetID() );
364  }
365 
366  // add any children model hierarchy nodes, rinse, repeat
367  //
368  // keep a map of model hierarchy node ids so that can update the parent node references
369  std::map<std::string, std::string> parentNodeIDMapper;
370  // hopefully the parents will have been read first, but if not
371  // keep a list of model hierarchy nodes that failed to have their parent node reference remapped
372  std::vector<vtkMRMLModelHierarchyNode *> childNodesThatNeedParentsIDsRemapped;
373  for (int n=0;
374  n<miniscene->GetNumberOfNodesByClass("vtkMRMLModelHierarchyNode");
375  n++)
376  {
378  ::SafeDownCast(miniscene->GetNthNodeByClass(n,
379  "vtkMRMLModelHierarchyNode"));
380  if (mhnd)
381  {
382  // is this model hierarchy node in our source list
383  // already? if so skip it
384  std::vector<std::string>::const_iterator ssit
385  = std::find(m_SourceNodes.begin(),
386  m_SourceNodes.end(), mhnd->GetID());
387  if (ssit == m_SourceNodes.end())
388  {
389  // not in source list, so we may need to add it,
390  // if it's a child, grandchild etc of the top level node that we're importing
391  if (strcmp(mhnd->GetTopParentNode()->GetID(), smhnd->GetID()) == 0)
392  {
393  // get the model and display node BEFORE we add nodes
394  // to the target scene
395  vtkMRMLModelNode *smnd1 = mhnd->GetModelNode();
396  vtkMRMLDisplayNode *sdnd1 = mhnd->GetDisplayNode();
397 
398  vtkMRMLNode *tchild = appLogic->GetMRMLScene()->CopyNode(mhnd);
399  // keep track of any node id change in case other nodes use this as a parent
400  parentNodeIDMapper[std::string(mhnd->GetID())] = std::string(tchild->GetID());
403  // check for a parent node id in the mapper (as long as it doesn't already
404  // point to the source node), default to the top level one though
405  std::string parentNodeID = std::string(tmhnd->GetID());
406  if (tcmhd->GetParentNodeID() != nullptr &&
407  strcmp(tcmhd->GetParentNodeID(),smhnd->GetID()) != 0)
408  {
409  std::map<std::string,std::string>::iterator pIt = parentNodeIDMapper.find(std::string(tcmhd->GetParentNodeID()));
410  if (pIt != parentNodeIDMapper.end())
411  {
412  parentNodeID = pIt->second;
413  vtkDebugWithObjectMacro(appLogic, "Remapped parent node id to " << parentNodeID.c_str());
414  }
415  else
416  {
417  childNodesThatNeedParentsIDsRemapped.push_back(tcmhd);
418  }
419  }
420  tcmhd->SetParentNodeID( parentNodeID.c_str() );
421 
422  if (smnd1)
423  {
424  // set it as modified
425  //smnd1->SetModifiedSinceRead(1);
426  // get display node BEFORE we add nodes to the target scene
427  vtkMRMLDisplayNode *sdnd2 = smnd1->GetDisplayNode();
428 
429  vtkMRMLNode *tmodel = appLogic->GetMRMLScene()->CopyNode(smnd1);
432  tcmhd->SetModelNodeID( mnd->GetID() );
433 
434  if (sdnd2)
435  {
436  vtkMRMLNode *tdnd = appLogic->GetMRMLScene()->CopyNode(sdnd2);
437  mnd->SetAndObserveDisplayNodeID( tdnd->GetID() );
438  }
439  }
440 
441  if (sdnd1)
442  {
443  vtkMRMLNode *tdnd = appLogic->GetMRMLScene()->CopyNode(sdnd1);
444  tcmhd->SetAndObserveDisplayNodeID( tdnd->GetID() );
445  }
446  }
447  }
448  }
449  }
450  if (childNodesThatNeedParentsIDsRemapped.size() > 0)
451  {
452  // iterate through all the imported hierarchies that failed and double check their parent node ids
453  for (unsigned int i = 0; i < childNodesThatNeedParentsIDsRemapped.size(); i++)
454  {
455  std::map<std::string,std::string>::iterator pIt = parentNodeIDMapper.find(childNodesThatNeedParentsIDsRemapped[i]->GetParentNodeID());
456  if (pIt != parentNodeIDMapper.end())
457  {
458  vtkDebugWithObjectMacro(appLogic, "Remapping child node " << childNodesThatNeedParentsIDsRemapped[i]->GetName() << \
459  " parent node id from " << childNodesThatNeedParentsIDsRemapped[i]->GetParentNodeID() << " to " << pIt->second.c_str());
460  childNodesThatNeedParentsIDsRemapped[i]->SetParentNodeID(pIt->second.c_str());
461  }
462  }
463  }
464  }
465  }
466  else if (!source)
467  {
468  std::stringstream information;
469  information << "Node " << (*sit) << " not found in scene file "
470  << m_Filename << std::endl;
471  vtkGenericWarningMacro( << information.str().c_str() );
472  }
473  else if (!target)
474  {
475  std::stringstream information;
476  information << "Node " << (*tit) << " not found in current scene."
477  << std::endl;
478  vtkGenericWarningMacro( << information.str().c_str() );
479  }
480 
481  ++sit;
482  ++tit;
483  }
484 
486 
487  // Delete the file if requested
488  if (m_DeleteFile)
489  {
490  int removed;
491  removed = static_cast<bool>(itksys::SystemTools::RemoveFile( m_Filename.c_str() ));
492  if (!removed)
493  {
494  std::stringstream information;
495  information << "Unable to delete temporary file "
496  << m_Filename << std::endl;
497  vtkGenericWarningMacro( << information.str().c_str() );
498  }
499  }
500  }
501 
502 protected:
503  std::vector<std::string> m_TargetNodes;
504  std::vector<std::string> m_SourceNodes;
505  std::string m_Filename;
508 };
509 
510 //----------------------------------------------------------------------------
512 {
513 public:
514  ReadDataRequestUpdateParentTransform(const std::string& updatedNode,
515  const std::string& parentTransformNode, int uid = 0)
516  : DataRequest(uid)
517  {
518  m_UpdatedNode = updatedNode;
519  m_ParentTransformNode = parentTransformNode;
520  }
521 
522  void Execute(vtkSlicerApplicationLogic* appLogic) override
523  {
524  vtkMRMLScene* scene = appLogic->GetMRMLScene();
526  scene->GetNodeByID(m_UpdatedNode));
527  if (node)
528  {
530  }
531  }
532 
533 protected:
534  std::string m_UpdatedNode;
536 };
537 
538 //----------------------------------------------------------------------------
540 {
541 public:
542  ReadDataRequestUpdateSubjectHierarchyLocation(const std::string& updatedNode,
543  const std::string& siblingNode, int uid = 0)
544  : DataRequest(uid)
545  {
546  m_UpdatedNode = updatedNode;
547  m_SubjectHierarchySiblingNode = siblingNode;
548  }
549 
550  void Execute(vtkSlicerApplicationLogic* appLogic) override
551  {
552  vtkMRMLScene* scene = appLogic->GetMRMLScene();
553 
555  vtkMRMLNode *updatedNode = scene->GetNodeByID(m_UpdatedNode);
557  vtkIdType siblingNodeShItemID = shnd->GetItemByDataNode(siblingNode);
558  vtkIdType updatedNodeShItemID = shnd->GetItemByDataNode(updatedNode);
559 
560  if (updatedNodeShItemID && siblingNodeShItemID)
561  {
562  vtkIdType parentItemID = shnd->GetItemParent(siblingNodeShItemID);
563  shnd->SetItemParent(updatedNodeShItemID, parentItemID);
564  shnd->SetItemLevel(updatedNodeShItemID, shnd->GetItemLevel(siblingNodeShItemID));
565  }
566  }
567 
568 protected:
569  std::string m_UpdatedNode;
571 };
572 
573 //----------------------------------------------------------------------------
575 {
576 public:
577  ReadDataRequestAddNodeReference(const std::string& referencingNode,
578  const std::string& referencedNode, const std::string& role, int uid = 0)
579  : DataRequest(uid)
580  {
581  m_ReferencingNode = referencingNode;
582  m_ReferencedNode = referencedNode;
583  m_Role = role;
584  }
585 
586  void Execute(vtkSlicerApplicationLogic* appLogic) override
587  {
588  vtkMRMLScene* scene = appLogic->GetMRMLScene();
589 
590  vtkMRMLNode *referencingNode = scene->GetNodeByID(m_ReferencingNode);
591  vtkMRMLNode *referencedNode = scene->GetNodeByID(m_ReferencedNode);
592  if (referencingNode && referencedNode)
593  {
594  referencingNode->AddNodeReferenceID(m_Role.c_str(), m_ReferencedNode.c_str());
595  }
596  }
597 
598 protected:
599  std::string m_ReferencingNode;
600  std::string m_ReferencedNode;
601  std::string m_Role;
602 };
603 
604 //----------------------------------------------------------------------------
606 {
607 public:
609  const std::string& vtkNotUsed(node),
610  const std::string& vtkNotUsed(filename),
611  int uid = 0)
612  : DataRequest(uid)
613  {
614  }
615 protected:
616  std::string m_SourceNode;
617  std::string m_Filename;
618 };
619 
620 //----------------------------------------------------------------------------
622 {
623 public:
624  WriteDataRequestScene(const std::vector<std::string>& targetNodes,
625  const std::vector<std::string>& sourceNodes,
626  const std::string& filename,
627  int uid = 0)
628  : DataRequest(uid)
629  {
630  m_TargetNodes = targetNodes;
631  m_SourceNodes = sourceNodes;
632  m_Filename = filename;
633  }
634 
635  void Execute(vtkSlicerApplicationLogic* appLogic) override
636  {
637  if (m_SourceNodes.size() != m_TargetNodes.size())
638  {
639  // Can't do ID remapping if the two node lists are different
640  // sizes. Just commit the scene. (This is where we would put to
641  // the code to load into a node hierarchy (with a corresponding
642  // change in the conditional above)).
643  appLogic->GetMRMLScene()->SetURL( m_Filename.c_str() );
644  appLogic->GetMRMLScene()->Commit();
645  return;
646  }
647  }
648 
649 protected:
650  std::vector<std::string> m_TargetNodes;
651  std::vector<std::string> m_SourceNodes;
652  std::string m_Filename;
653 };
654 
655 
656 #endif // __vtkSlicerApplicationLogicRequests_h
void Execute(vtkSlicerApplicationLogic *appLogic) override
void Execute(vtkSlicerApplicationLogic *appLogic) override
void SetActiveVolumeID(const char *id)
void Execute(vtkSlicerApplicationLogic *appLogic) override
void EndState(unsigned long state)
Unflag the scene as being in a state mode.
ReadDataRequestUpdateSubjectHierarchyLocation(const std::string &updatedNode, const std::string &siblingNode, int uid=0)
void SetAndObserveDisplayNodeID(const char *displayNodeID)
vtkMRMLStorageNode * GetNthStorageNode(int n)
Get associated display MRML node
vtkMRMLHierarchyNode * GetTopParentNode()
Get the top parent node in the hierarchy
void Execute(vtkSlicerApplicationLogic *appLogic) override
bool SetAndObserveTransformNodeID(const char *transformNodeID)
virtual ~DataRequest()=default
MRML node to represent a 3D surface model.
void SetItemLevel(vtkIdType itemID, std::string level)
Convenience function to set level attribute for a subject hierarchy item.
WriteDataRequestScene(const std::vector< std::string > &targetNodes, const std::vector< std::string > &sourceNodes, const std::string &filename, int uid=0)
vtkMRMLSelectionNode * GetSelectionNode() const
Get default Selection node.
virtual char * GetURI()
vtkMRMLScene * GetMRMLScene() const
Return a reference to the current MRML scene.
void Execute(vtkSlicerApplicationLogic *appLogic) override
vtkMRMLNode * CopyNode(vtkMRMLNode *n)
Add a copy of a node to the scene.
std::vector< std::string > m_SourceNodes
WriteDataRequestFile(const std::string &vtkNotUsed(node), const std::string &vtkNotUsed(filename), int uid=0)
void SetAndObserveDisplayNodeID(const char *DisplayNodeID)
MRML node to represent a complete subject hierarchy tree.
static vtkMRMLModelHierarchyNode * SafeDownCast(vtkObject *o)
void PropagateVolumeSelection(int fit=1)
static vtkMRMLCommandLineModuleNode * SafeDownCast(vtkObject *o)
ReadDataRequestAddNodeReference(const std::string &referencingNode, const std::string &referencedNode, const std::string &role, int uid=0)
void SetActiveLabelVolumeID(const char *id)
const char * GetStorageNodeID()
vtkMRMLDisplayNode * GetDisplayNode()
Get associated display MRML node
virtual bool AddDefaultStorageNode(const char *filename=nullptr)
virtual void Copy(vtkMRMLNode *node)
Copy node contents from another node of the same type. Does not copy node ID and Scene. Performs deep copy - an independent copy is created from all data, including bulk data.
MRML node to represent a 3D surface model.
void SetAndObserveStorageNodeID(const char *storageNodeID)
String ID of the storage MRML node
A set of MRML Nodes that supports serialization and undo/redo.
Definition: vtkMRMLScene.h:57
virtual char * GetID()
ID use by other nodes to reference this node in XML.
vtkMRMLNode * AddNodeReferenceID(const char *referenceRole, const char *referencedNodeID)
Convenience method that adds a referencedNodeID at the end of the list.
std::vector< std::string > m_SourceNodes
virtual char * GetFileName()
int Commit(const char *url=nullptr, vtkMRMLMessageCollection *userMessages=nullptr)
ReadDataRequestUpdateParentTransform(const std::string &updatedNode, const std::string &parentTransformNode, int uid=0)
static vtkMRMLLabelMapVolumeNode * SafeDownCast(vtkObject *o)
static vtkMRMLSubjectHierarchyNode * GetSubjectHierarchyNode(vtkMRMLScene *scene)
virtual void CreateDefaultDisplayNodes()
void StartState(unsigned long state, int anticipatedMaxProgress=0)
Flag the scene as being in a state mode.
void PropagateTableSelection()
Propagate selected table in the SelectionNode to table view nodes.
virtual vtkCacheManager * GetCacheManager()
std::vector< std::string > m_TargetNodes
vtkMRMLNode * GetNodeByID(const char *name)
Get node given a unique ID.
vtkMRMLDisplayNode * GetDisplayNode()
static vtkMRMLStorableNode * SafeDownCast(vtkObject *o)
std::string GetItemLevel(vtkIdType itemID)
Convenience function to get level attribute for a subject hierarchy item.
A superclass for other storage nodes.
void SetModelNodeID(const char *id)
String ID of the model MRML node
MRML node to represent a hierarchyu of models.
static vtkMRMLTableNode * SafeDownCast(vtkObject *o)
vtkMRMLModelNode * GetModelNode()
Get associated model MRML node
int Import(vtkMRMLMessageCollection *userMessages=nullptr)
Add the scene into the existing scene (no clear) from URL file or from.
void SetURL(const char *url)
Set URL (file name) of the scene.
virtual int IsRemoteReference(const char *uri)
vtkIdType GetItemByDataNode(vtkMRMLNode *dataNode)
vtkMRMLStorageNode * GetStorageNode()
static vtkMRMLScalarVolumeNode * SafeDownCast(vtkObject *o)
void SetItemParent(vtkIdType itemID, vtkIdType parentItemID, bool enableCircularCheck=true)
bool ReadParameterFile(const std::string &filename)
static vtkMRMLDisplayableNode * SafeDownCast(vtkObject *o)
virtual void SetURI(const char *)
Location of the remote copy of this file.
Abstract class that contains graphical display properties for displayable nodes.
void Modified() override
Customized version of Modified() allowing to compress vtkCommand::ModifiedEvent.
Definition: vtkMRMLNode.h:515
void SetActiveTableID(const char *id)
Abstract Superclass for all specific types of MRML nodes.
Definition: vtkMRMLNode.h:167
MRML node for representing the parameters allowing to run a command line interface module (CLI)...
ReadDataRequestScene(const std::vector< std::string > &targetNodes, const std::vector< std::string > &sourceNodes, const std::string &filename, int displayData, int deleteFile, int uid=0)
vtkIdType GetItemParent(vtkIdType itemID)
std::vector< std::string > m_TargetNodes
static vtkMRMLTransformableNode * SafeDownCast(vtkObject *o)
static vtkMRMLModelNode * SafeDownCast(vtkObject *o)
MRML node for representing a node with a transform.
void Execute(vtkSlicerApplicationLogic *appLogic) override
ReadDataRequestFile(const std::string &node, const std::string &filename, int displayData, int deleteFile, int uid=0)
virtual void Execute(vtkSlicerApplicationLogic *)