ページ

2010年7月24日土曜日

Observerプラグインの紹介

僕が使用している数種類のObserverのうち、最近作成したプラグインを紹介します。ちなみにObserverの英語の意味は知りませんが、SketchUpではトリガーと同様の意味で解釈できます。ある条件が満足されたら自動的に実行されるプログラムのことです。

さて、SketchUpでは寸法を記入する機能が思い切り妥協されていますので、普段は寸法ツールをあまり使いません。寸法を測りたい時は線ツールかエンティティ情報かメジャーツールを使用します。しかし、他人が作ったモデルをコンポーネントとして使用する際に、その形状が正しいかを確認する作業は、やはり寸法が記入されている方が楽です。そんな訳で「見た目で邪魔にならないならばモデルには寸法が記入されている方が良い」と考え、このプラグインを開発しました。

ずばり、寸法を記入したら自動的にそのレイヤを「dimension」に変更するプラグインです。

下記をテキストファイルにコピペして拡張子を.rbに変更してPluginsフォルダに保存すると有効になります。これが有効な環境下で作成されたモデルでは、寸法がコンポーネントの中に記入されていようと、グループの中に記入されていようと、「レイヤ」ウィンドウでワンクリックで表示、非表示を切り換えできます。

class MyEntitiesObserver < Sketchup::EntitiesObserver
  def onElementAdded(entities, entity)
    if entity.kind_of?(Sketchup::Drawingelement) and (entity.typename=="DimensionLinear" or entity.typename=="DimensionRadial") then
      layer = entity.model.layers.add "dimension"
      entity.layer = layer
    end #if
  end #def
end #class
Sketchup.active_model.entities.add_observer(MyEntitiesObserver.new)

1行目:既存のクラスを参照する形式でクラスを作成
2行目:メソッドを作成(名前は変更できません)
3行目:追加されたエンティティが寸法かを判定
4行目:特定のレイヤを作成(既存だとしても問題なし)
5行目:エンティティのレイヤを変更
6,7,8行目:ブロック定義の終了を宣言
9行目:SketchUpのEntitiesクラスにObserverを追加

2010年7月23日金曜日

ビデオチュートリアル日本語版

画面がちょっと古いSketchUpですが、それでも英語よりはマシと思う方はSketchUp JAPANのWebページのビデオチュートリアルをどうぞ。
http://www.gsu.jp/tutorial

動画ではありませんが、山形雄次郎さんのWebページもわかりやすいと思います。
http://ayy18.exblog.jp/d2007-04-01

2010年7月22日木曜日

稀に役立つスクリプト(その1)

2本のエッジが交差または最も近接している場所にガイドポイントを描くスクリプトです。電線や配管などのモデルを作る際に、「この2本の間を最短距離で繋ぎたいんだけど」という場合に使います。

2本のエッジを選択した状態で「Ruby コンソール」に以下を入力して下さい。

m=Sketchup.active_model
s=m.selection
e=m.active_entities
p=Geom.closest_points s[0].line,s[1].line
p.each {|i| e.add_cpoint i}

1行目:変数mにModelクラスを登録。
2行目:変数sにSelectionクラスを登録。
3行目:変数eにEntitiesクラスを登録。
4行目:変数pに近接点の座標(2個)を登録。
(2本のLineクラスを元にGeomクラスのclosest_pointsメソッドで算出させる)
5行目:その座標にガイドポイントを描く。

画像を拡大表示しないとわかりませんが、マゼンタの2点が最近接点です。

僕はこの処理を下記の様に1行にまとめてテキストファイルに保存しています。
model=Sketchup.active_model;(Geom.closest_points model.selection[0].line,model.selection[1].line).each {|i| model.active_entities.add_cpoint i}

この様な、ツールバーやメニューに常駐させるほどの使用頻度ではないシンプルなスクリプトを多数、1個のテキストファイルにまとめ、必要に応じてその中の1行だけをコピペする、という使い方もお奨めです。ちょっと複雑なプラグインを開発する際の辞書代わりにもなります。

2010年7月21日水曜日

