Skip to content

Instantly share code, notes, and snippets.

@ngunhaSO
Created July 27, 2018 09:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ngunhaSO/cfc3184854d0ca6bf57d3c4637fb6d13 to your computer and use it in GitHub Desktop.
Save ngunhaSO/cfc3184854d0ca6bf57d3c4637fb6d13 to your computer and use it in GitHub Desktop.
import vtk
def checkQualityAndTriangulate():
reader = vtk.vtkSTLReader()
reader.SetFileName('data/3D_data/demoparts/test.stl')
reader.Update()
srcPolyData = reader.GetOutput()
triangleFilter = vtk.vtkTriangleFilter()
triangleFilter.SetInputConnection(reader.GetOutputPort())
triangleFilter.Update()
mesh = triangleFilter.GetOutput()
qualityFilter = vtk.vtkMeshQuality()
qualityFilter.SetInputData(mesh)
qualityFilter.SetTriangleQualityMeasureToArea()
qualityFilter.Update()
featureEdges = vtk.vtkFeatureEdges()
featureEdges.SetInputData(srcPolyData)
featureEdges.SetBoundaryEdges(1)
featureEdges.SetFeatureEdges(0)
featureEdges.SetNonManifoldEdges(0)
featureEdges.SetManifoldEdges(0)
featureEdges.Update()
numberOfOpenEdges = featureEdges.GetOutput().GetNumberOfLines()
print("open edges, there are: ", numberOfOpenEdges)
print("================== START FILLING HOLES ====================")
#clean up the mesh
boundaryClean = vtk.vtkCleanPolyData()
boundaryClean.SetInputData(srcPolyData)
boundaryClean.Update()
region = vtk.vtkPolyDataConnectivityFilter()
meshAppend = vtk.vtkAppendPolyData()
boundaryStrips = vtk.vtkStripper()
boundaryPoly = vtk.vtkPolyData()
boundaryTri = vtk.vtkTriangleFilter()
meshAppend.AddInputData(boundaryClean.GetOutput())
meshAppend.AddInputData(boundaryTri.GetOutput())
region.SetInputData(featureEdges.GetOutput())
region.SetExtractionMode(6)
boundaryStrips.SetInputData(region.GetOutput())
boundaryTri.SetInputData(boundaryPoly)
boundaryClean.SetInputData(meshAppend.GetOutput())
boundaryClean.SetTolerance(0.0)
boundaryClean.SetConvertLinesToPoints(0)
boundaryClean.SetConvertPolysToLines(0)
boundaryClean.SetConvertStripsToPolys(0)
featureEdges.SetInputData(boundaryClean.GetOutput())
i = 0
while numberOfOpenEdges != 0:
print('number of open edges: ', numberOfOpenEdges)
region.Update()
#create polygonal patches
boundaryStrips.Update()
boundaryPoly.Initialize()
boundaryPoly.SetPoints(boundaryStrips.GetOutput().GetPoints())
boundaryPoly.SetPolys(boundaryStrips.GetOutput().GetLines())
boundaryPoly.Modified()
# triangulate the polygonal patch
boundaryTri.Update()
meshAppend.Update()
# remove dup
boundaryClean.Update()
featureEdges.Update()
numberOfOpenEdges = featureEdges.GetOutput().GetNumberOfLines()
print('........................ done ')
out = vtk.vtkPolyData()
out.DeepCopy(boundaryClean.GetOutput())
writerFinal = vtk.vtkSTLWriter()
writerFinal.SetFileTypeToBinary()
writerFinal.SetInputData(out)
writerFinal.SetFileName('data/3D_data/demoparts/improve_final.stl')
writerFinal.Update()
writerFinal.Write()
if __name__ == '__main__':
checkQualityAndTriangulate()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment