Google SketchUp用のプラグインの作成

Google SketchUpは、3次元グラフィックスをすばやく作成および編集するためのプログラムです。 利便性とシンプルさSketchUpは、3Dモデリングの初心者とプロの両方に高く評価されます。



しかし、SketchUpに強力なAPIがあり、プログラムに新しい機能を追加してモジュールを作成できることを誰もが知っているわけではありません。 この投稿では、SketchUpアーキテクチャの一般原則とプラグイン開発プロセスを説明しようとします。 新しいプラグインバイクを作成する前に、 Sketchucation Webサイトで、必要な機能を備えた既製の実装を確認する必要があります。 適切なオープンソースプラグインを見つけたら、必要な機能を実装して、コードの主要部分をそのままにすることができます。 たとえば、プラグインはいくつかの計算と構築を行い、ユーザーはそれらのアプリケーションまたは視覚化のみを変更します。



SketchUpのプラグインはRubyで記述されています。



Google Codeは公式の開発ドキュメントを提供します。 3つのセクションで構成されています:はじめに、クイックリファレンス、オブジェクトリファレンス。



1)はじめに-簡単なプラグインの作成例を示す紹介セクション。

2)クイックリファレンス-クラス、メソッドのリファレンスセクション。

3)オブジェクト参照-SketchUpオブジェクトモデルの参照セクション。 オブジェクト階層は非常に便利なグループに分割されているため、コードの記述に必要なクラスをすばやく検索できます。



プラグイン開発の例を、私自身のプラクティスから取り上げます。 便宜上、SketchUpでは利用できなかった追加機能が必要でした。 タスクは、オブジェクトのサイズ(幅、高さ、厚さ)を迅速かつ便利に決定することでした。 この機能を備えた既製のプラグイン-GetDimensionsが見つかりましたが、大きなマイナスがありました:MessageBoxのサイズが表示され、常に閉じなければならないため、特定の不便が生じました。 彼のコードを調べて、結果の出力を変更することにしました。



GetDimensionsプラグインコード:



require 'sketchup.rb'

def get_dimensions

model = Sketchup.active_model

mname = model.title

Sketchup::set_status_text(( "GET COMPONENT DIMENSIONS..." ), SB_PROMPT)

Sketchup::set_status_text( " " , SB_VCB_LABEL)

Sketchup::set_status_text( " " , SB_VCB_VALUE)

boundingBox = model.selection[0].bounds

dims = [ boundingBox.height,

boundingBox.width,

boundingBox.depth ]

dims.sort!



UI.messagebox( "Thickness: " + dims[0].to_s + "\nWidth: " + dims[1].to_s + "\nLength: " + dims[2].to_s)

end



if ( not file_loaded?( "GetDimensions.rb" ) )

add_separator_to_menu( "Plugins" )

UI.menu( "Plugins" ).add_item( "Get Dimensions" ) { get_dimensions }

end



file_loaded( "GetDimensions.rb" )




* This source code was highlighted with Source Code Highlighter .








コードは、プラグインロジック( get_dimensions



)、メニュー項目の追加( get_dimensions



> Get Dimensions )、およびプラグインファイル自体のシステムへのロード( GetDimensions.rb )で構成されています。



インストールするには、プラグインをディレクトリ「 C:\ Program Files \ Google \ Google SketchUp \ Plugins \ 」にコピーする必要があり、プログラムは起動時にこのフォルダーからすべてのスクリプトを自動的にロードします。



画像の構造を格納する主なオブジェクトはmodel



です。



このプラグインでは、最初に選択されたオブジェクトとその寸法が取得されます。 サイズは昇順で並べ替えられ、メッセージボックスに表示されます。プラグインの名前はステータスバーに表示されます。



ステータスバーはすぐに興味を持ち、受け取ったサイズの出力をそれに転送することにしました。



プラグインを少し修正した後、私はこれを達成することができました:



def get_dimensions

model = Sketchup.active_model

entities = model.entities

boundingBox = model.selection[0].bounds



dims = [ boundingBox.height,

boundingBox.width,

boundingBox.depth ]

dims.sort!



Sketchup::set_status_text(( "Thickness: " + dims[0].to_s + ". Width: " + dims[1].to_s + ". Length: " + dims[2].to_s ), SB_PROMPT)

end




* This source code was highlighted with Source Code Highlighter .








