context について
bpy.context について確認した情報を適宜追加
結局ソース読まなきゃ駄目って結論になったので、とりあえず作業は↓に移行
◇ context の要素の状態:4つの状態がある
- key があり、意味のある値 (真偽判定で True になる値) を value として持つ
- key があり、空のリストを value として持つ
- key があり、
None
を value として持つ - key がない
ただし、対象が単数のものは 2 のように value = []
となることはない
上記の4つは、以下のような状態にそれぞれ対応していると考えられる
-
対象が単数の context 要素
- 条件を満たす要素が存在する
- --
- 条件を満たす要素が存在しない
- context 要素の対象外の状態
-
対象が複数の context 要素
- 条件を満たす要素が1つ以上存在する
- 条件を満たす要素の存在が可能だが、存在しない
- 条件を満たす要素の存在が不可能
- context 要素の対象外の状態
例 selected_bones
:オブジェクトモードでは3、編集モード+未選択では2、編集モード+選択では1となる
しかし現状では、上記の法則に従わず状態3(None
) にならない要素が、Screen Context において2つ確認されている
- "objects"系:
visible_objects
、selectable_objects
、selected_objects
、editable_objects
、selected_editable_objects
、objects_in_mode
、objects_in_mode_unique_data
- "sequences"系:
sequences
、selected_sequences
、selected_editable_sequences
対象が複数の Screen Context 要素は他に以下が存在するが、これらはNone
になる
-
bones
系、selected_nla_strips
、 -
gpencil_layers
系、editable_gpencil_strokes
系、 -
fcurve
系、selected_editable_keyframes
◇ context の Global と Local の話
The context members available depend on the area of Blender which is currently being accessed.
これを前提に、Global context と、それ以外の、表示条件が限定された context がある
- Screen Context :条件は不明、どのエディターでも確認できる
- View3D:3Dビューポート限定
- Buttons:プロパティエディター限定
- Image:画像 / UV エディター限定
- Node:ノード系エディター限定
- Text:テキストエディター限定
- Clip:クリップエディター限定
- Sequencer:シーケンサー限定
ただし Local な context 同士で重複する名前も多く、完全に隔離されているのは Text Context のみ
なお Global Context のうち、 region_data
は3Dビューポート以外では None
となる
View3D Context に入れないのは、どういう理由があるんだろうか? 何かの判定に使っている?
WIP?:とりあえず一連の作業をまとめてみた
あと、初期状態基準だけの比較で全てカバーするのは無理がある
対象に応じて、比較データの子グループを作る感じで、何か考えよう
親スクラップを消したらどうなるんだろという軽い気持ちで実行して6個ぐらい吹き飛ばした記念の跡地
◇ 初期プロジェクト by コマンドラインの context
以下のような変化が確認できた
-
Global Context
-
area
:<bpy_struct Area ...
→None
-
region
:<bpy_struct Region ...
→None
-
space_data
:<bpy_struct 何か ...
→None
- しかし、
screen
は通常起動時と同じく<bpy_struct Screen...
-
-
Screen Context:
-
annotation_data_owner
:None
- 変化というか、「3D View (や Topbar)ではない」って結果
- (
area = None
なんだから当たり前? そもそも Space 持たないものと Space 依存のデータを比べて良いのか?)
-
-
その他の Local Context は、全て
項目なし
状態としては、
- 紐付いた Local Context もなく、annotation のような特別なデータにアクセスすることもない、Info のようなもので
- Area 系のデータがない状態
という感じだろうか?
「コマンドラインから動かしたとき = Screen Context が消えるとき」という期待通りにはならず
いやまあコマンドラインから動かすときこそcontext.active_object
が必要なわけだし、考えてみれば当然の結果なわけだが・・・
知識不足 developer 読む
Screen Context でリストを取るもの
visible / selected / selected_editable / editable
表示 | 選択 | 選択+編集可 | 編集可 | 特殊 | |
---|---|---|---|---|---|
_objects | ○ | ○ | ○ | ○ | objects_in_mode / in_mode_unique_data |
_bones | ○ | ○ | ○ | ○ | |
_pose_bones | ○ | ○ | selected_pose_bones_from_active_object | ||
_gpencil_layers | ○ | ○ | editable_gpencil_strokes | ||
_fcurves | ○ | ○ | ○ | selected_visible_fcurves | |
_sequences | ○ | ○ | sequences | ||
_nla_strips | ○ | ||||
_keyframes | ○ |
- オブジェクト:わかる
- ボーン:わかる
- ポーズボーン:編集する対象でないので、わかる (特殊はマルチ対策)
-
グリペンのレイヤー:アクティブはあっても選択/非選択の概念がないので、まあわかる
ストロークを分ける理由は? - Fカーブ:なぜわざわざ visible をつける?
-
シーケンス:hide の概念がないので、
sequences
が実質 visible に対応している? ロックの概念があったはずなので editable がある? - NLA :アクティブの概念がない(はず)なので、selected で代用している?
- キーフレーム:わからん アクティブってなかったっけ?
この辺の話はいまんとこ脇に置かれているので、一旦閉じておく