找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3748|回复: 16

老问题

[复制链接]
发表于 2002-1-21 17:56:48 | 显示全部楼层 |阅读模式

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

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

×
如何判断一点在封闭的pline内.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2002-1-22 08:46:04 | 显示全部楼层

请说明您的最终目标...

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

使用道具 举报

发表于 2005-8-13 01:09:34 | 显示全部楼层
如何判断某一点是否在一面域内呢?  问的也是类似的问题。

最终目标应该是用来点取一个区域。 autocad 的 hatch 里就有这样的功能,但也不能保证完全选取区域成功,因此可以看出这个问题不是那么容易解决的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-13 08:28:58 | 显示全部楼层
对这条pline求面域,得到这个实体名,再用ssget命令选通过pt指定点的面域,两者比较,如果相等,就在内,不等,就在外
这只是我的一个想法,没有编过lisp,我想应该是可行的,完全是借用陈伯雄老师的“cad能完全的事就把事推给cad去作”的思想
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-13 09:43:59 | 显示全部楼层
点在PLine以内的话,点与pline线各相邻两点的夹角相加等于2pi
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

发表于 2005-8-13 14:03:27 | 显示全部楼层
请问“面域”是什么autocad实体? 3dface?
我觉得4楼的方法应该是最大限度地利用了autocad的已有功能,很不错。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-13 15:24:53 | 显示全部楼层
常用求法的有
1射线法(过点任意方向的射线(ray or xline)与曲线的交点个数)
2面积法(即region求并集进行比较)
3偏移法(过点offset曲线进行比较)
从稳定性上1最佳,2其次,3不推荐

