如何显示(撤销)上一次隐藏的物件

老师好,rhino是否可以通过python或其他方式显示上一次隐藏的物件?(类似于撤销上一次隐藏)

比如sketch up的类似命令,撤销隐藏(但只能是最后一次)
或cad命令:LAYERP 恢复上一个图层状态,(可撤销多次)

因为建模时经常要局部隐藏或显示,不知道rhino是否有办法能够实现快捷的撤销上一次隐藏的方法?

Rhino 中你可以配合 ShowSelected + selLast 来实现你的需求,

我测试了一下,sellast并不能很好的选择最后一次隐藏是物件,在一些简单的操作后,会显示SelLast 的选取集合是空的。

你还可以试试 SelPrev, 如果选集比较多可能无法找到你需要内容,这样推荐你对物件进行 NamedSelection, 详情请浏览 :point_down:
https://docs.mcneel.com/rhino/7/help/zh-cn/index.htm#commands/namedselections.htm

命名选集是一种妥协且有点麻烦的方法,大多数情况下我用的非常少,如果能实现按顺序撤销隐藏,我感觉对建模操作及效率会有很大提升,简单且符合操作逻辑,我试过用chartGPT写一段python的代码,但也没有成功

没有完美的解决方案,有个折中的办法是建模过程中用 隔离物件(Isolate) / 取消隔离物件(Unisolate) 临时隐藏和显示物件。

主要利用了工具的特性:Unisolate 指令只能显示全部被 Isolate 指令隐藏的物件。如果物件是通过 Hide 指令隐藏的,则不会被显示。

image

是的,unisolate可以做一些辅助的显示工作,但建模的隐藏过程是随机的,isolate和hide都用的比较多,所以恢复或者撤销显示应该是一个比较必要的功能,另外unisolate只能使用一次,连续的两次isolate隔离后,也不能记录更上一次的。
下面付ai提出的解决代码,供大家讨论一下(不知是否有发展的可能性)


在Rhino 7中,可以使用以下代码来实现显示或撤销上一次隐藏的物体的命令:

import rhinoscriptsyntax as rs

# Custom list to store the IDs of previously hidden objects
previous_hidden_objects = []

def hide_objects():
    # Get selected objects
    selected_objects = rs.SelectedObjects()
    if selected_objects:
        # Hide selected objects
        rs.HideObjects(selected_objects)
        # Add the IDs of hidden objects to the record
        previous_hidden_objects.extend(selected_objects)

def show_previous_hidden_objects():
    if previous_hidden_objects:
        # Show the previously hidden objects
        rs.UnhideObjects(previous_hidden_objects)

def undo_hide_objects():
    if previous_hidden_objects:
        # Unhide the previously hidden objects
        rs.ShowObjects(previous_hidden_objects)
        # Clear the record of hidden objects
        previous_hidden_objects.clear()

# Run the custom command
if __name__ == "__main__":
    hide_objects()

这段代码中,我们添加了一个新的函数undo_hide_objects(),用于撤销隐藏的物体。它会显示之前隐藏的所有对象,并清除记录隐藏物体的列表。

请注意,这个代码仍然只能追踪隐藏的对象,而无法检测到其他任何形式的隐藏(例如通过层或视图来隐藏)。对于更复杂的场景,您可能需要进一步探索Rhino的API和功能。


非常抱歉之前的回答仍然不正确。在Rhino中,没有直接的方法来获取上一次隐藏的物体。不过,您可以使用自定义的脚本来实现这个目标。

以下是一个示例脚本,它会在每次隐藏物体时记录隐藏的物体ID,并且可以随时通过运行命令来显示上一次隐藏的物体:

import rhinoscriptsyntax as rs

# 用于记录上一次隐藏的物体ID的变量
previous_hidden_objects = []

def hide_objects():
    # 获取选择的物体
    selected_objects = rs.SelectedObjects()
    if selected_objects:
        # 隐藏选择的物体
        rs.HideObjects(selected_objects)
        # 将隐藏的物体ID添加到记录中
        previous_hidden_objects.extend(selected_objects)

def show_previous_hidden_objects():
    if previous_hidden_objects:
        # 显示记录中的上一次隐藏的物体
        rs.ShowObjects(previous_hidden_objects)

# 运行自定义命令
if __name__ == "__main__":
    hide_objects()

请将上述代码复制到Rhino的Python编辑器中(通过运行EditPythonScript命令打开编辑器),然后保存并运行代码。每当您选择并隐藏物体时,它们的ID将被记录在previous_hidden_objects变量中。然后,您可以随时运行show_previous_hidden_objects()命令来显示上一次隐藏的物体。

请注意,这个方法只会追踪隐藏的物体,而不会追踪删除或其他操作。如果在隐藏操作之后执行了其他操作,则可能无法正确显示上一次隐藏的物体。

如果想通过脚本一直监听隐藏的序列,其实并不好做。

McNeel 论坛有类似的讨论,你可以看看,这里不再做回答。

https://discourse.mcneel.com/t/unhide-show-last/69667/15