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