另外有一种,为点到各端点连线夹角求和,但是仅对直线段pline有效,对复杂一点的曲线无效。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-13 15:53:48 | 显示全部楼层
我刚才试了一下,为什么在ssget行,对面域选择时总是nil啊,为什么总是选不重呢
(defun c:ll ()                                ;if_inter        ()                        ;(pt ename)()
  (setq pt (getpoint "\n请输入一点"))
  (setq ename (entsel))
  (command "region" ename "")
  (setq p_region (entlast))
  (setq pt_cross (ssget "_c" pt pt '((0 . "REGION"))))
(boundp (= p_region pt_cross))
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8156个

财富等级: 富甲天下

发表于 2005-8-13 17:14:19 | 显示全部楼层
Newsgroups: autodesk.autocad.customization
From: "Luis Esquivel" <www.draftteam.com> - Find messages by this author  
Date: Tue, 9 Sep 2003 15:46:37 -0700
Local: Wed, Sep 10 2003 6:46 am  
Subject: Re: John Uhden's @cv_inside function
Reply to Author | Forward | Print | Individual Message | Show original | Report Abuse  

Here is the last update, please let me know if works...:


;;; 3:45 PM 9/9/2003
;;; Luis Esquivel


  1. (defun random  ()
  2.   (setq seed (if seed
  3.         (rem (+ (* seed 15625.7) 0.21137152) 1)
  4.         0.3171943)))


  5. (defun get-xy  (lst_xyz / cont ints)
  6.   (setq cont 0)
  7.   (while (< cont (length lst_xyz))
  8.     (setq ints (append ints
  9.          (list (list (nth cont lst_xyz)
  10.        (nth (1+ cont) lst_xyz)))))
  11.     (setq cont (+ cont 3)))
  12.   ints)


  13. (defun angvec  (vect)
  14.   (cond
  15.     ((equal (car vect) 0 0.0001)
  16.      (if (minusp (cadr vect))
  17.        (* 1.5 pi)
  18.        (/ pi 2)))
  19.     ((equal (car vect) -1 0.0001) pi)
  20.     ((equal (cadr vect) 0 0.0001)
  21.      (if (minusp (car vect))
  22.        pi
  23.        0))
  24.     (T (atan (/ (cadr vect) (car vect))))))


  25. (defun point-inside-polyline
  26.        (vla_poly pt aid-pt pts / vla_line lst_value param result)
  27.   (setq
  28.     result
  29.      (cond
  30.        ;; verifies if the test-point is not on any polyline segment
  31.        ((and (setq param (vlax-curve-getparamatpoint vla_poly pt))
  32.       (eq (type (- param (fix param))) 'real))
  33. nil)
  34.        ;; verifies if the test-point is not a vertex
  35.        ((and (not (vl-position (list (car pt) (cadr pt)) pts))
  36.       (not
  37.         (vl-catch-all-error-p
  38.    (setq lst_value
  39.    (vl-catch-all-apply
  40.      'vlax-safearray->list
  41.      (list (vlax-variant-value
  42.       (vla-intersectwith
  43.         vla_poly
  44.         (setq vla_line
  45.         (vla-addline
  46.           (vla-objectidtoobject
  47.             (vla-get-document
  48.        vla_poly)
  49.             (vla-get-ownerid
  50.        vla_poly))
  51.           (vlax-3d-point pt)
  52.           (vlax-3d-point aid-pt)))
  53.         acextendnone))))))))
  54. ;; verifies if any of the intersection points
  55. ;; is not part of the vertex's
  56. (if (not (vl-some
  57.      (function (lambda (i) (vl-position i pts)))
  58.      (get-xy lst_value)))
  59.    (fix (/ (length lst_value) 3.0))))))


  60.   (vl-catch-all-apply 'vla-delete (list vla_line))


  61.   (if (and (not
  62.       (vl-catch-all-error-p
  63.         (setq lst_value
  64.         (vl-catch-all-apply
  65.    'vlax-safearray->list
  66.    (list (vlax-variant-value
  67.     (vla-intersectwith
  68.       vla_poly
  69.       (setq vla_line
  70.       (vla-addline
  71.         (vla-objectidtoobject
  72.           (vla-get-document
  73.             vla_poly)
  74.           (vla-get-ownerid
  75.             vla_poly))
  76.         (vlax-3d-point pt)
  77.         (vlax-3d-point aid-pt)))
  78.       acextendnone)))))))
  79.     ;; verifies if any of the intersection points
  80.     ;; is not tangent
  81.     (vl-some (function
  82.         (lambda (int)


  83.    (setq vect
  84.           (vlax-curve-getfirstderiv
  85.      vla_poly
  86.      (vlax-curve-getparamatpoint vla_poly int)))
  87.    (equal (angvec vect) (/ pi 2.0) 1.0e-009)))
  88.       (get-xy lst_value)))
  89.     (setq result nil))


  90.   (vl-catch-all-apply 'vla-delete (list vla_line))


  91.   (if (numberp result)
  92.     (not (zerop (rem result 2)))))


  93. (defun C:TEST-LUIS  (/ ent elst pt vla_poly lc uc)
  94.   (if
  95.     (and (setq ent (car (entsel "\nSelect a polyline: ")))
  96.   (eq (cdadr (setq elst (entget ent))) "LWPOLYLINE")
  97.   (eq (vla-get-closed
  98.         (setq vla_poly (vlax-ename->vla-object ent)))
  99.       :vlax-true)
  100.   (setq pt (getpoint "\nTest point: ")))
  101.      (progn
  102.        (vla-getboundingbox vla_poly 'lc 'uc)
  103.        (point-inside-polyline
  104.   vla_poly
  105.   pt


  106.   ;; remove aid-pt setq - was for testing only
  107.   (setq aid-pt (polar pt
  108.         (random)
  109.         (distance (vlax-safearray->list lc)
  110.            (vlax-safearray->list uc))))


  111.   ;; remove pts setq - was for testing only
  112.   (setq pts
  113.   (mapcar
  114.     'cdr
  115.     (vl-remove-if-not
  116.       (function (lambda (item) (eq (car item) 10)))
  117.       elst)))
  118.   ))))
  119. (princ)

  120. ;;; for plain Lisp  ===================================

  121. Newsgroups: autodesk.autocad.customization
  122. From: "Michael Doerr" <mdo...@cebacus.de> - Find messages by this author  
  123. Date: 1999/10/27
  124. Subject: Re: Pts inside a poly
  125. Reply to Author | Forward | Print | Individual Message | Show original | Report Abuse  

  126. Dennis Healey schrieb in Nachricht <38161DED.7C995...@marin.org>...



  127. >In AutoLISP or Visual LISP (R14) are there ways to evaluate which of
  128. >each of thousands of vertices of lines polylines or arches lay within a
  129. >polyline in 2D space?    To be clear, this is different from determining
  130. >if an object is within a select set;  I just want to know if a point is
  131. >within a given boundary.


  132. Hi Dennis,

  133. the code below decides quickly wether a given point is inside a boundary. It
  134. decides by checking the angles to the points of the polyline: You have to
  135. call the function "PunktInPolyLinie" by handing over the point you want to
  136. check ("PruefPunkt") and a list of the points of the polyline
  137. ("PolyPunkteListe").


  138. Hope this helps, Michael


  139. (defun PunktInPolyLinie (PruefPunkt
  140.     PolyPunkteListe
  141.     /
  142.    )
  143.    (if (equal 0.0 (PIPWinkelSumme PruefPunkt PolyPunkteListe) 0.0001)
  144.       nil
  145.       T
  146.    )
  147. )


  148. (defun PIPWinkelSumme (PruefPunkt
  149.          PolyPunkteListe
  150.          /
  151.          Count
  152.          P1
  153.          P2
  154.          Scheitel
  155.          WinkelEins
  156.          WinkelZwei
  157.         )
  158.    (setq WinkelEins 0.0
  159.   Scheitel   (car PolyPunkteListe)
  160.   Count     1
  161.    )
  162.    (while (< 1 (length PolyPunkteListe))
  163.       (setq P1      (car PolyPunkteListe)
  164.      P2      (cadr PolyPunkteListe)
  165.      PolyPunkteListe (cdr PolyPunkteListe)
  166.      WinkelZwei     (PIPWinkelHilfe PruefPunkt P1 P2)
  167.      WinkelZwei     (if (< 180.0 WinkelZwei)
  168.           (- WinkelZwei 360.0)
  169.           WinkelZwei
  170.        )
  171.      WinkelEins     (+ WinkelEins WinkelZwei)
  172.       )
  173.       (setq Count (1+ Count))
  174.    )
  175.    (setq WinkelZwei (PIPWinkelHilfe PruefPunkt P2 Scheitel)
  176.   WinkelZwei (if (< 180.0 WinkelZwei)
  177.          (- WinkelZwei 360.0)
  178.          WinkelZwei
  179.       )
  180.    )
  181.    (+ WinkelEins WinkelZwei)
  182. )


  183. (defun PIPWinkelHilfe (PruefPunkt
  184.          P1
  185.          P2
  186.          /
  187.          Alpha
  188.          Beta
  189.         )
  190.    (setq Beta  (angle PruefPunkt P1)
  191.   Alpha (angle PruefPunkt P2)
  192.   Alpha (- Alpha Beta)
  193.    )
  194.    (if (< Alpha 0)
  195.       (setq Alpha (+ (* 2 pi) Alpha))
  196.    )
  197.    (* (/ (float Alpha) pi) 180.0)
  198. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-13 18:58:06 | 显示全部楼层
原来“面域”就是 region .
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2005-8-14 23:30:26 | 显示全部楼层
判断点在曲线内外,支持所有曲线,制裁1次自相交曲线
命令:ptin
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-8-15 16:38:07 | 显示全部楼层
排除内部线的影响还可以用这个

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

使用道具 举报

发表于 2005-8-15 17:52:13 | 显示全部楼层
版主给看看,为什么我选不重呢,有什么办法吗
(setq pt_cross (ssget "_c" pt pt '((0 . "REGION"))))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-28 11:07 , Processed in 0.256263 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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