夜風のMixedReality

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

Blenderでポリゴン数が多い順にオブジェクトを表示する その② UI

本日はBlenderモデリング枠です。

先日選択しているオブジェクトのポリゴン数を取得して多い順にソートしてコンソールウィンドウに表示する機能を作成しました。

redhologerbera.hatenablog.com

前回の状態ではいちいちすべてのオブジェクトを選択してスクリプティングウィンドウでコードを実行する必要がありました。

今回はこのあたりを改善していきます。

〇BlenderでUIでコードを実行する。

Blenderでビューポートにタブを追加するコードは以前触っています。

redhologerbera.hatenablog.com

こちらをベースに進めていきます。

〇コード全文

今回作成したコードは次になります。

import bpy

class OBJECT_OT_calculate_polygons(bpy.types.Operator):
    bl_idname = "object.calculate_polygons"
    bl_label = "Calculate Polygons"
    
    def execute(self, context):
        selected_objects = bpy.context.selected_objects
        poly_counts = []
        
        for obj in selected_objects:
            if obj.type == 'MESH':
                poly_count = len(obj.data.polygons)
                poly_counts.append((poly_count, obj.name))
        
        poly_counts.sort(reverse=True)
        
        for poly_count, obj_name in poly_counts:
            self.report({'INFO'}, f'Object: {obj_name}, Polygons: {poly_count}')
        
        return {'FINISHED'}

# Panel to display the button
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")

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

このスクリプトではOBJECT_OT_calculate_polygonsクラスに昨日作成したコードを流用しています。

class OBJECT_OT_calculate_polygons(bpy.types.Operator):
    bl_idname = "object.calculate_polygons"
    bl_label = "Calculate Polygons"
    
    def execute(self, context):
        selected_objects = bpy.context.selected_objects
        poly_counts = []
        
        for obj in selected_objects:
            if obj.type == 'MESH':
                poly_count = len(obj.data.polygons)
                poly_counts.append((poly_count, obj.name))
        
        poly_counts.sort(reverse=True)
        
        for poly_count, obj_name in poly_counts:
            self.report({'INFO'}, f'Object: {obj_name}, Polygons: {poly_count}')
        
        return {'FINISHED'}

引数のbpy.types.OperatorはBlenderでボタンの選択などで使用されるもので、これを使用することでexecuteメソッドをオーバーライドしています。

これはUI上でボタンを押した場合に本クラスを実行するようになります。

続いたCustomPanelクラスはUIを表示するためのクラスです。

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

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

冒頭のbl_〇〇で属性を定義しています。

drawメソッドでUIとして描画しています。

このスクリプトを実行することで3Dビューポート上にUIが表示されます。

このUIのCalculate Polygonsを選択することでコンソールに昨日同様ポリゴン数が多い順に表示されるようになります。

本日は以上です。