请教:用过天正cad的,有一个针对图层的命令叫关闭其他,请问在rhino中可以用巨集实现吗?就是只有选中的某几个物体所在的图层显示,其他关闭。注意选中的物体可能是多个,位于不同的层。
Rhino 中没有办法通过 Macro 实现你要的功能,因为 Macro 没办法直接调用图层面板的功能。
Rhino 自带的功能可以实现,但是步骤比较繁琐,不够丝滑。
操作逻辑:
选中物件–>执行指令HighlightObjectLayers(Rhino 8 的指令)–>在图层面板菜单中反选图层–>点击图层列表中的💡关闭即可。
以上方法有一个缺陷:无法关闭当前图层(打勾的)。
如果想实现一键关闭其他图层的功能可以通过脚本,以下是一段示例:
#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 目前功能的一些补充,主打一个效率。
好有用,谢谢Ansen!!
在cad中当前图层是允许关闭的,似乎rhino中不允许.,我稍微加了一句,强制先把当前图层改到选定的某一个物体所在的图层,然后再关闭其他图层.
之后设置快捷键fr为关闭其他,ffr为显示所有图层,这样就跟cad中的操作完全一样了.美中不足的是cad的图层有冻结,可以冻结基本不怎么用的图层,这样在显示所有图层时,就不会把冻结不用的图层也打开了,rhino中似乎也没有冻结.
我已经更新了代码,也能实现关闭当前图层的功能,你可以参考下,思路和你的类似。
另外你说的冻结的问题,我觉得你可以试试保存图层的状态,这样可以通过恢复某个状态的图层开启/关闭来实现类似的功能。
思路是将不常用的图层关闭,然后保存一个图层状态,想要恢复显示所有常用图层的时候,切换到刚刚保存的图层状态即可。
设置快捷键fr调用脚本是怎么操作的?能否指教一下