1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
|
# Create a class which wraps the vedo.Plotter class and adds a timer callback
# Credits: Nicolas Antille, https://github.com/nantille
# Check out the simpler example: timer_callback1.py
import vedo
class Viewer:
def __init__(self, *args, **kwargs):
self.dt = kwargs.pop("dt", 100) # update every dt milliseconds
self.timer_id = None
self.isplaying = False
self.counter = 0 # frame counter
self.button = None
self.plotter = vedo.Plotter(*args, **kwargs) # setup the Plotter object
self.timerevt = self.plotter.add_callback('timer', self.handle_timer, enable_picking=False)
def initialize(self):
# initialize here extra elements like buttons etc..
self.button = self.plotter.add_button(
self._buttonfunc,
states=["\u23F5 Play ","\u23F8 Pause"],
font="Kanopus",
size=32,
)
return self
def show(self, *args, **kwargs):
plt = self.plotter.show(*args, **kwargs)
return plt
def _buttonfunc(self, obj, ename):
if self.timer_id is not None:
self.plotter.timer_callback("destroy", self.timer_id)
if not self.isplaying:
self.timer_id = self.plotter.timer_callback("create", dt=100)
self.button.switch()
self.isplaying = not self.isplaying
def handle_timer(self, event):
#####################################################################
### Animate your stuff here ###
#####################################################################
#print(event) # info about what was clicked and more
moon.color(self.counter) # change color to the Moon
earth.rotate_z(2) # rotate the Earth
moon.rotate_z(1)
txt2d.text("Moon color is:").color(self.counter).background(self.counter,0.1)
txt2d.text(vedo.get_color_name(self.counter), "top-center")
txt2d.text("..press q to quit", "bottom-right")
self.plotter.render()
self.counter += 1
viewer = Viewer(axes=1, dt=150).initialize()
earth = vedo.Earth()
moon = vedo.Sphere(r=0.1).x(1.5).color('k7')
txt2d = vedo.CornerAnnotation().font("Kanopus")
viewer.show(earth, moon, txt2d, viewup='z').close()
|