読者です 読者をやめる 読者になる 読者になる

Railroaderで作成したレイアウトの解析+SVGファイルへの変換

昔々,突貫で作ったRailroaderパーサが出てきたので資料をメモっときます.

Railroaderとは

traintrain.jp
trantrainさんで公開されている鉄道模型用のレイアウトエディターです.
起動時に会員登録の確認を行うのが煩わしいですが,ソフト自体はとても使いやすいようで,ちらほらとユーザーを見かけます.
このソフトはレイアウトデータを,CSVのようなテキスト形式で保存してくれるので,プログラマーにとっても嬉しい限りです.

f:id:sosoru_m:20150731123609p:plain
こんな感じ

レイアウトデータについて

外部ツールでレールを描画する際に必要な所だけを説明します.
所々上げている画像はパーサ部分のC#コードです.

1~3行目はバージョンとレイアウトサイズが記述されているようです.
4行目以降のデータは計61列のcsvデータで,レールの位置を記述しています.

f:id:sosoru_m:20150731124304p:plain
0列目はレールが見える状態にあるかどうかです.Railroaderはレールを配置しようとしたときにidを発行しますが,操作をキャンセルしたり,設置した後レールを削除しようとすると,このフラグをFalseにして削除したように見せるようです.長時間編集したファイルが肥大化するのはこれが原因でしょう.
1列目はレールに振られたIDで,レール毎の接続情報で用いているようです.
2列目はレール種類の名前です.
3列目はレール種類のIDです.
5列目~7列目はレールの物理長さです.
9列目~37列目まではレール座標が記述されています.
f:id:sosoru_m:20150731125558p:plain
Combined~なレールって何だっけなぁ,レイアウトを外部ツールで描画する場合には気にする必要が無かったと思います.
ストレート・ポイント・カーブレールで使用しているパラメータが異なります.
ストレートレールの場合はCornerPosを結べば良さそうです.カーブレールの場合は27列目~37列目の情報を用いて弧を描きます.ポイントレールの場合はストレートとカーブの2つの情報を持っているので注意します.ポイントレールのカーブ側はCornerPos1→CornerPos3に固定されている(?)ようです.

f:id:sosoru_m:20150731132458p:plain
49列目~54列目まではレールの接続情報が記述されています.
NeighborRailxCntに何が格納されているかは失念.NeighborRailxに接続先のレールIDが格納されています.
55列目は高架レールかどうかです.
59列目はレールの色を示しています.
60列目は内部処理に使うIDのようです.

SVG形式への変換

SVGベクタ画像の一種でXMLで記述できます.fieldタグでHTMLに埋め込んだSVGファイルはjavascriptで要素を操作できます.
つまり,RailroaderのレイアウトデータをSVGに変換してHTMLに埋め込んでおけば,ネット上のデータとリアルタイムに連動できるので,模型の在線表示とかが可能なわけです.

f:id:sosoru_m:20150731152208p:plain
Railrodaerプレビュー

f:id:sosoru_m:20150731152226p:plain
WPFジオメトリに変換

f:id:sosoru_m:20150731152313p:plain
SVGに変換(Inkscapeで確認)

当時作っていたときはMVVMを勉強していたようで,WPFの描画パーツに分けた後,そのオブジェクト構造を利用してSVGファイルを作っていました.レイアウトの編集も企んでいたようですが,例外が出てて動いてないです.
下記はそのソースコードとバイナリです.バイナリの実行には.NET Framework 4.5が必要です.

sosoru/RailroaderConverter · GitHub