kasra 发表于 2022-7-6 11:23:37

如何获得最近的端点o

大家好。
我需要一个函数的组合,可以获得一条线的最近端点,通过点击它或穿过窗口进行选择。
请引导我。。。。
谢谢

alanjt 发表于 2022-7-6 11:29:00

我已经用过几次了。
 
;;; 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

JohnM 发表于 2022-7-6 11:31:09

我确信有几种方法可以实现这一点,但一种方法是使用(entsel)函数。这将返回实体名称和拾取点的坐标。
使用(entget)函数首先验证它是一条线,然后获取起点和终点。
如果用户未拾取任何内容或对象不是直线,则可能需要使用while循环来捕捉错误。
然后使用(距离)功能检查从拾取点到直线起点的距离,然后检查拾取点到直线终点的距离。
然后使用(min)函数查找最短距离。
使用交叉窗口是可以实现的,但它需要更多的代码,并且仍然会出现错误的情况,例如:如果用户使用windows 2行怎么办?
你怎么知道该在哪一行上运行程序。因此,最好坚持使用“在线上拾取点”选项。
如果您有任何问题或需要帮助,请开始编码并发布

Lee Mac 发表于 2022-7-6 11:35:04

另一个,与艾伦的没有什么不同
 

(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))

alanjt 发表于 2022-7-6 11:38:00

将我的应用到选择集的好方法。但是,您忘记了选择点上的trans。
 

Lee Mac 发表于 2022-7-6 11:39:47

 
谢谢Alan,但我不确定是否错过了trans…:眨眼:

alanjt 发表于 2022-7-6 11:44:26

呼呼,你说得对,奇怪。我收回了。

Lee Mac 发表于 2022-7-6 11:48:44

 
别担心

alanjt 发表于 2022-7-6 11:50:49

好了,现在我知道为什么我这么困惑了,我有了它。当我最初编写上述sub时,我首先使用entsel中的点来提取vlax曲线getClosetPointOnCurve,因此我必须平移该点以获得正确的closestpoint,但我在不久前对其进行了修改以删除它(意识到它是无意义的),我从未考虑过删除trans。

Lee Mac 发表于 2022-7-6 11:53:55

 
但是由于ENTSEL返回(),仍然需要TRANS?
页: [1] 2
查看完整版本: 如何获得最近的端点o