| 92 | } |
| 93 | |
| 94 | void mitk::FillRegionBaseTool::OnClick(StateMachineAction*, InteractionEvent* interactionEvent) |
| 95 | { |
| 96 | auto positionEvent = dynamic_cast<mitk::InteractionPositionEvent*>(interactionEvent); |
| 97 | if (nullptr == positionEvent) |
| 98 | return; |
| 99 | |
| 100 | auto labelSetImage = this->GetWorkingData(); |
| 101 | if (nullptr == labelSetImage) |
| 102 | { |
| 103 | return; |
| 104 | } |
| 105 | |
| 106 | if (!IsPositionEventInsideImageRegion(positionEvent, labelSetImage)) |
| 107 | { |
| 108 | return; |
| 109 | } |
| 110 | |
| 111 | m_LastEventSender = positionEvent->GetSender(); |
| 112 | m_LastEventSlice = m_LastEventSender->GetSlice(); |
| 113 | |
| 114 | auto workingSlice = this->GetAffectedWorkingSlice(positionEvent); |
| 115 | |
| 116 | auto click = positionEvent->GetPositionInWorld(); |
| 117 | |
| 118 | m_SeedLabelValue = 0; |
| 119 | auto fillImage = this->GenerateFillImage(workingSlice, click, m_SeedLabelValue); |
| 120 | |
| 121 | if (fillImage.IsNull()) |
| 122 | { |
| 123 | return; //nothing to fill; |
| 124 | } |
| 125 | |
| 126 | auto activeLabel = labelSetImage->GetActiveLabel(); |
| 127 | if (labelSetImage->IsLabelLocked(m_SeedLabelValue) && (nullptr == activeLabel || m_SeedLabelValue != activeLabel->GetValue())) |
| 128 | { |
| 129 | ErrorMessage.Send("Label of selected region is locked. Tool operation has no effect."); |
| 130 | return; |
| 131 | } |
| 132 | |
| 133 | this->PrepareFilling(workingSlice, click); |
| 134 | |
| 135 | auto relevantLabelValues = labelSetImage->GetLabelValuesByGroup(labelSetImage->GetActiveLayer()); |
| 136 | |
| 137 | //as fill region tools should always allow to manipulate active label |
| 138 | //(that is what the user expects/knows when using tools so far: |
| 139 | //the active label can always be changed even if locked) |
| 140 | //we realize that by cloning the relevant label set and changing the lock state |
| 141 | //this fillLabelSet is used for the transfer. |
| 142 | auto activeLabelClone = labelSetImage->GetActiveLabel()->Clone(); |
| 143 | if (nullptr != activeLabelClone) |
| 144 | { |
| 145 | activeLabelClone->SetLocked(false); |
| 146 | } |
| 147 | |
| 148 | relevantLabelValues.erase(std::remove(relevantLabelValues.begin(), relevantLabelValues.end(), activeLabelClone->GetValue())); |
| 149 | auto relevantLabels = labelSetImage->GetConstLabelsByValue(relevantLabelValues); |
| 150 | relevantLabels.push_back(activeLabelClone); |
| 151 |
nothing calls this directly
no test coverage detected