| 364 | } |
| 365 | |
| 366 | mitk::SegWithPreviewTool::LabelMappingType mitk::SegWithPreviewTool::GetLabelMapping() const |
| 367 | { |
| 368 | MultiLabelSegmentation::LabelValueType offset = 0; |
| 369 | |
| 370 | if (LabelTransferMode::AddLabel == m_LabelTransferMode && LabelTransferScope::ActiveLabel!=m_LabelTransferScope) |
| 371 | { |
| 372 | //If we are not just working on active label and transfer mode is add, we need to compute an offset for adding the |
| 373 | //preview labels instat of just mapping them to existing segmentation labels. |
| 374 | const auto segmentation = this->GetTargetSegmentation(); |
| 375 | if (nullptr == segmentation) |
| 376 | mitkThrow() << "Invalid state of SegWithPreviewTool. Cannot GetLabelMapping if no target segmentation is set."; |
| 377 | |
| 378 | auto labels = segmentation->GetLabels(); |
| 379 | auto maxLabelIter = std::max_element(std::begin(labels), std::end(labels), [](const Label::Pointer& a, const Label::Pointer& b) { |
| 380 | return a->GetValue() < b->GetValue(); |
| 381 | }); |
| 382 | |
| 383 | if (maxLabelIter != labels.end()) |
| 384 | { |
| 385 | offset = maxLabelIter->GetPointer()->GetValue(); |
| 386 | } |
| 387 | } |
| 388 | |
| 389 | LabelMappingType labelMapping = {}; |
| 390 | |
| 391 | switch (this->m_LabelTransferScope) |
| 392 | { |
| 393 | case LabelTransferScope::SelectedLabels: |
| 394 | { |
| 395 | for (auto label : this->m_SelectedLabels) |
| 396 | { |
| 397 | labelMapping.push_back({label, label + offset}); |
| 398 | } |
| 399 | } |
| 400 | break; |
| 401 | case LabelTransferScope::AllLabels: |
| 402 | { |
| 403 | const auto labelValues = this->GetPreviewSegmentation()->GetLabelValuesByGroup(this->GetPreviewSegmentation()->GetActiveLayer()); |
| 404 | for (auto labelValue : labelValues) |
| 405 | { |
| 406 | labelMapping.push_back({ labelValue, labelValue + offset}); |
| 407 | } |
| 408 | } |
| 409 | break; |
| 410 | default: |
| 411 | { |
| 412 | if (m_SelectedLabels.empty()) |
| 413 | mitkThrow() << "Failed to generate label transfer mapping. Tool is in an invalid state, as " |
| 414 | "LabelTransferScope==ActiveLabel but no label is indicated as selected label. Check " |
| 415 | "implementation of derived tool class."; |
| 416 | if (m_SelectedLabels.size() > 1) |
| 417 | mitkThrow() << "Failed to generate label transfer mapping. Tool is in an invalid state, as " |
| 418 | "LabelTransferScope==ActiveLabel but more then one selected label is indicated." |
| 419 | "Should be only one. Check implementation of derived tool class."; |
| 420 | labelMapping.push_back({m_SelectedLabels.front(), this->GetUserDefinedActiveLabel()}); |
| 421 | } |
| 422 | break; |
| 423 | } |
no test coverage detected