コードの入力と実行¶
PME のコード欄へ Python を書くときの前提と、入力・実行の仕様をまとめています。対象は PME 2.1 です。
重要
最初に:PME のコード欄は1行で書きます
通常の Command / Custom とメニューの Poll は、1行のコードを入力します。 短い処理には
;や条件式を使います。長い処理や再利用する処理は、外部の Python ファイルへ分けます。 PME の欄には
execute_script("scripts/my_action.py")のような短い呼び出しを書きます。
AI がコードを生成する場合も、外部ファイルの複数行コードと、PME に貼る1行は分けて示してください。
AI 向け:通常スロットの Command / Custom は UTF-8 で1,024バイトまでです。超える処理は外部ファイルへ分けてください(Context Router の専用 Custom 欄は32,768文字まで)。
関数・変数と引数の仕様は API リファレンス、メニューの利用条件は Poll Method を参照してください。
コード欄には貼り付け用の1行を用意する¶
通常の Command / Custom とメニューの Poll には、短い処理を1行にして入力します。説明用に改行した Python を、そのまま貼り付ける形式にはしません。
書きたい処理 |
1行の形 |
注意点 |
|---|---|---|
単純な文を順番に実行 |
|
|
条件によって値を選ぶ |
|
各名前を実際の式に置き換える |
条件を満たすときだけ実行 |
|
左側が真のときだけ右側を評価する |
Poll の結果を返す |
|
メニューの Poll 用。Command では使わない |
if / for / def のブロックを、改行から ; への置換だけで変換することはできません。処理が長い、ネストが深い、繰り返しや関数が必要な場合は 外部ファイルへ分けます。
複数行の操作履歴を取り込む場合
操作記録の取り込みには、オペレーター呼び出しや代入を抽出して1行にまとめる経路があります。任意の Python スクリプトをそのまま保存する機能ではありません。取り込み後の内容も確認してください。
設定先と実行タイミング¶
設定先 |
評価されるとき |
書く内容 |
|---|---|---|
Command |
項目を実行したとき |
オペレーターの呼び出し、値の変更 |
Custom |
UI を描画するとき。再描画で繰り返す |
|
メニューの Poll |
メニューが利用できるかを調べるとき |
条件を読み、 |
Property の Getter / Setter / Update |
値の取得・書き込み・更新時 |
役割ごとの処理。コールバックの仕様を参照 |
|
呼び出し元が評価されたとき |
呼び出し元の役割に応じた処理。Custom から呼べば描画時に実行される |
たとえば Custom に bpy.ops.mesh.primitive_cube_add() と書くと、描画時に追加処理を実行してしまいます。ボタンを置くなら L.operator("mesh.primitive_cube_add") を使います。
PME が用意する名前と、自分で用意する名前¶
PME のコード欄には便利な名前が用意されています。ただし、すべての設定先で
同じ値が揃うわけではありません。次の表は、Command / Custom と、そこから
execute_script() で呼ぶファイルを読むための入口です。
名前 |
用途 |
前提・注意点 |
|---|---|---|
|
その実行・描画で PME が提供するコンテキストを読む |
|
|
Blender の API を使う |
描画経路によって |
|
Blender のデータへのアクセス |
|
|
Blender のオペレーターを呼ぶ |
|
|
Blender の型へのアクセス |
|
|
現在のレイアウトに UI 部品を描く |
Custom など、レイアウトを受け取る描画時に使う。Command 用の操作対象ではない |
|
その処理に渡された入力イベントを調べる |
イベントのない評価では名前自体が提供されない場合がある |
|
PME のセッション内で一時的な値を共有する |
保存先ではない。PME の再登録や Blender の再起動をまたぐ値に使わない |
pm、pmi、menu などの名前は、設定先ごとの意味を確認してください。
たとえば Property のコールバックでの menu は Property ID です。
別のスロットの例をそのまま流用せず、Property のコールバック
の説明を使います。
外部ファイルで独自の関数、mathutils.Vector、他のモジュールを使う場合は、
そのファイル自身で定義・インポートします。PME が現在提供する名前と、
以前 Python Console に入力した変数を混同しないでください。
外部ファイルを実行する¶
長い処理は通常の Python ファイルへ書き、PME から execute_script() で呼びます。次は、選択中のオブジェクト数を表示する例です。
1. ファイルを置く — 保存先とフォルダ構成にあるユーザースクリプトのフォルダへ、selection_report.py を保存します。
ファイル本文(複数行):
return_value = False
def build_report(context, prefix):
objects = getattr(context, "selected_objects", ()) or ()
return f"{prefix}: {len(objects)}"
report = build_report(C, str(kwargs.get("prefix", "Selection")))
message_box(report)
return_value = report
2. 呼び出しを設定する — パイメニューのスロット → Command に、次の1行を貼り付けます。
execute_script("scripts/selection_report.py", prefix="Selected objects")
3. 確認する — 3D Viewport の Object Mode でオブジェクトを選び、この項目を実行します。選択数のメッセージが出ます。選択を外して実行すると 0 と表示されます。
ファイルの場所と引数¶
項目 |
意味 |
|---|---|
|
ユーザースクリプトのフォルダを先に検索し、なければ PME 付属のスクリプトを検索 |
その他の相対パス |
アドオンのフォルダが基準。絶対パスも使用可能 |
|
呼び出しで渡した引数の辞書。 |
|
実際に読み込んだファイルのパス |
|
|
戻り値を使う場合は呼び出し側で変数へ代入します。戻り値は自動表示されないため、上の例では message_box() を呼んでいます。PME 2.1 ではファイル先頭のインポートや定義を、同じ実行で定義した関数からも参照できます。
外部ファイルに移しても、呼び出し元のコンテキストや評価タイミングは変わりません。設定をほかの環境へ渡す場合は、ファイルも一緒に用意します。
戻り値を成功判定に使うとき
return_value の既定値は True です。例外を捕捉した経路でもその値が返る場合があり、戻り値だけを汎用的な成功判定にはできません。例では冒頭に False、処理の最後に結果を設定しています。エラー出力と実際の結果も確認してください。この代入は、途中まで行ったデータ変更を取り消す仕組みではありません。
オペレーターの実行場所とタイミング¶
bpy.ops の呼び出しには、引数だけでなく実行場所の条件があります。
同じ文字列でも、3D Viewport からの実行と Preferences 上のボタンでは結果が異なり得ます。
必要なエディターとリージョンにいるか。
必要なモードか。アクティブな対象と選択対象は揃っているか。
引数名と値が、使っている Blender のバージョンに存在するか。
操作をその場で確定するのか、マウスで調整する操作を始めるのか。
EXEC_DEFAULT は指定した値で実行する経路、INVOKE_DEFAULT はオペレーターの
開始処理を呼ぶ経路です。後者はダイアログやマウス操作に進む場合がありますが、
すべてのオペレーターが両方の使い方を提供するわけではありません。
詳しくは Blender の Operator APIを参照してください。
オペレーターが RUNNING_MODAL を返すと、ユーザーによる操作がまだ続いています。
その呼び出しの後ろに ; で書いた Python が、操作の確定まで待つとは考えないでください。
ユーザーの調整を挟む手順には Macro Operatorも検討します。
コンテキストエラーのたびに、見つかった最初のエリアへ切り替えるコードを足すと、 意図しないビューで動く原因になります。まず本来のエディターから呼び出し、 ホットキーの範囲を確認します。別エリアを対象にする必要がある場合だけ、 対象の選び方と、見つからないときの動作を決めます。
エラーを切り分ける¶
Blender の Python Console に入力したコードの結果と、PME の print() の出力先は
同じとは限りません。print() や Python の例外は、Blender の標準出力・エラー出力を
確認します。macOS では Blender を起動したターミナルなどが出力先になります。
症状 |
最初に確認すること |
|---|---|
|
必要な名前を、そのファイル内でインポート・定義しているか。 |
|
依存モジュールが Blender の Python に存在するか。システムの Python に入れただけではないか |
|
対象なしの状態、オブジェクト型、プロパティ名、Blender のバージョン |
|
Blender オペレーターが要求するエディター、リージョン、モード、選択状態 |
コード末尾の構文エラー |
貼り付けたコードが元の内容と一致しているか |
Text Editor では動くが PME では動かない |
不足しているインポート、別の実行で残った変数、実行場所の違い |
処理は進むが期待した結果にならない |
|
対象の状態だけを出力する短い Command を、本来使うエディターから呼ぶと、 エラーの起きる状態を絞れます。
print("PME context:", getattr(C.area, "type", None), C.mode, C.active_object)
まず一つの処理で結果を確かめてから、分岐や連続操作を追加します。
データ変更を伴う場合は、対象がある場合・ない場合の両方と、Undo / Redo を確認します。
; で連続させたことや EXEC_DEFAULT を使ったことだけでは、
一つの Undo にまとまるとは限りません。履歴を見ずに bpy.ops.ed.undo_push() を
機械的に追加しないでください。
関連するリファレンス¶
コード例:設定先と貼り付けるコードから選ぶ。
API リファレンス:関数・変数の仕様を調べる。
Public API:外部アドオンなどから PME を利用する。
一時的な値の共有:
Uと永続保存の使い分け。