]> Creatis software - creaVtk.git/commitdiff
Clean code
authorEduardo DAVILA <davila@creatis.insa-lyon.fr>
Fri, 30 Jun 2023 15:52:24 +0000 (17:52 +0200)
committerEduardo DAVILA <davila@creatis.insa-lyon.fr>
Fri, 30 Jun 2023 15:52:24 +0000 (17:52 +0200)
bbtk_creaVtk_PKG/src/bbcreaVtkCleanMeshWithPatch.cxx

index 2cdb49b4c02ee2824f2f020b3a37319d70b03345..f7171091cddf2d048f624819c87e46b5784e4f57 100644 (file)
@@ -7,7 +7,17 @@
 #include <vtkAppendPolyData.h>
 #include <vtkStaticPointLocator.h>
 #include <vtkDijkstraGraphGeodesicPath.h>
-#include <vtkImprintFilter.h>
+#include <vtkIdList.h>
+#include <vtkCharArray.h>
+#include <vtkPolyDataConnectivityFilter.h>
+#include <vtkPointData.h>
+#include <vtkCellData.h>
+#include <vtkFillHolesFilter.h>
+#include <vtkPolyDataNormals.h>
+
+
+// #include <vtkImprintFilter.h>
+
 
 namespace bbcreaVtk
 {
@@ -33,7 +43,6 @@ void CleanMeshWithPatch::Process()
 //    bbSetOutputOut( bbGetInputIn() );
 //    std::cout << "Output value = " <<bbGetOutputOut() << std::endl;
   
-    printf("EED CleanMeshWithPatch::Process Start \n");
     std::vector<int>    lstIndexs   = bbGetInputLstIndexs();
     if (( lstIndexs.size()>=3 ) && (bbGetInputMesh()!=NULL) ) {
         
@@ -104,25 +113,24 @@ void CleanMeshWithPatch::Process()
         pointLocator->BuildLocator();
         long int id;
         size=perimeterX.size();
-        std::vector<long int> lstIds;
+        std::vector<long int> lstIdsCtrlPoints;
         for (i=0;i<size;i++)
         {
             id = pointLocator->FindClosestPoint( perimeterX[i]*spc[0] ,perimeterY[i]*spc[1] , perimeterZ[i]*spc[2] ) ;
-            lstIds.push_back( id );
-            printf("EED id=%ld    spc=%f %f %f   point=%f %f %f \n",id,  spc[0],spc[1],spc[2],  perimeterX[i],  perimeterY[i],   perimeterZ[i]  );
+            lstIdsCtrlPoints.push_back( id );
         } // for i  perimeter
         // Step 3 Get geodesic path from segments
         long int id1,id2;
-        vtkAppendPolyData* append                   = vtkAppendPolyData::New();
-        vtkPoints               *points ;
+        std::vector<long int> lstIdsGeodesicPerimter;
+        vtkAppendPolyData* append = vtkAppendPolyData::New();
         for (i=0;i<size;i++)
         {
-            id1=lstIds[i];
+            id1=lstIdsCtrlPoints[i];
             if (i<size-1)
             {
-                id2 = lstIds[i+1];
+                id2 = lstIdsCtrlPoints[i+1];
             } else {
-                id2 = lstIds[0];
+                id2 = lstIdsCtrlPoints[0];
             }// if
             vtkDijkstraGraphGeodesicPath *pathFilter    = vtkDijkstraGraphGeodesicPath::New();
             pathFilter->SetInputData( bbGetInputMesh() );
@@ -131,14 +139,73 @@ void CleanMeshWithPatch::Process()
             pathFilter->Update();
             append->AddInputData( pathFilter->GetOutput() );
             append->Update();
-
-            points         =  pathFilter->GetOutput()->GetPoints();
-            printf("EED nrP=%d \n", points->GetNumberOfPoints()  );
+            
+            // Step 3.1 Puts ids of perimeter Subsegment in vector  lstIdsGeodesicPerimter
+            vtkIdList   *IdsList            = pathFilter->GetIdList();
+            long int    iIdLst,sizeIdLst    = IdsList->GetNumberOfIds();
+            for (iIdLst=0; iIdLst<sizeIdLst; iIdLst++)
+            {
+                lstIdsGeodesicPerimter.push_back( IdsList->GetId(iIdLst) );
+            }// for iIdLst
+            
             pathFilter->Delete();
-//            if (i==0) bbSetOutputOut(  pathFilter->GetOutput() );
         } // for i  perimeter
         append->Update();
+//        bbSetOutputOut( append->GetOutput() );
+
+        // Step 4. -- Define scalars ---
+        vtkCharArray    *scalarsArray   = vtkCharArray::New();
+        vtkPoints       *points         = bbGetInputMesh()->GetPoints();
+        long int        iMPs,sizeMPs    = points->GetNumberOfPoints();
+        scalarsArray->SetNumberOfValues(sizeMPs);
+        for (iMPs=0; iMPs<sizeMPs; iMPs++)
+        {
+            scalarsArray->SetValue(iMPs,15);
+        } // for iMPs
+        long int    iIdLst,sizeIdLst    = lstIdsGeodesicPerimter.size();
+        for (iIdLst=0; iIdLst<sizeIdLst; iIdLst++)
+        {
+            scalarsArray->SetValue( lstIdsGeodesicPerimter[iIdLst]  ,100 );
+        }// for iIdLst
+        scalarsArray->SetName("scalarsPerimeterPatch");
+        bbGetInputMesh()->GetPointData()->AddArray( scalarsArray );
+        bbGetInputMesh()->GetPointData()->SetActiveScalars( "scalarsPerimeterPatch" );
+        bbGetInputMesh()->GetCellData()->SetActiveScalars( "scalarsPerimeterPatch" );
+
+        // Step 5.  -- Connectivity Filter
+        vtkPolyDataConnectivityFilter *connectivity = vtkPolyDataConnectivityFilter::New();
+        connectivity->SetInputData( bbGetInputMesh() );
+        connectivity->SetExtractionModeToCellSeededRegions();
+        connectivity->InitializeSeedList();
+        connectivity->AddSeed(0);
+        connectivity->SetScalarConnectivity(true);
+        connectivity->SetScalarRange(10,20);
+        connectivity->SetFullScalarConnectivity(true);
+        connectivity->Update();
+//        bbSetOutputOut( connectivity->GetOutput() );
 
+        
+        vtkAppendPolyData* append2 = vtkAppendPolyData::New();
+        append2->AddInputData( connectivity->GetOutput()  );
+        append2->AddInputData( bbGetInputPatch()  );
+        append2->Update();
+
+        
+        vtkPolyDataNormals *normals =vtkPolyDataNormals::New();
+        normals->SetInputConnection( append2->GetOutputPort() );
+        normals->ConsistencyOn();
+        normals->SplittingOff();
+        normals->Update();
+        bbSetOutputOut( normals->GetOutput() );
+
+//        vtkFillHolesFilter *fillHoles = vtkFillHolesFilter::New();
+//        fillHoles->SetInputData( normals->GetOutput() );
+//        fillHoles->SetHoleSize(1000);
+//        fillHoles->Update();
+//        bbSetOutputOut( fillHoles->GetOutput() );
+
+        
+        /*
         // Step 4. -- vtkImprintFilter ---
         vtkImprintFilter *imp = vtkImprintFilter::New();
 //        imp->SetTargetData( append->GetOutput() );
@@ -161,11 +228,10 @@ void CleanMeshWithPatch::Process()
         
         imp->SetTolerance(500);
         imp->Update();
-
-        bbSetOutputOut( imp->GetOutput() );
-        printf("EED CleanMeshWithPatch::Process size=%d \n", perimeterX.size());
+         bbSetOutputOut( imp->GetOutput() );
+*/
+        
     } // if LstIndexs size >=3
-    printf("EED CleanMeshWithPatch::Process End \n");
 }
 
 //=====