]> Creatis software - creaVtk.git/commitdiff
#3513 CleanMeshWithPatch
authorEduardo DAVILA <davila@creatis.insa-lyon.fr>
Tue, 4 Jul 2023 14:10:10 +0000 (16:10 +0200)
committerEduardo DAVILA <davila@creatis.insa-lyon.fr>
Tue, 4 Jul 2023 14:10:10 +0000 (16:10 +0200)
bbtk_creaVtk_PKG/src/bbcreaVtkCleanMeshWithPatch.cxx
bbtk_creaVtk_PKG/src/bbcreaVtkCleanMeshWithPatch.h
bbtk_creaVtk_PKG/src/bbcreaVtkMeshReduction_DecimatePro.cxx

index f7171091cddf2d048f624819c87e46b5784e4f57..222c00eeb9f467e237590e8ee09718ae368d9684 100644 (file)
 #include <vtkCellData.h>
 #include <vtkFillHolesFilter.h>
 #include <vtkPolyDataNormals.h>
+#include <vtkIdFilter.h>
+#include <vtkFeatureEdges.h>
+#include <vtkCleanPolyData.h>
+#include <vtkTriangleFilter.h>
+#include <vtkStripper.h>
+#include <vtkTriangleStrip.h>
+#include <vtkRuledSurfaceFilter.h>
+
 
 
 // #include <vtkImprintFilter.h>
