
「センサー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:回転できない。列車が存在する。
のようになってます。もしかすると同じことを伝えようとしているのかもしれませんが分かりにくいことは間違いないです。

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