gS7 发表于 2022-7-6 06:46:32

撤消命令问题

伙计们,我在这里发布了一个例程,用撤销选项删除对象。我在这里遇到了问题
删除任何对象后,如果我按undo。。一切都回来了
 
我为我糟糕的英语道歉
 
 
(defun c:Test()
(setq cnt 0)
(setq x t)
(while x
   (initget "Undo")
   (setq sel (entsel "\nPick Object to Erase :"))
   (cond
   ( ( = "Undo" sel)
       (if (> cnt 0)
(progn
    (command "_.u")
    (setq cnt(1- cnt))
)
       (princ "\nUndo Done.")
)
      
   )
   ( ( = (Type (car sel)) 'ename)
       (command "_.ERASE" (car sel) "")
   )
   ( (not sel)
       (setq x nil)
   )
   )
   (setq cnt(1+ cnt))
)
)

Dadgad 发表于 2022-7-6 06:51:31

我不编写lisp,但似乎需要设置UNDOCTL系统变量来强制执行所追求的行为。
如果这样做,请不要忘记在完成lisp之前将其返回到以前的值。

MSasu 发表于 2022-7-6 06:54:23

Dadgad是对的,上述变量可能会影响你的日常行为,但不幸的是,你不能直接影响它,因为它是只读的。
相反,尝试为每个擦除操作创建一个撤消组。
(( = (Type (car sel)) 'ename)
(command "_UNDO" "_G"
          "_.ERASE" (car sel) ""
         "_UNDO" "_E")
)

gS7 发表于 2022-7-6 06:59:07

是的,现在很好
 
谢谢你Dadgad&Mircea
 
@我用你的参考资料更正了代码再次感谢你

gS7 发表于 2022-7-6 07:04:47

(defun c:Test()
(setq cnt 0)
(setq x t)
(while x
   (initget "Undo")
   (setq sel (entsel "\nPick Object to Erase :"))
   (cond
   ( ( = "Undo" sel)
       (if (> cnt 0)
(progn
    (command "_.u")
    (setq cnt(1- cnt))
)
       (princ "\nUndo Done.")
)
      
   )
   ( ( = (Type (car sel)) 'ename)
      
       (command "_UNDO" "_G"
         "_.ERASE" (car sel) ""
         "_UNDO" "_E")
    (setq cnt(1+ cnt))

   )
   ( (not sel)
       (setq x nil)
   )
   )
   
)
)

Lee Mac 发表于 2022-7-6 07:05:21

请注意,entdel可以擦除和取消擦除图元(因为该函数只是切换图元的擦除标志;设置了擦除标志的图元仅在图形关闭时丢失)。
 
考虑以下示例:

(defun c:test ( / ext lst sel )
   (while (null ext)
       (setvar 'errno 0)
       (if lst (initget "Undo"))
       (setq sel (entsel (strcat "\nPick Object to Erase" (if lst " : " ": "))))
       (cond
         (   (= 7 (getvar 'errno))
               (princ "\nMissed, try again.")
         )
         (   (= "Undo" sel)
               (if lst
                   (progn
                     (entdel (car lst))
                     (setq lst (cdr lst))
                   )
               )
         )
         (   (= 'ename (type (car sel)))
               (setq lst (cons (car sel) lst))
               (entdel (car sel))
         )
         (   (setq ext t)   )
       )
   )
   (princ)
)

Dadgad 发表于 2022-7-6 07:10:56

 
对于最后一个实体,OOPS命令所做的就是重新打开灯光?

gS7 发表于 2022-7-6 07:14:24

李,非常感谢你,每次我们都在向你学习新的东西

Lee Mac 发表于 2022-7-6 07:19:11

 
精确地
 
 
不客气,甘尼什

gS7 发表于 2022-7-6 07:22:37

我还有一个问题
 
如何撤消多个对象
实例
 
(defun c:test ( / ext lst sel )
   (while (null ext)
       (setvar 'errno 0)
       (if lst (initget "Undo"))
       (setq sel (entsel (strcat "\nPick Object to Erase" (if lst " : " ": "))))
       (cond
         (   (= 7 (getvar 'errno))
               (princ "\nMissed, try again.")
         )
         (   (= "Undo" sel)
               (if lst
                   (progn
                     (entdel (car lst))
                     (setq lst (cdr lst))
                   )
               )
         )
         (   (= 'ename (type (car sel)))
               (setq lst (cons (car sel) lst))
      (setq sss (ssget "x" (list (cons 8 (cdr (assoc 8 (entget (car sel))))))))
      (command "erase" sss "")
         )
         (   (setq ext t)   )
       )
   )
   (princ)
)
页: [1] 2
查看完整版本: 撤消命令问题