Google SketchUp の API は ruby !

http://sketchup.google.com/
http://sketchup.google.com/support/bin/search.py?query=ruby
先日公開された Google SketchUpAPI はなんと ruby*1 ! ということで rubyist の間では話題になってたりなかったりします。ということで早速使ってみて RSS を読み込んで表示する単純な Plugin を書いてみました。表示はこんな感じ。

API のドキュメントがまとまっている*2 し、サンプルコードもあるので ruby 使える人ならすぐにでも Plugin 書くことができると思います。使い方も簡単で Plugins ディレクトリに .rb ファイルを放り込むだけ。また window -> ruby Console から対話型のコンソールを使えるので簡単な動作テストが簡単にできるでしょう。

しかし、RSS を読み込むのに大きな問題点があったのです。それは SketchUp に組み込んである ruby では socket 周りが使えない、つまり http でデータの取得ができないのです。セキュリティ考えると解る気もしますが…。
というわけでどうしようもないので `` 使って windows にインストールしてある ruby 叩いてます…。また RSS::Parser も windows にインストールしてある ruby ライブラリの Path を LOADPATH に追加して使ってるので、下記 Plugin を動かすのに windows の ruby が必要だったりします。うーん。

とはいえ、ruby 使って簡単に操作や SketchUp 上のオブジェクトの作成ができるので、ruby 大好きな人は弄ってみると面白いと思いますよ。

以下 RSS 表示スクリプト。Plugins ディレクトリに rssreader.rb という名前で保存してから起動すると、Draw メニューの中に RSSReader というサブメニューが追加されていると思います。

require 'sketchup.rb'

$LOAD_PATH << 'C:\ruby\lib\ruby\1.8'
require 'rss/1.0'
require 'rss/2.0'


class RSSReader
  def initialize
    @model = Sketchup.active_model
    @entities = @model.entities
    @boxes = 0
  end

  def input
    uri = inputbox(['URL'], ['http://d.hatena.ne.jp/secondlife/rss'], "RSS URL").first
    rss_draw uri
  end

  def draw(title)
    @entities.add_text(
                       title,
                       [100 * (@boxes % 4), 10 + @boxes / 4 * 100,-1]
                      )
    @boxes += 1
  end

  def rss_draw(uri)
    source = `ruby -r 'open-uri' -e 'puts open("#{uri}").read'`
    RSS::Parser.parse(source).items.each do |item|
      draw item.title
    end
  end
end

if( not file_loaded?("rssreader.rb") )
    add_separator_to_menu($exStrings.GetString("Draw"))
    UI.menu($exStrings.GetString("Draw")).add_item($exStrings.GetString("RSSReader")) { RSSReader.new.input }
end

file_loaded("rssreader.rb")

*1:1.8.0 ベース

*2:インストールディレクトリ/ruby/docs/ 以下に html があります