ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python-如何根据上下文在Blender 2.63中更改运算符的标签?

2019-12-01 03:09:55  阅读:206  来源: 互联网

标签:label blender python user-interface


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

该脚本使用Blender的自定义属性功能将自定义标签写入输出文件.该模型通常由多个“部分”(父级为一棵树的Blender网格对象,一个“父级”和多个“子级”对象)组成,其中某些部分是简单的Blender Empty对象(仅适用于X,Y和Z坐标),并带有自定义属性,这些属性可标记出放置船舶推进装置(这是3D射击游戏)之类的位置,或在射击船舶时出现火焰/爆炸的位置.这些空部分也将成为“根”对象或其任何子代的父项.到目前为止,它一直运行良好,我编写了一个通用的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

解决方法:

猜猜我解决了.将运算符添加到面板时,可以执行以下操作:

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

标签:label,blender,python,user-interface
来源: https://codeday.me/bug/20191201/2077904.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有