乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 20|回复: 6

[编程交流] 在autolisp中使用“撤消”

[复制链接]

14

主题

23

帖子

9

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 07:35:20 | 显示全部楼层 |阅读模式
你好
 
我正在使用更改/确定/取消按钮。。如果我按Change,更改将完成,如果按OK,对话框将关闭并完成更改。。但如果我按下取消按钮,它将撤消“更改”按钮所做的所有操作。。
 
知道如何在autolisp中处理撤消吗。。
 
苏波
印度
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 07:52:01 | 显示全部楼层
我不确定我是否完全理解这个问题。。。只需提供OK和Cancel,而不是让用户选择Change、OK(这也会进行更改)和Cancel。如果选择“确定”,请进行更改。如果选择了“取消”,则不要进行更改。
 
另外,设置撤销标记取决于正在执行的代码;如果使用命令调用,请使用Undo命令。如果使用ActiveDocument对象,请考虑StartUndoMark和EndUndoMark方法。
 
HTH公司
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 07:57:55 | 显示全部楼层
上述更改按钮的Windows标准命名适用–您可以考虑使用此标题以保持一致性。
另外,不要忘记在对话框处于活动状态时访问图形有一些限制-最坏的情况是它可能会使AutoCAD崩溃;最好考虑RenderMan的建议,只保留“确定”和“取消”按钮。
回复

使用道具 举报

14

主题

23

帖子

9

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
70
发表于 2022-7-6 08:12:20 | 显示全部楼层
实际上我必须一个接一个地做5个改变。设置1次更改后,用户将按“更改”按钮,更改将完成。。现在,如果我按下“OK”(确定)按钮,更改将反映出来。。如果我按“取消”按钮。。所有更改都将终止,但如果我在“取消”之前按“更改”按钮,那么更改已经完成,我必须撤消所有这些更改。
回复

使用道具 举报

44

主题

3166

帖子

2803

银币

中流砥柱

Rank: 25

铜币
557
发表于 2022-7-6 08:21:18 | 显示全部楼层
这就是我的观点。。。在确定/应用之前允许更改,这使任务变得复杂。
 
只需收集用户的输入(通过表单控件、按钮等),然后仅在用户选择确定/应用等时进行更改。
回复

使用道具 举报

11

主题

968

帖子

919

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
99
发表于 2022-7-6 08:28:48 | 显示全部楼层
实际上,如果你想让你的“更改”按钮与所有正常的“应用”按钮一样工作,那么它所做的一切与“确定”按钮完全相同——只是不关闭对话框。因此,为了坚持所有程序在Windows中正常工作的方式,如果按“取消”,则无需担心撤消更改。
 
如果您确实希望能够跟踪“更改”按钮的按下,您可以考虑在每次按下更改时将磁贴的值保存到列表中。不要做其他事情。然后,只有在按下OK时,才能逐步浏览该列表,并像每次按下change一样执行操作。这样你就得到了这个“取消”意味着你所指的“撤消”效果,而不需要实际的撤消。
回复

使用道具 举报

3

主题

27

帖子

25

银币

初来乍到

Rank: 1

铜币
15
发表于 2022-7-6 08:40:36 | 显示全部楼层
你永远不知道另一个程序员是从什么角度来的。。。假设你知道正在做一个。。。
 
看看这个方法是否适合你
以下是事件的顺序,而不是插入和播放的确切代码。
[code](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跟踪对象,那么它更优雅,因此在程序崩溃时可以恢复。
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-10 05:01 , Processed in 0.465514 second(s), 66 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表