VTK/Examples/Cxx/Picking/HighlightSelection
From KitwarePublic
This example demonstrates how to select and highlight cells using a rubber band. Press 'r' to enter selection mode.
HighlightSelection.cxx
#include <vtkVersion.h> #include <vtkSmartPointer.h> #include <vtkPointData.h> #include <vtkIdTypeArray.h> #include <vtkDataSetSurfaceFilter.h> #include <vtkRendererCollection.h> #include <vtkProperty.h> #include <vtkPlanes.h> #include <vtkObjectFactory.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderWindow.h> #include <vtkRenderer.h> #include <vtkRenderWindowInteractor.h> #include <vtkPolyData.h> #include <vtkSphereSource.h> #include <vtkInteractorStyleRubberBandPick.h> #include <vtkAreaPicker.h> #include <vtkExtractPolyDataGeometry.h> #include <vtkDataSetMapper.h> #include <vtkUnstructuredGrid.h> #include <vtkVertexGlyphFilter.h> #include <vtkIdFilter.h> #define VTKISRBP_ORIENT 0 #define VTKISRBP_SELECT 1 // Define interaction style class HighlightInteractorStyle : public vtkInteractorStyleRubberBandPick { public: static HighlightInteractorStyle* New(); vtkTypeMacro(HighlightInteractorStyle,vtkInteractorStyleRubberBandPick); HighlightInteractorStyle() : vtkInteractorStyleRubberBandPick() { this->SelectedMapper = vtkSmartPointer<vtkDataSetMapper>::New(); this->SelectedActor = vtkSmartPointer<vtkActor>::New(); this->SelectedActor->SetMapper(SelectedMapper); } virtual void OnLeftButtonUp() { // Forward events vtkInteractorStyleRubberBandPick::OnLeftButtonUp(); if(this->CurrentMode == VTKISRBP_SELECT) { vtkPlanes* frustum = static_cast<vtkAreaPicker*>(this->GetInteractor()->GetPicker())->GetFrustum(); vtkSmartPointer<vtkExtractPolyDataGeometry> extractPolyDataGeometry = vtkSmartPointer<vtkExtractPolyDataGeometry>::New(); extractPolyDataGeometry->SetImplicitFunction(frustum); #if VTK_MAJOR_VERSION <= 5 extractPolyDataGeometry->SetInputConnection( this->PolyData->GetProducerPort()); #else extractPolyDataGeometry->SetInputData(this->PolyData); #endif extractPolyDataGeometry->Update(); vtkSmartPointer<vtkVertexGlyphFilter> glyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New(); glyphFilter->SetInputConnection(extractPolyDataGeometry->GetOutputPort()); glyphFilter->Update(); vtkPolyData* selected = glyphFilter->GetOutput(); std::cout << "Selected " << selected->GetNumberOfPoints() << " points." << std::endl; std::cout << "Selected " << selected->GetNumberOfCells() << " cells." << std::endl; #if VTK_MAJOR_VERSION <= 5 this->SelectedMapper->SetInputConnection( selected->GetProducerPort()); #else this->SelectedMapper->SetInputData(selected); #endif this->SelectedMapper->ScalarVisibilityOff(); vtkIdTypeArray* ids = vtkIdTypeArray::SafeDownCast(selected->GetPointData()->GetArray("OriginalIds")); for(vtkIdType i = 0; i < ids->GetNumberOfTuples(); i++) { std::cout << "Id " << i << " : " << ids->GetValue(i) << std::endl; } this->SelectedActor->GetProperty()->SetColor(1.0, 0.0, 0.0); //(R,G,B) this->SelectedActor->GetProperty()->SetPointSize(5); this->GetInteractor()->GetRenderWindow()->GetRenderers()->GetFirstRenderer()->AddActor(SelectedActor); this->GetInteractor()->GetRenderWindow()->Render(); this->HighlightProp(NULL); } } void SetPolyData(vtkSmartPointer<vtkPolyData> polyData) {this->PolyData = polyData;} private: vtkSmartPointer<vtkPolyData> PolyData; vtkSmartPointer<vtkActor> SelectedActor; vtkSmartPointer<vtkDataSetMapper> SelectedMapper; }; vtkStandardNewMacro(HighlightInteractorStyle); int main (int, char *[]) { vtkSmartPointer<vtkSphereSource> sphereSource = vtkSmartPointer<vtkSphereSource>::New(); sphereSource->Update(); vtkSmartPointer<vtkIdFilter> idFilter = vtkSmartPointer<vtkIdFilter>::New(); idFilter->SetInputConnection(sphereSource->GetOutputPort()); idFilter->SetIdsArrayName("OriginalIds"); idFilter->Update(); // This is needed to convert the ouput of vtkIdFilter (vtkDataSet) back to vtkPolyData vtkSmartPointer<vtkDataSetSurfaceFilter> surfaceFilter = vtkSmartPointer<vtkDataSetSurfaceFilter>::New(); surfaceFilter->SetInputConnection(idFilter->GetOutputPort()); surfaceFilter->Update(); vtkPolyData* input = surfaceFilter->GetOutput(); // Create a mapper and actor vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(sphereSource->GetOutputPort()); mapper->ScalarVisibilityOff(); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); actor->GetProperty()->SetPointSize(5); // Visualize vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); vtkSmartPointer<vtkAreaPicker> areaPicker = vtkSmartPointer<vtkAreaPicker>::New(); vtkSmartPointer<vtkRenderWindowInteractor> renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); renderWindowInteractor->SetPicker(areaPicker); renderWindowInteractor->SetRenderWindow(renderWindow); renderer->AddActor(actor); //renderer->SetBackground(1,1,1); // Background color white renderWindow->Render(); vtkSmartPointer<HighlightInteractorStyle> style = vtkSmartPointer<HighlightInteractorStyle>::New(); style->SetPolyData(input); renderWindowInteractor->SetInteractorStyle( style ); renderWindowInteractor->Start(); return EXIT_SUCCESS; }
CMakeLists.txt
cmake_minimum_required(VERSION 2.8) PROJECT(HighlightSelection) find_package(VTK REQUIRED) include(${VTK_USE_FILE}) if (APPLE) add_executable(HighlightSelection MACOSX_BUNDLE HighlightSelection.cxx) else() add_executable(HighlightSelection HighlightSelection.cxx) endif() if(VTK_LIBRARIES) target_link_libraries(HighlightSelection ${VTK_LIBRARIES}) else() target_link_libraries(HighlightSelection vtkHybrid ) endif()