@@ -46,6 +54,7 @@ void CleanMeshWithPatch::Process()
     std::vector<int>    lstIndexs   = bbGetInputLstIndexs();
     if (( lstIndexs.size()>=3 ) && (bbGetInputMesh()!=NULL) ) {
         
+        
         // Step 1. ----Get perimeter CtrlPoints-----
         std::vector<double> lstX        = bbGetInputLstX();
         std::vector<double> lstY        = bbGetInputLstY();
@@ -175,35 +184,213 @@ void CleanMeshWithPatch::Process()
         // Step 5.  -- Connectivity Filter
         vtkPolyDataConnectivityFilter *connectivity = vtkPolyDataConnectivityFilter::New();
         connectivity->SetInputData( bbGetInputMesh() );
-        connectivity->SetExtractionModeToCellSeededRegions();
-        connectivity->InitializeSeedList();
-        connectivity->AddSeed(0);
         connectivity->SetScalarConnectivity(true);
+
+        // just perimeter mesh
+//        connectivity->SetExtractionModeToPointSeededRegions();
+//        connectivity->InitializeSeedList();
+//        connectivity->AddSeed( lstIdsGeodesicPerimter[0] );
+//        connectivity->SetScalarRange(90,110);
+//        connectivity->SetFullScalarConnectivity(false);
+
+        //connectivity->SetExtractionModeToCellSeededRegions();
+        //connectivity->InitializeSeedList();
+        //connectivity->AddSeed(0);
+        //connectivity->SetScalarRange(10,20);
+        //connectivity->SetFullScalarConnectivity(true);
+
+        //connectivity->SetExtractionModeToPointSeededRegions();
+        //connectivity->InitializeSeedList();
+        //connectivity->AddSeed(0);
+        //connectivity->SetScalarRange(10,20);
+        //connectivity->SetFullScalarConnectivity(true);
+
+        // OK
+
+        connectivity->SetExtractionModeToLargestRegion();
         connectivity->SetScalarRange(10,20);
         connectivity->SetFullScalarConnectivity(true);
+
+        
         connectivity->Update();
 //        bbSetOutputOut( connectivity->GetOutput() );
 
+        printf("EED CleanMeshWithPatch::Process   connectivity GetNumberOfPoints  %ld \n   ", connectivity->GetOutput()->GetNumberOfPoints() );
+
+/*
+        vtkAppendPolyData* append3 = vtkAppendPolyData::New();
+        append3->AddInputData( connectivity->GetOutput()  );
+        append3->AddInputData( bbGetInputPatch()  );
+        append3->Update();
+
+        vtkStripper *stripper = vtkStripper::New();
+        stripper->SetInputData( append3->GetOutput() );
+        stripper->Update();
+        bbSetOutputOut( stripper->GetOutput() );
+*/
+        
+/*
+        vtkFeatureEdges *edges1 = vtkFeatureEdges::New();
+        edges1->SetInputData( connectivity->GetOutput() );
+        edges1->BoundaryEdgesOn();
+        edges1->ManifoldEdgesOff();
+        edges1->NonManifoldEdgesOff();
+        edges1->FeatureEdgesOff();
+        edges1->Update();
+//        bbSetOutputOut( edges1->GetOutput() );
+
+        vtkFeatureEdges *edges2 = vtkFeatureEdges::New();
+        edges2->SetInputData( bbGetInputPatch() );
+        edges2->BoundaryEdgesOn();
+        edges2->ManifoldEdgesOff();
+        edges2->NonManifoldEdgesOff();
+        edges2->FeatureEdgesOff();
+        edges2->Update();
+//        bbSetOutputOut( edges1->GetOutput() );
+
+        vtkAppendPolyData* append3 = vtkAppendPolyData::New();
+        append3->AddInputData( edges1->GetOutput()  );
+        append3->AddInputData( edges2->GetOutput()  );
+        append3->Update();
+//        bbSetOutputOut( append3->GetOutput() );
+        vtkRuledSurfaceFilter *ruledSurfaceFilter = vtkRuledSurfaceFilter::New();
+        ruledSurfaceFilter->SetInputData( append3->GetOutput() );
+        ruledSurfaceFilter->Update();
+        bbSetOutputOut( ruledSurfaceFilter->GetOutput() );
+
+ */
+        
+        
+        // ok
+//        bbSetOutputOut( connectivity->GetOutput() );
+
         
+        vtkCleanPolyData *connectivityClean = vtkCleanPolyData::New();
+        connectivityClean->SetInputData( connectivity->GetOutput() );
+        connectivityClean->Update();
+        
+        //step 6.1.  -- connect both meshes     Patch->ConnectivityClean    --
+        Stretch( connectivityClean->GetOutput() , bbGetInputPatch() );
+        //step 6.2.  -- connect both meshes     ConnectivityClean->Patch    --
+        Stretch(  bbGetInputPatch(), connectivityClean->GetOutput()  );
+
+     /*
+        //step 6.1.  -- connect both meshes     Patch->ConnectivityClean    --
+        vtkIdFilter *idFilter = vtkIdFilter::New();
+        idFilter->SetInputData( bbGetInputPatch() );
+        //idFilter->SetIdsArrayName("ids");
+        //idFilter->SetCellIdsArrayName("ids");
+        idFilter->SetPointIdsArrayName("ids");
+        idFilter->SetPointIds(true);
+        idFilter->SetCellIds(false);
+//# Available for vtk>=8.3:
+//           #idFilter.SetPointIdsArrayName(arrayName)
+//           #idFilter.SetCellIdsArrayName(arrayName)
+        idFilter->Update();
+        vtkFeatureEdges *edges = vtkFeatureEdges::New();
+        edges->SetInputData( idFilter->GetOutput() );
+        edges->BoundaryEdgesOn();
+        edges->ManifoldEdgesOff();
+        edges->NonManifoldEdgesOff();
+        edges->FeatureEdgesOff();
+        edges->Update();
+        vtkIdTypeArray* arrayIds = vtkIdTypeArray::SafeDownCast(edges->GetOutput()->GetPointData()->GetArray("ids"));
+        long int iIds,sizeArrayIds    = edges->GetOutput()->GetNumberOfPoints();
+printf("\n EED CleanMeshWithPatch::Process  sizeArrayIds=%ld \n", sizeArrayIds);
+        
+        
+        vtkPolyData             *newMesh        = connectivityClean->GetOutput();
+        vtkStaticPointLocator   *pointLocator2  = vtkStaticPointLocator::New();
+        pointLocator2->SetDataSet( newMesh );
+        pointLocator2->BuildLocator();
+        vtkPoints *pointsPatch    = bbGetInputPatch()->GetPoints();
+        vtkPoints *pointsNewMesh  = newMesh->GetPoints();
+        double pP[3], pPP[3];
+        long int idNewMesh;
+        for (iIds=0; iIds<sizeArrayIds ; iIds++ )
+        {
+            pointsPatch->GetPoint( arrayIds->GetValue(iIds) , pP );
+            idNewMesh = pointLocator2->FindClosestPoint(pP);
+            pointsNewMesh->GetPoint( idNewMesh , pPP );
+            pointsPatch->SetPoint( arrayIds->GetValue(iIds) , pPP );
+ printf(" iIds=%ld   pP=%f %f %f     idNewMesh=%ld   pPP=%f %f %f \n", arrayIds->GetValue(iIds) , pP[0], pP[1], pP[2], idNewMesh, pPP[0], pPP[1], pPP[2]  );
+        } // for iIds
+        bbGetInputPatch()->Modified();
+
+        //step 6.2.  -- connect both meshes     ConnectivityClean->Patch    --
+        vtkIdFilter *idFilter2 = vtkIdFilter::New();
+        idFilter2->SetInputData( newMesh );
+        //idFilter->SetIdsArrayName("ids");
+        //idFilter->SetCellIdsArrayName("ids");
+        idFilter2->SetPointIdsArrayName("ids");
+        idFilter2->SetPointIds(true);
+        idFilter2->SetCellIds(false);
+//# Available for vtk>=8.3:
+//           #idFilter.SetPointIdsArrayName(arrayName)
+//           #idFilter.SetCellIdsArrayName(arrayName)
+        idFilter2->Update();
+        vtkFeatureEdges *edges2 = vtkFeatureEdges::New();
+        edges2->SetInputData( idFilter2->GetOutput() );
+        edges2->BoundaryEdgesOn();
+        edges2->ManifoldEdgesOff();
+        edges2->NonManifoldEdgesOff();
+        edges2->FeatureEdgesOff();
+        edges2->Update();
+        vtkIdTypeArray* arrayIds2 = vtkIdTypeArray::SafeDownCast(edges2->GetOutput()->GetPointData()->GetArray("ids"));
+        long int iIds2,sizeArrayIds2    = edges2->GetOutput()->GetNumberOfPoints();
+printf("\n EED CleanMeshWithPatch::Process  sizeArrayIds2=%ld \n", sizeArrayIds2);
+//        vtkPolyData             *newMesh        = connectivityClean->GetOutput();
+        vtkStaticPointLocator   *pointLocator3  = vtkStaticPointLocator::New();
+        pointLocator3->SetDataSet( bbGetInputPatch() );
+        pointLocator3->BuildLocator();
+        vtkPoints *pointsNewMesh2   = newMesh->GetPoints();
+        vtkPoints *pointsPatch2     = bbGetInputPatch()->GetPoints();
+        double pP2[3], pPP2[3];
+        long int idPatch;
+        for (iIds2=0; iIds2<sizeArrayIds2 ; iIds2++ )
+        {
+            pointsNewMesh2->GetPoint( arrayIds2->GetValue(iIds2) , pP2 );
+            idPatch = pointLocator3->FindClosestPoint(pP2);
+            pointsPatch2->GetPoint( idPatch , pPP2 );
+            pointsNewMesh2->SetPoint( arrayIds2->GetValue(iIds) , pPP2 );
+ printf(" iIds=%ld   pP=%f %f %f     idNewMesh=%ld   pPP=%f %f %f \n", arrayIds2->GetValue(iIds) , pP2[0], pP2[1], pP2[2], idPatch, pPP2[0], pPP2[1], pPP2[2]  );
+        } // for iIds
+        newMesh->Modified();
+*/
+        
+        
+        // step 7. -- Append meshes--
         vtkAppendPolyData* append2 = vtkAppendPolyData::New();
-        append2->AddInputData( connectivity->GetOutput()  );
+        append2->AddInputData( connectivityClean->GetOutput()  );
         append2->AddInputData( bbGetInputPatch()  );
         append2->Update();
 
+        vtkCleanPolyData *append2Clean = vtkCleanPolyData::New();
+        append2Clean->SetInputData( append2->GetOutput() );
+        append2Clean->Update();
         
+//        vtkTriangleFilter *triangles = vtkTriangleFilter::New();
+//        triangles->SetInputData( append2Clean->GetOutput() );
+//        triangles->Update();
+//        bbSetOutputOut( triangles->GetOutput() );
+
+        
+        //step 8.  -- Clean  --
+
         vtkPolyDataNormals *normals =vtkPolyDataNormals::New();
-        normals->SetInputConnection( append2->GetOutputPort() );
+  //      normals->SetInputConnection( triangles->GetOutputPort() );
+       normals->SetInputConnection( append2Clean->GetOutputPort() );
         normals->ConsistencyOn();
         normals->SplittingOff();
         normals->Update();
-        bbSetOutputOut( normals->GetOutput() );
+       bbSetOutputOut( normals->GetOutput() );
 
 //        vtkFillHolesFilter *fillHoles = vtkFillHolesFilter::New();
 //        fillHoles->SetInputData( normals->GetOutput() );
 //        fillHoles->SetHoleSize(1000);
 //        fillHoles->Update();
 //        bbSetOutputOut( fillHoles->GetOutput() );
-
+        
         
         /*
         // Step 4. -- vtkImprintFilter ---
@@ -231,9 +418,59 @@ void CleanMeshWithPatch::Process()
          bbSetOutputOut( imp->GetOutput() );
 */
         
+    } else {
+        bbSetOutputOut( NULL );
     } // if LstIndexs size >=3
