0

我想访问其他类的变量。其他类的静态变量很好访问。但是不能很好地访问该类的动态更改变量值。

为什么我无法获得更改后的变量值?


bl_info = {
    "name": "New Object",
    "author": "Your Name Here",
    "version": (1, 0),
    "blender": (2, 75, 0),
    "location": "View3D > Add > Mesh > New Object",
    "description": "Adds a new Mesh Object",
    "warning": "",
    "wiki_url": "",
    "category": "Add Mesh",
}

import bpy

class SelectFace(bpy.types.Operator):
    bl_idname = "object.d0"
    bl_label = "Select Face"

    selected_faces = 2

    def __init__(self):
        self.selected_faces = 3

    def execute(self, context):
        print("self.selected_faces: ", self.selected_faces)
        self.selected_faces +=  1
        bpy.ops.object.d1('INVOKE_DEFAULT')
        return {'FINISHED'}

class OperationAboutSelectedFaces(bpy.types.Operator):
    """ Test dialog. """
    bl_idname = "object.d1"
    bl_label = "Test dialog"

    F_num = bpy.props.IntProperty(name="be Selected face", default=1)

    @classmethod 
    def poll(self, context):
        obj = context.object
        return(obj and obj.type == 'MESH' and context.mode == 'OBJECT')

    def invoke(self, context, event):        

        # This block code is Not Work!  ---  TypeError: bpy_struct.__new__(type): expected a single argument.
        testInstance = SelectFace()   #  why not work?
        print("testInstance.selected_faces: ", testInstance.selected_faces)
        self.F_num = testInstance.selected_faces

        # This block code is nice Work!
        testInstance = SelectFace.selected_faces
        print("testInstance: ", testInstance)
        self.F_num = testInstance

        return context.window_manager.invoke_props_dialog(self)

    def execute(self, context):
        context.active_object.data.polygons [self.F_num].select = True
        return {'FINISHED'}  

    def register():
        bpy.utils.register_class(SelectFace)
        bpy.utils.register_class(OperationAboutSelectedFaces)

    def unregister():
        bpy.utils.unregister_class(SelectFace)
        bpy.utils.unregister_class(OperationAboutSelectedFaces) 

    if __name__ == "__main__":
        register()
        bpy.ops.object.d0()
4

2 回答 2

0

搅拌机中的操作员用于执行操作。虽然我们使用一个类来定义该动作和相关属性,但我们不应该将它们视为普通的 Python 类。运算符的属性应该用于调整执行的操作,而不是保存可变数据。

由于操作符属性控制操作符的结果,因此混合器使用它们来执行撤消/重做步骤。用户也可以使用操作员属性面板通过按下来调整这些属性,F6也可以在工具栏区域的底部找到这些属性。

运算符属性

添加bl_options = {'REGISTER', 'UNDO'}到您的运营商以允许用户调整您的运营商。您还可以通过为操作员提供draw(self,context)方法来自定义此面板中的显示。

当我们直接调用操作符时,要控制操作符如何执行它的任务,我们可以将属性添加到操作符调用中 -

bpy.ops.object.d1(F_num=4, val2=3.6)

如果要向面板添加操作员按钮,您可以使用 -

row.operator('object.d1').F_num = 4

或者,如果您需要设置多个值,您可以使用 -

op = row.operator('object.d1')
op.F_num = 4
op.val2 = 3.6

您提供的示例使用似乎仅对一个对象有效的属性,如果用户选择另一个对象,它将不再有效。此属性作为对象属性会更好地工作,您可以通过在插件中添加属性并将其删除来将属性添加到对象类(或其他几个列为ID 的子类register()unregister()

def register():
    bpy.types.Object.selected_faces = bpy.props.IntProperty()

def unregister():
    del bpy.types.Object.selected_faces

对于该示例,您甚至可以在需要该值时计算选定的面 -

selected_faces_count = len([f for f in obj.data.polygons if f.select])
于 2016-07-05T09:35:28.953 回答
0

我假设

testInstance = SelectFace() # 为什么不行?

是真正的问题。

见: https ://www.blender.org/api/blender_python_api_2_60a_release/info_overview.html

似乎不希望您编写创建 bpy.types.Operator 实例的代码。也许 Blender 以自己的方式处理 bpy.types.Operator 子类的创建。

“请注意,这些类没有定义init (self) 函数。虽然init () 和del () 如果定义将被调用,但类实例的生命周期仅跨越执行。因此,例如面板将为每个重绘,因此很少需要将变量存储在面板实例中。相反,持久性变量应该存储在 Blenders 数据中,以便在重新启动搅拌机时可以恢复状态。

另见,属性定义:https ://www.blender.org/api/blender_python_api_2_66a_release/bpy.props.html

于 2016-07-04T16:37:21.610 回答