newbuser 发表于 2015-1-3 10:50:27

grread做的一个递增复制,如何用GU版的替换掉

小弟最近用grread做了个递增复制的lisp,根据Gu_xl版主的帖子想替换为gxl-Ge-grread带捕捉的函数,可不知怎样终止循环。下面我发上我自己的这个lisp,有精通该函数用法的高手,请深处您的援助之手。小弟不胜感激。(defun c:mc ( )
   ;自定义新的出错函数
(defun newerr(msg)
    (mapcar 'eval sysvarlst)    ;恢复变量设置
    (if*olderror*
      (setq *error*    *olderror*
      *olderror* nil
      )
    )          ;恢复*error*函数
    (if(not
    (member msg '(nil "函数被取消" ";错误:quit / exit abort"))
)
      (princ (strcat ";错误:" msg))
    )
);;系统设置
(command "undo" "be") ;;命令编组开始
(setq
    sysvarlst (mapcar
    (function (lambda (n) (list 'setvar n (getvar n))))
    '("osmode"   "cmdecho""OSNAPCOORD"
      "dimzin"   "plinewid""TEXTSIZE"
      "textstyle"
   )
      )
)                         ;;保存系统变量
(setq *olderror* *error*) ;;保存出错函数
(setq *error* newerr)   ;;设置自定义出错函数
(setvar "cmdecho" 0)      ;;关闭命令响应
(setvar "OSNAPCOORD" 1)   ;;坐标数据优先级设为:键盘输入替代对象捕捉设置
(setvar "OSMODE" 65)      ;;改变捕捉模式
(setvar "dimzin" 0)       ;;不对主单位值作消零处理
(setq el (entget (car (entsel "\n 请选择数字>>"))))
(setqp0(cdr (assoc 10 el))
str (read (cdr (assoc 1 el)))
h   (assoc 40 el)
)
(c:mf)
(command "_undo" "_e")   ;;活动编组结束
(mapcar 'eval sysvarlst)   ;;恢复变量设置
(setq *error* *olderror*);;恢复出错函数
(princ)

(defun c:mf ()
(if el
    (progn
      (entmake
(list '(0 . "TEXT") (cons 1 (itoa (1+ str))) (cons 10 p0) h)
      )
      (setq lst (entget (entlast)))
      (setq loop T)
      (while loop
(setq code (grread T 8)
      mod(car code)
      val(cadr code)
)
(cond ((= mod 5)
         (setq p0 val)
         (setq lst (subst (cons 10 p0) (assoc 10 lst) lst))
         (entmod lst)
         (setq str (read (cdr (assoc 1 lst))))
      )
      ((= mod 3) (c:mf))                              ;;左击鼠标从c:mf继续循环
      ((= mod 25) (setq loop nil) (entdel (entlast))) ;;右击鼠标(本电脑值为25),删除最后生成的数字编号,结束操作
)
      )
    )
)
)
)

Andyhon 发表于 2015-1-3 11:36:30

      (setq loop T)
      (while loop ....)

您得对 Loop 变量做条件式 ==> nil
那么当 (while Loop==> (while nil   <== 退出

newbuser 发表于 2015-1-3 11:56:46

Andyhon 发表于 2015-1-3 11:36 static/image/common/back.gif
(setq loop T)
      (while loop ....)



我看gu版在带捕捉的grread自定义函数帖子里说,直接替换掉grread效果一样,我替换完了,结果不循环。

newbuser 发表于 2015-1-3 15:09:34

自己顶一下,希望有此经验之人给小解一下gxl-Ge-grread函数的详细用法。

鱼与熊掌 发表于 2015-1-3 16:54:29

..他的函数说明写的挺详细的.

newbuser 发表于 2015-1-3 17:36:46

鱼与熊掌 发表于 2015-1-3 16:54 static/image/common/back.gif
..他的函数说明写的挺详细的.

是啊,他的使用说明里说用gxl-Ge-grread代替grread即可实现带捕捉功能,可我替换完之后,就不能循环复制了呢?麻烦熊掌大哥看下我的那个小程序,是不是循环部分有问题。

鱼与熊掌 发表于 2015-1-3 17:44:00

(while (progn
(setq gr(gxl-grread ~~~))
(setq a(car gr) b(cadr gr))
(cons((= a 5)
                t)
(t nil)
)
)

newbuser 发表于 2015-1-4 10:48:10

鱼与熊掌 发表于 2015-1-3 17:44 static/image/common/back.gif
(while (progn
(setq gr(gxl-grread ~~~))
(setq a(car gr) b(cadr gr))


我将原程序中的一句做了如下改动,(grread T 8)==>>(gxl-Ge-grread '(T 7 3) p0 e),可打开的捕捉只有端点和插入点的捕捉,没有测试程序中的最近点,垂足点等其他点的捕捉。并且在鼠标移动过程中,整个效果就跟打开了“捕捉”效果一样,请注意是捕捉,不是对象捕捉。按键“F3”后,关闭捕捉,运行很流畅,具体效果如下图所示,还望兄长阁下明示。

鱼与熊掌 发表于 2015-1-4 10:58:29

newbuser 发表于 2015-1-4 10:48 static/image/common/back.gif
我将原程序中的一句做了如下改动,(grread T 8)==>>(gxl-Ge-grread '(T 7 3) p0 e),可打开的捕捉只有端点 ...

因为你字也一起捕捉了,所以会这样,g版的代码不是有对ss不捕捉吗,你看看

newbuser 发表于 2015-1-4 16:33:37

鱼与熊掌 发表于 2015-1-4 10:58 static/image/common/back.gif
因为你字也一起捕捉了,所以会这样,g版的代码不是有对ss不捕捉吗,你看看

我按你的方法改进了下,运行倒是流畅了,可,仍然只有端点和插入点的捕捉啊。另外,你说的Gu版避开选择集捕捉跟我这个单独的text图元有些不符。代码我发上来,麻烦您老费心看下到底是哪里出的问题。(defun c:mc ()
                                        ;自定义新的出错函数
(defun newerr        (msg)
    (mapcar 'eval sysvarlst)                ;恢复变量设置
    (if        *olderror*
      (setq *error*    *olderror*
          *olderror* nil
      )
    )                                        ;恢复*error*函数
    (if        (not
          (member msg '(nil "函数被取消" ";错误:quit / exit abort"))
        )
      (princ (strcat ";错误:" msg))
    )
)
;;系统设置
(command "undo" "be")
;;命令编组开始
(setq
    sysvarlst (mapcar
                (function (lambda (n) (list 'setvar n (getvar n))))
                '("osmode"       "cmdecho"        "OSNAPCOORD"
                  "dimzin"       "plinewid"        "TEXTSIZE"
                  "textstyle"
               )
              )
)
;;保存系统变量
(setq *olderror* *error*)
;;保存出错函数
(setq *error* newerr)
;;设置自定义出错函数
(setvar "cmdecho" 0)
;;关闭命令响应
(setvar "OSNAPCOORD" 1)
;;坐标数据优先级设为:键盘输入替代对象捕捉设置
(setvar "OSMODE" 65)
;;改变捕捉模式
(setvar "dimzin" 0)
;;不对主单位值作消零处理
(setq el (entget (car (entsel "\n 请选择数字>>"))))
(setq        p0(cdr (assoc 10 el))
        str (read (cdr (assoc 1 el)))
        h   (assoc 40 el)
)
(c:mf)
(command "_undo" "_e")
;;活动编组结束
(mapcar 'eval sysvarlst)
;;恢复变量设置
(setq *error* *olderror*)
;;恢复出错函数
(princ)
)
(defun c:mf ()
(entmake
    (list '(0 . "TEXT") (cons 1 (itoa (1+ str))) (cons 10 p0) h)
)
(setq lst (entget (setq en (entlast))))
(setq loop T)
(while loop
    (progn
      (setq code (gxl-Ge-grread '(T 7 3) p0 en)
          mod       (car code)
          val       (cadr code)
      )
    )
    (cond ((= mod 5)
           (setq p0 val)
           (setq lst (subst (cons 10 p0) (assoc 10 lst) lst))
           (entmod lst)
           (setq str (read (cdr (assoc 1 lst))))
          )
          ((= mod 3) (c:mf))
          ((or (= mod 32) (= mod 25))
           (setq loop nil)
           (entdel (entlast))
          )
    )
)
)
页: [1] 2
查看完整版本: grread做的一个递增复制,如何用GU版的替换掉