QQ登录 微博登录 帐号登录 我已阅读并接受《用户协议》
QQ、微博及系统账号均为独立账号,账号信息不互通
欢迎来到C4D素材网
赞助会员下载VIP模型
立即加入
您的VIP会员开通成功!
您的VIP会员开通成功!
今日下载数已用完
赞助会员
感谢您留下宝贵的建议
下载提示!请输入验证码验证哦!
看不清,重新获取
提交验证码
首页 > 插件下载 > 常规辅助 >

C4D中像Houdini一样显示点线面序号脚本ShowIndex V1.0

0oFC4D模型
0oFC4D模型
想在C4D中像Houdini那样显示模型对象的点线面序号。试了一下,自己搞的屏幕绘制运行效率比较低,大模型的话显示会比较占资源,画面卡的厉害。所以用了另外一个投机的方法,利用C4D自有的矩阵对象的显示索引模式来实现点线面的序号显示。0oFC4D模型
0oFC4D模型
按照我的这个思路,会遇到三个问题:0oFC4D模型
-1.用矩阵的话我不想在视图大纲里被看到和被操作,只在视图里看到矩阵。0oFC4D模型
-2.当模型对象被关闭显示的时候,矩阵也能被关闭显示。0oFC4D模型
-3.当脚本工具被关闭后,场景中遗留了矩阵,下次如何能够继续控制矩阵。0oFC4D模型
接下来围绕这三个问题,介绍一下脚本的实现过程。0oFC4D模型
0oFC4D模型
一、隐藏矩阵对象  0oFC4D模型
在C4D中可以通过下面的方式将矩阵对象设置为超级隐藏模式。0oFC4D模型
matrix.ChangeNBit(c4d.NBIT_OHIDE, c4d.NBITCONTROL_SET),如此设置后可以在大纲视图中隐藏和不被操作。0oFC4D模型
创建一个GUI类之后,再添加一个显示序号的方法并定义,如下:0oFC4D模型
    def show_index(self, show_type):0oFC4D模型
        """0oFC4D模型
        show_type=0:point0oFC4D模型
        show_type=1:edge0oFC4D模型
        show_type=2:polygon0oFC4D模型
        show)type=5:axis0oFC4D模型
        """0oFC4D模型
        obs = doc.GetActiveObjects(c4d.GETACTIVEOBJECTFLAGS_CHILDREN)0oFC4D模型
        for ob in obs:0oFC4D模型
            if self.isIn(show_type):0oFC4D模型
                self.delete_index(show_type)0oFC4D模型
            else:0oFC4D模型
                matrix = c4d.BaseObject(1018545)0oFC4D模型
                matrix[c4d.ID_BASELIST_NAME] = 'Show_index'0oFC4D模型
                matrix[c4d.ID_MG_MOTIONGENERATOR_MODE] = 00oFC4D模型
                matrix[c4d.ID_MG_TRANSFORM_DISPLAYMODE] = 40oFC4D模型
                matrix[c4d.ID_MG_TRANSFORM_SCALE, c4d.VECTOR_X] = 00oFC4D模型
                matrix[c4d.ID_MG_TRANSFORM_SCALE, c4d.VECTOR_Y] = 00oFC4D模型
                matrix[c4d.ID_MG_TRANSFORM_SCALE, c4d.VECTOR_Z] = 00oFC4D模型
                matrix[c4d.MG_OBJECT_LINK] = ob0oFC4D模型
                matrix[c4d.MG_POLY_MODE_] = show_type0oFC4D模型
                matrix.ChangeNBit(c4d.NBIT_OHIDE, c4d.NBITCONTROL_SET)0oFC4D模型
                doc.InsertObject(matrix)0oFC4D模型
                self.add_xp_tag(ob, matrix)0oFC4D模型
                self.matrix[self.lst[show_type]].append(matrix)0oFC4D模型
                self.objs[self.lst[show_type]].append(ob)0oFC4D模型
                c4d.EventAdd()0oFC4D模型
