MRが楽しい

MRやVRについて学習したことを書き残す

Blender3.0で利用可能なpythonスクリプトを作る その105(シェーディングタイプを切り替える選択肢ボタンを並べて配置する)

本日は Blender の技術調査枠です。
Blender3.0で利用可能なpythonスクリプトを作ります。

シェーディングタイプを切り替える選択肢ボタンを並べて配置する

複数の選択肢から一つのボタンを選択可能なプロパティは EnumProperty で作成します。
docs.blender.org

また EnumProperty の選択肢を並べて表示するには prop() 関数の expand 引数に True を設定します。

shading_column.prop(context.scene.holomon_control_view, "prop_shadingselect", expand=True)

シェーディングタイプの情報は View3DShading 型で変更と取得が可能です。
docs.blender.org

サンプルスクリプト

スクリプトを実行すると3つのシェーディングタイプを切り替えるボタンを3Dビューのサイドバーに追加します。
・Addon_control_view.py

# 定数の定義
ADDON_TITLE = "3DView Control"
ADDON_COMMONNAME = "holomon_control_view"

# bl_infoでプラグインに関する情報の定義を行う
bl_info = {
    "name": ADDON_TITLE + " Addon by HoloMon",       # プラグイン名
    "author": "HoloMon",                             # 制作者名
    "version": (1, 0),                               # バージョン
    "blender": (2, 90, 0),                           # 動作可能なBlenderバージョン
    "support": "TESTING",                            # サポートレベル
    "category": "3D View",                           # カテゴリ名
    "location": "View3D > Sidebar > HMToolkit",      # ロケーション
    "description": ADDON_TITLE + "Addon",            # 説明文
    "location": "",                                  # 機能の位置付け
    "warning": "",                                   # 注意点やバグ情報
    "doc_url": "",                                   # ドキュメントURL
}

# 利用するタイプやメソッドのインポート
import bpy
from bpy.types import Panel, PropertyGroup
from bpy.props import PointerProperty, EnumProperty

# 継承するクラスの命名規則は以下の通り
# [A-Z][A-Z0-9_]*_(継承クラスごとの識別子)_[A-Za-z0-9_]+
# クラスごとの識別子は以下の通り
#   bpy.types.Operator  OT
#   bpy.types.Panel     PT
#   bpy.types.Header    HT
#   bpy.types.MENU      MT
#   bpy.types.UIList    UL

# Panelクラスの作成
# 参考URL:https://docs.blender.org/api/current/bpy.types.Panel.html
class HOLOMON_PT_holomon_control_view(Panel):
    # パネルのラベル名を定義する
    # パネルを折りたたむパネルヘッダーに表示される
    bl_label = "表示画面のカスタマイズ"
    # クラスのIDを定義する
    # 命名規則は CATEGORY_PT_name
    bl_idname = "HOLOMON_PT_" + ADDON_COMMONNAME
    # パネルを使用する領域を定義する
    # 利用可能な識別子は以下の通り
    #   EMPTY:無し
    #   VIEW_3D:3Dビューポート
    #   IMAGE_EDITOR:UV/画像エディター
    #   NODE_EDITOR:ノードエディター
    #   SEQUENCE_EDITOR:ビデオシーケンサー
    #   CLIP_EDITOR:ムービークリップエディター
    #   DOPESHEET_EDITOR:ドープシート
    #   GRAPH_EDITOR:グラフエディター
    #   NLA_EDITOR:非線形アニメーション
    #   TEXT_EDITOR:テキストエディター
    #   CONSOLE:Pythonコンソール
    #   INFO:情報、操作のログ、警告、エラーメッセージ
    #   TOPBAR:トップバー
    #   STATUSBAR:ステータスバー
    #   OUTLINER:アウトライナ
    #   PROPERTIES:プロパティ
    #   FILE_BROWSER:ファイルブラウザ
    #   PREFERENCES:設定
    bl_space_type = 'VIEW_3D'
    # パネルが使用される領域を定義する
    # 利用可能な識別子は以下の通り
    # ['WINDOW'、 'HEADER'、 'CHANNELS'、 'TEMPORARY'、 'UI'、
    #  'TOOLS'、 'TOOL_PROPS'、 'PREVIEW'、 'HUD'、 'NAVIGATION_BAR'、
    #  'EXECUTE'、 'FOOTER'の列挙型、 'TOOL_HEADER']
    bl_region_type = 'UI'
    # パネルタイプのオプションをset型で定義する
    # DEFAULT_CLOSED:作成時にパネルを開くか折りたたむ必要があるかを定義する。
    # HIDE_HEADER:ヘッダーを非表示するかを定義する。Falseに設定するとパネルにはヘッダーが表示される。
    # デフォルトはオプション無し
    bl_options = set()
    # パネルの表示順番を定義する
    # 小さい番号のパネルは、大きい番号のパネルの前にデフォルトで順序付けられる
    # デフォルトは 0
    bl_order = 0
    # パネルのカテゴリ名称を定義する
    # 3Dビューポートの場合、サイドバーの名称になる
    # デフォルトは名称無し
    bl_category = "HMToolkit"
 
    # 描画の定義
    def draw(self, context):
        # Operatorをボタンとして配置する
        draw_layout = self.layout
        # ボックス要素を作成する
        shading_box = draw_layout.box()
        # 要素行を作成する
        shading_row = shading_box.row()
        # テキストを配置する
        shading_row.label(text="シェーディング切替")
        # 要素列を作成する
        shading_column = shading_box.column(align=True)
        # シェーディングタイプの選択肢を配置する
        # row(列)要素に expand=True を指定して EnumProperty を設定すると縦並びに表示される
        shading_column.prop(context.scene.holomon_control_view, "prop_shadingselect", expand=True)

