diff --git a/Modules/Loadable/Markups/MRML/vtkMRMLMarkupsNode.cxx b/Modules/Loadable/Markups/MRML/vtkMRMLMarkupsNode.cxx index 837df8823150d925ddb279d5c834b8d95cc3736e..b8fbe556e906b95c65a14210ec2719d164b36e08 100644 --- a/Modules/Loadable/Markups/MRML/vtkMRMLMarkupsNode.cxx +++ b/Modules/Loadable/Markups/MRML/vtkMRMLMarkupsNode.cxx @@ -919,6 +919,43 @@ std::string vtkMRMLMarkupsNode::GetNthMarkupID(int n) return id; } +//------------------------------------------------------------------------- +int vtkMRMLMarkupsNode::GetMarkupIndexByID(const char* markupID) +{ + if (!markupID) + { + return -1; + } + + int numberOfMarkups = this->GetNumberOfMarkups(); + for (int i = 0; i < numberOfMarkups; ++i) + { + Markup* compareMarkup = this->GetNthMarkup(i); + if (compareMarkup && + strcmp(compareMarkup->ID.c_str(), markupID) == 0) + { + return i; + } + } + return -1; +} + +//------------------------------------------------------------------------- +Markup* vtkMRMLMarkupsNode::GetMarkupByID(const char* markupID) +{ + if (!markupID) + { + return NULL; + } + + int markupIndex = this->GetMarkupIndexByID(markupID); + if (markupIndex >= 0 && markupIndex < this->GetNumberOfMarkups()) + { + return this->GetNthMarkup(markupIndex); + } + return NULL; +} + //----------------------------------------------------------- void vtkMRMLMarkupsNode::SetNthMarkupID(int n, std::string id) { diff --git a/Modules/Loadable/Markups/MRML/vtkMRMLMarkupsNode.h b/Modules/Loadable/Markups/MRML/vtkMRMLMarkupsNode.h index 0a528bcd99180cd9b5adbeeb15261e9532f0fcc9..aa88c873fc8c95d5a71e03819647bdf70fc9db76 100644 --- a/Modules/Loadable/Markups/MRML/vtkMRMLMarkupsNode.h +++ b/Modules/Loadable/Markups/MRML/vtkMRMLMarkupsNode.h @@ -240,6 +240,10 @@ public: /// Get the id for the nth markup std::string GetNthMarkupID(int n = 0); + /// Get Markup index based on it's ID + int GetMarkupIndexByID(const char* markupID); + /// Get Markup based on it's ID + Markup* GetMarkupByID(const char* markupID); /// Get the Selected flag on the nth markup, returns false if markup doesn't /// exist diff --git a/Modules/Loadable/Markups/Testing/Cxx/vtkMRMLMarkupsNodeTest2.cxx b/Modules/Loadable/Markups/Testing/Cxx/vtkMRMLMarkupsNodeTest2.cxx index 475e100163e96ab596c9e464f0c4acbc74efbaa3..bc0cda2783d57aa7369d139d11accf271a7aaedf 100644 --- a/Modules/Loadable/Markups/Testing/Cxx/vtkMRMLMarkupsNodeTest2.cxx +++ b/Modules/Loadable/Markups/Testing/Cxx/vtkMRMLMarkupsNodeTest2.cxx @@ -145,5 +145,52 @@ int vtkMRMLMarkupsNodeTest2(int , char * [] ) return EXIT_FAILURE; } + // Check if ID returned is valid + if (node1->GetNumberOfMarkups() > 0) + { + Markup* markup = node1->GetNthMarkup(0); + const char* markupID = markup->ID.c_str(); + int markupIndex = node1->GetMarkupIndexByID(markupID); + if (node1->GetMarkupByID(markupID) != markup) + { + std::cerr << "Get Markup by ID failed" << std::endl; + return EXIT_FAILURE; + } + if (markupIndex != 0) + { + std::cerr << "Get Markup index by ID failed, returned " + << markupIndex << ", expecting 0" << std::endl; + return EXIT_FAILURE; + } + } + + // Check returned value with a NULL ID + Markup* markupNull = node1->GetMarkupByID(NULL); + int indexNull = node1->GetMarkupIndexByID(NULL); + if (markupNull) + { + std::cerr << "Get Markup by ID with NULL parameters failed" << std::endl; + return EXIT_FAILURE; + } + if (indexNull >= 0) + { + std::cerr << "Get Markup index by ID with NULL parameters failed" << std::endl; + return EXIT_FAILURE; + } + + // Check returned value with an invalid ID + Markup* markupInvalid = node1->GetMarkupByID("Invalid"); + int indexInvalid = node1->GetMarkupIndexByID("Invalid"); + if (markupInvalid) + { + std::cerr << "Get Markup by ID with invalid ID failed" << std::endl; + return EXIT_FAILURE; + } + if (indexInvalid >= 0) + { + std::cerr << "Get Markup index by ID with invalid ID failed" << std::endl; + return EXIT_FAILURE; + } + return EXIT_SUCCESS; }