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

**URL:** <https://cn.discourse.mcneel.com/t/rmtl/878>\
**Category:** RhinoScript / RhinoPython\
**Created:** [2016年三月24日 02:30 UTC](https://cn.discourse.mcneel.com/t/rmtl/878 "2016-03-24T02:30:54Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Alen\_Russ](https://avatars.discourse-cdn.com/v4/letter/a/278dde/32.png) [@Alen\_Russ](https://cn.discourse.mcneel.com/u/Alen_Russ)\
**Post date:** [2016年三月24日 02:30 UTC](https://cn.discourse.mcneel.com/t/rmtl/878/1 "2016-03-24T02:30:54Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![KelvinC](https://sea3.discourse-cdn.com/mcneel/user_avatar/cn.discourse.mcneel.com/kelvinc/32/3391_2.png) [@KelvinC](https://cn.discourse.mcneel.com/u/KelvinC)\
**Post date:** [2016年三月24日 05:12 UTC](https://cn.discourse.mcneel.com/t/rmtl/878/2 "2016-03-24T05:12:16Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Jorin](https://sea3.discourse-cdn.com/mcneel/user_avatar/cn.discourse.mcneel.com/jorin/32/3292_2.png) [@Jorin](https://cn.discourse.mcneel.com/u/Jorin)\
**Post date:** [2016年三月25日 07:48 UTC](https://cn.discourse.mcneel.com/t/rmtl/878/3 "2016-03-25T07:48:52Z")

</div>

你好，  
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](http://bbs.shaper3d.com/pythonhelp/scr/Functions/ObjectMaterialIndex.htm)

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

其他关于材质的函数：  
[http://bbs.shaper3d.com/pythonhelp/index.htm#page=Modules/Material\_Module.htm](http://bbs.shaper3d.com/pythonhelp/index.htm#page=Modules/Material_Module.htm)

---

<div class="post-metadata">

**Author:** ![Alen\_Russ](https://avatars.discourse-cdn.com/v4/letter/a/278dde/32.png) [@Alen\_Russ](https://cn.discourse.mcneel.com/u/Alen_Russ)\
**Post date:** [2016年三月25日 08:35 UTC](https://cn.discourse.mcneel.com/t/rmtl/878/4 "2016-03-25T08:35:40Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Jorin](https://sea3.discourse-cdn.com/mcneel/user_avatar/cn.discourse.mcneel.com/jorin/32/3292_2.png) [@Jorin](https://cn.discourse.mcneel.com/u/Jorin)\
**Post date:** [2016年三月26日 13:31 UTC](https://cn.discourse.mcneel.com/t/rmtl/878/5 "2016-03-26T13:31:32Z")

</div>

我试了试的确不行，虽然 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 给出的建议也不包含任何需要用代码来实现的操作：

> **[RhinoCommon - Programmatically added material is duplicated when added to...](http://discourse.mcneel.com/t/rhinocommon-programmatically-added-material-is-duplicated-when-added-to-another-object/30642/4?u=jorinchi)**
>
> Hi Chris, There are couple of better approaches to adding default “stuff” to a document. First, you can create template files. These are what you see when you run the New command. Template files can hold pretty much anything you want (layers,...

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