+        
+}
+
+
+
+void CleanMeshWithPatch::Stretch(vtkPolyData *newMesh, vtkPolyData *patchMesh)
+{
+    
+    vtkIdFilter *idFilter = vtkIdFilter::New();
+    idFilter->SetInputData( patchMesh );
+    //idFilter->SetIdsArrayName("ids");
+    //idFilter->SetCellIdsArrayName("ids");
+    idFilter->SetPointIdsArrayName("ids");
+    idFilter->SetPointIds(true);
+    idFilter->SetCellIds(false);
+//# Available for vtk>=8.3:
+//           #idFilter.SetPointIdsArrayName(arrayName)
+//           #idFilter.SetCellIdsArrayName(arrayName)
+    idFilter->Update();
+    vtkFeatureEdges *edges = vtkFeatureEdges::New();
+    edges->SetInputData( idFilter->GetOutput() );
+    edges->BoundaryEdgesOn();
+    edges->ManifoldEdgesOff();
+    edges->NonManifoldEdgesOff();
+    edges->FeatureEdgesOff();
+    edges->Update();
+    vtkIdTypeArray* arrayIds = vtkIdTypeArray::SafeDownCast(edges->GetOutput()->GetPointData()->GetArray("ids"));
+    long int iIds,sizeArrayIds    = edges->GetOutput()->GetNumberOfPoints();
+    
+    
+//    vtkPolyData             *newMesh        = connectivityClean->GetOutput();
+    vtkStaticPointLocator   *pointLocator2  = vtkStaticPointLocator::New();
+    pointLocator2->SetDataSet( newMesh );
+    pointLocator2->BuildLocator();
+    vtkPoints *pointsPatch    = patchMesh->GetPoints();
+    vtkPoints *pointsNewMesh  = newMesh->GetPoints();
+    double pP[3], pPP[3];
+    long int idNewMesh;
+    for (iIds=0; iIds<sizeArrayIds ; iIds++ )
+    {
+        pointsPatch->GetPoint( arrayIds->GetValue(iIds) , pP );
+        idNewMesh = pointLocator2->FindClosestPoint(pP);
+        pointsNewMesh->GetPoint( idNewMesh , pPP );
+        pointsPatch->SetPoint( arrayIds->GetValue(iIds) , pPP );
+    } // for iIds
+    patchMesh->Modified();
 }
 
