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 "QmitkSliceWidget.h"
00019 #include "QmitkStepperAdapter.h"
00020 #include "mitkNodePredicateDataType.h"
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include <QMenu>
00030 #include <QMouseEvent>
00031
00032 QmitkSliceWidget::QmitkSliceWidget(QWidget* parent, const char* name,
00033 Qt::WindowFlags f) :
00034 QWidget(parent, f)
00035 {
00036 this->setupUi(this);
00037
00038 if (name != 0)
00039 this->setObjectName(name);
00040
00041 popUp = new QMenu(this);
00042 popUp->addAction("Transversal");
00043 popUp->addAction("Frontal");
00044 popUp->addAction("Sagittal");
00045
00046 QObject::connect(popUp, SIGNAL(triggered(QAction*)), this, SLOT(ChangeView(QAction*)) );
00047 setPopUpEnabled(false);
00048
00049 m_SlicedGeometry = 0;
00050 m_View = mitk::SliceNavigationController::Transversal;
00051
00052 QHBoxLayout *hlayout = new QHBoxLayout(container);
00053 hlayout->setMargin(0);
00054
00055
00056 QString composedName("QmitkSliceWidget::");
00057 if (!this->objectName().isEmpty())
00058 composedName += this->objectName();
00059 else
00060 composedName += "QmitkGLWidget";
00061 m_RenderWindow = new QmitkRenderWindow(container, composedName);
00062 m_Renderer = m_RenderWindow->GetRenderer();
00063 hlayout->addWidget(m_RenderWindow);
00064
00065 new QmitkStepperAdapter(m_NavigatorWidget,
00066 m_RenderWindow->GetSliceNavigationController()->GetSlice(),
00067 "navigation");
00068
00069 SetLevelWindowEnabled(true);
00070
00071 }
00072
00073 mitk::VtkPropRenderer* QmitkSliceWidget::GetRenderer()
00074 {
00075 return m_Renderer;
00076 }
00077
00078 QFrame* QmitkSliceWidget::GetSelectionFrame()
00079 {
00080 return SelectionFrame;
00081 }
00082
00083 void QmitkSliceWidget::SetDataStorage(
00084 mitk::StandaloneDataStorage::Pointer storage)
00085 {
00086 m_DataStorage = storage;
00087 m_Renderer->SetDataStorage(m_DataStorage);
00088 }
00089
00090 mitk::StandaloneDataStorage* QmitkSliceWidget::GetDataStorage()
00091 {
00092 if (m_DataStorage.IsNotNull())
00093 {
00094 return m_DataStorage;
00095 }
00096 else
00097 {
00098 return NULL;
00099 }
00100 }
00101
00102 void QmitkSliceWidget::SetData(
00103 mitk::DataStorage::SetOfObjects::ConstIterator it)
00104 {
00105 SetData(it->Value(), m_View);
00106 }
00107
00108 void QmitkSliceWidget::SetData(
00109 mitk::DataStorage::SetOfObjects::ConstIterator it,
00110 mitk::SliceNavigationController::ViewDirection view)
00111 {
00112 SetData(it->Value(), view);
00113 }
00114
00115 void QmitkSliceWidget::SetData(mitk::DataNode::Pointer node)
00116 {
00117 try
00118 {
00119 if (m_DataStorage.IsNotNull())
00120 {
00121 m_DataStorage->Add(node);
00122 }
00123 } catch (...)
00124 {
00125 }
00126 SetData(node, m_View);
00127 }
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141 void QmitkSliceWidget::SetData(mitk::DataNode::Pointer ,
00142 mitk::SliceNavigationController::ViewDirection view)
00143 {
00144 try
00145 {
00146 if (m_DataStorage.IsNotNull())
00147 {
00148 levelWindow->SetDataStorage(m_DataStorage);
00149 mitk::DataStorage::SetOfObjects::ConstPointer rs =
00150 m_DataStorage->GetSubset(mitk::NodePredicateDataType::New(
00151 "Image"));
00152 mitk::DataStorage::SetOfObjects::ConstIterator it;
00153 bool noVisibleImage = true;
00154 for (it = rs->Begin(); it != rs->End(); ++it)
00155 {
00156 mitk::DataNode::Pointer node = it.Value();
00157 node->SetName("currentImage");
00158 mitk::Image::Pointer image = m_DataStorage->GetNamedObject<
00159 mitk::Image> ("currentImage");
00160
00161 if (image.IsNotNull() && node->IsVisible(GetRenderer()))
00162 {
00163 m_SlicedGeometry = image->GetSlicedGeometry();
00164 mitk::LevelWindow picLevelWindow;
00165 node->GetLevelWindow(picLevelWindow, NULL);
00166 noVisibleImage = false;
00167 break;
00168 }
00169 }
00170
00171 if (noVisibleImage)
00172 MITK_INFO << " No image visible!";
00173
00174 GetRenderer()->SetDataStorage(m_DataStorage);
00175 }
00176 InitWidget(view);
00177 } catch (...)
00178 {
00179 }
00180 }
00181
00182 void QmitkSliceWidget::InitWidget(
00183 mitk::SliceNavigationController::ViewDirection viewDirection)
00184 {
00185 m_View = viewDirection;
00186
00187 mitk::SliceNavigationController* controller =
00188 m_RenderWindow->GetSliceNavigationController();
00189
00190 if (viewDirection == mitk::SliceNavigationController::Transversal)
00191 {
00192 controller->SetViewDirection(
00193 mitk::SliceNavigationController::Transversal);
00194 }
00195 else if (viewDirection == mitk::SliceNavigationController::Frontal)
00196 {
00197 controller->SetViewDirection(mitk::SliceNavigationController::Frontal);
00198 }
00199
00200 else
00201 {
00202 controller->SetViewDirection(mitk::SliceNavigationController::Sagittal);
00203 }
00204
00205 int currentPos = 0;
00206 if (m_RenderWindow->GetSliceNavigationController())
00207 {
00208 currentPos = controller->GetSlice()->GetPos();
00209 }
00210
00211 if (m_SlicedGeometry.IsNull())
00212 {
00213 return;
00214 }
00215
00216
00217 const mitk::BoundingBox::BoundsArrayType imageBounds =
00218 m_SlicedGeometry->GetBoundingBox()->GetBounds();
00219
00220
00221 mitk::Geometry3D::Pointer
00222 geometry =
00223 static_cast<mitk::Geometry3D*> (m_SlicedGeometry->Clone().GetPointer());
00224
00225 const mitk::BoundingBox::Pointer boundingbox =
00226 m_DataStorage->ComputeVisibleBoundingBox(GetRenderer(), NULL);
00227 if (boundingbox->GetPoints()->Size() > 0)
00228 {
00231
00232
00233
00234
00235 mitk::TimeBounds timebounds = m_DataStorage->ComputeTimeBounds(
00236 GetRenderer(), NULL);
00237
00238 if (timebounds[1] < mitk::ScalarTypeNumericTraits::max())
00239 {
00240 mitk::ScalarType duration = timebounds[1] - timebounds[0];
00241
00242 mitk::TimeSlicedGeometry::Pointer timegeometry =
00243 mitk::TimeSlicedGeometry::New();
00244
00245 timegeometry->InitializeEvenlyTimed(geometry.GetPointer(),
00246 (unsigned int) duration);
00247
00248 timegeometry->SetTimeBounds(timebounds);
00249
00250 timebounds[1] = timebounds[0] + 1.0f;
00251 geometry->SetTimeBounds(timebounds);
00252
00253 geometry = timegeometry;
00254 }
00255
00256 if (const_cast<mitk::BoundingBox*> (geometry->GetBoundingBox())->GetDiagonalLength2()
00257 >= mitk::eps)
00258 {
00259 controller->SetInputWorldGeometry(geometry);
00260 controller->Update();
00261 }
00262 }
00263
00264 GetRenderer()->GetDisplayGeometry()->Fit();
00265 mitk::RenderingManager::GetInstance()->RequestUpdate(
00266 GetRenderer()->GetRenderWindow());
00267
00268
00269
00270
00271
00272 }
00273
00274 void QmitkSliceWidget::UpdateGL()
00275 {
00276 GetRenderer()->GetDisplayGeometry()->Fit();
00277 mitk::RenderingManager::GetInstance()->RequestUpdate(
00278 GetRenderer()->GetRenderWindow());
00279 }
00280
00281 void QmitkSliceWidget::mousePressEvent(QMouseEvent * e)
00282 {
00283 if (e->button() == Qt::RightButton && popUpEnabled)
00284 {
00285 popUp->popup(QCursor::pos());
00286 }
00287 }
00288
00289 void QmitkSliceWidget::wheelEvent(QWheelEvent * e)
00290 {
00291 int val = m_NavigatorWidget->GetPos();
00292
00293 if (e->orientation() * e->delta() > 0)
00294 {
00295 m_NavigatorWidget->SetPos(val + 1);
00296 }
00297 else
00298 {
00299 if (val > 0)
00300 m_NavigatorWidget->SetPos(val - 1);
00301 }
00302 }
00303
00304 void QmitkSliceWidget::ChangeView(QAction* val)
00305 {
00306 if (val->text() == "Transversal")
00307 {
00308 InitWidget(mitk::SliceNavigationController::Transversal);
00309 }
00310 else if (val->text() == "Frontal")
00311 {
00312 InitWidget(mitk::SliceNavigationController::Frontal);
00313 }
00314 else if (val->text() == "Sagittal")
00315 {
00316 InitWidget(mitk::SliceNavigationController::Sagittal);
00317 }
00318 }
00319
00320 void QmitkSliceWidget::setPopUpEnabled(bool b)
00321 {
00322 popUpEnabled = b;
00323 }
00324
00325 QmitkSliderNavigatorWidget* QmitkSliceWidget::GetNavigatorWidget()
00326 {
00327 return m_NavigatorWidget;
00328 }
00329
00330 void QmitkSliceWidget::SetLevelWindowEnabled(bool enable)
00331 {
00332 levelWindow->setEnabled(enable);
00333 if (!enable)
00334 {
00335 levelWindow->setMinimumWidth(0);
00336 levelWindow->setMaximumWidth(0);
00337 }
00338 else
00339 {
00340 levelWindow->setMinimumWidth(28);
00341 levelWindow->setMaximumWidth(28);
00342 }
00343 }
00344
00345 bool QmitkSliceWidget::IsLevelWindowEnabled()
00346 {
00347 return levelWindow->isEnabled();
00348 }
00349
00350 QmitkRenderWindow* QmitkSliceWidget::GetRenderWindow()
00351 {
00352 return m_RenderWindow;
00353 }
00354
00355 mitk::SliceNavigationController*
00356 QmitkSliceWidget::GetSliceNavigationController() const
00357 {
00358 return m_RenderWindow->GetSliceNavigationController();
00359 }
00360
00361 mitk::CameraRotationController*
00362 QmitkSliceWidget::GetCameraRotationController() const
00363 {
00364 return m_RenderWindow->GetCameraRotationController();
00365 }
00366
00367 mitk::BaseController*
00368 QmitkSliceWidget::GetController() const
00369 {
00370 return m_RenderWindow->GetController();
00371 }