【第3章】編成を動かそう
第13回 更にポイントを切り替えよう
前回は列車を発車させたので、今回はそれに追加してポイントを切り替えます。
【使用するVRMNX命令】センサーの命令:GetTrain()
'catch'イベントで使用し、検出した編成オブジェクトを取得します。
【使用するVRMNX命令】編成の命令:SearchForwardPointID(距離)
前方にあるポイントのIDを取得します。距離はポイントを探索する距離。
【使用するVRMNX命令】レイアウトの命令:GetPoint(指定ID)
指定IDのポイントオブジェクトを取得します。
【使用するVRMNX命令】ポイントの命令:GetBranch()
分岐状態を取得します。戻り値は0で直進、1で分岐です。
【使用するVRMNX命令】ポイントの命令:SetBranch(分岐状態)
分岐状態を設定します。分岐状態は0で直進、1で分岐です。
【やってみよう】「親子で学ぼう用レイアウト(12).vrmnx」を開き、各センサーにスクリプトをこのように書こう。書くのが大変ならコピペしよう。完成品は「親子で学ぼう用レイアウト(13).vrmnx」です。
センサーID=56の場合
#OBJID=56
import vrmapi
def vrmevent_56(obj,ev,param):
if ev == 'init':
dummy = 1
(中略)
elif ev == 'catch':
train = obj.GetTrain()
pid = train.SearchForwardPointID(256)
point = vrmapi.LAYOUT().GetPoint(pid)
n = point.GetBranch()
if n == 0:
point.SetBranch(1)
else:
point.SetBranch(0)
【解説】このセンサーは前方にあるポイントを直進・分岐を交互に切り替えていくために設置されたセンサーです。'catch'イベントが発生したら、編成オブジェクトを取得し、その編成の256mm以内の前方のポイントのIDを取得し、その指定IDのポイントオブジェクトを取得し、そのポイントの分岐状態を取得します。もし分岐状態が0なら1にし、そうでないつまり1なら0にします。このような処理をトグル処理と呼びます。
センサーID=57の場合
#OBJID=57
import vrmapi
def vrmevent_57(obj,ev,param):
if ev == 'init':
dummy = 1
(中略)
elif ev == 'catch':
train = obj.GetTrain()
pid = train.SearchForwardPointID(256)
point = vrmapi.LAYOUT().GetPoint(pid)
point.SetBranch(0)
または
elif ev == 'catch':
vrmapi.LAYOUT().GetPoint(38).SetBranch(0)
センサーID=58の場合
#OBJID=58
import vrmapi
def vrmevent_58(obj,ev,param):
if ev == 'init':
dummy = 1
(中略)
elif ev == 'catch':
train = obj.GetTrain()
pid = train.SearchForwardPointID(256)
point = vrmapi.LAYOUT().GetPoint(pid)
point.SetBranch(1)
または
elif ev == 'catch':
vrmapi.LAYOUT().GetPoint(38).SetBranch(1)
【解説】この2つのセンサーは前方にあるポイントをそれぞれ、直進や分岐に切り替えるためのセンサーです。「または」以降は直接ポイントのIDを記入して使う場合です。こちらの方が簡単に扱えますが、各ポイントのIDを調べる必要があり汎用性が乏しいので規模の小さいレイアウトでは良いですが、規模の大きいレイアウトではいちいち調べるのも大変です。自動でポイントのIDを取得できる前者を推奨しますが、この辺はお好みでどうぞ。
【実践】それでは「運転」を押してビューワーを起動させましょう。ビューワーが起動したら右上の左から1つ目のボタン「マップ表示」を押してみましょう。列車が交互にポイントを切り替えて走行したら成功です(^^)/
←戻る 目次 進む→