﻿<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=Doc%3AJA%2F2.6%2FManual%2FExtensions%2FPython%2FProperties</id>
	<title>Doc:JA/2.6/Manual/Extensions/Python/Properties - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=Doc%3AJA%2F2.6%2FManual%2FExtensions%2FPython%2FProperties"/>
	<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Doc:JA/2.6/Manual/Extensions/Python/Properties&amp;action=history"/>
	<updated>2026-04-21T11:17:58Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=Doc:JA/2.6/Manual/Extensions/Python/Properties&amp;diff=141753&amp;oldid=prev</id>
		<title>Yamyam: 1版 をインポートしました</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Doc:JA/2.6/Manual/Extensions/Python/Properties&amp;diff=141753&amp;oldid=prev"/>
		<updated>2018-06-28T20:54:16Z</updated>

		<summary type="html">&lt;p&gt;1版 をインポートしました&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;2018年6月28日 (木) 20:54時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ja&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(相違点なし)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Yamyam</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=Doc:JA/2.6/Manual/Extensions/Python/Properties&amp;diff=141752&amp;oldid=prev</id>
		<title>wiki&gt;Blendmild: /* 参照 */</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Doc:JA/2.6/Manual/Extensions/Python/Properties&amp;diff=141752&amp;oldid=prev"/>
		<updated>2013-05-09T13:59:15Z</updated>

		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;参照&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Page/Header||}}&lt;br /&gt;
