在autolisp中使用“撤消”
你好我正在使用更改/确定/取消按钮。。如果我按Change,更改将完成,如果按OK,对话框将关闭并完成更改。。但如果我按下取消按钮,它将撤消“更改”按钮所做的所有操作。。
知道如何在autolisp中处理撤消吗。。
苏波
印度 我不确定我是否完全理解这个问题。。。只需提供OK和Cancel,而不是让用户选择Change、OK(这也会进行更改)和Cancel。如果选择“确定”,请进行更改。如果选择了“取消”,则不要进行更改。
另外,设置撤销标记取决于正在执行的代码;如果使用命令调用,请使用Undo命令。如果使用ActiveDocument对象,请考虑StartUndoMark和EndUndoMark方法。
HTH公司 上述更改按钮的Windows标准命名适用–您可以考虑使用此标题以保持一致性。
另外,不要忘记在对话框处于活动状态时访问图形有一些限制-最坏的情况是它可能会使AutoCAD崩溃;最好考虑RenderMan的建议,只保留“确定”和“取消”按钮。 实际上我必须一个接一个地做5个改变。设置1次更改后,用户将按“更改”按钮,更改将完成。。现在,如果我按下“OK”(确定)按钮,更改将反映出来。。如果我按“取消”按钮。。所有更改都将终止,但如果我在“取消”之前按“更改”按钮,那么更改已经完成,我必须撤消所有这些更改。 这就是我的观点。。。在确定/应用之前允许更改,这使任务变得复杂。
只需收集用户的输入(通过表单控件、按钮等),然后仅在用户选择确定/应用等时进行更改。 实际上,如果你想让你的“更改”按钮与所有正常的“应用”按钮一样工作,那么它所做的一切与“确定”按钮完全相同——只是不关闭对话框。因此,为了坚持所有程序在Windows中正常工作的方式,如果按“取消”,则无需担心撤消更改。
如果您确实希望能够跟踪“更改”按钮的按下,您可以考虑在每次按下更改时将磁贴的值保存到列表中。不要做其他事情。然后,只有在按下OK时,才能逐步浏览该列表,并像每次按下change一样执行操作。这样你就得到了这个“取消”意味着你所指的“撤消”效果,而不需要实际的撤消。 你永远不知道另一个程序员是从什么角度来的。。。假设你知道正在做一个。。。
看看这个方法是否适合你
以下是事件的顺序,而不是插入和播放的确切代码。
(vl负载com);确保在执行visual lisp函数之前调用-建议在程序开始时调用(setq dwgobj(vla get activedocument(vlax get acad object));获取activeX文档对象;在对话框之前或对话框加载时(vla endundomark dwgobj);结束它,以防您或其他代码将其打开(vla startundomark dwgobj);开始一个新的;启动对话框(action\u tile“cancel”(vla sendcommand dwgobj“u”)(done\u对话框);u后面有一个空格;u实际上是一个命令,而不是别名,但是用户可以用别名或其他方式重新定义它;然后你可以发送“u undo”</p>我认为最好跟踪你在做什么,这样就可以在undo的leiu中反转工作。例如,用扩展数据将旧值和新值存储在列表中或对象本身上。如果删除对象,则考虑关闭对象的可见性,并使用扩展数据或列表中的轨迹点击它,然后在“提交”删除时,迭代删除列表,或者如果存储在扩展数据中,则迭代图形中的对象(或ssget filter-3),并删除具有扩展数据删除签名的对象。
如果您使用扩展数据或您自己的字典xrecords跟踪对象,那么它更优雅,因此在程序崩溃时可以恢复。
页:
[1]