本日は昨日に引き続きBlenderで数が多い順にオブジェクトを表示する機能を作成します。
昨日はUI上で実行できるようにしました。
今回はこちらを改良してUI上に結果も表示するようにします。
〇コード
前回まではコンソールウィンドウに結果を表示するようにしていました。
この状態では使いにくいという問題があります。
今回はこちらを改修していきます。
今回は以下のコードを使用します。
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 for obj in selected_objects: if obj.type == 'MESH': 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") 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()
こちらのコードを実行すると前回まで同様に3Dビューポート上にアドオンと同様にUIが表示されます。
今回の場合はCalculate Polygonsを選択するとオブジェクト名とポリゴン数がUI上に表示されるようになります。
この処理は以下のfor文で行っています。
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="")
bpy.context.selected_objectで現在選択してるオブジェクトの数ループ処理を行います
row = layout.row()
layout.rowメソッドはUIの行を追加するコードです。
ここで枠を追加し、ラベルとプロパティを追加しています。
ラベルはテキストとしてオブジェクト名、プロパティはポリゴン数を表示しています。
この改修によってポリゴン数が多い順というソートが外れてしまっています。
こちらは次回改善していきます。