/*========================================================================= Program: Mailleur 3D multi-résolution (Creatis PFE 2001/2002) Module: vtkCloseMesh.cxx Language: C++ Date: 2002/05 Auteurs: Bertrand DELHAY =========================================================================*/ #include #include #include #include #include #include #include #include #include "vtkCloseMesh.h" //-------------------------------------------------------------------------- vtkCloseMesh* vtkCloseMesh::New() { // First try to create the object from the vtkObjectFactory vtkObject* ret = vtkObjectFactory::CreateInstance("vtkCloseMesh"); if(ret) { return (vtkCloseMesh*)ret; } // If the factory was unable to create the object, then create it here. return new vtkCloseMesh; } void vtkCloseMesh::Execute() // fonction principale { vtkPolyData *meshin = this->GetInput(); vtkPolyData *meshout= this->GetOutput(); int nombre; int pointsNumber; // détection d'une ouverture dans le maillage vtkFeatureEdges *boundaryEdges = vtkFeatureEdges::New(); boundaryEdges->SetInput(meshin); boundaryEdges->SetBoundaryEdges(1);//on veut seulement les points de bord boundaryEdges->SetFeatureEdges(0); boundaryEdges->SetNonManifoldEdges(0); boundaryEdges->SetManifoldEdges(0); boundaryEdges->Update(); // nombre permet de connaitre le nombre de cells qui sont sur la frontière d'un maillage 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(); // création de polygones "bouchons" fermant le maillage bouchon->Update(); bouchonPoly->Initialize(); bouchonPoly->SetPoints(bouchon->GetOutput()->GetPoints()); bouchonPoly->SetPolys(bouchon->GetOutput()->GetLines()); bouchonPoly->Update(); // triangule le polynome bouchon bouchontri->Update(); // ajoute le bouchon au maillage en cours meshAppend->Update(); // Nettoie les doublons dans le maillages cree poly->Update(); // verifie si il reste des bords 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(); } // END void