明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2499|回复: 10

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

[复制链接]
发表于 2015-1-3 10:50 | 显示全部楼层 |阅读模式
小弟最近用grread做了个递增复制的lisp,根据Gu_xl版主的帖子想替换为gxl-Ge-grread带捕捉的函数,可不知怎样终止循环。下面我发上我自己的这个lisp,有精通该函数用法的高手,请深处您的援助之手。小弟不胜感激。
  1. (defun c:mc ( )
  2.    ;自定义新的出错函数
  3.   (defun newerr  (msg)
  4.     (mapcar 'eval sysvarlst)    ;恢复变量设置
  5.     (if  *olderror*
  6.       (setq *error*    *olderror*
  7.       *olderror* nil
  8.       )
  9.     )          ;恢复*error*函数
  10.     (if  (not
  11.     (member msg '(nil "函数被取消" ";错误:quit / exit abort"))
  12.   )
  13.       (princ (strcat ";错误:" msg))
  14.     )
  15.   );;系统设置
  16.   (command "undo" "be") ;;命令编组开始
  17.   (setq
  18.     sysvarlst (mapcar
  19.     (function (lambda (n) (list 'setvar n (getvar n))))
  20.     '("osmode"   "cmdecho"  "OSNAPCOORD"
  21.       "dimzin"   "plinewid"  "TEXTSIZE"
  22.       "textstyle"
  23.      )
  24.         )
  25.   )                         ;;保存系统变量
  26.   (setq *olderror* *error*) ;;保存出错函数
  27.   (setq *error* newerr)     ;;设置自定义出错函数  
  28.   (setvar "cmdecho" 0)      ;;关闭命令响应
  29.   (setvar "OSNAPCOORD" 1)   ;;坐标数据优先级设为:键盘输入替代对象捕捉设置
  30.   (setvar "OSMODE" 65)      ;;改变捕捉模式
  31.   (setvar "dimzin" 0)       ;;不对主单位值作消零处理
  32.   (setq el (entget (car (entsel "\n 请选择数字  >>"))))
  33.   (setq  p0  (cdr (assoc 10 el))
  34.   str (read (cdr (assoc 1 el)))
  35.   h   (assoc 40 el)
  36.   )
  37.   (c:mf)
  38.   (command "_undo" "_e")     ;;活动编组结束
  39.   (mapcar 'eval sysvarlst)   ;;恢复变量设置
  40.   (setq *error* *olderror*)  ;;恢复出错函数
  41.   (princ)

  42. (defun c:mf ()
  43.   (if el
  44.     (progn
  45.       (entmake
  46.   (list '(0 . "TEXT") (cons 1 (itoa (1+ str))) (cons 10 p0) h)
  47.       )
  48.       (setq lst (entget (entlast)))
  49.       (setq loop T)
  50.       (while loop
  51.   (setq code (grread T 8)
  52.         mod  (car code)
  53.         val  (cadr code)
  54.   )
  55.   (cond ((= mod 5)
  56.          (setq p0 val)
  57.          (setq lst (subst (cons 10 p0) (assoc 10 lst) lst))
  58.          (entmod lst)
  59.          (setq str (read (cdr (assoc 1 lst))))
  60.         )
  61.         ((= mod 3) (c:mf))                              ;;左击鼠标从c:mf继续循环
  62.         ((= mod 25) (setq loop nil) (entdel (entlast))) ;;右击鼠标(本电脑值为25),删除最后生成的数字编号,结束操作
  63.   )
  64.       )
  65.     )
  66.   )
  67. )
  68. )

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2015-1-3 11:36 | 显示全部楼层
      (setq loop T)
      (while loop ....)


您得对 Loop 变量做条件式 ==> nil
那么当 (while Loop  ==> (while nil   <== 退出
 楼主| 发表于 2015-1-3 11:56 | 显示全部楼层
Andyhon 发表于 2015-1-3 11:36
(setq loop T)
      (while loop ....)

我看gu版在带捕捉的grread自定义函数帖子里说,直接替换掉grread效果一样,我替换完了,结果不循环。
 楼主| 发表于 2015-1-3 15:09 | 显示全部楼层
自己顶一下,希望有此经验之人给小解一下gxl-Ge-grread函数的详细用法。
发表于 2015-1-3 16:54 | 显示全部楼层
..他的函数说明写的挺详细的.
 楼主| 发表于 2015-1-3 17:36 | 显示全部楼层
鱼与熊掌 发表于 2015-1-3 16:54
..他的函数说明写的挺详细的.

是啊,他的使用说明里说用gxl-Ge-grread代替grread即可实现带捕捉功能,可我替换完之后,就不能循环复制了呢?麻烦熊掌大哥看下我的那个小程序,是不是循环部分有问题。
发表于 2015-1-3 17:44 | 显示全部楼层
(while (progn
  (setq gr(gxl-grread ~~~))
  (setq a(car gr) b(cadr gr))
  (cons((= a 5)
                t)
  (t nil)
)
)
 楼主| 发表于 2015-1-4 10:48 | 显示全部楼层
鱼与熊掌 发表于 2015-1-3 17:44
(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”后,关闭捕捉,运行很流畅,具体效果如下图所示,还望兄长阁下明示。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2015-1-4 10:58 | 显示全部楼层
newbuser 发表于 2015-1-4 10:48
我将原程序中的一句做了如下改动,(grread T 8)==>>(gxl-Ge-grread '(T 7 3) p0 e),可打开的捕捉只有端点 ...

因为你字也一起捕捉了,所以会这样,g版的代码不是有对ss不捕捉吗,你看看
 楼主| 发表于 2015-1-4 16:33 | 显示全部楼层
鱼与熊掌 发表于 2015-1-4 10:58
因为你字也一起捕捉了,所以会这样,g版的代码不是有对ss不捕捉吗,你看看

我按你的方法改进了下,运行倒是流畅了,可,仍然只有端点和插入点的捕捉啊。另外,你说的Gu版避开选择集捕捉跟我这个单独的text图元有些不符。代码我发上来,麻烦您老费心看下到底是哪里出的问题。
  1. (defun c:mc ()
  2.                                         ;自定义新的出错函数
  3.   (defun newerr        (msg)
  4.     (mapcar 'eval sysvarlst)                ;恢复变量设置
  5.     (if        *olderror*
  6.       (setq *error*    *olderror*
  7.             *olderror* nil
  8.       )
  9.     )                                        ;恢复*error*函数
  10.     (if        (not
  11.           (member msg '(nil "函数被取消" ";错误:quit / exit abort"))
  12.         )
  13.       (princ (strcat ";错误:" msg))
  14.     )
  15.   )
  16.   ;;系统设置
  17.   (command "undo" "be")
  18.   ;;命令编组开始
  19.   (setq
  20.     sysvarlst (mapcar
  21.                 (function (lambda (n) (list 'setvar n (getvar n))))
  22.                 '("osmode"         "cmdecho"        "OSNAPCOORD"
  23.                   "dimzin"         "plinewid"        "TEXTSIZE"
  24.                   "textstyle"
  25.                  )
  26.               )
  27.   )
  28.   ;;保存系统变量
  29.   (setq *olderror* *error*)
  30.   ;;保存出错函数
  31.   (setq *error* newerr)
  32.   ;;设置自定义出错函数  
  33.   (setvar "cmdecho" 0)
  34.   ;;关闭命令响应
  35.   (setvar "OSNAPCOORD" 1)
  36.   ;;坐标数据优先级设为:键盘输入替代对象捕捉设置
  37.   (setvar "OSMODE" 65)
  38.   ;;改变捕捉模式
  39.   (setvar "dimzin" 0)
  40.   ;;不对主单位值作消零处理
  41.   (setq el (entget (car (entsel "\n 请选择数字  >>"))))
  42.   (setq        p0  (cdr (assoc 10 el))
  43.         str (read (cdr (assoc 1 el)))
  44.         h   (assoc 40 el)
  45.   )
  46.   (c:mf)
  47.   (command "_undo" "_e")
  48.   ;;活动编组结束
  49.   (mapcar 'eval sysvarlst)
  50.   ;;恢复变量设置
  51.   (setq *error* *olderror*)
  52.   ;;恢复出错函数
  53.   (princ)
  54. )
  55. (defun c:mf ()
  56.   (entmake
  57.     (list '(0 . "TEXT") (cons 1 (itoa (1+ str))) (cons 10 p0) h)
  58.   )
  59.   (setq lst (entget (setq en (entlast))))
  60.   (setq loop T)
  61.   (while loop
  62.     (progn
  63.       (setq code (gxl-Ge-grread '(T 7 3) p0 en)
  64.             mod         (car code)
  65.             val         (cadr code)
  66.       )
  67.     )
  68.     (cond ((= mod 5)
  69.            (setq p0 val)
  70.            (setq lst (subst (cons 10 p0) (assoc 10 lst) lst))
  71.            (entmod lst)
  72.            (setq str (read (cdr (assoc 1 lst))))
  73.           )
  74.           ((= mod 3) (c:mf))
  75.           ((or (= mod 32) (= mod 25))
  76.            (setq loop nil)
  77.            (entdel (entlast))
  78.           )
  79.     )
  80.   )
  81. )
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-19 20:39 , Processed in 0.220631 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表