スポンサーリンク

| キーワード:

Blender のMessage Busに関数を設定して画面操作時にpython関数を走らせる

参考:

https://docs.blender.org/api/current/bpy.msgbus.html

まず、Locationから位置変更した場合にメッセージを表示させる

基本コード(Location)

import bpy

#https://docs.blender.org/api/current/bpy.msgbus.html

# Any Python object can act as the subscription's owner.
owner = object()


# この関数が呼び出される
def msgbus_callback(*args):

    print("Something changed!", args)

# locationを指定して、位置移動の時に呼び出されるようにする
# ただしサイドバーのLocationの操作のみ対応
# [G]などで移動した場合は反応しない
subscribe_to = bpy.context.object.location

bpy.msgbus.subscribe_rna(
    key=subscribe_to,
    owner=owner,
    args=("hello",), # タプルなので引数一つの場合は(a,)のような形にしないといけない
    notify=msgbus_callback,
)

回転の場合

さて回転の場合なのだが、

subscribe_to = bpy.context.object.rotation

などとやってもエラーになる。

AttributeError: ‘Object’ object has no attribute ‘rotation’

意訳 bpy.context.objectにrotationなんてない

ではどうするかというと、次のようにしてbpy.context.objectでつかえそうなものを調べる

import bpy


li = dir( bpy.context.object )

for i in li:
    print(i)

以下出力。大量に出てくるが、locationのほかに、rotation_eulerなどを見つけられる。

 

__doc__
__module__
__slots__
active_material
active_material_index
active_shape_key

lineart
local_view_get
local_view_set
location
lock_location
lock_rotation

rotation_axis_angle
rotation_euler
rotation_mode
rotation_quaternion
scale
select_get
select_set

user_remap
users
users_collection
users_scene
vertex_groups
visible_get
visible_in_viewport_get

 

というわけで回転時に動かすにはbpy.context.object.rotation_eulerを指定する。

import bpy

#https://docs.blender.org/api/current/bpy.msgbus.html

# Any Python object can act as the subscription's owner.
owner = object()


# この関数が呼び出される
def msgbus_callback(*args):

    print("Something changed!", args)

# rotation_eulerを指定して、回転の時に呼び出されるようにする
# ただしサイドバーのRotationの操作のみ対応
# [R]などで移動した場合は反応しない
subscribe_to = bpy.context.object.rotation_euler
bpy.msgbus.subscribe_rna(
    key=subscribe_to,
    owner=owner,
    args=("rotation-euler",), # タプルなので引数一つの場合は(a,)のような形にしないといけない
    notify=msgbus_callback,
)

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: