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用の独自のプラグインを作成していただければ幸いです。

Source: https://habr.com/ru/post/J115166/


All Articles