请教一个问题,如何用python让所有图层的材质名称和图层名称一样并添加下划线。

感谢NARUTO版主之前在其他帖子里回复的信息,我创建了个类似的代码,但是却无法实现让所有图层的材质名称和图层名称一样并添加下划线


代码如下

#coding=utf-8
import rhinoscriptsyntax as rs

objs = rs.GetObjects(“”)
if objs:
for obj in objs:
layer = rs.ObjectLayer(obj)
rs.MaterialName(obj,layer)

然后用下面代码也没办法实现…新手实在没招了

#coding=utf-8
import Rhino.Geometry

获取选中对象的材质索引

selection = Rhino.UI.RhinoGet.GetObjects(1)
if len(selection) == 0:
print(“”)
else:
object = selection[0].Object()
material_index = Rhino.Geometry.Material.IndexFromMaterial(object.Material())
if material_index == Rhino.Geometry.Material.InvalidIndex:
print(“该对象没有材质。”)
else:
# 获取选中对象的图层名称
layer_name = object.LayerName()
if layer_name == “”:
print(“该对象没有在任何图层中。”)
else:
# 更改材质名称
material = Rhino.Geometry.Material.Materials[material_index]
material.Name = layer_name
print(f"已将选中对象的材质名称更改为 {layer_name}。")

求助大佬们有没有帮忙看下哪里有问题,怎么解决。我感觉这个物件材质的名称不是MaterialName。但是参考了Rhino的 MaterialName (rhino3d.com)
感觉好像又没错
:joy:

Python 的代码不加缩进根本没法看,请先按照下面的格式处理下代码:

在讨论区贴代码时语法高亮及保持格式的方法

你的需求都没说清楚

import Rhino

for layer in Rhino.RhinoDoc.ActiveDoc.Layers:
    
    name = layer.Name+'_M'    
    material_id = Rhino.RhinoDoc.ActiveDoc.Materials.Find(name,True)

    if material_id == -1:
        material = Rhino.DocObjects.Material()
        material.Name = name
        material_id=Rhino.RhinoDoc.ActiveDoc.Materials.Add(material)

    layer.RenderMaterialIndex=material_id

先把伪代码写好

针对每个图层:
    获取图层名字并加上"_M"
    找这个材质的ID
        如果找得到ID说明材质已经有了(不管何种原因)
        找不到的话,新建一个材质,然后重新获取材质ID
    把图层的材质ID设定为这个材质
1 个赞

非常感谢回复,首先我之前的想法应该是错误的。我想要的是每个**图层材质的名**称和对应图层名称一致,材质内容不重要,之前一致误以为是物件材质(图层材质和物件材质不是一种东西,所表示的方法也不一样)。后面查了发现新的引用 LayerMaterial 但是LayerMaterialName 却无法识别。我的需求就是想要下面的这段伪代码。


Python:

伪代码
针对每个图层:
    获取图层名字并加上"_M"
    找每个对应图层材质的名称
    把图层的材质名称设定为这个图层的名字加上尾缀_M

为此我写了如下几个类似的代码,一直无法解决,中途发现可能需要赋予新的图层材质,新增材质添加到对应图层,然后再命名图层的材质,也是无法实现,最大的障碍在于我是个完全新手…希望能得到前辈和大佬们的指导…我原先设定的是所选物体的名称和对应图层的名称一致,然后再根据每个图层名称赋予图层材质名称一致。但是因为错误认为物体的材质名称和图层材质名称一样…头疼…绕晕了

Python:

#coding=utf-8  
import rhinoscriptsyntax as rs  
  
objs = rs.GetObjects("")  
if objs:  
    for obj in objs:  
        layer = rs.ObjectLayer(obj)  
        rs.LayerMaterialName(index,ObjectName+"_m")




#coding=utf-8    
import rhinoscriptsyntax as rs    
    
objs = rs.GetObjects("")    
if objs:    
    for obj in objs:    
        layer = rs.ObjectLayer(obj)    
        rs.ObjectName(obj, layer)    
        index = rs.LayerMaterialIndex(obj)    
        if index>-1:    
            ObjectName = rs.ObjectName(obj)   
            rs.LayerMaterialIndex(index, ObjectName+"_m")

你的新代码为什么要用obj循环呢?
如果你有5个图层,但是有50000个obj
那这个代码岂不是纯纯地在浪费时间了

默认情况是这样的
物体材质=物体所在图层的材质
图层材质自己给,不给的话图层是默认材质

这段代码是否解决了你的问题?
如果是的话,后面就不用补充了,信息太多会浪费大家的时间,你的基本概念是如何搞错的,各种前因后果和这个帖子的咨询是没关系的。

针对性解决问题,保证论坛的效率

1 个赞

上面代码解决了我的问题,谢谢大佬。 :grinning: