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