gysjy 发表于 2008-12-10 12:37:06

[原创]:一个递增复制文字和属性块的程序

命令名:cptxt
程序特点:
1.本程序既适用于文字,也适用于带属性的块。
2.该程序拷贝字符串或带属性的块后,如果文字或块属性后带有数字,则该数字自动增加1;如果文字或块属性后没有数字,则程序会在后面添加一个数字。如:平面图==>平面图1==>平面图2
3.对于混杂文字及数字的字符串,增量后仅改变后面的数字,前面的文字则保留不变。如A-9增量后成为A-10,前面的“A-”不变。
4.对于形如A01的文字或块属性,增量后的结果依次是A02、A03……A10,不会丢掉“0”字。

(本程序已依据各位朋友的建议进行了一系列修改,其修改的内容是:1. 解决了0字开头的数的递增问题;2.纯字母的情况按字母排列顺序递增;3.有两个属性的块可以选择增加哪个属性;4.解决了拷贝起始点的偏移问题。2009.1.6)

gysjy 发表于 2008-12-16 21:09:10

最初由 xmchy 发布
能不能那样啊,如果尾数是数字,1,2,3之类得,就按数字来递增,如果是字母得,abcd,之类的就按字母来递增,能不能做的到?
字母的递增仅限于单个字母。如:D==> E==>F==>G……。
abcd==>abcd1==>abcd2==>abcd3……。
最初由 xotoo 发布
如果一个块里面有两个属性文字,可不可以选择对哪个文字进行递增?

将主程序和子程序tqwz分别修改如下:
子程序tqwz:


(defun tqwz();;提取属性或文字内容
(if (= "TEXT" (to 0))
    (setq st (to 1))
    (progn
      (setq s (entget (entnext (cdr (car (entget sn)))))
            st (cdr (assoc 1 s))
      )
          (setq sn1(entnext sn)
                s (entget (entnext (cdr (car (entget sn1)))))
                str1 (cdr (assoc 1 s))
          )   
          (if str1
            (if loop
            (setq p (getpoint (strcat
                      "\n 请选择增长哪个属性/鼠标左键(" st ")/鼠标右键(" str1 "):"))
                  st (if p st str1)loop nil
            )
            (setq st (if p st str1))
            )
          )
    )
)
)


主程序:


(defun c:nn( / asc e1 e2 en en1 k l loop p p1 p2 sn sn1 st st1 st2)
(setq *error* nil)
(command "undo" "g")
(princ "\n欢迎使用文字或属性块连续增量拷贝程序! GYSJY2008.12.16")
(if (setq sn (entsel "\n点取物体:"))
    (progn
      (setq p1 (cadr sn) p2 t sn (car sn) loop t)
      (if (or (= "TEXT" (to 0))(and p2 (to 66)(= "INSERT" (to 0))))
      (progn                                                
          (tqwz)
          (tqtxt)
          (setq l (1+ l ))
          (while p2
            (setq p2 (getpoint "\n下一点:" p1))
            (command "copy" sn "" p1 p2)   
            (setq sn (entlast) p1 p2 en (entget sn))
            (tqwz);(princ st)(getstring)
            (setq asc (ascii st))
            (if p2
            (if (and (= (strlen st) 1)
                  (or (and (> asc 64) (< asc 90))
                        (and (> asc 96) (< asc 122))
                  )
                  );判断字符串是否是单个字母
                (setq k (if (or (= asc 78)(= asc 72))(+ asc 2)(1+ asc));排除字母I,O
                      st (chr k)
                ) ;如果字符串是单个字母,则按字母顺序增长            
                (setq st2 (substr st l) st2 (tost2)
                      st (strcat st1 st2)
                ) ;按数字增长
            )
            )
            (if (= "TEXT" (to 0))
            (progn
                (setq e1 (subst (cons 1 st) (assoc 1 en) en))
                (entmod e1)
            );修改文字
            (if (or loop p)
                (progn
                  (setq e1 (entget (entnext (cdr (car en)))))
                  (setq e1 (subst (cons 1 st) (assoc 1 e1) e1))
                  (entmod e1)(entmod en)
                )
                (progn
                  (setqsn1(entnext sn) en1 (entget sn1)
                     e1 (entget (entnext (cdr (car en1))))
                     e2 (subst (cons 1 st) (assoc 1 e1) e1)
                  )
                  (entmod e2)(entmod en1)(entmod en)
                )
            );修改属性
            )
            (princ st)
          )
      )
      (princ "\n   ***你所点取的图元不是属性块或文字!本程序只拷贝带属性的块或文字。***")
      )
      )
)
(command "undo" "e")
(princ)
)


gysjy 发表于 2008-12-10 12:39:16

如图所示

gysjy 发表于 2008-12-10 17:46:32

如图

userzhluserzhl 发表于 2008-12-12 15:47:36

欢迎使用文字或属性块连续增量拷贝程序! GYSJY2008.12.9
点取物体:; 错误: 参数值错误: 正 0

0字开头的会出错!!!

gysjy 发表于 2008-12-12 17:54:28

最初由 userzhluserzhl 发布

0字开头的会出错!!!
将子程序tqtxt修改如下:


