36 #include <itkCommand.h> 38 #include <QApplication> 41 #include <QMessageBox> 45 m_SliceInterpolatorController(
mitk::SliceBasedInterpolationController::New()),
46 m_ToolManager(nullptr),
55 Q_ASSERT(m_ToolManager);
64 itk::ReceptorMemberCommand<QmitkSliceBasedInterpolatorWidget>::Pointer command =
65 itk::ReceptorMemberCommand<QmitkSliceBasedInterpolatorWidget>::New();
67 m_InterpolationInfoChangedObserverTag = m_SliceInterpolatorController->AddObserver(itk::ModifiedEvent(), command);
71 m_PreviewNode->SetName(
"3D tool preview");
79 m_PreviewNode->SetOpacity(1.0);
80 m_PreviewNode->SetColor(0.0, 1.0, 0.0);
82 m_Controls.m_btApplyForCurrentSlice->setEnabled(
false);
83 m_Controls.m_btApplyForAllSlices->setEnabled(
false);
85 this->setEnabled(
false);
95 slicer->RemoveObserver(m_ControllerToDeleteObserverTag.take(slicer));
96 slicer->RemoveObserver(m_ControllerToTimeObserverTag.take(slicer));
97 slicer->RemoveObserver(m_ControllerToSliceObserverTag.take(slicer));
103 m_SliceInterpolatorController->RemoveObserver(m_InterpolationInfoChangedObserverTag);
113 if (name ==
"stdmulti.widget0")
114 name =
"Axial (red window)";
115 else if (name ==
"stdmulti.widget1")
116 name =
"Sagittal (green window)";
117 else if (name ==
"stdmulti.widget2")
118 name =
"Coronal (blue window)";
119 actionToSliceDimension[
new QAction(QString::fromStdString(name),
nullptr)] = slicer;
122 return actionToSliceDimension;
127 m_DataStorage = &storage;
131 const QList<mitk::SliceNavigationController *> &controllers)
133 Q_ASSERT(!controllers.empty());
143 itk::MemberCommand<QmitkSliceBasedInterpolatorWidget>::Pointer deleteCommand =
144 itk::MemberCommand<QmitkSliceBasedInterpolatorWidget>::New();
146 m_ControllerToDeleteObserverTag.insert(slicer, slicer->AddObserver(itk::DeleteEvent(), deleteCommand));
148 itk::MemberCommand<QmitkSliceBasedInterpolatorWidget>::Pointer timeChangedCommand =
149 itk::MemberCommand<QmitkSliceBasedInterpolatorWidget>::New();
151 m_ControllerToTimeObserverTag.insert(
155 itk::MemberCommand<QmitkSliceBasedInterpolatorWidget>::Pointer sliceChangedCommand =
156 itk::MemberCommand<QmitkSliceBasedInterpolatorWidget>::New();
158 m_ControllerToSliceObserverTag.insert(
170 this->setEnabled(
false);
179 this->setEnabled(
false);
185 this->setEnabled(
false);
189 m_WorkingImage = workingImage;
191 this->setEnabled(
true);
197 if (!dynamic_cast<const mitk::SliceNavigationController::GeometryTimeEvent *>(&e))
206 if (m_LastSNC == slicer)
214 if (m_Activated && m_WorkingImage.IsNotNull())
217 if (!dynamic_cast<const mitk::SliceNavigationController::GeometrySliceEvent *>(&e))
233 if (m_Activated && m_WorkingImage.IsNotNull())
238 if (timeGeometry && m_TimeStep.contains(slicer))
248 this->
Interpolate(plane, m_TimeStep[slicer], slicer);
256 unsigned int timeStep,
259 int clickedSliceDimension(-1);
260 int clickedSliceIndex(-1);
267 m_SliceInterpolatorController->Interpolate(clickedSliceDimension, clickedSliceIndex, plane, timeStep);
269 m_PreviewNode->SetData(interpolation);
271 const mitk::Color &color = m_WorkingImage->GetActiveLabel()->GetColor();
272 m_PreviewNode->SetColor(color);
275 m_LastSliceIndex = clickedSliceIndex;
284 vtkSmartPointer<mitkVtkImageOverwrite> reslice = vtkSmartPointer<mitkVtkImageOverwrite>::New();
286 reslice->SetOverwriteMode(
false);
291 extractor->SetInput(m_WorkingImage);
292 extractor->SetTimeStep(timeStep);
293 extractor->SetWorldGeometry(planeGeometry);
294 extractor->SetVtkOutputRequest(
false);
295 extractor->SetResliceTransformByGeometry(m_WorkingImage->GetTimeGeometry()->GetGeometryForTimeStep(timeStep));
297 extractor->Modified();
303 catch (itk::ExceptionObject &excep)
305 MITK_ERROR <<
"Exception caught: " << excep.GetDescription();
318 m_WorkingImage, extractor->GetOutput(), sliceGeometry, timeStep,
const_cast<mitk::PlaneGeometry *
>(planeGeometry));
320 slice->DisconnectPipeline();
327 Q_ASSERT(m_ToolManager);
333 m_Controls.m_btApplyForCurrentSlice->setEnabled(enabled);
334 m_Controls.m_btApplyForAllSlices->setEnabled(enabled);
341 unsigned int numberOfExistingTools = m_ToolManager->
GetTools().size();
342 for (
unsigned int i = 0; i < numberOfExistingTools; i++)
351 if (!m_DataStorage->Exists(m_PreviewNode))
353 m_DataStorage->Add(m_PreviewNode);
356 m_SliceInterpolatorController->SetWorkingImage(m_WorkingImage);
361 if (m_DataStorage->Exists(m_PreviewNode))
363 m_DataStorage->Remove(m_PreviewNode);
369 m_Activated = enabled;
374 template <
typename TPixel,
unsigned int VImageDimension>
375 void QmitkSliceBasedInterpolatorWidget::WritePreviewOnWorkingImage(itk::Image<TPixel, VImageDimension> *targetSlice,
379 typedef itk::Image<TPixel, VImageDimension>
ImageType;
381 typename ImageType::Pointer sourceSliceITK;
386 typedef itk::ImageRegionIterator<ImageType> OutputIteratorType;
387 typedef itk::ImageRegionConstIterator<ImageType> InputIteratorType;
389 InputIteratorType inputIterator(sourceSliceITK, sourceSliceITK->GetLargestPossibleRegion());
390 OutputIteratorType outputIterator(targetSlice, targetSlice->GetLargestPossibleRegion());
392 outputIterator.GoToBegin();
393 inputIterator.GoToBegin();
395 int activePixelValue = m_WorkingImage->GetActiveLabel()->GetValue();
397 if (activePixelValue == 0)
399 while (!outputIterator.IsAtEnd())
401 if (inputIterator.Get() != 0)
403 outputIterator.Set(overwritevalue);
409 else if (overwritevalue != 0)
411 while (!outputIterator.IsAtEnd())
413 int targetValue =
static_cast<int>(outputIterator.Get());
414 if (inputIterator.Get() != 0)
416 if (!m_WorkingImage->GetLabel(targetValue)->GetLocked())
417 outputIterator.Set(overwritevalue);
426 while (!outputIterator.IsAtEnd())
428 const int targetValue = outputIterator.Get();
429 if (inputIterator.Get() != 0)
431 if (targetValue == activePixelValue)
432 outputIterator.Set(overwritevalue);
443 if (m_WorkingImage.IsNotNull() && m_PreviewNode->GetData())
450 if (sliceImage.IsNull())
456 sliceImage, WritePreviewOnWorkingImage, 2, previewSlice, m_WorkingImage->GetActiveLabel()->GetValue());
460 vtkSmartPointer<mitkVtkImageOverwrite> overwrite = vtkSmartPointer<mitkVtkImageOverwrite>::New();
461 overwrite->SetInputSlice(sliceImage->GetVtkImageData());
463 overwrite->SetOverwriteMode(
true);
464 overwrite->Modified();
469 extractor->SetInput(m_WorkingImage);
470 extractor->SetTimeStep(timeStep);
471 extractor->SetWorldGeometry(planeGeometry);
472 extractor->SetVtkOutputRequest(
false);
473 extractor->SetResliceTransformByGeometry(m_WorkingImage->GetTimeGeometry()->GetGeometryForTimeStep(timeStep));
475 extractor->Modified();
481 catch (itk::ExceptionObject &excep)
483 MITK_ERROR <<
"Exception caught: " << excep.GetDescription();
488 m_WorkingImage->Modified();
490 int clickedSliceDimension(-1);
491 int clickedSliceIndex(-1);
494 m_WorkingImage, planeGeometry, clickedSliceDimension, clickedSliceIndex);
496 m_SliceInterpolatorController->SetChangedSlice(sliceImage, clickedSliceDimension, clickedSliceIndex, timeStep);
505 extractor->GetOutput(),
512 mitk::DiffSliceOperationApplier::GetInstance(), m_doOperation, m_undoOperation,
"Slice Interpolation");
518 m_undoOperation =
nullptr;
519 m_doOperation =
nullptr;
521 m_PreviewNode->SetData(
nullptr);
533 int sliceDimension(-1);
538 unsigned int zslices = m_WorkingImage->GetDimension(sliceDimension);
545 for (
unsigned int idx = 0; idx < zslices; ++idx)
549 m_WorkingImage->GetSlicedGeometry()->WorldToIndex(origin, origin);
550 origin[sliceDimension] = idx;
551 m_WorkingImage->GetSlicedGeometry()->IndexToWorld(origin, origin);
552 reslicePlane->SetOrigin(origin);
555 m_SliceInterpolatorController->Interpolate(sliceDimension, idx, reslicePlane, timeStep);
557 if (interpolation.IsNotNull())
559 m_PreviewNode->SetData(interpolation);
562 if (sliceImage.IsNull())
566 sliceImage, WritePreviewOnWorkingImage, 2, interpolation, m_WorkingImage->GetActiveLabel()->GetValue());
570 vtkSmartPointer<mitkVtkImageOverwrite> overwrite = vtkSmartPointer<mitkVtkImageOverwrite>::New();
571 overwrite->SetInputSlice(sliceImage->GetVtkImageData());
573 overwrite->SetOverwriteMode(
true);
574 overwrite->Modified();
577 extractor->SetInput(m_WorkingImage);
578 extractor->SetTimeStep(timeStep);
579 extractor->SetWorldGeometry(reslicePlane);
580 extractor->SetVtkOutputRequest(
true);
581 extractor->SetResliceTransformByGeometry(m_WorkingImage->GetTimeGeometry()->GetGeometryForTimeStep(timeStep));
583 extractor->Modified();
589 catch (itk::ExceptionObject &excep)
591 MITK_ERROR <<
"Exception caught: " << excep.GetDescription();
595 m_WorkingImage->Modified();
603 m_SliceInterpolatorController->SetWorkingImage(m_WorkingImage);
610 QMenu orientationPopup(
this);
611 std::map<QAction *, mitk::SliceNavigationController *>::const_iterator it;
613 orientationPopup.addAction(it->first);
617 orientationPopup.exec(QCursor::pos());
632 if (m_Activated && m_LastSNC)
658 const itk::EventObject & )
665 m_ControllerToTimeObserverTag.remove(slicer);
666 m_ControllerToSliceObserverTag.remove(slicer);
667 m_ControllerToDeleteObserverTag.remove(slicer);
673 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
683 QApplication::restoreOverrideCursor();
void Progress(unsigned int steps=1)
Sets the current amount of progress to current progress + steps.
Data management class that handles 'was created by' relations.
virtual unsigned int GetSlice() const
itk::Image< unsigned char, 3 > ImageType
TimeGeometry * GetTimeGeometry() const
Organizes the rendering process.
virtual const TimeGeometry * GetWorldTimeGeometry()
DataCollection - Class to facilitate loading/accessing structured data.
An Operation for applying an edited slice to the volume.
void Reset()
Explicitly reset progress bar.
static ProgressBar * GetInstance()
static method to get the GUI dependent ProgressBar-instance so the methods for steps to do and progre...
Controls the selection of the slice the associated BaseRenderer will display.
virtual mitk::PlaneGeometry * GetPlaneGeometry(int s) const
Returns the PlaneGeometry of the slice (s).
virtual void SendSlice()
Send the currently selected slice to the connected observers (renderers)
BaseData * GetData() const
Get the data object (instance of BaseData, e.g., an Image) managed by this DataNode.
unsigned int GetDimension() const
Get dimension of the image.
mitk::DataStorage::Pointer m_DataStorage
#define AccessFixedDimensionByItk_2(mitkImage, itkImageTypeFunction, dimension, arg1, arg2)
static RenderingManager * GetInstance()
virtual MapperSlotId GetMapperID()
Get the MapperSlotId to use.
Image class for storing images.
const mitk::PlaneGeometry * GetCurrentPlaneGeometry()
Returns the currently selected Plane in the current BaseGeometry (if existent).
itk::RGBPixel< float > Color
Color Standard RGB color typedef (float)
Describes the geometry of a data object consisting of slices.
void AddStepsToDo(unsigned int steps)
Adds steps to totalSteps.
void MITKCORE_EXPORT CastToItkImage(const mitk::Image *mitkImage, itk::SmartPointer< ItkOutputImageType > &itkOutputImage)
Cast an mitk::Image to an itk::Image with a specific type.
virtual BaseGeometry::Pointer GetGeometryForTimeStep(TimeStepType timeStep) const =0
Returns the geometry which corresponds to the given time step.
virtual bool SetOperationEvent(UndoStackItem *stackItem)=0
static UndoModel * GetCurrentUndoModel()
gives access to the currently used UndoModel Introduced to access special functions of more specific ...
LabelSetImage class for handling labels and layers in a segmentation session.
mitk::Stepper * GetTime()
Get the Stepper through the time.
virtual unsigned int GetPos() const
Describes a two-dimensional, rectangular plane.
unsigned int GetPos() const
BaseRenderer * GetRenderer() const
Gets the BaseRenderer associated with this SNC (if any). While the BaseRenderer is not directly used ...
virtual void Clear()=0
clears undo and Redolist
void RequestUpdateAll(RequestType type=REQUEST_UPDATE_ALL)
Represents a pair of operations: undo and the according redo.
const char * GetName() const
get the name of the Renderer
Class for nodes of the DataTree.