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

3

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

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

现在我想进一步加快速度,即能够简单地单击所需类型的操作符,它应自动添加到场景中并将其父级化到活动/选定对象。我知道如何做到这一点,但我无法使那些操作符更改它们的标签。基本上,我想要的是当选择现有空对象时,操作符应显示“Bullet point”(我已经完成了这部分),当选择网格对象时,应显示“Add 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
谢谢,我在这里还比较新,老实说没有仔细阅读规则。 - Vladimir Mitrovic
1个回答

4

我猜我解决了它。当您向面板添加运算符时,可以像这样操作:

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

“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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接