如何写巨集,实现只显示选中某几个物体的图层,其他图层都关掉。

请教:用过天正cad的,有一个针对图层的命令叫关闭其他,请问在rhino中可以用巨集实现吗?就是只有选中的某几个物体所在的图层显示,其他关闭。注意选中的物体可能是多个,位于不同的层。

Rhino 中没有办法通过 Macro 实现你要的功能,因为 Macro 没办法直接调用图层面板的功能。

Rhino 自带的功能可以实现,但是步骤比较繁琐,不够丝滑。

操作逻辑:
选中物件–>执行指令HighlightObjectLayers(Rhino 8 的指令)–>在图层面板菜单中反选图层–>点击图层列表中的💡关闭即可。
layer00

以上方法有一个缺陷:无法关闭当前图层(打勾的)。


如果想实现一键关闭其他图层的功能可以通过脚本,以下是一段示例:

#coding=utf-8
import rhinoscriptsyntax as rs

def CloseOtherLayers():
    # 获取选中的物体的对象ID
    selected_objects = rs.GetObjects("请选择物件(可多选)",preselect = True)
    if not selected_objects:
        print("未选择任何物件或操作取消!") #py3的写法
        return
    
    # 获取选中物体所在的图层名称
    selected_layer_names = set()
    for obj_id in selected_objects:
        layer_name = rs.ObjectLayer(obj_id)
        selected_layer_names.add(layer_name)
    # 获取当前图层
    current_layer = rs.CurrentLayer()
    
    # 获取第一个选中物体所在的图层名称
    first_object_layer = rs.ObjectLayer(selected_objects[0])

    # 禁用屏幕重绘
    rs.EnableRedraw(False)
    
    # 如果选中的物体所在的图层与当前图层不同,则将当前图层修改为选中物体所在的图层
    if first_object_layer != current_layer:
        rs.CurrentLayer(first_object_layer)
    else:
        rs.CurrentLayer(current_layer)

    # 关闭除选中图层外的其他图层
    all_layer_names = rs.LayerNames()
    for layer_name in all_layer_names:
        if layer_name not in selected_layer_names:
            rs.LayerVisible(layer_name, False)
    
    # 启用屏幕重绘
    rs.EnableRedraw(True)
    
if __name__ == "__main__":
    CloseOtherLayers()

你可以将上述代码复制保存成一个 *.py 文件,然后在 Rhino 中自定义按钮或者设置快捷键调用该脚本,类似这样👇


我更推荐你安装一个插件 byRhinoGadget,安装方法如下:

安装完成后运行指令 LayerOnByObjects 即可轻松实现,这个小插件其他的一些功能也挺好用,是对 Rhino 目前功能的一些补充,主打一个效率。

3 个赞

好有用,谢谢Ansen!!
在cad中当前图层是允许关闭的,似乎rhino中不允许.,我稍微加了一句,强制先把当前图层改到选定的某一个物体所在的图层,然后再关闭其他图层.
之后设置快捷键fr为关闭其他,ffr为显示所有图层,这样就跟cad中的操作完全一样了.美中不足的是cad的图层有冻结,可以冻结基本不怎么用的图层,这样在显示所有图层时,就不会把冻结不用的图层也打开了,rhino中似乎也没有冻结.

1 个赞

我已经更新了代码,也能实现关闭当前图层的功能,你可以参考下,思路和你的类似。

另外你说的冻结的问题,我觉得你可以试试保存图层的状态,这样可以通过恢复某个状态的图层开启/关闭来实现类似的功能。

思路是将不常用的图层关闭,然后保存一个图层状态,想要恢复显示所有常用图层的时候,切换到刚刚保存的图层状态即可。 :smiling_face:

2 个赞