明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2186|回复: 7

[提问] 关于点与多个闭合多段线的关系

[复制链接]
发表于 2016-2-21 09:44:58 | 显示全部楼层 |阅读模式
  1. ; a way to find a closed polyline by point inside
  2. ;Lee Mac
  3. (defun polyfrominsidepoint ( p / e i r s )
  4.     (if
  5.         (setq i -1 s
  6.             (ssget "_X"
  7.                 (list '(0 . "LWPOLYLINE") '(-4 . "&=") '(70 . 1)
  8.                     (if (= 1 (getvar 'cvport))
  9.                         (cons 410 (getvar 'ctab))
  10.                        '(410 . "Model")
  11.                     )
  12.                 )
  13.             )
  14.         )
  15.         (while (and (null r) (setq e (ssname s (setq i (1+ i)))))
  16.             (if (raycast p (mapcar 'cdr (vl-remove-if-not '(lambda ( x ) (= 10 (car x))) (entget e))))
  17.                 (setq r e)
  18.             )
  19.         )
  20.     )
  21.     r
  22. )
  23. (defun raycast ( p l )
  24.     (= 1
  25.         (logand 1
  26.             (length
  27.                 (vl-remove 'nil
  28.                     (mapcar
  29.                        '(lambda ( a b ) (inters p (mapcar '+ p '(1e8 0.0)) a b))
  30.                         (cons (last l) l)
  31.                         l
  32.                     )
  33.                 )
  34.             )
  35.         )
  36.     )
  37. )
  38. (defun c:SelPolylinebyPoint ( / e p )
  39.     (if (setq p (getpoint "\nSpecify point: "))
  40.         (if (setq e (polyfrominsidepoint p))
  41.             (sssetfirst nil (ssadd e))
  42.             (princ "\nNo polyline found.")
  43.         )
  44.     )
  45.     (princ)
  46. )
以上代码是已知一个点和很多封闭的多段线,快速确定出包含这个点的多段线,但默认选择面积最大那个,而不是最小那个。
即运行结果是选择B,而我想选择A,这要如何实现呢?谢谢!


本帖子中包含更多资源

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

x
发表于 2016-2-21 10:31:00 | 显示全部楼层
开源代码
  1. ;|函数功能,寻找包含pt点的最小封闭多边形
  2.   使用格式,(n5-minpl pt);1,PT是个坐标情况下;如果存在返回图元名,否则nil
  3.   (n5-minpl pt);1,PT是个坐标表情况下;如果存在返回与坐标表对应的图元名表,否则nil|;
  4. (defun n5-minpl(pt / lst nlst)
  5. (cond
  6.   ((/= (type (car pt)) 'LIST)
  7.    (setq lst(mapcar 'cadr(ssnamex (ssget "f" (list pt (list (car pt)(+ 1000000(cadr pt))))))))
  8.    (setq lst (vl-remove-if-not'(lambda(x)(AND(= "LWPOLYLINE"(CDR(ASSOC 0 (ENTGET x))))(MEMBER (CDR(ASSOC 70 (ENTGET X)))(LIST 1 129))))LST))
  9.    (IF LST (SETQ NLST(CAR LST)) (SETQ NLST NIL)))
  10.   ((= (type (car pt)) 'LIST)(FOREACH A PT (SETQ NLST (CONS (N5-MINPL A)NLST))))
  11.         )
  12.    (if (= 'LIST (TYPE NLST))(SETQ NLST(REVERSE nLST)) NLST)
  13.   
  14.   )
发表于 2016-2-21 10:37:01 | 显示全部楼层
当然这个还是存在挺大的缺陷,不过够用了
 楼主| 发表于 2016-2-21 15:00:56 | 显示全部楼层
陈进佳 发表于 2016-2-21 10:31
开源代码

真帅,谢谢!
 楼主| 发表于 2016-2-21 16:08:20 | 显示全部楼层
陈进佳 发表于 2016-2-21 10:37
当然这个还是存在挺大的缺陷,不过够用了

试用了,缺陷还是蛮大的,比如说当闭合多段线不是包含关系的时候就会产生错选。
发表于 2016-2-21 17:53:21 | 显示全部楼层
yhly555 发表于 2016-2-21 16:08
试用了,缺陷还是蛮大的,比如说当闭合多段线不是包含关系的时候就会产生错选。

对,已经做了处理
。不过不想上传了.累
发表于 2016-3-9 11:02:25 | 显示全部楼层
陈进佳 发表于 2016-2-21 17:53
对,已经做了处理
。不过不想上传了.累

大神,上传一下呗,学习一下,正好我现在也在编这个小程序
发表于 2016-3-9 14:47:42 | 显示全部楼层
远方小山 发表于 2016-3-9 11:02
大神,上传一下呗,学习一下,正好我现在也在编这个小程序

不愿找了。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-20 20:50 , Processed in 0.179163 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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