Blenderのプラグイン開発−オブジェクトアーキテクチャ探索
4328 ワード
pythonの言い方ではすべて対象で、Blenderの中でもそうです.
Blenderのルートオブジェクトはbpyなので、どのモジュールも必要です.
注意:
Blenderのスクリプトprint(「hello」)関数は、起動したコンソールに情報を出力し、直接実行すると出力された情報が見えません.
ウィンドウを拡張して[情報](Information)を選択すると、現在のすべての操作のコマンドと実行結果を表示することができ、便利です.
bpy.data
そして、どのオブジェクトも実際にはデータであるため、blenderにアクセスする最初のキーオブジェクトはbpyである.data.pythonのコマンドラインウィンドウを開きます.
次のように入力します.
bpy_collectionはpythonの辞書オブジェクトで、4つのオブジェクトが表示されます(ウィンドウは最初は3つのオブジェクトで、私は1つ追加しました).
何人の相手か知りたいですか?とてもやりやすいです.以下に示すように、すべてのオブジェクトの名前を1つの遍歴でリストします.
これにより、Blenderのほとんどのデータを操作することができます.
bpy.context
bpy.contextはその名の通り実行されるコンテキスト環境であり,これはスクリプト環境であちこちで遭遇している.これを知って、ほほほ!
ここでcontextはobjectにもアクセスできます.これは現在の環境で使用可能なオブジェクトで、データはdataと一致しています.後のopsでは、オブジェクトのプロパティ値にアクセスして変更することもできます.
これは典型的なpython式の「オブジェクト向け」で、データはオブジェクトによって整理されますが、アクセス時に関数的に現れ、スクリプト環境の実行ニーズに適応します.
bpy.ops
bpy.opsはOperator(オペレータ)の略で、多くのオブジェクトがカプセル化されて操作されており、Blender機能の核心となっています.
オペレータの完全な例:
中のregister/unregisterと、その中のclassとpoll、executeメンバー関数に注意してください.これは典型的なプラグインの実装構造です.
ほとんどのプラグインは上の構造に従ってひょうたんを描けばいいです.
bpy.types
bpy.typesはpythonのtypeオブジェクトの簡単なパッケージではなく、Blenderの様々な「クラス」の集合で、私に何の違いがあるのか聞かないでください.誰が誰を使って知っていますか.
注意:Panelもtypesの中の東ですね.次に、Panelを定義するプラグインを示します.
ここでは、プラグインの説明である変数の宣言がいくつか追加されています.
すべてのプラグインには原則として上記の情報が含まれている必要があります.引用符内の文字列は変更でき、変数名は変更できません(そうしないと自分のものになります).このプラグイン情報は、このパネルがオブジェクトのプロパティパネルに表示されることを宣言します.
bpy.typesには、次のようなオブジェクトが含まれています.
ここで再びOperatorオブジェクトが現れて、前のbpyと.opsは同じですか?
typeがpythonの基本オブジェクトであることを考えると、この現象は少しもおかしくないと思います.意外なことを探るには、pythonコンソールで簡単に実行できます.
Blenderのルートオブジェクトはbpyなので、どのモジュールも必要です.
import bpy
注意:
Blenderのスクリプトprint(「hello」)関数は、起動したコンソールに情報を出力し、直接実行すると出力された情報が見えません.
ウィンドウを拡張して[情報](Information)を選択すると、現在のすべての操作のコマンドと実行結果を表示することができ、便利です.
bpy.data
そして、どのオブジェクトも実際にはデータであるため、blenderにアクセスする最初のキーオブジェクトはbpyである.data.pythonのコマンドラインウィンドウを開きます.
3D , , 。
, Python , Python 。
次のように入力します.
>>bpy.data.objects
<bpy_collection[4], BlendDataObjects>
bpy_collectionはpythonの辞書オブジェクトで、4つのオブジェクトが表示されます(ウィンドウは最初は3つのオブジェクトで、私は1つ追加しました).
何人の相手か知りたいですか?とてもやりやすいです.以下に示すように、すべてのオブジェクトの名前を1つの遍歴でリストします.
>>> for obj in bpy.data.objects:
... print(obj.name)
...
Camera
Cube
Lamp
これにより、Blenderのほとんどのデータを操作することができます.
bpy.context
bpy.contextはその名の通り実行されるコンテキスト環境であり,これはスクリプト環境であちこちで遭遇している.これを知って、ほほほ!
>>> bpy.context.object
>>> bpy.context.selected_objects
>>> bpy.context.visible_bones
ここでcontextはobjectにもアクセスできます.これは現在の環境で使用可能なオブジェクトで、データはdataと一致しています.後のopsでは、オブジェクトのプロパティ値にアクセスして変更することもできます.
これは典型的なpython式の「オブジェクト向け」で、データはオブジェクトによって整理されますが、アクセス時に関数的に現れ、スクリプト環境の実行ニーズに適応します.
bpy.ops
bpy.opsはOperator(オペレータ)の略で、多くのオブジェクトがカプセル化されて操作されており、Blender機能の核心となっています.
>>> bpy.ops.mesh.flip_normals()
{'FINISHED'}
>>> bpy.ops.mesh.hide(unselected=False)
{'FINISHED'}
>>> bpy.ops.object.scale_apply()
{'FINISHED'}
オペレータの完全な例:
import bpy
def main(context):
for ob in context.scene.objects:
print(ob)
class SimpleOperator(bpy.types.Operator):
"""Tooltip"""
bl_idname = "object.simple_operator"
bl_label = "Simple Object Operator"
@classmethod
def poll(cls, context):
return context.active_object is not None
def execute(self, context):
main(context)
return {'FINISHED'}
def register():
bpy.utils.register_class(SimpleOperator)
def unregister():
bpy.utils.unregister_class(SimpleOperator)
if __name__ == "__main__":
register()
# test call
bpy.ops.object.simple_operator()
中のregister/unregisterと、その中のclassとpoll、executeメンバー関数に注意してください.これは典型的なプラグインの実装構造です.
ほとんどのプラグインは上の構造に従ってひょうたんを描けばいいです.
bpy.types
bpy.typesはpythonのtypeオブジェクトの簡単なパッケージではなく、Blenderの様々な「クラス」の集合で、私に何の違いがあるのか聞かないでください.誰が誰を使って知っていますか.
注意:Panelもtypesの中の東ですね.次に、Panelを定義するプラグインを示します.
import bpyclass HelloWorldPanel(bpy.types.Panel):
"""Creates a Panel in the Object properties window"""
bl_label = "Hello World Panel"
bl_idname = "OBJECT_PT_hello"
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "object"
def draw(self, context):
layout = self.layout
obj = context.object
row = layout.row()
row.label(text="Hello world!", icon='WORLD_DATA')
row = layout.row()
row.label(text="Active object is: " + obj.name)
row = layout.row()
row.prop(obj, "name")
row = layout.row()
row.operator("mesh.primitive_cube_add")
def register():
bpy.utils.register_class(HelloWorldPanel)
def unregister():
bpy.utils.unregister_class(HelloWorldPanel)
if __name__ == "__main__":
register()
ここでは、プラグインの説明である変数の宣言がいくつか追加されています.
bl_label = "Hello World Panel"
bl_idname = "OBJECT_PT_hello"
bl_space_type = 'PROPERTIES'
bl_region_type = 'WINDOW'
bl_context = "object"
すべてのプラグインには原則として上記の情報が含まれている必要があります.引用符内の文字列は変更でき、変数名は変更できません(そうしないと自分のものになります).このプラグイン情報は、このパネルがオブジェクトのプロパティパネルに表示されることを宣言します.
bpy.typesには、次のようなオブジェクトが含まれています.
bpy.types.Panel
bpy.types.Menu
bpy.types.Operator
bpy.types.PropertyGroup
bpy.types.KeyingSet
bpy.types.RenderEngine
ここで再びOperatorオブジェクトが現れて、前のbpyと.opsは同じですか?
typeがpythonの基本オブジェクトであることを考えると、この現象は少しもおかしくないと思います.意外なことを探るには、pythonコンソールで簡単に実行できます.