diff --git a/Modules/DiffusionImaging/Connectomics/Rendering/mitkConnectomicsNetworkMapper3D.cpp b/Modules/DiffusionImaging/Connectomics/Rendering/mitkConnectomicsNetworkMapper3D.cpp index ce596ed013..a55a4a815d 100644 --- a/Modules/DiffusionImaging/Connectomics/Rendering/mitkConnectomicsNetworkMapper3D.cpp +++ b/Modules/DiffusionImaging/Connectomics/Rendering/mitkConnectomicsNetworkMapper3D.cpp @@ -1,736 +1,828 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. 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 "mitkConnectomicsNetworkMapper3D.h" #include #include "vtkGraphLayout.h" #include #include "vtkGraphToPolyData.h" #include #include "vtkGlyph3D.h" #include "vtkGlyphSource2D.h" #include "mitkConnectomicsRenderingProperties.h" #include "mitkConnectomicsRenderingSchemeProperty.h" #include "mitkConnectomicsRenderingEdgeFilteringProperty.h" #include "mitkConnectomicsRenderingNodeFilteringProperty.h" #include "mitkConnectomicsRenderingNodeColorParameterProperty.h" #include "mitkConnectomicsRenderingNodeRadiusParameterProperty.h" #include "mitkConnectomicsRenderingEdgeColorParameterProperty.h" #include "mitkConnectomicsRenderingEdgeRadiusParameterProperty.h" #include "mitkConnectomicsRenderingNodeThresholdParameterProperty.h" #include "mitkConnectomicsRenderingEdgeThresholdParameterProperty.h" +#include +#include +#include // Workaround MSVC "extension": and &&, or ||, not !, ... +// iso646.h reenables 11 Alternative operator representations: +// http://en.cppreference.com/w/cpp/language/operator_alternative + +#include #include mitk::ConnectomicsNetworkMapper3D::ConnectomicsNetworkMapper3D() { m_NetworkAssembly = vtkPropAssembly::New(); - + m_Translator = mitk::FreeSurferParcellationTranslator::New(); } mitk::ConnectomicsNetworkMapper3D:: ~ConnectomicsNetworkMapper3D() { m_NetworkAssembly->Delete(); } void mitk::ConnectomicsNetworkMapper3D::GenerateDataForRenderer(mitk::BaseRenderer* renderer) -void mitk::ConnectomicsNetworkMapper3D::GenerateDataForRenderer(mitk::BaseRenderer* /*renderer*/) { if( this-> GetInput() == nullptr ) { + renderer-> GetOverlayManager()-> RemoveOverlay( m_TextOverlay3D.GetPointer() ); return; } bool propertiesHaveChanged = this-> PropertiesChanged(); if( this-> GetInput()-> GetIsModified() || propertiesHaveChanged ) { - m_NetworkAssembly->Delete(); - m_NetworkAssembly = vtkPropAssembly::New(); - - // Here is the part where a graph is given and converted to points and connections between points... - std::vector< mitk::ConnectomicsNetwork::NetworkNode > vectorOfNodes = this->GetInput()->GetVectorOfAllNodes(); - std::vector< std::pair< - std::pair< mitk::ConnectomicsNetwork::NetworkNode, mitk::ConnectomicsNetwork::NetworkNode > - , mitk::ConnectomicsNetwork::NetworkEdge > > vectorOfEdges = this->GetInput()->GetVectorOfAllEdges(); - - // Decide on the style of rendering due to property - - if( m_ChosenRenderingScheme == connectomicsRenderingMITKScheme ) - { - mitk::Point3D tempWorldPoint, tempCNFGeometryPoint; - - //////////////////////Prepare coloring and radius//////////// - - std::vector< double > vectorOfNodeRadiusParameterValues; - vectorOfNodeRadiusParameterValues.resize( vectorOfNodes.size() ); - double maxNodeRadiusParameterValue( FillNodeParameterVector( &vectorOfNodeRadiusParameterValues, m_NodeRadiusParameter ) ); - - std::vector< double > vectorOfNodeColorParameterValues; - vectorOfNodeColorParameterValues.resize( vectorOfNodes.size() ); - double maxNodeColorParameterValue( FillNodeParameterVector( &vectorOfNodeColorParameterValues, m_NodeColorParameter ) ); + m_NetworkAssembly-> Delete(); + m_NetworkAssembly = vtkPropAssembly::New(); - std::vector< double > vectorOfEdgeRadiusParameterValues; - vectorOfEdgeRadiusParameterValues.resize( vectorOfEdges.size() ); - double maxEdgeRadiusParameterValue( FillEdgeParameterVector( &vectorOfEdgeRadiusParameterValues, m_EdgeRadiusParameter ) ); - - std::vector< double > vectorOfEdgeColorParameterValues; - vectorOfEdgeColorParameterValues.resize( vectorOfEdges.size() ); - double maxEdgeColorParameterValue( FillEdgeParameterVector( &vectorOfEdgeColorParameterValues, m_EdgeColorParameter ) ); - - //////////////////////Prepare Filtering////////////////////// - // true will be rendered - std::vector< bool > vectorOfNodeFilterBools( vectorOfNodes.size(), true ); - if( m_ChosenNodeFilter == connectomicsRenderingNodeThresholdingFilter ) - { - FillNodeFilterBoolVector( &vectorOfNodeFilterBools, m_NodeThresholdParameter ); - } - - std::vector< bool > vectorOfEdgeFilterBools( vectorOfEdges.size(), true ); - if( m_ChosenEdgeFilter == connectomicsRenderingEdgeThresholdFilter ) - { - FillEdgeFilterBoolVector( &vectorOfEdgeFilterBools, m_EdgeThresholdParameter ); - } + // Here is the part where a graph is given and converted to points and connections between points... + std::vector< mitk::ConnectomicsNetwork::NetworkNode > vectorOfNodes = this->GetInput()->GetVectorOfAllNodes(); + std::vector< std::pair< + std::pair< mitk::ConnectomicsNetwork::NetworkNode, mitk::ConnectomicsNetwork::NetworkNode > + , mitk::ConnectomicsNetwork::NetworkEdge > > vectorOfEdges = this->GetInput()->GetVectorOfAllEdges(); - //////////////////////Create Spheres///////////////////////// - for(unsigned int i = 0; i < vectorOfNodes.size(); i++) + // Decide on the style of rendering due to property + if( m_ChosenRenderingScheme == connectomicsRenderingMITKScheme ) { - vtkSmartPointer sphereSource = - vtkSmartPointer::New(); + mitk::Point3D tempWorldPoint, tempCNFGeometryPoint; - for(unsigned int dimension = 0; dimension < 3; dimension++) + ////// Prepare BalloonWidgets/Overlays: //////////////////// + if( ( m_ChosenNodeLabel == "" or m_ChosenNodeLabel == "-1" ) and m_TextOverlay3D ) { - tempCNFGeometryPoint.SetElement( dimension , vectorOfNodes[i].coordinates[dimension] ); + renderer-> GetOverlayManager()-> RemoveOverlay( m_TextOverlay3D.GetPointer() ); + GetDataNode()-> SetProperty( connectomicsRenderingBalloonTextName.c_str(), mitk::StringProperty::New(""), nullptr ); + GetDataNode()-> SetProperty( connectomicsRenderingBalloonNodeStatsName.c_str(), mitk::StringProperty::New(""), nullptr ); } - GetDataNode()->GetData()->GetGeometry()->IndexToWorld( tempCNFGeometryPoint, tempWorldPoint ); + //////////////////////Prepare coloring and radius//////////// + std::vector< double > vectorOfNodeRadiusParameterValues; + vectorOfNodeRadiusParameterValues.resize( vectorOfNodes.size() ); + double maxNodeRadiusParameterValue( FillNodeParameterVector( &vectorOfNodeRadiusParameterValues, m_NodeRadiusParameter ) ); - sphereSource->SetCenter( tempWorldPoint[0] , tempWorldPoint[1], tempWorldPoint[2] ); + std::vector< double > vectorOfNodeColorParameterValues; + vectorOfNodeColorParameterValues.resize( vectorOfNodes.size() ); + double maxNodeColorParameterValue( FillNodeParameterVector( &vectorOfNodeColorParameterValues, m_NodeColorParameter ) ); - // determine radius - double radiusFactor = vectorOfNodeRadiusParameterValues[i] / maxNodeRadiusParameterValue; + std::vector< double > vectorOfEdgeRadiusParameterValues; + vectorOfEdgeRadiusParameterValues.resize( vectorOfEdges.size() ); + double maxEdgeRadiusParameterValue( FillEdgeParameterVector( &vectorOfEdgeRadiusParameterValues, m_EdgeRadiusParameter ) ); - double radius = m_NodeRadiusStart + ( m_NodeRadiusEnd - m_NodeRadiusStart) * radiusFactor; - sphereSource->SetRadius( radius ); + std::vector< double > vectorOfEdgeColorParameterValues; + vectorOfEdgeColorParameterValues.resize( vectorOfEdges.size() ); + double maxEdgeColorParameterValue( FillEdgeParameterVector( &vectorOfEdgeColorParameterValues, m_EdgeColorParameter ) ); - vtkSmartPointer mapper = - vtkSmartPointer::New(); - mapper->SetInputConnection(sphereSource->GetOutputPort()); - - vtkSmartPointer actor = - vtkSmartPointer::New(); - actor->SetMapper(mapper); - - // determine color - double colorFactor = vectorOfNodeColorParameterValues[i] / maxNodeColorParameterValue; + //////////////////////Prepare Filtering////////////////////// + // true will be rendered + std::vector< bool > vectorOfNodeFilterBools( vectorOfNodes.size(), true ); + if( m_ChosenNodeFilter == connectomicsRenderingNodeThresholdingFilter ) + { + FillNodeFilterBoolVector( &vectorOfNodeFilterBools, m_NodeThresholdParameter ); + } - double redStart = m_NodeColorStart.GetElement( 0 ); - double greenStart = m_NodeColorStart.GetElement( 1 ); - double blueStart = m_NodeColorStart.GetElement( 2 ); - double redEnd = m_NodeColorEnd.GetElement( 0 ); - double greenEnd = m_NodeColorEnd.GetElement( 1 ); - double blueEnd = m_NodeColorEnd.GetElement( 2 ); + std::vector< bool > vectorOfEdgeFilterBools( vectorOfEdges.size(), true ); + if( m_ChosenEdgeFilter == connectomicsRenderingEdgeThresholdFilter ) + { + FillEdgeFilterBoolVector( &vectorOfEdgeFilterBools, m_EdgeThresholdParameter ); + } - double red = redStart + ( redEnd - redStart ) * colorFactor; - double green = greenStart + ( greenEnd - greenStart ) * colorFactor; - double blue = blueStart + ( blueEnd - blueStart ) * colorFactor; - actor->GetProperty()->SetColor( red, green, blue); + //////////////////////Create Spheres///////////////////////// + std::stringstream nodeLabelStream; //local stream variable to hold csv list of node label names and node label numbers. - if( vectorOfNodeFilterBools[i] ) + for(unsigned int i = 0; i < vectorOfNodes.size(); i++) { - m_NetworkAssembly->AddPart(actor); + vtkSmartPointer sphereSource = + vtkSmartPointer::New(); + + for(unsigned int dimension = 0; dimension < 3; dimension++) + { + tempCNFGeometryPoint.SetElement( dimension , vectorOfNodes[i].coordinates[dimension] ); + } + + GetDataNode()->GetData()->GetGeometry()->IndexToWorld( tempCNFGeometryPoint, tempWorldPoint ); + + sphereSource->SetCenter( tempWorldPoint[0] , tempWorldPoint[1], tempWorldPoint[2] ); + + // determine radius + double radiusFactor = vectorOfNodeRadiusParameterValues[i] / maxNodeRadiusParameterValue; + + double radius = m_NodeRadiusStart + ( m_NodeRadiusEnd - m_NodeRadiusStart) * radiusFactor; + sphereSource->SetRadius( radius ); + + vtkSmartPointer mapper = + vtkSmartPointer::New(); + mapper->SetInputConnection(sphereSource->GetOutputPort()); + + vtkSmartPointer actor = + vtkSmartPointer::New(); + actor->SetMapper(mapper); + + // determine color + double colorFactor = vectorOfNodeColorParameterValues[i] / maxNodeColorParameterValue; + + double redStart = m_NodeColorStart.GetElement( 0 ); + double greenStart = m_NodeColorStart.GetElement( 1 ); + double blueStart = m_NodeColorStart.GetElement( 2 ); + double redEnd = m_NodeColorEnd.GetElement( 0 ); + double greenEnd = m_NodeColorEnd.GetElement( 1 ); + double blueEnd = m_NodeColorEnd.GetElement( 2 ); + + double red = redStart + ( redEnd - redStart ) * colorFactor; + double green = greenStart + ( greenEnd - greenStart ) * colorFactor; + double blue = blueStart + ( blueEnd - blueStart ) * colorFactor; + + actor->GetProperty()->SetColor( red, green, blue); + + //append to csv list of nodelabels. + nodeLabelStream << m_Translator-> GetName( std::stoi( vectorOfNodes[i].label ) ) + << ": " << vectorOfNodes[i].label << ","; + + if( vectorOfNodeFilterBools[i] ) + { + if( vectorOfNodes[i].label == m_ChosenNodeLabel ) + { // if chosen and enabled, show information in Balloon or TextOverlay: + // What to show: + std::stringstream balloonStringstream; + balloonStringstream << "Node id: " << vectorOfNodes[i].id + << ", label: " << vectorOfNodes[i].label + << ",\n name: " + << m_Translator-> GetName( std::stoi( vectorOfNodes[i].label ) ) + << std::endl; + m_BalloonText = balloonStringstream.str(); + GetDataNode()-> + SetProperty( connectomicsRenderingBalloonTextName.c_str(), + mitk::StringProperty::New( m_BalloonText.c_str()), nullptr ); + + std::stringstream balloonNodeStatsStream; + balloonNodeStatsStream + << ", Coordinates: (" << vectorOfNodes[i].coordinates[0] + << " ; " << vectorOfNodes[i].coordinates[1] + << " ; " << vectorOfNodes[i].coordinates[2] << " )" + << ", Degree: " + << ( this-> GetInput()-> GetDegreeOfNodes() ).at( vectorOfNodes[i].id ) + << ", Betweenness centrality: " + << ( this->GetInput()->GetNodeBetweennessVector() ).at( vectorOfNodes[i].id ) + << ", Clustering coefficient: " + << ( this->GetInput()->GetLocalClusteringCoefficients()).at( vectorOfNodes[i].id ) + << std::endl; + m_BalloonNodeStats = balloonNodeStatsStream.str(); + GetDataNode()-> + SetProperty( connectomicsRenderingBalloonNodeStatsName.c_str(), + mitk::StringProperty::New( m_BalloonNodeStats.c_str()), nullptr ); + + // Where to show: + float r[3]; + r[0]= vectorOfNodes[i].coordinates[0]; + r[1]= vectorOfNodes[i].coordinates[1]; + r[2]= vectorOfNodes[i].coordinates[2]; + mitk::Point3D BalloonAnchor( r ); + mitk::Point3D BalloonAnchorWorldCoord( r ); + GetDataNode()-> GetData()-> GetGeometry()-> IndexToWorld( BalloonAnchor, BalloonAnchorWorldCoord ); + + // How to show: + if( m_ChosenNodeLabel != "-1" ) + { + if (m_TextOverlay3D != nullptr) + { + renderer-> GetOverlayManager()-> RemoveOverlay( m_TextOverlay3D.GetPointer() ); + } + m_TextOverlay3D = mitk::TextOverlay3D::New(); + renderer-> GetOverlayManager()-> AddOverlay( m_TextOverlay3D.GetPointer() ); + m_TextOverlay3D-> SetFontSize( 2.5 ); + m_TextOverlay3D-> SetColor( 0.96, 0.69, 0.01 ); + m_TextOverlay3D-> SetOpacity( 0.81 ); + m_TextOverlay3D-> SetPosition3D( BalloonAnchorWorldCoord ); + m_TextOverlay3D-> SetText( "...." + m_BalloonText ); + m_TextOverlay3D-> SetForceInForeground( true ); // TODO: does not work anymore. + m_TextOverlay3D-> SetVisibility( GetDataNode()-> IsVisible( renderer ) ); + renderer-> GetOverlayManager()-> UpdateOverlays( renderer ); + // Colorize chosen node: + actor-> GetProperty()-> SetColor( 1.0, 0.69, 0.01); + } + } + m_NetworkAssembly-> AddPart( actor ); + } } - } + m_AllNodeLabels = nodeLabelStream.str(); // Store all Node Names and Node Labels in 1 Property. + m_AllNodeLabels.erase( m_AllNodeLabels.rfind(","), 1 ); // remove trailing ,. + GetDataNode()-> + SetProperty( connectomicsRenderingBalloonAllNodeLabelsName.c_str(), + mitk::StringProperty::New( m_AllNodeLabels.c_str() ), nullptr ); - //////////////////////Create Tubes///////////////////////// - for(unsigned int i = 0; i < vectorOfEdges.size(); i++) - { + //////////////////////Create Tubes///////////////////////// + for(unsigned int i = 0; i < vectorOfEdges.size(); i++) + { - vtkSmartPointer lineSource = - vtkSmartPointer::New(); + vtkSmartPointer lineSource = + vtkSmartPointer::New(); - for(unsigned int dimension = 0; dimension < 3; dimension++) - { - tempCNFGeometryPoint[ dimension ] = vectorOfEdges[i].first.first.coordinates[dimension]; - } + for(unsigned int dimension = 0; dimension < 3; dimension++) + { + tempCNFGeometryPoint[ dimension ] = vectorOfEdges[i].first.first.coordinates[dimension]; + } - GetDataNode()->GetData()->GetGeometry()->IndexToWorld( tempCNFGeometryPoint, tempWorldPoint ); + GetDataNode()->GetData()->GetGeometry()->IndexToWorld( tempCNFGeometryPoint, tempWorldPoint ); - lineSource->SetPoint1(tempWorldPoint[0], tempWorldPoint[1],tempWorldPoint[2] ); + lineSource->SetPoint1(tempWorldPoint[0], tempWorldPoint[1],tempWorldPoint[2] ); - for(unsigned int dimension = 0; dimension < 3; dimension++) - { - tempCNFGeometryPoint[ dimension ] = vectorOfEdges[i].first.second.coordinates[dimension]; - } + for(unsigned int dimension = 0; dimension < 3; dimension++) + { + tempCNFGeometryPoint[ dimension ] = vectorOfEdges[i].first.second.coordinates[dimension]; + } - GetDataNode()->GetData()->GetGeometry()->IndexToWorld( tempCNFGeometryPoint, tempWorldPoint ); + GetDataNode()->GetData()->GetGeometry()->IndexToWorld( tempCNFGeometryPoint, tempWorldPoint ); - lineSource->SetPoint2(tempWorldPoint[0], tempWorldPoint[1], tempWorldPoint[2] ); + lineSource->SetPoint2(tempWorldPoint[0], tempWorldPoint[1], tempWorldPoint[2] ); - vtkSmartPointer tubes = vtkSmartPointer::New(); - tubes->SetInputConnection( lineSource->GetOutputPort() ); - tubes->SetNumberOfSides( 12 ); + vtkSmartPointer tubes = vtkSmartPointer::New(); + tubes->SetInputConnection( lineSource->GetOutputPort() ); + tubes->SetNumberOfSides( 12 ); - // determine radius - double radiusFactor = vectorOfEdgeRadiusParameterValues[i] / maxEdgeRadiusParameterValue; + // determine radius + double radiusFactor = vectorOfEdgeRadiusParameterValues[i] / maxEdgeRadiusParameterValue; - double radius = m_EdgeRadiusStart + ( m_EdgeRadiusEnd - m_EdgeRadiusStart) * radiusFactor; - tubes->SetRadius( radius ); + double radius = m_EdgeRadiusStart + ( m_EdgeRadiusEnd - m_EdgeRadiusStart) * radiusFactor; + tubes->SetRadius( radius ); - // originally we used a logarithmic scaling, - // double radiusFactor = 1.0 + ((double) vectorOfEdges[i].second.weight) / 10.0 ; - // tubes->SetRadius( std::log10( radiusFactor ) ); + // originally we used a logarithmic scaling, + // double radiusFactor = 1.0 + ((double) vectorOfEdges[i].second.weight) / 10.0 ; + // tubes->SetRadius( std::log10( radiusFactor ) ); - vtkSmartPointer mapper2 = - vtkSmartPointer::New(); - mapper2->SetInputConnection( tubes->GetOutputPort() ); + vtkSmartPointer mapper2 = + vtkSmartPointer::New(); + mapper2->SetInputConnection( tubes->GetOutputPort() ); - vtkSmartPointer actor = - vtkSmartPointer::New(); - actor->SetMapper(mapper2); + vtkSmartPointer actor = + vtkSmartPointer::New(); + actor->SetMapper(mapper2); - // determine color - double colorFactor = vectorOfEdgeColorParameterValues[i] / maxEdgeColorParameterValue; + // determine color + double colorFactor = vectorOfEdgeColorParameterValues[i] / maxEdgeColorParameterValue; - double redStart = m_EdgeColorStart.GetElement( 0 ); - double greenStart = m_EdgeColorStart.GetElement( 1 ); - double blueStart = m_EdgeColorStart.GetElement( 2 ); - double redEnd = m_EdgeColorEnd.GetElement( 0 ); - double greenEnd = m_EdgeColorEnd.GetElement( 1 ); - double blueEnd = m_EdgeColorEnd.GetElement( 2 ); + double redStart = m_EdgeColorStart.GetElement( 0 ); + double greenStart = m_EdgeColorStart.GetElement( 1 ); + double blueStart = m_EdgeColorStart.GetElement( 2 ); + double redEnd = m_EdgeColorEnd.GetElement( 0 ); + double greenEnd = m_EdgeColorEnd.GetElement( 1 ); + double blueEnd = m_EdgeColorEnd.GetElement( 2 ); - double red = redStart + ( redEnd - redStart ) * colorFactor; - double green = greenStart + ( greenEnd - greenStart ) * colorFactor; - double blue = blueStart + ( blueEnd - blueStart ) * colorFactor; + double red = redStart + ( redEnd - redStart ) * colorFactor; + double green = greenStart + ( greenEnd - greenStart ) * colorFactor; + double blue = blueStart + ( blueEnd - blueStart ) * colorFactor; - actor->GetProperty()->SetColor( red, green, blue); + actor->GetProperty()->SetColor( red, green, blue); - if( vectorOfEdgeFilterBools[i] ) + if( vectorOfEdgeFilterBools[i] ) + { + m_NetworkAssembly->AddPart(actor); + } + } + } + else if( m_ChosenRenderingScheme == connectomicsRenderingVTKScheme ) { - m_NetworkAssembly->AddPart(actor); + vtkSmartPointer graph = + vtkSmartPointer::New(); + + std::vector< vtkIdType > networkToVTKvector; + networkToVTKvector.resize(vectorOfNodes.size()); + + for(unsigned int i = 0; i < vectorOfNodes.size(); i++) + { + networkToVTKvector[vectorOfNodes[i].id] = graph->AddVertex(); + } + + for(unsigned int i = 0; i < vectorOfEdges.size(); i++) + { + graph->AddEdge(networkToVTKvector[vectorOfEdges[i].first.first.id], + networkToVTKvector[vectorOfEdges[i].first.second.id]); + } + + vtkSmartPointer points = + vtkSmartPointer::New(); + for(unsigned int i = 0; i < vectorOfNodes.size(); i++) + { + double x = vectorOfNodes[i].coordinates[0]; + double y = vectorOfNodes[i].coordinates[1]; + double z = vectorOfNodes[i].coordinates[2]; + points->InsertNextPoint( x, y, z); + } + + graph->SetPoints(points); + + vtkGraphLayout* layout = vtkGraphLayout::New(); + layout->SetInputData(graph); + vtkPassThroughLayoutStrategy* ptls = vtkPassThroughLayoutStrategy::New(); + layout->SetLayoutStrategy( ptls ); + + vtkGraphToPolyData* graphToPoly = vtkGraphToPolyData::New(); + graphToPoly->SetInputConnection(layout->GetOutputPort()); + + // Create the standard VTK polydata mapper and actor + // for the connections (edges) in the tree. + vtkPolyDataMapper* edgeMapper = vtkPolyDataMapper::New(); + edgeMapper->SetInputConnection(graphToPoly->GetOutputPort()); + vtkActor* edgeActor = vtkActor::New(); + edgeActor->SetMapper(edgeMapper); + edgeActor->GetProperty()->SetColor(0.0, 0.5, 1.0); + + // Glyph the points of the tree polydata to create + // VTK_VERTEX cells at each vertex in the tree. + vtkGlyph3D* vertGlyph = vtkGlyph3D::New(); + vertGlyph->SetInputConnection(0, graphToPoly->GetOutputPort()); + vtkGlyphSource2D* glyphSource = vtkGlyphSource2D::New(); + glyphSource->SetGlyphTypeToVertex(); + vertGlyph->SetInputConnection(1, glyphSource->GetOutputPort()); + + // Create a mapper for the vertices, and tell the mapper + // to use the specified color array. + vtkPolyDataMapper* vertMapper = vtkPolyDataMapper::New(); + vertMapper->SetInputConnection(vertGlyph->GetOutputPort()); + /*if (colorArray) + { + vertMapper->SetScalarModeToUsePointFieldData(); + vertMapper->SelectColorArray(colorArray); + vertMapper->SetScalarRange(colorRange); + }*/ + + // Create an actor for the vertices. Move the actor forward + // in the z direction so it is drawn on top of the edge actor. + vtkActor* vertActor = vtkActor::New(); + vertActor->SetMapper(vertMapper); + vertActor->GetProperty()->SetPointSize(5); + vertActor->SetPosition(0, 0, 0.001); + //vtkProp3D.h: virtual void SetPosition(double,double,double): + //Set/Get/Add the position of the Prop3D in world coordinates. + m_NetworkAssembly->AddPart(edgeActor); + m_NetworkAssembly->AddPart(vertActor); } - } - } - else if( m_ChosenRenderingScheme == connectomicsRenderingVTKScheme ) - { - vtkSmartPointer graph = - vtkSmartPointer::New(); - - std::vector< vtkIdType > networkToVTKvector; - networkToVTKvector.resize(vectorOfNodes.size()); - for(unsigned int i = 0; i < vectorOfNodes.size(); i++) - { - networkToVTKvector[vectorOfNodes[i].id] = graph->AddVertex(); + (static_cast ( GetDataNode()->GetData() ) )-> SetIsModified( false ); } - - for(unsigned int i = 0; i < vectorOfEdges.size(); i++) - { - graph->AddEdge(networkToVTKvector[vectorOfEdges[i].first.first.id], networkToVTKvector[vectorOfEdges[i].first.second.id]); - } - - vtkSmartPointer points = - vtkSmartPointer::New(); - for(unsigned int i = 0; i < vectorOfNodes.size(); i++) - { - double x = vectorOfNodes[i].coordinates[0]; - double y = vectorOfNodes[i].coordinates[1]; - double z = vectorOfNodes[i].coordinates[2]; - points->InsertNextPoint( x, y, z); - } - - graph->SetPoints(points); - - vtkGraphLayout* layout = vtkGraphLayout::New(); - layout->SetInputData(graph); - vtkPassThroughLayoutStrategy* ptls = vtkPassThroughLayoutStrategy::New(); - layout->SetLayoutStrategy( ptls ); - - vtkGraphToPolyData* graphToPoly = vtkGraphToPolyData::New(); - graphToPoly->SetInputConnection(layout->GetOutputPort()); - - // Create the standard VTK polydata mapper and actor - // for the connections (edges) in the tree. - vtkPolyDataMapper* edgeMapper = vtkPolyDataMapper::New(); - edgeMapper->SetInputConnection(graphToPoly->GetOutputPort()); - vtkActor* edgeActor = vtkActor::New(); - edgeActor->SetMapper(edgeMapper); - edgeActor->GetProperty()->SetColor(0.0, 0.5, 1.0); - - // Glyph the points of the tree polydata to create - // VTK_VERTEX cells at each vertex in the tree. - vtkGlyph3D* vertGlyph = vtkGlyph3D::New(); - vertGlyph->SetInputConnection(0, graphToPoly->GetOutputPort()); - vtkGlyphSource2D* glyphSource = vtkGlyphSource2D::New(); - glyphSource->SetGlyphTypeToVertex(); - vertGlyph->SetInputConnection(1, glyphSource->GetOutputPort()); - - // Create a mapper for the vertices, and tell the mapper - // to use the specified color array. - vtkPolyDataMapper* vertMapper = vtkPolyDataMapper::New(); - vertMapper->SetInputConnection(vertGlyph->GetOutputPort()); - /*if (colorArray) - { - vertMapper->SetScalarModeToUsePointFieldData(); - vertMapper->SelectColorArray(colorArray); - vertMapper->SetScalarRange(colorRange); - }*/ - - // Create an actor for the vertices. Move the actor forward - // in the z direction so it is drawn on top of the edge actor. - vtkActor* vertActor = vtkActor::New(); - vertActor->SetMapper(vertMapper); - vertActor->GetProperty()->SetPointSize(5); - vertActor->SetPosition(0, 0, 0.001); - - m_NetworkAssembly->AddPart(edgeActor); - m_NetworkAssembly->AddPart(vertActor); - } - - (static_cast ( GetDataNode()->GetData() ) )->SetIsModified( false ); - } } const mitk::ConnectomicsNetwork* mitk::ConnectomicsNetworkMapper3D::GetInput() { return static_cast ( GetDataNode()->GetData() ); } void mitk::ConnectomicsNetworkMapper3D::SetDefaultProperties(DataNode* node, BaseRenderer* renderer , bool overwrite) { // Initialize enumeration properties mitk::ConnectomicsRenderingSchemeProperty::Pointer connectomicsRenderingScheme = mitk::ConnectomicsRenderingSchemeProperty::New(); mitk::ConnectomicsRenderingEdgeFilteringProperty::Pointer connectomicsRenderingEdgeFiltering = mitk::ConnectomicsRenderingEdgeFilteringProperty::New(); mitk::ConnectomicsRenderingNodeFilteringProperty::Pointer connectomicsRenderingNodeFiltering = mitk::ConnectomicsRenderingNodeFilteringProperty::New(); mitk::ConnectomicsRenderingNodeColorParameterProperty::Pointer connectomicsRenderingNodeGradientColorParameter = mitk::ConnectomicsRenderingNodeColorParameterProperty::New(); mitk::ConnectomicsRenderingNodeRadiusParameterProperty::Pointer connectomicsRenderingNodeRadiusParameter = mitk::ConnectomicsRenderingNodeRadiusParameterProperty::New(); mitk::ConnectomicsRenderingEdgeColorParameterProperty::Pointer connectomicsRenderingEdgeGradientColorParameter = mitk::ConnectomicsRenderingEdgeColorParameterProperty::New(); mitk::ConnectomicsRenderingEdgeRadiusParameterProperty::Pointer connectomicsRenderingEdgeRadiusParameter = mitk::ConnectomicsRenderingEdgeRadiusParameterProperty::New(); mitk::ConnectomicsRenderingNodeThresholdParameterProperty::Pointer connectomicsRenderingNodeThresholdParameter = mitk::ConnectomicsRenderingNodeThresholdParameterProperty::New(); mitk::ConnectomicsRenderingEdgeThresholdParameterProperty::Pointer connectomicsRenderingEdgeThresholdParameter = mitk::ConnectomicsRenderingEdgeThresholdParameterProperty::New(); + mitk::StringProperty::Pointer balloonText = mitk::StringProperty::New(); + // set the properties node->AddProperty( connectomicsRenderingSchemePropertyName.c_str(), connectomicsRenderingScheme, renderer, overwrite ); node->AddProperty( connectomicsRenderingEdgeFilteringPropertyName.c_str(), connectomicsRenderingEdgeFiltering, renderer, overwrite ); node->AddProperty( connectomicsRenderingEdgeThresholdFilterParameterName.c_str(), connectomicsRenderingEdgeThresholdParameter, renderer, overwrite ); node->AddProperty( connectomicsRenderingEdgeThresholdFilterThresholdName.c_str(), connectomicsRenderingEdgeThresholdFilterThresholdDefault, renderer, overwrite ); node->AddProperty( connectomicsRenderingNodeFilteringPropertyName.c_str(), connectomicsRenderingNodeFiltering, renderer, overwrite ); node->AddProperty( connectomicsRenderingNodeThresholdFilterParameterName.c_str(), connectomicsRenderingNodeThresholdParameter, renderer, overwrite ); node->AddProperty( connectomicsRenderingNodeThresholdFilterThresholdName.c_str(), connectomicsRenderingNodeThresholdFilterThresholdDefault, renderer, overwrite ); node->AddProperty( connectomicsRenderingNodeGradientStartColorName.c_str(), connectomicsRenderingNodeGradientStartColorDefault, renderer, overwrite ); node->AddProperty( connectomicsRenderingNodeGradientEndColorName.c_str(), connectomicsRenderingNodeGradientEndColorDefault, renderer, overwrite ); node->AddProperty( connectomicsRenderingNodeGradientColorParameterName.c_str(), connectomicsRenderingNodeGradientColorParameter, renderer, overwrite ); node->AddProperty( connectomicsRenderingNodeRadiusStartName.c_str(), connectomicsRenderingNodeRadiusStartDefault, renderer, overwrite ); node->AddProperty( connectomicsRenderingNodeRadiusEndName.c_str(), connectomicsRenderingNodeRadiusEndDefault, renderer, overwrite ); node->AddProperty( connectomicsRenderingNodeRadiusParameterName.c_str(), connectomicsRenderingNodeRadiusParameter, renderer, overwrite ); node->AddProperty( connectomicsRenderingNodeChosenNodeName.c_str(), connectomicsRenderingNodeChosenNodeDefault, renderer, overwrite ); node->AddProperty( connectomicsRenderingEdgeGradientStartColorName.c_str(), connectomicsRenderingEdgeGradientStartColorDefault, renderer, overwrite ); node->AddProperty( connectomicsRenderingEdgeGradientEndColorName.c_str(), connectomicsRenderingEdgeGradientEndColorDefault, renderer, overwrite ); node->AddProperty( connectomicsRenderingEdgeGradientColorParameterName.c_str(), connectomicsRenderingEdgeGradientColorParameter, renderer, overwrite ); node->AddProperty( connectomicsRenderingEdgeRadiusStartName.c_str(), connectomicsRenderingEdgeRadiusStartDefault, renderer, overwrite ); node->AddProperty( connectomicsRenderingEdgeRadiusEndName.c_str(), connectomicsRenderingEdgeRadiusEndDefault, renderer, overwrite ); node->AddProperty( connectomicsRenderingEdgeRadiusParameterName.c_str(), connectomicsRenderingEdgeRadiusParameter, renderer, overwrite ); + node-> AddProperty( connectomicsRenderingBalloonTextName.c_str(), balloonText, + nullptr, overwrite ); // renderer=nullptr: Property is renderer independant. + Superclass::SetDefaultProperties(node, renderer, overwrite); } -void mitk::ConnectomicsNetworkMapper3D::SetVtkMapperImmediateModeRendering(vtkMapper* /*mapper*/) +void mitk::ConnectomicsNetworkMapper3D::SetVtkMapperImmediateModeRendering(vtkMapper* mapper) { - //TODO: implement - + mapper-> ImmediateModeRenderingOn(); } void mitk::ConnectomicsNetworkMapper3D::UpdateVtkObjects() { //TODO: implement } vtkProp* mitk::ConnectomicsNetworkMapper3D::GetVtkProp(mitk::BaseRenderer* /*renderer*/) { return m_NetworkAssembly; } bool mitk::ConnectomicsNetworkMapper3D::PropertiesChanged() { mitk::ConnectomicsRenderingSchemeProperty * renderingScheme = static_cast< mitk::ConnectomicsRenderingSchemeProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingSchemePropertyName.c_str() ) ); mitk::ConnectomicsRenderingEdgeFilteringProperty * edgeFilter = static_cast< mitk::ConnectomicsRenderingEdgeFilteringProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingEdgeFilteringPropertyName.c_str() ) ); mitk::FloatProperty * edgeThreshold = static_cast< mitk::FloatProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingEdgeThresholdFilterThresholdName.c_str() ) ); mitk::ConnectomicsRenderingNodeFilteringProperty * nodeFilter = static_cast< mitk::ConnectomicsRenderingNodeFilteringProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingNodeFilteringPropertyName.c_str() ) ); mitk::ConnectomicsRenderingNodeThresholdParameterProperty * nodeThresholdParameter = static_cast< mitk::ConnectomicsRenderingNodeThresholdParameterProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingNodeThresholdFilterParameterName.c_str() ) ); mitk::ConnectomicsRenderingEdgeThresholdParameterProperty * edgeThresholdParameter = static_cast< mitk::ConnectomicsRenderingEdgeThresholdParameterProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingEdgeThresholdFilterParameterName.c_str() ) ); mitk::FloatProperty * nodeThreshold = static_cast< mitk::FloatProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingNodeThresholdFilterThresholdName.c_str() ) ); mitk::ColorProperty * nodeColorStart = static_cast< mitk::ColorProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingNodeGradientStartColorName.c_str() ) ); mitk::ColorProperty * nodeColorEnd = static_cast< mitk::ColorProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingNodeGradientEndColorName.c_str() ) ); mitk::FloatProperty * nodeRadiusStart = static_cast< mitk::FloatProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingNodeRadiusStartName.c_str() ) ); mitk::FloatProperty * nodeRadiusEnd = static_cast< mitk::FloatProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingNodeRadiusEndName.c_str() ) ); mitk::StringProperty * chosenNode = static_cast< mitk::StringProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingNodeChosenNodeName.c_str() ) ); mitk::ColorProperty * edgeColorStart = static_cast< mitk::ColorProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingEdgeGradientStartColorName.c_str() ) ); mitk::ColorProperty * edgeColorEnd = static_cast< mitk::ColorProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingEdgeGradientEndColorName.c_str() ) ); mitk::FloatProperty * edgeRadiusStart = static_cast< mitk::FloatProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingEdgeRadiusStartName.c_str() ) ); mitk::FloatProperty * edgeRadiusEnd = static_cast< mitk::FloatProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingEdgeRadiusEndName.c_str() ) ); mitk::ConnectomicsRenderingNodeColorParameterProperty * nodeColorParameter = static_cast< mitk::ConnectomicsRenderingNodeColorParameterProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingNodeGradientColorParameterName.c_str() ) ); mitk::ConnectomicsRenderingNodeRadiusParameterProperty * nodeRadiusParameter = static_cast< mitk::ConnectomicsRenderingNodeRadiusParameterProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingNodeRadiusParameterName.c_str() ) ); mitk::ConnectomicsRenderingEdgeColorParameterProperty * edgeColorParameter = static_cast< mitk::ConnectomicsRenderingEdgeColorParameterProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingEdgeGradientColorParameterName.c_str() ) ); mitk::ConnectomicsRenderingEdgeRadiusParameterProperty * edgeRadiusParameter = static_cast< mitk::ConnectomicsRenderingEdgeRadiusParameterProperty * > ( this->GetDataNode()->GetProperty( connectomicsRenderingEdgeRadiusParameterName.c_str() ) ); if( m_ChosenRenderingScheme != renderingScheme->GetValueAsString() || m_ChosenEdgeFilter != edgeFilter->GetValueAsString() || m_EdgeThreshold != edgeThreshold->GetValue() || m_EdgeThresholdParameter != edgeThresholdParameter->GetValueAsString() || m_ChosenNodeFilter != nodeFilter->GetValueAsString() || m_NodeThreshold != nodeThreshold->GetValue() || m_NodeThresholdParameter != nodeThresholdParameter->GetValueAsString() || m_NodeColorStart != nodeColorStart->GetValue() || m_NodeColorEnd != nodeColorEnd->GetValue() || m_NodeRadiusStart != nodeRadiusStart->GetValue() || m_NodeRadiusEnd != nodeRadiusEnd->GetValue() || m_ChosenNodeLabel != chosenNode->GetValueAsString() || m_EdgeColorStart != edgeColorStart->GetValue() || m_EdgeColorEnd != edgeColorEnd->GetValue() || m_EdgeRadiusStart != edgeRadiusStart->GetValue() || m_EdgeRadiusEnd != edgeRadiusEnd->GetValue() || m_NodeColorParameter != nodeColorParameter->GetValueAsString() || m_NodeRadiusParameter != nodeRadiusParameter->GetValueAsString() || m_EdgeColorParameter != edgeColorParameter->GetValueAsString() || m_EdgeRadiusParameter != edgeRadiusParameter->GetValueAsString() ) { m_ChosenRenderingScheme = renderingScheme->GetValueAsString(); m_ChosenEdgeFilter = edgeFilter->GetValueAsString(); m_EdgeThreshold = edgeThreshold->GetValue(); m_EdgeThresholdParameter = edgeThresholdParameter->GetValueAsString(); m_ChosenNodeFilter = nodeFilter->GetValueAsString(); m_NodeThreshold = nodeThreshold->GetValue(); m_NodeThresholdParameter = nodeThresholdParameter->GetValueAsString(); m_NodeColorStart = nodeColorStart->GetValue(); m_NodeColorEnd = nodeColorEnd->GetValue(); m_NodeRadiusStart = nodeRadiusStart->GetValue(); m_NodeRadiusEnd = nodeRadiusEnd->GetValue(); m_ChosenNodeLabel = chosenNode->GetValueAsString(); m_EdgeColorStart = edgeColorStart->GetValue(); m_EdgeColorEnd = edgeColorEnd->GetValue(); m_EdgeRadiusStart = edgeRadiusStart->GetValue(); m_EdgeRadiusEnd = edgeRadiusEnd->GetValue(); m_NodeColorParameter = nodeColorParameter->GetValueAsString(); m_NodeRadiusParameter = nodeRadiusParameter->GetValueAsString(); m_EdgeColorParameter = edgeColorParameter->GetValueAsString(); m_EdgeRadiusParameter = edgeRadiusParameter->GetValueAsString(); return true; } return false; } double mitk::ConnectomicsNetworkMapper3D::FillNodeParameterVector( std::vector< double > * parameterVector, std::string parameterName ) { int end( parameterVector->size() ); // constant parameter - uniform style if( parameterName == connectomicsRenderingNodeParameterConstant ) { for(int index(0); index < end; index++) { parameterVector->at( index ) = 1.0; } return 1.0; } double maximum( 0.0 ); // using the degree as parameter if( parameterName == connectomicsRenderingNodeParameterDegree ) { std::vector< int > vectorOfDegree = this->GetInput()->GetDegreeOfNodes(); for(int index(0); index < end; index++) { parameterVector->at( index ) = vectorOfDegree[ index ]; } maximum = *std::max_element( parameterVector->begin(), parameterVector->end() ); } // using betweenness centrality as parameter if( parameterName == connectomicsRenderingNodeParameterBetweenness ) { std::vector< double > vectorOfBetweenness = this->GetInput()->GetNodeBetweennessVector(); for(int index(0); index < end; index++) { parameterVector->at( index ) = vectorOfBetweenness[index]; } maximum = *std::max_element( parameterVector->begin(), parameterVector->end() ); } // using clustering coefficient as parameter if( parameterName == connectomicsRenderingNodeParameterClustering ) { const std::vector< double > vectorOfClustering = this->GetInput()->GetLocalClusteringCoefficients(); for(int index(0); index < end; index++) { parameterVector->at( index ) = vectorOfClustering[index]; } maximum = *std::max_element( parameterVector->begin(), parameterVector->end() ); } // using distance to a specific node as parameter if( parameterName == connectomicsRenderingNodeParameterColoringShortestPath ) { bool labelFound( this->GetInput()->CheckForLabel( m_ChosenNodeLabel ) ); // check whether the chosen node is valid if( !labelFound ) { MITK_WARN << "Node chosen for rendering is not valid."; for(int index(0); index < end; index++) { parameterVector->at( index ) = 1.0; } return 1.0; } else { const std::vector< double > distanceVector = this->GetInput()->GetShortestDistanceVectorFromLabel( m_ChosenNodeLabel ); for(int index(0); index < end; index++) { parameterVector->at( index ) = distanceVector[index]; } maximum = *std::max_element( parameterVector->begin(), parameterVector->end() ); } } // if the maximum is nearly zero if( std::abs( maximum ) < mitk::eps ) { maximum = 1.0; } return maximum; } double mitk::ConnectomicsNetworkMapper3D::FillEdgeParameterVector( std::vector< double > * parameterVector, std::string parameterName ) { int end( parameterVector->size() ); // constant parameter - uniform style if( parameterName == connectomicsRenderingEdgeParameterConstant ) { for(int index(0); index < end; index++) { parameterVector->at( index ) = 1.0; } return 1.0; } double maximum( 0.0 ); // using the weight as parameter if( parameterName == connectomicsRenderingEdgeParameterWeight ) { std::vector< std::pair< std::pair< mitk::ConnectomicsNetwork::NetworkNode, mitk::ConnectomicsNetwork::NetworkNode > , mitk::ConnectomicsNetwork::NetworkEdge > > vectorOfEdges = this->GetInput()->GetVectorOfAllEdges(); for(int index(0); index < end; index++) { parameterVector->at( index ) = vectorOfEdges[ index ].second.weight; } maximum = *std::max_element( parameterVector->begin(), parameterVector->end() ); } // using the edge centrality as parameter if( parameterName == connectomicsRenderingEdgeParameterCentrality ) { const std::vector< double > vectorOfCentrality = this->GetInput()->GetEdgeBetweennessVector(); for(int index(0); index < end; index++) { parameterVector->at( index ) = vectorOfCentrality[index]; } maximum = *std::max_element( parameterVector->begin(), parameterVector->end() ); } // if the maximum is nearly zero if( std::abs( maximum ) < mitk::eps ) { maximum = 1.0; } return maximum; } void mitk::ConnectomicsNetworkMapper3D::FillNodeFilterBoolVector( std::vector< bool > * boolVector, std::string parameterName ) { std::vector< double > parameterVector; parameterVector.resize( boolVector->size() ); int end( parameterVector.size() ); // using the degree as parameter if( parameterName == connectomicsRenderingNodeParameterDegree ) { std::vector< int > vectorOfDegree = this->GetInput()->GetDegreeOfNodes(); for(int index(0); index < end; index++) { parameterVector.at( index ) = vectorOfDegree[ index ]; } } // using betweenness centrality as parameter if( parameterName == connectomicsRenderingNodeParameterBetweenness ) { std::vector< double > vectorOfBetweenness = this->GetInput()->GetNodeBetweennessVector(); for(int index(0); index < end; index++) { parameterVector.at( index ) = vectorOfBetweenness[index]; } } // using clustering coefficient as parameter if( parameterName == connectomicsRenderingNodeParameterClustering ) { const std::vector< double > vectorOfClustering = this->GetInput()->GetLocalClusteringCoefficients(); for(int index(0); index < end; index++) { parameterVector.at( index ) = vectorOfClustering[index]; } } for( int index( 0 ), end( boolVector->size() ); index < end; index++ ) { if( parameterVector.at( index ) >= m_NodeThreshold ) { boolVector->at( index ) = true; } else { boolVector->at( index ) = false; } } return; } void mitk::ConnectomicsNetworkMapper3D::FillEdgeFilterBoolVector( std::vector< bool > * boolVector, std::string parameterName ) { std::vector< double > parameterVector; parameterVector.resize( boolVector->size() ); int end( parameterVector.size() ); // using the weight as parameter if( parameterName == connectomicsRenderingEdgeParameterWeight ) { std::vector< std::pair< std::pair< mitk::ConnectomicsNetwork::NetworkNode, mitk::ConnectomicsNetwork::NetworkNode > , mitk::ConnectomicsNetwork::NetworkEdge > > vectorOfEdges = this->GetInput()->GetVectorOfAllEdges(); for(int index(0); index < end; index++) { parameterVector.at( index ) = vectorOfEdges[ index ].second.weight; } } // using the edge centrality as parameter if( parameterName == connectomicsRenderingEdgeParameterCentrality ) { const std::vector< double > vectorOfCentrality = this->GetInput()->GetEdgeBetweennessVector(); for(int index(0); index < end; index++) { parameterVector.at( index ) = vectorOfCentrality[index]; } } for( int index( 0 ), end( boolVector->size() ); index < end; index++ ) { if( parameterVector.at( index ) >= m_EdgeThreshold ) { boolVector->at( index ) = true; } else { boolVector->at( index ) = false; } } return; } diff --git a/Modules/DiffusionImaging/Connectomics/Rendering/mitkConnectomicsNetworkMapper3D.h b/Modules/DiffusionImaging/Connectomics/Rendering/mitkConnectomicsNetworkMapper3D.h index 02853c49e3..90a1bc755b 100644 --- a/Modules/DiffusionImaging/Connectomics/Rendering/mitkConnectomicsNetworkMapper3D.h +++ b/Modules/DiffusionImaging/Connectomics/Rendering/mitkConnectomicsNetworkMapper3D.h @@ -1,133 +1,150 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. 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 ConnectomicsNetworkMapper3D_H_HEADER_INCLUDED #define ConnectomicsNetworkMapper3D_H_HEADER_INCLUDED // VTK includes #include #include "vtkPropAssembly.h" // MITK includes // base class #include "mitkVtkMapper.h" // data type #include "mitkConnectomicsNetwork.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include +#include +#include "mitkTextOverlay2D.h" +#include "mitkTextOverlay3D.h" +#include +#include +#include +#include +#include "mitkFreeSurferParcellationTranslator.h" +#include "mitkVtkInteractorStyle.h" + #include +#include +#include #include namespace mitk { /** * \brief Mapper for Networks * \ingroup Mapper */ class MITKCONNECTOMICS_EXPORT ConnectomicsNetworkMapper3D : public VtkMapper { public: mitkClassMacro(ConnectomicsNetworkMapper3D, VtkMapper); itkFactorylessNewMacro(Self) itkCloneMacro(Self) virtual vtkProp *GetVtkProp(mitk::BaseRenderer *renderer) override; //looks like deprecated.. should be replaced bz GetViewProp() static void SetDefaultProperties(DataNode* node, BaseRenderer* renderer = nullptr, bool overwrite = false ); static void SetVtkMapperImmediateModeRendering(vtkMapper* mapper); virtual void GenerateDataForRenderer(mitk::BaseRenderer* renderer) override; virtual const mitk::ConnectomicsNetwork* GetInput(); protected: ConnectomicsNetworkMapper3D(); virtual ~ConnectomicsNetworkMapper3D(); void UpdateVtkObjects(); vtkPropAssembly *m_NetworkAssembly; /** * \brief Returns true if the properties have changed since the last data generation */ bool PropertiesChanged(); // Create vectors for customizing color and radius and return maximum double FillNodeParameterVector( std::vector< double > * parameterVector, std::string parameterName ); double FillEdgeParameterVector( std::vector< double > * parameterVector, std::string parameterName ); void FillNodeFilterBoolVector( std::vector< bool > * boolVector, std::string parameterName ); void FillEdgeFilterBoolVector( std::vector< bool > * boolVector, std::string parameterName ); // Property storing members std::string m_ChosenRenderingScheme; std::string m_ChosenEdgeFilter; std::string m_EdgeThresholdParameter; double m_EdgeThreshold; std::string m_ChosenNodeFilter; std::string m_NodeThresholdParameter; double m_NodeThreshold; mitk::Color m_NodeColorStart; mitk::Color m_NodeColorEnd; double m_NodeRadiusStart; double m_NodeRadiusEnd; std::string m_ChosenNodeLabel; mitk::Color m_EdgeColorStart; mitk::Color m_EdgeColorEnd; double m_EdgeRadiusStart; double m_EdgeRadiusEnd; std::string m_NodeRadiusParameter; std::string m_NodeColorParameter; std::string m_EdgeRadiusParameter; std::string m_EdgeColorParameter; + // Balloons + std::string m_BalloonText; + std::string m_BalloonNodeStats; + mitk::FreeSurferParcellationTranslator::Pointer m_Translator; + std::string m_AllNodeLabels; + mitk::TextOverlay3D::Pointer m_TextOverlay3D; }; } // namespace mitk #endif /* ConnectomicsNetworkMapper3D_H_HEADER_INCLUDED */ - diff --git a/Modules/DiffusionImaging/Connectomics/Rendering/mitkConnectomicsRenderingProperties.h b/Modules/DiffusionImaging/Connectomics/Rendering/mitkConnectomicsRenderingProperties.h index 4e45b72ee6..c35ef52cd9 100644 --- a/Modules/DiffusionImaging/Connectomics/Rendering/mitkConnectomicsRenderingProperties.h +++ b/Modules/DiffusionImaging/Connectomics/Rendering/mitkConnectomicsRenderingProperties.h @@ -1,328 +1,338 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. 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 ConnectomicsRenderingProperties_H_HEADER_INCLUDED #define ConnectomicsRenderingProperties_H_HEADER_INCLUDED #include #include "mitkProperties.h" #include "mitkStringProperty.h" #include "mitkEnumerationProperty.h" #include "mitkColorProperty.h" namespace mitk { /** \file mitkConnectomicsRenderingProperties.h * \brief This file defines the rendering properties available for connectomics networks in MITK. * * This file collects and explains the properties which can be used to modify the visualisation * of connectomics networks. */ // Switching between rendering modes /** * \brief Define the rendering scheme to be used. * * Currently there are two possible rendering schemes in MITK. *
    *
  1. The VTK Graph Layout *
  2. The MITK Connectomics Visualisation - Default *
