明经CAD社区

 找回密码
 注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 2555|回复: 20

grread函数左键失效问题?

  [复制链接]
发表于 2013-1-2 13:01 | 显示全部楼层 |阅读模式
本帖最后由 aaacjh 于 2013-1-2 13:08 编辑

请前辈留步:
以下是个【“末尾带数字”单行文字】递增编号程序,在新增动态函数grread时,出现了左键失效情况。请前辈指点![attach]72785
;;;实现识别递增编号 By cjh_201-12-08
;;;新增选择模式,增强通用性 2012-12-23
(defun c:HBC_BH(/ gr text EP1 zm ss zh lay sty col len i val ws qz p2 vzo strval bhms)
  (print "<HBC_BH(智能编号)>功能已开启")
  (print "<模式1:尾数数字位&&模式2:末位数字位")
  (setq os(getvar "osmode"))
  (setq oldlayer(getvar "CLAYER"))
  (setq temperr *errror*)
  (setq *error* trap1)
  (command "undo" "m")
  (setq os(getvar "osmode"))
  (setq bhms(getint"\n输入编号模式<模式1(1)/模式2(2)>(默认1):"))
  (setvar "CMDECHO" 0)
  (setvar "osmode" 0)
  (setq EP1(entsel"\n选取源编号:"))
  (while (= EP1 nil)
    (setq EP1 (entsel"\n选取源编号:"))
  )
  (setq zm(entget(car EP1)))
  ;(setvar "osmode" 15359)
  (setq ss(cdr(assoc 1 zm)) zh(assoc 40 zm)
        lay(assoc 8 zm) sty(assoc 7 zm)
  )
  (if (assoc 62 zm)
    (setq col(assoc 62 zm))
  );提取图层,颜色,字高,文字样式等信息
  (setq len(strlen ss))
  (setq i(- len 1))
  (setq val(substr ss len 1))
  (if (and (/= val "0") (= (atoi val) 0));非数字,成立
    (progn (alert"提示:编号末位非数字位!请在编号末位添加数字。")(exit))
  )
  (if (= bhms 2)
    (setq val(atoi val) qz(substr ss 1 i) ws 1);后缀,前缀
    (while (< i len)
      (HBC_BH-01)
    )
  )
  (while T
    (setq vzo "")
    (setq val(+ val 1) strval(rtos val) szo(- ws (strlen strval)))
    (repeat szo
      (setq vzo(strcat "0" vzo))
    );补足前置零,保持与源编号"位数"一致
    (setq strval(strcat vzo strval))
    (setq strval(strcat qz strval))
  (setq i T)
  (while i
    (setq gr (grread t 15));获取动态信息,但为何左键按下没有反应?
    ;(setq gr (GXL-GE-GRREAD '(t 7 2) nil (entlast)));GXL-GE-GRREAD为动态“添加扑捉”函数
    (cond
      ((= 5 (car gr))
       (setq p2 (trans (cadr gr) 1 0))
       (if text;若直线已生成,采取替换模式
         (progn
           (setq text(subst (cons 10 p2) (assoc 10 text) text))
           (entmod text)
         )
         (if col
           (progn
             (entmake(list '(0 . "TEXT") (cons 10 p2) zh lay col sty (cons 1 strval)))
             (setq text(entget (entlast)))
           )
           (progn
             (entmake(list '(0 . "TEXT") (cons 10 p2) zh lay sty (cons 1 strval)))
             (setq text(entget (entlast)))
           )
         );首次生成图素
       )
      )
       ((or
         (= 3 (car gr));左键按下,为何没有执行该语句呢?困惑!
         (= 25 (car gr))
         (and (= 2 (car gr)) (= (cadr gr) 13))
         (and (= 2 (car gr)) (= (cadr gr) 32))
        )
        (setq i nil)
       )
     )
   
  );逐次连续编号,esc退出
  )
  (setvar "CMDECHO" 1)
  (setvar "CLAYER" oldlayer)
  (setvar "osmode" os)
  (princ)
  )

;;;子函数1
(defun HBC_BH-01()
  (if (and (/= (substr ss i 1) "0") (= (atoi(substr ss i 1)) 0));判断是否为数字字符
      (progn
        (setq val(atoi(substr ss (+ i 1) (- len i))));提取尾数转整型,即可去除前置零
        (setq ws(- len i));尾数位数
        (setq qz(substr ss 1 i));提取前缀
        (setq i(+ i len))
      )
      (setq i(- i 1))
  )
  (princ)
)

本帖子中包含更多资源

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

x
发表于 2013-1-2 15:01 | 显示全部楼层
本帖最后由 NetBee 于 2013-1-2 15:25 编辑

这个死循环你准备什么时候跳出?[code="lisp] (while T
            (setq vzo "")
            (setq val         (+ val 1)
                     strval (rtos val)
                     szo         (- ws (strlen strval))
            )
           ;;..................................[/code]
发表于 2013-1-2 15:44 | 显示全部楼层
本帖最后由 NetBee 于 2013-1-2 15:48 编辑

[code="lisp] ;;;实现识别递增编号 By cjh_201-12-08
;;;新增选择模式,增强通用性 2012-12-23
;;;修改 by netbee of www.mjtd.com 2013-1-2

(defun c:HBC_BH        (/ gr text EP1 zm ss zh lay sty col len i bJ val ws qz p2 vzo strval bhms e1)
  (print "<HBC_BH(智能编号)>功能已开启")
  (print "<模式1:尾数数字位&&模式2:末位数字位")
  (setq os (getvar "osmode"))
  (setq oldlayer (getvar "CLAYER"))
  (setq temperr *errror*)
  (setq *error* trap1)
  (command "undo" "m")
  (setq os (getvar "osmode"))
  (setq bhms (getint "\n输入编号模式<模式1(1)/模式2(2)>(默认1):"))
  (setvar "CMDECHO" 0)
  (setvar "osmode" 0)
  (setq EP1 (entsel "\n选取源编号:"))
  (while (= EP1 nil) (setq EP1 (entsel "\n选取源编号:")))
  (setq zm (entget (car EP1)))                ;(setvar "osmode" 15359)
  (setq        ss  (cdr (assoc 1 zm))
        zh  (assoc 40 zm)
        lay (assoc 8 zm)
        sty (assoc 7 zm)
  )
  (if (assoc 62 zm)
    (setq col (assoc 62 zm))
  )                                        ;提取图层,颜色,字高,文字样式等信息
  (setq len (strlen ss))
  (setq i (- len 1))
  (setq val (substr ss len 1))
  (if (and (/= val "0") (= (atoi val) 0)) ;非数字,成立
    (progn (alert "提示:编号末位非数字位!请在编号末位添加数字。") (exit))
  )
  (if (= bhms 2)
    (setq val (atoi val)
          qz  (substr ss 1 i)
          ws  1
    )                                        ;后缀,前缀
    (while (< i len) (HBC_BH-01))
  )
  (setq bJ T)
  (while bJ
    (setq vzo "")
    (setq val         (+ val 1)
          strval (rtos val)
          szo         (- ws (strlen strval))
    )
    (repeat szo (setq vzo (strcat "0" vzo))) ;补足前置零,保持与源编号"位数"一致
    (setq strval (strcat vzo strval))
    (setq strval (strcat qz strval))
    (setq i T)
    (while i
      (setq gr (grread t 15))               
                                       
      (cond ((= 5 (car gr))
             (setq p2 (trans (cadr gr) 1 0))
             (if text                        ;若直线已生成,采取替换模式
               (progn (setq text (subst (cons 10 p2) (assoc 10 text) text)) (entmod text)(setq e1(entlast)))
               (if col
                 (progn        (entmake (list '(0 . "TEXT") (cons 10 p2) zh lay col sty (cons 1 strval)))
                        (setq text (entget (setq e1(entlast))))
                 )
                 (progn        (entmake (list '(0 . "TEXT") (cons 10 p2) zh lay sty (cons 1 strval)))
                        (setq text (entget (setq e1(entlast))))
                 )
               )                        ;首次生成图素
             )
            )
            ((or (= 3 (car gr)) (= 25 (car gr)))
             (setq i nil text nil e1 nil)
            )
            ((and (= 2 (car gr)) (or (= (cadr gr) 13) (= (cadr gr) 32))) (setq bJ nil i nil text nil))
      )
    )                                        ;逐次连续编号,esc退出
)
  (if e1(entdel e1))
  (setvar "CMDECHO" 1)
  (setvar "CLAYER" oldlayer)
  (setvar "osmode" os)
  (princ)
)

;;;子函数1
(defun HBC_BH-01 ()
  (if (and (/= (substr ss i 1) "0") (= (atoi (substr ss i 1)) 0)) ;判断是否为数字字符
    (progn (setq val (atoi (substr ss (+ i 1) (- len i)))) ;提取尾数转整型,即可去除前置零
           (setq ws (- len i))                ;尾数位数
           (setq qz (substr ss 1 i))        ;提取前缀
           (setq i (+ i len))
    )
    (setq i (- i 1))
  )
  (princ)
)[/code]
发表于 2013-1-2 16:54 | 显示全部楼层
回复,看看程序!谢谢!
发表于 2013-1-4 10:44 | 显示全部楼层
不懂,看一看
 楼主| 发表于 2013-1-12 18:16 | 显示全部楼层
NetBee 发表于 2013-1-2 15:44
**** 本内容被作者隐藏 ****

谢谢兄台相助! 还有个问题就是,最后按esc退出时,如何让程序删除最后那个图素文字,现在程序虽然有entdel (entlast).但并没删去最后图素.
例外:请教兄台,grread=15 ,2 ,3这些数字有哪些具体含义,哪里可以查到,请指点!
发表于 2013-1-12 19:54 | 显示全部楼层
学习学习!
发表于 2013-2-2 18:59 | 显示全部楼层
谢谢分享,学习一下
发表于 2013-2-2 23:55 | 显示全部楼层
回复学习一下
发表于 2013-2-3 16:23 | 显示全部楼层
好帖子,帮忙测试一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2019-11-21 00:44 , Processed in 0.189527 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.3

© 2001-2013 Comsenz Inc.

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