乐筑天下

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

[编程交流] 撤消命令问题

[复制链接]
gS7

35

主题

244

帖子

212

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
180
发表于 2022-7-6 06:46:32 | 显示全部楼层 |阅读模式
伙计们,我在这里发布了一个例程,用撤销选项删除对象。我在这里遇到了问题
删除任何对象后,如果我按undo。。一切都回来了
 
我为我糟糕的英语道歉
 
 
  1. (defun c:Test()
  2. (setq cnt 0)
  3. (setq x t)
  4. (while x
  5.    (initget "Undo")
  6.    (setq sel (entsel "\nPick Object to Erase [undo]:"))
  7.    (cond
  8.      ( ( = "Undo" sel)
  9.        (if (> cnt 0)
  10.   (progn
  11.     (command "_.u")
  12.     (setq cnt(1- cnt))
  13.   )
  14.        (princ "\nUndo Done.")
  15. )
  16.       
  17.      )
  18.      ( ( = (Type (car sel)) 'ename)
  19.        (command "_.ERASE" (car sel) "")
  20.      )
  21.      ( (not sel)
  22.        (setq x nil)
  23.      )
  24.    )
  25.    (setq cnt(1+ cnt))
  26. )
  27. )
回复

使用道具 举报

5

主题

1074

帖子

1088

银币

初来乍到

Rank: 1

铜币
9
发表于 2022-7-6 06:51:31 | 显示全部楼层
我不编写lisp,但似乎需要设置UNDOCTL系统变量来强制执行所追求的行为。
如果这样做,请不要忘记在完成lisp之前将其返回到以前的值。
074633bup3ja3992a26923.jpg
回复

使用道具 举报

35

主题

2471

帖子

2447

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
174
发表于 2022-7-6 06:54:23 | 显示全部楼层
Dadgad是对的,上述变量可能会影响你的日常行为,但不幸的是,你不能直接影响它,因为它是只读的。
相反,尝试为每个擦除操作创建一个撤消组。
  1. (( = (Type (car sel)) 'ename)
  2. (command [color=magenta]"_UNDO" "_G"
  3. [/color]          "_.ERASE" (car sel) ""
  4.          [color=magenta]"_UNDO" "_E"[/color])
  5. )
回复

使用道具 举报

gS7

35

主题

244

帖子

212

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
180
发表于 2022-7-6 06:59:07 | 显示全部楼层
是的,现在很好
 
谢谢你Dadgad&Mircea
 
@我用你的参考资料更正了代码再次感谢你
回复

使用道具 举报

gS7

35

主题

244

帖子

212

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
180
发表于 2022-7-6 07:04:47 | 显示全部楼层
  1. (defun c:Test()
  2. (setq cnt 0)
  3. (setq x t)
  4. (while x
  5.    (initget "Undo")
  6.    (setq sel (entsel "\nPick Object to Erase [undo]:"))
  7.    (cond
  8.      ( ( = "Undo" sel)
  9.        (if (> cnt 0)
  10.   (progn
  11.     (command "_.u")
  12.     (setq cnt(1- cnt))
  13.   )
  14.        (princ "\nUndo Done.")
  15. )
  16.       
  17.      )
  18.      ( ( = (Type (car sel)) 'ename)
  19.       
  20.        [color="blue"](command "_UNDO" "_G"
  21.          "_.ERASE" (car sel) ""
  22.          "_UNDO" "_E")[/color]
  23.      [color="blue"] (setq cnt(1+ cnt))[/color]
  24.      )
  25.      ( (not sel)
  26.        (setq x nil)
  27.      )
  28.    )
  29.    
  30. )
  31. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 07:05:21 | 显示全部楼层
请注意,entdel可以擦除和取消擦除图元(因为该函数只是切换图元的擦除标志;设置了擦除标志的图元仅在图形关闭时丢失)。
 
考虑以下示例:
  1. ([color=BLUE]defun[/color] c:test ( [color=BLUE]/[/color] ext lst sel )
  2.    ([color=BLUE]while[/color] ([color=BLUE]null[/color] ext)
  3.        ([color=BLUE]setvar[/color] 'errno 0)
  4.        ([color=BLUE]if[/color] lst ([color=BLUE]initget[/color] [color=MAROON]"Undo"[/color]))
  5.        ([color=BLUE]setq[/color] sel ([color=BLUE]entsel[/color] ([color=BLUE]strcat[/color] [color=MAROON]"\nPick Object to Erase"[/color] ([color=BLUE]if[/color] lst [color=MAROON]" [undo]: "[/color] [color=MAROON]": "[/color]))))
  6.        ([color=BLUE]cond[/color]
  7.            (   ([color=BLUE]=[/color] 7 ([color=BLUE]getvar[/color] 'errno))
  8.                ([color=BLUE]princ[/color] [color=MAROON]"\nMissed, try again."[/color])
  9.            )
  10.            (   ([color=BLUE]=[/color] [color=MAROON]"Undo"[/color] sel)
  11.                ([color=BLUE]if[/color] lst
  12.                    ([color=BLUE]progn[/color]
  13.                        ([color=BLUE]entdel[/color] ([color=BLUE]car[/color] lst))
  14.                        ([color=BLUE]setq[/color] lst ([color=BLUE]cdr[/color] lst))
  15.                    )
  16.                )
  17.            )
  18.            (   ([color=BLUE]=[/color] 'ename ([color=BLUE]type[/color] ([color=BLUE]car[/color] sel)))
  19.                ([color=BLUE]setq[/color] lst ([color=BLUE]cons[/color] ([color=BLUE]car[/color] sel) lst))
  20.                ([color=BLUE]entdel[/color] ([color=BLUE]car[/color] sel))
  21.            )
  22.            (   ([color=BLUE]setq[/color] ext [color=BLUE]t[/color])   )
  23.        )
  24.    )
  25.    ([color=BLUE]princ[/color])
  26. )
回复

使用道具 举报

5

主题

1074

帖子

1088

银币

初来乍到

Rank: 1

铜币
9
发表于 2022-7-6 07:10:56 | 显示全部楼层
 
对于最后一个实体,OOPS命令所做的就是重新打开灯光?
回复

使用道具 举报

gS7

35

主题

244

帖子

212

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
180
发表于 2022-7-6 07:14:24 | 显示全部楼层
李,非常感谢你,每次我们都在向你学习新的东西
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 07:19:11 | 显示全部楼层
 
精确地
 
 
不客气,甘尼什
回复

使用道具 举报

gS7

35

主题

244

帖子

212

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
180
发表于 2022-7-6 07:22:37 | 显示全部楼层
我还有一个问题
 
如何撤消多个对象
实例
 
  1. (defun c:test ( / ext lst sel )
  2.    (while (null ext)
  3.        (setvar 'errno 0)
  4.        (if lst (initget "Undo"))
  5.        (setq sel (entsel (strcat "\nPick Object to Erase" (if lst " [undo]: " ": "))))
  6.        (cond
  7.            (   (= 7 (getvar 'errno))
  8.                (princ "\nMissed, try again.")
  9.            )
  10.            (   (= "Undo" sel)
  11.                (if lst
  12.                    (progn
  13.                        (entdel (car lst))
  14.                        (setq lst (cdr lst))
  15.                    )
  16.                )
  17.            )
  18.            (   (= 'ename (type (car sel)))
  19.                (setq lst (cons (car sel) lst))
  20.         [color="red"](setq sss (ssget "x" (list (cons 8 (cdr (assoc 8 (entget (car sel))))))))[/color]
  21.         [color="red"](command "erase" sss "")[/color]
  22.            )
  23.            (   (setq ext t)   )
  24.        )
  25.    )
  26.    (princ)
  27. )
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 14:51 , Processed in 0.682662 second(s), 74 queries .

© 2020-2025 乐筑天下

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