如何获得最近的端点o
大家好。我需要一个函数的组合,可以获得一条线的最近端点,通过点击它或穿过窗口进行选择。
请引导我。。。。
谢谢 我已经用过几次了。
;;; Retrieve closest end point on object
;;; #EntPnt - List with object and point
;;; Alan J. Thompson, 11.10.09
(defun AT:ClosestEndPoint (#EntPnt)
(if (vl-consp #EntPnt)
(car (vl-sort
(list (vlax-curve-getstartpoint (car #EntPnt))
(vlax-curve-getendpoint (car #EntPnt))
) ;_ list
(function
(lambda (a b)
(< (distance (trans (cadr #EntPnt) 1 0) a) (distance (trans (cadr #EntPnt) 1 0) b))
) ;_ lambda
) ;_ function
) ;_ vl-sort
) ;_ car
) ;_ if
) ;_ defun 我确信有几种方法可以实现这一点,但一种方法是使用(entsel)函数。这将返回实体名称和拾取点的坐标。
使用(entget)函数首先验证它是一条线,然后获取起点和终点。
如果用户未拾取任何内容或对象不是直线,则可能需要使用while循环来捕捉错误。
然后使用(距离)功能检查从拾取点到直线起点的距离,然后检查拾取点到直线终点的距离。
然后使用(min)函数查找最短距离。
使用交叉窗口是可以实现的,但它需要更多的代码,并且仍然会出现错误的情况,例如:如果用户使用windows 2行怎么办?
你怎么知道该在哪一行上运行程序。因此,最好坚持使用“在线上拾取点”选项。
如果您有任何问题或需要帮助,请开始编码并发布 另一个,与艾伦的没有什么不同
(defun GetClosestEndInSS (ss pt / GetPoints)
(vl-load-com) ;; Lee Mac~11.04.10
(setq pt (trans pt 1 0))
(defun GetPoints (ss / i ent lst)
(setq i -1)
(while (setq ent (ssname ss (setq i (1+ i))))
(setq lst (cons (vlax-curve-getStartPoint ent)
(cons (vlax-curve-getEndPoint ent) lst))))
lst)
(car (vl-sort (GetPoints ss) (function (lambda (a b) (< (distance pt a)
(distance pt b)))))))
(defun c:test (/ ss pt)
(if (and (setq ss (ssget))
(setq pt (getpoint "\nPoint to Test: ")))
(entmake (list (cons 0 "POINT") (cons 10 (GetClosestEndInSS ss pt)))))
(princ))
将我的应用到选择集的好方法。但是,您忘记了选择点上的trans。
谢谢Alan,但我不确定是否错过了trans…:眨眼: 呼呼,你说得对,奇怪。我收回了。
别担心 好了,现在我知道为什么我这么困惑了,我有了它。当我最初编写上述sub时,我首先使用entsel中的点来提取vlax曲线getClosetPointOnCurve,因此我必须平移该点以获得正确的closestpoint,但我在不久前对其进行了修改以删除它(意识到它是无意义的),我从未考虑过删除trans。
但是由于ENTSEL返回(),仍然需要TRANS?
页:
[1]
2