明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索

[提问] 字母递增复制

[复制链接]
 楼主| 发表于 2013-11-29 11:55 | 显示全部楼层
  • (defun c:NBTC_TXTCopyadd (/             fun_setini        fun_close  fun_error  FUN_GETdigit            old_error old_DIMZIN ureal          last_ent
  •                           Plus1             String_To_Numbers           buchang1   $buchang         SS            SS1               e0          ent
  •                           PT             i                loop           ENTL              E-1         NEWTX            ENT_TMP
  •                          )
  •   (defun fun_setini ()
  •     (setq old_error *error*
  •           old_DIMZIN(getvar "DIMZIN")
  •           *error* fun_error
  •     )
  •     (or NBTV_TXT_CopyADD (setq NBTV_TXT_CopyADD 1.0))
  •     (setvar "cmdecho" 0)
  •     (setvar "DIMZIN" 0)
  •     (vl-cmdf "_.undo" "be")
  •   )
  •   (defun fun_error (msg) (princ msg) (fun_close))
  •   (defun fun_close () (vl-cmdf "_.undo" "e") (setvar "DIMZIN" old_DIMZIN)(setvar "cmdecho" 1) (setq *error* old_error))
  •   (defun ureal (bit kwd msg def / inp)
  •     (if        def
  •       (setq msg        (strcat "\n" msg "<" (rtos def 2) ">: ")
  •             bit        (* 2 (fix (/ bit 2)))
  •       )
  •       (setq msg (strcat "\n" msg ": "))
  •     )
  •     (initget bit kwd)
  •     (setq inp (getreal msg))
  •     (if        inp
  •       inp
  •       def
  •     )
  •   )
  •   (defun String_To_Numbers (inStr
  •                             ;;Input string
  •                             / Flush_Buf        Res
  •                             ;;Result list
  •                             Buf
  •                             ;;String buffer
  •                             Inx
  •                             ;;Character location
  •                             CH
  •                             ;;Character
  • )   (defun Flush_Buf ()
  •       (if (not (wcmatch Buf "[+-.]"))        ;is it not just +-.
  •         (progn                                ;Clean it up first
  •           (if (= (substr Buf 1 1) ".")
  •             (setq Buf (strcat "0" Buf))
  •           )
  •           ;;add zero to front if .#
  •           (if (= (substr Buf (strlen Buf)) ".")
  •             (setq Buf (substr Buf 1 (1- (strlen Buf))))
  •           )
  •           ;;remove decimal if #.
  •                                         ;Add to RES list
  •           (setq RES (cons Buf RES))
  •         )
  •       )
  •       (setq Buf "")
  •       ;;reset Buf
  •     )
  •     (setq Inx 1                                ;start at the beginning of the string
  •           Buf ""                        ;init buffer to empty
  •     )                                        ;
  •                                         ; Loop until the end of the string.
  •                                         ; (I indicates where we are in the string)
  •                                         ;
  •     (while (<= Inx (strlen inStr))        ;
  •                                         ; Get the character at position Inx, increment position indicator
  •       (setq CH        (substr inStr Inx 1)
  •             Inx        (1+ Inx)
  •       )                                        ;
  •       (cond                                ; Test to see if character is a digit.
  •         ((wcmatch CH "[0-9.]")
  •          (if (= CH ".")                        ;is it decimal
  •            (if (not (wcmatch Buf "*`.*")) ;not already in there
  •              (setq Buf (strcat Buf CH))
  •              (Flush_Buf)
  •            )                                ;
  •            (setq Buf (strcat Buf CH))
  •          )
  •         )
  •         ((= Buf "")                        ;is the buffer empty
  •                                         ;Is CH minus
  •          (if (= CH "-")
  •            (setq Buf CH)                ;Yes, save in Buf
  •          )
  •         )
  •         ('T                                ;else buffer is not empty
  •          (Flush_Buf)
  •          (if (= CH "-")
  •            (setq Buf CH)
  •          )
  •         )
  •       )                                        ; End of COND
  •     )                                        ; End of WHILE
  •                                         ;
  •     (if        (and (/= Buf "") (not (wcmatch Buf "[+-.]")))
  •       (Flush_Buf)
  •     )
  •     (reverse Res)
  •   )
  •   (defun FUN_GETdigit (sNum)
  •     (IF        (vl-string-search "." sNum)
  •       (STRLEN (substr sNum (+ 2 (vl-string-search "." sNum))))
  •       0
  •     )
  •   )
  •   (defun Plus1 (str buchang / d1 d2 h num1 num2)
  •     (setq str (vl-string-translate "-" (chr 1) str))
  •     (or (setq d1 (last (string_to_numbers str))) (setq d1 "0"))
  •     (setq h (vl-string-right-trim d1 str))
  •     (setq num1 (FUN_GETdigit d1))
  •     (setq d2 (vl-string-right-trim "." (vl-string-right-trim "0" (RTOS (+ (read d1) buchang) 2 12))))
  •     (setq num2 (FUN_GETdigit d2))
  •     (if        (and (= num2 0) (> num1 0))
  •       (setq d2 (strcat d2 "."))
  •     )
  •     (repeat (- num1 num2) (setq d2 (strcat d2 "0")))
  •     ;;(setq d2 (vl-princ-to-string (+ (read d1) buchang)))
  •     (while (< (strlen d2) (strlen d1)) (setq d2 (strcat "0" d2)))
  •     (vl-string-translate (chr 1) "-" (strcat h d2))
  •   )
  •   (defun last_ent (en / ss)
  •     (if        en
  •       (progn (setq ss (ssadd))
  •              (while (setq en (entnext en))
  •                (if (not (member (cdr (assoc 0 (entget en))) '("ATTRIB" "VERTEX" "SEQEND")))
  •                  (ssadd en ss)
  •                )                        ;if
  •              )                                ;while
  •              (if (zerop (sslength ss))
  •                (setq ss nil)
  •              )
  •              ss
  •       )                                        ;progn
  •       (ssget "_x")
  •     )                                        ;if
  •   )
  •   ;;-------------
  •   (fun_setini)
  •   (if (setq $buchang (ureal 1 "" "\n增减值(正为增,负为减)" NBTV_TXT_CopyADD))
  •     (setq NBTV_TXT_CopyADD $buchang)
  •   )
  •   (setq ss (ssget ))
  •   (setq e0 (entlast))
  •   (setq pt (getpoint "指定基点:"))
  •   (command "copy" ss "" pt pause)
  •   (setq loop T)
  •   (if (= 0 (distance (setq Point (getvar "LastPoint")) pt)) ;判断最后一点是不是pt点.
  •     (progn (setq loop nil)                ;Right Button
  •            (setq ent_tmp (LAST_ENT e0))        ;ent_tmp 是e0后生成的物体.
  •            (command "_.erase" ent_tmp "")
  •     )
  •     (setq pt Point)
  •   )
  •   (while loop
  •     (SETQ SS1 (last_ent E0)
  •           I   0
  •     )
  •     (repeat (sslength ss1)
  •       (setq ent         (ssname ss1 i)
  •             i         (1+ i)
  •             entl (entget ent)
  •       )                                        ;图元资料
  •       (if (wcmatch (cdr (assoc 0 entl)) "*TEXT")
  •         (progn (setq e-1   (cdr (assoc 1 entl))
  •                      ;;文字内容
  •                      NEWTX (Plus1 E-1 NBTV_TXT_CopyADD)
  •                )
  •                (entmod (subst (cons 1 NEWTX) (assoc 1 entl) entl)) ;更新文字
  •         )
  •       )
  •     )                                        ;end repeat  
  •     (setq e0 (entlast))
  •     (command "copy" ss1 "" pt pause)
  •     (setq Point (getvar "LastPoint"))
  •     (if        (= 0 (distance Point pt))        ;判断最后一点是不是pt点.
  •       (progn (setq loop nil)                ;Right Button
  •              (setq ent_tmp (LAST_ENT e0)) ;ent_tmp 是e0后生成的物体.
  •              (command "_.erase" ent_tmp "")
  •       )
  •       (progn (setq pt Point)
  •              ;;(setq ss (LAST_ENT e0))
  •       )
  •     )
  •   )
  •   (fun_close)
  •   (princ)
  • )

  • (princ "复制文字增加数字 NBTC_TXTCopyadd")
  • 文字递增这个程序不要太好


发表于 2013-11-30 18:21 | 显示全部楼层
算了。还是发下吧。
  1. (defun c:zm1 (/ mycopy mymove SstoEs sign ss p1 p2 indx)
  2.   (vl-load-com)
  3.   (defun SstoEs(ss / a en lst)
  4.     (if ss(progn(setq a -1)(while(setq en(ssname ss(setq a(1+ a))))(setq lst (cons en lst)))))
  5.     lst)
  6.   ;(defun sign (nn) (if (< nn 0) 1 (if (> nn 0) -1 0)))
  7.   (defun mycopy(ss p p1 / ty q q1 s1 s2);;参照by-xyp1964的xyp-ScaleEntity
  8.     (setq ty(type ss)i -1  s2(ssadd)  q1(vlax-3D-point(trans p1 0 0))  q(vlax-3D-point(trans p 0 0)))
  9.     (cond((= ty 'ENAME)(vla-move(vla-copy(vlax-ename->vla-object ss))q q1)(setq s2(ssadd(entlast)s2)))
  10.          ((= ty 'PICKSET)(setq i -1)  (while (setq s1 (ssname ss (setq i (1+ i))))
  11.                                         (mycopy s1 p p1)(setq s2(ssadd(entlast)s2))))
  12.          ((= ty 'LIST)(foreach x ss(mycopy x p p1)(setq s2(ssadd(entlast)s2))))
  13.          )s2)
  14.   (defun mymove(ss p p1 / ty q q1 s1);;参照by-xyp1964的xyp-ScaleEntity
  15.     (setq ty(type ss)i -1
  16.           q1(vlax-3D-point(trans p1 0 0)) q(vlax-3D-point(trans p 0 0)))
  17.     (cond((= ty 'ENAME)(vla-move(vlax-ename->vla-object ss)q q1))
  18.          ((= ty 'PICKSET)(setq i -1)
  19.           (while (setq s1 (ssname ss (setq i (1+ i))))
  20.             (mymove s1 p p1)))
  21.          ((= ty 'LIST)(foreach x ss(mymove x p p1))))
  22.     )
  23.   (if ind (princ) (setq ind 1))
  24.   (if (setq indx (getint (strcat "\n输入增减量<"(rtos ind 2 0 )"> :"))) (setq ind indx));ind (sign ind))
  25.   (prompt"\n选择要进行递增复制的文字、属性:")
  26.   (setq ss(SstoEs(ssget'((0 . "*TEXT,ATTDEF")))))
  27.   (setq p1(getpoint"\n复制基点:"))
  28.   (prompt "\n复制到(右键退出):")
  29.   (while(and p1 (setq p2(getpoint p1)) ss)
  30.     (mycopy(setq ss(vl-remove'nil(mapcar'(lambda(x)(setq e(entget x))
  31.                                             (if(assoc 1 e)
  32.                                               (progn(setq tx(vl-string->list (cdr(assoc 1 e))))
  33. ;;;                                                (if
  34. ;;;                                                  (OR (<= (IF(> ind 0)65 66) (last tx) (IF(> ind 0)89 90))
  35. ;;;                                                      (<=(IF(> ind 0)97 98)(last tx)(IF(> ind 0)121 122)))x)
  36.                                                 ;(princ(+ (last tx) ind))
  37.                                                 (if (or(and (>= (+ (last tx) ind) 65)                                                            
  38.                                                             (<= (+ (last tx) ind) 90)                                                            )
  39.                                                        (and (>= (+ (last tx) ind) 97)                                                            
  40.                                                             (<= (+ (last tx) ind) 122)                                                            )
  41.                                                        (and (>= (+ (last tx) ind) 48)                                                            
  42.                                                             (<= (+ (last tx) ind) 57)                                                            
  43.                                                             )) x)
  44.                                                 )))ss)))p1 p1)
  45.     (mymove ss p1 p2)
  46.     (mapcar'(lambda(x)(entmod(setq e(entget x)tx(vl-string->list (cdr(assoc 1 e)))
  47.                                    e(subst(cons 1 (vl-list->string(reverse(cons
  48.                                                                             ;((IF(> ind 0)1+ 1-)(last tx))
  49.                                                                              (+ (last tx) ind)
  50.                                                                             (cdr(reverse tx))))))(assoc 1 e)e)))
  51.               nil)ss)
  52.     (setq p1 p2)
  53.     (if ss (princ)(princ "\n超出范围或末尾不是字母,程序退出!'"))
  54.     )
  55.   (princ)
  56. )
发表于 2013-12-1 02:44 | 显示全部楼层
楼上这代码怎么这么熟悉
发表于 2013-12-1 10:02 | 显示全部楼层
llsheng_73 发表于 2013-12-1 02:44
楼上这代码怎么这么熟悉

熟悉吧,不就是你发的咯。调试更改后,可以增减末尾为字母,数字的,数字只是0-9,字母A-Z,a-z。
 楼主| 发表于 2013-12-3 12:58 | 显示全部楼层
越来越接近
发表于 2013-12-3 16:04 | 显示全部楼层
edata 发表于 2013-12-1 10:02
熟悉吧,不就是你发的咯。调试更改后,可以增减末尾为字母,数字的,数字只是0-9,字母A-Z,a-z。

不过对于数字它不象字母这么简单,因为最后一位的的前一位甚至前几位也可能是数字, 所以不能简单处理最后一位
从这个意义是说,字母它也可以一长串,前边弄的只处理最后一位的处理方式就不够灵活,总之要真正实现编号自动增减还需要对程序进行较大改动才行,当然对于怎么实现复制这一部分是不需要改的,要做的工作全在改文本内容上
发表于 2013-12-3 17:26 | 显示全部楼层
llsheng_73 发表于 2013-12-3 16:04
不过对于数字它不象字母这么简单,因为最后一位的的前一位甚至前几位也可能是数字, 所以不能简单处理最后 ...

数字递增比较多了,就没深入修改这个代码,每个人都有自己的方式,我就是觉得通过读ascii码判断方式比较特别,才动手改的,其实数字也可以判断是数字后,继续读取倒数第二位,第三位,通过ascii计算出数字,因为某些方法,如http://bbs.mjtd.com/forum.php?mod=viewthread&tid=100800,改程序必须通过dimzin变量控制精度,在数字增加的情况下递增的数值会有多余的小数点000000000001之类的,我测试过,具体是多少会变也记不清了。而我自己写的编号递增程序,也要改dimzin来控制(以前没上论坛搜,调试了很久)。
如果能通过ascii来控制数值,应该就没有这样的问题了,还有就是整数有限制值,貌似字符串,没有限制长度。
有空了再研究。

发表于 2013-12-3 17:35 | 显示全部楼层
edata 发表于 2013-12-3 17:26
数字递增比较多了,就没深入修改这个代码,每个人都有自己的方式,我就是觉得通过读ascii码判断方式比较特 ...

整数增减也会多出小数点来么?那以后还真得注意它了
发表于 2013-12-3 18:00 | 显示全部楼层
llsheng_73 发表于 2013-12-3 17:35
整数增减也会多出小数点来么?那以后还真得注意它了

刚又测试了下,就这结果。

本帖子中包含更多资源

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

x
 楼主| 发表于 2013-12-10 11:57 | 显示全部楼层
其实我所说框选只是要实现图示数字递增类似的字母递增,该怎么该,ssget()应该怎么定义

本帖子中包含更多资源

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

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-5 10:30 , Processed in 2.564559 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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