cut_freehand.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. """Interactively cut a mesh by drawing free-hand a spline in space"""
  2. # The tool can also be invoked from command line e.g.: > vedo --edit mesh.ply
  3. import vedo
  4. from vedo.applications import FreeHandCutPlotter
  5. #### This class is a simplified version of the above, shown here as an example: #######
  6. #
  7. # class FreeHandCutPlotter(vedo.Plotter):
  8. # def __init__(self, mesh):
  9. # vedo.Plotter.__init__(self)
  10. # self.mesh = mesh
  11. # self.drawmode = False
  12. # self.cpoints = []
  13. # self.points = None
  14. # self.spline = None
  15. # self.msg = "Right-click and move to draw line\n"
  16. # self.msg += "Second right-click to stop drawing\n"
  17. # self.msg += "Press z to cut mesh"
  18. # self.txt2d = vedo.Text2D(self.msg, pos='top-left', font="Bongas")
  19. # self.txt2d.c("white").background("green4", alpha=1)
  20. # self.add_callback('KeyPress', self.onKeyPress)
  21. # self.add_callback('RightButton', self.onRightClick)
  22. # self.add_callback('MouseMove', self.onMouseMove)
  23. # def onRightClick(self, evt):
  24. # self.drawmode = not self.drawmode # toggle mode
  25. # def onMouseMove(self, evt):
  26. # if self.drawmode:
  27. # self.remove([self.points, self.spline])
  28. # # make this 2d-screen point 3d:
  29. # cpt = self.compute_world_coordinate(evt.picked2d)
  30. # self.cpoints.append(cpt)
  31. # self.points = vedo.Points(self.cpoints, r=8).c('black')
  32. # if len(self.cpoints) > 2:
  33. # self.spline = vedo.Line(self.cpoints, closed=True).lw(5).c('red5')
  34. # self.add([self.points, self.spline]).render()
  35. # def onKeyPress(self, evt):
  36. # if evt.keypress == 'z' and self.spline: # cut mesh with a ribbon-like surf.
  37. # vedo.printc("Cutting the mesh please wait..", invert=True)
  38. # tol = self.mesh.diagonal_size()/2 # size of ribbon
  39. # pts = self.spline.points()
  40. # n = vedo.fit_plane(pts, signed=True).normal # compute normal vector
  41. # rib = vedo.Ribbon(pts - tol*n, pts + tol*n, closed=True)
  42. # self.mesh.cut_with_mesh(rib)
  43. # self.remove([self.spline, self.points]).render()
  44. # self.cpoints, self.points, self.spline = [], None, None
  45. # def start(self, **kwargs):
  46. # return self.show(self.txt2d, self.mesh, **kwargs)
  47. #
  48. ######################################################################################
  49. vedo.settings.use_parallel_projection = True # to avoid perspective artifacts
  50. msh = vedo.Volume(vedo.dataurl+'embryo.tif').isosurface().color('gold', 0.25) # Mesh
  51. plt = FreeHandCutPlotter(msh)
  52. plt.add_hover_legend()
  53. #plt.init(some_list_of_initial_pts) #optional!
  54. plt.start(axes=1, bg2='lightblue').close()