ドナドナされるプログラマのメモ

Windows用アプリのプログラミングメモ

枕木の自動配置

 背景

嫌なことに気づいてしまった。勾配ごとに枕木の本数が決まっているということは、曲線レールや直線レールも勾配ごとに枕木の本数が違うということか。直線なら3パターン、曲線なら2パターン。今までは手計算&手動配置でやっていたけど、これは無理だ。何らかの自動化をしないと、面倒な作業が増え続けてしまう。

自動化方法は、3パターンぐらいは思いつく。

  1. Unity上にマップエディタを構築し、レールを置いたときに枕木を自動配置する。
    いつかはやりたいけど、あまりにも工数が多い。しかも、ヤードのシミュレーションという本題からも外れている。
  2. Unity上のスクリプトにより、指定のレールに対し枕木を自動配置する。
    工数はそんなに多くなさそう。Runしていない状態でモデル情報をいじる必要がある。
  3. SketchUp!上のスクリプトにより、指定のレールに対し枕木を自動配置する。
    工数はそんなに多くなさそう。Rubyを学ぶ必要がある。

2.のRunしていない状態でモデル情報をいじるのは将来必要な技術な感じがするけど、Rubyの難易度は低そうだし今回は3.で行ってみることにする。

 

スクリプトの仕様

概略仕様

  • スクリプトを実行すると、現在選択されているコンポーネントをコピーし所定の位置・角度に貼り付ける。
  • 位置及び角度はレール長さおよび枕木本数、カーブ方向から自動計算する。
  • 枕木本数、カーブ方向はGUIにて入力する。
  • 使用頻度は低いので、プラグイン化はしない。
  • 演算は基本的にmmとし、SketchUp!のAPIを呼び出すときにインチへと変換する。
  • RailroadTiePositionクラスで座標を演算し、メインの関数でコピペ処理をする。

詳細仕様

RailroadTiePosition
  • 概要
    枕木の位置を計算する。また、計算に必要な値を設定するためのGUIを表示する。
  • メンバ変数
    @length: レール長さ
    @num: 枕木本数
    @dir: カーブの向き。"str", "left", "right", "up", "down"のいずれか
    @radius: カーブの半径
    @x, @y, @z, @rx, @ry, @rz
  • メソッド
    ・initialize
     変数の初期化
    ・showGUI
      値を設定するGUIを表示する
    ・calc
     設定値から枕木座標を計算する
    ・@x, @y, @z, @rx, @ry, @rzに対するアクセス関数( attr_accessorで実現)

覚えたことのメモ

  • かんたんなダイアログボックスはUI.inputboxで作れる。
  • SketchUp!内部の座標単位はinch。そのため、中間計算はmmであってもSketchUp!にわたす際には.mmを用いてinchに変換する必要がある。変換の詳細はClass:Numericにある。
  • eachもいいが、mapも良い。