ページ

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を追加

4 件のコメント:

  1. コンポーネントの中で寸法を追記してもObserverは無反応でした・・・。うわぁぁぁ予想外。中途半端ですんまそん。Googleが悪いんだから許してね。

    返信削除
  2. ファイルを開いた時と新規作成した時にもこのObserverが機能しないことが判明。弱点だらけでしたが、これらの欠点は下記の追記により改善可能です。

    class MyAppObserver < Sketchup::AppObserver
    def onNewModel(model)
    Sketchup.active_model.entities.add_observer(MyEntitiesObserver.new)
    end #def
    def onOpenModel(model)
    Sketchup.active_model.entities.add_observer(MyEntitiesObserver.new)
    end #def
    end #class
    Sketchup.add_observer(MyAppObserver.new)

    処理の内容は、モデルを新規作成した時と開いた時にもこのクラスを実行してね、といったものです。

    返信削除
  3. 初めまして。

    僕はsketchupで寸法をかなり使用します。
    狭いところに使うと、寸法を消去できずに困っていました。
    寸法だけを消去できるプラグインを探していたところ、のびちさんのブログを見つけました。

    寸法を1つのレイヤにまとめ、不要となったときレイヤごと消去するというやり方で、目的が果たせました。本当に助かりました。ありがとう!

    返信削除
  4. Macさんへ。
    うは。放置してたブログにコメントもらえるなんて全く期待してませんでした。こんなもんがお役に立てたなら何よりです。
    コメントありがとうございました。

    返信削除