"""Interactively cut a mesh by drawing free-hand a spline in space"""
# The tool can also be invoked from command line e.g.: > vedo --edit mesh.ply
import vedo
from vedo.applications import FreeHandCutPlotter

#### This class is a simplified version of the above, shown here as an example: #######
#
# class FreeHandCutPlotter(vedo.Plotter):
#     def __init__(self, mesh):
#         vedo.Plotter.__init__(self)
#         self.mesh = mesh
#         self.drawmode = False
#         self.cpoints = []
#         self.points = None
#         self.spline = None
#         self.msg  = "Right-click and move to draw line\n"
#         self.msg += "Second right-click to stop drawing\n"
#         self.msg += "Press z to cut mesh"
#         self.txt2d = vedo.Text2D(self.msg, pos='top-left', font="Bongas")
#         self.txt2d.c("white").background("green4", alpha=1)
#         self.add_callback('KeyPress', self.onKeyPress)
#         self.add_callback('RightButton', self.onRightClick)
#         self.add_callback('MouseMove', self.onMouseMove)

#     def onRightClick(self, evt):
#         self.drawmode = not self.drawmode  # toggle mode

#     def onMouseMove(self, evt):
#         if self.drawmode:
#             self.remove([self.points, self.spline])
#             # make this 2d-screen point 3d:
#             cpt = self.compute_world_coordinate(evt.picked2d)
#             self.cpoints.append(cpt)
#             self.points = vedo.Points(self.cpoints, r=8).c('black')
#             if len(self.cpoints) > 2:
#                 self.spline = vedo.Line(self.cpoints, closed=True).lw(5).c('red5')
#                 self.add([self.points, self.spline]).render()

#     def onKeyPress(self, evt):
#         if evt.keypress == 'z' and self.spline:  # cut mesh with a ribbon-like surf.
#             vedo.printc("Cutting the mesh please wait..", invert=True)
#             tol = self.mesh.diagonal_size()/2            # size of ribbon
#             pts = self.spline.points()
#             n = vedo.fit_plane(pts, signed=True).normal  # compute normal vector
#             rib = vedo.Ribbon(pts - tol*n, pts + tol*n, closed=True)
#             self.mesh.cut_with_mesh(rib)
#             self.remove([self.spline, self.points]).render()
#             self.cpoints, self.points, self.spline = [], None, None

#     def start(self, **kwargs):
#         return self.show(self.txt2d, self.mesh, **kwargs)
#
######################################################################################
vedo.settings.use_parallel_projection = True  # to avoid perspective artifacts

msh = vedo.Volume(vedo.dataurl+'embryo.tif').isosurface().color('gold', 0.25) # Mesh

plt = FreeHandCutPlotter(msh)
plt.add_hover_legend()
#plt.init(some_list_of_initial_pts) #optional!
plt.start(axes=1, bg2='lightblue').close()
