Skip to content


# IterateOverLines

VTKEx/Cxx/PolyData/IterateOverLines

### Description

(If anyone can explain why the commented section doesn't work the same as the uncommented section, or fix it, that would be great.)

Other languages

See (Python), (CSharp)

Question

If you have a simple question about this example contact us at VTKExProject If your question is more complex and may require extended discussion, please use the VTK Discourse Forum

### Code

IterateOverLines.cxx

    #include <vtkSmartPointer.h>
    #include <vtkLine.h>
    #include <vtkCellArray.h>
    #include <vtkPolyData.h>
    #include <vtkPoints.h>

    int main(int, char *[])
    {
      double origin[3] = {0.0, 0.0, 0.0};
      double p0[3] = {1.0, 0.0, 0.0};
      double p1[3] = {0.0, 1.0, 0.0};
      double p2[3] = {0.0, 1.0, 2.0};
      double p3[3] = {1.0, 2.0, 3.0};

      // Create a vtkPoints object and store the points in it
      vtkSmartPointer<vtkPoints> points =
        vtkSmartPointer<vtkPoints>::New();
      points->InsertNextPoint(origin);
      points->InsertNextPoint(p0);
      points->InsertNextPoint(p1);
      points->InsertNextPoint(p2);
      points->InsertNextPoint(p3);

      // Create a cell array to store the lines in and add the lines to it
      vtkSmartPointer<vtkCellArray> lines =
        vtkSmartPointer<vtkCellArray>::New();

      //Create four lines
      for(unsigned int i = 0; i < 4; i++)
      {
        vtkSmartPointer<vtkLine> line =
          vtkSmartPointer<vtkLine>::New();
        line->GetPointIds()->SetId(0,i);
        line->GetPointIds()->SetId(1,i+1);
        lines->InsertNextCell(line);
      }

      // Create a polydata to store everything in
      vtkSmartPointer<vtkPolyData> linesPolyData =
        vtkSmartPointer<vtkPolyData>::New();

      // Add the points to the dataset
      linesPolyData->SetPoints(points);

      // Add the lines to the dataset
      linesPolyData->SetLines(lines);

      std::cout << "There are " << linesPolyData->GetNumberOfLines() << " lines." << std::endl;

      linesPolyData->GetLines()->InitTraversal();
      vtkSmartPointer<vtkIdList> idList = vtkSmartPointer<vtkIdList>::New();
      while(linesPolyData->GetLines()->GetNextCell(idList))
      {
        std::cout << "Line has " << idList->GetNumberOfIds() << " points." << std::endl;

        for(vtkIdType pointId = 0; pointId < idList->GetNumberOfIds(); pointId++)
        {
          std::cout << idList->GetId(pointId) << " ";
        }
        std::cout << std::endl;
      }
      return EXIT_SUCCESS;
    }

### CMakeLists.txt

    cmake_minimum_required(VERSION 3.3 FATAL_ERROR)

    project(IterateOverLines)

    find_package(VTK COMPONENTS
      vtkvtkCommonCore
      vtkvtkCommonDataModel QUIET)
    if (NOT VTK_FOUND)
      message("Skipping IterateOverLines: ${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(IterateOverLines MACOSX_BUNDLE IterateOverLines.cxx )
      target_link_libraries(IterateOverLines PRIVATE ${VTK_LIBRARIES})
    else ()
      # include all components
      add_executable(IterateOverLines MACOSX_BUNDLE IterateOverLines.cxx )
      target_link_libraries(IterateOverLines PRIVATE ${VTK_LIBRARIES})
      # vtk_module_autoinit is needed
      vtk_module_autoinit(
        TARGETS IterateOverLines
        MODULES ${VTK_LIBRARIES}
        )
    endif ()

### Download and Build IterateOverLines

Click here to download IterateOverLines and its CMakeLists.txt file. Once the tarball IterateOverLines.tar has been downloaded and extracted,

    cd IterateOverLines/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:

    ./IterateOverLines

WINDOWS USERS

Be sure to add the VTK bin directory to your path. This will resolve the VTK dll's at run time.