* * The VTK Graph Layout is faster than the MITK Connectomics Visualisation, but provides less features * and settings. */ const std::string connectomicsRenderingSchemePropertyName = "Connectomics.Rendering.Scheme"; /** * \brief Much faster but less features. */ const std::string connectomicsRenderingVTKScheme = "VTK Graph Layout"; /** * \brief Slower but with several visualisation options. */ const std::string connectomicsRenderingMITKScheme = "MITK Connectomics Visualisation"; // All options below are only for the MITK Connectomics Visualisation scheme //////////////////////////////////////// // Filtering Options //////////////////////////////////////// /** \brief Edge filter option * * This option controls the filtering of edges for visualization purposes. Edges filtered out will not be shown, but still included in calculations. * * Currently there these options: *
    *
  1. No Edge Filtering - Default *
  2. Shortest Path to Node *
  3. Thresholding *
* */ const std::string connectomicsRenderingEdgeFilteringPropertyName = "Connectomics.Rendering.Edges.Filtering"; /** * \brief Do not filter edges */ const std::string connectomicsRenderingEdgeNoFilter = "No Edge Filtering"; /** * \brief Only show edges which are part of a shortest path to the selected node from any other node */ const std::string connectomicsRenderingEdgeShortestPathFilter = "Shortest Path to Node"; /** * \brief Show only edges above a certain parameter threshold */ const std::string connectomicsRenderingEdgeThresholdFilter = "Thresholding"; /** * \brief Parameter to be thresholded */ const std::string connectomicsRenderingEdgeThresholdFilterParameterName = "Connectomics.Rendering.Edges.Filtering.ThresholdParameter"; /** * \brief Threshold */ const std::string connectomicsRenderingEdgeThresholdFilterThresholdName = "Connectomics.Rendering.Edges.Filtering.Threshold"; /** \brief Node filter option * * This option controls the filtering of nodes for visualization purposes. Nodes filtered out will not be shown, but still included in calculations. * * Currently there these options: *
    *
  1. No Node Filtering - Default *
  2. Thresholding *
* */ const std::string connectomicsRenderingNodeFilteringPropertyName = "Connectomics.Rendering.Nodes.Filtering"; /** * \brief Do not filter nodes */ const std::string connectomicsRenderingNodeNoFilter = "No Node Filtering"; /** * \brief Only show nodes above a certain parameter threshold */ const std::string connectomicsRenderingNodeThresholdingFilter = "Thresholding"; /** * \brief Parameter to be thresholded */ const std::string connectomicsRenderingNodeThresholdFilterParameterName = "Connectomics.Rendering.Nodes.Filtering.ThresholdParameter"; /** * \brief Threshold */ const std::string connectomicsRenderingNodeThresholdFilterThresholdName = "Connectomics.Rendering.Nodes.Filtering.Threshold"; // Default values const mitk::StringProperty::Pointer connectomicsRenderingEdgeThresholdFilterParameterDefault = mitk::StringProperty::New( "" ); const mitk::FloatProperty::Pointer connectomicsRenderingEdgeThresholdFilterThresholdDefault = mitk::FloatProperty::New( 1.0 ); const mitk::StringProperty::Pointer connectomicsRenderingNodeThresholdFilterParameterDefault = mitk::StringProperty::New( "" ); const mitk::FloatProperty::Pointer connectomicsRenderingNodeThresholdFilterThresholdDefault = mitk::FloatProperty::New( 1.0 ); //////////////////////////////////////// // Node Options //////////////////////////////////////// // Color gradient /** * \brief Start Color * * The start color that will be used for gradient creation */ const std::string connectomicsRenderingNodeGradientStartColorName = "Connectomics.Rendering.Nodes.Gradient.StartColor"; /** * \brief End Color * * The end color that will be used for gradient creation */ const std::string connectomicsRenderingNodeGradientEndColorName = "Connectomics.Rendering.Nodes.Gradient.EndColor"; /** * \brief Color parameter * * This parameter will be used to select the color of the node. */ const std::string connectomicsRenderingNodeGradientColorParameterName = "Connectomics.Rendering.Nodes.Gradient.Parameter"; /** * \brief The chosen node label * * This node will be used for any visualisation requiring a specific node */ const std::string connectomicsRenderingNodeChosenNodeName = "Connectomics.Rendering.Nodes.ChosenNode"; // Radius /** * \brief Start Radius * * The start radius that will be used */ const std::string connectomicsRenderingNodeRadiusStartName = "Connectomics.Rendering.Nodes.Radius.Start"; /** * \brief End Radius * * The end radius that will be used */ const std::string connectomicsRenderingNodeRadiusEndName = "Connectomics.Rendering.Nodes.Radius.End"; /** * \brief Radius parameter * * This parameter will be used to select the radius of the node. */ const std::string connectomicsRenderingNodeRadiusParameterName = "Connectomics.Rendering.Nodes.Radius.Parameter"; // Possible parameters /** * \brief Using the node degree as parameter */ const std::string connectomicsRenderingNodeParameterDegree = "Degree"; /** * \brief Using the node betweenness as parameter */ const std::string connectomicsRenderingNodeParameterBetweenness = "Betweenness centrality"; /** * \brief Using the node clustering coefficient as parameter */ const std::string connectomicsRenderingNodeParameterClustering = "Clustering coefficient"; /** * \brief Color nodes by shortest path length to a chosen node */ const std::string connectomicsRenderingNodeParameterColoringShortestPath = "Shortest Path Steps"; /** * \brief Constant * * The node property will be constant. */ const std::string connectomicsRenderingNodeParameterConstant = "Constant"; // Default values const mitk::StringProperty::Pointer connectomicsRenderingNodeChosenNodeDefault = mitk::StringProperty::New(""); const mitk::ColorProperty::Pointer connectomicsRenderingNodeGradientStartColorDefault = mitk::ColorProperty::New(0.0f, 0.0f, 1.0f); const mitk::ColorProperty::Pointer connectomicsRenderingNodeGradientEndColorDefault = mitk::ColorProperty::New(0.0f, 1.0f, 0.0f); const mitk::FloatProperty::Pointer connectomicsRenderingNodeRadiusStartDefault = mitk::FloatProperty::New( 1.0 ); const mitk::FloatProperty::Pointer connectomicsRenderingNodeRadiusEndDefault = mitk::FloatProperty::New( 1.0 ); //////////////////////////////////////// // Edge Options //////////////////////////////////////// // Color gradient /** * \brief Start Color * * The start color that will be used for gradient creation */ const std::string connectomicsRenderingEdgeGradientStartColorName = "Connectomics.Rendering.Edges.Gradient.StartColor"; /** * \brief End Color * * The end color that will be used for gradient creation */ const std::string connectomicsRenderingEdgeGradientEndColorName = "Connectomics.Rendering.Edges.Gradient.EndColor"; /** * \brief Color parameter * * This parameter will be used to select the color of the edge. */ const std::string connectomicsRenderingEdgeGradientColorParameterName = "Connectomics.Rendering.Edges.Gradient.Parameter"; // Radius /** * \brief Start Radius * * The start radius that will be used */ const std::string connectomicsRenderingEdgeRadiusStartName = "Connectomics.Rendering.Edges.Radius.Start"; /** * \brief End Radius * * The end radius that will be used */ const std::string connectomicsRenderingEdgeRadiusEndName = "Connectomics.Rendering.Edges.Radius.End"; /** * \brief Radius parameter * * This parameter will be used to select the radius of the edge. */ const std::string connectomicsRenderingEdgeRadiusParameterName = "Connectomics.Rendering.Edges.Radius.Parameter"; // Possible parameters /** * \brief Using the weight as parameter */ const std::string connectomicsRenderingEdgeParameterWeight = "Weight"; /** * \brief Using the edge centrality as parameter */ const std::string connectomicsRenderingEdgeParameterCentrality = "Edge betweenness centrality"; /** * \brief Constant * * The edge property will be constant. */ const std::string connectomicsRenderingEdgeParameterConstant = "Constant"; // Default values const mitk::ColorProperty::Pointer connectomicsRenderingEdgeGradientStartColorDefault = mitk::ColorProperty::New(0.8f, 0.0f, 0.6f); const mitk::ColorProperty::Pointer connectomicsRenderingEdgeGradientEndColorDefault = mitk::ColorProperty::New(0.0f, 0.8f, 0.2f); const mitk::FloatProperty::Pointer connectomicsRenderingEdgeRadiusStartDefault = mitk::FloatProperty::New( 0.1 ); const mitk::FloatProperty::Pointer connectomicsRenderingEdgeRadiusEndDefault = mitk::FloatProperty::New( 0.4 ); + /** + * \brief Balloon controls and content + */ + const std::string connectomicsRenderingBalloonTextName = + "Connectomics.Rendering.Balloon.Text"; + const std::string connectomicsRenderingBalloonAllNodeLabelsName = + "Connectomics.Rendering.Balloon.AllNodeLabels"; + const std::string connectomicsRenderingBalloonNodeStatsName = + "Connectomics.Rendering.Balloon.NodeStats"; + } // namespace mitk #endif /* ConnectomicsRenderingProperties_H_HEADER_INCLUDED */ diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/Connectomics/QmitkConnectomicsStatisticsView.cpp b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/Connectomics/QmitkConnectomicsStatisticsView.cpp index e2bca2c134..785faeb591 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/Connectomics/QmitkConnectomicsStatisticsView.cpp +++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/Connectomics/QmitkConnectomicsStatisticsView.cpp @@ -1,192 +1,269 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. 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 includes ####### #include #include // ####### Qmitk includes ####### #include "QmitkConnectomicsStatisticsView.h" #include "QmitkStdMultiWidget.h" +//#include "QmitkRenderWindow.h"//? // ####### Qt includes ####### #include +#include // ####### ITK includes ####### #include // ####### MITK includes ####### +#include #include #include +#include +//#include //? +//#include //? // Includes for image casting between ITK and MITK #include "mitkImageCast.h" #include "mitkITKImageImport.h" #include "mitkImageAccessByItk.h" +// For msvc, to reenable alternative operator representations, which are dissabled as a msvc "extension" +// Also see: http://en.cppreference.com/w/cpp/language/operator_alternative +#include +#include + const std::string QmitkConnectomicsStatisticsView::VIEW_ID = "org.mitk.views.connectomicsstatistics"; QmitkConnectomicsStatisticsView::QmitkConnectomicsStatisticsView() : QmitkFunctionality() , m_Controls( nullptr ) , m_MultiWidget( nullptr ) , m_currentIndex( 0 ) { } QmitkConnectomicsStatisticsView::~QmitkConnectomicsStatisticsView() { } void QmitkConnectomicsStatisticsView::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::QmitkConnectomicsStatisticsViewControls; m_Controls-> setupUi( parent ); + connect( m_Controls-> networkBalloonsNodeLabelsComboBox, SIGNAL( currentIndexChanged( int ) ), + this, SLOT( OnNetworkBalloonsNodeLabelsComboBoxCurrentIndexChanged( int ) ) ); } this-> WipeDisplay(); } void QmitkConnectomicsStatisticsView::StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) { m_MultiWidget = &stdMultiWidget; } void QmitkConnectomicsStatisticsView::StdMultiWidgetNotAvailable() { m_MultiWidget = nullptr; } void QmitkConnectomicsStatisticsView::WipeDisplay() { m_Controls->lblWarning->setVisible( true ); m_Controls->inputImageOneNameLabel->setText( mitk::ConnectomicsConstantsManager::CONNECTOMICS_GUI_DASH ); m_Controls->inputImageOneNameLabel->setVisible( false ); m_Controls->inputImageOneLabel->setVisible( false ); m_Controls->networkStatisticsPlainTextEdit->clear(); m_Controls->betweennessNetworkHistogramCanvas->SetHistogram( nullptr ); m_Controls->degreeNetworkHistogramCanvas->SetHistogram( nullptr ); m_Controls->shortestPathNetworkHistogramCanvas->SetHistogram( nullptr ); m_Controls->betweennessNetworkHistogramCanvas->update(); m_Controls->degreeNetworkHistogramCanvas->update(); m_Controls->shortestPathNetworkHistogramCanvas->update(); m_Controls->betweennessNetworkHistogramCanvas->Clear(); m_Controls->degreeNetworkHistogramCanvas->Clear(); m_Controls->shortestPathNetworkHistogramCanvas->Clear(); m_Controls->betweennessNetworkHistogramCanvas->Replot(); m_Controls->degreeNetworkHistogramCanvas->Replot(); m_Controls->shortestPathNetworkHistogramCanvas->Replot(); + m_Controls-> networkBalloonsNodeLabelsComboBox-> QComboBox::clear(); + m_Controls-> networkBalloonsPlainTextEdit-> clear(); +} + +void QmitkConnectomicsStatisticsView::OnNetworkBalloonsNodeLabelsComboBoxCurrentIndexChanged( int currentIndex ) +{ + std::vector nodes = this-> GetDataManagerSelection(); + + if( nodes.size() != 1 ) { return; } + + mitk::DataNode::Pointer node = *nodes.begin(); + + if( node.IsNotNull() ) + { + mitk::ConnectomicsNetwork* network = + dynamic_cast< mitk::ConnectomicsNetwork* >( node-> GetData() ); + + if( network ) + { + std::string tempCurrentText = m_Controls-> networkBalloonsNodeLabelsComboBox-> + QComboBox::currentText().toStdString(); // get text of currently selected item. + + if( tempCurrentText.size() > 3 and tempCurrentText.rfind( ":" ) != tempCurrentText.npos ) + { // update chosenNode property. + tempCurrentText = tempCurrentText.substr( tempCurrentText.rfind( ":" ) + 2 ); + node-> SetProperty( mitk::connectomicsRenderingNodeChosenNodeName.c_str(), + mitk::StringProperty::New( tempCurrentText.c_str() ) ); + this-> m_MultiWidget-> ForceImmediateUpdate(); //RequestUpdate() is too slow. + } + + std::stringstream balloonTextStream; + node-> Update(); + + if( node-> GetProperty( mitk::connectomicsRenderingBalloonTextName.c_str() ) != nullptr and + node-> GetProperty( mitk::connectomicsRenderingBalloonNodeStatsName.c_str() ) != nullptr and + tempCurrentText != "-1" ) + { + balloonTextStream << node-> GetProperty( mitk::connectomicsRenderingBalloonTextName.c_str() ) + -> GetValueAsString() << std::endl + << node-> GetProperty( mitk::connectomicsRenderingBalloonNodeStatsName.c_str() ) + -> GetValueAsString() << std::endl; + QString balloonQString ( balloonTextStream.str().c_str() ); + // setPlainText() overwrites, insertPlainText() appends. + m_Controls-> networkBalloonsPlainTextEdit-> setPlainText( balloonQString.simplified() ); + } + if( tempCurrentText == "-1" ) + { + m_Controls-> networkBalloonsPlainTextEdit-> setPlainText( "" ); + } + } + } + return; } void QmitkConnectomicsStatisticsView::OnSelectionChanged( std::vector nodes ) { this->WipeDisplay(); // Valid options are either // 1 image (parcellation) // // 1 image (parcellation) // 1 fiber bundle // // 1 network if( nodes.size() > 2 ) { return; } bool currentFormatUnknown(true); // iterate all selected objects, adjust warning visibility for( std::vector::iterator it = nodes.begin(); it != nodes.end(); ++it ) { mitk::DataNode::Pointer node = *it; currentFormatUnknown = true; if( node.IsNotNull() ) { // network section mitk::ConnectomicsNetwork* network = dynamic_cast( node->GetData() ); if( network ) { currentFormatUnknown = false; if( nodes.size() != 1 ) { // only valid option is a single network this->WipeDisplay(); return; } m_Controls->lblWarning->setVisible( false ); m_Controls->inputImageOneNameLabel->setText(node->GetName().c_str()); m_Controls->inputImageOneNameLabel->setVisible( true ); m_Controls->inputImageOneLabel->setVisible( true ); { std::stringstream statisticsStream; mitk::ConnectomicsStatisticsCalculator::Pointer calculator = mitk::ConnectomicsStatisticsCalculator::New(); calculator->SetNetwork( network ); calculator->Update(); statisticsStream << "# Vertices: " << calculator->GetNumberOfVertices() << "\n"; statisticsStream << "# Edges: " << calculator->GetNumberOfEdges() << "\n"; statisticsStream << "Average Degree: " << calculator->GetAverageDegree() << "\n"; statisticsStream << "Density: " << calculator->GetConnectionDensity() << "\n"; statisticsStream << "Small Worldness: " << calculator->GetSmallWorldness() << "\n"; statisticsStream << "Average Path Length: " << calculator->GetAveragePathLength() << "\n"; statisticsStream << "Efficiency: " << (1 / calculator->GetAveragePathLength() ) << "\n"; statisticsStream << "# Connected Components: " << calculator->GetNumberOfConnectedComponents() << "\n"; statisticsStream << "Average Component Size: " << calculator->GetAverageComponentSize() << "\n"; statisticsStream << "Largest Component Size: " << calculator->GetLargestComponentSize() << "\n"; statisticsStream << "Average Clustering Coefficient: " << calculator->GetAverageClusteringCoefficientsC() << "\n"; statisticsStream << "Average Vertex Betweenness Centrality: " << calculator->GetAverageVertexBetweennessCentrality() << "\n"; statisticsStream << "Average Edge Betweenness Centrality: " << calculator->GetAverageEdgeBetweennessCentrality() << "\n"; statisticsStream << "# Isolated Points: " << calculator->GetNumberOfIsolatedPoints() << "\n"; statisticsStream << "# End Points: " << calculator->GetNumberOfEndPoints() << "\n"; statisticsStream << "Diameter: " << calculator->GetDiameter() << "\n"; statisticsStream << "Radius: " << calculator->GetRadius() << "\n"; statisticsStream << "Average Eccentricity: " << calculator->GetAverageEccentricity() << "\n"; statisticsStream << "# Central Points: " << calculator->GetNumberOfCentralPoints() << "\n"; QString statisticsString( statisticsStream.str().c_str() ); m_Controls-> networkStatisticsPlainTextEdit-> setPlainText( statisticsString ); } mitk::ConnectomicsNetwork::Pointer connectomicsNetwork( network ); mitk::ConnectomicsHistogramsContainer *histogramContainer = histogramCache[ connectomicsNetwork ]; if(histogramContainer) { m_Controls->betweennessNetworkHistogramCanvas->SetHistogram( histogramContainer->GetBetweennessHistogram() ); m_Controls->degreeNetworkHistogramCanvas->SetHistogram( histogramContainer->GetDegreeHistogram() ); m_Controls->shortestPathNetworkHistogramCanvas->SetHistogram( histogramContainer->GetShortestPathHistogram() ); m_Controls->betweennessNetworkHistogramCanvas->DrawProfiles(); m_Controls->degreeNetworkHistogramCanvas->DrawProfiles(); m_Controls->shortestPathNetworkHistogramCanvas->DrawProfiles(); } + + // For the balloon overlay: + if( node-> GetProperty( mitk::connectomicsRenderingBalloonAllNodeLabelsName.c_str() ) != nullptr ) + { // QComboBox with node label names and numbers. + QString allNodesLabel = node-> + GetProperty( mitk::connectomicsRenderingBalloonAllNodeLabelsName.c_str() )-> + GetValueAsString().c_str(); + QStringList allNodesLabelList = allNodesLabel.simplified().split( "," ); + allNodesLabelList.sort( Qt::CaseInsensitive ); + m_Controls-> networkBalloonsNodeLabelsComboBox-> QComboBox::addItem( "no node chosen: -1" ); + m_Controls-> networkBalloonsNodeLabelsComboBox-> QComboBox::addItems( allNodesLabelList ); + } } } // end network section if ( currentFormatUnknown ) { this->WipeDisplay(); return; } } // end for loop } diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/Connectomics/QmitkConnectomicsStatisticsView.h b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/Connectomics/QmitkConnectomicsStatisticsView.h index 03a4424b29..efa5dc2131 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/Connectomics/QmitkConnectomicsStatisticsView.h +++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/Connectomics/QmitkConnectomicsStatisticsView.h @@ -1,84 +1,87 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. 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 QmitkConnectomicsStatisticsView_h #define QmitkConnectomicsStatisticsView_h #include #include +#include #include "ui_QmitkConnectomicsStatisticsViewControls.h" #include "mitkConnectomicsHistogramCache.h" // ####### ITK includes ####### #include /*! \brief QmitkConnectomicsStatisticsView This view provides the statistics GUI. \sa QmitkFunctionality \ingroup Functionalities */ class QmitkConnectomicsStatisticsView : public QmitkFunctionality { // 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: static const std::string VIEW_ID; QmitkConnectomicsStatisticsView(); virtual ~QmitkConnectomicsStatisticsView(); virtual void CreateQtPartControl(QWidget *parent) override; virtual void StdMultiWidgetAvailable (QmitkStdMultiWidget &stdMultiWidget) override; virtual void StdMultiWidgetNotAvailable() override; protected slots: + void OnNetworkBalloonsNodeLabelsComboBoxCurrentIndexChanged( int ); + protected: // ####### Functions ####### /// \brief called by QmitkFunctionality when DataManager's selection has changed virtual void OnSelectionChanged( std::vector nodes ) override; /// \brief Wipe display and empty statistics void WipeDisplay(); // ####### Variables ####### Ui::QmitkConnectomicsStatisticsViewControls* m_Controls; QmitkStdMultiWidget* m_MultiWidget; /// Cache for histograms mitk::ConnectomicsHistogramCache histogramCache; // The selected synthetic network type int m_currentIndex; }; #endif // _QMITKBRAINNETWORKANALYSISVIEW_H_INCLUDED diff --git a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/Connectomics/QmitkConnectomicsStatisticsViewControls.ui b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/Connectomics/QmitkConnectomicsStatisticsViewControls.ui index b1ca9f733f..cdd1153042 100644 --- a/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/Connectomics/QmitkConnectomicsStatisticsViewControls.ui +++ b/Plugins/org.mitk.gui.qt.diffusionimaging/src/internal/Connectomics/QmitkConnectomicsStatisticsViewControls.ui @@ -1,153 +1,248 @@ QmitkConnectomicsStatisticsViewControls 0 0 557 1218 0 0 QmitkTemplate Data QLabel { color: rgb(255, 0, 0) } Please select data! Network: - Network Statistics QFormLayout::AllNonFixedFieldsGrow - + true + + + 0 + 0 + + true + + + + Informational Balloons. + + + + QFormLayout::AllNonFixedFieldsGrow + + + + + + 0 + 0 + + + + + Liberation Mono + 12 + + + + IBeamCursor + + + false + + + + + + + false + + + -1 + + + 12 + + + QComboBox::InsertAlphabetically + + + + + + + false + + + PointingHandCursor + + + Qt::RightToLeft + + + + + + true + + + false + + + + + + Histograms 0 0 50 150 50 150 50 150 Qt::Vertical 20 40 QmitkNetworkHistogramCanvas QWidget
internal/Connectomics/QmitkNetworkHistogramCanvas.h
1
- + + + networkBalloonsNodeLabelsComboBox + currentIndexChanged(int) + networkBalloonsNodeLabelsComboBox + setCurrentIndex(int) + + + 360 + 409 + + + 360 + 409 + + + +