役に立たないスクリプト(その1)

プラグインの味見の味見くらいで・・・。

少し軽めのモデルを開き、Ruby コンソールに下記を入力すると面が50インチずつプッシュプルされます。(直方体だとあまり面白い結果にはならない)
Sketchup.active_model.start_operation "test"
e=[]
Sketchup.active_model.active_entities.each{|i| e<<i if i.kind_of?(Sketchup::Face)}
e.each{|i| i.pushpull 50}

1行目:2行目以降の処理の結果を1回の「元に戻す」で戻せるように宣言。
2行目:変数(リスト)を作成。
3行目:面のオブジェクトだけをリストに追加。
4行目:面を1つずつプッシュプル




ちなみに、2行目と4行目を省略しようとして下記の通り入力すると、モデルによってはハングアップに近い状態になってしまうためご注意下さい。(繰り返し処理の途中で処理の対象が増減しかねないため)
Sketchup.active_model.active_entities.each{|i| i.pushpull 50 if i.kind_of?(Sketchup::Face)}

良く使うプラグイン

PurgeAll.rb
使用されていないコンポーネント、マテリアル、レイヤ、スタイルを削除します。無駄が削除されるとファイルサイズが小さくなります。

cleanup_model.rb
面を持っていない線を消します。線を消しても面が維持される場合はその線も消します。最新版では改善されているかもしれませんが、部分的に面が消えてしまうことがあったので少し改造して使ってます。

2010年7月18日日曜日

プラグインを作ろうと思う3つの理由

理由;
  1. 数十回のクリックが必要となる処理を数回のクリックに抑えたい。
  2. 標準機能にはない機能を追加したい。
  3. 単純な処理でも多数のファイルまたはコンポーネントを対象に処理したい。
背景;
  まだ誰もそのプラグインを公開していなかった、または見つけられなかった。

ちなみに、僕が開発するプラグインは理由3に偏っています。作る上での技術レベルとしては理由2が最も難しいので、いくつかアイデアはあるのですが力不足で実現できていません。例えば、下記はSketchUpを使い始めた当初から感じているのですが、実現できないままです。
  • 円ツールとポリゴンツールを回転ツールまたは分度器ツールの様に、中心軸をドラッグで指定できるようにしたい。
  • ポリゴンツールでは対角半径だけでなく対面半径でも指定できるようにしたい。
技術が向上したら挑戦したい課題ですが、誰かが先に作るような気もします。

2010年7月17日土曜日

プラグインの実行

完成したプラグインは使いやすいようにツールバーを作ったりメニューを作ったりしますが、開発中はそうでもありません。プラグインの実行方法を何種類か紹介しておきます。

1.直接入力
例えば、「Ruby コンソール」に「Sketchup.active_model.entities.add_cpoint [0,0,0]」と入力すると原点にガイドポイントが追加されます。以下の欠点がありますが、使用頻度は高いです。
・1行で完結する処理しか実行できない。
・日本語が使えない。

2.ファイル読み込み
未完成のプラグインは、SketchUp起動時に自動的に読み込まれることを避けるため、Pluginsフォルダには置きたくないものです。その場合は適当なサブフォルダを作り、そこに保存しておけば自動読み込みされることもなく、任意のタイミングで試用することができます。例えば、「Ruby コンソール」に「load "test/test.rb"」と入力すると「C:\Program Files\Google\Google SketchUp 7\Plugins\test\test.rb」が読み込まれます。「Ruby Toolbar」の「Load Script」ボタンを使えばもっと楽に実行できます。

ファイル読み込みの場合は、そのファイルの記述要領によって処理が実行されたり、処理を実行するための関数が定義されたりします。例えば、次の記述は処理が実行されます。
Sketchup.active_model.entities.add_cpoint [0,0,0]

例えば、次の記述はファイル読み込みした後で、「Ruby コンソール」に「Test.test」と入力することで処理が実行されます。
module Test
  def self.test(position=[0,0,0])
    Sketchup.active_model.entities.add_cpoint position
  end #def
end #module