如何根据上下文更改 Blender 2.63 中操作员的标签?

Posted

技术标签:

【中文标题】如何根据上下文更改 Blender 2.63 中操作员的标签?【英文标题】:How to change Operator's label in Blender 2.63 depending on the context? 【发布时间】:2012-07-15 12:49:30 【问题描述】:

我正在为我的朋友和我正在制作的游戏编写导出器,它涉及为对象设置自定义属性和标签,然后在游戏中识别并进行相应处理。我们用 C/C++ 编写的引擎已经用我当前版本的导出脚本成功测试,我目前正在整理它。

脚本使用 Blender 的自定义属性功能将自定义标签写入输出文件。该模型通常由多个“部分”(Blender 网格对象作为父对象形成一棵树,具有一个“父”和多个“子”对象)组成,其中一些部分是简单的 Blender Empty 对象(只有它是 X、Y和 Z 坐标是必需的)具有自定义属性,用于标记诸如船舶推进(它是一个 3D 射击游戏)之类的东西的放置位置,或者船舶被射击时火焰/爆炸出现的位置。这些空白部分也作为“根”对象或其任何子对象的父级。到目前为止它运行良好,我已经编写了一个通用 Operator 类和一些扩展类,它们驻留在面板中设置部件的属性(非常方便,因为您不必手动添加这些自定义属性)。

现在我想进一步加快速度,即能够简单地单击所需类型的运算符,它应该自动将其添加到场景中并将其作为活动/选定对象的父级。我知道该怎么做,但我无法让那些运营商更改他们的标签。基本上,我想要的是运营商在选择现有的空时说'Bullet Point'(我已经完成了该部分),并且当有一个网格对象时选择“添加子弹点”。所以我只需要一种根据上下文动态更改操作员标签的方法(因为问题的标题清楚地说明了:))

这是我目前得到的:

class OBJECT_OT_tg_generic (bpy.types.Operator):
    bl_label        =   "Sets Generic Part Type"
    bl_idname       =   "rbm.set_generic_part_type"

    OB_TYPE         =   None

    @classmethod
    def poll (cls, context):
        act = context.active_object
        if 'Type' in act.keys ():
            if act['Type'] == cls.OB_TYPE:
                cls.bl_label = 'foo'
                print (cls.bl_label)
                # this prints foo but doesn't change the label
                return False
        return True

    def execute (self, context):
        # TODO: add code to automatically place empties and parent them to active object
        bpy.context.active_object['Type'] = self.OB_TYPE
        return"FINISHED"

还有一个子类的例子:

class OBJECT_OT_tg_bullet_point (OBJECT_OT_tg_generic):
    bl_label        =   "Bullet Point"
    bl_idname       =   "rbm.set_bullet_point"

    OB_TYPE         =   OT_BULLET_POINT

这是它在 Blender 中的外观: http://i.imgur.com/46RAS.png

【问题讨论】:

谢谢,我是新来的,老实说,没有阅读规则。 【参考方案1】:

我猜我解决了。当您向面板添加运算符时,您可以执行以下操作:

def draw (self, context):
    layout = self.layout
    row = layout.row()
    row.operator("foo.bar", text="Whatever you want")

“随心所欲”将成为您按钮的标签。但我所做的是另一回事。我没有更改操作员的标签,而是根据它是网格还是当前选择/活动的空来给他们不同的图标:

def draw (self, context):
    # (...) we're skipping some code here, obviously
    act = context.active_object
    if act.type == 'MESH':
        op_icon = 'ZOOMIN'
    else:
        op_icon = 'EMPTY_DATA'

    row = layout.column(align=True)
    row.operator('rbm.set_bullet_point', icon=op_icon)
    row.operator('rbm.set_rocket_point', icon=op_icon)
    # (...) rest of the code

【讨论】:

以上是关于如何根据上下文更改 Blender 2.63 中操作员的标签?的主要内容,如果未能解决你的问题,请参考以下文章

Blender源码分析之OpenGL函数初步

Blender源码分析之OpenGL函数初步

如何在 Blender 中有效地更改多个对象的相同参数?

如何根据其他状态更改更新一个状态项?

Blender源码分析之上下文的索引结构

Blender源码分析之上下文的索引结构