1本道の単純な閉塞を1閉塞あたり1個のセンサーで再現しました。それぞれで設定する項目は赤文字のところです。
#----------------
#複線閉塞センサー
#----------------
#OBJID=62
import vrmapi
def vrmevent_62(obj,ev,param):
di = obj.GetDict()
if ev == 'init':
di['previous_area'] = '閉塞05' #前閉塞
di['present_area'] = '閉塞01' #現閉塞
di['next_area'] = '閉塞02' #次閉塞
di['stp_distance'] = 1000.0 #停止距離
di['rs_distance'] = 300.0 #再始動距離
di['rs_voltage'] = 0.8 #再始動電圧
di['train'] = 0
di['evid'] = 0
elif ev == 'broadcast':
dummy = 1
elif ev == 'timer':
if param['eventUID'] == 100:
if vrmapi.LAYOUT().GetStatusDataInt(di['next_area']) == 0:
di['train'].AutoSpeedCTRL(di['rs_distance'],di['rs_voltage'])
obj.ResetEvent(di['evid'])
elif ev == 'time':
dummy = 1
elif ev == 'after':
dummy = 1
elif ev == 'frame':
dummy = 1
elif ev == 'catch':
if obj.GetForward() == 1:
di['train'] = obj.GetTrain()
vrmapi.LAYOUT().SetStatusDataInt(di['previous_area'] , 0)
vrmapi.LAYOUT().SetStatusDataInt(di['present_area'] , 1)
if vrmapi.LAYOUT().GetStatusDataInt(di['next_area']) == 1:
di['train'].AutoSpeedCTRL(di['stp_distance'],0.0)
di['evid'] = obj.SetEventTimer(1.0,100)
おまけの閉塞2灯信号機スクリプトです。信号機にスクリプトを書き込んでいて単独で動作するので信号機なしでも複線閉塞センサーは動作します。
#----------------
#閉塞2灯信号機
#----------------
#OBJID=58
import vrmapi
def vrmevent_58(obj,ev,param):
di = obj.GetDict()
if ev == 'init':
di['next_area'] = '閉塞02' #監視対象閉塞
obj.SetEventTimer(1.0,100)
elif ev == 'broadcast':
dummy = 1
elif ev == 'timer':
if param['eventUID'] == 100:
if vrmapi.LAYOUT().GetStatusDataInt(di['next_area']) == 0:
obj.SetStat(0,6)
elif vrmapi.LAYOUT().GetStatusDataInt(di['next_area']) == 1:
obj.SetStat(0,1)
elif ev == 'time':
dummy = 1
elif ev == 'after':
dummy = 1
elif ev == 'frame':
dummy = 1
elif ev == 'set':
dummy = 1
レイアウトは全部で5個の閉塞で構築されています。それでは動画でどうぞ(^^)/