NextTrainフォーマットデータコンバーター

Last-modified: 2015-03-06 (金) 12:20:33

【最新版】コンバーターver.1のDLはこちらから!

概要

動作条件・利用条件

→Javaが動くPCなら多分どれでも動くはずです。コンバーターについては、二次利用、改造、再配布などなんでもOKです。ソースコードも添付してあります。

効き目

このプログラムは親設定ファイルの記述を補助します。
たとえば下の親設定ファイルにおいて
親設定ファイルサンプル.png
表示機のデータフォーマットの説明の所で書きましたが、青矢印の部分が全体にかかわる設定、オレンジの矢印のところが、Eventの設定にかかわる部分です。

 

コンバーターでは、NextTrainフォーマット様式のデータと、読み替えファイル(properties形式)を使ってこのEventの設定にかかわる部分の記述を自動で行います。

 

たとえばトップページやフォーマット説明ページで度々出しているあの副都心線渋谷駅のサンプルの場合、18基の回転機のそれぞれのorder + TimeとGroupOrderで1度のEventで20行の記述が必要です。
1日の本数は約260本。
つまり、5200行もの記述が必要になってしまいます。これははっきりいって非現実的です。
なので、世の中に広く普及しているNextTrainフォーマットと、ソレを読み替えるファイルからこの大量の記述を自動的に行おうというものです。

使い方

※ver.1から使い方が大幅に変わりました。バージョンアップされる場合はご注意ください。
NexTrans.jarをダブルクリックしてアプリケーションを起動してください。
ここでjarファイルと同じディレクトリにerror.logとその一時ファイルが生成されます。一時ファイルはプログラムの終了と同時に消去されます。error.logはプログラムの終了後消去してもしなくてもかまいません。
すると下のようなファイル選択ダイアログが出てくるので、まずは変換対象のNextTrainフォーマットのデータを選択してください。
ファイル選択1.png

 

つづいて、もう一度ファイル選択ダイアログが出てくるので、今度は読み替えファイル(書式は下で説明しています。)を選択してください。
ファイル選択2.png

 

するとこのような曜日選択ボタンが出てくるので、どのダイヤでEventを生成するかを選択してください。
曜日選択.png

 

エラー無く変換に成功した場合は下のようなダイアログが登場します。
Writing_success.png
さらにerror.logに以下のようなメッセージが出現します。

2015/03/06 10:57:53 nextrans.NexTrans actionPerformed
情報: 正常に書き出しを終了しました。

jarファイルと同じディレクトリにEvents.propertiesができあがるので、あとはそのファイルに親設定ファイルの残りの設定を書きこむなり、もともと記述途中だったファイルに生成されたものをコピペするなりして親設定ファイルを完成させてください。
ファイルの生成が完了してもプログラムは自動終了しません。曜日選択画面の閉じるボタンを押すか、Alt+F4やCommand+Qとかで終了させるなりしてください。

エラーについて

変換に失敗すると下のようなダイアログが登場します。
Writing_fault.png
また、エラーの内容がerror.logに書かれます。
例えばtblファイル(NextTrain形式のファイル)で時刻の定義にミスがあったりすると下のような感じです。


2015/03/06 10:58:32 nextrans.Train sepModif
警告: 【tblファイル】列車番号229、0時台の「10」列車は修飾子が定義されていません。数字だけの時刻定義はできません。
2015/03/06 10:58:32 nextrans.NexTrans actionPerformed
警告: 列車番号229のTrain生成時にエラーがありました。
2015/03/06 10:58:32 nextrans.Train sepModif
警告: 【tblファイル】列車番号230、0時台の「N」列車は正しい時刻情報ではありません。
2015/03/06 10:58:32 nextrans.NexTrans actionPerformed
警告: 列車番号230のTrain生成時にエラーがありました。

error.logにはファイルの不備によるエラーとプログラム内部のエラー両方が出力されます。プログラム内部のエラーの大半はファイルの不備を訂正すれば治りますが、もし治らない場合はBBSに報告をお願いします。
また、処理の都合上エラーチェックには段階があります。表示されたエラーを全部潰しても次の段階で新たなエラーが出てくる場合があるので、その場合は根気よくエラーを潰していってください。(たしか全部で3〜4段階あるはずです。)

デバッグモードについて

プログラム内部のエラーが疑われる場合、プログラム内部で生成しているログを全て書き出すモードがあります。
起動時に引数「-d」を渡してください。
具体的には、コマンドライン上(Winならコマンドプロンプト、Macならターミナル etc...)で

java -jar NexTrans.jar -d

と入力するとerror.logに全てのログが書き出されます(エラーが無くても数千行が書き出されます。)
必要な場合は使用してください。

ファイルの用意

現状、1000列車までの読み込みに対応しています。まあ1日に1000本以上も1つの路線で走ることは無いとは思いますが。
ファイルのテキストエンコーディングは全てUTF-8にしてください。

 

