Open topic with navigation
Timer Basics
Timers allow you to trigger events at a given time or repeatedly at
a given interval. When you create a timer, you specify the expiration
delay (in seconds) and the number of times the timer should repeat. There
are several ways to set up timers in Vizard-- you can use a global timer
callback, a callback within an event class, or timers using actions (all
described below).
Timers, per se, aren't the only way to control timing in Vizard. If
you're animating a node or setting up a series of animations, consider
using actions available in the vizact library. You might be able to control
the timing of your animations using vizact.waittime. For precise timing control
within a thread of code, the viztask
library is useful.
Registering global timers
To register a global timer event, use viz.callback( viz.TIMER_EVENT, <function>).
This callback will call the specified function whenever a timer expires,
providing it with the timer id as an argument. Use
viz.starttimer(
<timer name> ) within you script whenever you want to
start a timer for this callback. To stop a timer from going off, use viz.killtimer(
<timer name> ).
#Define the timer ids.
REPEATER = 1
ONCE = 2
#Create a function to handle the timer events.
def onTimer(num):
#Use the time ids to
identify the timer.
if
num == REPEATER:
print('first timer')
elif
num == ONCE:
print('second timer')
#Kill
the other timer.
viz.killtimer( REPEATER )
#Register the timer callback.
viz.callback(viz.TIMER_EVENT,onTimer)
#Start both timers.
#The first will be repeated.
viz.starttimer( REPEATER, 1, viz.PERPETUAL )
#The second will go off only once.
viz.starttimer( ONCE, 5, 1 )
Registering timer events within a class
Event classes can have their own timers inside of them. These timers
have much of the same code as the global timers. However, you will need
to initialize your class as an event class:
#Create an event class.
class modelMaker( viz.EventClass ):
def __init__(self, modelName):
#Initialize
the base class
viz.EventClass.__init__(self)
#Create
a callback to our own event class function
self.callback(viz.TIMER_EVENT,self.myTimer)
#Start
a perpetual timer for this event class
#to go
once per second.
self.starttimer(0,1,viz.PERPETUAL)
#Add a
counter.
self.counter = 0
#Store
the model name in this class.
self.modelName = modelName
def myTimer( self, num ):
#Add a
model by the given name and place it according to the counter.
viz.add(self.modelName).setPosition(
0,self.counter,0 )
#Advance
the counter.
self.counter += 1
#Call the class.
modelMaker('box.wrl')
Registering timer events with actions
The action library has its own code for timers. The vizact.ontimer command calls a function perpetually
at the provided interval. The vizact.ontimer2 command calls a function a
specific number of times at the provided interval. To kill either of these
timers, use setEnabled( 0 ).
#Import the random module.
import random
#Create a function to call with a timer.
def changeColor( ):
viz.clearcolor( random.choice( [viz.BLACK,
viz.GREEN, viz.ORANGE] ) )
#Create a timer to call the function every half second.
myTimerAction = vizact.ontimer(.5,changeColor)
#Disable the timer with a keystroke.
vizact.onkeydown( ' ', myTimerAction.setEnabled, 0 )
#Create another timer to spin an object.
myObject = viz.add('wheelbarrow.ive')
#This timer has the function embedded within it.
#It will go off 10 times, every 2 seconds.
vizact.ontimer2( 2,10, myObject.addAction, vizact.spin(0,1,0,30,1))
See also
Other sections:
Action basics
Event Basics