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
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()