将自定义参数传递给Blender运算符,就好像它是一个函数一样

时间:2016-02-07 18:22:47

标签: python numpy blender

我在Blender中创建了一个python脚本,它获取有关对象的信息。然后将所述信息存储在numpy阵列列表中以供以后使用。最初,我想使用该信息让相机以某种方式移动,但运行脚本会冻结3D环境,直到执行结束。

多个人建议使用操作符,但操作符(据我所知)只能以非常特殊和不方便的方式接受参数。例如,这里有一个示例运算符

import bpy


class DialogOperator(bpy.types.Operator):
    bl_idname = "object.dialog_operator"
    bl_label = "Simple Dialog Operator"

my_float = bpy.props.FloatProperty(name="Some Floating Point")
my_bool = bpy.props.BoolProperty(name="Toggle Option")
my_string = bpy.props.StringProperty(name="String Value")

def execute(self, context):
    message = "Popup Values: %f, %d, '%s'" % \
        (self.my_float, self.my_bool, self.my_string)
    self.report({'INFO'}, message)
    return {'FINISHED'}

def invoke(self, context, event):
    wm = context.window_manager
    return wm.invoke_props_dialog(self)


bpy.utils.register_class(DialogOperator)

# test call
bpy.ops.object.dialog_operator('INVOKE_DEFAULT')

可以选择写

# test call
bpy.ops.object.dialog_operator('INVOKE_DEFAULT',myfloat=2.3,...)

以便为运算符中定义的参数设置值。我的问题是只有表格运算符中的字段" bpy.props。****属性"可以这种方式分配。

是否有人知道如何将 ANY 所需的参数集传递给运算符,方法与传递函数的方式相同?

注意:我想通过间接传递参数的一种丑陋方式是将你要传递的变量集声明为全局变量......

1 个答案:

答案 0 :(得分:0)

要移动相机并获取更新的3DView,请尝试使用modal operator。调用execute()并返回{'RUNNING_MODAL'}时,将重复调用运算符modal()方法,直到它返回{'FINISHED'}{'CANCELLED'}。在modal()范围内,您可以更改内容并在调用之间更新3DView。

使用bpy.props向运算符类添加属性是获取在blender中工作的属性的方法。虽然我们可以添加操作符本身可以使用的常规属性,但我们必须使用bpy.props来定义操作符可用的属性,这些属性在操作符执行期间设置并实现其操作,这些属性可以是由用户在操作员属性面板中进行调整,并实现操作员的撤消/重做。

有" Vector" Bool,Int和Float属性的版本,因此您可以在一个属性中拥有多个值。为了获得更大的灵活性,您可能希望使用PropertyGroup或查看定义自定义get and set functions

存储值的其他选项是向场景或对象添加属性,也可以使用模块属性(插件是python模块)或使用AddonPreferences