トックのCG部屋-トップ別室へ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

プログラミングメモ(Blenderアドオンの作り方)

自分の作ったスクリプトをBlenderのメニューに登録して使うために
最低限これをやれば動くってことをメモ書き
というかまぁ載せたサンプルコードがまんまテンプレに使えるかも
ただ、本当に自分で使う最低限のことしかやってないから
配布するとかならもうちょっとちゃんと仕様を調べて作ってね
ちなみにバージョンは2.5系
2.4以前は全然違うから別なところをあたってね

いつも通り追記で

一番簡単なアドオンのテンプレ
アドオンにはいろいろなタイプがあるっぽいけど
今回対象にしてるのは3DViewやInfoパネルのメニューに登録して、
パラメタも何もいらない簡単な処理
例えば

  • 今選択されている中からメッシュだけ選択したい
  • すべてのメッシュの大きさを1/10にしたい
  • ファイル名は固定でいいから独自の形式でデータを出力したい
とかっていうのを使いたいって場合
まぁ簡単な処理って言ってもユーザの入力がいらないのであればできることは多いんじゃないかな

サンプルコード

import bpy

bl_info = {
    "name":"Sample Addon",
    "description":"Sample code of Add-on.",
    "category":"Object"}

class SampleAddon(bpy.types.Operator):
    bl_idname = "test.sample_addon"
    bl_label = "Sample Addon"

    def execute(self, context):
        for obj in context.selected_objects:
            print(obj.name)
        return {'FINISHED'}

def menu_func(self, context):
    self.layout.operator(SampleAddon.bl_idname,text="Sample Addon")

def register():
    bpy.utils.register_module(__name__)
    bpy.types.VIEW3D_MT_object.append(menu_func)

def unregister():
    bpy.utils.unregister_module(__name__)
    bpy.types.VIEW3D_MT_object.remove(menu_func)

if __name__ == "__main__":
    register()

サンプルの実行例

実行というか登録というかまぁやってみた結果
登録
こんな感じで登録できて
メニューから実行
こんな感じで実行できる

簡単な説明

自分はこういうことだと解釈した
ってものだから割と怪しい

bl_info

アドオンの情報を辞書型で定義する
これがないとアドオンにならないらしい

  • name
  • アドオンの名前(必須)。ないとAddon関係登録がバグって面倒なことになる。

  • description
  • アドオンの説明。必須ではないけどあった方がいいよね。

  • category
  • アドオンのカテゴリ(必須)。ないと以下略。アドオン登録のところにあるcategoriesの中から選ぶ。

あと、アドオンの作者とかアドオン、Blender、APIのバージョンとかUIの位置とか
いろいろあるにはあるけど、自分で使う分には必要ないと思う
ちゃんとした仕様が知りたければここ

class SampleAddon(bpy.types.Operator)

アドオンとして登録する機能のクラス……って言ったらいいのかなぁ
もちろんクラス名はこれじゃなくてもいいから
自分が書くスクリプトに合わせてちゃんとつけてね

  • bl_idname
  • Blenderの機能として登録される時の関数名のようなものになるっぽい
    微妙に命名規則があって、"××.○○"で大文字は使用不可(スネークケース推奨?)
    まぁたぶん"モジュール名.関数名"みたいなもんだと思うんだけど"○○"だけや"××.△△.○○"もダメ

  • bl_label
  • たぶん機能の名前

  • def execute(self, context)
  • 実行時の処理
    要するにここがスクリプトの本体

def menu_func(self, context)

メニューに登録、削除する時に呼ばれるコールバック関数らしい
とりあえず
self.layout.operator(アドオンクラス(上のやつ).bl_idname,text="表示するときの名前")
ってのを書いておけばたぶん大丈夫
ちなみに関数名は自分が参考にしたのがそうなってただけで別にmenu_funcじゃなくてもいい
そもそも1ファイルで複数の機能を登録しようと思ったらこの関数も複数必要なはず

def register()/def unregister()

アドオンの登録/削除のための関数
一行目はどっちもお約束ってことでいいと思う(今回のパターンだと)

二行目が機能の登録
append/removeの引数は上のmenu_funcにあたる関数
複数の機能を追加したり、複数の場所に追加したりしたいときは
二行目と同じように三行目以降を追加していけばいいはず

ここでappend/removeの前、つまりbpy.types.○○ってのが
その機能をどこに登録するかってっとこなんだけど
今回のbpy.types.VIEW3D_MT_objectっていうのは
3DViewのメニューのObjectの中
どうやらbpy.types.パネル名_要素名_子要素_孫要素...ってなって感じで
すでに定義されてるものの中から選べばいいっぽいんだけど
どれがどうなってるか詳細はわからない
一応定義されているものを知りたければ
Pythonコンソールで"dir(bpy.types)"って入れてモジュールの中覗けばそれっぽいのが見つかるはず
よく使いそうなものをいくつか書いておくと

  • VIEW3D_MT_object
  • VIEW3D_MT_select_object(オブジェクトモードのSelect?)
  • INFO_MT_mesh_add(Add->Mesh)
  • INFO_MT_file_export(File->Export)
まぁあとは推測したり上の方法とかでそれっぽいの探してみてね
ちなみに登録する場所と機能の中身は関係なくてもいい
おすすめはしないけど

if __name__ == "__main__"

たぶんこの2行はお約束
一番下のところに書いておけばいいと思う


とまぁこんな感じで書けばアドオンとして登録できるっぽいよ
もちろんやりたいことによってはこれとは全く違う書き方しなきゃいけないものもあるけど
まぁそれはがんばって調べてねってことで


以下どうでもいい雑記

2.4以前に比べてすげーめんどくさくなったなぁという印象
確かコメントにヘッダをちょっと書けばいいだけだった気がするんだけど……
まぁ柔軟性は今の方が圧倒的にいいんだろうけどさ

今回微妙に詰まったのがbl_idnameに大文字が入ってると動かないってとこ
Javaが第一言語だから普段はキャメルケースで名前つけてるんだけど
そのノリで書いたらあれ?って話
Pythonの命名規則ってどうなってるかよくわからないけど
標準ライブラリでもパッと見いろいろな文化が混在してるように思える
まぁ気のせいだろうけど
  1. 2011/11/24(木) 02:15:03|
  2. Blender
  3. | トラックバック:0
  4. | コメント:0
<<戦闘空母その3 | ホーム | 敵戦艦その1>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://took.blog72.fc2.com/tb.php/752-a059afb2
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

トック

Author:トック

プロフィール(仮)

twitter:elgraiv_took
└ブログ更新情報

twitter:elgraiv_take
└無駄な日常つぶやき用

FC2カウンター

コンテンツ一覧

本棚

最近の記事

カテゴリー

月別アーカイブ

ブログ内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。