如何访问其他用户类的变量(Blender Python)?

2024-10-03 05:28:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我想访问其他类的变量。 其他类的静态变量访问非常好。 但dynimic changed这个类的变量值不能很好地访问。在

为什么我不能得到变化的变量值?在


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

Tags: selfregisterreturnobjectdefcontextutilsnum
2条回答

混合器中的操作员用于执行操作。当我们使用一个类来定义该操作和相关属性时,我们不应该将它们视为普通的python类。运算符的属性应该用来调整操作表达式,而不是用来保存变量数据。在

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

{a1}

bl_options = {'REGISTER', 'UNDO'}添加到运算符,以允许用户调整运算符。您也可以通过给操作员一个draw(self,context)方法来自定义此面板中的显示。在

为了控制在我们直接调用运算符时运算符如何执行其任务,我们可以将属性添加到运算符调用-

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

如果要将操作员按钮添加到面板,则可以使用-

^{pr2}$

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

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

您提供的示例使用的属性似乎仅对一个对象有效,如果用户选择另一个对象,则该属性将不再有效。此属性作为一个对象属性会更好地工作,您可以add a property添加到对象类(或其他列为subclasses of 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])

我认为

testInstance = SelectFace() # why not work?

才是真正的问题。在

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

似乎不希望您编写的代码创建bpy.types.运算符. 也许是搅拌机手柄bpy.types.运算符以自己的方式创建子类。在

“注意这些类没有定义init(self)函数。虽然如果定义了init()和del()将被调用,但类实例的生存期仅跨越执行过程。因此,例如面板,每次重画都会有一个新实例,因此很少有理由在面板实例中存储变量。相反,持久变量应该存储在blender数据中,以便在blender重新启动时恢复状态。”

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

相关问题 更多 >