调用rmtl文件赋予给选取对象如何写?

您好,
犀牛5 想调用一个保存好的rmtl后缀的材质文件赋予给选取对象用犀牛代码如何写?犀牛本身巨集命令代码可以写吗?或者说调用RS脚本代码或py怎么写?

@Jorin,麻煩你看一下這個問題,謝謝。

你好,
RhinoScript 和 Python 中都没有直接能够读取 rmtl 文件的工具。
如果你要完全自己控制读取的话,就需要自己写函数来解析 XML 文件,rmtl 事实上就是 XML 文件,通过读取到的文件再创建新的材质然后赋值给选定的对象。

抓取 rmtl 文件还是建议以直接执行命令的方式。
假如我的材质在 F 盘,名称叫 test.rmtl,python 中可以这样写:

import rhinoscriptsyntax as rs rs.Command("_RenderLoadMaterialFromFile F:\\test.rmtl")

这样就可以把外部文件拿进来了。

具体赋材质,就可以用 ObjectMaterialIndex 函数了:
http://bbs.shaper3d.com/pythonhelp/scr/Functions/ObjectMaterialIndex.htm

赋材质之前请先把物件的材质来源设置为“从物件”,需要用函数 ObjectMaterialSource 来修改
http://bbs.shaper3d.com/pythonhelp/scr/Functions/ObjectMaterialSource.htm

其他关于材质的函数:
http://bbs.shaper3d.com/pythonhelp/index.htm#page=Modules/Material_Module.htm

@Jorin 谢谢热心解答,我按照你说的试了,调用盘符的材质是可以的,但是如何把调入进来的材质赋予给选取对象呢,例如test.rmtl 如何赋予给选取的一个对象上,这个代码段不会弄

我试了试的确不行,虽然 rs.Command("_RenderLoadMaterialFromFile F:\test.rmtl") 能把材质放到 Rhino 的材质库中,但是 不管是 python script 还是 RhinoCommon SDK 都不能对材质库中从未赋值的材质直接进行操作,能够操作的只有已经做过赋值操作的材质

材质库中的材质都存放在 scriptcontext.doc.RenderMaterials 中,而场景中物件所具有的材质是在 scriptcontext.doc.Materials,如果材质库中的材质未赋给任何物件,强行操作就会报错。最多只能做到读取材质材质库中材质的数量和材质的名称。

ObjectMaterialIndex 函数也只能把 scriptcontext.doc.Materials 中的材质再赋予给其他物件,不能操作 RenderMaterials。换句话说就是 只能操作你用代码自定义的材质和已经为物件赋值过的材质。

RhinoObject 这个类有 RenderMaterial 属性,但这个属性是只读的,可以看出来这是做了一些保护,不能够随意操作的。

包括下面这个帖子中,该楼主所提出的第二个问题,需求和你是一样的, Dale 给出的建议也不包含任何需要用代码来实现的操作:

如果非要用 rmtl 的话,看来只能自己解析 XML 了。