Go to the documentation of this file.00001 #include "mitkMorphologicTool.h"
00002 #include "mitkToolManager.h"
00003 #include "mitkRenderingManager.h"
00004 #include "mitkBoundingObject.h"
00005 #include "mitkImageCast.h"
00006 #include "mitkBoundingObjectToSegmentationFilter.h"
00007
00008 #include "itkMaskImageFilter.h"
00009
00010 mitk::MorphologicTool::MorphologicTool() : Tool("dummy"),
00011 m_Radius(0),
00012 m_Preview(true)
00013 {
00014 this->SupportRoiOn();
00015
00016 m_FeedbackNode = mitk::DataNode::New();
00017 m_FeedbackNode->SetColor(1.0,1.0,1.0);
00018 m_FeedbackNode->SetName("feedback node");
00019 m_FeedbackNode->SetProperty("helper object", mitk::BoolProperty::New("true"));
00020 }
00021
00022 mitk::MorphologicTool::~MorphologicTool()
00023 {
00024
00025 }
00026
00027 const char* mitk::MorphologicTool::GetGroup() const
00028 {
00029 return "morphologic";
00030 }
00031
00032 void mitk::MorphologicTool::AcceptPreview(const std::string& name, const Color& color)
00033 {
00034 mitk::DataNode::Pointer resultNode = mitk::DataNode::New();
00035
00036 mitk::Image::Pointer image;
00037 if (m_Preview)
00038 image = dynamic_cast<Image*>( m_FeedbackNode->GetData() );
00039 else
00040 image = ApplyFilter(dynamic_cast<Image*> (m_NodeToProceed->GetData()));
00041
00042 if (image.IsNotNull())
00043 {
00044 resultNode->SetData(image);
00045 resultNode->SetName(name);
00046 resultNode->SetColor(color);
00047
00048 if (mitk::DataStorage* ds = m_ToolManager->GetDataStorage())
00049 {
00050 ds->Add(resultNode);
00051 }
00052 }
00053
00054 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00055 m_ToolManager->ActivateTool(-1);
00056 }
00057
00058 void mitk::MorphologicTool::CancelPreviewing()
00059 {
00060 m_ToolManager->ActivateTool(-1);
00061 }
00062
00063 void mitk::MorphologicTool::SetRadius(unsigned int value)
00064 {
00065 m_Radius = value;
00066 this->UpdatePreview();
00067 }
00068
00069 void mitk::MorphologicTool::UpdatePreview()
00070 {
00071
00072 mitk::Image::Pointer image = dynamic_cast<mitk::Image*>( m_NodeToProceed->GetData() );
00073
00074 if (image && m_Preview)
00075 {
00076 if (m_Radius == 0)
00077 m_FeedbackNode->SetData(image);
00078 else
00079 {
00080 m_FeedbackNode->SetData(ApplyFilter(image));
00081 }
00082 }
00083 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00084 }
00085
00086 mitk::Image::Pointer mitk::MorphologicTool::ApplyFilter(mitk::Image::Pointer image)
00087 {
00088 return image;
00089 }
00090
00091 void mitk::MorphologicTool::SetupPreviewNodeFor(mitk::DataNode* nodeToProceed)
00092 {
00093 if (nodeToProceed)
00094 {
00095 mitk::Image::Pointer image = dynamic_cast<Image*>( nodeToProceed->GetData() );
00096 if (image.IsNotNull())
00097 {
00098
00099 m_FeedbackNode->SetData( image );
00100
00101 if (mitk::DataStorage* ds = m_ToolManager->GetDataStorage())
00102 {
00103 if (ds->Exists(m_FeedbackNode))
00104 ds->Remove(m_FeedbackNode);
00105 ds->Add( m_FeedbackNode, nodeToProceed );
00106 }
00107 }
00108 }
00109 }
00110
00111 void mitk::MorphologicTool::Activated()
00112 {
00113 m_ToolManager->RoiDataChanged += mitk::MessageDelegate<mitk::MorphologicTool>(this, &mitk::MorphologicTool::OnRoiDataChanged);
00114
00115 m_OriginalNode = m_ToolManager->GetReferenceData(0);
00116 m_NodeToProceed = m_OriginalNode;
00117
00118 if( m_NodeToProceed != NULL)
00119 SetupPreviewNodeFor(m_NodeToProceed);
00120
00121 else
00122 m_ToolManager->ActivateTool(-1);
00123 }
00124
00125 void mitk::MorphologicTool::Deactivated()
00126 {
00127 m_ToolManager->RoiDataChanged -= mitk::MessageDelegate<mitk::MorphologicTool>(this, &mitk::MorphologicTool::OnRoiDataChanged);
00128
00129 m_NodeToProceed = NULL;
00130
00131 if (mitk::DataStorage* ds = m_ToolManager->GetDataStorage())
00132 {
00133 ds->Remove(m_FeedbackNode);
00134 mitk::RenderingManager::GetInstance()->RequestUpdateAll();
00135 }
00136 m_FeedbackNode->SetData(NULL);
00137 }
00138
00139 void mitk::MorphologicTool::OnRoiDataChanged()
00140 {
00141 typedef itk::Image<int, 3> ItkImageType;
00142 typedef itk::Image<unsigned char, 3> ItkMaskType;
00143 typedef itk::MaskImageFilter<ItkImageType, ItkMaskType, ItkImageType> MaskFilterType;
00144 mitk::DataNode* node = m_ToolManager->GetRoiData(0);
00145 if (node == NULL)
00146 {
00147 this->SetupPreviewNodeFor(m_OriginalNode);
00148 m_NodeToProceed = m_OriginalNode;
00149 return;
00150 }
00151
00152 mitk::DataNode::Pointer new_node = mitk::DataNode::New();
00153 mitk::Image* image = dynamic_cast<mitk::Image*> (m_OriginalNode->GetData());
00154 mitk::Image::Pointer new_image = mitk::Image::New();
00155
00156 mitk::Image::Pointer roi;
00157 mitk::BoundingObject* boundingObject = dynamic_cast<mitk::BoundingObject*> (node->GetData());
00158
00159 if (boundingObject)
00160 {
00161 mitk::BoundingObjectToSegmentationFilter::Pointer filter = mitk::BoundingObjectToSegmentationFilter::New();
00162 filter->SetBoundingObject( boundingObject);
00163 filter->SetInput(image);
00164 filter->Update();
00165 roi = filter->GetOutput();
00166 }
00167 else
00168 roi = dynamic_cast<mitk::Image*> (node->GetData());
00169
00170 if (roi)
00171 {
00172 MaskFilterType::Pointer filter = MaskFilterType::New();
00173 ItkMaskType::Pointer itkRoi = ItkMaskType::New();
00174 ItkImageType::Pointer itkImage = ItkImageType::New();
00175 mitk::CastToItkImage(image, itkImage);
00176 mitk::CastToItkImage(roi, itkRoi);
00177 filter->SetInput1(itkImage);
00178 filter->SetInput2(itkRoi);
00179 filter->SetOutsideValue(0);
00180 filter->Update();
00181 mitk::CastToMitkImage(filter->GetOutput(),new_image);
00182 }
00183 new_node->SetData(new_image);
00184
00185 this->SetupPreviewNodeFor(new_node);
00186 m_NodeToProceed = new_node;
00187
00188 UpdatePreview();
00189 }