本日はBlender枠です。Blenderでポリゴンを可視化するツールを作成しています。
今回はアドオンとして仕上げていきます。
〇bl_info
Blenderではアドオンとして正式に登録するためにはbl_infoという辞書形式のデータの定義が必要です。
これはアドオンとして使用する場合は必須の項目でBlender内でどのように機能が組み込まれるのかというのを定義し、対応バージョンなどをユーザーに提供します。
bl_info = { "name": "TrianglesCounter", "author": "HoloMoto", "version": (1, 0,0), "blender": (3, 4, 0), "location": "View3D > UI > My Panel", "description": "TrianglesCounter", "warning": "", "doc_url": "", "category": "3D View", } import bpy ・・・
bl_infoを加えた状態で任意のファイルエクスプローラーのディレクトリにTrianglesCounter.pyファイルを作成します。(txtファイルを作成して拡張子を変更)
TrianglesConter.pyの内部にコードを記述します。
Blenderを開きプリファレンス画面からインストールを選択しTrianglesConter.pyをインストールします。
これによってbl_infoに記述した情報としてアドオンが登録されます。
以上で登録が完了しました。
〇BlenderにおいてPythonスクリプトとアドオンの違い
筆者がBlenderでPythonを書くようになってアドオンとスクリプトの違いについて自分の中の定義があいまいになっていたので改めて調べてまとめます。
それぞれの簡単な違いは次になります。
Pythonスクリプト | アドオン | |
---|---|---|
実行方法 | 手動で実行 | Blenderに組み込まれる |
ユーザーインターフェース表示 | 表示されない | 表示される |
bl_info 定義 |
不要 | 必要 |
高度な機能 | 制限的 | 利用可能 |
Blender機能へのアクセス | 制限的 | 容易 |
永続性 | 一時的な実行 | Blender起動時に読み込む |
保存 | 保存されない | Blenderに保存 |
一番の違いとしては永続性と実行が手動/自動というところでしょうか
〇コード全文
bl_info = { "name": "TrianglesCounter", "author": "HoloMoto", "version": (1, 0,0), "blender": (3, 4, 0), "location": "View3D > UI > My Panel", "description": "TrianglesCounter", "warning": "", "doc_url": "", "category": "3D View", } import bpy bpy.types.Scene.triangles_mode = bpy.props.BoolProperty( name="Triangles Mode", description="If enabled, perform the calculation as triangles", default=True, ) class OBJECT_OT_calculate_polygons(bpy.types.Operator): bl_idname = "object.calculate_polygons" bl_label = "Calculate Polygons" def execute(self, context): triangles_mode = bpy.context.scene.triangles_mode # ここで 'triangles_mode' を正しく取得 selected_objects = bpy.context.selected_objects for obj in selected_objects: if obj.type == 'MESH': poly_count = 0 # ポリゴン数の初期値を設定 if triangles_mode: # 編集モードに切り替えてすべてのメッシュ要素を選択 bpy.context.view_layer.objects.active = obj bpy.ops.object.mode_set(mode='EDIT') bpy.ops.mesh.select_all(action='SELECT') # 三角化モディファイアを適用 bpy.ops.mesh.quads_convert_to_tris(quad_method='BEAUTY', ngon_method='BEAUTY') # 編集モードを終了 bpy.ops.object.mode_set(mode='OBJECT') # ポリゴン数を計算 poly_count = len(obj.data.polygons) obj["poly_count"] = poly_count return {'FINISHED'} class CustomPanel(bpy.types.Panel): bl_idname = "OBJECT_PT_custom_panel" bl_label = "Custom Panel" bl_space_type = 'VIEW_3D' bl_region_type = 'UI' bl_category = 'Custom' def draw(self, context): layout = self.layout layout.operator("object.calculate_polygons", text="Calculate Polygons") layout.prop(context.scene, 'triangles_mode', text="Triangles Mode") for obj in bpy.context.selected_objects: if obj.type == 'MESH': row = layout.row() row.label(text=f'Object: {obj.name}') row.prop(obj, '["poly_count"]', text="Polygons") def register(): bpy.utils.register_class(OBJECT_OT_calculate_polygons) bpy.utils.register_class(CustomPanel) def unregister(): bpy.utils.unregister_class(OBJECT_OT_calculate_polygons) bpy.utils.unregister_class(CustomPanel) if __name__ == "__main__": register()