How to copy cell from a polydata and append to another polydata?

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

How to copy cell from a polydata and append to another polydata?

donyyo
Hi everyone,
I want to select some cells by their Ids and append to anoter polydata. I haven't find the example code. Is there any example I can follow?
Thank you!

dony
Reply | Threaded
Open this post in threaded view
|

Re: How to copy cell from a polydata and append to another polydata?

donyyo
I deal with it following http://www.itk.org/Wiki/VTK/Examples/Cxx/Broken/PolyData/DeleteCells. I don't know if it's the best way, but it works.

    // Import a polyData at first.

    vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    points = polyData->GetPoints();

    vtkSmartPointer<vtkIdList> cellPointIds = vtkSmartPointer<vtkIdList>::New();
    double cellPoint[3][3] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};

    vtkSmartPointer<vtkAppendPolyData> appendPolyData = vtkSmartPointer<vtkAppendPolyData>::New();
    for (vtkIdType ii = 0; ii < polyData->GetNumberOfCells(); ii++)
    {
        polyData->GetCellPoints(ii, cellPointIds);
        vtkSmartPointer<vtkPoints> cellPoints = vtkSmartPointer<vtkPoints>::New();
        for (vtkIdType jj = 0; jj < 3; jj++)
        {
            points->GetPoint(cellPointIds->GetId(jj), cellPoint[jj]);
            cellPoints->InsertNextPoint(cellPoint[jj]);
        }

        vtkSmartPointer<vtkLine> line0 = vtkSmartPointer<vtkLine>::New();
        line0->GetPointIds()->SetId(0, 0);
        line0->GetPointIds()->SetId(1, 1);
        vtkSmartPointer<vtkLine> line1 = vtkSmartPointer<vtkLine>::New();
        line1->GetPointIds()->SetId(0, 1);
        line1->GetPointIds()->SetId(1, 2);
        vtkSmartPointer<vtkLine> line2 = vtkSmartPointer<vtkLine>::New();
        line2->GetPointIds()->SetId(0, 2);
        line2->GetPointIds()->SetId(1, 0);

        vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();
        lines->InsertNextCell(line0);
        lines->InsertNextCell(line1);
        lines->InsertNextCell(line2);

        vtkSmartPointer<vtkPolyData> cellPolyData = vtkSmartPointer<vtkPolyData>::New();
        cellPolyData->SetPoints(cellPoints);
        cellPolyData->SetLines(lines);
        cellPolyData->BuildLinks();
        cellPolyData->Update();

        vtkSmartPointer<vtkStripper> cellStripper = vtkSmartPointer<vtkStripper>::New();
        cellStripper->SetInput(cellPolyData);
        cellStripper->Update();

        vtkSmartPointer<vtkCleanPolyData> cleanCellPolyData = vtkSmartPointer<vtkCleanPolyData>::New();
        cleanCellPolyData->SetInputConnection(cellStripper->GetOutputPort());
        cleanCellPolyData->SetTolerance(0.0);          // Specify tolerance in terms of fraction of bounding box length. If tolerance is specified precisely=0.0, then vtkCleanPolyData will use the vtkMergePoints object to merge points (which is faster). vtkMergePoints merge exactly coincident points.
        cleanCellPolyData->SetConvertLinesToPoints(0); // Turn on/off conversion of degenerate lines to points.
        cleanCellPolyData->SetConvertPolysToLines(0);  // Turn on/off conversion of degenerate polys to lines.
        cleanCellPolyData->SetConvertStripsToPolys(0); // Turn on/off conversion of degenerate strips to polys.
        cleanCellPolyData->Update();

        appendPolyData->AddInput(cleanCellPolyData->GetOutput());
        appendPolyData->Update();
    }

    vtkSmartPointer<vtkCleanPolyData> cleanPolyData = vtkSmartPointer<vtkCleanPolyData>::New();
    cleanPolyData->SetInputConnection(appendPolyData->GetOutputPort());
    cleanPolyData->SetTolerance(0.0);          // Specify tolerance in terms of fraction of bounding box length. If tolerance is specified precisely=0.0, then vtkCleanPolyData will use the vtkMergePoints object to merge points (which is faster). vtkMergePoints merge exactly coincident points.
    cleanPolyData->SetConvertLinesToPoints(0); // Turn on/off conversion of degenerate lines to points.
    cleanPolyData->SetConvertPolysToLines(0);  // Turn on/off conversion of degenerate polys to lines.
    cleanPolyData->SetConvertStripsToPolys(0); // Turn on/off conversion of degenerate strips to polys.
    cleanPolyData->Update();

    copyPolyData->ShallowCopy(cleanPolyData->GetOutput());
    copyPolyData->Update();