找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2357|回复: 4

[研讨] 如何得到离指定点最近的且包含这点的封闭曲线

[复制链接]

已领礼包: 8121个

财富等级: 富甲天下

发表于 2013-5-8 10:04:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×

今天在autodesk讨论组中看到一个话题:
大意如下:给出一个点,如何得到离该点最近的且包含这点的封闭曲线。(circle,polyline....),如果有,返回该曲线图元名,如果不存在包含这点的封闭曲线,则返回nil值。
I am familiar with some methods to determine if a point is inside a given polyline... but I am looking to find... or create...a function to select a closed polyline given a point which is inside its space... if the point is not within a closed polyline then returns nil.
Gilles Chanteau给出了一个lisp程序,但并不很准确,有时会出错。

如果对这个题目有兴趣的话,不妨讨论一下.

请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:SelPline[1].lsp 
下载次数:13  文件大小:3.71 KB 
下载权限: 不限 以上  [免费赚D豆]



论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2013-5-8 10:05:52 | 显示全部楼层
本帖最后由 Highflybird 于 2013-5-8 10:23 编辑

[pcode=lisp,true]
(defun C:test (/ curlst point curve closep dist ent return)
  (vl-load-com)
  (setq curlst nil)
  (initget 1)
  (setq point (getpoint "\nPlease enter a point:"))
  (vlax-for n (vla-get-Modelspace
  (vla-get-activeDocument (vlax-get-acad-object))
       )
    (if (or (vlax-property-available-p n 'closed)
     (= (vla-get-objectname n) "AcDbCircle")
     (and (= (vla-get-objectname n) "AcDbEllipse")
   (= (vla-get-startangle n) 0)
   (= (vla-get-endangle n) (* 2 pi))
     )
)
      (progn
(setq curve (vlax-vla-object->ename n))
(if (dos_isinsidecurve curve point)
   (setq closeP (vlax-curve-getClosestPointTo n point)
  dist   (distance point closeP)
  curlst (cons (cons curve dist) curlst)
   )
)
      )
    )
  )
  (if curlst
    (setq curlst (vl-sort curlst '(lambda (e1 e2) (< (cdr e1) (cdr e2))))
   ent  (caar curlst)
   return (sssetfirst nil (ssadd ent))
    )
  )
)
[/pcode]这里用了一个函数dos_isinsidecurve 是doslib7.5版本才有的,只能在2007以上运行。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-8 10:47:47 | 显示全部楼层
可以用纯Lisp试试
1 用 vlax-curve-getclosestpointto 封闭曲线得到点
  a: Circle Ellipse 可以用公式判断
  b: Pline  可以增加该点为顶点,判断两个面积的大小确定关系
  c: 封闭Spline,没有想好
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-5-8 10:59:20 | 显示全部楼层
本帖最后由 牢固 于 2013-5-8 11:04 编辑

[pcode=lisp,true];;测试
(defun c:tt ()
  (command "zoom" "e")
  (setq pt (getpoint "\n指定一点:"))
  (setq e (GETCLOSESTPOINTTOCurve pt))
  (if e
    (progn
      (redraw e 3)
      (grdraw pt (trans (vlax-curve-getclosestpointto e (trans pt 1 0)) 0 1) 1)
      )
    )
  (princ)
  )
;;寻找最近的封闭曲线,参数pt = UCS Point ,返回 en By Gu_xl 2013.05.08
(defun GETCLOSESTPOINTTOCurve (PT / PC VH SC VW PMAX SS D MIND)
  (setq pc (getvar "viewctr")
                 vh (getvar "viewsize")
                 sc (getvar "screensize")
                vw (* vh (/ (car sc) (cadr sc)))
                pmax (list (+ (car pc) (* 0.5 vw)) (+ (cadr pc) (* 0.5 vh)))
           )
  (setq ss (ssget "_F"
                  (list pt pmax)
                  (list '(-4 . "<or")
                        '(0 . "circle,*polyline,spline")
                        '(-4 . "<and")
                        '(0 . "ellipse")
                        (cons 41 0)
                        (cons 42 (* pi 2))
                        '(-4 . "and>")
                        '(-4 . "or>")
                        )
                  )
        pt (trans pt 1 0)
        )
  (if ss
    (progn
      (setq ss
             (mapcar
               'cadr
             (vl-remove-if
               '(lambda (x) (= 0 (rem (length (cdddr x)) 2)))
               (ssnamex ss)
               )
               )
            )
    (foreach e ss
      (if (vlax-curve-isClosed e)
        (progn
          (setq d (distance pt (vlax-curve-getclosestpointto e pt)))
          (if (not mind)
            (setq mind (cons d e))
            (if (< d (car mind))
                (setq mind (cons d e))
                )
            )
          )
        )
      )
    )
    )
  (cdr mind)
  )
[/pcode]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-5-8 15:40:46 | 显示全部楼层

好想法,Curve有FirstDeriv 和 SencondDetiv 用这两个加 Closestpointto 是不是更能精确判断点在Curve 的内外,未经测试,随便说说
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-19 09:32 , Processed in 0.434544 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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