本日は Blender の技術調査枠です。
Blender2.8で利用可能なpythonスクリプトを作ります。
アドオンのUV欄をオブジェクトに合わせて動的に変更する
アドオンのUIで設定した指定のオブジェクトのUVマップレイヤーのレンダー設定をアクティブにします。
UVマップレイヤーの一覧はオブジェクトを指定すると、そのオブジェクトのUVマップレイヤーの一覧が取得されて更新されます。
・Addon_uvlayerselect_sample.py
# bl_infoでプラグインに関する情報の定義を行う bl_info = { "name": "HoloMon UVlayer Select Addon", # プラグイン名 "author": "HoloMon", # 制作者名 "version": (1, 0), # バージョン "blender": (2, 80, 0), # 動作可能なBlenderバージョン "support": "TESTING", # サポートレベル "category": "3D View", # カテゴリ名 "location": "View3D > Sidebar > HoloMon", # ロケーション "description": "Addon UVlayer Select", # 説明文 "location": "", # 機能の位置付け "warning": "", # 注意点やバグ情報 "doc_url": "", # ドキュメントURL } # 利用するタイプやメソッドのインポート import bpy from bpy.types import Operator, 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_addon_uvlayer_select(Panel): # パネルのラベル名を定義する # パネルを折りたたむパネルヘッダーに表示される bl_label = "UVlayer Select Addon Panel" # クラスのIDを定義する # 命名規則は CATEGORY_PT_name bl_idname = "HOLOMON_PT_addon_uvlayer_select" # パネルを使用する領域を定義する # 利用可能な識別子は以下の通り # 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' # パネルタイプのオプションを定義する # DEFAULT_CLOSED:作成時にパネルを開くか折りたたむ必要があるかを定義する。 # HIDE_HEADER:ヘッダーを非表示するかを定義する。Falseに設定するとパネルにはヘッダーが表示される。 # デフォルトは {'DEFAULT_CLOSED'} bl_options = {'DEFAULT_CLOSED'} # パネルの表示順番を定義する # 小さい番号のパネルは、大きい番号のパネルの前にデフォルトで順序付けられる # デフォルトは 0 bl_order = 0 # パネルのカテゴリ名称を定義する # 3Dビューポートの場合、サイドバーの名称になる # デフォルトは名称無し bl_category = "HoloMon" # 描画の定義 def draw(self, context): # Operatorをボタンとして配置する draw_layout = self.layout # 要素行を作成する select_row = draw_layout.row() # オブジェクト選択用のカスタムプロパティを配置する select_row.prop(context.scene.holomon_uvlayerselect, "prop_objectselect", text='') # 要素行を作成する uvlayer_row = draw_layout.row() # UVマップレイヤー選択用のカスタムプロパティを配置する uvlayer_row.prop(context.scene.holomon_uvlayerselect, "prop_uvlayerselect", text='') # 要素行を作成する button_row = draw_layout.row() # オブジェクト指定のサイズ縮小を実行するボタンを配置する button_row.operator("holomon.uvlayerselect") # Operatorクラスの作成 # 参考URL:https://docs.blender.org/api/current/bpy.types.Operator.html class HOLOMON_OT_addon_uvlayer_select(Operator): # クラスのIDを定義する # (Blender内部で参照する際のIDに利用) bl_idname = "holomon.uvlayerselect" # クラスのラベルを定義する # (デフォルトのテキスト表示などに利用) bl_label = "UVlayer SELECT" # クラスの説明文 # (マウスオーバー時に表示) dl_description = "UVlayer Select Addon Description" # クラスの属性 # 以下の属性を設定できる # REGISTER : Operatorを情報ウィンドウに表示し、やり直しツールバーパネルをサポートする # UNDO : 元に戻すイベントをプッシュする(Operatorのやり直しに必要) # UNDO_GROUPED : Operatorの繰り返しインスタンスに対して単一の取り消しイベントをプッシュする # BLOCKING : 他の操作がマウスポインタ―を使用できないようにブロックする # MACRO : Operatorがマクロであるかどうかを確認するために使用する # GRAB_CURSOR : 継続的な操作が有効な場合にオペレーターがマウスポインターの動きを参照して、操作を有効にする # GRAB_CURSOR_X : マウスポインターのX軸の動きのみを参照する # GRAB_CURSOR_Y : マウスポインターのY軸の動きのみを参照する # PRESET : Operator設定を含むプリセットボタンを表示する # INTERNAL : 検索結果からOperatorを削除する # 参考URL:https://docs.blender.org/api/current/bpy.types.Operator.html#bpy.types.Operator.bl_options bl_options = {'REGISTER', 'UNDO'} # Operator実行時の処理 def execute(self, context): # カスタムプロパティから指定中のオブジェクトを取得する target_obj = context.scene.holomon_uvlayerselect.prop_objectselect # カスタムプロパティから指定中のUVマップレイヤーを取得する target_uvlayername = context.scene.holomon_uvlayerselect.prop_uvlayerselect # 指定中のオブジェクトを確認する if target_obj == None: # オブジェクトが指定されていない場合はエラーメッセージを表示する self.report({'ERROR'}, "No objects selected.") return {'CANCELLED'} # 指定中のUVマップレイヤーを確認する if target_uvlayername == None: # オブジェクトが指定されていない場合はエラーメッセージを表示する self.report({'ERROR'}, "No uvlayer selected.") return {'CANCELLED'} # 指定のオブジェクトのサイズを半分にする addon_change_active_uvlayer(arg_object=target_obj, arg_uvlayername=target_uvlayername) return {'FINISHED'} # PropertyGroupクラスの作成 # 参考URL:https://docs.blender.org/api/current/bpy.types.PropertyGroup.html class HOLOMON_addon_uvlayer_select_properties(PropertyGroup): # オブジェクト選択時のチェック関数を定義する def prop_object_select_poll(self, context, ): # メッシュオブジェクトのみ選択可能 if(context and context.type in ('MESH', )): return True return False # UVマップレイヤーの選択肢の生成関数 def prop_uvlayer_select_items(self, context): # UVマップレイヤーの一覧 items = [] # 現在の選択オブジェクトに合わせてUVレイヤー一覧を更新する target_object = self.prop_objectselect # 選択オブジェクトが非選択状態か確認する if target_object == None: # 非選択状態なら一覧を追加しない return items # 対象オブジェクトのメッシュデータを取得する # メッシュデータ操作のマニュアル # (https://docs.blender.org/api/current/bpy.types.Mesh.html) meshdata = self.prop_objectselect.data # UVマップレイヤーのリストを取得する # UVマップレイヤーのリスト操作のマニュアル # (https://docs.blender.org/api/current/bpy.types.UVLoopLayers.html) uv_layers = meshdata.uv_layers # UVマップレイヤーを全て走査する for index, uv_layer in enumerate(uv_layers): # UVマップの名称を取得する # UVマップレイヤー操作のマニュアル # (https://docs.blender.org/api/current/bpy.types.MeshUVLoopLayer.html) uvlayer_name = uv_layer.name # 選択肢(ID,名前,説明)を作成する # EnumPropertyの選択肢要素のマニュアル # (https://docs.blender.org/api/current/bpy.props.html#bpy.props.EnumProperty) uvlayer_item = (uvlayer_name, uvlayer_name, '', 'GROUP_UVS', index) # 選択肢を一覧に追加する items.append(uvlayer_item) return items # シーン上のパネルに表示するオブジェクト選択用のカスタムプロパティを定義する prop_objectselect: PointerProperty( name = "Select Object", # プロパティ名 type = bpy.types.Object, # タイプ description = "", # 説明文 poll = prop_object_select_poll, # チェック関数 ) # シーン上のパネルに表示するUVSelect選択用のカスタムプロパティを定義する prop_uvlayerselect: EnumProperty( name = "Select UVlayer", # プロパティ名 items = prop_uvlayer_select_items, # 一覧アイテム description = "", # 説明文 ) # 登録に関する処理 # 登録対象のクラス名 regist_classes = ( HOLOMON_PT_addon_uvlayer_select, HOLOMON_OT_addon_uvlayer_select, HOLOMON_addon_uvlayer_select_properties, ) # 作成クラスと定義の登録メソッド def register(): # カスタムクラスを登録する for regist_cls in regist_classes: bpy.utils.register_class(regist_cls) # シーン情報にカスタムプロパティを登録する bpy.types.Scene.holomon_uvlayerselect = PointerProperty(type=HOLOMON_addon_uvlayer_select_properties) # 作成クラスと定義の登録解除メソッド def unregister(): # シーン情報のカスタムプロパティを削除する del bpy.types.Scene.holomon_uvlayerselect # カスタムクラスを解除する for regist_cls in regist_classes: bpy.utils.unregister_class(regist_cls) # 指定のオブジェクトのUVマップレイヤーのレンダー設定をアクティブにする def addon_change_active_uvlayer(arg_object:bpy.types.Object, arg_uvlayername:str) -> bpy.types.MeshUVLoopLayer: """指定のオブジェクトのUVマップレイヤーのレンダー設定をアクティブにする Args: arg_object (bpy.types.Object): 指定オブジェクト arg_uvlayername (str): 指定UVマップレイヤー名 Returns: bpy.types.MeshUVLoopLayer: UVマップレイヤーの参照 """ # 指定オブジェクトが存在するか確認する if arg_object == None: # 指定オブジェクトが存在しない場合は処理しない return None # オブジェクトがメッシュであるか確認する if arg_object.type != 'MESH': # 指定オブジェクトがメッシュでない場合は処理しない return None # 対象オブジェクトのメッシュデータを取得する # メッシュデータ操作のマニュアル # (https://docs.blender.org/api/current/bpy.types.Mesh.html) meshdata = arg_object.data # UVマップレイヤーのリストを取得する # UVマップレイヤーのリスト操作のマニュアル # (https://docs.blender.org/api/current/bpy.types.UVLoopLayers.html) uv_layers = meshdata.uv_layers # UVマップレイヤーを取得する # (get関数は対象が存在しない場合 None が返る) target_uvlayer = uv_layers.get(arg_uvlayername) # 指定UVマップレイヤーが存在するか確認する if target_uvlayer == None: # 指定UVマップレイヤーが存在しない場合は処理しない return None # UVマップレイヤーを走査する for uv_layer in uv_layers: # 指定のUVマップレイヤーか確認する if uv_layer == target_uvlayer: # 指定のUVマップレイヤーであればレンダー設定をアクティブにする uv_layer.active_render = True else: # 指定のUVマップレイヤーでなければレンダー設定を非アクティブにする uv_layer.active_render = False return True # 実行時の処理 if __name__ == "__main__": # 作成クラスと定義を登録する register()