鉄道模型シミュレーターNXならスクリプトを書かなくても自動センサーの制御だけで簡単に踏切を制御できるのですが、前回のVRMスクリプトと比較してどれだけ簡単にスクリプトを書けるかを比較すべくPythonで書いてみました。
LAYOUT
crossarea01 = 0
crossing41 = vrmapi.LAYOUT().GetCrossing(41)
crossing42 = vrmapi.LAYOUT().GetCrossing(42)
crossing43 = vrmapi.LAYOUT().GetCrossing(43)
crossing45 = vrmapi.LAYOUT().GetCrossing(45)
CROSSINGBAR_LEFT
CROSSINGBAR_RIGHT
if ev == 'init':
obj.SetCrossingTime(3.0)
SENSOR_IN_IN
if ev == 'init':
obj.SetSNSMode(0)
elif ev == 'catch':
global crossarea01
train = obj.GetTrain()
d = train.GetDirection()
if d == 1:
crossarea01 = crossarea01 + 1
vrmapi.LOG(crossarea01)
crossing41.IncAutoSignStatus(0)
crossing42.IncAutoSignStatus(1)
crossing41.SetCrossingStatus(2)
crossing42.SetCrossingStatus(2)
crossing43.SetCrossingStatus(2)
crossing45.SetCrossingStatus(2)
SENSOR_IN_OUT
if ev == 'init':
obj.SetSNSMode(1)
elif ev == 'catch':
global crossarea01
train = obj.GetTrain()
d = train.GetDirection()
if d == 1:
crossarea01 = crossarea01 - 1
vrmapi.LOG(crossarea01)
crossing41.DecAutoSignStatus(0)
crossing42.DecAutoSignStatus(1)
if crossarea01 == 0:
crossing41.SetCrossingStatus(1)
crossing42.SetCrossingStatus(1)
crossing43.SetCrossingStatus(1)
crossing45.SetCrossingStatus(1)
SENSOR_OUT_IN
if ev == 'init':
obj.SetSNSMode(0)
elif ev == 'catch':
global crossarea01
train = obj.GetTrain()
d = train.GetDirection()
if d == 1:
crossarea01 = crossarea01 + 1
vrmapi.LOG(crossarea01)
crossing41.IncAutoSignStatus(1)
crossing42.IncAutoSignStatus(0)
crossing41.SetCrossingStatus(2)
crossing42.SetCrossingStatus(2)
crossing43.SetCrossingStatus(2)
crossing45.SetCrossingStatus(2)
SENSOR_OUT_OUT
if ev == 'init':
obj.SetSNSMode(1)
elif ev == 'catch':
global crossarea01
train = obj.GetTrain()
d = train.GetDirection()
if d == 1:
crossarea01 = crossarea01 - 1
vrmapi.LOG(crossarea01)
crossing41.DecAutoSignStatus(1)
crossing42.DecAutoSignStatus(0)
if crossarea01 == 0:
crossing41.SetCrossingStatus(1)
crossing42.SetCrossingStatus(1)
crossing43.SetCrossingStatus(1)
crossing45.SetCrossingStatus(1)
VRMスクリプトと比較して大幅に書いた量が減っています。これは踏切には命令を書かずセンサーだけで指示を出しているというのもありますし、IncAutoSignStatus()やDecAutoSignStatus()という命令が増えていることにもよります。『「鉄道模型シミュレーターNX」で学ぶPythonプログラミング』の時期には多分これらのコマンドはなかったのでしょう。SetCrossingSign()で制御する方法で書かれていますが、SetCrossingSign()は、0 : 表示なし、1 : 方向1、2 : 方向2、3 : 両方向という制御になっているので条件分岐が必要でスクリプトが長くなります。一方、IncAutoSignStatus()やDecAutoSignStatus()は、0 : 上の方向表示、1 :下の方向表示という制御になっているので指示が簡単になります。但しマニュアルには相変わらず訳の分からぬ説明しかないので苦労しますが(^_^;)