選択ツールを使用して要素を選択した後、メニューから「寸法を取得」コマンドを選択します。 その結果、ステータスバーに選択したアイテムの寸法が表示されます。 コマンドをより便利に呼び出すには、ホットキーを割り当てる必要があります。



Get Dimensions Result



次のステップは、オブジェクトを選択したときに寸法が自動的に表示されるようにすることでした。 2つのオプションが思い浮かびました。 選択ツールとして要素を選択すると同時に、以下のサイズを表示する独自のツールを作成するか、 選択ツールを選択してオブジェクトのサイズを表示するように選択ツールを変更することです。



Object Referenceを検索した後、2番目のメソッドを実装するというアイデアが生まれました。

判明したように、 Observer Classes-> SelectionObserverを使用すると、 選択ツールのイベントをサブスクライブできます。



変更後、プラグインロジックは2つのファイルに分割されました。



Dimensions_load.rb



require 'sketchup.rb'

require 'Dimensions/GetDimensions.rb'



$PluginMenuName = "Tools"

$DimensionsMenuName = "Dimensions Tool"

$GetDimensionsMenuItem = "Get Dimensions"

$AutoDisplayMenuItem = "Auto Display Dimensions"



if (not file_loaded?( "dimensions_load.rb" ))

pluginMenu = UI.menu($PluginMenuName)

dimensions = Dimensions. new

pluginMenu.add_separator

getDimensionsSubMenu = pluginMenu.add_submenu($DimensionsMenuName){}

getDimensionsSubMenu.add_item($GetDimensionsMenuItem){dimensions.get_selection_dimensions}

autoDisplayItem = getDimensionsSubMenu.add_item($AutoDisplayMenuItem){dimensions.connect_observer}

getDimensionsSubMenu.set_validation_proc(autoDisplayItem){dimensions.menu_checked}

end



file_loaded( "dimensions_load.rb" )




* This source code was highlighted with Source Code Highlighter .








GetDimensions.rb



require 'sketchup.rb'

class Dimensions < Sketchup::SelectionObserver

def initialize()

@usedObserver = false

end



def onSelectionBulkChange(selection)

get_dimensions(selection)

end



def get_selection_dimensions

get_dimensions(Sketchup.active_model.selection)

end



def get_dimensions(selection)

boundingBox = selection[0].bounds

dims = [ boundingBox.height,

boundingBox.width,

boundingBox.depth ]

dims.sort!

Sketchup::set_status_text(( "Thickness: " + dims[0].to_s + ". Width: " + dims[1].to_s + ". Length: " + dims[2].to_s ), SB_PROMPT)

end



def connect_observer

if (@usedObserver) then

return remove_observer

else

return add_observer

end

end



def add_observer

@usedObserver = true

Sketchup.active_model.selection.add_observer self

return MF_CHECKED

end



def remove_observer

@usedObserver = false

Sketchup.active_model.selection.remove_observer self

return MF_UNCHECKED

end



def menu_checked

if (@usedObserver) then

return MF_CHECKED

else

return MF_UNCHECKED

end

end

end



file_loaded( "GetDimensions.rb" )




* This source code was highlighted with Source Code Highlighter .








コードをより詳細に検討してください。



選択ツールのイベントをインターセプトできるようにするには、 SelectionObserver



クラスから継承し、オブジェクトがSketchup.active_model.selection.add_observer



れたときに呼び出されるonSelectionBulkChange(selection)



メソッドをオーバーライドし、 Sketchup.active_model.selection.add_observer



を使用してイベントをサブスクライブする必要があります。



プラグインは、 [ツール ] -> [寸法ツール ]メニューに移動しました。このメニューには、 [寸法を 取得]と[寸法自動表示 ]の2つのサブアイテムが含まれています。



前述したように、プラグインのタスクは、オブジェクトが選択されたときに自動的にオブジェクトのパラメーターを表示することでした。 なぜなら 追加の機能は必ずしも必要ではないため、無効にすることが決定されました。 寸法の自動表示 -適切なタイミングで有効にすることができ、 寸法の取得 -オンデマンドでプラグインを呼び出す-は、柔軟性を高めるために残されました。



Get Dimensions Menu



プラグインのソースコード。



ご覧のとおり、既存のプラグインのアップグレードは、ゼロから作成するよりもはるかに簡単です。 ところで、私は最初にRubyでコードを書きましたが、私の素晴らしいプログラミング経験のおかげで、構文を理解することは難しくありませんでした。



SketchUp用の独自のプラグインを作成していただければ幸いです。



All Articles