.. _program_listing_file_Logic_vtkSlicerLayerDMLogic.h: Program Listing for File vtkSlicerLayerDMLogic.h ================================================ |exhale_lsh| :ref:`Return to documentation for file ` (``Logic/vtkSlicerLayerDMLogic.h``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #pragma once #include "vtkSlicerLayerDMModuleLogicExport.h" // Slicer includes #include #include #include class vtkMRMLLayerDMWidgetEventTranslationNode; class VTK_SLICER_LAYERDM_MODULE_LOGIC_EXPORT vtkSlicerLayerDMLogic : public vtkSlicerModuleLogic { public: static vtkSlicerLayerDMLogic* New(); vtkTypeMacro(vtkSlicerLayerDMLogic, vtkSlicerModuleLogic); vtkSlicerLayerDMLogic(const vtkSlicerLayerDMLogic&) = delete; void operator=(const vtkSlicerLayerDMLogic&) = delete; void RegisterNodes() override; static int GetVersionMajor(); static int GetVersionMinor(); static int GetVersionPatch(); static std::string GetVersion(); static void SetWidgetEventTranslationNode(vtkMRMLNode* node, vtkMRMLLayerDMWidgetEventTranslationNode* translationNode); static vtkMRMLLayerDMWidgetEventTranslationNode* GetWidgetEventTranslationNode(vtkMRMLNode* node); static vtkMRMLLayerDMWidgetEventTranslationNode* GetWidgetEventTranslationSingleton(vtkMRMLScene* scene, const std::string& singletonId); static vtkMRMLLayerDMWidgetEventTranslationNode* GetWidgetEventTranslationSingleton(vtkMRMLScene* scene, const std::string& singletonId, const std::function& configureF); static vtkMRMLLayerDMWidgetEventTranslationNode* CreateWidgetEventTranslationSingleton(vtkMRMLScene* scene, const std::string& singletonId); static void CreateDefaultEventTranslation(vtkMRMLNode* node, const std::string& singletonId, const std::function& configureF); static std::string GetEventTranslationRole(); static std::string GetDisplayRole(); template static void RegisterNodeIfNeeded(vtkMRMLScene* scene); template static T* GetDisplayNode(vtkMRMLNode* node); template static T* GetReferenceNode(vtkMRMLNode* node, const char* role); template static T* GetReferenceNode(vtkMRMLNode* node); template static std::vector GetReferenceNodes(vtkMRMLNode* node, const char* role); template static std::vector GetReferenceNodes(vtkMRMLNode* node); template static T* CreateDisplayNode(vtkMRMLNode* node, bool allowMultiple = false); template static T* CreateReferenceNode(vtkMRMLNode* node, const char* role, bool allowMultiple = false); template static T* CreateReferenceNode(vtkMRMLNode* node, bool allowMultiple = false); template static T* AddReferenceNode(vtkMRMLNode* node, T* nodeRef, const char* role); template static T* SetReferenceNode(vtkMRMLNode* node, T* nodeRef, const char* role); template static T* SetNthReferenceNode(vtkMRMLNode* node, T* nodeRef, const char* role, int nthRef); protected: vtkSlicerLayerDMLogic() = default; ~vtkSlicerLayerDMLogic() override = default; private: template static T* ModifyNodeReference(vtkMRMLNode* node, vtkMRMLNode* nodeRef, const std::function& modifyF) { if (!node || !nodeRef) { return nullptr; } modifyF(); return T::SafeDownCast(nodeRef); } static constexpr auto EventTranslationRole{ "widgetEventTranslation" }; static constexpr auto DisplayRole{ "display" }; // copied from vtkMRMLDisplayableNode }; //---------------------------------------------------------------------------- template void vtkSlicerLayerDMLogic::RegisterNodeIfNeeded(vtkMRMLScene* scene) { if (!scene) { return; } vtkNew node; if (!scene->IsNodeClassRegistered(node.Get()->GetClassName())) { scene->RegisterNodeClass(node.Get()); } } template T* vtkSlicerLayerDMLogic::GetDisplayNode(vtkMRMLNode* node) { if (!node) { return {}; } return GetReferenceNode(node, DisplayRole); } template T* vtkSlicerLayerDMLogic::GetReferenceNode(vtkMRMLNode* node, const char* role) { const auto referenceNodes = GetReferenceNodes(node, role); return referenceNodes.empty() ? nullptr : referenceNodes[0]; } template T* vtkSlicerLayerDMLogic::GetReferenceNode(vtkMRMLNode* node) { return GetReferenceNode(node, T::GetReferenceRole()); } template std::vector vtkSlicerLayerDMLogic::GetReferenceNodes(vtkMRMLNode* node, const char* role) { if (!node) { return {}; } std::vector referenceNodes; for (int i_node = 0; i_node < node->GetNumberOfNodeReferences(role); i_node++) { if (auto refNode = T::SafeDownCast(node->GetNthNodeReference(role, i_node))) { referenceNodes.emplace_back(refNode); } } return referenceNodes; } template std::vector vtkSlicerLayerDMLogic::GetReferenceNodes(vtkMRMLNode* node) { return GetReferenceNodes(node, T::GetReferenceRole()); } template T* vtkSlicerLayerDMLogic::CreateDisplayNode(vtkMRMLNode* node, bool allowMultiple) { if (!node) { return {}; } return CreateReferenceNode(node, DisplayRole, allowMultiple); } template T* vtkSlicerLayerDMLogic::CreateReferenceNode(vtkMRMLNode* node, const char* role, bool allowMultiple) { auto scene = node ? node->GetScene() : nullptr; if (!node || !scene) { return {}; } auto nodeRef = GetReferenceNode(node, role); if (nodeRef && !allowMultiple) { return nodeRef; } nodeRef = T::SafeDownCast(scene->AddNewNodeByClass(vtkSmartPointer::New()->GetClassName())); return AddReferenceNode(node, nodeRef, role); } template T* vtkSlicerLayerDMLogic::CreateReferenceNode(vtkMRMLNode* node, bool allowMultiple) { return CreateReferenceNode(node, T::GetReferenceRole(), allowMultiple); } template T* vtkSlicerLayerDMLogic::AddReferenceNode(vtkMRMLNode* node, T* nodeRef, const char* role) { return ModifyNodeReference(node, nodeRef, [=] { node->AddAndObserveNodeReferenceID(role, nodeRef->GetID()); }); } template T* vtkSlicerLayerDMLogic::SetReferenceNode(vtkMRMLNode* node, T* nodeRef, const char* role) { return ModifyNodeReference(node, nodeRef, [=] { node->SetAndObserveNodeReferenceID(role, nodeRef->GetID()); }); } template T* vtkSlicerLayerDMLogic::SetNthReferenceNode(vtkMRMLNode* node, T* nodeRef, const char* role, int nthRef) { return ModifyNodeReference(node, nodeRef, [=] { node->SetAndObserveNthNodeReferenceID(role, nthRef, nodeRef->GetID()); }); }