AKAGI Rails

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

自動踏切モジュール

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

Cros_mock

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

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

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

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

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

続きを読む

VRMNXpyでマルチスレッド

<注意: VRM NXは開発途上の段階であり,βテストの経過に伴って仕様変更の可能性がある。本エントリに示す情報は執筆時点でのものである。> (2019/1/23 現在 Ver. 6.0.0.25)

Pythonではthreadingモジュールを使用することでマルチスレッド処理を行うことができます。VRMNXビュワーでもマルチスレッド処理ができれば,ちょっとしたタイマー処理を,VRMNXシステムのイベントハンドラを経由せずに行うことができるので,自動運転などのアドオン組み込みが楽になります。

VRMNXβテスト 公式ドキュメントの制限事項にも, Python付属のLIBの使用については、VRMNXではサポートしていません。importしても問題ないか確認いないため、サポート外としてご利用ください とあるとおり,threadingを含むモジュールの使用はサポート外となるわけですが,リリースノート6.0.0.25スレッドを生成する場合は、レイアウトにFrameイベントが発生するようにしてください。 FrameイベントによってPythonインタープリタを駆動します とも書いてあります。動けば御の字,動かなかったら諦めてね,というお気持ちなんでしょうか。

このあたりを参考に,サンプルとして,キーを押すと1秒おきに'Hello, World!'を5回表示する処理を組んでみます。

続きを読む

Pythonは空をも飛べる VRMNXは?

<注意: VRM NXは開発途上の段階であり,βテストの経過に伴って仕様変更の可能性がある。本エントリに示す情報は執筆時点(v6.0.0.25)でのものである。> (2019/1/20 現在 Ver. 6.0.0.25)

VRMNXのPythonエンジンでは,カレント作業ディレクトリ(os.getcwd()で取得できる)と,モジュールを検索する場所sys.path)はどのようになっているのか,次のコードで調べてみた。

import vrmapi
import os, sys

vrmapi.LOG('[CWD] ', os.getcwd())
vrmapi.LOG('[PATH]')
for p in sys.path:
    vrmapi.LOG(p)

結果,

  • カレント作業ディレクトリは,レイアウトを保存しているフォルダ
  • モジュール検索パスは,VRMNXインストールフォルダ/python/Lib

であることがわかった。

続きを読む

踏切のグループを拡張しよう

今回は,Pythonの「クラス」を使ってみます。

VRMスクリプトにもあった CrossingGroupCTRLVRMNXpy にも実装が引き継がれましたが,これで踏切を作動させても踏切警報機にある方向表示機は真っ暗なままです。接近する列車の方向や何本もの列車が同時に踏切に接近してくる場合も考慮するとなれば,やや複雑な処理が必要です。

Crossing


同じようなことを実現する自動踏切スクロールを過去に作りましたが,これをVRMNXpyで実装してみましょう。ただし,今回は遮断桿が遅れて降りてくるのは省略です。(次回やります)

クラスとかインスタンスという言葉が聞き慣れない方は, Pythonで学ぶ基礎からのプログラミング入門~オブジェクト指向について学ぼう が分かりやすいです。(8本とやや長めです)

<注意: VRM NXは開発途上の段階であり,βテストの経過に伴って仕様変更の可能性がある。本エントリに示す情報は執筆時点(v6.0.0.25)でのものである。> (2019/1/17 現在 Ver. 6.0.0.25)

続きを読む

VRMNXpyで205系のドア開閉

VRMNXpy(Pythonベースの新しいVRMスクリプト)を書いて,新たに実装されたドア開閉機能のある205系を実際に動作させてみた。指定距離停止をやってみた回ではセンサーでイベントを発生させたが,今回はキーイベントを使用する。

注意VRM NXは開発途上の段階であり,βテストの経過に伴って仕様変更の可能性がある。本エントリに示す情報は執筆時点(v6.0.0.25)でのものである。>

今回の実装のターゲットは次のとおりである。

  • Z/Aキーで左側のドアを開閉
  • X/Sキーで右側のドアを開閉

ただしドア開閉をするのは操作対象の編成に限る。方向転換を伴うと「左右」は入れ替わる可能性があるが,今回はこのことは考慮しない。

続きを読む

種別コードを先入れ先出しするキュー Python編

以前,バージョン5のVRMスクリプトで種別コードを先入先出するキューの作例を紹介した。旧VRMスクリプトには配列変数のような概念はなかったので,32bit int型変数を3ビットずつ区切って0~7の種別コードを入れる「枠」とみなし,ビット演算によって種別コードをキューに入れたり取り出したりしていた。

Pythonにおいては,Cでいう配列変数を強化したような「リスト」というデータ形式があるので,それを使って同じことをしてみよう。リストはPython標準の型なので,VRMNX上のPythonエンジンでなくても使うことができる。

続きを読む

VRMNXpyで指定距離停止

今回より五月雨式に,VRMNXpyでいろんなことをしてみる不定期連載をしていきます。

文体は簡便のため「だ・である調」となります。Python一般のごく基本的なところは他の文献・サイト・ブログをあたるのがよいでしょう。いいものがたくさんあります。

質問・文句・ツッコミ・その他,常に歓迎です。コメント欄にお願いします。「こんなことがしたい」といったリクエストもどうぞ。

<注意> VRM NXは現在βテストの途上であり,開発の経過に伴ってあらゆる仕様は変更されうることが宣言されている。本エントリに示す情報は執筆時点でのものであり,暫定的なものである可能性がある。 (2019/1/8 現在 Ver. 6.0.0.20)

【今回のお題】Ver. 6.0.0.20βでは,自動センサーの「指定距離停止」のコマンドや,編成のAutoSpeedCTRLメソッドが完全に機能しないようなので,その機能をVRMNXpyで組んでみよう。

Sensorsample

センサーイベントの取り扱い方で,イベントハンドラの基本的な性質が分かっていただければ幸いである。

続きを読む