[vtkusers] Re: Filling a hole
Goodwin Lawlor
goodwin.lawlor at ucd.ie
Thu Mar 16 06:11:30 EST 2006
Hi,
I've a class (vtkTesselateBoundaryLoops) that does pretty much the same
thing. Its here:
http://www.bioengineering-research.com/vtk/vtkTesselateBoundaryLoops.htm
hth
Goodwin
alex. gouaillard wrote:
> this code supposely close all "holes" on the surface by tracking them,
> creating a patch, patching, and deleting duplicated edges and points on
> the border of the "holes". I haven't tested it for .... ages, but it
> should be ok.
>
> beware: this is closing ALL holes. You might want to hack in to directly
> pass only the border you wanna fill. As you are cutting before, the
> boundary of your hole is planar, and everything should be ok.
>
>
> vtkPolyData *meshin = this->GetInput();
> vtkPolyData *meshout= this->GetOutput();
>
> int nombre;
>
> int pointsNumber;
>
>
> // detect holes
> vtkFeatureEdges *boundaryEdges = vtkFeatureEdges::New();
> boundaryEdges->SetInput(meshin);
> boundaryEdges->SetBoundaryEdges(1);//only border points
> boundaryEdges->SetFeatureEdges(0);
> boundaryEdges->SetNonManifoldEdges(0);
> boundaryEdges->SetManifoldEdges(0);
> boundaryEdges->Update();
>
>
> // "nombre" gives us the total number of border edges
>
>
> nombre = (boundaryEdges->GetOutput()->GetNumberOfLines());
> pointsNumber = nombre;
>
> vtkCleanPolyData *poly = vtkCleanPolyData::New();
> poly->SetInput(meshin);
> poly->Update();
>
>
> vtkPolyDataConnectivityFilter *region = vtkPolyDataConnectivityFilter::New();
> vtkAppendPolyData *meshAppend = vtkAppendPolyData::New();
> vtkStripper *bouchon = vtkStripper::New();
> vtkPolyData *bouchonPoly = vtkPolyData::New();
> vtkTriangleFilter *bouchontri = vtkTriangleFilter::New();
>
>
> meshAppend->AddInput(poly->GetOutput());
> meshAppend->AddInput(bouchontri->GetOutput());
>
>
> region->SetInput(boundaryEdges->GetOutput());
> region->SetExtractionMode(6);
>
>
> bouchon->SetInput(region->GetOutput());
>
> bouchontri->SetInput(bouchonPoly);
>
>
> poly->SetInput(meshAppend->GetOutput());
> poly->SetTolerance(0.0);
> poly->SetConvertLinesToPoints(0);
> poly->SetConvertPolysToLines(0);
> poly->SetConvertStripsToPolys(0);
>
>
> boundaryEdges->SetInput(poly->GetOutput());
>
>
> while (nombre != 0)
> {
>
> region->Update();
>
> // creating polygonal patches
> bouchon->Update();
>
> bouchonPoly->Initialize();
> bouchonPoly->SetPoints(bouchon->GetOutput()->GetPoints());
> bouchonPoly->SetPolys(bouchon->GetOutput()->GetLines());
> bouchonPoly->Update();
>
>
> // triangulate the polygonal patch
> bouchontri->Update();
>
> // patch (add the patch to the mesh)
> meshAppend->Update();
>
>
> // remove duplicated edges and points
> poly->Update();
>
>
> // update the number of border edges
> boundaryEdges->Update();
>
>
> nombre=((boundaryEdges->GetOutput())->GetNumberOfLines());
>
>
> this->UpdateProgress((pointsNumber - nombre) / pointsNumber);
>
>
> } // END while (nombre!=0)
>
>
> boundaryEdges->Delete();
> region->Delete();
> meshAppend->Delete();
> bouchon->Delete();
> bouchonPoly->Delete();
> bouchontri->Delete();
>
> meshout->DeepCopy(poly->GetOutput());
> poly->Delete();
>
> _______________________________________________
> This is the private VTK discussion list.
> Please keep messages on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>
More information about the vtkusers
mailing list