NextTrainデータ

このコンバーターが使うのは、曜日別フォーマット、時刻表フォーマットのみで、「;」からはじまる行、空白だけの行、タイトル行、修飾文字の定義、到着駅フォーマット、乗換駅フォーマットは使用しません。

[MON][TUE]
5:A05 A21 A34 A45 A56

というような部分だけを使用します。

 

NextTrainデータをツールかなんかで自動生成すると、

0:F02 A05 J20 N O P Q R S T U

というように、時刻表定義部分に数字無し(修飾文字だけ)の部分が生成されることがあります。
現状このような数字のない部分を読み込もうとするとエラーを出すので、コンバーターにかける前に手動で削除しておいてください。

 

なお、現状曜日定義無しのデータは扱えないので、曜日定義がされてない場合は[MON]などと適当に曜日定義を付け加えておいてください。

 

細かいところは本家の定義に従ってください。

読み替えファイル

修飾子を読み替えたりしないと反転フラップ式案内表示機データフォーマットで扱えるような形にはなりません。つまりNextTrainフォーマットのデータだけでは情報量が足りないので、読み替えファイルで設定してあげます。
ファイルの修飾子は.propertiesです。ファイル名はなんでもいいです。

 

コンバーターでは、

  • パタパタ表示機の数が各段ごとに等しい
  • 時刻を表す回転機は、各段4つある(つまりhourの10の位、1の位、minの10の位、1の位が全て分離されているということです。)
  • 回転機は上の段から段ごとに順番に回転する

という条件でデータを作ります。
ここで言う「段」とは、必ずしも実際の配置のことではなく、1列車を表す回転機の集合を指します。段は1段しかなくてもかまいません。こちらとしては近鉄賢島駅のデカイパタパタとかKQのパタパタとか南海なんば駅(アレはヨコにLEDがありますが)みたいなのを想定しています。

 

【補足】NextTrainデータの時刻表部分では、各列車が次のように表されています。

Aa07

このうち、「Aa」を修飾文字部分(あるいは修飾子部分)、「07」を時刻部分と呼ぶことにします。
修飾文字部分が無い列車(つまり、「15」だけで定義されている列車)も本家では存在しますが、現状修飾文字部分がないとエラーになるので、修飾文字部分がない列車がデータに存在するときは未定義の修飾文字を適当に付与しておいてください。

 
PtptArray = (半角数字)
→何段組にするか(何列車分表示するか)を定義します。たとえば3に設定すると1段目は先発列車、2段目は次発列車、3段目は次々発列車を示すEventが順番に生成されていきます。
PtptNumberPerArray = (半角数字)
→1列あたり何個回転機を設定するのか(つまり1列車を表す回転機が何個なのか)を示します。時刻で動く回転機は4つと固定されていますし、修飾文字で動く回転機が最低1つ以上必要なので、この数は5以上でなければなりません。
modifPtpt = (半角数字カンマ区切り)
→修飾文字部分で動く回転機の1段目のみの番号を定義します。(たとえば「0,1」)定義できる数はPtptNumberPerArrayで定義した数-4です。
timePtpt = (4つの半角数字をカンマ区切り)
→時刻を示す回転機の1段目のみの番号を定義します。例えば「3,4,5,6」と定義したとき、3番機はhourの10の位を、4番機はhourの1の位を、5番機はminの10の位を、6番機はminの1の位を表します。これの表示(order)はNextTrainデータで定義されている時刻情報に批准し、自分で定義することはできません。
 
勘のいい方ならお気づきかもしれませんが、modifPtptとtimePtptでは1段目の回転機の番号のみを定義しています。残りの段は自動生成されるということです。
たとえば、

PtptArray = 3
PtptNumberPerArray = 6
modifPtpt = 0,1
timePtpt = 2,3,4,5

と定義すると、

1段目の、修飾文字を表す回転機:0,1番機
1段目の、時刻を表す回転機:2,3,4,5番機(この数字の並び方の意味するところは上で説明したとおりです)
2段目の、修飾文字を表す回転機:6,7番機
2段目の、時刻を表す回転機:8,9,10,11番機
3段目の、修飾文字を表す回転機:12,13番機
3段目の、時刻を表す回転機:14,15,16,17番機

というように連番で自動的に残りの段が補充されます。コンバーターで生成した以外の部分を手動で記述する場合には、この回転機の番号の生成のされかたには注意すべきだと思います。

 
order.(文字列) = (半角数字カンマ区切り)
→修飾子による各回転機の動作を決定します。
たとえば、

modifPtpt = 0,1
order.Ac =12,3

と定義すると、1段目に修飾文字Acをもつ列車が表示されるとき、0番機にorder = 12が、1番機にorder = 3が渡されます。
2段目、3段目も同様です。
この定義は、時刻表部分で登場する全ての修飾文字に対して行われる必要があります。
一つでも定義漏れがあると、エラーになります。

