我想访问其他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()
答案 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 进行调整,也可以在工具栏区域的底部找到。
将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])