イベント#
イベントについて#
スクリプトは、特定の条件を満たしたときに「イベント」を発生させて、スクリプトを呼び出します。スクリプトは、イベントハンドラーでイベントを受け取り、適切な処理を行ったあとにシステムに制御を返します。
イベントハンドラー#
イベントハンドラーは、システムが生成します。下記サンプルは、編成部品で生成されるイベントハンドラーです。
部品のイベントハンドラーは、vrmevent_xxx(obj,ev,param)
がエントリになります。xxxは、部品のIDです。objには、部品オブジェクトのインスタンスがセットされています。ev,paramは、それぞれイベントコード、イベントのパラメータになります。
システムの生成コードは、それぞれのイベント処理部分にダミーコード(dummy = 1)を埋め込んでいます。コードを追加するときは、ダミーコードを取り除いてください。
#OBJID=4
import vrmapi
def vrmevent_4(obj,ev,param):
if ev == 'init':
dummy = 1
elif ev == 'broadcast':
dummy = 1
elif ev == 'timer':
dummy = 1
elif ev == 'time':
dummy = 1
elif ev == 'after':
dummy = 1
elif ev == 'frame':
dummy = 1
elif ev == 'couple':
dummy = 1
elif ev == 'split':
dummy = 1
elif ev == 'start':
dummy = 1
elif ev == 'stop':
dummy = 1
elif ev == 'autospeed':
dummy = 1
elif ev == 'delete':
dummy = 1
elif ev == 'create':
dummy = 1
elif ev == 'homekey':
dummy = 1
elif ev == 'endkey':
dummy = 1
elif ev == 'insertkey':
dummy = 1
elif ev == 'spacekey':
dummy = 1
elif ev == 'active':
dummy = 1
elif ev == 'view':
dummy = 1
elif ev == 'keydown':
dummy = 1
種類#
イベントは、基本イベントと部品固有イベントがあります。部品固有イベントは、部品の機能によって発生するイベントです。 イベントは、編成、ポイントなど部品、車両、レイアウトにそれぞれ独立して発生します。
基本イベントは、部品、車両、レイアウトに発生する初期化イベントなど基本的なイベントです。
event | |
---|---|
init | 初期化イベント。ビュワー起動時に一度だけ呼び出されます。 |
timer | タイマーイベント。指定した時間間隔で発生するイベントです。 |
time | 指定時間イベント。指定した時間に発生するイベントです。 |
after | 指定時間後イベント。指定時間後に発生するイベントです。 |
frame | フレームイベント。メインループで毎フレーム発生します。 |
時間系統のイベントは、1フレームにかかる処理時間に精度が左右されます。
パラメータ#
パラメータは、dictです。イベント固有のパラメータの他に、下記の共通パラメータが設定されています。
key | data | |
---|---|---|
eventid | イベントID | afterなどユーザーが設定するイベントは、設定ごとにIDが設定されます。 |
eventtime | イベントが発生した時間 | 秒 |
eventUID | ユーザーID | ユーザーが定義したID。イベントをユーザーの作成したスクリプトで細かに識別することができます。 |
timer、time、afterイベントは、param['time']にイベントに設定したパラメータを格納しています。
# timerイベント受診時にログに出力する
elif ev == 'timer':
#イベント共通パラメータ
vrmapi.LOG(param['eventid'])
vrmapi.LOG(param['eventtime'])
#イベント固有パラメータ
vrmapi.LOG(param['time'])
elif ev == 'time':
ユーザー定義イベントハンドラー#
スクリプト編集ボタンを押して、各部品に用意されるイベントハンドラー以外にユーザー定義のイベントハンドラーを設定することができます。
ユーザー定義イベントハンドラーは、外部のソースコードファイルに記述するなどより柔軟なプログラムが構成可能です。 また、スクリプト編集ボタンによるシステムで用意されたスクリプトがない部品も、ユーザー定義イベントハンドラーを設定することができます。
イベントハンドラーを設定したい部品オブジェクトをGetXXX()系命令で取得して、SetUserEventFunction()でイベントハンドラーを登録します。 イベントハンドラーの名前は、文字列で設定します。 イベントハンドラー本体は、別途記述します。
サンプルは、編成オブジェクト(ID=7)のイベントハンドラーをLayoutのスクリプトに記述、レイアウトの初期化イベントでハンドラーを設定しています。 その後、編成オブジェクトの初期化イベントが発生、ログにメッセージを出力しています。
#LAYOUT
import vrmapi
#OBJID=7
def vrmevent_usertrain(obj,ev,param):
if ev == 'init':
vrmapi.LOG("init user ev")
elif ev == 'broadcast':
dummy = 1
elif ev == 'timer':
dummy = 1
elif ev == 'time':
dummy = 1
elif ev == 'after':
dummy = 1
elif ev == 'frame':
dummy = 1
elif ev == 'couple':
dummy = 1
elif ev == 'split':
dummy = 1
elif ev == 'start':
dummy = 1
elif ev == 'stop':
dummy = 1
elif ev == 'autospeed':
dummy = 1
elif ev == 'delete':
dummy = 1
elif ev == 'create':
dummy = 1
elif ev == 'homekey':
dummy = 1
elif ev == 'endkey':
dummy = 1
elif ev == 'insertkey':
dummy = 1
elif ev == 'spacekey':
dummy = 1
elif ev == 'active':
dummy = 1
elif ev == 'view':
dummy = 1
elif ev == 'keydown':
dummy = 1
def vrmevent(obj,ev,param):
if ev == 'init':
data=obj.GetTrain(7)
data.SetUserEventFunction("vrmevent_usertrain")
elif ev == 'broadcast':
dummy = 1
elif ev == 'timer':
dummy = 1
elif ev == 'time':
dummy = 1
elif ev == 'after':
dummy = 1
elif ev == 'frame':
dummy = 1
elif ev == 'keydown':
dummy = 1
外部モジュールの関数#
外部モジュールに記述したイベントハンドラーを設定する場合は、SetUserEventFunction()にモジュール名を追加して設定します。
vrmhandモジュールに記述したuser_event関数を登録する場合は、次のように設定します。
obj.SetUserEventFunction("vrmhand.user_event")
SetUserEventFunction()のパラメータにモジュール名を追加します。モジュール名+"."+関数名で設定します。
モジュール内部のスクリプトでもモジュール名は省略できません。
モジュール : 外部のファイルに記述したPythonスクリプトです。"モジュール名.py"でファイル名を設定します。
#vrmhandモジュール
# vrmhand.pyで保存
#user定義ハンドラ
def vrmevent_usertrain(obj,ev,param):
if ev == 'init':
vrmapi.LOG('USER INIT - '+str(obj.GetID()))
#コード省略
#
#ハンドラの設定
#モジュール内部でもモジュール名は省略できない
trainobj.SetUserEventFunction("vrmhand.vrmevent_usertrain")