←═╬═☆心_傷 发表于 2013-12-8 20:13:33

请教“U”回的问题

请各位高手帮忙怎样写可以让LISP画的线只用一次“U”回去。谢谢了!
(defun c:inbb ()
(setq temperr *error*)
(setq *error* trap8)
(setq old1 (getvar "blipmode"))
(setq old (getvar "pickfirst"))
(setq cmd (getvar "cmdecho"))
(setq os (getvar "osmode"))
(setvar "cmdecho" 0)
(command "undo" "m")
(command "undo" "m")
(setvar "blipmode" 0)
(setvar "pickfirst" 0)
(setvar "osmode" 0)
(setq di (getdist "\n请您指定请指定线条宽度1.05mm<0.35>:"))
(if (= di nil) (setq di 0.35) (setq di di))
(setq d (/ di 2))
(setq ss (ssget))
(setq si 0)
(repeat (sslength ss)
    (setq na (ssname ss si))
    (setq ac (cdr (assoc 0 (entget na))))
    (cond ((= ac "LINE")
    (setq sp (cdr (assoc 10 (entget na))))
    (setq ep (cdr (assoc 11 (entget na))))
         (cond ((>= di 0.1)
         (setq jd (angle sp ep))
    (setq a1 (+ jd (/ pi 2)))
    (setq a2 (+ jd pi (/ pi 2)))
    (setq p1 (polar sp a1 d))
    (setq p2 (polar sp a2 d))
         (setq hd (angle ep sp))
         (setq a3 (+ hd (/ pi 2)))
         (setq a4 (+ hd pi (/ pi 2)))
         (setq p3 (Polar ep a3 d))
         (setq p4 (polar ep a4 d))
         (command "_.offset" d na p1 "")
         (command "_.offset" d na p2 "")
         (command "_.line" p1 p2 "")
         (command "_.line" p3 p4 "")
         (command "_.erase" na "")))
    (cond ((< di 0.8)
         (setq jd (angle sp ep))
    (setq a1 (+ jd (/ pi 2)))
    (setq a2 (+ jd pi (/ pi 2)))
    (setq p1 (polar sp a1 d))
    (setq p2 (polar sp a2 d))
    (command "_.offset" d na p1 "")
    (command "_.offset" d na p2 "")
    (command "_.erase" na "")))))
    (cond ((= ac "CIRCLE")
    (setq yx (cdr (assoc 10 (entget na))))
    (setq r (cdr (assoc 40 (entget na))))
    (setq pt (polar yx 0 (+ r 3)))
    (command "_.offset" d na yx "")
    (command "_.offset" d na pt "")
    (command "_.erase" na "")))
    (cond ((= ac "ARC")
    (setq zx (cdr (assoc 10 (entget na))))
    (setq r (cdr (assoc 40 (entget na))))
    (setq sa (cdr (assoc 50 (entget na))))
    (setq pt (polar zx sa (+ r 3)))
    (command "_.offset" d na zx "")
    (command "_.offset" d na pt "")
    (command "_.erase" na "")))
    (cond ((= ac "ELLIPSE")
    (setq zd (cdr (assoc 10 (entget na))))
    (setq dd (cdr (assoc 11 (entget na))))
    (setq dist (distance zd dd))
    (setq ang (angle zd dd))
    (setq od (polar zd ang (+ dist 3)))
    (command "_.offset" d na zd "")
    (command "_.offset" d na od "")
    (command "_.erase" na "")))
    (setq si (+ si 1)))
(setvar "cmdecho" cmd)
(setvar "blipmode" old1)
(setvar "pickfirst" old)
(setvar "osmode" os)
(command "-OSNAP" "END,MID,QUA")
(setq *error* temperr)

(princ)
)

aihuyujian 发表于 2013-12-8 21:08:26

貌似lisp执行的是连续的过程,你想u到第几步,不如直接删除了算了

ll_j 发表于 2013-12-8 21:49:44

undo be
看看G版的http://bbs.mjtd.com/forum.php?mod=viewthread&tid=100616&extra=page%3D1%26filter%3Dtypeid%26typeid%3D109%26typeid%3D109

ll_j 发表于 2013-12-8 22:01:46

我这里还有个简单一点的:http://bbs.xdcad.net/forum.php?mod=viewthread&tid=24561

1993063 发表于 2013-12-9 23:35:51

在程序开始用(Command "UNDO" "BEGIN")
结尾用(Command "UNDO" "END")

←═╬═☆心_傷 发表于 2013-12-11 06:24:47

1993063 发表于 2013-12-9 23:35 static/image/common/back.gif
在程序开始用(Command "UNDO" "BEGIN")
结尾用(Command "UNDO" "END")

非常感谢!问题解决了!

1993063 发表于 2013-12-11 09:30:21

本帖最后由 1993063 于 2013-12-10 15:32 编辑

←═╬═☆心_傷 发表于 2013-12-10 12:24 static/image/common/back.gif
非常感谢!问题解决了!
还有一个VLA方式设置回退点
(setq Doc (vla-get-activedocument (vlax-get-acad-object)))
开始:      (vla-EndUndoMark Doc)   ;结束这前没有结束的编组
      (vla-StartUndoMark Doc)          ;设定回退

结束:(vla-EndUndoMark Doc)         ;结束回退
这个好处是可以先选择再操作,那种command方式不能先选择再操作
页: [1]
查看完整版本: 请教“U”回的问题