bpy.msgbus.publish_rna(topic: str, data: Any)
此函数发布一个bpy.types.Struct
实例。这个结构体实例表示了一些用户定义的数据,这些数据可以在Blender的不同区域中传递和共享。
topic
(str
) – bpy.types.Struct
实例的主题。它是一个字符串,用于将数据发布给相关的主题。data
(Any
) – bpy.types.Struct
实例。要发布的结构体实例,其中包含要共享的数据。此函数可用于在Blender的不同区域中发布和接收数据。当一个主题被发布时,处于相同主题的所有订阅者都将收到该数据。该函数是bpy.msgbus.publish
函数的扩展,它专门用于发布一个具有Blender RNA属性的Python对象。
RNA属性指的是被定义的Python属性,它基于Blender内置的C数据结构,如bpy.types.Scene
或bpy.types.Object
。因此,结构体实例映射到Blender RNA对象,从而允许在Blender的不同区域传递并共享数据。
此函数使用Python弱引用发布消息,避免了在释放数据时手动取消订阅的需要。
以下代码演示了如何在Blender的不同场景之间发布和接收数据。
import bpy
# 定义要发布的数据结构
class MyData(bpy.types.PropertyGroup):
my_property: bpy.props.FloatProperty()
# 创建发布和接收数据的场景
scene_1 = bpy.data.scenes.new("Scene 1")
scene_2 = bpy.data.scenes.new("Scene 2")
# 将发布和接收数据的场景订阅到相同的主题
bpy.msgbus.subscribe_rna(
key="my_topic",
owner=scene_1,
struct_def=MyData,
subscriber=scene_2,
notify_callback=on_data_received
)
# 发布数据到相应的主题
data = MyData()
data.my_property = 42.0
bpy.msgbus.publish_rna("my_topic", data)
def on_data_received(subscriber: bpy.types.Struct, property: str):
print(subscriber.my_property)
在这个例子中,我们首先定义了要发布的数据结构,即MyData
。然后,我们创建了两个场景,其中一个订阅了主题my_topic
,另一个则作为其订阅者。我们使用bpy.msgbus.subscribe_rna
函数将场景设置为订阅主题,并在数据被接收时调用on_data_received
回调函数。最后,我们使用bpy.msgbus.publish_rna
函数发布数据到主题my_topic
。随着数据的发布,my_property
属性被传递到订阅主题的所有对象中,在这个例子中只有scene_2
。当my_property
属性被接收时,回调函数on_data_received
将被调用,输出42.0
。