本日はBlenderモデリング枠です。
先日選択しているオブジェクトのポリゴン数を取得して多い順にソートしてコンソールウィンドウに表示する機能を作成しました。
前回の状態ではいちいちすべてのオブジェクトを選択してスクリプティングウィンドウでコードを実行する必要がありました。
今回はこのあたりを改善していきます。
〇BlenderでUIでコードを実行する。
Blenderでビューポートにタブを追加するコードは以前触っています。
こちらをベースに進めていきます。
〇コード全文
今回作成したコードは次になります。
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を選択することでコンソールに昨日同様ポリゴン数が多い順に表示されるようになります。
本日は以上です。