[vtkusers] Problem in Converting Lines to vtkPolyLine

David Gobbi david.gobbi at gmail.com
Thu Jan 6 08:47:07 EST 2011


Hi Nicolas,

In my last email to you, I recommended the vtkStripper filter for
generating a polyline from line segments.  Did you try it?

Cheers,

   David


On Thu, Jan 6, 2011 at 3:30 AM, Nicolas Sarrasin
<nsarrasin at phenix-systems.com> wrote:
> Hi all,
> I'm trying to convert a set of line into one only vtkPolyLine. (original
> post here :
> http://vtk.1045678.n5.nabble.com/construct-a-vtkPolyLine-PolyGon-from-a-set-of-vtkLines-td3325716.html)
>
> I go through all the polylines of vtkPolyData->GetLines() and then get the
> associated points.
> For most of case it works well, but I'm actually encounter a problem on a
> case.
>
> The input polydata
> (http://img525.imageshack.us/img525/8370/vtkconvertioninit.png) is composed
> of two lines which trace an arc of circle.
> After the convertion, this arc is closed
> (http://img502.imageshack.us/img502/8773/vtkconvertionres.png).
> It comes from the second line which might not be correct.
>
> Can someone explain me what is going wrong ?
>
> Thanks by advance.
>
> Here is a c++ sample code with the input file attached (wire.vtp).
> ****
> #include <vtkSmartPointer.h>
> #include <vtkCellArray.h>
> #include <vtkPoints.h>
> #include <vtkPolyData.h>
> #include <vtkXMLPolyDataReader.h>
> #include <vtkXMLPolyDataWriter.h>
> #include <vtkPolyLine.h>#include <vtkSmartPointer.h>
> #include <vtkCellArray.h>
> #include <vtkPoints.h>
> #include <vtkPolyData.h>
> #include <vtkXMLPolyDataReader.h>
> #include <vtkXMLPolyDataWriter.h>
> #include <vtkPolyLine.h>
>
> int main (int argc, char *argv[])
> {
>     vtkSmartPointer<vtkXMLPolyDataReader> reader =
> vtkSmartPointer<vtkXMLPolyDataReader>::New();
>     reader->SetFileName("./wire.vtp");
>
>     vtkSmartPointer<vtkPolyData> init_data =
> vtkSmartPointer<vtkPolyData>::New();
>     init_data = reader->GetOutput();
>
>     vtkSmartPointer<vtkPoints> init_points =
> vtkSmartPointer<vtkPoints>::New();
>     init_points=init_data->GetPoints();
>
>     vtkSmartPointer<vtkCellArray> init_lineArray =
> vtkSmartPointer<vtkCellArray>::New();
>     init_lineArray = init_data->GetLines();
>
>     int nblines = init_lineArray->GetNumberOfCells();
>
>     vtkSmartPointer<vtkPolyData> new_data =
> vtkSmartPointer<vtkPolyData>::New();
>     vtkSmartPointer<vtkPoints> new_points =
> vtkSmartPointer<vtkPoints>::New();
>     vtkSmartPointer<vtkPolyLine> polyline =
> vtkSmartPointer<vtkPolyLine>::New();
>     vtkSmartPointer<vtkCellArray> new_lineArray =
> vtkSmartPointer<vtkCellArray>::New();
>
>     double coords[3];
>     vtkIdType nbpts=0, *pts=0;
>     for( init_lineArray->InitTraversal(); init_lineArray->GetNextCell(nbpts,
> pts);)
>     {
>         vtkIdType init_ind=0, new_ind=0;
>         for(int p=0; p<nbpts; p++)
>         {
>             init_ind=pts[p];
>             if(init_ind<0)
>                 continue;
>             init_points->GetPoint( init_ind, coords);
>
>             new_ind=new_points->InsertNextPoint(coords);
>             polyline->GetPointIds()->InsertNextId(new_ind);
>         }
>     }
>     new_lineArray->InsertNextCell(polyline);
>     new_data->SetPoints(new_points);
>     new_data->SetLines(new_lineArray);
>
>     vtkSmartPointer<vtkXMLPolyDataWriter> writer =
> vtkSmartPointer<vtkXMLPolyDataWriter>::New();
>     writer->SetFileName("./new_wire.vtp");
>     writer->SetInput(new_data);
>     writer->Write();
> ****
>



More information about the vtkusers mailing list