明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1673|回复: 3

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

[复制链接]
发表于 2007-4-2 17:34 | 显示全部楼层 |阅读模式

今天在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程序,但并不很准确,有时会出错。

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

本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2007-4-3 10:26 | 显示全部楼层

我有一个笨的思路,但只对当前屏幕有效(总不能先zoom\e吧)

1.BOUNDARY 命令通过拾取点 pt 生成面域

2.加上一个判断,获取刚产生的对象的选择集 ss 。如果ss不存在,说明没有封闭区域。

  如果ss存在,取得面积最大的一个对象 en 。然后得到en的范围 bou,

  (apply 'ssget (cons "_c" bou))得到选择集 ss2.从ss2中获取和 en 面积相等[判断方法

  (equal en x 1e-6)]的对象。

3.删除ss

发表于 2007-4-3 11:42 | 显示全部楼层

 

可以这样做:

1、先选择所有封闭多义线、圆、椭圆的所有实体

2、逐一判断点是否在实体内(此函数明径上有),对所有包含此点的实体比较得到面积最小者(不知版主是否以面积最小作为判断规则来返回)。

下面我转发

本帖子中包含更多资源

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

x
 楼主| 发表于 2007-4-4 15:17 | 显示全部楼层
  1. (defun C:test (/ curlst point curve closep dist ent return)
  2.   (vl-load-com)
  3.   (setq curlst nil)
  4.   (initget 1)
  5.   (setq point (getpoint "\nPlease enter a point:"))
  6.   (vlax-for n (vla-get-Modelspace
  7.   (vla-get-activeDocument (vlax-get-acad-object))
  8.        )
  9.     (if (or (vlax-property-available-p n 'closed)
  10.      (= (vla-get-objectname n) "AcDbCircle")
  11.      (and (= (vla-get-objectname n) "AcDbEllipse")
  12.    (= (vla-get-startangle n) 0)
  13.    (= (vla-get-endangle n) (* 2 pi))
  14.      )
  15. )
  16.       (progn
  17. (setq curve (vlax-vla-object->ename n))
  18. (if (dos_isinsidecurve curve point)
  19.    (setq closeP (vlax-curve-getClosestPointTo n point)
  20.   dist   (distance point closeP)
  21.   curlst (cons (cons curve dist) curlst)
  22.    )
  23. )
  24.       )
  25.     )
  26.   )
  27.   (if curlst
  28.     (setq curlst (vl-sort curlst '(lambda (e1 e2) (< (cdr e1) (cdr e2))))
  29.    ent  (caar curlst)
  30.    return (sssetfirst nil (ssadd ent))
  31.     )
  32.   )
  33. )
这里用了一个函数dos_isinsidecurve 是doslib7.5版本才有的,只能在2007以上运行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-19 11:11 , Processed in 0.169227 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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