c4d工程文件的保护主要是把python代码隐藏、把对象隐藏、把expresso隐藏、对expresso加密码等。下面一一分析说明。
第*部分:隐藏python tag。文件代表:官方preset://Visualize.lib4d,里面有一个Living Room.c4d。
粗略分析一下现有对象,Furniture下有一个Book Generator - NitroMan的python generator,它下面是一堆python generator,前面都带“+”号,通常这表示还有下一层,但点开又什么都没有,所以从这里入手。
1)分析Book Generator - NitroMan的code(记为代码A),得知以下一句。
- c4d.CallFunction(op[1033550],"m1",op)
复制代码
2)在Script Manager运行以下代码(加在main方法里),由Console的结果得知Book Generator - NitroMan有一个python tag,并处于隐藏状态。
- obj = doc.SearchObject("Book Generator - NitroMan")
- if obj:
- print obj
- print obj[1033550]
复制代码
3)刚才的代码下面添加以下三行,并运行,在Console里右键>copy all,得到python tag的代码原貌(记为代码B),并复制到文本编辑器进行下一步分析。
- tag = obj[1033550]
- # 获取python tag.code
- print "|---", tag[c4d.TPYTHON_CODE]
复制代码
4)分析代码B,发现被隐藏的代码A中调用的m1、m2等方法,并得到以下一句。
- c4d.CallFunction(op[1033547],"m1",obj)
复制代码
5)刚才的代码zui*后一行注释掉,并在下面添加以下两行。然后把Console的代码清空,再到Script Manager里运行,得知node是一个expresso的python node。
- node = tag[1033547]
- print node
复制代码
6)添加以下代码并运行,得到另一段代码(记为代码C),复制到新的文档进行分析。
- print "|---", node[c4d.GV_PYTHON_CODE]
复制代码
7)分析代码C,得到隐藏对象的核心方法HideObject和反隐藏对象的方法UnHideObject。
8)刚才的代码zui*后一行注释掉,添加以下代码并运行,得到Book Generator - NitroMan的隐藏xpresso tag
- for tag2 in obj.GetTags():
- tag2[c4d.EXPRESSION_ENABLE] = False
- UnHideObject(tag2)
复制代码
9)查看xpresso,可以看到,xpresso被密码保护,看不到里面的内容。至此,分析结束。当然,有需要的情况下,还可以利用GvNode需要深入探索,这里不展开。
10)完整代码(注意python代码是严格缩进格式的):
- import c4d
- from c4d import gui
- def UnHideObject(obj):
- obj.ChangeNBit(c4d.NBIT_THIDE,c4d.NBITCONTROL_CLEAR)
- obj.ChangeNBit(c4d.NBIT_OHIDE,c4d.NBITCONTROL_CLEAR)
-
- def main():
- obj = doc.SearchObject("Book Generator - NitroMan")
- if obj:
- print obj
- print obj[1033550]
-
- tag = obj[1033550]
- # 获取python tag.code
- #print "|---", tag[c4d.TPYTHON_CODE]
-
- node = tag[1033547]
- print node
- #print "|---", node[c4d.GV_PYTHON_CODE]
- for tag2 in obj.GetTags():
- tag2[c4d.EXPRESSION_ENABLE] = False
复制代码
------------------------------------------------------
第二部分:图层互斥锁。文件代表:Bendy Limbs Rig for Cinema 4D。
打开文件,只见到一个BendyLimbsRig的Null,再没有其它对象。而几个上锁的图层,还有主视图里面的几个Spline对象,说明里面隐藏着什么,所以从这里入手。
1)添加一个Null,名字随意(我起名为Unlocker),并添加一个python tag。
2)python tag的Priority设置为{Generators,499}。
3)双击python tag图标,在Expression Editor里,把全部代码替换为以下代码,即可显示全部隐藏的内容。
- import c4d
- def UnlockAllLayers():
- doc = c4d.documents.GetActiveDocument()
- if not doc: return
- print "=== UnlockAllLayers ==="
- layerRoot = doc.GetLayerObjectRoot()
- if layerRoot:
- layer = layerRoot.GetDown()
复制代码- while layer:
- layer[1000] = 0 # solo
- layer[1003] = 1 # visible in manager
- layer[1004] = 0 # locked
- layer[c4d.ID_LAYER_VIEW] = 1
- layer[c4d.ID_LAYER_RENDER] = 1
- layer = layer.GetNext()
- def main():
- UnlockAllLayers()
复制代码
以上。
|
|