比较顺利的完成了弟—个问题。0oFC4D模型
0oFC4D模型
二、模型和矩阵对象属性联动  0oFC4D模型
能够实现联动,我考虑用XPresso去绑定两个对象的对应属性。0oFC4D模型
首先,通过代码去创建一个XPresso标签并添加在矩阵对象上。0oFC4D模型
0oFC4D模型
xp_tag = c4d.modules.graphview.XPressoTag()0oFC4D模型
matrix.InsertTag(xp_tag)0oFC4D模型
c4d.EventAdd()0oFC4D模型
0oFC4D模型
然后,在这个XPresso标签里插入两个对象节点,分别赋予模型对象和矩阵对象。0oFC4D模型
0oFC4D模型
# 创建xpresso的master0oFC4D模型
xp_master = xp_tag.GetNodeMaster()0oFC4D模型
# 创建xpresso的节点根目录0oFC4D模型
xp_root = xp_master.GetRoot()0oFC4D模型
# 创建节点0oFC4D模型
obj_node = xp_master.CreateNode(xp_root, c4d.ID_OPERATOR_OBJECT, insert=None, x=100, y=100)0oFC4D模型
matrix_node = xp_master.CreateNode(xp_root, c4d.ID_OPERATOR_OBJECT, insert=None, x=300, y=100)0oFC4D模型
0oFC4D模型
为模型对象的节点的输出端和矩阵对象的输入端分别添加可见性、可渲染和启用三个属性。0oFC4D模型
0oFC4D模型
# 为对象节点添加输出端口0oFC4D模型
obj_node_editor = obj_node.AddPort(c4d.GV_PORT_OUTPUT, c4d.DescID(c4d.DescLevel(901, 15, 5155)), message=False)0oFC4D模型
obj_node_render = obj_node.AddPort(c4d.GV_PORT_OUTPUT, c4d.DescID(c4d.DescLevel(902, 15, 5155)), message=False)0oFC4D模型
obj_node_generator = obj_node.AddPort(c4d.GV_PORT_OUTPUT, c4d.DescID(c4d.DescLevel(906, 400006001, 5155)),0oFC4D模型
                                             message=False)0oFC4D模型
 # 为矩阵节点添加输入端口0oFC4D模型
matrix_node_editor = matrix_node.AddPort(c4d.GV_PORT_INPUT, c4d.DescID(c4d.DescLevel(901, 15, 5155)),0oFC4D模型
                                             message=False)0oFC4D模型
matrix_node_render = matrix_node.AddPort(c4d.GV_PORT_INPUT, c4d.DescID(c4d.DescLevel(902, 15, 5155)),0oFC4D模型
                                             message=False)0oFC4D模型
matrix_node_generator = matrix_node.AddPort(c4d.GV_PORT_INPUT, c4d.DescID(c4d.DescLevel(906, 400006001, 5155)),0oFC4D模型
                                             message=False)0oFC4D模型
0oFC4D模型
这里需要知道这三个属性的端口c4d.DescID。可以选中场景中需要查询的对象,通过下面的代码来查询:0oFC4D模型
0oFC4D模型
import c4d0oFC4D模型
description = op.GetDescription(c4d.DESCFLAGS_DESC_NONE) 0oFC4D模型
for bc, paramid, groupid in description:0oFC4D模型
  print(bc[c4d.DESC_NAME],paramid) 0oFC4D模型
0oFC4D模型
我这里得到了可见性端口的ID:c4d.DescID(c4d.DescLevel(901, 15, 5155)),可渲染端口的ID:c4d.DescID(c4d.DescLevel(902, 15, 5155)),启用端口的ID:c4d.DescID(c4d.DescLevel(906, 400006001, 5155))。0oFC4D模型
蕞后,链接两个节点对应的端口。0oFC4D模型
0oFC4D模型
# 将节点端口对应连接0oFC4D模型
obj_node_editor.Connect(matrix_node_editor)0oFC4D模型
obj_node_render.Connect(matrix_node_render)0oFC4D模型
obj_node_generator.Connect(matrix_node_generator)0oFC4D模型
0oFC4D模型
0oFC4D模型
这样两个对象的属性就被绑定了。0oFC4D模型
0oFC4D模型
三、识别场景中的超级隐藏对象  0oFC4D模型
由于我们在创建超级隐藏的矩阵对象时,并没有将他们添加到某个对象的子集,所以只要遍历弟—层级的对象就可以了。实现这个方法是为了避免当把脚本关闭之后场景中遗留了矩阵对象又无法选中和删除的问题。通过GeListNode的方法来遍历C4D文档中的所有对象。为类添加初始化信息:0oFC4D模型
0oFC4D模型
class ShowIndex(c4d.gui.GeDialog):0oFC4D模型
    def __init__(self):0oFC4D模型
        self.matrix = {'point': [], 'edge': [], 'polygon': [], 'object': []}0oFC4D模型
        self.objs = {'point': [], 'edge': [], 'polygon': [], 'object': []}0oFC4D模型
        self.lst = ['point', 'edge', 'polygon', 0, 0, 'object']0oFC4D模型
        self.Init()0oFC4D模型
0oFC4D模型
我这里分成了两个字典,分别用于专门存放模型对象和矩阵对象,并创建对应的点线面键值对结构。由于矩阵中的点线面的变量参数不是连续的,所以也初始化了一个列表用于后续匹配字典的键值对。0oFC4D模型
0oFC4D模型
    def clear(self, mode=False):0oFC4D模型
        obj = self.choice()0oFC4D模型
        head = obj.GetListHead()0oFC4D模型
        lst = []0oFC4D模型
        node = None0oFC4D模型
        first = True0oFC4D模型
        while True:0oFC4D模型
            if first:0oFC4D模型
                node = head.GetDown()0oFC4D模型
            else:0oFC4D模型
                node = node.GetNext()0oFC4D模型
            first = False0oFC4D模型
            if node is None:0oFC4D模型
                break0oFC4D模型
            else:0oFC4D模型
                if node.GetNBit(c4d.NBIT_OHIDE):0oFC4D模型
                    if node.IsInstanceOf(1018545) and node[c4d.ID_BASELIST_NAME] == "Show_index" and \0oFC4D模型
                            node[c4d.ID_LAYER_LINK] is None:0oFC4D模型
                        lst.append(node)0oFC4D模型
        obj.Remove()0oFC4D模型
        if mode:0oFC4D模型
            return lst0oFC4D模型
        else:0oFC4D模型
            for n in lst:0oFC4D模型
                n.Remove()0oFC4D模型
            c4d.EventAdd()0oFC4D模型
            return True0oFC4D模型
