夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Blenderでポリゴン数が多い順にオブジェクトを表示する その⑤アドオンとして登録できるようにする

本日はBlender枠です。Blenderでポリゴンを可視化するツールを作成しています。

今回はアドオンとして仕上げていきます。

redhologerbera.hatenablog.com

〇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スクリプトとアドオンの違い

筆者がBlenderPythonを書くようになってアドオンとスクリプトの違いについて自分の中の定義があいまいになっていたので改めて調べてまとめます。

それぞれの簡単な違いは次になります。

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()