kairo-gokko (11) スイッチを追加



導線と電池のプラス極・マイナス極だけでは寂しいですね。とりあえずスイッチを追加しましょうか。 まだ電気を流して回路を動かすことはできないので描画するだけです。


LibreOffice Draw で元データを作ります。 data_01.fodg の 4 ページ目を追加。 sw というテキストを持っている矩形を追加します。

f:id:sonota88:20200228065203p:plain

後は今までやってきたことと大体同じですね。


Unit::Switch クラスを追加。

module Unit
  # ...
  class Switch < SingleCell
    def initialize(pos)
      super

      # ON: true / OFF: false
      @state = false
    end

    def to_plain
      {
        pos: @pos.to_plain
      }
    end

    def self.from_plain(plain)
      Switch.new(
        Point.from_plain(plain["pos"])
      )
    end
  end

テキストが sw になっている矩形を探して Switch オブジェクトにします。

class Circuit
  # ...
  def self.create(lines, rects)
    # ...

    switches =
      rects
        .select { |rect| rect.text == "sw" }
        .map { |rect| to_switch(rect) }

    # ...

描画。

class View
  # ...
  def draw_switch(switch)
    @drawer.draw_box_fill(
      switch.x + 0.1, switch.y + 0.1,
      switch.x + 0.9, switch.y + 0.9,
      C_BLACK
    )

    @drawer.draw_box(
      switch.x + 0.1, switch.y + 0.1,
      switch.x + 0.9, switch.y + 0.9,
      C_INACTIVE
    )

    @drawer.draw_box_fill(
      switch.x + 0.3, switch.y + 0.6,
      switch.x + 0.7, switch.y + 0.7,
      C_INACTIVE
    )
  end

BROWSER=1 ./run.sh data_01.fodg 4
で実行するとこんな感じです。

f:id:sonota88:20200228065632p:plain

ついでに色を調整しました。 まだ電気を流せていないので、導線とスイッチは暗い緑色にしています。


形がスイッチっぽく見えないかもしれませんが、

f:id:sonota88:20200313045810p:plain

たとえばこういう形だと方向を気にしないといけなくて (縦か横かで表示を切り替えないといけない)めんどくさいんですよね。 配線の角の部分に置くのは禁止すべきか? とか考えないといけないし。

最低限 ON/OFF の状態が分かればいい訳ですし、 ひとまず縦でも横でも両方対応できる形にしました。 後で気が変わったらいくらでも凝ったものにすればいいと思います。