25 #include <itkCommand.h> 29 , m_LevelWindowProperty(nullptr)
31 , m_SelectedImagesMode(false)
32 , m_IsObserverTagSet(false)
33 , m_CurrentImage(nullptr)
34 , m_IsPropertyModifiedTagSet(false)
35 , m_LevelWindowMutex(false)
118 for (DataStorage::SetOfObjects::ConstIterator it = all->Begin(); it != all->End(); ++it)
121 if (node.IsNull() || node == removedNode)
127 node->SetBoolProperty(
"imageForLevelWindow",
false);
130 if (
false == node->IsVisible(
nullptr))
136 node->GetIntProperty(
"layer", layer);
137 if (layer < maxVisibleLayer)
150 maxVisibleLayer = layer;
190 for (DataStorage::SetOfObjects::ConstIterator it = all->Begin(); it != all->End(); ++it)
193 if (node.IsNull() || node == removedNode)
199 node->SetBoolProperty(
"imageForLevelWindow",
false);
202 if (
false == node->IsSelected())
215 lastSelectedNode = node;
230 for (DataStorage::SetOfObjects::ConstIterator it = all->Begin(); it != all->End(); ++it)
236 bool isSelected =
false;
237 node->GetBoolProperty(
"selected", isSelected);
241 node->GetLevelWindow(selectedLevelWindow);
243 auto *
image =
dynamic_cast<Image *
>(node->GetData());
244 int displayedComponent = 0;
245 if (
image && (node->GetIntProperty(
"Image.Displayed Component", displayedComponent)))
248 selectedLevelWindow.
SetAuto(
image,
true,
true, static_cast<unsigned>(displayedComponent));
249 node->SetLevelWindow(selectedLevelWindow);
254 node->GetLevelWindow(levelWindow);
282 std::vector<DataNode::Pointer> nodesForLevelWindow;
285 for (DataStorage::SetOfObjects::ConstIterator it = all->Begin(); it != all->End(); ++it)
294 if (node->IsVisible(
nullptr) ==
false)
300 node->GetBoolProperty(
"imageForLevelWindow", prop);
303 nodesForLevelWindow.push_back(node);
308 node->GetIntProperty(
"layer", layer);
309 if (layer > maxVisibleLayer)
314 maxVisibleLayer = layer;
318 int nodesForLevelWindowSize = nodesForLevelWindow.size();
319 if (nodesForLevelWindowSize > 2)
321 MITK_ERROR <<
"Error: not more than two visible nodes are expected to have the imageForLevelWindow property set at " 325 if (nodesForLevelWindowSize > 0)
328 for (
const auto& node : nodesForLevelWindow)
338 else if (topLevelNode)
367 if (levelWindowProperty.IsNull())
373 DataStorage::SetOfObjects::ConstPointer all =
m_DataStorage->GetAll();
375 for (DataStorage::SetOfObjects::ConstIterator it = all->Begin(); it != all->End(); ++it)
379 if (property == levelWindowProperty)
386 node->SetBoolProperty(
"imageForLevelWindow",
false);
391 if (propNode.IsNull())
404 itk::ReceptorMemberCommand<LevelWindowManager>::Pointer command =
405 itk::ReceptorMemberCommand<LevelWindowManager>::New();
413 propNode->SetBoolProperty(
"imageForLevelWindow",
true);
426 auto levelWindowProperty =
dynamic_cast<LevelWindowProperty *
>(dataNode->GetProperty(
"levelwindow"));
427 if (
nullptr == levelWindowProperty)
451 mitkThrow() <<
"No LevelWindow available!";
477 mitkThrow() <<
"Wrong number of observers in Level Window Manager!";
485 bool removedNodeIsRelevant =
false;
487 for (DataStorage::SetOfObjects::ConstIterator it = relevantNodes->Begin(); it != relevantNodes->End(); ++it)
489 if (it->Value() == removedNode)
491 removedNodeIsRelevant =
true;
495 if (
false == removedNodeIsRelevant)
529 mitkThrow() <<
"Wrong number of observers in Level Window Manager!";
552 return DataStorage::SetOfObjects::ConstPointer(DataStorage::SetOfObjects::New());
564 predicateTypes->AddPredicate(isImage);
565 predicateTypes->AddPredicate(isDImage);
566 predicateTypes->AddPredicate(isTImage);
567 predicateTypes->AddPredicate(isOdfImage);
568 predicateTypes->AddPredicate(isShImage);
571 predicate->AddPredicate(notBinary);
572 predicate->AddPredicate(hasLevelWindow);
573 predicate->AddPredicate(predicateTypes);
575 DataStorage::SetOfObjects::ConstPointer relevantNodes =
m_DataStorage->GetSubset(predicate);
577 return relevantNodes;
590 (*iter).second->RemoveObserver((*iter).first.first);
591 (*iter).second =
nullptr;
597 (*iter).second->RemoveObserver((*iter).first.first);
598 (*iter).second =
nullptr;
604 (*iter).second->RemoveObserver((*iter).first.first);
605 (*iter).second =
nullptr;
611 (*iter).second->RemoveObserver((*iter).first.first);
612 (*iter).second =
nullptr;
618 (*iter).second->RemoveObserver((*iter).first.first);
619 (*iter).second =
nullptr;
625 (*iter).second->RemoveObserver((*iter).first.first);
626 (*iter).second =
nullptr;
640 for (DataStorage::SetOfObjects::ConstIterator it = all->Begin(); it != all->End(); ++it)
648 itk::ReceptorMemberCommand<LevelWindowManager>::Pointer command =
649 itk::ReceptorMemberCommand<LevelWindowManager>::New();
651 unsigned long visIdx = it->Value()->GetProperty(
"visible")->AddObserver(itk::ModifiedEvent(), command);
655 itk::ReceptorMemberCommand<LevelWindowManager>::Pointer command2 =
656 itk::ReceptorMemberCommand<LevelWindowManager>::New();
658 unsigned long layerIdx = it->Value()->GetProperty(
"layer")->AddObserver(itk::ModifiedEvent(), command2);
662 itk::ReceptorMemberCommand<LevelWindowManager>::Pointer command3 =
663 itk::ReceptorMemberCommand<LevelWindowManager>::New();
666 if (imageRenderingMode.IsNotNull())
668 unsigned long rendIdx = imageRenderingMode->AddObserver(itk::ModifiedEvent(), command3);
672 itk::ReceptorMemberCommand<LevelWindowManager>::Pointer command4 =
673 itk::ReceptorMemberCommand<LevelWindowManager>::New();
675 BaseProperty::Pointer displayedImageComponent = it->Value()->GetProperty(
"Image.Displayed Component");
676 if (displayedImageComponent.IsNotNull())
678 unsigned long dispIdx = displayedImageComponent->AddObserver(itk::ModifiedEvent(), command4);
682 itk::ReceptorMemberCommand<LevelWindowManager>::Pointer command5 =
683 itk::ReceptorMemberCommand<LevelWindowManager>::New();
686 if (imgForLvlWin.IsNull())
688 it->Value()->SetBoolProperty(
"imageForLevelWindow",
false);
689 imgForLvlWin = it->Value()->GetProperty(
"imageForLevelWindow");
691 unsigned long lvlWinIdx = imgForLvlWin->AddObserver(itk::ModifiedEvent(), command5);
694 itk::ReceptorMemberCommand<LevelWindowManager>::Pointer command6 =
695 itk::ReceptorMemberCommand<LevelWindowManager>::New();
698 if (selectedDataNode.IsNull())
700 it->Value()->SetBoolProperty(
"selected",
false);
701 selectedDataNode = it->Value()->GetProperty(
"selected");
703 unsigned long selectedIdx = selectedDataNode->AddObserver(itk::ModifiedEvent(), command5);
712 if (levelWindowProperty.IsNull())
723 if (mode.IsNotNull())
725 int currMode = mode->GetRenderingMode();
726 if (currMode == nonLvlWinMode1 || currMode == nonLvlWinMode2)
void RecalculateLevelWindowForSelectedComponent(const itk::EventObject &)
void UpdateSelected(const itk::EventObject &)
Update the level window. This function is only called if the 'selected' property of a data node is ch...
mitk::BaseProperty * GetProperty(const char *propertyKey, const mitk::BaseRenderer *renderer=nullptr, bool fallBackOnDataProperties=true) const
Get the property (instance of BaseProperty) with key propertyKey from the PropertyList of the rendere...
Data management class that handles 'was created by' relations.
void DataStorageRemovedNode(const DataNode *removedNode=nullptr)
This method is called when a node is removed to the data storage. A listener on the data storage is u...
The LevelWindowProperty class Property for the mitk::LevelWindow.
void SetLevelWindow(const LevelWindow &levelWindow)
Set new Level/Window values and inform all listeners about changes.
bool IgnoreNode(const DataNode *dataNode)
ObserverToPropertyValueMap m_ObserverToLevelWindowImageProperty
Map to hold observer IDs to every "imageForLevelWindow" property of DataNode's BaseProperty.
DataStorage::Pointer m_DataStorage
void ClearPropObserverLists()
Internal help method to clear both lists/maps.
int GetNumberOfObservers()
ObserverToPropertyValueMap m_ObserverToRenderingModeProperty
Map to hold observer IDs to every "Image Rendering.Mode" property of DataNode's BaseProperty.
const LevelWindow & GetLevelWindow()
Return Level/Window values for the current image.
~LevelWindowManager() override
DataStorage::SetOfObjects::ConstPointer GetRelevantNodes()
Returns all nodes in the DataStorage that have the following properties:
std::pair< unsigned long, DataNode::Pointer > PropDataPair
ObserverToPropertyValueMap m_ObserverToLayerProperty
Map to hold observer IDs to every "layer" property of DataNode's BaseProperty.
The LevelWindow class Class to store level/window values.
void SetSelectedImages(bool selectedImagesMode, const DataNode *removedNode=nullptr)
(Re-)Initialize the LevelWindowManager by setting the selected images. Use the removedNode parameter ...
void SetLevelWindow(const LevelWindow &levWin)
bool IsAutoTopMost()
Return true, if the changes on slider or line-edits will affect the topmost layer image...
mitk::DataStorage::Pointer m_DataStorage
void OnPropertyModified(const itk::EventObject &e)
Change notifications from mitkLevelWindowProperty.
LevelWindowProperty::Pointer GetLevelWindowProperty()
Return the current LevelWindowProperty object from the image that is affected by changes.
ObserverToPropertyValueMap m_ObserverToDisplayedComponentProperty
Map to hold observer IDs to every "Image.Displayed Component" property of DataNode's BaseProperty...
void DataStorageAddedNode(const DataNode *n=nullptr)
This method is called when a node is added to the data storage. A listener on the data storage is use...
bool m_IsPropertyModifiedTagSet
void CreatePropObserverLists()
Internal help method to create both lists/maps.
bool m_SelectedImagesMode
Image class for storing images.
void SetAuto(const Image *image, bool tryPicTags=true, bool guessByCentralSlice=true, unsigned selectedComponent=0)
sets level/window to optimize the contrast of the given Image
void SetLevelWindowProperty(LevelWindowProperty::Pointer levelWindowProperty)
Set a specific LevelWindowProperty; all changes will affect the image belonging to this property...
void Update(const itk::EventObject &)
Update the level window. This function is called if a property of a data node is changed. Relevant properties are defined in the protected 'ObserverToPropertyValueMap'-members.
mitk::Image::Pointer image
ObserverToPropertyValueMap m_ObserverToVisibleProperty
Map to hold observer IDs to every "visible" property of DataNode's BaseProperty.
static Pointer New(const char *_arg)
DataStorage * GetDataStorage()
static Pointer New(const char *_arg)
LevelWindowProperty::Pointer m_LevelWindowProperty
Pointer to the LevelWindowProperty of the current image.
unsigned long m_PropertyModifiedTag
bool IsSelectedImages()
Return true, if changes on slider or line-edits will affect the currently selected images...
const DataNode * m_NodeMarkedToDelete
void SetAutoTopMostImage(bool autoTopMost, const DataNode *removedNode=nullptr)
(Re-)Initialize the LevelWindowManager by setting the topmost image. Use the removedNode parameter if...
void SetDataStorage(DataStorage *ds)
std::vector< DataNode::Pointer > m_RelevantDataNodes
Image * GetCurrentImage()
Return the currently active image.
ObserverToPropertyValueMap m_ObserverToSelectedProperty
Map to hold observer IDs to every "selected" property of DataNode's BaseProperty. ...
Class for nodes of the DataTree.