ブロードキャスト#
ブロードキャストについて#
部品、レイアウトにユーザー定義のイベントを一括、または指定対象に送信する機能です。
指定範囲にブロードキャストする命令と、特定オブジェクトに送信する命令があります。 特定オブジェクトへの送信を利用することで、ユーザー定義イベントを実装できます。
ブロードキャスト : すべてのオブジェクトにbroadcastイベントを送信します。
マルチキャスト : 指定の条件(部品の種類、編成に含まれる車両)を満たした対象に限定してbroadcastイベントを送信します。
コードの注意点#
イベントは関数を実行すると、即時に発生します。broadcastイベントの中で実行すると再びイベントハンドラが呼び出されます。処理内容によっては、リカーシブコール、リエントラントに注意してプログラムを記述してください。
イベントは、送信関数を呼び出した自分自身にも発生します。
'init'イベントのハンドラで送信すると、他のオブジェクトで'init'を実行する前に'broadcast'が受信されます。'init'でのブロードキャスト送信は、注意してください。
関数#
VRMLayoutの関数です。
一括送信関数#
単一のオブジェクト送信関数#
Broadcastイベントの送信と受信の作例#
Broadcast()の作例です。initイベント内部で送信、broadcastイベントで受信、送信された内容をログに記録しています。
#LAYOUT
import vrmapi
def vrmevent(obj,ev,param):
if ev == 'init':
# ブロードキャストの送信テスト
# ユーザー定義タグ'test'を送信。ユーザー定義パラメータは'pm'
d = dict(pm=123)
obj.Broadcast('test', d)
elif ev == 'broadcast':
# 受信テスト
# テストのためLOGに受信したデータを記録
vrmapi.LOG("layout resv ok")
vrmapi.LOG(param['broadcast'])
vrmapi.LOG(param['pm'])
Multicast送信の作例#
Multicast()の作例です。initイベント内部で地上カメラに限定して送信、地上カメラで受信した内容をログに記録しています。
#LAYOUT
import vrmapi
def vrmevent(obj,ev,param):
if ev == 'init':
d = dict(pm=123)
obj.Multicast(2,'multi', d)
#OBJID=4
import vrmapi
def vrmevent_4(obj,ev,param):
if ev == 'init':
dummy = 1
elif ev == 'broadcast':
vrmapi.LOG("camera resv ok")
vrmapi.LOG(param['broadcast'])
vrmapi.LOG(param['pm'])