夜風のMixedReality

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

BlenderPythonで任意のショートカットキーで面の向きを可視化する

本日はBlender枠です。

Blenderではビューポートオーバーレイの面の向きにチェックを入れることで面の向きを可視化することができます。

これはエクスポート前に必ずチェックをする機能ですが、こまめに使用するためにはGUIを開いてチェックを入れてと何かとめんどうな工程があります。

今回はPythonを使用してこれを簡単にしていきます。

〇環境

・Windows11PC

・Blender4.1

〇面の向きをPythonを使用して可視化する。

まずはPython面の向きの値を変更できるのかを試していきます。

 結論から書くとbpy.context.space_data.overlay.show_face_orientationを使用することで可能です。

このコードは3Dビューポート上で実行可能のためスクリプトウィンドウから実行するためにエリアの確認を行います。

import bpy

# 現在のエリアが3Dビューか確認
area = next((area for area in bpy.context.window.screen.areas if area.type == 'VIEW_3D'), None)

if area is not None:
    # 3Dビューが存在する場合、そのスペースデータを操作
    for space in area.spaces:
        if space.type == 'VIEW_3D':
            space.overlay.show_face_orientation = True
            print("面の向きの可視化を有効にしました。")
else:
    print("3Dビューが見つかりません。")

このコードを実行することで面の向きが有効化します。

〇ショートカットで任意に変更可能にする

Pythonで面の向きのアクセスが可能であることが分かったので、次にショートカットキーによって任意に有効化、無効化する実装を行います。

 これはオペレーターとしてショートカットキーを登録することで可能です。

import bpy

# カスタムオペレーターを定義
class ToggleFaceOrientationOperator(bpy.types.Operator):
    bl_idname = "view3d.toggle_face_orientation"
    bl_label = "Toggle Face Orientation"
    bl_description = "Toggle face orientation visibility in the viewport"

    def execute(self, context):
        # 現在のエリアが3Dビューか確認
        area = next((area for area in context.window.screen.areas if area.type == 'VIEW_3D'), None)

        if area is None:
            self.report({'WARNING'}, "3Dビューがアクティブではありません")
            return {'CANCELLED'}

        # 3Dビューのスペースデータを取得
        for space in area.spaces:
            if space.type == 'VIEW_3D':
                # 面の向きをトグル
                space.overlay.show_face_orientation = not space.overlay.show_face_orientation
                self.report({'INFO'}, f"面の向きを {'有効化' if space.overlay.show_face_orientation else '無効化'} しました")
                return {'FINISHED'}

        self.report({'WARNING'}, "面の向きの可視化を操作できませんでした")
        return {'CANCELLED'}

# オペレーターを登録
def register():
    bpy.utils.register_class(ToggleFaceOrientationOperator)
    
    # キーマップにショートカットキーを追加
    wm = bpy.context.window_manager
    kc = wm.keyconfigs.addon
    if kc:
        km = kc.keymaps.new(name="3D View", space_type='VIEW_3D')
        km.keymap_items.new(
            ToggleFaceOrientationOperator.bl_idname,  # カスタムオペレーターID
            'O',                                    # ショートカットキー (ここでは "O")
            'PRESS',
            ctrl=True                               # Ctrl+Oでトグル
        )

# オペレーターを登録解除
def unregister():
    bpy.utils.unregister_class(ToggleFaceOrientationOperator)

    # キーマップを削除
    wm = bpy.context.window_manager
    kc = wm.keyconfigs.addon
    if kc:
        for km in kc.keymaps:
            if km.name == "3D View":
                for kmi in km.keymap_items:
                    if kmi.idname == ToggleFaceOrientationOperator.bl_idname:
                        km.keymap_items.remove(kmi)
                break

if __name__ == "__main__":
    register()

このコードを実行するとCtrlキー+Oキーを押すことで簡単にビューポートオーバーレイの面の向きの有効化、無効かが行えます。

本日は以上です。