Blender の RNA プロパティと ID プロパティとの違い
RNA プロパティの特徴
RNA は既存のデータ構造を拡張するため,使用前に宣言が必要だ.
bpy.types.Object.myRnaInt = bpy.props.IntProperty( name = "RNA int", min = -100, max = 100, default = 33)
アドオンで RNA プロパティを使う場合は、アンロード時に削除する必要がある。
def unregister(): del bpy.types.Object.myRnaInt
一度定義してしまえばドットを使ってそれにアクセスできる.
cube.myRnaInt = -99
RNA を宣言すると,すべてのオブジェクトにプロパティが追加される.
Driver からプロパティの値を読むこともできる.
ポーズボーンにもプロパティを作成できる.これはIK/FK スイッチのようなプロパティを作るのに便利だ.
import bpy bpy.types.PoseBone.ボーン名 = bpy.props.FloatProperty(name='test')
作成したプロパティはリスト表記でアクセスできる.
import bpy bpy.types.PoseBone.Bone = bpy.props.FloatProperty(name='test') bpy.data.objects['Armature'].pose.bones['Bone']['test'] = 0
スクリプトから RNA を作成する際の注意点
スクリプトから作成した RNA(ID)プロパティは値が代入されない限り表示されない.以下のスクリプトを実行しても Custom Properties には何も表示されない.
import bpy bpy.types.Object.my_rna_bool = bpy.props.BoolProperty(name='RNA bool')
適当な値を代入してやれば表示される.
import bpy bpy.types.Object.my_rna_bool = bpy.props.BoolProperty(name='RNA bool') bpy.context.active_object.my_rna_bool = False bpy.context.scene.update()
最後の update() は変更を反映させるために呼び出している.これがないと一度選択を解除してからもう一度選択してやらないとプロパティが表示されない.
RNA プロパティを保存する際の注意点
RNA プロパティの宣言は保存されない.スクリプトから宣言した RNA プロパティを保存して再度開くと,それらはすべて ID プロパティになる.再宣言すれば,それらを RNA プロパティとして扱える.
ID プロパティの特徴
ID プロパティは単体のデータブロックに追加されるため,他の同じ型のデータに影響はない.事前に宣言する必要はなく,値が代入されたときに自動的に作成される.
cube.data["MyIdInt"] = 111
ID プロパティは integer か float か string になる.それ以外の型が代入されると自動的にそれらの型のどれかに変換される.以下のコードは integer の ID プロパティを作成し,1 が代入される.
cube.data["MyIdBool"] = True
リンク時の動作
リンクしたオブジェクトの RNA プロパティも ID プロパティも変更できない.プロキシを作成すれば RNA プロパティは変更できるが,ID プロパティは変更できない.
外部リンク
RNA properties versus ID properties