(defun tqtxt( / n n0 st0 l0);;提取尾部数字前的字符串
(setq st1 st l(strlen st1) st0 (substr st1 l) s1 (substr st 1 1)
      n (atoi st0) n0 (atoi st1) l0 (strlen (itoa n0))
)
(if (or (= s1 "0")(and (> n0 0) (= l l0)));纯数字不循环
    (setql 0 st1 "")
    (while (or (> n 0) (= st0 "0"))
      ;= st0 "0",如果遇到形如A01中的0,继续循环
      (setq st1 (substr st1 1 (1- l))
            l (strlen st1) st0 (substr st1 l) n (atoi st0)            
      )
    )
)
)

qiuxiang129 发表于 2008-12-13 00:23:17

好东东

userzhluserzhl 发表于 2008-12-13 11:56:53

建议增加:先确定拷贝的起始点,这样才好定位。

xotoo 发表于 2008-12-14 20:16:44

楼主可不可以进行如下的修改:
1、如果遇到需要递增的文字为单个字母的时候(比如“D”)递增的时候不是递增为D1、D2,而是递增为“E、F、G……”
2、如果遇到需要递增的文字为字母+数字的时候(比如“D1”),递增的时候再递增成“D2、D3、D4……”
3、接第一个问题——遇到需要递增内容为“带属性的块”时,如果块内有两个不同的内容,可不可以有选择性的进行某个内容的递增或者二者同时递增——下面用一个图来说明这个问题

gysjy 发表于 2008-12-15 18:46:14

最初由 xotoo 发布
楼主可不可以进行如下的修改:
1、如果遇到需要递增的文字为单个字母的时候(比如“D”)递增的时候不是递增为D1、D2,而是递增为“E、F、G……”
2、如果遇到需要递增的文字为字母+数字的时候(比如“D1”),递?..
对于第一和第二个问题,将主程序修改如下:

(defun c:nn( / asc e1 en k l p1 p2 sn st st1 st2)
(setq *error* nil)
(command "undo" "g")
(princ "\n欢迎使用文字或属性块连续增量拷贝程序! GYSJY2008.12.15")
(if (setq sn (entsel "\n点取物体:"))
    (progn
      (setq p1 (cadr sn) p2 t sn (car sn))
      (if (or (= "TEXT" (to 0))(and p2 (to 66)(= "INSERT" (to 0))))
      (progn
          (tqwz)
          (tqtxt)
          (setq l (1+ l ))
          (while p2
            (setq p2 (getpoint "\n下一点:" p1))
            (command "copy" sn "" p1 p2)   
            (setq sn (entlast) p1 (to 10) en (entget sn))
            (tqwz)
            (setq asc (ascii st))
            (if p2
            (if (and (= (strlen st) 1)
                  (or (and (> asc 64) (< asc 90))
                        (and (> asc 96) (< asc 122))
                  )
                  );判断字符串是否是单个字母
            (setq k (if (or (= asc 78)(= asc 72))(+ asc 2)(1+ asc));排除字母I,O
                  st (chr k)
            ) ;如果字符串是单个字母,则按字母顺序增长            
            (setq st2 (substr st l) st2 (tost2)
                  st (strcat st1 st2)
            ) ;按数字增长
            )
          )
            (if (= "TEXT" (to 0))
            (progn
                (setq e1 (subst (cons 1 st) (assoc 1 en) en))
                (entmod e1)
            );修改文字
            (progn
                (setq e1 (entget (entnext (cdr (car en)))))
                (setq e1 (subst (cons 1 st) (assoc 1 e1) e1))
                (entmod e1)(entmod en)
            );修改属性
            )
            (princ st)
          )
      )
      (princ "\n   ***你所点取的图元不是属性块或文字!本程序只拷贝带属性的块或文字。***")
      )
    )
)
(command "undo" "e")
(princ)
)



第三个问题比较复杂,主要是第二个属性难以提取。如果谁知道的话,欢迎贴出代码来。

xotoo 发表于 2008-12-15 21:21:56

谢谢楼主,试用了一下,我前两个问题解决了;
如果排除不提取第二个属性的话,可不可以修改成这样的哪——如果一个块里面有两个属性文字,可不可以选择对哪个文字进行递增?

另外麻烦楼主去下面的链接看看15楼的程序,那个程序可以把一个文字中的所有数字(不相连)进行递增,可惜还是没有做到可以有选择的进行……
http://www.xdcad.net/forum/showthread.php?s=&threadid=655545

gysjy 发表于 2008-12-16 17:50:32

最初由 xotoo 发布
谢谢楼主,试用了一下,我前两个问题解决了;
如果排除不提取第二个属性的话,可不可以修改成这样的哪——如果一个块里面有两个属性文字,可不可以选择对哪个文字进行递增?

提取第二个属性的代码已经找到,选择属性的想法可以实现。

xmchy 发表于 2008-12-16 20:41:26

能不能那样啊,如果尾数是数字,1,2,3之类得,就按数字来递增,如果是字母得,abcd,之类的就按字母来递增,能不能做的到?

xotoo 发表于 2008-12-16 22:36:49

好好好……超级感谢!
另外你签名档里面的那个“双线交叉”的网页怎么打不开了啊?

userzhluserzhl 发表于 2008-12-17 07:59:42

如果有多个属性(比如四个)呢?
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: [原创]:一个递增复制文字和属性块的程序