capping_mesh.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. """Manual capping of a mesh"""
  2. from vedo import *
  3. def capping(amsh, bias=0, invert=False, res=50):
  4. bn = amsh.boundaries().join(reset=True)
  5. pln = fit_plane(bn)
  6. cp = [pln.closest_point(p) for p in bn.coordinates]
  7. pts = Points(cp)
  8. if invert is None:
  9. cutm = amsh.clone().cut_with_plane(origin=pln.center, normal=pln.normal)
  10. invert = cutm.npoints > amsh.npoints
  11. pts2 = pts.clone().reorient(pln.normal, [0,0,1]).project_on_plane('z')
  12. msh2 = pts2.generate_mesh(invert=invert, mesh_resolution=res)
  13. source = pts2.coordinates.tolist()
  14. target = bn.coordinates.tolist()
  15. printc(f"..warping {len(source)} points")
  16. msh3 = msh2.clone().warp(source, target, mode='3d')
  17. if not invert:
  18. bias *= -1
  19. msh3.reverse()
  20. if bias:
  21. newpts = []
  22. for p in msh3.coordinates:
  23. q = bn.closest_point(p)
  24. d = mag(p-q)
  25. newpt = p + d * pln.normal * bias
  26. newpts.append(newpt)
  27. msh3.points(newpts)
  28. return msh3
  29. msh = Mesh(dataurl+"260_flank.vtp").c('orange5').bc('purple7').lw(1)
  30. # mcap = msh.cap() # automatic
  31. mcap = capping(msh, invert=True)
  32. merged_msh = merge(msh, mcap).clean().smooth()
  33. merged_msh.subsample(0.0001).wireframe(False) # merge duplicate points
  34. printc("merged_msh is closed:", merged_msh.is_closed())
  35. show([[msh, __doc__],
  36. [merged_msh, merged_msh.boundaries()]],
  37. N=2, axes=1, elevation=-40,
  38. ).close()