AKAGI Rails

鉄道模型シミュレーターで遊んでいたはずが、気づいたらPythonなども。

自動踏切モジュール

少し前に作った踏切グループを拡張するクラスを,threadingを用いて遮断機の遅延作動に対応させ,さらに,モジュールとして独立したファイルにまとめました。(VRMNXでのマルチスレッド処理の実装自作モジュールのインポートについては各記事を参照。)

Cros_mock

「CrossingCtrler.zip」をダウンロード (Zip, 1.15MB)

サンプルレイアウトは上記から入手できます。(自己の責任のもとでお使いください)
レイアウトファイルと,Pythonスクリプトファイル(crossingctrler.py)が同梱されています。適当なフォルダに解凍してください。レイアウトファイルとスクリプトファイルを同じフォルダに保存してください。(そうでないとインポートができません!)

生成するスレッドの数を減らして動作を安定化したほか,例外処理やエラー処理を追加して使う人に親切になりました。

VRMNXにはスクリプトウィザードは(今のところは)ありませんが,それほど手間を掛けずに凝った仕掛けがレイアウトに組み込めること(そういうアドオンがPythonでなら書けること)が確認できたと思っています。

ご自身のレイアウトに踏切(方向表示機・遮断機遅延作動つき)のギミックを組み込む方法は以下をごらんください。

【使用方法】

(Step 1) 標準的な複線の踏切を例に組み込みの方法をご説明します。まずは,必要な踏切部品と,列車の接近・通過を検出するセンサーを配置してください。 「方向1」「方向2」をどちらの向きにするか頭の中で決めておいてください。

Cros_map

また,通過側のセンサーは踏切の直後に配置し,「最後尾台車を検出」するようにしておきます。

Cros_sns

(Step 2) レイアウトファイルと同じフォルダにスクリプトファイル(crossingctrler.py)をコピーしてください。

(Step 3-1) レイアウトスクリプトの冒頭に次の太字部分のコードを書き加えます。

#LAYOUT
import vrmapi
import os, sys
sys.path.append(os.getcwd())
from crossingctrler import *

Cros_lay

おまじないのようですが,これで自動踏切モジュールがインポートされ,レイアウトで使用可能になります。(ついでにいうと,この時点でレイアウトにFrameイベントが設定されマルチスレッド処理が可能になる。)

(Step 3-2) 踏切ごとに,制御の親の生成と踏切部品の登録をします。Step 3-1のコードに続いて記述してください。カンマ,ピリオドに注意してくださいね。

fumikiri = CrossingCtrler("ペンギン踏切")  # 制御の親を生成
fumikiri.addmember(83)                 # 踏切オブジェクトをID指定して登録
fumikiri.addmember(84, rev=True)   # rev=Trueで方向表示機を逆転
fumikiri.addmember(95, delay=1.0)   # delayで作動までの遅延時間を設定(秒)
fumikiri.addmember(vrmapi.LAYOUT().GetCrossing(96), delay=1.0) 

(1行目) 制御の親には適当なオブジェクト名を付ける必要があって,ここではfumikiriとしました。"ペンギン踏切"のように名称も付けられますが,こちらは特に意味はありません。名称を設定しない場合は,fumikiri = CrossingCtrler()とカッコの中身は空でOK。

(2行目~) 2行目ではfumikiriにID=83の踏切部品を登録しています。踏切部品のIDは,部品を選択して,レイアウターツール▼ツールオプション▼部品情報 から確認できます。(add_componentでは長いのでaddmemberにメソッド名を変えました。)

3行目以降はオプションを指定する書き方になっています。Step1で決めた踏切の「方向1」「方向2」と,警報機部品の「方向1」「方向2」が逆の場合には,rev=Trueとすると方向表示機を逆に表示します。

Cros_sign

遮断機部品を登録するときはdelayで作動遅延の秒数を入力します。5行目のようにGetCrossing命令で取得した踏切オブジェクトを直接指定することもできます。

(Step 4) fumikiriに列車の接近・通過を知らせるセンサーの設定をします。例を参考に,太字の部分をセンサーのイベントハンドラのcatchの部分に書き足してください。インデントは1段階を半角スペース4つとして,必ず正しくインデントしてください。

#OBJID=99 (自動センサー)
import vrmapi
def vrmevent_99(obj,ev,param):
    ### 中略 ###
    elif ev == 'catch':
        fumikiri.train_approach(1) # 接近・方向1
#OBJID=999 (自動センサー)
import vrmapi
def vrmevent_999(obj,ev,param):
    ### 中略 ###
    elif ev == 'catch':
        fumikiri.train_pass(2) # 通過・方向2

Cros_snspy

以上です。かんたんでしょう?え?思ったより面倒くさい?

別の踏切を設定する場合は,Step3以降を繰り返します。オブジェクト名をfumikiri以外のものにして設定してください。

★゜・。。・゜゜・。。・゜☆゜・。。・゜゜・。。・゜

この自動踏切モジュールは,自分の中ではまだ試作品の位置づけです。レイアウトファイル自体に依存しないPythonモジュールを作り,レイアウトにインポートする,そういう一連の流れを試してみた,というところです。

VRMNXpyを使用したアドインの作り方・使い方(使わせ方)は,他にもありうるでしょうが,ひとまずは一手法の可能性を示せたことに満足しています。

自動センサーでも簡易なギミックを実現することは出来るし,ビュワーのGUIから編成やターンテーブルなどを色々と動かせるようにもなったので,「ちょっと凝ったことを,ちょっと凝ってレイアウトに実装する」,そんなアドインを提供していけたらなと思っています。幸いにも,Pythonはかなり強力なプログラミング言語なので,凝ったことでも比較的実装しやすいかなと(希望的に)思っています。