+
+
 //===== 
 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
 //===== 
index e56ce6f7538fbf8645b03d8f201e6aea3d7bdddf..ef2204901fb589ad0004a9ff9c19fc606371d80d 100644 (file)
@@ -31,6 +31,9 @@ class bbcreaVtk_EXPORT CleanMeshWithPatch
     BBTK_DECLARE_OUTPUT(Out,vtkPolyData*);
     BBTK_PROCESS(Process);
   void Process();
+    
+  void Stretch(vtkPolyData *newMesh, vtkPolyData *patchMesh);
+
 //===== 
 // Before editing this file, make sure it's a file of your own (i.e.: it wasn't generated from xml description; if so : your modifications will be lost)
 //===== 
index 6c44e15d1769031b9c55e286195b35dd4232cd22..5dc340e9335d81c80b4fe81ac414dc7dcd616b20 100644 (file)
@@ -33,7 +33,9 @@ void MeshReduction_DecimatePro::Process()
                firsttime       = false;
                decimatepro = vtkDecimatePro::New();
        }
-    
+
+    printf("EED MeshReduction_DecimatePro::DoProcess  %s    %p \n", bbGetFullName().c_str(), bbGetInputIn() );
+
     if (bbGetInputIn()!=NULL)
     {
         decimatepro->SetInputData( bbGetInputIn() );