見出し画像

Rosso Laboratory

Python版踏切スクリプト


鉄道模型シミュレーター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 :下の方向表示という制御になっているので指示が簡単になります。但しマニュアルには相変わらず訳の分からぬ説明しかないので苦労しますが(^_^;)

ということで、スクリプトでも簡単になっている鉄道模型シミュレーターNXでした。
PVアクセスランキング にほんブログ村


ランキングに参加中。クリックして応援お願いします!

名前:
コメント:

※文字化け等の原因になりますので顔文字の投稿はお控えください。

コメント利用規約に同意の上コメント投稿を行ってください。

 

※ブログ作成者から承認されるまでコメントは反映されません。

  • Xでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

最新の画像もっと見る

最近の「Pythonスクリプト」カテゴリーもっと見る

最近の記事
バックナンバー
人気記事