[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