diff --git a/Modules/FiberDissection/CMakeLists.txt b/Modules/FiberDissection/CMakeLists.txt index 14605b9..9b030ee 100644 --- a/Modules/FiberDissection/CMakeLists.txt +++ b/Modules/FiberDissection/CMakeLists.txt @@ -1,5 +1,5 @@ MITK_CREATE_MODULE( SUBPROJECTS MITK-Diffusion - INCLUDE_DIRS Interactor ${CMAKE_CURRENT_BINARY_DIR} + INCLUDE_DIRS Interactor MachineLearning ${CMAKE_CURRENT_BINARY_DIR} DEPENDS MitkDiffusionCore ) diff --git a/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.cpp b/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.cpp index abc7696..32f2de0 100644 --- a/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.cpp +++ b/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.cpp @@ -1,344 +1,344 @@ /*============================================================================ 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" // 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("isoverstreamline", HasPickedHandle); CONNECT_FUNCTION("addnegstreamline", AddStreamlineNegBundle); CONNECT_FUNCTION("addposstreamline", AddStreamlinePosBundle); // CONNECT_FUNCTION("FeedUndoStack", FeedUndoStack); } void mitk::StreamlineInteractor::SetNegativeNode(DataNode *node) { DataInteractor::SetDataNode(node); - m_NegStreamline= dynamic_cast(node->GetData()); + m_NegStreamline= dynamic_cast(node->GetData()); MITK_INFO << "Negative Node added"; } void mitk::StreamlineInteractor::SetToLabelNode(DataNode *node) { DataInteractor::SetDataNode(node); if (node && node->GetData()) { m_manStreamline = dynamic_cast(node->GetData()); MITK_INFO << "Label node added"; } } void mitk::StreamlineInteractor::SetPositiveNode(DataNode *node) { DataInteractor::SetDataNode(node); m_PosStreamline= dynamic_cast(node->GetData()); MITK_INFO << "Positive Node added"; } void mitk::StreamlineInteractor::AddStreamlinePosBundle(StateMachineAction *, InteractionEvent *interactionEvent) { 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 &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(); MITK_INFO << "Number of Cells"; // MITK_INFO << m_PosStreamline->GetFiberPolyData()->GetNumberOfCells(); 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_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++; } 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_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) { MITK_INFO << "no position"; } if (interactionEvent->GetSender()->GetMapperID() == BaseRenderer::Standard2D) { // m_PickedHandle = PickFrom2D(positionEvent); MITK_INFO << "2D"; } else { 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(); } } } diff --git a/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.h b/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.h index ce9f4fd..3c70b41 100644 --- a/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.h +++ b/Modules/FiberDissection/Interactor/mitkStreamlineInteractor.h @@ -1,105 +1,106 @@ /*============================================================================ 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 +#include "MitkFiberDissectionExports.h" + // MITK includes #include #include #include #include // VTK includes #include #include // System includes #include -#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 MITKFIBERDISSECTION_EXPORT StreamlineInteractor : public DataInteractor { public: mitkClassMacro(StreamlineInteractor, DataInteractor); itkFactorylessNewMacro(Self); itkCloneMacro(Self); //! The node holding the Fiberbundle for visual feedback. //! This is the node that the interactor is primarily working on //! (calls DataInteractor::SetDataNode). 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 *); // void DecideInteraction(StateMachineAction *, InteractionEvent *interactionEvent); // //! Pick a Streamline handle from a 2D event (passing by the 2D mapper) // Streamline::HandleType PickFrom2D(const InteractionPositionEvent *positionEvent); // //! Pick a Streamline handle from a 3D event // //! (passing by the general surface mapper and the Streamline object) // Streamline::HandleType PickFrom3D(const InteractionPositionEvent *positionEvent); // void UpdateHandleHighlight(); //! the Streamline used for visual feedback and picking mitk::FiberBundle::Pointer m_NegStreamline; mitk::FiberBundle::Pointer m_PosStreamline; mitk::FiberBundle::Pointer m_manStreamline; vtkSmartPointer m_extracted_streamline; double m_ColorForHighlight[4]; }; } #endif diff --git a/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.cpp b/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.cpp index 4420b63..22d0da8 100644 --- a/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.cpp +++ b/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.cpp @@ -1,176 +1,279 @@ /*=================================================================== 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. ===================================================================*/ #include "mitkStreamlineFeatureExtractor.h" #define _USE_MATH_DEFINES #include #include #include #include namespace mitk{ StreamlineFeatureExtractor::StreamlineFeatureExtractor() - : m_NumPoints(12) + : m_NumPoints(20) { } +StreamlineFeatureExtractor::~StreamlineFeatureExtractor() +{ + +} + + -void TractClusteringFilter::SetTractogram(const mitk::FiberBundle::Pointer &Tractogram) +void StreamlineFeatureExtractor::SetTractogram(const mitk::FiberBundle::Pointer &Tractogram) { m_Tractogram = Tractogram; } +std::vector > StreamlineFeatureExtractor::ResampleFibers(mitk::FiberBundle::Pointer tractogram) +{ + mitk::FiberBundle::Pointer temp_fib = tractogram->GetDeepCopy(); + temp_fib->ResampleToNumPoints(m_NumPoints); -void StreamlineFeatureExtractor::GenerateData() + std::vector< vnl_matrix > out_fib; + + for (int i=0; iGetFiberPolyData()->GetNumberOfCells(); i++) + { + vtkCell* cell = temp_fib->GetFiberPolyData()->GetCell(i); + int numPoints = cell->GetNumberOfPoints(); + vtkPoints* points = cell->GetPoints(); + + vnl_matrix streamline; + streamline.set_size(3, m_NumPoints); + streamline.fill(0.0); + + for (int j=0; jGetPoint(j, cand); + + vnl_vector_fixed< float, 3 > candV; + candV[0]=cand[0]; candV[1]=cand[1]; candV[2]=cand[2]; + streamline.set_column(j, candV); + } + + out_fib.push_back(streamline); + } + + return out_fib; +} + +std::vector > StreamlineFeatureExtractor::CalculateDmdf(std::vector > tractogram, std::vector > prototypes) { - m_OutTractograms.clear(); + std::vector< vnl_matrix > dist_vec; + MITK_INFO << tractogram.size(); + MITK_INFO << prototypes.size(); + MITK_INFO << tractogram.at(0).cols(); + + + for (unsigned int i=0; i distances; + distances.set_size(1, prototypes.size()); + distances.fill(0.0); + + + for (unsigned int j=0; j single_distances; + single_distances.set_size(1, tractogram.at(0).cols()); + single_distances.fill(0.0); + vnl_matrix single_distances_flip; + single_distances_flip.set_size(1, tractogram.at(0).cols()); + single_distances_flip.fill(0.0); + for (unsigned int ik=0; ik single_distances.mean()) + { + distances.put(0,j, single_distances.mean()); + } + else { + distances.put(0,j, single_distances_flip.mean()); + } + + + + } + dist_vec.push_back(distances); + } +// MITK_INFO << dist_vec; + return dist_vec; +} + +void StreamlineFeatureExtractor::GenerateData() +{ + MITK_INFO << "Update"; mitk::FiberBundle::Pointer inputPrototypes = mitk::IOUtil::Load("/home/r948e/E132-Projekte/Projects/2022_Peretzke_Interactive_Fiber_Dissection/mitk_diff/prototypes_599671.trk"); - T_prototypes = ResampleFibers(inputPrototypes); + T_Prototypes = ResampleFibers(inputPrototypes); + T_Tractogram = ResampleFibers(m_Tractogram); + m_distances = CalculateDmdf(T_Tractogram, T_Prototypes); + MITK_INFO << m_distances.at(0); // if (m_Metrics.empty()) // { // mitkThrow() << "No metric selected!"; // return; // } // T = ResampleFibers(m_Tractogram); // if (T.empty()) // { // MITK_INFO << "No fibers in tractogram!"; // return; // } // std::vector< unsigned int > f_indices; // for (unsigned int i=0; i clusters; // if (m_InCentroids.IsNull()) // { // MITK_INFO << "Clustering fibers"; // clusters = ClusterStep(f_indices, m_Distances); // MITK_INFO << "Number of clusters: " << clusters.size(); // clusters = MergeDuplicateClusters2(clusters); // std::sort(clusters.begin(),clusters.end()); // } // else // { // std::vector > centroids = ResampleFibers(m_InCentroids); // if (centroids.empty()) // { // MITK_INFO << "No fibers in centroid tractogram!"; // return; // } // MITK_INFO << "Clustering with input centroids"; // clusters = AddToKnownClusters(f_indices, centroids); // no_match = clusters.back(); // clusters.pop_back(); // MITK_INFO << "Number of clusters: " << clusters.size(); // clusters = MergeDuplicateClusters2(clusters); // } // MITK_INFO << "Clustering finished"; // int max = clusters.size()-1; // if (m_MaxClusters>0 && clusters.size()-1>m_MaxClusters) // max = m_MaxClusters; // m_DiscardedClusters = 0; // for (int i=clusters.size()-1; i>=0; --i) // { // Cluster c = clusters.at(i); // if ( c.n>=(int)m_MinClusterSize && !(m_MaxClusters>0 && clusters.size()-i>m_MaxClusters) ) // { // m_OutClusters.push_back(c); // vtkSmartPointer weights = vtkSmartPointer::New(); // vtkSmartPointer pTmp = m_Tractogram->GeneratePolyDataByIds(c.I, weights); // mitk::FiberBundle::Pointer fib = mitk::FiberBundle::New(pTmp); // if (max>0) // fib->SetFiberWeights((float)i/max); // m_OutTractograms.push_back(fib); // m_OutFiberIndices.push_back(c.I); // // create centroid // vtkSmartPointer vtkNewPoints = vtkSmartPointer::New(); // vtkSmartPointer vtkNewCells = vtkSmartPointer::New(); // vtkSmartPointer polyData = vtkSmartPointer::New(); // vtkSmartPointer container = vtkSmartPointer::New(); // vnl_matrix centroid_points = c.h / c.n; // for (unsigned int j=0; jInsertNextPoint(p); // container->GetPointIds()->InsertNextId(id); // } // vtkNewCells->InsertNextCell(container); // polyData->SetPoints(vtkNewPoints); // polyData->SetLines(vtkNewCells); // mitk::FiberBundle::Pointer centroid = mitk::FiberBundle::New(polyData); // centroid->SetFiberColors(255, 255, 255); // m_OutCentroids.push_back(centroid); // } // else // { // m_DiscardedClusters++; // } // } // MITK_INFO << "Final number of clusters: " << m_OutTractograms.size() << " (discarded " << m_DiscardedClusters << " clusters)"; // int w = 0; // for (auto fib : m_OutTractograms) // { // if (m_OutTractograms.size()>1) // { // fib->SetFiberWeights((float)w/(m_OutTractograms.size()-1)); // m_OutCentroids.at(w)->SetFiberWeights((float)w/(m_OutTractograms.size()-1)); // } // else // { // fib->SetFiberWeights(1); // m_OutCentroids.at(w)->SetFiberWeights(1); // } // fib->ColorFibersByFiberWeights(false, mitk::LookupTable::JET); // ++w; // } // if (no_match.n>0) // { // vtkSmartPointer weights = vtkSmartPointer::New(); // vtkSmartPointer pTmp = m_Tractogram->GeneratePolyDataByIds(no_match.I, weights); // mitk::FiberBundle::Pointer fib = mitk::FiberBundle::New(pTmp); // fib->SetFiberColors(0, 0, 0); // m_OutFiberIndices.push_back(no_match.I); // m_OutTractograms.push_back(fib); // } -//} +} } diff --git a/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.h b/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.h index f10e744..da20707 100644 --- a/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.h +++ b/Modules/FiberDissection/MachineLearning/mitkStreamlineFeatureExtractor.h @@ -1,72 +1,75 @@ /*=================================================================== 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 StreamlineFeatureExtractor_h #define StreamlineFeatureExtractor_h + +#include "MitkFiberDissectionExports.h" // MITK -#include #include #include -#include // ITK #include // VTK #include #include #include #include #include namespace mitk{ /** * \brief */ -class MITKFIBERDISSECTION_EXPORT StreamlineFeatureExtractor +class MITKFIBERDISSECTION_EXPORT StreamlineFeatureExtractor { public: StreamlineFeatureExtractor(); ~StreamlineFeatureExtractor(); typedef itk::Image< float, 3 > FloatImageType; typedef itk::Image< unsigned char, 3 > UcharImageType; void Update(){ this->GenerateData(); } + void SetTractogram(const mitk::FiberBundle::Pointer &Tractogram); protected: void GenerateData(); std::vector< vnl_matrix > ResampleFibers(FiberBundle::Pointer tractogram); + std::vector > CalculateDmdf(std::vector > tractogram, std::vector > prototypes); unsigned int m_NumPoints; mitk::FiberBundle::Pointer m_Tractogram; - std::vector > T_prototypes; + std::vector > T_Prototypes; std::vector > T_Tractogram; + std::vector > m_distances; }; } #endif diff --git a/Modules/FiberDissection/files.cmake b/Modules/FiberDissection/files.cmake index ee910a5..0ccc13a 100644 --- a/Modules/FiberDissection/files.cmake +++ b/Modules/FiberDissection/files.cmake @@ -1,13 +1,23 @@ set(H_FILES - Interactor/mitkStreamlineInteractor.h + + #Interactor + Interactor/mitkStreamlineInteractor.h + + #MachineLearning + MachineLearning/mitkStreamlineFeatureExtractor.h ) set(CPP_FILES - Interactor/mitkStreamlineInteractor.cpp + + #Interactor + Interactor/mitkStreamlineInteractor.cpp + + #MachineLearning + MachineLearning/mitkStreamlineFeatureExtractor.cpp ) set(RESOURCE_FILES # "Interactions" prefix forced by mitk::StateMachine Interactions/Streamline3DStates.xml Interactions/Streamline3DConfig.xml ) 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 b8fc6b5..abf8884 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,574 +1,593 @@ /*=================================================================== 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 "usModuleRegistry.h" +//#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"));//pointsett - connect(m_Controls->m_ErazorButton, SIGNAL( clicked() ), this, SLOT( RemovefromBundle() ) ); //need + connect(m_Controls->m_ErazorButton, SIGNAL(toggled(bool)), this, SLOT( RemovefromBundle(bool) ) ); //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->setCheckable(true); m_Controls->m_ErazorButton->setEnabled(false); m_Controls->m_addPointSetPushButton->setEnabled(false); m_Controls->m_StreamlineCreation->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_newfibersSelectedBundles.empty(); - bool posSelected = !m_positivSelectedBundles.empty(); - bool negSelected = !m_negativeSelectedBundles.IsNotNull(); +// bool nfibSelected = !m_newfibersSelectedBundles.empty(); +// bool posSelected = !m_positivSelectedBundles.empty(); + bool nfibSelected = m_newfibersSelectedBundles.IsNotNull(); +// bool posSelected = !m_positivSelectedBundles.IsNotNull(); +// bool negSelected = !m_negativeSelectedBundles.IsNotNull(); + bool posSelected = this->GetDataStorage()->Exists(m_positivSelectedBundles); + bool negSelected = this->GetDataStorage()->Exists(m_negativeSelectedBundles); + + // 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_ErazorButton->setEnabled(true); } if (posSelected && negSelected) { + MITK_INFO << "Enable Algortihm"; 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()) + if (m_positivSelectedBundles.IsNull()) { 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)); + m_positivSelectedBundles = node; + this->GetDataStorage()->Add(m_positivSelectedBundles); MITK_INFO << "Create Bundle"; } - if (!m_positivSelectedBundles.empty()) + if (!m_positivSelectedBundles.IsNull()) { - this->GetDataStorage()->Remove(m_positivSelectedBundles.at(m_positivSelectedBundles.size()-1)); + this->GetDataStorage()->Remove(m_positivSelectedBundles); 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->SetTrackVisHeader(dynamic_cast(m_SelectedImageNode->GetData())->GetGeometry()); 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(); + m_positivSelectedBundles= node; + MITK_INFO << "The + Bundle has Streamlines:"; - auto m_NegStreamline= dynamic_cast(m_positivSelectedBundles.at(m_positivSelectedBundles.size()-1)->GetData()); + auto m_NegStreamline= dynamic_cast(m_positivSelectedBundles->GetData()); MITK_INFO << m_NegStreamline->GetFiberPolyData()->GetNumberOfCells(); - this->GetDataStorage()->Add(m_positivSelectedBundles.at(m_positivSelectedBundles.size()-1)); + this->GetDataStorage()->Add(m_positivSelectedBundles); UpdateGui(); } void QmitkInteractiveFiberDissectionView::ExtractRandomFibersFromTractogram() { MITK_INFO << "Number of Fibers to extract from Tractogram: "; MITK_INFO << m_Controls->m_NumRandomFibers->value(); - if (m_newfibersSelectedBundles.empty()) + if (m_newfibersSelectedBundles.IsNull()) { mitk::DataNode::Pointer node = mitk::DataNode::New(); m_newfibersFibersData = vtkSmartPointer::New(); m_newfibersFibersData->SetPoints(vtkSmartPointer::New()); m_newfibersFibersData->SetLines(vtkSmartPointer::New()); m_newfibersBundle = mitk::FiberBundle:: New(m_newfibersFibersData); node->SetData( m_newfibersBundle ); - m_newfibersSelectedBundles.push_back(node); - MITK_INFO << m_newfibersSelectedBundles.size(); - // this->GetDataStorage()->Add(m_newfibersSelectedBundles.at(0)); - // UpdateGui(); + m_newfibersSelectedBundles = node ; + 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->SetLines(vNewLines); vNewPolyData->SetPoints(vNewPoints); m_newfibersFibersData = vtkSmartPointer::New(); m_newfibersFibersData->SetPoints(vtkSmartPointer::New()); m_newfibersFibersData->SetLines(vtkSmartPointer::New()); m_newfibersFibersData->SetPoints(vNewPoints); m_newfibersFibersData->SetLines(vNewLines); m_newfibersBundle = mitk::FiberBundle::New(vNewPolyData); m_newfibersBundle->SetFiberColors(255, 255, 255); mitk::DataNode::Pointer node = mitk::DataNode::New(); node->SetData(m_newfibersBundle); node->SetName("ToLabel"); - m_newfibersSelectedBundles.push_back(node); - MITK_INFO << m_newfibersSelectedBundles.size(); + m_newfibersSelectedBundles = node; - this->GetDataStorage()->Add(m_newfibersSelectedBundles.at(m_newfibersSelectedBundles.size()-1)); + this->GetDataStorage()->Add(m_newfibersSelectedBundles); UpdateGui(); } -void QmitkInteractiveFiberDissectionView::RemovefromBundle() +void QmitkInteractiveFiberDissectionView::RemovefromBundle( bool checked ) { - if (m_StreamlineInteractor.IsNull()) + if (checked) + { + + if (m_StreamlineInteractor.IsNull()) + { + this->CreateStreamlineInteractor(); +// if (m_negativeSelectedBundles.IsNull()) +// { + mitk::FiberBundle::Pointer m_negativeBundle = mitk::FiberBundle::New(); + mitk::DataNode::Pointer node = mitk::DataNode::New(); + node->SetName("-Bundle"); + node->SetData(m_negativeBundle); + m_negativeSelectedBundles = node; + 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); + m_StreamlineInteractor->SetToLabelNode(m_newfibersSelectedBundles); + } + else + { + m_StreamlineInteractor->EnableInteraction(true); + } + } + else { - 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_StreamlineInteractor->EnableInteraction(false); +// m_StreamlineInteractor = nullptr; } UpdateGui(); } void QmitkInteractiveFiberDissectionView::CreateStreamlineInteractor() { 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() { + std::shared_ptr< mitk::StreamlineFeatureExtractor > clusterer = std::make_shared(); + clusterer->SetTractogram(m_positiveBundle); + clusterer->Update(); + MITK_INFO << "HI"; } 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 a662fe5..cb97dd7 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,140 +1,141 @@ /*=================================================================== 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 #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 RemovefromBundle(); + void RemovefromBundle( bool checked ); 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 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_newfibersSelectedBundles; - mitk::DataNode::Pointer m_negativeSelectedBundles; + mitk::DataNode::Pointer m_positivSelectedBundles; + mitk::DataNode::Pointer m_newfibersSelectedBundles; + mitk::DataNode::Pointer m_negativeSelectedBundles; vtkSmartPointer m_positiveFibersData; 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 671a229..55eac34 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,631 +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 - 0 + 1 6 0 0 399 492 Fiber Creation QFrame::StyledPanel QFrame::Raised Selected Streamline Pointset Qt::Horizontal 40 20 Streamline Points Qt::Vertical 20 40 Qt::Horizontal 40 20 Qt::Horizontal 40 20 Add new Streamline Pointset 0 0 0 40 Qt::Vertical 20 40 Create Streamline true 0 0 399 492 Fiber Labelling Dissect/Eraze Fibers by Erasion and Highlighting Qt::Vertical 20 40 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 Reject: Rightclick + shift Qt::Horizontal 40 20 Random Streamlines Qt::Horizontal 40 20 Qt::Horizontal 40 20 Qt::Horizontal 40 20 Add Accept: Rightclick + alt Qt::Vertical 20 40 - 10 + 1 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