#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
{
// 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) ) {
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() );
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() );
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");
}
//=====