Rosso Laboratory

Rosso Laboratory

主に鉄道模型シミュレーター(VRM)などの仮想鉄道アプリを扱うブログです。またHDR写真の記事も書いています。

センサー1個で簡単転車台スクリプト


「センサー1個で」シリーズ第五弾です(^^)/ 正直なところセンサー1個では無理かと思っていましたが何とか形になりました。「センサー1個で簡単機回しスクリプト(重連対応版)」と組み合わせて使っています。


#OBJID=92
import vrmapi
def vrmevent_92(obj,ev,param):
    di = obj.GetDict()
    if ev == 'init':
        di['train'] = 0
        di['evid1'] = 0
        di['evid2'] = 0
        di['evid3'] = 0
        di['turntable'] = vrmapi.LAYOUT().GetTurntable(80)
        di['temp_number'] = 0
        di['max_number'] = di['turntable'].GetMaxRails() + 1
        di['in_number'] = 4 #進入する線路番号
        di['out_number'] = 16 #退出する線路番号
        di['reset_number'] = 4 #退出終了後の線路番号
        di['out_direction'] = 1 #退出時:前進は1、後退は-1
        di['out_distance'] = 0 #退出後進行距離:0は無限
        di['out_voltage'] = 0.4 #out_distance=0の時
    elif ev == 'broadcast':
        dummy = 1
    elif ev == 'timer':
        if param['eventUID'] == 101:
            s = di['turntable'].GetStat()
            if s == 2:
                di['train'].SetVoltage(0.0)
                obj.ResetEvent(di['evid1'])
                obj.SetEventAfter(5.0,102)
        if param['eventUID'] == 103:
            s = di['turntable'].GetStat()
            #vrmapi.LOG(s)
            if s == 0:
                di['train'].SetVoltage(0.1)
                di['evid1'] = obj.SetEventTimer(0.2,101)
                obj.ResetEvent(di['evid2'])
        if param['eventUID'] == 104:
            s = di['turntable'].GetStat()
            #vrmapi.LOG(s)
            if s == 2:
                if di['out_direction'] == 1:
                    di['train'].SetVoltage(0.1)
                    if di['out_distance'] == 0:
                        di['train'].AutoSpeedCTRL(100.0,di['out_voltage'])
                    else:
                        di['train'].AutoSpeedCTRL(di['out_distance'],0.0)
                elif di['out_direction'] == -1:
                    di['train'].Turn()
                    di['train'].SetVoltage(0.1)
                    if di['out_distance'] == 0:
                        di['train'].AutoSpeedCTRL(100.0,di['out_voltage'])
                    else:
                        di['train'].AutoSpeedCTRL(di['out_distance'],0.0)
            elif s == 0:
                di['turntable'].MoveTurntablePos(di['reset_number'])
                obj.ResetEvent(di['evid3'])
    elif ev == 'time':
        dummy = 1
    elif ev == 'after':
        if param['eventUID'] == 100:
            di['train'].SetVoltage(0.1)
            di['evid1'] = obj.SetEventTimer(1.0,101)
        if param['eventUID'] == 102:
            if di['out_number'] > di['in_number']:
                dr = di['out_number'] - di['in_number']
                dl = di['in_number'] + di['max_number'] - di['out_number']
            elif di['out_number']
                dr = di['in_number'] - di['out_number']
                dl = di['out_number'] + di['max_number'] - di['in_number']
            if dr > dl:
                di['turntable'].MoveTurntable(1)
            elif dr
                di['turntable'].MoveTurntable(-1)
            else:
                di['turntable'].MoveTurntable(1)
            di['turntable'].MoveTurntablePos(di['out_number'])
            di['evid3'] = obj.SetEventTimer(1.0,104)
    elif ev == 'frame':
        dummy = 1
    elif ev == 'catch':
        if obj.GetForward() == 1:
            di['train'] = obj.GetTrain()
            di['train'].AutoSpeedCTRL(50.0,0.0)
            di['temp_number'] = di['turntable'].GetTurntablePos()
            if di['temp_number'] == di['in_number'] or di['temp_number'] == di['in_number'] + di['max_number'] / 2:
                obj.SetEventAfter(3.0,100)
            else:
                if di['in_number'] > di['max_number'] / 2:
                    di['turntable'].MoveTurntable(-1)
                elif di['in_number'] <= di['max_number'] / 2:
                    di['turntable'].MoveTurntable(1)
                di['turntable'].MoveTurntablePos(di['in_number'])
                di['evid2'] = obj.SetEventTimer(1.0,103)

VRM-NX SCRIPT MANUALにて、MoveTurntablePos()とSetTurntablePos()という同じ機能のようなコマンドがありますが、SetTurntablePos()は動作しないようです。このコマンドは一体なんなのでしょうかね? またターンテーブルのGetStat()の戻り値が

bit 0 ターンテーブルが回転している。
bit 1 転車台が回転可能な位置に列車が存在する。
bit 2 回転できない。列車が存在する。

とありますが戻り値をチェックすると

0:停止中
1:車両を乗せずに回転中
2:転車台が回転可能な位置に列車が存在する。
3:車両を乗せて回転中
6:回転できない。列車が存在する。

のようになってます。もしかすると同じことを伝えようとしているのかもしれませんが分かりにくいことは間違いないです。

機回しだけでなく車庫の出し入れにも使えるようにしてありますが、色々な機関車と連動させるのは少し設定が難しいかもです。それでは動画で機回しの様子をどうぞ。

鉄道模型シミュレーターNXセンサー1個で簡単転車台スクリプト

最も早い回転方向の選択などが上手く出来ていないので改良の余地がかなりありますが、とりあえず動くので公開です(^^)/
PVアクセスランキング にほんブログ村