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

时间:2012-07-16 16:11:33

标签: python user-interface label blender

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

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

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

这是我到目前为止所得到的:

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 个答案:

答案 0 :(得分:3)

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

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