2013-10-28 226 views
1

我有一个由边和顶点组成的图。当点击图中的一条边时,边应该改变颜色。我已经包含了一些代码示例来演示我的问题。更改边缘的颜色

绘制初始图形;

#include "StdAfx.h" 
#include <vtkSmartPointer.h> 
#include <vtkCallbackCommand.h> 
#include <vtkAnnotationLink.h> 
#include <vtkRenderedGraphRepresentation.h> 
#include <vtkRenderer.h> 
#include <vtkDoubleArray.h> 
#include <vtkSelectionNode.h> 
#include <vtkIdTypeArray.h> 
#include <vtkSelection.h> 
#include <vtkRenderWindow.h> 
#include <vtkUnsignedCharArray.h> 
#include <vtkObjectFactory.h> 
#include <vtkGraphLayoutStrategy.h> 
#include <vtkGraphLayoutView.h> 
#include <vtkGraphWriter.h> 
#include <vtkMutableUndirectedGraph.h> 
#include <vtkRenderWindowInteractor.h> 

#include <vtkIntArray.h> 
#include <vtkLookupTable.h> 
#include <vtkDataSetAttributes.h> 
#include <vtkViewTheme.h> 

void SelectionCallbackFunction(vtkObject* caller, long unsigned int eventId, void* clientData, void* callData); 
vtkSmartPointer<vtkMutableUndirectedGraph> g; 
int main(int, char *[]) 
{ 
    g = 
     vtkSmartPointer<vtkMutableUndirectedGraph>::New(); 

    vtkIdType v1 = g->AddVertex(); 
    vtkIdType v2 = g->AddVertex(); 

    g->AddEdge(v1, v2); 
    g->AddEdge(v1, v2); 


    vtkSmartPointer<vtkCallbackCommand> selectionCallback = 
     vtkSmartPointer<vtkCallbackCommand>::New(); 
    selectionCallback->SetCallback (SelectionCallbackFunction); 

    // Create the color array 
    vtkSmartPointer<vtkIntArray> edgeColors = 
     vtkSmartPointer<vtkIntArray>::New(); 
    edgeColors->SetNumberOfComponents(1); 
    edgeColors->SetName("Color"); 

    vtkSmartPointer<vtkLookupTable> lookupTable = 
     vtkSmartPointer<vtkLookupTable>::New(); 
    lookupTable->SetNumberOfTableValues(1); 
    lookupTable->SetTableValue(0, 1.0, 0.0, 0.0); // red 
    lookupTable->Build(); 

    edgeColors->InsertNextValue(0); 

    // Add the color array to the graph 
    g->GetEdgeData()->AddArray(edgeColors); 

    vtkSmartPointer<vtkGraphLayoutView> view = 
     vtkSmartPointer<vtkGraphLayoutView>::New(); 

    view->SetEdgeColorArrayName("Color"); 
    view->ColorEdgesOn(); 

    vtkSmartPointer<vtkViewTheme> theme = 
     vtkSmartPointer<vtkViewTheme>::New(); 
    theme->SetCellLookupTable(lookupTable); 

    view->ApplyViewTheme(theme); 

    view->AddRepresentationFromInput(g); 
    view->SetLayoutStrategy("Simple 2D"); 
    view->GetRepresentation()->GetAnnotationLink()->AddObserver("AnnotationChangedEvent", selectionCallback); 

    view->ResetCamera(); 
    view->Render(); 

    view->GetInteractor()->Start(); 

    return EXIT_SUCCESS; 
} 

对于鼠标点击功能,我使用了下面的代码;

vtkAnnotationLink* annotationLink = 
     static_cast<vtkAnnotationLink*>(caller); 

    vtkSelection* selection = annotationLink->GetCurrentSelection(); 
    vtkSelectionNode* edges; 

    if(selection->GetNode(0)->GetFieldType() == vtkSelectionNode::EDGE) 
    { 
     edges = selection->GetNode(0); 
    } 

    if(selection->GetNode(1)->GetFieldType() == vtkSelectionNode::EDGE) 
    { 
     edges = selection->GetNode(1); 
    } 

    vtkIdTypeArray* edgeList = vtkIdTypeArray::SafeDownCast(edges->GetSelectionList()); 
    for(vtkIdType i = 0; i < edgeList->GetNumberOfTuples(); i++) 
    { 
     //Change colour of the edge 
    } 

我的问题是,我不能动态地改变边缘的颜色。我将非常感谢有关此事的任何帮助。

+0

“dinamically”是什么意思?它应该在没有鼠标点击的情况下完成?或者你在点击和渲染结果之间有滞后?或者别的,也许? –

+0

是的,鼠标点击 – Madz

+1

好吧,对不起,我刚刚注意到上次循环中缺少的代码,请求已清除。不幸的是,我没有VTK图形对象的经验......但是你可以从代表图形的对象中调用类似GetProperty() - > SetEdgeColor()的东西吗?这应该是你想要的... –

回答

1

以下代码适用于我。首先,当我创建图形我设置的每一个边缘的颜色,

edgeColors = vtkSmartPointer<vtkIntArray>::New(); 
    edgeColors->SetNumberOfComponents(1); 
    edgeColors->SetName("Color"); 

    vtkSmartPointer<vtkLookupTable> lookupTable = 
     vtkSmartPointer<vtkLookupTable>::New(); 
    lookupTable->SetNumberOfTableValues(2); 
    lookupTable->SetTableValue(0, 0.5, 1.0, 0.5); // green 
    lookupTable->SetTableValue(1, 0.0, 1.0, 0.0); // white 

    lookupTable->Build(); 

    //For each edge id insert colour 
    for(int i = 0;i<=graph->GetNumberOfEdges();i++) 
     edgeColors->InsertValue(i,0); 


    // Add the color array to the graph 
    graph->GetEdgeData()->AddArray(edgeColors); 

然后在我的鼠标点击功能我得到的点击边缘的vtkIdType并设置它的颜色。

vtkIdType edge = edgeList->GetValue(0); 
    edgeColors->InsertValue(edge.Id,1);//set colour of edge 
    graphLayoutView->GetInteractor()->Render();