明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3483|回复: 18

《悬赏3明经币》求“搜索多边形内的线”的程序

  [复制链接]
发表于 2011-4-12 18:54:40 | 显示全部楼层 |阅读模式
3明经币
本帖最后由 chenjian2159 于 2011-4-13 14:52 编辑

根据白色的多边形自动搜索里面红色的线,返回搜索到线的选择集,白色多边形里面可能有多条线,谢谢朋友们参与!!!
附件: 您需要 登录 才可以下载或查看,没有账号?注册

最佳答案

查看完整内容

有时间弄了下下
发表于 2011-4-12 18:54:41 | 显示全部楼层
本帖最后由 gufeng 于 2011-6-23 13:52 编辑

有时间弄了下下

  1. ;_搜索多边形内的线 TT
  2. ;_计算面积    TT1
  3. (defun c:TT (/ ENAME NEWENTLAST OLDENTLAST PT I PLIST EN OCMDECHO)
  4. (while (setq ename (car (entsel "\n选择多边形:")))
  5. (AT_Li:20110623)
  6. (if  $SS
  7. (progn
  8. (setq i -1)
  9. (while (setq en (ssname $SS (setq i (1+ i))))
  10. (redraw en 4)
  11. )
  12. )
  13. ) ;_恢复原选择集的亮度
  14. (redraw ename 3)
  15. (setq pt (AT_L:GetPlInPt (AT_S:GetEnameBox ename))) ;_得到多边形内一点
  16. (setq ocmdecho (getvar "cmdecho"))
  17. (setvar "cmdecho" 0)
  18. (command "_undo" "mark")
  19. (setq oldentlast (entlast)) ;_最后的图元名
  20. (command "-boundary" "a" "b" "n" ename "" "" pt "")
  21. (setq newentlast (entlast)) ;_Boundary后
  22. (if  (eq oldentlast newentlast)
  23. (progn
  24. (setq $SS nil)
  25. (princ "\n\t生成边界错误,搜索退出")
  26. )
  27. (progn
  28. (setq plist (AT_L:Plist newentlast))
  29. (if (> (length plist) 2)
  30. (progn
  31. (command "_zoom"
  32. (car (AT_S:GetEnameBox ename))
  33. (cadr (AT_S:GetEnameBox ename))
  34. )
  35. (setq $SS (ssget "wp" plist '((0 . "LWPOLYLINE"))))
  36. )
  37. (princ "\n\t坐标少于两个,搜索退出")
  38. )
  39. )
  40. )
  41. (command "_undo" "back")
  42. (setvar "cmdecho" ocmdecho)
  43. (redraw ename 4)
  44. (if  $SS
  45. (progn
  46. (setq i -1)
  47. (while (setq ename (ssname $SS (setq i (1+ i))))
  48. (redraw ename 3)
  49. )
  50. (princ
  51. (strcat "\n\t图元数量: " (itoa (sslength $SS)) " 已亮显")
  52. )
  53. )
  54. )
  55. )
  56. (princ)
  57. )


  58. (defun c:TT1 (/  ENAME ENAMELST ERR_5 II  ISJXELST MJ MJ1  MJ2 NEWENTLAST OCMDECHO  OLDENTLAST PLIST PT SS SS_WP WP_ENAME WS JD)
  59. (setq ws nil) ;_如果为t则先取位再加减  反之则面积先加减最后取位
  60. (setq jd 2) ;_面积小数位
  61. (setq ss (ssget '((0 . "LWPOLYLINE"))))
  62. (if ss
  63. (progn
  64. (AT_Li:20110623)
  65. (setq enamelst (AT_S:ToEnameMjLst ss)) ;_图元与面积表
  66. (setq enamelst (AT_L:Sort_lst enamelst)) ;_按面积从大到小排序
  67. (setq mj 0) ;_总面积
  68. (setq err_5 '()) ;_记录无法计算的图元句柄列表
  69. (setq isjxelst '()) ;_已经计算过面积的图元列表
  70. (setq ocmdecho (getvar "cmdecho"))
  71. (setvar "cmdecho" 0)
  72. (foreach i enamelst
  73. (setq ename (last i)) ;_图元名
  74. (if (not (member ename isjxelst))
  75. (progn
  76. (setq pt (AT_L:GetPlInPt (AT_S:GetEnameBox ename))) ;_多边形内一点
  77. (command "_undo" "mark")
  78. (setq oldentlast (entlast)) ;_最后的图元名
  79. (command "-boundary" "a" "b" "n" ename "" "" pt "")
  80. (setq newentlast (entlast)) ;_Boundary后
  81. (if  (eq oldentlast newentlast)
  82. (progn
  83. (setq err_5 (cons (cdr (assoc 5 (entget ename))) err_5)) ;_错误
  84. )
  85. (progn
  86. (setq mj1 (vlax-curve-getArea newentlast)) ;_重新计算面积
  87. (if ws
  88. (setq mj1 (AT_G:SsWr mj1 jd))
  89. )
  90. (setq plist (AT_L:Plist newentlast))
  91. (if (> (length plist) 2)
  92. (progn
  93. (command "_zoom"
  94. (car (AT_S:GetEnameBox ename))
  95. (cadr (AT_S:GetEnameBox ename))
  96. )
  97. (setq ss_wp (ssget "wp" plist '((0 . "LWPOLYLINE"))))
  98. (if  ss_wp
  99. (progn
  100. (setq ii -1)
  101. (while (setq wp_ename (ssname ss_wp (setq ii (1+ ii))))
  102. (setq isjxelst (cons wp_ename isjxelst))
  103. ;_计算内多边形面积 Start
  104. (setq pt (AT_L:GetPlInPt (AT_S:GetEnameBox wp_ename)))
  105. (command "_undo" "mark")
  106. (setq newentlast (entlast))
  107. (command "-boundary" "a" "b" "n" ename "" "" pt "")
  108. (setq oldentlast (entlast))
  109. (if (eq oldentlast newentlast)
  110. (setq mj2 (vlax-curve-getArea wp_ename)) ;_Boundary无法生成直接使用线面积
  111. (setq mj2 (vlax-curve-getArea newentlast)) ;_使用Boundary生成的线面积
  112. )
  113. (if ws
  114. (setq mj2 (AT_G:SsWr mj2 jd))
  115. )
  116. (command "_undo" "back")
  117. ;_计算内多边形面积 End
  118. (setq mj1 (- mj1 (vlax-curve-getArea wp_ename)))
  119. )
  120. )
  121. )
  122. (setq mj (+ mj mj1)) ;_加入到总面积
  123. )
  124. (setq err_5 (cons (cdr (assoc 5 (entget ename))) err_5)) ;_错误
  125. )
  126. )
  127. )
  128. (command "_undo" "back")
  129. )
  130. )
  131. )
  132. (setvar "cmdecho" ocmdecho)
  133. (princ (strcat "\n总面积是: " (rtos mj 2 jd)))
  134. (if err_5
  135. (progn
  136. (princ "\n无法计算的图元句柄表:")
  137. (princ err_5)
  138. )
  139. )
  140. )
  141. (princ "\n没有选择计算的对象")
  142. )
  143. (princ)
  144. )


  145. ;_使用到的相关函数
  146. (defun AT_Li:20110623 ()
  147. (vl-load-com)
  148. ;_四舍五入 (AT_G:SsWr NUM JD)
  149. (defun AT_G:SsWr (NUM JD / RETURN)
  150. (read (rtos num 2 jd))
  151. )
  152. ;_返回多段线的坐标表 (AT_L:Plist ENAME)
  153. (defun AT_L:Plist (ENAME / ELEV EN ENTL FLAG PT VLIST)
  154. (defun LI_item (n alist)
  155. (cdr (assoc n alist))
  156. )
  157. (setq
  158. vlist '()
  159. entl  (entget ename)
  160. en    (LI_item 0 entl)
  161. )
  162. (cond
  163. ((= en "LWPOLYLINE")
  164. (setq
  165. vlist '()
  166. Elev  (LI_item 38 entl)
  167. )
  168. (foreach  pt entl
  169. (if (= (car pt) 10)
  170. (setq vlist (cons (list (cadr pt) (caddr pt) Elev) vlist))
  171. )
  172. )
  173. (setq vlist (reverse vlist))
  174. )
  175. ((= en "SPLINE")
  176. (setq vlist (LI_mitem 11 entl))
  177. (if (not vlist)
  178. (setq vlist (LI_mitem 10 entl))
  179. (setq vlist (reverse (reverse vlist)))
  180. )
  181. )
  182. ((= en "POLYLINE")
  183. (setq
  184. ename (entnext ename)
  185. entl  (entget ename)
  186. en    (LI_item 0 entl)
  187. vlist '()
  188. )
  189. (while (= en "VERTEX")
  190. (setq flag (LI_item 70 entl))
  191. (if (and
  192. (zerop (logand flag 1))
  193. (zerop (logand flag 2))
  194. (zerop (logand flag 8))
  195. (/= flag 128)
  196. )
  197. (setq
  198. pt     (LI_item 10 entl)
  199. vlist (cons pt vlist)
  200. )
  201. )
  202. (setq
  203. ename (entnext ename)
  204. entl   (entget ename)
  205. en   (LI_item 0 entl)
  206. )
  207. )
  208. (setq vlist (reverse vlist))
  209. )
  210. ((= en "LINE")
  211. (setq vlist (list (LI_item 10 entl) (LI_item 11 entl)))
  212. )
  213. ((= en "3DFACE")
  214. (setq vlist (list
  215. (LI_item 10 entl)
  216. (LI_item 11 entl)
  217. (LI_item 12 entl)
  218. (LI_item 13 entl)
  219. )
  220. )
  221. )
  222. )
  223. vlist
  224. )

  225. ;_获得 单个图元 的最大包围框   (AT_S:GetEnameBox ENAME)
  226. (defun AT_S:GetEnameBox (ENAME / OBJ MINPOINT MAXPOINT)
  227. (setq obj (vlax-ename->vla-object ename))
  228. (vla-GetBoundingBox obj 'minpoint 'maxpoint) ;_取得包容图元的最大点和最小点
  229. (setq minpoint (vlax-safearray->list minpoint)) ;_把变体数据转化为表
  230. (setq maxpoint (vlax-safearray->list maxpoint)) ;_把变体数据转化为表
  231. (setq obj (list minpoint maxpoint))
  232. )
  233. ;_获取多边形内一点 部分适用 (AT_L:GetPlInPt PLIST)
  234. (defun AT_L:GetPlInPt  (PLIST / P1 P2 PT)
  235. (setq p1 (car plist)
  236. p2 (cadr plist)
  237. )
  238. (setq p1 (list (car p1) (cadr p1))
  239. p2 (list (car p2) (cadr p2))
  240. )
  241. (setq pt (polar p1 (angle p1 p2) (/ (distance p1 p2) 2)))
  242. pt
  243. )
  244. ;_由选择集返回图元与面积表   (AT_S:ToEnameMjLst SS)
  245. (defun AT_S:ToEnameMjLst (SS / I E LST MJ)
  246. (setq i -1)
  247. (while (setq e (ssname ss (setq i (1+ i))))
  248. (setq mj (vlax-curve-getArea e))
  249. (setq lst (cons (list mj e) lst))
  250. )
  251. (reverse lst)
  252. )
  253. ;_由选择集返回图元表   (AT_S:ToEnameLst SS)
  254. (defun AT_S:ToEnameLst (SS / I E LST)
  255. (setq i -1)
  256. (while (setq e (ssname ss (setq i (1+ i))))
  257. (setq lst (cons e lst))
  258. )
  259. (reverse lst)
  260. )
  261. ;_表排序 (AT_L:Sort_lst LST)
  262. (defun AT_L:Sort_lst (LST)
  263. (vl-sort lst
  264. (function (lambda (e1 e2)
  265. (> (car e1) (car e2))
  266. )
  267. )
  268. )
  269. )
  270. )

回复

使用道具 举报

发表于 2011-4-12 21:53:50 | 显示全部楼层
如何取得 '白色的多边形'  只白色?
里面的一定是红色的线?

图面可还存在其他图元会影响自动搜索

单以所附文件是很容易处理,
须考量的在此之外的可能情况....
回复

使用道具 举报

 楼主| 发表于 2011-4-13 12:28:34 | 显示全部楼层
回复 Andyhon 的帖子

你好朋友,我说的“白色的多边形和红色的多边形”是自己改的,是想表达的清楚点,实际上工作中,颜色是没有分出来的,都是同一种颜色。谢谢你!
回复

使用道具 举报

发表于 2011-4-13 13:19:45 | 显示全部楼层
....
须考量的在此之外的可能情况....
可否上传数个具代表性的图样 (*.Dwg)

还是说就这么单纯而已
回复

使用道具 举报

 楼主| 发表于 2011-4-13 14:53:22 | 显示全部楼层
顶!!!!
回复

使用道具 举报

 楼主| 发表于 2011-4-13 16:48:16 | 显示全部楼层
回复 Andyhon 的帖子

朋友,已经上传图样,谢谢!
回复

使用道具 举报

发表于 2011-4-13 17:00:09 | 显示全部楼层
这个不合 AutoCAD 求面积的规范
未曾涉及过相仿于所提样图的程序 ....

或许第三方插有这样的程序
回复

使用道具 举报

发表于 2011-5-9 23:15:10 | 显示全部楼层
VLX格式的算么?
回复

使用道具 举报

发表于 2011-5-9 23:15:42 | 显示全部楼层
没有源码的可以么?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 09:22 , Processed in 0.173744 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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