# vtkPolyDataConnectivityFilter reverse

**URL:** https://discourse.vtk.org/t/vtkpolydataconnectivityfilter-reverse/4744
**Category:** Support
**Created:** [November 27, 2020, 2:00pm UTC](https://discourse.vtk.org/t/vtkpolydataconnectivityfilter-reverse/4744 "2020-11-27T14:00:15Z")
**Posts on this page:** 2
**Page:** 1

<div class="post-metadata">

### Author: ![EmileSonneveld](https://discourse.vtk.org/user_avatar/discourse.vtk.org/emilesonneveld/32/939_2.png) [@EmileSonneveld](https://discourse.vtk.org/u/EmileSonneveld)
#### Post date: [November 27, 2020, 2:00pm UTC](https://discourse.vtk.org/t/vtkpolydataconnectivityfilter-reverse/4744/1 "2020-11-27T14:00:15Z")

</div>

Hi, I would like to select all clusters except for the one that is close to the `SetClosestPoint`.  
Is there away to get the clusters sorted on distance?  
I played with the following code, but did not find a good combination:

```
connect = vtk.vtkPolyDataConnectivityFilter()
connect.SetInputData(inputMesh)
# connect.ScalarConnectivityOff()
# connect.SetExtractionModeToLargestRegion()
connect.SetExtractionModeToAllRegions()
# connect.SetExtractionModeToSpecifiedRegions()
# connect.SetExtractionModeToClosestPointRegion()
# connect.SetClosestPoint(0, 9999, -999)
connect.SetClosestPoint(0, 0, 0)
connect.DeleteSpecifiedRegion(0)
connect.Modified()
connect.Update()
# connect.AddSpecifiedRegion(0)
connect.Update()
print("GetNumberOfExtractedRegions", connect.GetNumberOfExtractedRegions())

```

Otherwise, I can try writing a c++ function for it 🙂

---

<div class="post-metadata">

### Author: ![EmileSonneveld](https://discourse.vtk.org/user_avatar/discourse.vtk.org/emilesonneveld/32/939_2.png) [@EmileSonneveld](https://discourse.vtk.org/u/EmileSonneveld)
#### Post date: [November 27, 2020, 2:26pm UTC](https://discourse.vtk.org/t/vtkpolydataconnectivityfilter-reverse/4744/2 "2020-11-27T14:26:28Z")

</div>

Settled with some extra python:

```
closestRegionId = -1
closestRegionDistance = 999999
connect = vtk.vtkPolyDataConnectivityFilter()
connect.SetInputData(inputMesh)
connect.SetExtractionModeToSpecifiedRegions()
connect.Update()
print("GetNumberOfExtractedRegions", connect.GetNumberOfExtractedRegions())
for i in range(connect.GetNumberOfExtractedRegions()):
    print(i)
    connect.AddSpecifiedRegion(i)
    connect.Modified()
    connect.Update()

    pdd = vtk.vtkImplicitPolyDataDistance()
    pdd.SetInput(connect.GetOutput())
    dist = pdd.EvaluateFunction(0, 0, 0)
    if dist < closestRegionDistance:
        closestRegionDistance = dist
        closestRegionId = i

    connect.DeleteSpecifiedRegion(i)

for i in range(connect.GetNumberOfExtractedRegions()):
    if i == closestRegionId:
        connect.AddSpecifiedRegion(i)
    else:
        connect.DeleteSpecifiedRegion(i)

stlWriter = vtk.vtkSTLWriter()
stlWriter.SetFileName(closestMeshPath)
stlWriter.SetInputConnection(connect.GetOutputPort())
stlWriter.SetFileTypeToBinary()
stlWriter.Write()

for i in range(connect.GetNumberOfExtractedRegions()):
    if i != closestRegionId:
        connect.AddSpecifiedRegion(i)
    else:
        connect.DeleteSpecifiedRegion(i)

stlWriter = vtk.vtkSTLWriter()
stlWriter.SetFileName(remainingMeshPath)
stlWriter.SetInputConnection(connect.GetOutputPort())
stlWriter.SetFileTypeToBinary()
stlWriter.Write()
```