0oFC4D模型
这个clear方法通过mode控制实现删除和保存node列表的存储功能。再通过另外一个方法来实现对GUI类的初始化。0oFC4D模型
0oFC4D模型
    def Init(self):0oFC4D模型
        node_lst = self.clear(mode=True)0oFC4D模型
        for node in node_lst:0oFC4D模型
            if node[c4d.MG_OBJECT_LINK]:0oFC4D模型
                key = self.lst[node[c4d.MG_POLY_MODE_]]0oFC4D模型
                self.matrix[key].append(node)0oFC4D模型
                self.objs[key].append(node[c4d.MG_OBJECT_LINK])0oFC4D模型
            else:0oFC4D模型
                node.Remove()0oFC4D模型
0oFC4D模型
通过读取矩阵对象的引用【对象】和【分布】,将数据放置到初始化中。利用初始化的信息来实现显示和产出节点序号删除的矩阵方法如下:0oFC4D模型
0oFC4D模型
    def delete_index(self, show_type):0oFC4D模型
        """0oFC4D模型
        Undisplay sequence number.0oFC4D模型
        :param show_type: 0:point,1:edge,2:polygon,5:axis0oFC4D模型
        :return: None0oFC4D模型
        """0oFC4D模型
        for matrix in self.matrix[self.lst[show_type]]:0oFC4D模型
            ob = matrix[c4d.MG_OBJECT_LINK]0oFC4D模型
            if ob.GetBit(c4d.BIT_ACTIVE):0oFC4D模型
                ob.DelBit(c4d.BIT_ACTIVE)0oFC4D模型
                matrix.SetBit(c4d.BIT_ACTIVE)0oFC4D模型
                c4d.CallCommand(100004787)0oFC4D模型
                self.matrix[self.lst[show_type]].remove(matrix)0oFC4D模型
                self.objs[self.lst[show_type]].remove(ob)0oFC4D模型
                ob.SetBit(c4d.BIT_ACTIVE)0oFC4D模型
0oFC4D模型
结合以上的三个问题解决方式,整个脚本也就完成得八九不离十了。0oFC4D模型
0oFC4D模型
【脚本安装】0oFC4D模型
1..打开C4D,shift+F11打开【脚本管理器】,点击“文件”→“导入脚本”,选择文件夹中的ShowIndex_V1.0.py文件。0oFC4D模型
2.导入.py文件之后,shift+F12打开【命令管理器】,在搜索框中输入ShowIndex0oFC4D模型
3.将词条拖入C4D的窗口合适的位置,并保存窗口布局方便使用。0oFC4D模型
4.也可以设置快捷键。0oFC4D模型
0oFC4D模型
【使用步骤】 0oFC4D模型
1.点击脚本图标(如未安装请参考上面的脚本安装方法添加到窗口中。)0oFC4D模型
2.选择要显示序号的模型对象。0oFC4D模型
3.点击对应的按钮即可。0oFC4D模型
4.如果需要清理遗留的序号显示,可以点击上方的【optin】中的【Clear】即可清理。0oFC4D模型
0oFC4D模型
【版本信息】C4D R19及以上。0oFC4D模型
【作者信息】西技大神

C4D脚本:C4D中像Houdini一样显示点线面序号脚本ShowIndex V1.0(Houdini,显示点,显示线,显示面,点线面,序号,ShowIndex),版本为ShowIndex V1.0,分类属于常规辅助,软件语言为中文,支持PC(Windows) , MAC(Mac OS)系统平台,安装好的脚本会出现在CINEMA 4D软件的脚本菜单下拉位置,附件大小约294.15 KB,下载方式为本地下载。更多不错常规辅助下载,尽在C4D模型-C4D.COM。

立即下载
收藏
137
0
5
  • 提供者:
  • 插件评分:
  • 编号:
    7613
  • 权限:
  • 模点:
    0点
  • 属性:
    常规辅助脚本
  • 语言:
    中文
  • 平台:
    PC(Windows) / MAC(Mac OS)
  • 版本:
    ShowIndex V1.0
  • 位置:
    脚本菜单下拉
  • 大小:
    294.15 KB
  • 下载方式:
    本地下载
  • 更新时间:
    2023-09-28 20:15:39
您可能还喜欢其他相关插件