kedenggao 发表于 2017-9-14 11:47:40

怎样让程序可以先选择实体再执行

这段程序来自哪位老兄之手已找不到出处,在此实在抱歉!如因转发源码而产生纠纷,还请管理人员删除此提问贴.
先说问题点:程序很好使,但只能先输入命令,再选择对象;
                   在这请教各位前辈能否将它修改成无论是先输入命令还是先选择实体都可以执行
小白在此先谢过各位大侠!!!

;; 命令: CX
;; 思路: 1. 选择对象
;;       2. 复制对象
;;       3. 旋转对象
(defun C:CX (/ E PT SS SS1)
(princ "\n复制旋转")
(command "_.undo" "_group")
(while (and (setq E (entlast))
            (setq SS (ssget))
            (setq SS1 (ssadd))
         )
    (progn
      (command "_.COPY" SS "")
      (while (= (getvar "CMDNAMES") "COPY")
      (command PAUSE)
      )
      (while (setq E (entnext E))
      (ssadd E SS1)
      )
      (if (setq PT (getvar "LASTPOINT"))
      (progn
          (command "_.ROTATE" SS1 "" "_NON" PT)
          (while (= (getvar "CMDNAMES") "ROTATE")
            (command PAUSE)
          )
      )
      )
    )
)
(command "_.undo" "_end")
(princ)
)

Andyhon 发表于 2017-9-14 12:24:07

check
http://bbs.mjtd.com/thread-87169-1-1.html

pxt2001 发表于 2017-9-14 12:41:51

(command "_.undo" "_group")

pxt2001 发表于 2017-9-14 12:42:06

放在ssget后面

kedenggao 发表于 2017-9-14 13:10:59

pxt2001 发表于 2017-9-14 12:42
放在ssget后面

多谢指点,,改成下面这样了,貌似达到要求了,但是不知道这样改是不是最合理的,还请帮忙审一下,也好让我多长点见识
(defun C:CX (/ E PT SS SS1)
   (princ "\n复制旋转")
   (while (and (setq E (entlast))
               (setq SS (ssget))
               (setq SS1 (ssadd))
          )
   (command "_.undo" "_group")

clh521 发表于 2017-9-15 09:46:52

应把(command "_.undo" "_end")放到while循环体内,这样多次复制时,想撤消时不需要多按一次ctrl+Z
(defun C:CX (/ E PT SS SS1)
(princ "\n复制旋转")
;;(command "_.undo" "_group")
(while (and (setq E (entlast))
            (setq SS (ssget))
            (setq SS1 (ssadd))
         )
                (command "_.undo" "_group")
    (progn
      (command "_.COPY" SS "")
      (while (= (getvar "CMDNAMES") "COPY")
      (command PAUSE)
      )
      (while (setq E (entnext E))
      (ssadd E SS1)
      )
      (if (setq PT (getvar "LASTPOINT"))
      (progn
          (command "_.ROTATE" SS1 "" "_NON" PT)
          (while (= (getvar "CMDNAMES") "ROTATE")
            (command PAUSE)
          )
      )
      )
    )
        (command "_.undo" "_end");;把这句移到这里
)
;(command "_.undo" "_end")
(princ)
)

kedenggao 发表于 2017-9-15 10:26:34

clh521 发表于 2017-9-15 09:46
应把(command "_.undo" "_end")放到while循环体内,这样多次复制时,想撤消时不需要多按一次ctrl+Z
(defun ...

果然还有更好的方法,,多谢指点,
页: [1]
查看完整版本: 怎样让程序可以先选择实体再执行