昨晩ななついろチャンネルさんにお邪魔して信号機について色々と話をしていました。
信号機を再現するには、
①閉塞を再現する一番忠実な方法(閉塞式信号機)
②センサーを数多く置いて距離で変える方法(距離式信号機)
③通過後の時間によって変化させる方法(時限式信号機)
の3つがあると思いますが、①は構築するのが大変すぎますし、②は色々分岐するようなレイアウトではセンサーをばら撒くようになってゴチャゴチャします。よって大体は③が多く使用されるのですが、この方式は速度が遅かったり停車してしまうと実態に合わなくなります。
そこでななついろさんは2つのセンサーを使い、最初のセンサーで赤を表示をさせ信号機上で止まっているよう時には赤表示のままとし、通過したら次のセンサーで時間によって変化させる方式としていました。VRM4ではこれが精一杯かもしれません。
しかしVRMNXにはPythonがあります。そこで②の距離式信号機をセンサー1個で計算して再現させてみようと思い立ちました。そして出来たのがこちら。
#OBJID=38
import vrmapi
def vrmevent_38(obj,ev,param):
di = obj.GetDict()
if ev == 'init':
di['signal36'] = vrmapi.LAYOUT().GetSignal(36)
di['signal36'].SetStat(0,6)
di['train'] = 0
di['timerEID'] = 0
di['distance'] = 0
elif ev == 'broadcast':
dummy = 1
elif ev == 'timer':
if param['eventUID'] == 100:
speed = di['train'].GetSpeed()
di['distance'] = di['distance'] + 1.85185 * speed
if di['distance'] > 2500:
di['signal36'].SetStat(0,6)
obj.ResetEvent(di['timerEID'])
di['distance'] = 0
elif di['distance'] > 2000:
di['signal36'].SetStat(0,4)
elif di['distance'] > 1500:
di['signal36'].SetStat(0,3)
elif di['distance'] > 1000:
di['signal36'].SetStat(0,2)
elif di['distance'] > 0:
di['signal36'].SetStat(0,1)
elif ev == 'time':
dummy = 1
elif ev == 'after':
dummy = 1
elif ev == 'frame':
dummy = 1
elif ev == 'catch':
obj.ResetEvent(di['timerEID'])
di['distance'] = 0
di['train'] = obj.GetTrain()
di['timerEID'] = obj.SetEventTimer(1,100)
これがまた1発で動きました(^^)/ 流石はPython(^^)/
信号機はID36の5灯信号機で
6進行 2500mm
4減速 2000mm
3注意 1500mm
2警戒 1000mm
1停止 0mm
レイアウトは1周3766mm、列車長は約420mmです。それでは動画でご覧下さい。
鉄道模型シミュレーターNX距離式信号機
速度を変えても大体同じ位置で信号が変わっている(少し変わるのは1秒毎に見ているので速度によりズレます)のが分かると思います。やはりPythonは凄いわ(^^)/
<追記>次ページにて修正版スクリプトがありますのでそちらをお使いください。