明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3112|回复: 4

文字批量替换,数字递增 (有些小问题,但是程序可以正常用)

[复制链接]
发表于 2013-8-19 16:53 | 显示全部楼层 |阅读模式
本帖最后由 zhb236623 于 2013-8-19 16:54 编辑

问题有三个:SSGET选择,  
一 、SSGET :;(setq dff "302002")
;(setq ss (ssget  (list (list -3 ( list "south" (cons 1000 dff))))))  这句要怎么写?因为图纸中有很多文字,直接用这句不好框选(setq ss (ssget  '((0 . "*TEXT"))))


(setq ss (ssget "x" (list (list -3 ( list "south" (cons 1000 dff))))))如果不要整个图形选,要框选要怎么改呢。?
二 、getstring
(if (not  (setq dh_n (getstring "\n请输入地号(前缀)四位数 <0001>: ")))
      (setq dh_n "0001")
  )
这里直接按回车dh_n值 为空,要怎样才能按空格使(setq dh_n "0001")这句生效。

三 、entmake   用法不太会,盼高手解答下
有这三个)(cons 71 1)(cons 72 1)(cons 73 1)就要加(cons 11 insertp_mid)(cons 10 insertp_mid) 那生成的时候用的哪个坐标

;;(entmake (list '(0 . "TEXT") (cons 1 wz) (cons 7  "仿宋体") (cons 11 insertp_mid)(cons 10 insertp_mid) (cons 40 0.5)(cons 41 0.8)(cons 71 1)(cons 72 1)(cons 73 1)(cons 8 "jj")))
只好用这个方法生成文字
(command ".style" "仿宋体" "仿宋_GB2312" wz_dx 0.8 0 "" "")
(command ".text" "j" "bc" insertp_mid 0 wz)

测试图纸发上来了。
之前发过的一个帖子。http://bbs.mjtd.com/thread-106952-1-1.html


  1. (defun c:tt()

  2. (if (= (tblobjname "layer" "JMD_zd01") nil)
  3. (progn
  4.    (command ".layer" "n" "JMD_zd01" "s" "JMD_zd01" "")
  5. )
  6. (progn
  7. (command "layer" "s" "JMD_zd01" "")
  8.    )
  9. )


  10. (vl-load-com)
  11. (setq ss (ssget  '((0 . "*TEXT"))))
  12. ;(regapp "south")


  13. ;(setq dff "302002")
  14. ;(setq ss (ssget  (list (list -3 ( list "south" (cons 1000 dff))))))
  15. ;(ssget (list (list -3(list "SOUTH"))))
  16. ;(setq ss (ssget   (list -3 ( list "south" (cons 1000 dff)))))

  17. (if (not  (setq dh_n (getstring "\n请输入地号(前缀)四位数 <0001>: ")))
  18.       (setq dh_n "0001")
  19.   )   



  20. (if (not (setq n1 (getint "\n请输入尾数起始顺序号 <1>: ")))
  21.     (setq n1 1)
  22.   )
  23.   
  24.   (if (not (setq wz_dx (getdist "\n请输入文字大小 <0.6>: ")))
  25.     (setq wz_dx 0.6)
  26.   )
  27.   
  28. ;;地号最后三位数不够补0,例3=003,34=034,189=189
  29. ;(command ".style" "仿宋体" "仿宋_GB2312" wzstyle 1 0 "" "")
  30.   (setq slist nil)
  31.   (setq i 0)

  32.     (repeat (sslength ss)
  33.     (setq en (ssname ss i))                                    ;(setq en (entget ssn))
  34.    
  35.     ;| (vla-getboundingbox        (vlax-ename->vla-object en)
  36.                         'minpoint
  37.                         'maxpoint
  38.     )
  39.     (setq pmax (vlax-safearray->list maxpoint)
  40.           pmin (vlax-safearray->list minpoint)
  41.     )
  42.     (setq xmin (car pmin))
  43.     (setq xmax (car pmax))
  44.     (setq ymin (cadr pmin))
  45.     (setq ymax (cadr pmax))
  46.     (setq xmid (/ (+ xmin xmax) 2))
  47.     ;;(setq ymid ( / ( + ymin ymax) 2))
  48.     (setq xmid_ymax (list xmid ymin)) |;
  49.    
  50.      (setq ept (entget en))
  51.     (setq lxyz (cdr (assoc 11  ept)))
  52.     (setq xx (car lxyz))
  53.     (setq yy (cadr lxyz))
  54.     (setq xmid_ymax (list xx yy))
  55.    
  56.    
  57.     (setq slist (cons xmid_ymax slist))
  58.         (setq i (1+ i))
  59.   )  
  60. ;;;关键就是这里了,排序,1e-6为容差,意思是1乘以10的负6次方。你可以自己改  
  61. ;;(setq tmp_slist (dh_zhy_sort_pt slist 1e-6))
  62.   (setq tmp_slist (dh_zhy_sort_pt slist 3))
  63.   (foreach insertp_mid tmp_slist
  64.     ;;(setq insertp_move (pmove insertp_mid 0 wz_insertp_move_down))   ;;;最后一位为向下移动距离
  65.                
  66. (cond
  67.     (  (< n1 10)
  68.      (setq wz_n  (strcat "00" (itoa n1)))
  69.                 )
  70.     ( (< 9 n1 100)
  71.            
  72.                                 (setq wz_n  (strcat "0" (itoa n1)))
  73.     )
  74.     ( (> n1 99)
  75.            
  76.                                 (setq wz_n (itoa n1))         
  77.     )
  78. )

  79. ;;;;;;;;;;
  80. ;(princ insertp_mid   )
  81. ;(setq insertp_mid_tt (list 100 300))
  82. ;(princ insertp_mid_tt   )
  83.    ;(entmake (list '(0 . "TEXT") (cons 1 "me1") (cons 7  "仿宋体") (cons 11 insertp_mid_tt) (cons 10 insertp_mid_tt)(cons 40 0.5)(cons 41 0.8)(cons 71 1)(cons 72 1)(cons 73 1)(cons 8 "jj")))

  84.    ;;;;;;;;;;;;;            
  85.                
  86.           (setq wz (strcat dh_n wz_n))          ;;;  
  87. ;;;就是要如何才能更改这个坐标点对应的文字呢?
  88. ;;直接生成文字可能还更容易……
  89. ;;(setq P_center_fz_nn_d1 (list 3 5))

  90. ;;(entmake (list '(0 . "TEXT") (cons 1 wz) (cons 7  "仿宋体") (cons 11 insertp_mid)(cons 10 insertp_mid) (cons 40 0.5)(cons 41 0.8)(cons 71 1)(cons 72 1)(cons 73 1)(cons 8 "jj")))
  91. (command ".style" "仿宋体" "仿宋_GB2312" wz_dx 0.8 0 "" "")
  92. (command ".text" "j" "bc" insertp_mid 0 wz)
  93.    (setq n1 (+ n1 1))
  94.   )
  95.   
  96.   
  97.   (command "erase" ss "")

  98.   (setq ss1 (ssget "x" '((0 . "text")(8 . "JMD_zd01"))))
  99.   
  100. (command "putp" "c" "302002"  ss1 "")
  101. (command "layer" "s" "0" "")
  102.   )







  103. ;;;;取得点集行数,将每行的y坐标列表,lst为点坐标表,rc为容差
  104. (defun y_lst (lst rc / it lst2)
  105.   (while (setq lst2 (cons (setq it (cadr (car lst))) lst2)
  106.                lst  (vl-remove-if '(lambda (x) (equal it (cadr x) rc)) lst)
  107.          )
  108.   )
  109.   (vl-sort lst2 (function (lambda (e1 e2) (> e1 e2))))
  110. )
  111. ;;;将点集按从上到下,从左到右的顺序排序。pt_lst为点坐标表,rc为容差
  112. (defun dh_zhy_sort_pt (pt_lst rc /        pt_y lst1 pt_lst_new n1        n2 m1 m2 pt_y_a        pt_lst_a lst2)
  113.   (setq pt_y (y_lst pt_lst rc))
  114.   (setq pt_lst_new '())
  115.   (setq lst1 '())
  116.   (setq m1 0)
  117.   (setq n1 (length pt_y))
  118.   (setq n2 (length pt_lst))
  119.   (while (/= m1 n1)
  120.     (setq pt_y_a (nth m1 pt_y))
  121.     (setq m2 0)
  122.     (while (/= m2 n2)
  123.       (setq pt_lst_a (nth m2 pt_lst))
  124.       (if (equal pt_y_a (cadr pt_lst_a) rc)
  125.         (setq lst1 (cons pt_lst_a lst1))
  126.       )
  127.       (setq m2 (1+ m2))
  128.     )
  129.     (if        (/= (length lst1) 1)
  130.       (setq lst1 (vl-sort lst1
  131.                           (function (lambda (e1 e2) (< (car e1) (car e2))))
  132.                  )
  133.       )
  134.     )
  135.     (setq pt_lst_new (cons lst1 pt_lst_new))
  136.     (setq lst1 '())
  137.     (setq m1 (1+ m1))
  138.   )
  139.   (setq pt_lst_new (reverse pt_lst_new))
  140.   (setq n1 (length pt_lst_new))
  141.   (setq m1 0)
  142.   (setq lst2 '())
  143.   (while (/= m1 n1)
  144.     (setq lst1 (nth m1 pt_lst_new))
  145.     (setq n2 (length lst1))
  146.     (setq m2 0)
  147.     (while (/= m2 n2)
  148.       (setq lst (nth m2 lst1))
  149.       (setq lst2 (cons lst lst2))
  150.       (setq m2 (1+ m2))
  151.     )
  152.     (setq m1 (1+ m1))
  153.   )
  154.   (reverse lst2)
  155. )

本帖子中包含更多资源

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

x
发表于 2013-9-8 19:13 | 显示全部楼层
顶一下
发表于 2013-11-27 21:30 | 显示全部楼层
顶一下只是数字递增么
发表于 2013-12-22 19:24 | 显示全部楼层
上面代码和我用VBA写的编制页码的程序是相似的,一个是VBA,一个是LISP。谢谢楼主分享
发表于 2017-8-22 12:52 | 显示全部楼层
这个搞好了吗,能发个源程序给我不,我的邮箱是yxl33168@163.com 谢谢你
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-26 01:23 , Processed in 0.463271 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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