明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1848|回复: 4

[基础] 批选矩形,在上面一条边中点加入文字,有点小问题未完成请高手赐教

[复制链接]
发表于 2011-7-10 01:46:14 | 显示全部楼层 |阅读模式
本帖最后由 zhb236623 于 2011-7-10 22:13 编辑





  1. (defun c:za()
  2. (VL-LOAD-COM)
  3. (setq oldcmd (getvar "cmdecho"))
  4. (setvar "cmdecho" 0)
  5. (setq oldblip (getvar "blipmode"))
  6. (setvar "blipmode" 0)
  7. (setq oldsnap (getvar "osmode"))
  8. (setvar "osmode" 0)
  9. (if (not (setq n1 (getint "\n请输入尾数起始顺序号 <1>: ")))
  10.     (setq n1 1)
  11. )

  12. (if (= (tblobjname "layer" "zhb地号图层") nil)
  13. (progn
  14.   (princ "图层zhb地号图层不存在,新建图层zhb地号图层完成,导入数据将存放在zhb地号图层")
  15.   (command ".-layer" "n" "zhb地号图层" "s" "zhb地号图层"  "c" "红色" "" "")
  16.   
  17. )
  18. (progn
  19. (command ".-layer" "s" "zhb地号图层" "c" "红色" "" "")
  20.   (princ "zhb地号图层已存在,导入数据将存放在zhb地号图层,完成导入")
  21. )
  22. )

  23. (command ".style" "仿宋体" "仿宋_GB2312" 0.6 1 0 "" "")

  24. (setq slist nil)
  25. (setq i 0)
  26. (setq ss (ssget '((0 . "LWPOLYLINE"))))
  27. ;; 求矩形上面一条边的中点坐标
  28. (repeat (sslength ss)
  29. (setq en (ssname ss i))
  30. ;(setq en (entget ssn))
  31. (vla-getboundingbox (vlax-ename->vla-object en) 'minpoint 'maxpoint)
  32. (setq pmax (vlax-safearray->list maxpoint)
  33.         pmin (vlax-safearray->list minpoint)
  34.   )
  35. (setq xmin (car pmin))
  36. (setq xmax (car pmax))
  37. (setq ymin (cadr pmin))
  38. (setq ymax (cadr pmax))
  39. (setq xmid ( / ( + xmin xmax) 2))
  40. ;;(setq ymid ( / ( + ymin ymax) 2))
  41. (setq xmid_ymax (list xmid ymax))
  42. (setq slist  (cons xmid_ymax slist))
  43. (setq i (1+ i))
  44. )
  45. (setq tmp_slist (vl-sort slist '(lambda(x1 x2)(< (car x1) (car x2)))));表按x从小到大排序
  46. ;(setq last_slist (vl-sort tmp_slist '(lambda(x1 x2)(> (cadr x1) (cadr x2)))));表按y从大到小排序
  47. ;;这里有问题,不知道要怎么写。
  48. (foreach insertp_mid tmp_slist

  49. (setq insertp_move (pmove insertp_mid 0 -2))
  50. (setq wz (strcat  "3-50-411-" (itoa n1)))
  51. (command ".text" "j" "mc" insertp_move 0  wz)
  52. ;(command ".text" "j" "mc" insertp_move 0.6 0  wz)
  53. (setq n1   (+ n1 1))
  54. )
  55. (setvar "cmdecho" oldcmd)
  56. (setvar "blipmode" oldblip)
  57. (setvar "osmode" oldsnap)
  58. (princ)
  59. )


  60. (defun pmove(point_xy px py);点位,X Y Z
  61.     (setq point_x(car point_xy))
  62.     (setq point_y(cadr point_xy))
  63.     (list (+ point_x  px)(+ point_y py))
  64. )
其实作业中同一行的矩形没有上下差别那么大,只上下波动很小的距离。这里有点夸大。想要的效果如图中所示。程序不能实现,望高手指教。如果实在不行,我可以按一行选,只要对X坐标进行排序就可以了。一行一行加。

本帖子中包含更多资源

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

x
发表于 2011-7-10 08:59:17 | 显示全部楼层
一个 ZigZag 排序
sorting a list of coordinates:
http://forums.autodesk.com/t5/Vi ... dinates/td-p/904181
发表于 2011-7-12 13:59:12 | 显示全部楼层

  1. ;;;;取得点集行数,将每行的y坐标列表,lst为点坐标表,rc为容差
  2. (defun y_lst (lst rc / it lst2)
  3.   (while (setq lst2 (cons (setq it (cadr (car lst))) lst2)
  4.                lst  (vl-remove-if '(lambda (x) (equal it (cadr x) rc)) lst)
  5.          )
  6.   )
  7.   (vl-sort lst2 (function (lambda (e1 e2) (> e1 e2))))
  8. )
  9. ;;;将点集按从上到下,从左到右的顺序排序。pt_lst为点坐标表,rc为容差
  10. (defun zhy_sort_pt (pt_lst rc /        pt_y lst1 pt_lst_new n1        n2 m1 m2 pt_y_a        pt_lst_a lst2)
  11.   (setq pt_y (y_lst pt_lst rc))
  12.   (setq pt_lst_new '())
  13.   (setq lst1 '())
  14.   (setq m1 0)
  15.   (setq n1 (length pt_y))
  16.   (setq n2 (length pt_lst))
  17.   (while (/= m1 n1)
  18.     (setq pt_y_a (nth m1 pt_y))
  19.     (setq m2 0)
  20.     (while (/= m2 n2)
  21.       (setq pt_lst_a (nth m2 pt_lst))
  22.       (if (equal pt_y_a (cadr pt_lst_a) rc)
  23.         (setq lst1 (cons pt_lst_a lst1))
  24.       )
  25.       (setq m2 (1+ m2))
  26.     )
  27.     (if        (/= (length lst1) 1)
  28.       (setq lst1 (vl-sort lst1
  29.                           (function (lambda (e1 e2) (< (car e1) (car e2))))
  30.                  )
  31.       )
  32.     )
  33.     (setq pt_lst_new (cons lst1 pt_lst_new))
  34.     (setq lst1 '())
  35.     (setq m1 (1+ m1))
  36.   )
  37.   (setq pt_lst_new (reverse pt_lst_new))
  38.   (setq n1 (length pt_lst_new))
  39.   (setq m1 0)
  40.   (setq lst2 '())
  41.   (while (/= m1 n1)
  42.     (setq lst1 (nth m1 pt_lst_new))
  43.     (setq n2 (length lst1))
  44.     (setq m2 0)
  45.     (while (/= m2 n2)
  46.       (setq lst (nth m2 lst1))
  47.       (setq lst2 (cons lst lst2))
  48.       (setq m2 (1+ m2))
  49.     )
  50.     (setq m1 (1+ m1))
  51.   )
  52.   (reverse lst2)
  53. )

  54. (defun c:zzaa ()
  55.   (VL-LOAD-COM)
  56.   (setq oldcmd (getvar "cmdecho"))
  57.   (setvar "cmdecho" 0)
  58.   (setq oldblip (getvar "blipmode"))
  59.   (setvar "blipmode" 0)
  60.   (setq oldsnap (getvar "osmode"))
  61.   (setvar "osmode" 0)
  62.   (if (not (setq n1 (getint "\n请输入尾数起始顺序号 <1>: ")))
  63.     (setq n1 1)
  64.   )
  65.   (if (= (tblobjname "layer" "zhb地号图层") nil)
  66.     (progn (princ
  67.              "图层zhb地号图层不存在,新建图层zhb地号图层完成,导入数据将存放在zhb地号图层"
  68.            )
  69.            (command ".-layer" "n" "zhb地号图层"        "s" "zhb地号图层" "c" 1        "" ""
  70.                    )
  71.     )
  72.     (progn (command ".-layer" "s" "zhb地号图层" "c" 1 "" "")
  73.            (princ
  74.              "zhb地号图层已存在,导入数据将存放在zhb地号图层,完成导入"
  75.            )
  76.     )
  77.   )

  78.   
  79. ;;;系统的问题我的机子中没有“仿宋_GB2312”字体所以我改了,你可以再改回来
  80. ;;;(command ".style" "仿宋体" "仿宋_GB2312" 0.6 1 0 "" "")
  81.   
  82.   (command ".style" "仿宋体" "仿宋" 600 1 0 "" "")


  83.   
  84.   (setq slist nil)
  85.   (setq i 0)
  86.   (setq ss (ssget '((0 . "LWPOLYLINE"))))
  87.   ;; 求矩形上面一条边的中点坐标
  88.   (repeat (sslength ss)
  89.     (setq en (ssname ss i))                                    ;(setq en (entget ssn))
  90.     (vla-getboundingbox        (vlax-ename->vla-object en)
  91.                         'minpoint
  92.                         'maxpoint
  93.     )
  94.     (setq pmax (vlax-safearray->list maxpoint)
  95.           pmin (vlax-safearray->list minpoint)
  96.     )
  97.     (setq xmin (car pmin))
  98.     (setq xmax (car pmax))
  99.     (setq ymin (cadr pmin))
  100.     (setq ymax (cadr pmax))
  101.     (setq xmid (/ (+ xmin xmax) 2))
  102.     ;;(setq ymid ( / ( + ymin ymax) 2))
  103.     (setq xmid_ymax (list xmid ymax))
  104.     (setq slist (cons xmid_ymax slist))
  105.     (setq i (1+ i))
  106.   )  
  107. ;;;关键就是这里了,排序,1e-6为容差,意思是1乘以10的负6次方。你可以自己改  
  108. (setq tmp_slist (zhy_sort_pt slist 1e-6))
  109.   
  110.   (foreach insertp_mid tmp_slist
  111.     (setq insertp_move (pmove insertp_mid 0 -2))
  112.     (setq wz (strcat "3-50-411-" (itoa n1)))
  113.     (command ".text" "j" "mc" insertp_move 0 wz)            ;(command ".text" "j" "mc" insertp_move 0.6 0  wz)
  114.     (setq n1 (+ n1 1))
  115.   )
  116.   (setvar "cmdecho" oldcmd)
  117.   (setvar "blipmode" oldblip)
  118.   (setvar "osmode" oldsnap)
  119.   (princ)
  120. )

  121. (defun pmove (point_xy px py)                                    ;点位,X Y Z
  122.   (setq point_x (car point_xy))
  123.   (setq point_y (cadr point_xy))
  124.   (list (+ point_x px) (+ point_y py))
  125. )
 楼主| 发表于 2011-7-12 16:38:26 | 显示全部楼层
谢谢Andyhon ,看了半天,对我有点难度;zhynt 高人啊。设置好容差,程序能够达到要求,很不错。
发表于 2012-5-15 15:24:48 | 显示全部楼层
这个怎么把坐标点输出到excel中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-7-23 09:03 , Processed in 0.186185 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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