order.Empty = (半角数字カンマ区切り)
→終電近くになってくると、下の方の段に表示する列車がなくなってきます。このとき、時刻を表す回転機は自動的にorder = 11(空白)が渡されますが、修飾文字で動く回転機のorderは自分で定義する必要があります。設定するカンマ区切りの半角数字の意味は上のorder.修飾文字と同じです。
Event0.Time = (6ケタの半角数字)
→Event0の時間(つまり始発電車を表示する時間)を定義します。通常たとえば、EventKにおいてTimeにはK番目の列車の発車時刻が代入されますが、0番目の列車の発車時刻は存在しませんね。(実は内部的には0から番号を振ってるのですが、気にしないでください。)まあ最終電車の時刻~始電の時刻の間の時刻を設定しておけば大丈夫です。6ケタの半角数字の意味は親設定ファイルのところで説明したTimeの意味と同じです(1,2ケタ目がhour、3,4ケタ目がmin、5,6ケタ目がsec)
 
 

まぁEventを手動で幾千行書くよりは楽ですが、それでもやっぱり修飾文字とorderの対応付けのあたりとか面倒です・・・orz

子設定ファイル

このコンバーターを使ってEventを自動生成する場合、子設定ファイルにいろいろな制約が生じます。
修飾文字による回転機のorderについては先ほど定義しましたが、時刻によって回転する回転機のorderは定義していません。
定義していないのではなく、自動的に定義したのです。
なので、時刻によって回転する回転機を設定する子設定ファイルではそれに従う必要があります。
時刻によって回転する回転機を設定する子設定ファイルでは、PlateImageを

order = 1のとき、数字の「1」の画像が表示
order = 2のとき、数字の「2」の画像が表示
order = 3のとき、数字の「3」の画像が表示
order = 4のとき、数字の「4」の画像が表示
order = 5のとき、数字の「5」の画像が表示
order = 6のとき、数字の「6」の画像が表示
order = 7のとき、数字の「7」の画像が表示
order = 8のとき、数字の「8」の画像が表示
order = 9のとき、数字の「9」の画像が表示
order = 10のとき、数字の「0」の画像が表示
order = 11のとき、空白の画像が表示

となるように設定してください。PlateImageの宣言で暗黙にorderの定義が行われているアレです。
具体的には

NumberOfPlate = 11
PlateImage1 = 「1」を表示する画像の下半分.png
PlateImage2 = 「1」を表示する画像の上半分.png
PlateImage3 = 「2」を表示する画像の下半分.png
PlateImage4 = 「2」を表示する画像の上半分.png
PlateImage5 = 「3」を表示する画像の下半分.png
PlateImage6 = 「3」を表示する画像の上半分.png
PlateImage7 = 「4」を表示する画像の下半分.png
PlateImage8 = 「4」を表示する画像の上半分.png
PlateImage9 = 「5」を表示する画像の下半分.png
PlateImage10 = 「5」を表示する画像の上半分.png
PlateImage11 = 「6」を表示する画像の下半分.png
PlateImage12 = 「6」を表示する画像の上半分.png
PlateImage13 = 「7」を表示する画像の下半分.png
PlateImage14 = 「7」を表示する画像の上半分.png
PlateImage15 = 「8」を表示する画像の下半分.png
PlateImage16 = 「8」を表示する画像の上半分.png
PlateImage17 = 「9」を表示する画像の下半分.png
PlateImage18 = 「9」を表示する画像の上半分.png
PlateImage19 = 「0」を表示する画像の下半分.png
PlateImage20 = 「0」を表示する画像の上半分.png
PlateImage21 = 空白の画像の下半分.png
PlateImage0 = 空白の画像の上半分.png

となるように画像を設定してください。

Light属性の回転機について

α3版からLight属性の回転機(といっても板が回転するのではなくeventによって表示する画像を変えるパーツ)が使えるようになりました。
Light属性の回転機を定義する子設定ファイルでは各画像を

Image0 = img.png

のように定義しますが、通常の回転機での定義とは違い、Image番号とorder番号は同一になります。(通常はorder番号=PlateImage番号/2ですね(但し最後のorderは例外))
ソレ以外は通常の回転機と全く同じように定義、適用することができます。

バージョン

現在のバージョン

ver1(15/3/6)
エラー出力を大幅に強化しました。error.logから変換に失敗した原因を知ることができます。
デバッグモードも実装しました。

※BOM問題について:一応対策は施しましたが手元の環境で問題が再現できなかったためよくわかりません。Windows付属のメモ帳は使わないほうが無難だと思われます。

以前のバージョン

α2(14/1/8)
発車分情報が「00」のところに、minの1の位を示す回転機のorderに0(無限回転)を代入するバグを修正しました。
α1(14/1/6)
とりあえず公開