HighlightSelectedPoints
VTKExamples/Cxx/Picking/HighlightSelectedPoints
Description¶
This example demonstrates how to select and highlight points using a rubber band. Press 'r' to enter selection mode. Selected points are shown in red. The ids of the selected points are output.
Code¶
HighlightSelectedPoints.cxx
#include <vtkActor.h> #include <vtkAreaPicker.h> #include <vtkDataSetMapper.h> #include <vtkDataSetSurfaceFilter.h> #include <vtkExtractGeometry.h> #include <vtkIdFilter.h> #include <vtkIdTypeArray.h> #include <vtkInteractorStyleRubberBandPick.h> #include <vtkNamedColors.h> #include <vtkObjectFactory.h> #include <vtkPlanes.h> #include <vtkPointData.h> #include <vtkPointSource.h> #include <vtkPolyData.h> #include <vtkPolyDataMapper.h> #include <vtkProperty.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkRenderer.h> #include <vtkRendererCollection.h> #include <vtkSmartPointer.h> #include <vtkUnstructuredGrid.h> #include <vtkVersion.h> #include <vtkVertexGlyphFilter.h> #if VTK_VERSION_NUMBER >= 89000000000ULL #define VTK890 1 #endif // Define interaction style class InteractorStyle : public vtkInteractorStyleRubberBandPick { public: static InteractorStyle* New(); vtkTypeMacro(InteractorStyle, vtkInteractorStyleRubberBandPick); InteractorStyle() { this->SelectedMapper = vtkSmartPointer<vtkDataSetMapper>::New(); this->SelectedActor = vtkSmartPointer<vtkActor>::New(); this->SelectedActor->SetMapper(SelectedMapper); } virtual void OnLeftButtonUp() override { auto colors = vtkSmartPointer<vtkNamedColors>::New(); // Forward events vtkInteractorStyleRubberBandPick::OnLeftButtonUp(); vtkPlanes* frustum = static_cast<vtkAreaPicker*>(this->GetInteractor()->GetPicker()) ->GetFrustum(); auto extractGeometry = vtkSmartPointer<vtkExtractGeometry>::New(); extractGeometry->SetImplicitFunction(frustum); extractGeometry->SetInputData(this->Points); extractGeometry->Update(); auto glyphFilter = vtkSmartPointer<vtkVertexGlyphFilter>::New(); glyphFilter->SetInputConnection(extractGeometry->GetOutputPort()); glyphFilter->Update(); vtkPolyData* selected = glyphFilter->GetOutput(); std::cout << "Selected " << selected->GetNumberOfPoints() << " points." << std::endl; std::cout << "Selected " << selected->GetNumberOfCells() << " cells." << std::endl; this->SelectedMapper->SetInputData(selected); this->SelectedMapper->ScalarVisibilityOff(); vtkIdTypeArray* ids = dynamic_cast<vtkIdTypeArray*>( 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( colors->GetColor3d("Red").GetData()); this->SelectedActor->GetProperty()->SetPointSize(3); this->CurrentRenderer->AddActor(SelectedActor); this->GetInteractor()->GetRenderWindow()->Render(); this->HighlightProp(NULL); } void SetPoints(vtkSmartPointer<vtkPolyData> points) { this->Points = points; } private: vtkSmartPointer<vtkPolyData> Points; vtkSmartPointer<vtkActor> SelectedActor; vtkSmartPointer<vtkDataSetMapper> SelectedMapper; }; vtkStandardNewMacro(InteractorStyle); int main(int, char*[]) { auto colors = vtkSmartPointer<vtkNamedColors>::New(); auto pointSource = vtkSmartPointer<vtkPointSource>::New(); pointSource->SetNumberOfPoints(20); pointSource->Update(); auto idFilter = vtkSmartPointer<vtkIdFilter>::New(); idFilter->SetInputConnection(pointSource->GetOutputPort()); #if VTK890 idFilter->SetCellIdsArrayName("OriginalIds"); idFilter->SetPointIdsArrayName("OriginalIds"); #else idFilter->SetIdsArrayName("OriginalIds"); #endif idFilter->Update(); auto surfaceFilter = vtkSmartPointer<vtkDataSetSurfaceFilter>::New(); surfaceFilter->SetInputConnection(idFilter->GetOutputPort()); surfaceFilter->Update(); vtkPolyData* input = surfaceFilter->GetOutput(); // Create a mapper and actor auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputData(input); mapper->ScalarVisibilityOff(); auto actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); // Visualize auto renderer = vtkSmartPointer<vtkRenderer>::New(); auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); renderWindow->AddRenderer(renderer); auto areaPicker = vtkSmartPointer<vtkAreaPicker>::New(); auto renderWindowInteractor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); renderWindowInteractor->SetPicker(areaPicker); renderWindowInteractor->SetRenderWindow(renderWindow); renderer->AddActor(actor); renderer->SetBackground(colors->GetColor3d("Black").GetData()); renderWindow->Render(); auto style = vtkSmartPointer<InteractorStyle>::New(); style->SetPoints(input); renderWindowInteractor->SetInteractorStyle(style); renderWindowInteractor->Start(); return EXIT_SUCCESS; }
CMakeLists.txt¶
cmake_minimum_required(VERSION 3.3 FATAL_ERROR) project(HighlightSelectedPoints) find_package(VTK COMPONENTS vtkCommonColor vtkCommonCore vtkCommonDataModel vtkFiltersCore vtkFiltersExtraction vtkFiltersGeneral vtkFiltersGeometry vtkFiltersSources vtkInteractionStyle vtkRenderingContextOpenGL2 vtkRenderingCore vtkRenderingFreeType vtkRenderingGL2PSOpenGL2 vtkRenderingOpenGL2 QUIET) if (NOT VTK_FOUND) message("Skipping HighlightSelectedPoints: ${VTK_NOT_FOUND_MESSAGE}") return () endif() message (STATUS "VTK_VERSION: ${VTK_VERSION}") if (VTK_VERSION VERSION_LESS "8.90.0") # old system include(${VTK_USE_FILE}) add_executable(HighlightSelectedPoints MACOSX_BUNDLE HighlightSelectedPoints.cxx ) target_link_libraries(HighlightSelectedPoints PRIVATE ${VTK_LIBRARIES}) else () # include all components add_executable(HighlightSelectedPoints MACOSX_BUNDLE HighlightSelectedPoints.cxx ) target_link_libraries(HighlightSelectedPoints PRIVATE ${VTK_LIBRARIES}) # vtk_module_autoinit is needed vtk_module_autoinit( TARGETS HighlightSelectedPoints MODULES ${VTK_LIBRARIES} ) endif ()
Download and Build HighlightSelectedPoints¶
Click here to download HighlightSelectedPoints and its CMakeLists.txt file. Once the tarball HighlightSelectedPoints.tar has been downloaded and extracted,
cd HighlightSelectedPoints/build
If VTK is installed:
cmake ..
If VTK is not installed but compiled on your system, you will need to specify the path to your VTK build:
cmake -DVTK_DIR:PATH=/home/me/vtk_build ..
Build the project:
make
and run it:
./HighlightSelectedPoints
WINDOWS USERS
Be sure to add the VTK bin directory to your path. This will resolve the VTK dll's at run time.