[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