diff --git a/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.cpp b/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.cpp index 20011f4..abc7696 100644 --- a/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.cpp +++ b/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.cpp @@ -1,231 +1,344 @@ -# include - /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #include "mitkStreamlineInteractor.h" -#include "mitkStreamlineMapper2D.h" +//#include "mitkStreamlineMapper2D.h" // MITK includes #include #include #include #include #include #include #include #include #include #include // VTK includes #include #include #include #include #include #include #include #include +#include #include mitk::StreamlineInteractor::StreamlineInteractor() { m_ColorForHighlight[0] = 1.0; m_ColorForHighlight[1] = 0.5; m_ColorForHighlight[2] = 0.0; m_ColorForHighlight[3] = 1.0; // TODO if we want to get this configurable, the this is the recipe: // - make the 2D mapper add corresponding properties to control "enabled" and "color" // - make the interactor evaluate those properties // - in an ideal world, modify the state machine on the fly and skip mouse move handling } mitk::StreamlineInteractor::~StreamlineInteractor() { } void mitk::StreamlineInteractor::ConnectActionsAndFunctions() { - CONNECT_CONDITION("PickedHandle", HasPickedHandle); - - CONNECT_FUNCTION("FeedUndoStack", FeedUndoStack); +// CONNECT_CONDITION("isoverstreamline", HasPickedHandle); + CONNECT_FUNCTION("addnegstreamline", AddStreamlineNegBundle); + CONNECT_FUNCTION("addposstreamline", AddStreamlinePosBundle); +// CONNECT_FUNCTION("FeedUndoStack", FeedUndoStack); } -void mitk::StreamlineInteractor::SetStreamlineNode(DataNode *node) +void mitk::StreamlineInteractor::SetNegativeNode(DataNode *node) { - DataInteractor::SetDataNode(node); - m_Streamline = dynamic_cast(node->GetData()); + DataInteractor::SetDataNode(node); + m_NegStreamline= dynamic_cast(node->GetData()); - // setup picking from just this object - m_Picker.clear(); + MITK_INFO << "Negative Node added"; } -void mitk::StreamlineInteractor::SetManipulatedObjectNode(DataNode *node) +void mitk::StreamlineInteractor::SetToLabelNode(DataNode *node) { + DataInteractor::SetDataNode(node); + if (node && node->GetData()) { - m_ManipulatedObjectGeometry = node->GetData()->GetGeometry(); + m_manStreamline = dynamic_cast(node->GetData()); + MITK_INFO << "Label node added"; } } -bool mitk::StreamlineInteractor::HasPickedHandle(const InteractionEvent *interactionEvent) +void mitk::StreamlineInteractor::SetPositiveNode(DataNode *node) { - auto positionEvent = dynamic_cast(interactionEvent); - if (positionEvent == nullptr || - m_Streamline.IsNull() || - m_ManipulatedObjectGeometry.IsNull() || - interactionEvent->GetSender()->GetRenderWindow()->GetNeverRendered()) - { - return false; - } - if (interactionEvent->GetSender()->GetMapperID() == BaseRenderer::Standard2D) - { - m_PickedHandle = PickFrom2D(positionEvent); - } - else - { - m_PickedHandle = PickFrom3D(positionEvent); - } + DataInteractor::SetDataNode(node); + m_PosStreamline= dynamic_cast(node->GetData()); - UpdateHandleHighlight(); - return m_PickedHandle != Streamline::NoHandle; -} - -void mitk::StreamlineInteractor::FeedUndoStack(StateMachineAction *, InteractionEvent *) -{ - if (m_UndoEnabled) - { - OperationEvent *operationEvent = new OperationEvent(m_ManipulatedObjectGeometry, - // OperationEvent will destroy operations! - // --> release() and not get() - m_FinalDoOperation.release(), - m_FinalUndoOperation.release(), - "Direct geometry manipulation"); - mitk::OperationEvent::IncCurrObjectEventId(); // save each modification individually - m_UndoController->SetOperationEvent(operationEvent); + MITK_INFO << "Positive Node added"; } -} -mitk::Streamline::HandleType mitk::StreamlineInteractor::PickFrom2D(const InteractionPositionEvent *positionEvent) +void mitk::StreamlineInteractor::AddStreamlinePosBundle(StateMachineAction *, InteractionEvent *interactionEvent) { - BaseRenderer *renderer = positionEvent->GetSender(); + MITK_INFO << "PositiveBundle clicked"; +// auto positionEvent = dynamic_cast(interactionEvent); +// if (positionEvent == nullptr) +// { +// return; +// } +// return true; + auto positionEvent = dynamic_cast(interactionEvent); + if (positionEvent == nullptr) + { + MITK_INFO << "no position"; + } + + if (interactionEvent->GetSender()->GetMapperID() == BaseRenderer::Standard2D) + { +// m_PickedHandle = PickFrom2D(positionEvent); + MITK_INFO << "2D"; + } + else + { + BaseRenderer *renderer = positionEvent->GetSender(); - auto mapper = GetDataNode()->GetMapper(BaseRenderer::Standard2D); - auto Streamline_mapper = dynamic_cast(mapper); - auto &picker = m_Picker[renderer]; + auto &picker = m_Picker[renderer]; + if (picker == nullptr) + { - if (picker == nullptr) - { - picker = vtkSmartPointer::New(); - picker->SetTolerance(0.005); - if (Streamline_mapper) - { // doing this each time is bizarre - picker->AddPickList(Streamline_mapper->GetVtkProp(renderer)); - picker->PickFromListOn(); - } - } + picker = vtkSmartPointer::New(); + picker->SetTolerance(0.01); + auto mapper = GetDataNode()->GetMapper(BaseRenderer::Standard3D); - auto displayPosition = positionEvent->GetPointerPositionOnScreen(); - picker->Pick(displayPosition[0], displayPosition[1], 0, positionEvent->GetSender()->GetVtkRenderer()); - vtkIdType pickedPointID = picker->GetPointId(); - if (pickedPointID == -1) - { - return Streamline::NoHandle; - } + auto vtk_mapper = dynamic_cast(mapper); + if (vtk_mapper) + { // doing this each time is bizarre + picker->AddPickList(vtk_mapper->GetVtkProp(renderer)); + picker->PickFromListOn(); + } + } - vtkPolyData *polydata = Streamline_mapper->GetVtkPolyData(renderer); + auto displayPosition = positionEvent->GetPointerPositionOnScreen(); +// MITK_INFO << displayPosition; + picker->Pick(displayPosition[0], displayPosition[1], 0, positionEvent->GetSender()->GetVtkRenderer()); - if (polydata && polydata->GetPointData() && polydata->GetPointData()->GetScalars()) - { - double dataValue = polydata->GetPointData()->GetScalars()->GetTuple1(pickedPointID); - return m_Streamline->GetHandleFromPointDataValue(dataValue); - } + vtkIdType pickedCellID = picker->GetCellId(); - return Streamline::NoHandle; -} + MITK_INFO << picker->GetCellId(); + MITK_INFO << "Number of Cells"; +// MITK_INFO << m_PosStreamline->GetFiberPolyData()->GetNumberOfCells(); -mitk::Streamline::HandleType mitk::StreamlineInteractor::PickFrom3D(const InteractionPositionEvent *positionEvent) -{ - BaseRenderer *renderer = positionEvent->GetSender(); - auto &picker = m_Picker[renderer]; - if (picker == nullptr) - { - picker = vtkSmartPointer::New(); - picker->SetTolerance(0.005); - auto mapper = GetDataNode()->GetMapper(BaseRenderer::Standard3D); - auto vtk_mapper = dynamic_cast(mapper); - if (vtk_mapper) - { // doing this each time is bizarre - picker->AddPickList(vtk_mapper->GetVtkProp(renderer)); - picker->PickFromListOn(); - } - } - auto displayPosition = positionEvent->GetPointerPositionOnScreen(); - picker->Pick(displayPosition[0], displayPosition[1], 0, positionEvent->GetSender()->GetVtkRenderer()); - vtkIdType pickedPointID = picker->GetPointId(); - if (pickedPointID == -1) - { - return Streamline::NoHandle; - } + if (picker->GetCellId()==-1) + { + MITK_INFO << "Nothing picked"; + } + else { - // _something_ picked - return m_Streamline->GetHandleFromPointID(pickedPointID); -} -void mitk::StreamlineInteractor::UpdateHandleHighlight() -{ - if (m_HighlightedHandle != m_PickedHandle) { + vtkSmartPointer vNewPolyData = vtkSmartPointer::New(); + MITK_INFO << vNewPolyData->GetNumberOfLines (); + vtkSmartPointer vNewLines = vtkSmartPointer::New(); + vtkSmartPointer vNewPoints = vtkSmartPointer::New(); + + unsigned int counter = 0; + for ( int i=0; iGetFiberPolyData()->GetNumberOfCells(); i++) + { + vtkCell* cell = m_PosStreamline->GetFiberPolyData()->GetCell(i); + auto numPoints = cell->GetNumberOfPoints(); + vtkPoints* points = cell->GetPoints(); + + vtkSmartPointer container = vtkSmartPointer::New(); + for (unsigned int j=0; jGetPoint(j, p); + + vtkIdType id = vNewPoints->InsertNextPoint(p); + container->GetPointIds()->InsertNextId(id); + } + // weights->InsertValue(counter, fib->GetFiberWeight(i)); + vNewLines->InsertNextCell(container); + counter++; + + } - auto node = GetDataNode(); - if (node == nullptr) return; - auto base_prop = node->GetProperty("LookupTable"); - if (base_prop == nullptr) return; - auto lut_prop = dynamic_cast(base_prop); - if (lut_prop == nullptr) return; + vtkCell* cell = m_manStreamline->GetFiberPolyData()->GetCell(pickedCellID); + auto numPoints = cell->GetNumberOfPoints(); + vtkPoints* points = cell->GetPoints(); - auto lut = lut_prop->GetLookupTable(); - if (lut == nullptr) return; + vtkSmartPointer container = vtkSmartPointer::New(); + for (unsigned int j=0; jGetPoint(j, p); - // Table size is expected to constructed as one entry per Streamline-part enum value - assert(lut->GetVtkLookupTable()->GetNumberOfTableValues() > std::max(m_PickedHandle, m_HighlightedHandle)); + vtkIdType id = vNewPoints->InsertNextPoint(p); + container->GetPointIds()->InsertNextId(id); + } + vNewLines->InsertNextCell(container); - // Reset previously overwritten color - if (m_HighlightedHandle != Streamline::NoHandle) + vNewPolyData->SetPoints(vNewPoints); + vNewPolyData->SetLines(vNewLines); + + // m_PosStreamline = mitk::FiberBundle::New(vNewPolyData); + m_PosStreamline->GetFiberPolyData()->SetPoints(vNewPoints); + m_PosStreamline->GetFiberPolyData()->SetLines(vNewLines); + m_PosStreamline->SetFiberColors(0, 255, 0); + + m_manStreamline->GetFiberPolyData()->DeleteCell(pickedCellID); + m_manStreamline->GetFiberPolyData()->RemoveDeletedCells(); + + MITK_INFO << m_manStreamline->GetFiberPolyData()->GetNumberOfCells(); + MITK_INFO << m_PosStreamline->GetFiberPolyData()->GetNumberOfCells(); + } + } + } + +void mitk::StreamlineInteractor::AddStreamlineNegBundle(StateMachineAction *, InteractionEvent *interactionEvent) +{ + MITK_INFO << "NegativeBundle clicked"; +// auto positionEvent = dynamic_cast(interactionEvent); +// if (positionEvent == nullptr) +// { +// return; +// } +// return true; + auto positionEvent = dynamic_cast(interactionEvent); + if (positionEvent == nullptr) { - lut->SetTableValue(m_HighlightedHandle, m_ColorReplacedByHighlight); + MITK_INFO << "no position"; } - // Overwrite currently highlighted color - if (m_PickedHandle != Streamline::NoHandle) + if (interactionEvent->GetSender()->GetMapperID() == BaseRenderer::Standard2D) + { +// m_PickedHandle = PickFrom2D(positionEvent); + MITK_INFO << "2D"; + } + else { - lut->GetTableValue(m_PickedHandle, m_ColorReplacedByHighlight); - lut->SetTableValue(m_PickedHandle, m_ColorForHighlight); + BaseRenderer *renderer = positionEvent->GetSender(); + + auto &picker = m_Picker[renderer]; + if (picker == nullptr) + { + + + picker = vtkSmartPointer::New(); + picker->SetTolerance(0.01); + auto mapper = GetDataNode()->GetMapper(BaseRenderer::Standard3D); + + + auto vtk_mapper = dynamic_cast(mapper); + if (vtk_mapper) + { // doing this each time is bizarre + picker->AddPickList(vtk_mapper->GetVtkProp(renderer)); + picker->PickFromListOn(); + } + } + + auto displayPosition = positionEvent->GetPointerPositionOnScreen(); +// MITK_INFO << displayPosition; + picker->Pick(displayPosition[0], displayPosition[1], 0, positionEvent->GetSender()->GetVtkRenderer()); + + vtkIdType pickedCellID = picker->GetCellId(); + + MITK_INFO << picker->GetCellId(); + + if (picker->GetCellId()==-1) + { + MITK_INFO << "Nothing picked"; + } + else + { + vtkSmartPointer vNewPolyData = vtkSmartPointer::New(); + MITK_INFO << vNewPolyData->GetNumberOfLines (); + vtkSmartPointer vNewLines = vtkSmartPointer::New(); + vtkSmartPointer vNewPoints = vtkSmartPointer::New(); + + unsigned int counter = 0; + for ( int i=0; iGetFiberPolyData()->GetNumberOfCells(); i++) + { + vtkCell* cell = m_NegStreamline->GetFiberPolyData()->GetCell(i); + auto numPoints = cell->GetNumberOfPoints(); + vtkPoints* points = cell->GetPoints(); + + vtkSmartPointer container = vtkSmartPointer::New(); + for (unsigned int j=0; jGetPoint(j, p); + + vtkIdType id = vNewPoints->InsertNextPoint(p); + container->GetPointIds()->InsertNextId(id); + } + // weights->InsertValue(counter, fib->GetFiberWeight(i)); + vNewLines->InsertNextCell(container); + counter++; + + } + + + + vtkCell* cell = m_manStreamline->GetFiberPolyData()->GetCell(pickedCellID); + auto numPoints = cell->GetNumberOfPoints(); + vtkPoints* points = cell->GetPoints(); + + vtkSmartPointer container = vtkSmartPointer::New(); + for (unsigned int j=0; jGetPoint(j, p); + + vtkIdType id = vNewPoints->InsertNextPoint(p); + container->GetPointIds()->InsertNextId(id); + } + vNewLines->InsertNextCell(container); + + vNewPolyData->SetPoints(vNewPoints); + vNewPolyData->SetLines(vNewLines); + + // m_NegStreamline = mitk::FiberBundle::New(vNewPolyData); + m_NegStreamline->GetFiberPolyData()->SetPoints(vNewPoints); + m_NegStreamline->GetFiberPolyData()->SetLines(vNewLines); + m_NegStreamline->SetFiberColors(255, 0, 0); + + m_manStreamline->GetFiberPolyData()->DeleteCell(pickedCellID); + m_manStreamline->GetFiberPolyData()->RemoveDeletedCells(); + + MITK_INFO << m_manStreamline->GetFiberPolyData()->GetNumberOfCells(); + MITK_INFO << m_NegStreamline->GetFiberPolyData()->GetNumberOfCells(); + } + + + + + + + + + } - // Mark node modified to allow repaint - node->Modified(); - RenderingManager::GetInstance()->RequestUpdateAll(RenderingManager::REQUEST_UPDATE_ALL); - m_HighlightedHandle = m_PickedHandle; + } -} diff --git a/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.h b/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.h index e507164..ce9f4fd 100644 --- a/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.h +++ b/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.h @@ -1,117 +1,105 @@ /*============================================================================ The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center (DKFZ) All rights reserved. Use of this source code is governed by a 3-clause BSD license that can be found in the LICENSE file. ============================================================================*/ #ifndef mitkStreamlineInteractor_h #define mitkStreamlineInteractor_h // MITK includes #include #include #include +#include // VTK includes #include #include // System includes #include -#include "MitkStreamlineExports.h" +#include "MitkFiberDissectionExports.h" namespace mitk { class InteractionPositionEvent; //! Data interactor to pick streamlines via interaction //! with a mitk::Streamline. //! //! //! To determine what parts of the object are clicked during interaction, //! the mappers (2D: custom mapper, 3D: regular surface mapper) are asked //! for their VTK objects, picking is performed, and the picked point is //! forwarded to the Streamline object for interpretation. //! //! The interactor fills the undo/redo stack with operations on the modified geometry. //! //! \sa Streamline - class MITKStreamline_EXPORT StreamlineInteractor : public DataInteractor + class MITKFIBERDISSECTION_EXPORT StreamlineInteractor : public DataInteractor { public: mitkClassMacro(StreamlineInteractor, DataInteractor); itkFactorylessNewMacro(Self); itkCloneMacro(Self); - //! The node holding the Streamline for visual feedback. + //! The node holding the Fiberbundle for visual feedback. //! This is the node that the interactor is primarily working on //! (calls DataInteractor::SetDataNode). - void SetStreamlineNode(DataNode *node); + + void SetNegativeNode(DataNode *node); + void SetToLabelNode(DataNode *node); + void SetPositiveNode(DataNode *node); + + protected: + + void AddStreamlineNegBundle(StateMachineAction *, InteractionEvent *interactionEvent); + + void AddStreamlinePosBundle(StateMachineAction *, InteractionEvent *interactionEvent); + + + std::map> m_Picker; private: StreamlineInteractor(); ~StreamlineInteractor() override; //! Setup the relation between the XML state machine and this object's methods. void ConnectActionsAndFunctions() override; //! State machine condition: successful Streamline picking //! \return true when any part of the Streamline has been picked. - bool HasPickedHandle(const InteractionEvent *); +// bool HasPickedHandle(const InteractionEvent *); - //! Pick a Streamline handle from a 2D event (passing by the 2D mapper) - Streamline::HandleType PickFrom2D(const InteractionPositionEvent *positionEvent); +// void DecideInteraction(StateMachineAction *, InteractionEvent *interactionEvent); - //! Pick a Streamline handle from a 3D event - //! (passing by the general surface mapper and the Streamline object) - Streamline::HandleType PickFrom3D(const InteractionPositionEvent *positionEvent); +// //! Pick a Streamline handle from a 2D event (passing by the 2D mapper) +// Streamline::HandleType PickFrom2D(const InteractionPositionEvent *positionEvent); - void UpdateHandleHighlight(); - - //! the Streamline used for visual feedback and picking - Streamline::Pointer m_Streamline; +// //! Pick a Streamline handle from a 3D event +// //! (passing by the general surface mapper and the Streamline object) +// Streamline::HandleType PickFrom3D(const InteractionPositionEvent *positionEvent); - //! The manipulated object's geometry - BaseGeometry::Pointer m_ManipulatedObjectGeometry; +// void UpdateHandleHighlight(); - //! For picking on the vtkPolyData representing the Streamline - std::map> m_Picker; - - //! Part of the Streamline that was picked on last check - Streamline::HandleType m_PickedHandle = Streamline::NoHandle; + //! the Streamline used for visual feedback and picking + mitk::FiberBundle::Pointer m_NegStreamline; + mitk::FiberBundle::Pointer m_PosStreamline; + mitk::FiberBundle::Pointer m_manStreamline; - //! Part of the Streamline that is currently highlighted - Streamline::HandleType m_HighlightedHandle = Streamline::NoHandle; + vtkSmartPointer m_extracted_streamline; - //! Color (RGBA) used for highlighting double m_ColorForHighlight[4]; - //! Color (RGBA) that has been replaced by m_ColorForHighlight - double m_ColorReplacedByHighlight[4]; - - Point2D m_InitialClickPosition2D; //< Initial screen click position - double m_InitialClickPosition2DZ; //< Z value of the initial screen click position - Point3D m_InitialClickPosition3D; //< Initial 3D click position - - Point2D m_InitialStreamlineCenter2D; //< Initial position of the Streamline's center in screen coordinates - Point3D m_InitialStreamlineCenter3D; //< Initial 3D position of the Streamline's center - - Vector3D m_AxisOfMovement; //< Axis along which we move when translating - Vector3D m_AxisOfRotation; //< Axis around which we turn when rotating - - std::unique_ptr m_FinalDoOperation; //< Operation for the undo-stack - std::unique_ptr m_FinalUndoOperation; //< Operation for the undo-stack - - //! A copy of the origin geometry, to avoid accumulation of tiny errors - BaseGeometry::Pointer m_InitialManipulatedObjectGeometry; }; } #endif diff --git a/Modules/FiberDissection/Interactor/resources/Interactions/Streamline3DConfig.xml b/Modules/FiberDissection/Interactor/resources/Interactions/Streamline3DConfig.xml deleted file mode 100644 index f442503..0000000 --- a/Modules/FiberDissection/Interactor/resources/Interactions/Streamline3DConfig.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/Modules/FiberDissection/Interactor/resources/Interactions/Streamline3DStates.xml b/Modules/FiberDissection/Interactor/resources/Interactions/Streamline3DStates.xml deleted file mode 100644 index 3d3cf64..0000000 --- a/Modules/FiberDissection/Interactor/resources/Interactions/Streamline3DStates.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - diff --git a/Modules/FiberDissection/files.cmake b/Modules/FiberDissection/files.cmake index 2c3bef1..ee910a5 100644 --- a/Modules/FiberDissection/files.cmake +++ b/Modules/FiberDissection/files.cmake @@ -1,13 +1,13 @@ set(H_FILES Interactor/mitkStreamlineInteractor.h ) set(CPP_FILES Interactor/mitkStreamlineInteractor.cpp ) set(RESOURCE_FILES # "Interactions" prefix forced by mitk::StateMachine - Interactor/resources/Interactions/Gizmo3DStates.xml - Interactor/resources/Interactions/Gizmo3DConfig.xml + Interactions/Streamline3DStates.xml + Interactions/Streamline3DConfig.xml ) diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/CMakeLists.txt b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/CMakeLists.txt index ed6a565..6a48682 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/CMakeLists.txt +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/CMakeLists.txt @@ -1,10 +1,10 @@ # The project name must correspond to the directory name of your plug-in # and must not contain periods. project(org_mitk_gui_qt_diffusionimaging_fiberprocessing) mitk_create_plugin( SUBPROJECTS MITK-Diffusion EXPORT_DIRECTIVE DIFFUSIONIMAGING_FIBERPROCESSING_EXPORT EXPORTED_INCLUDE_SUFFIXES src - MODULE_DEPENDS MitkFiberTracking MitkMriSimulation MitkChart MitkMultilabel MitkModelFit MitkQtWidgetsExt + MODULE_DEPENDS MitkFiberTracking MitkMriSimulation MitkChart MitkMultilabel MitkModelFit MitkQtWidgetsExt MitkFiberDissection ) diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionView.cpp index e3dcff1..f4b0652 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionView.cpp @@ -1,532 +1,574 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Blueberry #include #include #include // Qmitk #include "QmitkInteractiveFiberDissectionView.h" #include //Pointset #include //Pointset #include #include #include #include #include #include #include #include #include "usModuleRegistry.h" //#include #include "mitkNodePredicateDataType.h" #include #include #include #include + #include #include #include #include #include #include #include #include #include #include #include #include #include const std::string QmitkInteractiveFiberDissectionView::VIEW_ID = "org.mitk.views.interactivefiberdissection"; const std::string id_DataManager = "org.mitk.views.datamanager"; using namespace mitk; QmitkInteractiveFiberDissectionView::QmitkInteractiveFiberDissectionView() : QmitkAbstractView() , m_Controls( 0 ) , m_IterationCounter(0) + , m_StreamlineInteractor(nullptr) { } // Destructor QmitkInteractiveFiberDissectionView::~QmitkInteractiveFiberDissectionView() { - + //disable interactor + if (m_StreamlineInteractor != nullptr) + { +// m_StreamlineInteractor->SetStreamlineNode(nullptr); + m_StreamlineInteractor->EnableInteraction(false); + } } + void QmitkInteractiveFiberDissectionView::CreateQtPartControl( QWidget *parent ) { // build up qt view, unless already done if ( !m_Controls ) { // create GUI widgets from the Qt Designer's .ui file m_Controls = new Ui::QmitkInteractiveFiberDissectionViewControls; m_Controls->setupUi( parent ); m_Controls->m_selectedPointSetWidget->SetDataStorage(GetDataStorage());//pointset m_Controls->m_selectedPointSetWidget->SetNodePredicate(mitk::NodePredicateAnd::New(//pointset mitk::TNodePredicateDataType::New(),//pointset mitk::NodePredicateNot::New(mitk::NodePredicateOr::New(//pointset mitk::NodePredicateProperty::New("helper object"),//pointset mitk::NodePredicateProperty::New("hidden object")))));//pointset m_Controls->m_selectedPointSetWidget->SetSelectionIsOptional(true);//pointset m_Controls->m_selectedPointSetWidget->SetAutoSelectNewNodes(true);//pointset m_Controls->m_selectedPointSetWidget->SetEmptyInfo(QString("Please select a point set"));//pointset - m_Controls->m_selectedPointSetWidget->SetPopUpTitel(QString("Select point set"));//pointset + m_Controls->m_selectedPointSetWidget->SetPopUpTitel(QString("Select point set"));//pointsett connect(m_Controls->m_ErazorButton, SIGNAL( clicked() ), this, SLOT( RemovefromBundle() ) ); //need - connect(m_Controls->m_HighlighterButton, SIGNAL( clicked() ), this, SLOT( AddtoBundle() ) ); //need connect(m_Controls->m_StreamlineCreation, SIGNAL( clicked() ), this, SLOT( CreateStreamline())); connect(m_Controls->m_AddRandomFibers, SIGNAL( clicked() ), this, SLOT( ExtractRandomFibersFromTractogram() ) ); //need + connect(m_Controls->m_TrainClassifier, SIGNAL( clicked() , this, SLOT( StartAlgorithm ))); + connect(m_Controls->m_addPointSetPushButton, &QPushButton::clicked,//pointset this, &QmitkInteractiveFiberDissectionView::OnAddPointSetClicked);//pointset connect(m_Controls->m_selectedPointSetWidget, &QmitkSingleNodeSelectionWidget::CurrentSelectionChanged,//pointset this, &QmitkInteractiveFiberDissectionView::OnCurrentSelectionChanged);//pointset auto renderWindowPart = this->GetRenderWindowPart();//pointset if (nullptr != renderWindowPart)//pointset this->RenderWindowPartActivated(renderWindowPart);//pointset this->OnCurrentSelectionChanged(m_Controls->m_selectedPointSetWidget->GetSelectedNodes());//pointset } UpdateGui(); } void QmitkInteractiveFiberDissectionView::SetFocus() { m_Controls->toolBoxx->setFocus(); //m_Controls->m_addPointSetPushButton->setFocus();//pointset } void QmitkInteractiveFiberDissectionView::UpdateGui() { m_Controls->m_FibLabel->setText("mandatory"); m_Controls->m_InputData->setTitle("Please Select Input Data"); // disable alle frames m_Controls->m_ErazorButton->setEnabled(false); - m_Controls->m_HighlighterButton->setEnabled(false); + m_Controls->m_addPointSetPushButton->setEnabled(false); m_Controls->m_StreamlineCreation->setEnabled(false); - m_Controls->m_StreamtoTractogram->setEnabled(false); m_Controls->m_TrainClassifier->setEnabled(false); m_Controls->m_CreatePrediction->setEnabled(false); m_Controls->m_CreateUncertantyMap->setEnabled(false); m_Controls->m_Numtolabel->setEnabled(false); m_Controls->m_addPointSetPushButton->setEnabled(false); m_Controls->m_AddRandomFibers->setEnabled(false); + m_Controls->m_AddUncertainFibers->setEnabled(false); bool fibSelected = !m_SelectedFB.empty(); bool multipleFibsSelected = (m_SelectedFB.size()>1); bool sthSelected = m_SelectedImageNode.IsNotNull(); bool psSelected = m_SelectedPS.IsNotNull(); - bool nfibSelected = !m_negativeSelectedBundles.empty(); + bool nfibSelected = !m_newfibersSelectedBundles.empty(); + bool posSelected = !m_positivSelectedBundles.empty(); + bool negSelected = !m_negativeSelectedBundles.IsNotNull(); // toggle visibility of elements according to selected method // are fiber bundles selected? if ( fibSelected ) { m_Controls->m_FibLabel->setText(QString(m_SelectedFB.at(0)->GetName().c_str())); m_Controls->m_addPointSetPushButton->setEnabled(true); m_Controls->m_AddRandomFibers->setEnabled(true); // more than two bundles needed to join/subtract if (multipleFibsSelected) { m_Controls->m_FibLabel->setText("multiple bundles selected"); } } // is image selected if (sthSelected) { m_Controls->m_addPointSetPushButton->setEnabled(true); } if (psSelected) { m_Controls->m_StreamlineCreation->setEnabled(true); } if (nfibSelected) { - m_Controls->m_HighlighterButton->setEnabled(true); + m_Controls->m_ErazorButton->setEnabled(true); } + if (posSelected && negSelected) + { + m_Controls->m_TrainClassifier->setEnabled(true); + } + } void QmitkInteractiveFiberDissectionView::OnEndInteraction() { } void QmitkInteractiveFiberDissectionView::OnAddPointSetClicked()//pointset { // ask for the name of the point set bool ok = false; QString name = QInputDialog::getText(QApplication::activeWindow(), tr("Add point set..."), tr("Enter name for the new point set"), QLineEdit::Normal, tr("PointSet").arg(++m_IterationCounter), &ok); // QString name = "PointSet"; if (!ok || name.isEmpty()) { return; } mitk::PointSet::Pointer pointSet = mitk::PointSet::New(); mitk::DataNode::Pointer pointSetNode = mitk::DataNode::New(); pointSetNode->SetData(pointSet); pointSetNode->SetProperty("name", mitk::StringProperty::New(name.toStdString())); pointSetNode->SetProperty("opacity", mitk::FloatProperty::New(1)); pointSetNode->SetColor(1.0, 1.0, 0.0); this->GetDataStorage()->Add(pointSetNode, m_SelectedImageNode); + m_Controls->m_selectedPointSetWidget->SetCurrentSelectedNode(pointSetNode); } void QmitkInteractiveFiberDissectionView::OnCurrentSelectionChanged(QmitkSingleNodeSelectionWidget::NodeList /*nodes*/)//pointset { m_Controls->m_poinSetListWidget->SetPointSetNode(m_Controls->m_selectedPointSetWidget->GetSelectedNode()); m_SelectedPS = m_Controls->m_selectedPointSetWidget->GetSelectedNode(); UpdateGui(); } void QmitkInteractiveFiberDissectionView::OnSelectionChanged(berry::IWorkbenchPart::Pointer /*part*/, const QList& nodes) { m_SelectedFB.clear(); if (nodes.empty() || nodes.front().IsNull()) { m_SelectedImageNode = nullptr; } else { m_SelectedImageNode = nodes.front(); } for (auto node: nodes) { if (dynamic_cast(node->GetData())) m_SelectedImage = dynamic_cast(node->GetData()); else if ( dynamic_cast(node->GetData()) ) m_SelectedFB.push_back(node); } UpdateGui(); } void QmitkInteractiveFiberDissectionView::RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart)//pointset { if (nullptr != m_Controls) { m_Controls->m_poinSetListWidget->AddSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("axial")->GetSliceNavigationController()); m_Controls->m_poinSetListWidget->AddSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController()); m_Controls->m_poinSetListWidget->AddSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("coronal")->GetSliceNavigationController()); } } void QmitkInteractiveFiberDissectionView::RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart)//pointset { if (nullptr != m_Controls) { m_Controls->m_poinSetListWidget->RemoveSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("axial")->GetSliceNavigationController()); m_Controls->m_poinSetListWidget->RemoveSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("sagittal")->GetSliceNavigationController()); m_Controls->m_poinSetListWidget->RemoveSliceNavigationController(renderWindowPart->GetQmitkRenderWindow("coronal")->GetSliceNavigationController()); } } void QmitkInteractiveFiberDissectionView::CreateStreamline() { if (m_positivSelectedBundles.empty()) { mitk::DataNode::Pointer node = mitk::DataNode::New(); m_positiveFibersData = vtkSmartPointer::New(); m_positiveFibersData->SetPoints(vtkSmartPointer::New()); m_positiveFibersData->SetLines(vtkSmartPointer::New()); m_positiveBundle = mitk::FiberBundle:: New(m_positiveFibersData); node->SetData( m_positiveBundle ); m_positivSelectedBundles.push_back(node); MITK_INFO << m_positivSelectedBundles.size(); this->GetDataStorage()->Add(m_positivSelectedBundles.at(0)); MITK_INFO << "Create Bundle"; } if (!m_positivSelectedBundles.empty()) { this->GetDataStorage()->Remove(m_positivSelectedBundles.at(m_positivSelectedBundles.size()-1)); MITK_INFO << "Adding fibers"; } mitk::PointSet::Pointer pointSet = dynamic_cast(m_SelectedPS->GetData()); vnl_matrix streamline; streamline.set_size(3, pointSet->GetSize()); streamline.fill(0.0); mitk::PointSet::PointsIterator begin = pointSet->Begin(); mitk::PointSet::PointsIterator end = pointSet->End(); unsigned int i; mitk::PointSet::PointsContainer::Iterator it; for (it = begin, i = 0; it != end; ++it, ++i) { PointSet::PointType pt = pointSet->GetPoint(it->Index()); vnl_vector_fixed< float, 3 > candV; candV[0]=pt[0]; candV[1]=pt[1]; candV[2]=pt[2]; streamline.set_column(i, candV); } vtkSmartPointer vNewPolyData = vtkSmartPointer::New(); vtkSmartPointer vNewLines = vtkSmartPointer::New(); vtkSmartPointer vNewPoints = vtkSmartPointer::New(); unsigned int counter = 0; for (unsigned int i=0; iGetNumberOfCells(); ++i) { vtkCell* cell = m_positiveFibersData->GetCell(i); auto numPoints = cell->GetNumberOfPoints(); vtkPoints* points = cell->GetPoints(); vtkSmartPointer container = vtkSmartPointer::New(); for (unsigned int j=0; jGetPoint(j, p); vtkIdType id = vNewPoints->InsertNextPoint(p); container->GetPointIds()->InsertNextId(id); } vNewLines->InsertNextCell(container); counter++; } // build Fiber vtkSmartPointer container = vtkSmartPointer::New(); for (unsigned int j=0; jInsertNextPoint(p); container->GetPointIds()->InsertNextId(id); } vNewLines->InsertNextCell(container); vNewPolyData->SetPoints(vNewPoints); vNewPolyData->SetLines(vNewLines); m_positiveFibersData = vtkSmartPointer::New(); m_positiveFibersData->SetPoints(vtkSmartPointer::New()); m_positiveFibersData->SetLines(vtkSmartPointer::New()); m_positiveFibersData->SetPoints(vNewPoints); m_positiveFibersData->SetLines(vNewLines); m_positiveBundle = mitk::FiberBundle::New(vNewPolyData); m_positiveBundle->SetTrackVisHeader(dynamic_cast(m_SelectedImageNode->GetData())->GetGeometry()); - m_positiveBundle->SetFiberColors(255, 255, 255); + m_positiveBundle->SetFiberColors(0, 255, 0); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData(m_positiveBundle); node->SetName("+Bundle"); m_positivSelectedBundles.push_back(node); MITK_INFO << m_positivSelectedBundles.size(); + MITK_INFO << "The + Bundle has Streamlines:"; + auto m_NegStreamline= dynamic_cast(m_positivSelectedBundles.at(m_positivSelectedBundles.size()-1)->GetData()); + MITK_INFO << m_NegStreamline->GetFiberPolyData()->GetNumberOfCells(); + this->GetDataStorage()->Add(m_positivSelectedBundles.at(m_positivSelectedBundles.size()-1)); UpdateGui(); } void QmitkInteractiveFiberDissectionView::ExtractRandomFibersFromTractogram() { MITK_INFO << "Number of Fibers to extract from Tractogram: "; MITK_INFO << m_Controls->m_NumRandomFibers->value(); - if (m_negativeSelectedBundles.empty()) + if (m_newfibersSelectedBundles.empty()) { mitk::DataNode::Pointer node = mitk::DataNode::New(); - m_negativeFibersData = vtkSmartPointer::New(); - m_negativeFibersData->SetPoints(vtkSmartPointer::New()); - m_negativeFibersData->SetLines(vtkSmartPointer::New()); - m_negativeBundle = mitk::FiberBundle:: New(m_negativeFibersData); + m_newfibersFibersData = vtkSmartPointer::New(); + m_newfibersFibersData->SetPoints(vtkSmartPointer::New()); + m_newfibersFibersData->SetLines(vtkSmartPointer::New()); + m_newfibersBundle = mitk::FiberBundle:: New(m_newfibersFibersData); - node->SetData( m_negativeBundle ); - m_negativeSelectedBundles.push_back(node); - MITK_INFO << m_negativeSelectedBundles.size(); - // this->GetDataStorage()->Add(m_negativeSelectedBundles.at(0)); + node->SetData( m_newfibersBundle ); + m_newfibersSelectedBundles.push_back(node); + MITK_INFO << m_newfibersSelectedBundles.size(); + // this->GetDataStorage()->Add(m_newfibersSelectedBundles.at(0)); // UpdateGui(); MITK_INFO << "Create Bundle"; } mitk::FiberBundle::Pointer fib = dynamic_cast(m_SelectedFB.at(0)->GetData()); // mitk::DataNode::Pointer node = mitk::DataNode::New(); // node ->SetData(pi); // this->GetDataStorage()->Add(cur_bundle); vtkSmartPointer vNewPolyData = vtkSmartPointer::New(); vtkSmartPointer vNewLines = vtkSmartPointer::New(); vtkSmartPointer vNewPoints = vtkSmartPointer::New(); unsigned int counter = 0; for ( int i=0; im_NumRandomFibers->value(); i++) { vtkCell* cell = fib->GetFiberPolyData()->GetCell(i); auto numPoints = cell->GetNumberOfPoints(); vtkPoints* points = cell->GetPoints(); vtkSmartPointer container = vtkSmartPointer::New(); for (unsigned int j=0; jGetPoint(j, p); vtkIdType id = vNewPoints->InsertNextPoint(p); container->GetPointIds()->InsertNextId(id); } // weights->InsertValue(counter, fib->GetFiberWeight(i)); vNewLines->InsertNextCell(container); counter++; + MITK_INFO << counter; + MITK_INFO << vNewLines; + } - vNewPolyData->SetPoints(vNewPoints); vNewPolyData->SetLines(vNewLines); + vNewPolyData->SetPoints(vNewPoints); - m_negativeFibersData = vtkSmartPointer::New(); - m_negativeFibersData->SetPoints(vtkSmartPointer::New()); - m_negativeFibersData->SetLines(vtkSmartPointer::New()); - m_negativeFibersData->SetPoints(vNewPoints); - m_negativeFibersData->SetLines(vNewLines); + m_newfibersFibersData = vtkSmartPointer::New(); + m_newfibersFibersData->SetPoints(vtkSmartPointer::New()); + m_newfibersFibersData->SetLines(vtkSmartPointer::New()); + m_newfibersFibersData->SetPoints(vNewPoints); + m_newfibersFibersData->SetLines(vNewLines); - m_negativeBundle = mitk::FiberBundle::New(vNewPolyData); - m_negativeBundle->SetFiberColors(255, 0, 0); + m_newfibersBundle = mitk::FiberBundle::New(vNewPolyData); + m_newfibersBundle->SetFiberColors(255, 255, 255); mitk::DataNode::Pointer node = mitk::DataNode::New(); - node->SetData(m_negativeBundle); - node->SetName("-Bundle"); - m_negativeSelectedBundles.push_back(node); - MITK_INFO << m_negativeSelectedBundles.size(); + node->SetData(m_newfibersBundle); + node->SetName("ToLabel"); + m_newfibersSelectedBundles.push_back(node); + MITK_INFO << m_newfibersSelectedBundles.size(); - this->GetDataStorage()->Add(m_negativeSelectedBundles.at(m_negativeSelectedBundles.size()-1)); + this->GetDataStorage()->Add(m_newfibersSelectedBundles.at(m_newfibersSelectedBundles.size()-1)); UpdateGui(); } void QmitkInteractiveFiberDissectionView::RemovefromBundle() { - - if (m_negativeSelectedBundles.IsNotNull()) + if (m_StreamlineInteractor.IsNull()) { + this->CreateStreamlineInteractor(); + mitk::FiberBundle::Pointer m_negativeBundle = mitk::FiberBundle::New(); + mitk::DataNode::Pointer m_negativeSelectedBundles = mitk::DataNode::New(); + m_negativeSelectedBundles->SetName("-Bundle"); + m_negativeSelectedBundles->SetData(m_negativeBundle); + this->GetDataStorage()->Add(m_negativeSelectedBundles); + +// if (m_positivSelectedBundles.IsNull()) +// { + +// mitk::FiberBundle::Pointer m_positiveBundle = mitk::FiberBundle::New(); +// mitk::DataNode::Pointer m_positiveSelectedBundles = mitk::DataNode::New(); +// m_positiveSelectedBundles->SetName("-Bundle"); +// m_positiveSelectedBundles->SetData(m_positiveBundle); +// this->GetDataStorage()->Add(m_positiveSelectedBundles);) +// } + + m_StreamlineInteractor->EnableInteraction(true); + m_StreamlineInteractor->SetNegativeNode(m_negativeSelectedBundles); + m_StreamlineInteractor->SetPositiveNode(m_positivSelectedBundles.at(m_positivSelectedBundles.size()-1)); + m_StreamlineInteractor->SetToLabelNode(m_newfibersSelectedBundles.at(m_newfibersSelectedBundles.size()-1)); + } + + + + + - m_DataInteractor = .at(m_negativeSelectedBundles.size()-1)->GetDataInteractor(); - // If no data Interactor is present create a new one - if (m_DataInteractor.IsNull()) - { - // Create PointSetData Interactor - m_DataInteractor = mitk::StreamlineInteractor::New(); - // Load the according state machine for regular point set interaction - m_DataInteractor->LoadStateMachine("Streamline3DStates.xml"); - // Set the configuration file that defines the triggers for the transitions - m_DataInteractor->SetEventConfig("Streamline3D.xml"); - // set the DataNode (which already is added to the DataStorage - m_DataInteractor->SetDataNode(m_PointSetNode); - } - } - else - { - m_PointSetNode->SetDataInteractor(nullptr); - m_DataInteractor = nullptr; - } UpdateGui(); } -void QmitkInteractiveFiberDissectionView::OnAddBundle() + +void QmitkInteractiveFiberDissectionView::CreateStreamlineInteractor() { - UpdateGui(); + m_StreamlineInteractor = mitk::StreamlineInteractor::New(); + + m_StreamlineInteractor->LoadStateMachine("Streamline3DStates.xml", us::ModuleRegistry::GetModule("MitkFiberDissection")); + m_StreamlineInteractor->SetEventConfig("Streamline3DConfig.xml", us::ModuleRegistry::GetModule("MitkFiberDissection")); + +// m_StreamlineInteractor->SetRotationEnabled(rotationEnabled); +} + + +void QmitkInteractiveFiberDissectionView::StartAlgorithm() +{ } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionView.h b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionView.h index 32059b3..a662fe5 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionView.h @@ -1,135 +1,140 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ #ifndef QmitkInteractiveFiberDissectionView_h #define QmitkInteractiveFiberDissectionView_h #include "ui_QmitkInteractiveFiberDissectionViewControls.h" #include //Pointset #include //Pointset #include //Pointset #include //Pointset #include #include #include //Pointset +#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /*! \brief View to process fiber bundles. Supplies methods to extract fibers from the bundle, fiber resampling, mirroring, join and subtract bundles and much more. */ class QmitkInteractiveFiberDissectionView : public QmitkAbstractView, public mitk::IRenderWindowPartListener { // this is needed for all Qt objects that should have a Qt meta-object // (everything that derives from QObject and wants to have signal/slots) Q_OBJECT public: typedef itk::Image< unsigned char, 3 > ItkUCharImageType; typedef itk::Image< float, 3 > ItkFloatImageType; static const std::string VIEW_ID; QmitkInteractiveFiberDissectionView(); virtual ~QmitkInteractiveFiberDissectionView(); virtual void CreateQtPartControl(QWidget *parent) override; /// /// Sets the focus to an internal widget. /// virtual void SetFocus() override; protected slots: void RenderWindowPartActivated(mitk::IRenderWindowPart* renderWindowPart) override; //Pointset void RenderWindowPartDeactivated(mitk::IRenderWindowPart* renderWindowPart) override; //Pointset void OnAddPointSetClicked();//Pointset void CreateStreamline(); -// void AddtoBundle(); void RemovefromBundle(); void ExtractRandomFibersFromTractogram(); + void StartAlgorithm(); void UpdateGui(); ///< update button activity etc. dpending on current datamanager selection protected: void OnCurrentSelectionChanged(QmitkSingleNodeSelectionWidget::NodeList nodes);//Pointset virtual void OnSelectionChanged(berry::IWorkbenchPart::Pointer part, const QList& nodes) override; void OnEndInteraction(); - void OnAddBundle(); + void CreateStreamlineInteractor(); Ui::QmitkInteractiveFiberDissectionViewControls* m_Controls; int m_IterationCounter; ///< used for data node naming std::vector m_SelectedFB; ///< selected fiber bundle nodes mitk::Image::Pointer m_SelectedImage; mitk::DataNode::Pointer m_SelectedPS; mitk::DataNode::Pointer m_SelectedImageNode; mitk::FiberBundle::Pointer m_positiveBundle; + mitk::FiberBundle::Pointer m_newfibersBundle; mitk::FiberBundle::Pointer m_negativeBundle; std::vector< mitk::DataNode::Pointer> m_positivSelectedBundles; - std::vector< mitk::DataNode::Pointer> m_negativeSelectedBundles; + std::vector< mitk::DataNode::Pointer> m_newfibersSelectedBundles; + mitk::DataNode::Pointer m_negativeSelectedBundles; + vtkSmartPointer m_positiveFibersData; - vtkSmartPointer m_negativeFibersData; + vtkSmartPointer m_newfibersFibersData; vtkSmartPointer m_picker1; + mitk::StreamlineInteractor::Pointer m_StreamlineInteractor; }; #endif // _QMITKFIBERTRACKINGVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionViewControls.ui b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionViewControls.ui index 21ead88..671a229 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionViewControls.ui +++ b/Plugins/org.mitk.gui.qt.diffusionimaging.fiberprocessing/src/internal/QmitkInteractiveFiberDissectionViewControls.ui @@ -1,636 +1,631 @@ QmitkInteractiveFiberDissectionViewControls 0 0 417 711 Form QCommandLinkButton:disabled { border: none; } QGroupBox { background-color: transparent; } 9 9 9 9 Please Select Input Data 6 6 6 6 Input DTI Fiber Bundle: <html><head/><body><p><span style=" color:#ff0000;">mandatory</span></p></body></html> true true true Label Fibers QFrame::NoFrame - 1 + 0 6 0 0 399 492 Fiber Creation QFrame::StyledPanel QFrame::Raised - - + + - Add new Streamline Pointset + Selected Streamline Pointset - - - - Add Streamline to Tractogram + + + + Qt::Horizontal - + + + 40 + 20 + + + - - - - Create Streamline + + + + Streamline Points + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + - - + + Qt::Horizontal 40 20 - - + + Qt::Horizontal 40 20 + + + + Add new Streamline Pointset + + + 0 0 0 40 - - - - Selected Streamline Pointset - - - - + Qt::Vertical 20 40 - - - - Streamline Points + + + + Create Streamline - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - Qt::Horizontal - - - - 40 - 20 - - - - true 0 0 399 492 Fiber Labelling Dissect/Eraze Fibers by Erasion and Highlighting - + Qt::Vertical 20 40 - - - - Streamlines belonging to Bundle - - - - - - - - - - Streamlines not belonging to Bundle - - - - - - - Streamlines to be labeled - - - - - - - - - true ArrowCursor QFrame::NoFrame QFrame::Raised Label individual Streamlines + + + + Streamlines to be labeled + + + QFrame::StyledPanel QFrame::Raised - + + + + Label Streamlines + + + + 30 30 :/org.mitk.gui.qt.diffusionimaging.fiberprocessing/resources/eraze.png:/org.mitk.gui.qt.diffusionimaging.fiberprocessing/resources/eraze.png 32 32 true - - - - - 30 - 30 - - + + - + Reject: Rightclick + shift - - - :/org.mitk.gui.qt.diffusionimaging.fiberprocessing/resources/highlighter.png:/org.mitk.gui.qt.diffusionimaging.fiberprocessing/resources/highlighter.png + + + + + + Qt::Horizontal - + - 32 - 32 + 40 + 20 - - true + + + + + + Random Streamlines - - + + - Qt::Vertical + Qt::Horizontal - 20 - 40 + 40 + 20 - - - - Add + + + + Qt::Horizontal - + + + 40 + 20 + + + - - + + Qt::Horizontal 40 20 - - + + - Random Streamlines + Add - - + + + + Accept: Rightclick + alt + + + + + - Qt::Horizontal + Qt::Vertical - 40 - 20 + 20 + 40 - - + + + + 10 + + 0 0 399 492 Active Learning 9 9 341 391 QFrame::StyledPanel QFrame::Raised Qt::Horizontal 40 20 Train Classifier 5 10 Create Prediction Qt::Vertical 20 40 Qt::Horizontal 40 20 Create Uncertanty Map - + Add To be labeled Qt::Horizontal 40 20 Qt::Horizontal 84 22 Qt::Vertical QSizePolicy::Fixed 20 40 QmitkSingleNodeSelectionWidget QWidget
QmitkSingleNodeSelectionWidget.h
QmitkPointListWidget QWidget
QmitkPointListWidget.h