Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "QmitkIsoSurface.h"
00019
00020
00021
00022
00023 #include <mitkSurface.h>
00024 #include <mitkManualSegmentationToSurfaceFilter.h>
00025 #include <mitkIDataStorageService.h>
00026 #include <mitkNodePredicateDataType.h>
00027
00028
00029 #include <QmitkCommonFunctionality.h>
00030 #include <QmitkSelectableGLWidget.h>
00031 #include <QmitkStdMultiWidget.h>
00032
00033
00034 #include <qaction.h>
00035 #include <qapplication.h>
00036 #include <qcursor.h>
00037 #include <qlineedit.h>
00038 #include <qpushbutton.h>
00039 #include <qmessagebox.h>
00040
00041 #include <string.h>
00042
00043
00044 QmitkIsoSurface::QmitkIsoSurface(QObject * , const char * )
00045 : QmitkFunctionality() ,
00046 m_Controls(NULL),
00047 m_MitkImage(NULL),
00048 m_SurfaceCounter(0)
00049 {
00050
00051 }
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 void QmitkIsoSurface::CreateQtPartControl(QWidget *parent)
00071 {
00072 if (!m_Controls)
00073 {
00074 m_Controls = new Ui::QmitkIsoSurfaceControls;
00075 m_Controls->setupUi(parent);
00076 this->CreateConnections();
00077
00078 m_Controls->m_ImageSelector->SetDataStorage(this->GetDefaultDataStorage());
00079 m_Controls->m_ImageSelector->SetPredicate(mitk::NodePredicateDataType::New("Image"));
00080
00081 berry::IPreferences::Pointer prefs = this->GetPreferences();
00082 if(prefs.IsNotNull())
00083 m_Controls->thresholdLineEdit->setText(QString::fromStdString(prefs->Get("defaultThreshold", "0")));
00084 }
00085 }
00086
00087 void QmitkIsoSurface::CreateConnections()
00088 {
00089 if ( m_Controls )
00090 {
00091 connect( m_Controls->m_ImageSelector, SIGNAL(OnSelectionChanged(const mitk::DataNode*)), this, SLOT(ImageSelected(const mitk::DataNode*)) );
00092 connect( m_Controls->createSurfacePushButton, SIGNAL(clicked()), this, SLOT(CreateSurface()) );
00093 }
00094 }
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105 void QmitkIsoSurface::DataStorageChanged()
00106 {
00107
00108 }
00109
00110
00111 void QmitkIsoSurface::ImageSelected(const mitk::DataNode* item)
00112 {
00113
00114 if( item == 0 || item->GetData() == 0 )
00115 return;
00116
00117 m_MitkImage = dynamic_cast<mitk::Image*> (item->GetData());
00118 }
00119
00120
00121 void QmitkIsoSurface::CreateSurface()
00122 {
00123 QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
00124 if(m_MitkImage != NULL)
00125 {
00126
00127
00128
00129
00130 float targetReduction = 0.05;
00131
00132
00133 mitk::DataNode::Pointer node = m_Controls->m_ImageSelector->GetSelectedNode();
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145 mitk::ManualSegmentationToSurfaceFilter::Pointer filter = mitk::ManualSegmentationToSurfaceFilter::New();
00146 if (filter.IsNull())
00147 {
00148 std::cout<<"NULL Pointer for ManualSegmentationToSurfaceFilter"<<std::endl;
00149 return;
00150 }
00151
00152 filter->SetInput( m_MitkImage );
00153 filter->SetGaussianStandardDeviation( 0.5 );
00154 filter->SetUseGaussianImageSmooth( true );
00155 filter->SetThreshold( getThreshold());
00156
00157 filter->SetTargetReduction( targetReduction );
00158
00159
00160 int numOfPolys = filter->GetOutput()->GetVtkPolyData()->GetNumberOfPolys();
00161 if(numOfPolys>2000000)
00162 {
00163 QApplication::restoreOverrideCursor();
00164 if(QMessageBox::question(NULL, "CAUTION!!!", "The number of polygons is greater than 2 000 000. If you continue, the program might crash. How do you want to go on?", "Proceed anyway!", "Cancel immediately! (maybe you want to insert an other threshold)!",QString::null,0 ,1)==1)
00165 {
00166
00167 return;
00168 }
00169 QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
00170 }
00171 mitk::DataNode::Pointer surfaceNode = mitk::DataNode::New();
00172 surfaceNode->SetData( filter->GetOutput() );
00173
00174 int layer = 0;
00175
00176 ++m_SurfaceCounter;
00177 std::ostringstream buffer;
00178 buffer << m_SurfaceCounter;
00179 std::string surfaceNodeName = "Surface " + buffer.str();
00180
00181 node->GetIntProperty("layer", layer);
00182 surfaceNode->SetIntProperty("layer", layer+1);
00183 surfaceNode->SetProperty("Surface", mitk::BoolProperty::New(true));
00184 surfaceNode->SetProperty("name", mitk::StringProperty::New(surfaceNodeName));
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203 this->GetDefaultDataStorage()->Add(surfaceNode, node);
00204
00205 mitk::Surface::Pointer surface = filter->GetOutput();
00206
00207
00208 surfaceNode->SetColor( m_RainbowColor.GetNextColor() );
00209 surfaceNode->SetVisibility(true);
00210
00211 this->GetActiveStdMultiWidget()->RequestUpdate();
00212
00213 }
00214
00215 QApplication::restoreOverrideCursor();
00216 }
00217
00218
00219 float QmitkIsoSurface::getThreshold()
00220 {
00221 return m_Controls->thresholdLineEdit->text().toFloat();
00222 }
00223
00224 void QmitkIsoSurface::StdMultiWidgetAvailable( QmitkStdMultiWidget& )
00225 {
00226 m_Parent->setEnabled(true);
00227 }
00228
00229 void QmitkIsoSurface::StdMultiWidgetNotAvailable()
00230 {
00231 m_Parent->setEnabled(false);
00232 }
00233
00234 QmitkIsoSurface::~QmitkIsoSurface()
00235 {
00236
00237 berry::IPreferences::Pointer prefs = this->GetPreferences();
00238 if(prefs.IsNotNull())
00239 prefs->Put("defaultThreshold", m_Controls->thresholdLineEdit->text().toStdString());
00240 }