如何访问其他用户类(blender python)的变量?

时间:2016-07-04 12:28:29

标签: python blender bpy

我想访问其他Class的变量。 其他Class的静态变量非常好访问。 但dynimic改变了类的变量值并没有很好的访问。

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

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()

2 个答案:

答案 0 :(得分: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数据中,以便在重新启动blender时恢复状态。"

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

答案 1 :(得分:0)

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

当运算符属性控制运算符的结果时,blender会使用它们来执行撤消/重做步骤。这些属性也可由用户使用操作员属性面板按 F6 进行调整,也可以在工具栏区域的底部找到。

operator properties

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

您提供的示例使用的属性似乎仅对一个对象有效,如果用户选择另一个对象,则该属性将不再有效。此属性可以更好地作为对象属性使用,您可以add a property添加到对象类(或其他几个列为subclasses of ID),方法是将其添加到插件register()中并将其删除unregister() 1}}

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])