明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3474|回复: 33

[提问] 求改进复制递增 A-009 变 A-0010 改为 A-009 变 A-010

[复制链接]
发表于 2020-1-10 09:03 | 显示全部楼层 |阅读模式
2明经币
本帖最后由 669423907 于 2020-1-10 09:05 编辑

非常感谢网友的分享,程序运行中遇到一个问题 A-009 会变成 A-0010 ,想要的效果是 A-009 变 A-010,
哪位大师帮忙改一下,谢谢了







;复制递增 carrot1983 2008-1-13 http://bbs.mjtd.com/forum.php?mo ... 31&page=1#pid347118
(defun c:13(/ txt_add ss      slen    i       na      data
       txt     txt_len nub     k       txt_each       num
       num_len n       temp    txt0    n0      expt_num
       faq1    faq2    int
      )
;  (setq int (getint "\n不考虑后缀字符的位数<0>:"))
  (if (= nil int)
    (setq int 0)
  ) ;_ end if
;  (setq txt_add (getint "\n请输入增值(默认为1):"))
  (if (= nil txt_add)
    (setq txt_add 1)
  ) ;_ end if
  (if (setq ss (ssget '((0 . "*text"))))
    (progn
      (command "._copy" ss "" '(0 0 0) '(0 0 0))
      (setq ss (ssget "p"))
      (princ "指定基点")
      (command "._move" ss"" pause)
      (setq slen (- (sslength ss) 1))
      (setq i 0)
      (while (<= i slen)
(setq na (ssname ss i))
(setq data (entget na))
(setq txt (cdr (assoc '1 data)))
(setq v10 (cdr (assoc '10 data)))
(setq txt_len (strlen txt)) ;9
(setq txt_cut (substr txt 1 (- txt_len int))) ;abc02
(setq txt_len_cut (strlen txt_cut)) ;5
(setq txt_43 (substr txt (- txt_len (1- int)) int)) ;(03)
(setq nub "")
(setq k txt_len_cut)
(while (>= k 1)
   (setq txt_each (substr txt_cut k 1))
   (if (and (>= (ascii txt_each) 48) (<= (ascii txt_each) 57))
     ;取字串中"0~9"中的ascii字符txt_each.
     (progn
       (setq nub (strcat txt_each nub))
       (setq k (1- k))
     )    ;end progn
     (setq k 0)
   )    ;end if
)    ;end while
(if (= nub "")
   (progn
     (princ "\n末尾不是数字")
     (exit)
   ) ;_ end progn
) ;_ end if
(setq num (atoi nub))  ;nub="02" num=2
(setq num_len (strlen nub)) ;2
;;;以下是考虑数字串中的零的问题
(setq n 1)
(setq temp 0)
(while (and (<= n num_len) (= temp 0))
   (setq txt0 (atof (substr nub n 1)))
   (if (/= txt0 0)
     (progn
       (setq n0 (1- n))
       (setq temp 1)
     ) ;_ end progn
   ) ;_ end if
   (setq n (1+ n))
)    ;end while
(setq
   expt_num (substr txt_cut 1 (+ n0 (- txt_len num_len int)))
)
(setq faq1 (itoa (+ num txt_add)))
(setq faq2 (strcat expt_num faq1 txt_43))
(setq data (subst (cons 1 faq2) (assoc '1 data) data))
(entmod data)
(setq i (+ i 1))
      )     ;end while
    )
  )
  (prin1)
)


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

最佳答案

查看完整内容

;;简单改了下,没怎么测试,建议测试下再用
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2020-1-10 09:03 | 显示全部楼层
;;简单改了下,没怎么测试,建议测试下再用

本帖子中包含更多资源

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

x

点评

satan421你就是个彻头彻尾的杂碎。一毛不拨,对别人指手画脚。垃圾。  发表于 2020-5-30 22:05
谢谢satan421大师热情帮助,效果很好  发表于 2020-1-10 13:46
回复

使用道具 举报

发表于 2020-1-10 21:57 | 显示全部楼层
不错的程序  谢谢分享      
回复

使用道具 举报

发表于 2020-1-13 09:23 | 显示全部楼层
本帖最后由 cq4920 于 2020-1-13 09:30 编辑

你那个不能连续复制!
我这里有一个程序!可以动态递增,输入复制间距,连续复制,可以自定递增数!
但是 这个程序的问题是会对字符串中每个数字进行增加,如A1#-P-01 递增后会变成 A2#-P-02
希望大神可以优化一下!!
  1. ;;-----------------------=={ Incremental Array }==----------------------;;

  2. (defun c:incarray nil (LM:incarray nil)) ;; Standard version
  3. (defun c:incarrayd nil (LM:incarray t )) ;; Dynamic version

  4. ;;----------------------------------------------------------------------;;

  5. (defun LM:incarray ( dyn / *error* bpt dim dis ept inc lst obl qty tmp vxu vxw )

  6. (defun *error* ( msg )
  7. (if (= 'int (type dim))
  8. (setvar 'dimzin dim)
  9. )
  10. (foreach obj obl
  11. (if (and (= 'vla-object (type obj)) (not (vlax-erased-p obj)) (vlax-write-enabled-p obj))
  12. (vla-delete obj)
  13. )
  14. )
  15. (incarray:endundo (incarray:acdoc))
  16. (if (not (wcmatch (strcase msg t) "*break,*cancel*,*exit*"))
  17. (princ (strcat "\nError: " msg))
  18. )
  19. (redraw) (princ)
  20. )

  21. (if (not (and (setq inc (getenv "LMac\\incarray")) (setq inc (distof inc))))
  22. (setq inc 1)
  23. )
  24. (if (setq tmp (getreal (strcat "\nSpecify increment <" (incarray:num->str inc) ">: ")))
  25. (setenv "LMac\\incarray" (incarray:num->str (setq inc tmp)))
  26. )
  27. (incarray:startundo (incarray:acdoc))
  28. (setq dim (getvar 'dimzin))
  29. (setvar 'dimzin 0)
  30. (cond
  31. ( (not
  32. (and
  33. (setq lst (incarray:selection->list (ssget "_:L" '((0 . "~VIEWPORT")))))
  34. (setq bpt (getpoint "\nSpecify base point: "))
  35. (progn
  36. (while
  37. (and
  38. (setq vxu (getpoint "\nSpecify array vector: " bpt))
  39. (equal bpt vxu 1e-8)
  40. )
  41. (princ "\nInvalid array vector.")
  42. )
  43. vxu
  44. )
  45. (setq vxu (mapcar '- vxu bpt)
  46. vxw (trans vxu 1 0 t)
  47. dis (distance '(0.0 0.0 0.0) vxw)
  48. )
  49. )
  50. )
  51. )
  52. ( dyn
  53. (princ "\nSpecify array end point: ")
  54. (while (= 5 (car (setq ept (grread t 13 0))))
  55. (redraw)
  56. (foreach obj obl (vla-delete obj))
  57. (setq qty (/ (caddr (trans (mapcar '- (cadr ept) bpt) 1 vxw t)) dis)
  58. obl (incarray:copyvector lst (mapcar (if (minusp qty) '- '+) vxw) (abs (fix qty)) inc)
  59. )
  60. (grvecs (list -3 bpt (mapcar '(lambda ( a b ) (+ (* a qty) b)) vxu bpt)))
  61. )
  62. )
  63. ( (setq ept (getpoint bpt "\nSpecify array end point: "))
  64. (setq qty (fix (/ (caddr (trans (mapcar '- ept bpt) 1 vxw t)) dis)))
  65. (incarray:copyvector lst (mapcar (if (minusp qty) '- '+) vxw) (abs (fix qty)) inc)
  66. )
  67. )
  68. (setvar 'dimzin dim)
  69. (incarray:endundo (incarray:acdoc))
  70. (redraw) (princ)
  71. )

  72. ;;----------------------------------------------------------------------;;

  73. (defun incarray:num->str ( x / dim rtn )
  74. (if (equal x (atof (rtos x 2 0)) 1e-8)
  75. (rtos x 2 0)
  76. (progn
  77. (setq dim (getvar 'dimzin))
  78. (setvar 'dimzin 8)
  79. (setq rtn (vl-catch-all-apply 'rtos (list x 2 15)))
  80. (setvar 'dimzin dim)
  81. (if (not (vl-catch-all-error-p rtn)) rtn)
  82. )
  83. )
  84. )

  85. ;;----------------------------------------------------------------------;;

  86. (defun incarray:copyvector ( lst vec qty inc / cnt obj obl org )
  87. (setq org (vlax-3D-point 0 0)
  88. cnt 1
  89. )
  90. (repeat qty
  91. (foreach itm lst
  92. (setq obj (vla-copy (car itm))
  93. obl (cons obj obl)
  94. )
  95. (vla-move obj org (vlax-3D-point (mapcar '* vec (list cnt cnt cnt))))
  96. (if (= "AcDbBlockReference" (vla-get-objectname obj))
  97. (mapcar
  98. (function
  99. (lambda ( att prp )
  100. (vl-catch-all-apply 'vlax-put-property
  101. (list att (car prp)
  102. (apply 'strcat
  103. (mapcar '(lambda ( x ) (incarray:increment x (* cnt inc)))
  104. (cdr prp)
  105. )
  106. )
  107. )
  108. )
  109. )
  110. )
  111. (vlax-invoke obj 'getattributes)
  112. (cdr itm)
  113. )
  114. (foreach prp (cdr itm)
  115. (vlax-put-property obj (car prp)
  116. (apply 'strcat
  117. (mapcar '(lambda ( x ) (incarray:increment x (* cnt inc)))
  118. (cdr prp)
  119. )
  120. )
  121. )
  122. )
  123. )
  124. )
  125. (setq cnt (1+ cnt))
  126. )
  127. obl
  128. )

  129. ;;----------------------------------------------------------------------;;

  130. (defun incarray:selection->list ( sel / idx lst obj obn )
  131. (if sel
  132. (repeat (setq idx (sslength sel))
  133. (setq obj (vlax-ename->vla-object (ssname sel (setq idx (1- idx))))
  134. obn (vla-get-objectname obj)
  135. )
  136. (if (and (= "AcDbBlockReference" obn) (= :vlax-true (vla-get-hasattributes obj)))
  137. (setq lst
  138. (cons
  139. (cons obj
  140. (mapcar '(lambda ( a ) (vl-list* 'textstring (incarray:splitstring (vla-get-textstring a))))
  141. (vlax-invoke obj 'getattributes)
  142. )
  143. )
  144. lst
  145. )
  146. )
  147. (setq lst
  148. (cons
  149. (cons obj
  150. (mapcar '(lambda ( p ) (vl-list* p (incarray:splitstring (vlax-get-property obj p))))
  151. (cond
  152. ( (wcmatch obn "AcDb*Text,AcDbMLeader") '(textstring))
  153. ( (wcmatch obn "AcDb*Dimension") '(textoverride))
  154. ( (= "AcDbAttributeDefinition" obn) '(tagstring promptstring textstring))
  155. )
  156. )
  157. )
  158. lst
  159. )
  160. )
  161. )
  162. )
  163. )
  164. )

  165. ;;----------------------------------------------------------------------;;

  166. (defun incarray:splitstring ( str / lst )
  167. (setq lst (vl-string->list str))
  168. (read (vl-list->string (vl-list* 40 34 (incarray:split lst (< 47 (car lst) 58)))))
  169. )

  170. ;;----------------------------------------------------------------------;;

  171. (defun incarray:split ( lst flg )
  172. (cond
  173. ( (null lst) '(34 41))
  174. ( (= 92 (car lst))
  175. (if flg
  176. (vl-list* 34 32 34 92 92 (incarray:split (cdr lst) nil))
  177. (vl-list* 92 92 (incarray:split (cdr lst) flg))
  178. )
  179. )
  180. ( (or (< 47 (car lst) 58) (and (= 46 (car lst)) flg (< 47 (cadr lst) 58)))
  181. (if flg
  182. (vl-list* (car lst) (incarray:split (cdr lst) flg))
  183. (vl-list* 34 32 34 (car lst) (incarray:split (cdr lst) t))
  184. )
  185. )
  186. ( flg (vl-list* 34 32 34 (car lst) (incarray:split (cdr lst) nil)))
  187. ( (vl-list* (car lst) (incarray:split (cdr lst) nil)))
  188. )
  189. )

  190. ;;----------------------------------------------------------------------;;

  191. (defun incarray:increment ( str inc / dci dcs len num )
  192. (if (numberp (read str))
  193. (progn
  194. (setq num (+ (distof str) inc)
  195. inc (incarray:num->str inc)
  196. str (vl-string-left-trim "-" str)
  197. inc (vl-string-left-trim "-" inc)
  198. dci (incarray:decimalplaces inc)
  199. dcs (incarray:decimalplaces str)
  200. len (strlen str)
  201. str (vl-string-left-trim "-" (rtos num 2 (max dci dcs)))
  202. )
  203. (cond
  204. ( (< 0 dcs) (setq len (+ (- len dcs) (max dci dcs))))
  205. ( (< 0 dci) (setq len (+ dci len 1)))
  206. )
  207. (repeat (- len (strlen str))
  208. (setq str (strcat "0" str))
  209. )
  210. (if (minusp num)
  211. (strcat "-" str)
  212. str
  213. )
  214. )
  215. str
  216. )
  217. )

  218. ;;----------------------------------------------------------------------;;

  219. (defun incarray:decimalplaces ( str / pos )
  220. (if (setq pos (vl-string-position 46 str))
  221. (- (strlen str) pos 1)
  222. 0
  223. )
  224. )

  225. ;;----------------------------------------------------------------------;;

  226. (defun incarray:startundo ( doc )
  227. (incarray:endundo doc)
  228. (vla-startundomark doc)
  229. )

  230. ;;----------------------------------------------------------------------;;

  231. (defun incarray:endundo ( doc )
  232. (while (= 8 (logand 8 (getvar 'undoctl)))
  233. (vla-endundomark doc)
  234. )
  235. )

  236. ;;----------------------------------------------------------------------;;

  237. (defun incarray:acdoc nil
  238. (eval (list 'defun 'incarray:acdoc 'nil (vla-get-activedocument (vlax-get-acad-object))))
  239. (incarray:acdoc)
  240. )

  241. ;;----------------------------------------------------------------------;;

  242. (vl-load-com)
  243. (princ
  244. (strcat
  245. (menucmd "m=$(edtime,0,yyyy)")
  246. )
  247. )
  248. (princ)

  249. ;;----------------------------------------------------------------------;;
  250. ;; End of File ;;
  251. ;;----------------------------------------------------------------------;;

回复

使用道具 举报

发表于 2020-1-13 11:03 | 显示全部楼层
satan421 发表于 2020-1-10 09:03
;;简单改了下,没怎么测试,建议测试下再用

谢谢分享。。。。。。。。。实用的源码
回复

使用道具 举报

 楼主| 发表于 2020-1-14 21:36 | 显示全部楼层
改了一下程序,可以显示复制次数,可以设定复制次数,但是还有两个问题:
1:以0结尾的文字无效
2:A-019会变A-20(019变20),应该A-019变A-020(019变020)
麻烦路过的大师帮忙改一下,谢谢了






(defun c:13()
(setq ss (ssget)
;f复制次数 5
)
(F复制递增 ss)
)


(defun c:31()
(setq ss (ssget)
f复制次数 5
)
(F复制递增 ss)
)




(defun F复制递增(ssi / ss1 ent pt i z)
(setq pt nil i 1)
(if f复制次数 (setq z f复制次数) (setq f复制次数 0) )
(while (and ssi f复制次数)
(progn
(if (not pt) (setq pt (getpoint "指定基点:")) )
(if pt
(progn
(setq ss1 (ssadd) ent (entlast))
(command "_.copy" ssi "" "non" '(0 0) "non" '(0 0))        ;拷贝
(while (setq ent (entnext ent)) ss1 (ssadd ent ss1) )
(command"select"ss1"")
(if (setq ss# (ssget "p" '((0 . "*text") (1 . "*#") ) ) ) (D递增 ss#) )
(command "_move" ss1 "" "non" pt "\\") ;移动
(if (= 0 (distance (getvar "LastPoint") pt)) ;判断最后一点是不是pt点
(command "_.erase" ss1 "" (setq f复制次数 nil))
(setq ssi ss1 pt (getvar "LastPoint") )
)
)
)
(if (or (not pt) (= f复制次数 1) ) (setq f复制次数 nil) )
(if (> f复制次数 1)
(progn
(princ (strcat "\n "(rtos z)" - "(rtos i)" = "(rtos (- f复制次数 1)) ) )
(setq f复制次数 (- f复制次数 1) i (1+ i) )
)
(progn (princ (strcat "\n 第 "(rtos i)" 次") ) (setq i (1+ i)) )
)
)
)
(setq f复制次数 nil)
(princ))


;复制递增 carrot1983小萝卜头 2008-1-13 http://bbs.mjtd.com/forum.php?mo ... mp;page=1#pid347118
(defun D递增(ss / slen i na data txt v10 txt_len txt_len_cut txt_43 nub k txt_each num num_len n temp txt0 n0 expt_num faq1 faq2)
      (setq slen (- (sslength ss) 1) i 0)
(if (not txt_add) (setq txt_add 1) ) ;增量值为1
(if (not int) (setq int 0) ) ;后缀字符的位数为0
      (while (<= i slen)
        (setq na (ssname ss i))
        (setq data (entget na))
        (setq txt (cdr (assoc '1 data)))
        (setq v10 (cdr (assoc '10 data)))
        (setq txt_len (strlen txt))        ;9
        (setq txt_cut (substr txt 1 (- txt_len int))) ;abc02
        (setq txt_len_cut (strlen txt_cut)) ;5
        (setq txt_43 (substr txt (- txt_len (1- int)) int)) ;(03)
        (setq nub "")
        (setq k txt_len_cut)
        (while (>= k 1)
          (setq txt_each (substr txt_cut k 1))
          (if (and (>= (ascii txt_each) 48) (<= (ascii txt_each) 57))
            ;;取字串中"0~9"中的ascii字符txt_each.
            (progn
              (setq nub (strcat txt_each nub))
              (setq k (1- k))
            )                                ;end progn
            (setq k 0)
          )                                ;end if
        )                                ;end while
        (if (= nub "")
          (progn
            (princ "\n末尾不是数字")
            (exit)
          )
        )
        (setq num (atoi nub))                ;nub="02" num=2
        (setq num_len (strlen nub))        ;2
        ;;以下是考虑数字串中的零的问题
        (setq n 1)
        (setq temp 0)
        (while (and (<= n num_len) (= temp 0))
          (setq txt0 (atof (substr nub n 1)))
          (if (/= txt0 0)
            (progn
              (setq n0 (1- n))
              (setq temp 1)
            )
          )
          (setq n (1+ n))
        )
        (setq
          expt_num (substr txt_cut 1 (+ n0 (- txt_len num_len int)))
        )
        (setq faq1 (itoa (+ num txt_add)))


;satan421 2020-1-10 http://bbs.mjtd.com/forum.php?mo ... mp;page=1#pid857396
        (if (= (rem (atoi faq1) 10) 0) (setq expt_num (substr expt_num 1 (1- (strlen expt_num)))))


        (setq faq2 (strcat expt_num faq1 txt_43))
        (setq data (subst (cons 1 faq2) (assoc '1 data) data))
        (entmod data)
        (setq i (+ i 1))
      )
(setq txt_add nil int nil)
(princ))

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2020-1-14 22:34 | 显示全部楼层
669423907 发表于 2020-1-14 21:36
改了一下程序,可以显示复制次数,可以设定复制次数,但是还有两个问题:
1:以0结尾的文字无效
2:A-019 ...

仅对字符串处理,如“019”+“1”=“020”,算法如下:
1、确定字符串最长位数,比如三位数;
2、将字符串转化为表,如“019”=‘(0  1  9);
3、将“1”对应为‘(0 0 1);
4、两表相加得‘(0 1 10);
5、将表逆转,得(10   1   0);
6、每位保留个位数,逢时往后进1,即得(0   2   0);
7、再次逆转表,得(0 2 0);
8、将表转化为字符串,即得“020”。

评分

参与人数 1金钱 +10 收起 理由
x_s_s_1 + 10 神马都是浮云

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2020-1-15 09:08 | 显示全部楼层
mahuan1279 发表于 2020-1-14 22:34
仅对字符串处理,如“019”+“1”=“020”,算法如下:
1、确定字符串最长位数,比如三位数;
2、将字 ...

谢谢你的回复,我不会弄,方便帮忙改一下吗,谢谢你啦
回复

使用道具 举报

发表于 2020-1-15 09:12 | 显示全部楼层
论坛里面有现成的,你仔细找找!!!
回复

使用道具 举报

 楼主| 发表于 2020-1-15 09:18 | 显示全部楼层
xj6019 发表于 2020-1-15 09:12
论坛里面有现成的,你仔细找找!!!

这个最合适我,可以作为公用函数,可以各种调用,实现不同效果
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 21:00 , Processed in 0.246395 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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