uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

groovyConsoleでお絵書き

本日、「プログラミングGroovy」の見本本が届きました。青がいい感じ!さすがプロの手腕だわ(最初はGroovyな感じじゃなくてCoolすぎる、とか文句言ってたのは内緒)。うちの奥さんは、一目見るなり、表紙のペンギンが気に入りました。ってそこか。
f:id:uehaj:20110701232035j:image:right

ということで、発売まで1日1エントリを目標に記事を書いていきたいと思います。今日もgroovyConsoleについてです。このプログラムはおもしろいわ。Groovy関係のソースコードを読めというならこれが一つの候補ですわ。

groovyConsoleでのスクリプトの実行結果は、Swingコンポーネントの任意のレンダラを適用することでビジュアルに表示できることは好き者には良く知られているところですが、これを応用して、任意のグラフィックスを表示できるようにしてみます。まず準備として、以下を「OutputTransforms.groovy」というファイル名で、~/.groovy/に*1保存しておきます。

import java.awt.*
import java.awt.geom.*
import java.awt.event.*
import javax.swing.*

class Canvas extends JPanel {
  public Canvas() {
    setSize(getPreferredSize());
    setBackground(Color.white);
  }
  public Dimension getPreferredSize() {
    return new Dimension(400, 400);
  }
  Closure p = null
  public void paintComponent(Graphics g) {
    if (p != null) {
      p(g)
    }
  }
}

panel = new Canvas()
transforms << { result ->
  if (result instanceof Closure && result.parameterTypes.size()==1) {
    panel.p = result
    return panel
  }
  result
}

そしてgroovyConsoleを(再)起動して、[View]-[Visualize Script Result]をチェックします。
f:id:uehaj:20110701235011p:image
これで準備はOKです。

そして以下のスクリプトをGroovyConsoleに入力します。

import java.awt.*
import java.awt.geom.*

{g->
(10..1).each { i ->
   circle = new Ellipse2D.Double(0, 0, 100+i*20, 100+i*20)
   g.with {
     setColor(new Color(i*5,i*20+10,i*10+100))
     fill(circle)
   }
  }
}

これは何かというと、Graphics gを引数に取って、そこに描画するクロージャですね。そして普通に実行します。実行結果はこんな感じ。

f:id:uehaj:20110701235633p:image

Swingコンポーネントは2箇所に同時に貼られることはできないので、出力エリアをクリアしないで実行を繰り返すと、JPanelはシェアされることによって、次へ次へと下に移動していくことになりますのでそれらしい。

さらにタートルグラフィックスのDSLを実行させてみたりすると面白いのではないかと思います。

*1:Windowsだと、c:\users\\.groovy\OutputTransforms.groovyのようです。[http://groovy.329449.n5.nabble.com/Where-to-put-OutputTransforms-groovy-under-Windows-td365798.html:title=ここ]参照。