本日は昨日に引き続き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の行を追加するコードです。
ここで枠を追加し、ラベルとプロパティを追加しています。
ラベルはテキストとしてオブジェクト名、プロパティはポリゴン数を表示しています。
この改修によってポリゴン数が多い順というソートが外れてしまっています。

こちらは次回改善していきます。