# PropertyGroupクラスの作成
# 参考URL:https://docs.blender.org/api/current/bpy.types.PropertyGroup.html
class HOLOMON_PROP_holomon_control_view(PropertyGroup):
    # 選択肢の更新時に実行する関数を定義する
    def change_shadingselect(self, context):
        # 指定された選択肢を取得する
        target_shadingselect = context.scene.holomon_control_view.prop_shadingselect
        # 選択したIDを元にシェーディングタイプを設定する
        # (https://docs.blender.org/api/current/bpy.types.View3DShading.html#bpy.types.View3DShading.type)
        if target_shadingselect == "Wireframe":
            context.space_data.shading.type = 'WIREFRAME'
        elif target_shadingselect == "Solid":
            context.space_data.shading.type = 'SOLID'
        elif target_shadingselect == "Material":
            context.space_data.shading.type = 'MATERIAL'

    # シーン上のパネルに表示する選択肢のカスタムプロパティを定義する
    # 選択肢(ID,名前,説明)を作成する
    # EnumPropertyの選択肢要素のマニュアル
    # (https://docs.blender.org/api/current/bpy.props.html#bpy.props.EnumProperty)
    prop_shadingselect: EnumProperty(
        name="シェーディングの選択",                                     # プロパティ名
        items= [
            ("Wireframe","ワイヤーフレーム表示","ワイヤーフレーム表示に切り替え","SHADING_WIRE",0),
            ("Solid","ソリッド表示","ソリッド表示に切り替え","SHADING_SOLID",1),
            ("Material","マテリアル表示","マテリアル表示に切り替え","SHADING_TEXTURE",2),
        ],                                                               # 選択肢
        default="Solid",                                                 # デフォルト値
        description = "3Dビューのシェーディング処理を指定します",          # 説明文
        update = change_shadingselect,                                  # 更新時実行関数
        )

# 登録に関する処理
# 登録対象のクラス名
regist_classes = (
    HOLOMON_PT_holomon_control_view,
    HOLOMON_PROP_holomon_control_view,
)

# 作成クラスと定義の登録メソッド
def register():
    # カスタムクラスを登録する
    for regist_cls in regist_classes:
        bpy.utils.register_class(regist_cls)
    # シーン情報にカスタムプロパティを登録する
    bpy.types.Scene.holomon_control_view = \
      PointerProperty(type=HOLOMON_PROP_holomon_control_view)

# 作成クラスと定義の登録解除メソッド
def unregister():
    # シーン情報のカスタムプロパティを削除する
    del bpy.types.Scene.holomon_control_view
    # カスタムクラスを解除する
    for regist_cls in regist_classes:
        bpy.utils.unregister_class(regist_cls)

# エディター実行時の処理
if __name__ == "__main__":
    # 作成クラスと定義を登録する
    register()

f:id:bluebirdofoz:20220221230623j:plain