分けます。
今の段階でいえば、元データを整形して Unit::Edge
や Unit::PlusPole
に変換する部分が前処理、
描画部分が実行処理に当たります。
- 前処理(データの整形)の部分は LibreOffice Draw で編集して元データが変更されたときに 1回だけ動けばよい。実行時に毎回やらなくてよい。
- 実行部分に DXOpal を使おうとしているので、 起動時間(実行が始まるまでの時間)を短縮するために依存するコンポーネントをなるべく減らしたい
のような理由です。
前処理したデータは一度シリアライズしてファイルに出力し、 実行の際はそれを読むようにします。
to_plain, from_plain
シリアライズ、デシリアライズのためのメソッドを追加します。
たとえば Circuit
はこんな感じ。ハッシュにしたり、逆にハッシュから復元したり。
def to_plain { edges: @edges .map { |it| it.to_plain }, plus_poles: @plus_poles .map { |it| it.to_plain }, minus_poles: @minus_poles.map { |it| it.to_plain } } end def self.from_plain(plain) edges = plain["edges" ].map { |it| Unit::Edge .from_plain(it) } plus_poles = plain["plus_poles" ].map { |it| Unit::PlusPole .from_plain(it) } minus_poles = plain["minus_poles"].map { |it| Unit::MinusPole.from_plain(it) } Circuit.new( edges, plus_poles, minus_poles ) end
野暮ったいですが気にしない。
preprocess.rb
circuit
オブジェクトができたら data.json
に出力します。
print JSON.pretty_generate(circuit.to_plain)
viewer.rb
data.json
を読んで circuit
オブジェクトを復元します。
ファイル名はいったん決め打ちで。
json = File.read("data.json") circuit = Circuit.from_plain( JSON.parse(json) )
run.sh
別々に実行できるようになったとはいえ、 毎回両方とも実行出来たほうが今のところ便利なので、両方とも実行するシェルスクリプトを用意します。
前処理では Bundler で管理している gem を使っていないので bundle exec
は不要。
#!/bin/bash set -o errexit ruby preprocess.rb "$@" > data.json bundle exec ruby viewer.rb
./run.sh data_01.fodg 3
のように実行すると、
今までのように動かせます。