&lt;br /&gt;
== プロパティとID プロパティおよび両者の違い ==&lt;br /&gt;
----&lt;br /&gt;
Python を使って Blender でカスタムプロパティを定義する方法はいくつもあります。その一つは、既存のデータブロックに新たなプロパティを追加することです。もう一つはデータブロックに新たな IDプロパティを定義することです。両者は同じに見えるかもしれませんが、違いがあります。どのように使い分けるのでしょう？&lt;br /&gt;
&lt;br /&gt;
この記事は読者が Python と Blender の基礎知識を持っていることを想定しています。コード例はデフォルトシーンで問題なく試すことができます。作成されるユーザーインタフェース要素は 3Dビューのプロパティサイドバー（Nキーでトグル）に表示されるでしょう。このバーの最下部に表示されるので、それより上にあるパネル（Transform、View など）を折りたたんでおくと便利かもしれません。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== プロパティ ==&lt;br /&gt;
----&lt;br /&gt;
=== 基礎 ===&lt;br /&gt;
デフォルトで Blender 自身が使う通常のプロパティがあります。例えばオブジェクトは [http://www.blender.org/documentation/250PythonDoc/bpy.types.Object.html#bpy.types.Object.location location] プロパティを持っています。これはオブジェクトの位置情報を含むベクターです。このプロパティは読み書きが可能です。他のプロパティ、例えば [http://www.blender.org/documentation/250PythonDoc/bpy.types.Object.html#bpy.types.Object.users users] などは読み取り専用です。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import bpy&lt;br /&gt;
&lt;br /&gt;
ob = bpy.context.active_object  # アクティブなオブジェクトを得る&lt;br /&gt;
print(&amp;quot;Location:&amp;quot;, ob.location) # 位置を表示&lt;br /&gt;
ob.location = [1,1,1]           # 新たな位置を設定&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;Users:&amp;quot;, ob.users)       # user 数を表示&lt;br /&gt;
#ob.users = 3                   # これはエラーを起こすでしょう&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== カスタムプロパティ ===&lt;br /&gt;
新たなプロパティを自分で追加することもできます。始めに決める必要があるのはプロパティの型です: boolean、float、string など。ここに [http://www.blender.org/documentation/blender_python_api_2_57_1/bpy.props.html 全ての一覧] があります。次のようにして新たなプロパティ（この例では string）を単に追加してください:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;bpy.types.Object.myProperty = bpy.props.StringProperty()&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これで全てのオブジェクトにプロパティ &amp;lt;i&amp;gt;myProperty&amp;lt;/i&amp;gt; が追加されます。&lt;br /&gt;
&lt;br /&gt;
一旦プロパティを追加すれば他の通常プロパティのように働きかけることができます。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;ob = bpy.context.active_object      # アクティブなオブジェクトを得る&lt;br /&gt;
bpy.types.Object.foo = bpy.props.StringProperty()       # &amp;quot;foo&amp;quot; という名の新たなプロパティを追加&lt;br /&gt;
ob.foo = &amp;quot;bar&amp;quot;                      # プロパティに値を代入&lt;br /&gt;
print(&amp;quot;foo:&amp;quot;, ob.foo)               # &amp;quot;foo: bar&amp;quot; を表示&lt;br /&gt;
print(&amp;quot;foo:&amp;quot;, ob['foo'])            # これも &amp;quot;foo: bar&amp;quot; を表示&lt;br /&gt;
&lt;br /&gt;
class myPanel(bpy.types.Panel):     # 新プロパティを表示するパネル&lt;br /&gt;
    bl_space_type = &amp;quot;VIEW_3D&amp;quot;       # 3D ウィンドウに表示&lt;br /&gt;
    bl_region_type = &amp;quot;UI&amp;quot;           # プロパティパネルに表示&lt;br /&gt;
    bl_label = &amp;quot;My Panel&amp;quot;           # 新たなパネルの名前&lt;br /&gt;
    &lt;br /&gt;
    def draw(self, context):&lt;br /&gt;
        # アクティブなオブジェクトの &amp;quot;foo&amp;quot; の値を表示&lt;br /&gt;
        self.layout.prop(bpy.context.active_object, &amp;quot;foo&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
bpy.utils.register_class(myPanel)   # パネルを登録&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{SideNote|1=right|2=Spaces|3=[[image:Blender3D_FreeTip.png|left]]プロパティ名が空白を含んでいると &amp;lt;i&amp;gt;ob.foo bar&amp;lt;/i&amp;gt; では呼び出せません。&amp;lt;br&amp;gt;代わりに &amp;lt;i&amp;gt;getattr(ob, &amp;quot;foo bar&amp;quot;)&amp;lt;/i&amp;gt; を使ってください}}&lt;br /&gt;
忘れずにおきたいのは保存して blend ファイルを再読み込みしたとき、追加した新たなプロパティは消えてしまうであろうことです。このため &amp;lt;i&amp;gt;print(ob.foo)&amp;lt;/i&amp;gt; はもう動作しないでしょう。プロパティに値を代入されたオブジェクトはすべて、プロパティを維持していますが、ID プロパティとしてのみ利用可能になります。詳細はこのページのさらに下をご覧ください。&amp;lt;br&amp;gt;&lt;br /&gt;
前回のセッションで代入した値を再び利用可能にするには、プロパティを再定義する必要があります。blend ファイルを開き直したら、次を再実行する必要があります:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;bpy.types.Object.myProperty = bpy.props.StringProperty()&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これで、前回のセッションで代入した値が代入しなおされるので（値は対応する IDプロパティから取り戻されたのです）、自分で再度代入する必要はありません。 &amp;lt;i&amp;gt;print(ob.foo)&amp;lt;/i&amp;gt; はやはり &amp;lt;i&amp;gt;bar&amp;lt;/i&amp;gt; を返すでしょう。&lt;br /&gt;
&lt;br /&gt;
=== 動的なカスタムプロパティ ===&lt;br /&gt;
前の方法は静的な情報を決まったデータブロックに格納したい場合にはうまく動作しますが、動的なプロパティがほしいときにはそうならないでしょう。この場合プロパティに関数を代入する必要があります。このためには python の 組み込みの [http://docs.python.org/library/functions.html#property property()] 関数を使います。例えば:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;bpy.types.Lamp.foo = property(bar)&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
大きな違いは、動的なカスタムプロパティは blend ファイルの保存時に格納されないことです。ID プロパティとしても保存されません。&lt;br /&gt;
&lt;br /&gt;
次は &amp;lt;i&amp;gt;distance&amp;lt;/i&amp;gt; という名前の新たな動的プロパティを作る完全な例です。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
import bpy #スクリプトテキストウィンドウで必要！&lt;br /&gt;
def fget(self):                                 # カスタム get 関数&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Distance from origin&amp;quot;&amp;quot;&amp;quot;                  # プロパティ説明&lt;br /&gt;
    loc = self.location                         # オブジェクトの場所&lt;br /&gt;
    distance = loc.length                       # 原点からの距離&lt;br /&gt;
    return distance                             # 値を返します&lt;br /&gt;
&lt;br /&gt;
def fset(self, value):                          # カスタム set 関数&lt;br /&gt;
    if self.location.length &amp;lt; 1E-6:             # オブジェクトが原点にあれば&lt;br /&gt;
        self.location = [1, 0, 0]               # 動かす方向&lt;br /&gt;
    self.location.length = value                # 原点から離します&lt;br /&gt;
&lt;br /&gt;
bpy.types.Object.distance = property(fget, fset)# プロパティに関数を代入&lt;br /&gt;
&lt;br /&gt;
ob = bpy.context.active_object                  # アクティブオブジェクトを取得&lt;br /&gt;
print(ob.distance)                              # 距離をコンソールに表示&lt;br /&gt;
ob.distance = 2                                 # 距離を設定&lt;br /&gt;
&lt;br /&gt;
class myPanel(bpy.types.Panel):                 # 新プロパティ表示用パネル&lt;br /&gt;
    bl_space_type = &amp;quot;VIEW_3D&amp;quot;                   # 3D ウィンドウに表示&lt;br /&gt;
    bl_region_type = &amp;quot;UI&amp;quot;                       # プロパティパネルに表示&lt;br /&gt;
    bl_label = &amp;quot;My Panel&amp;quot;                       # 新パネルの名前&lt;br /&gt;
    &lt;br /&gt;
    def draw(self, context):&lt;br /&gt;
        # アクティブオブジェクトの &amp;quot;距離&amp;quot; を表示&lt;br /&gt;
        self.layout.label(text=str(bpy.context.active_object.distance))&lt;br /&gt;
&lt;br /&gt;
bpy.utils.register_class(myPanel)               # パネルを登録&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
作成したプロパティを異なる blend ファイル間で（保存して再読み込みしたあとでも）利用可能にするには、プロパティを ../.blender/scripts/modules/bpy_types.py （.. は blender のインストールフォルダです）に追加する必要があります。&lt;br /&gt;
プロパティを追加したいクラスを見つけて、プロパティを定義する関数を単に追加してください。構文に関して小さな違いが２つあります。１つ目は [http://docs.python.org/glossary.html#term-decorator decorator] の利用です。２つ目は（この結果として）関数名がプロパティ名として使われることです。&amp;lt;br&amp;gt;&lt;br /&gt;
次の例は上と同じですが、ここでは bpy_types.py に追加しました。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
@property                           # decorator&lt;br /&gt;
def distance(self):                 # 属性名&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Distance from origin&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    loc = self.location&lt;br /&gt;
    distance = loc.length&lt;br /&gt;
    return distance&lt;br /&gt;
&lt;br /&gt;
@distance.setter                    # decorator&lt;br /&gt;
def distance(self, value):&lt;br /&gt;
    if self.location.length &amp;lt; 1E-6:&lt;br /&gt;
        self.location = [1, 0, 0]&lt;br /&gt;
    self.location.length = value&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== IDプロパティ ==&lt;br /&gt;
----&lt;br /&gt;
=== 基礎 ===&lt;br /&gt;
ID プロパティは別々のデータブロックに代入されるプロパティです。データブロックは ID 型のサブクラスであるものに限られます。例えば Lamp、Meshe、Object、 WindowManager です。詳細は [http://www.blender.org/documentation/250PythonDoc/bpy.types.ID.html 全一覧] をご覧ください。新たな ID プロパティを作るのはとても簡単です:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
ob = bpy.context.active_object  # アクティブオブジェクトを得る&lt;br /&gt;
ob[&amp;quot;foo&amp;quot;] = &amp;quot;bar&amp;quot;               # ID プロパティを作って代入&lt;br /&gt;
&lt;br /&gt;
print(ob[&amp;quot;foo&amp;quot;])                # &amp;quot;bar&amp;quot; を表示&lt;br /&gt;
# print(ob.foo)                 # foo は属性ではないため動作しません&lt;br /&gt;
print(ob.items())               # ob のすべての ID プロパティを表示&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ID プロパティの作成と、そこへの値の代入は一度にできます。ID プロパティはデータブロックに dictionary として保管されます。&lt;br /&gt;
&lt;br /&gt;
代入可能なデータブロックの型の他に、ID プロパティは注意すべきもう一つの制限を持ちます。ID プロパティに代入できるのは文字列、整数、浮動小数点数、リストだけです。リストには浮動小数点数と整数のみを含むことができます。&lt;br /&gt;
&lt;br /&gt;
=== 参照 ===&lt;br /&gt;
[[image:Crouch-custom-properties.png |right|250px|]]&lt;br /&gt;
ID プロパティには blend ファイルが保存されたときにその中に保管されるという利点があり、見失いにくくなります。見失いにくくなる主な理由は、デフォルトでユーザーインタフェースに表示されることです。妥当なカスタムプロパティパネルに表示されます。ID プロパティを lamp に追加したなら、このプロパティがLamp ウィンドウのカスタムプロパティパネルに表示されるでしょう。このため通常ユーザーにとっても、値の変更がとても簡単になります。新たな ID プロパティを python を使わず追加するのにも使えます。&lt;br /&gt;
&lt;br /&gt;
[http://www.blender.org/documentation/blender_python_api_2_57_1/bpy.types.UILayout.html#bpy.types.UILayout.prop UILayout.prop()] を使って ID プロパティを表示するには、単純に &amp;lt;i&amp;gt;&amp;quot;foo&amp;quot;&amp;lt;/i&amp;gt; をプロパティとして渡すことはできず、１項目のリストを文字列で渡す必要があります。&amp;lt;i&amp;gt;'[&amp;quot;foo&amp;quot;]'&amp;lt;/i&amp;gt; のようにします。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class myPanel(bpy.types.Panel):     # 新プロパティを表示するパネル&lt;br /&gt;
    bl_space_type = &amp;quot;VIEW_3D&amp;quot;       # 3D ウィンドウに表示&lt;br /&gt;
    bl_region_type = &amp;quot;UI&amp;quot;           # プロパティパネルに表示&lt;br /&gt;
    bl_label = &amp;quot;My Panel&amp;quot;           # 新パネルの名前&lt;br /&gt;
    &lt;br /&gt;
    def draw(self, context):&lt;br /&gt;
        # アクティブオブジェクトの &amp;quot;foo&amp;quot; ID プロパティを表示&lt;br /&gt;
        self.layout.prop(bpy.context.active_object, '[&amp;quot;foo&amp;quot;]')&lt;br /&gt;
&lt;br /&gt;
bpy.utils.register_class(myPanel)   # パネルを登録&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
これは、アクティブオブジェクトが ID プロパティを持たない場合には動作しないことに注意してください。したがってエラーを起こす代わりにコード内に代替処理を用意してください。&lt;br /&gt;
&lt;br /&gt;
ここまでは ID プロパティはとてもわかりやすいものでしたが、ID プロパティにパラメータを渡したくなったとき、多少扱いにくくなります。例えば整数の最小値と最大値です。これらのパラメータは &amp;lt;i&amp;gt;_RNA_UI&amp;lt;/i&amp;gt; と呼ばれる特殊なプロパティに保管されます。これは他の ID プロパティと同じようにアクセスでき、他の ID プロパティをキーに、パラメータを値とした dictionary です。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
ob = bpy.context.active_object               # アクティブなオブジェクトを得る&lt;br /&gt;
ob[&amp;quot;foo&amp;quot;] = 7                                # ID プロパティを作る&lt;br /&gt;
ob[&amp;quot;_RNA_UI&amp;quot;] = {&amp;quot;foo&amp;quot;: {&amp;quot;min&amp;quot;:3, &amp;quot;max&amp;quot;:42}} # パラメータを設定&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
スクリプト例を短くするため単に &amp;lt;i&amp;gt;_RNA_UI&amp;lt;/i&amp;gt; を上書きして既存のパラメータを消去しています。通常のスクリプトでは新たなパラメータ用に新たなキーを挿入したほうがよいでしょう。&lt;br /&gt;
&lt;br /&gt;
== まとめ ==&lt;br /&gt;
----&lt;br /&gt;
{| {{Css/prettytable}}&lt;br /&gt;
!&lt;br /&gt;
! align=&amp;quot;center&amp;quot; style=&amp;quot;width:28%;&amp;quot; | プロパティ&amp;lt;br&amp;gt;(静的)&lt;br /&gt;
! align=&amp;quot;center&amp;quot; style=&amp;quot;width:28%;&amp;quot; | プロパティ&amp;lt;br&amp;gt;(動的)&lt;br /&gt;
! align=&amp;quot;center&amp;quot; style=&amp;quot;width:28%;&amp;quot; | IDプロパティ&lt;br /&gt;
|-&lt;br /&gt;
!align=center|作成&lt;br /&gt;
|align=center|bpy.types.Object.foo = bpy.props.StringProperty()&lt;br /&gt;
|align=center|bpy.types.Object.foo = property(bar)&lt;br /&gt;
|align=center|ob[&amp;quot;foo&amp;quot;] = &amp;quot;bar&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!align=center|定義対象&lt;br /&gt;
|align=center|同じ型のすべてのデータブロック&lt;br /&gt;
|align=center|同じ型のすべてのデータブロック&lt;br /&gt;
|align=center|単独のデータブロック&lt;br /&gt;
|-&lt;br /&gt;
!align=center|値代入&lt;br /&gt;
|align=center|ob.foo = &amp;quot;bar&amp;quot;&lt;br /&gt;
|align=center|ob.foo = &amp;quot;bar&amp;quot;&lt;br /&gt;
|align=center|ob[&amp;quot;foo&amp;quot;] = &amp;quot;bar&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!align=center|受け付ける値&lt;br /&gt;
|align=center|[http://www.blender.org/documentation/250PythonDoc/bpy.props.html プロパティ] のどれでも&lt;br /&gt;
|align=center|関数&lt;br /&gt;
|align=center|浮動小数点数、整数、リスト*、文字列&lt;br /&gt;
|-&lt;br /&gt;
!align=center|.blend への保管&lt;br /&gt;
|align=center|する**&lt;br /&gt;
|align=center|しない&lt;br /&gt;
|align=center|する&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*&amp;lt;/nowiki&amp;gt; リストは浮動小数点数と整数のみを含むことができます。&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;nowiki&amp;gt;**&amp;lt;/nowiki&amp;gt; プロパティに代入された値のあるデータブロックは、その値を ID プロパティとして保存します。&lt;br /&gt;
&lt;br /&gt;
[[Category:Script]]&lt;/div&gt;</summary>
		<author><name>wiki&gt;Blendmild</name></author>
		
	</entry>
</feed>