zamri_uut 发表于 2022-7-5 18:31:25

选择点并连接

https://www.dropbox.com/s/gb1abelb1r3dhy5/Thread%2002.jpg?dl=0
大家好。。。
我试图构建一个lisp,可以用“ssget”从一个点连接到另一个点,但需要按前面提出的点进行连接,如何根据与第一个点的距离顺序选择一个点?有人知道吗?
 
提前感谢!

Lee Mac 发表于 2022-7-5 18:43:46

蛮力法=慢:
(defun c:ptjoin ( / i l m p s )
   (if (setq s (ssget '((0 . "POINT"))))
       (progn
         (repeat (setq i (sslength s))
               (setq l (cons (cdr (assoc 10 (entget (ssname s (setq i (1- i)))))) l))
         )
         (if (setq p (getpoint "\nPick 1st point: "))
               (progn
                   (setq p (trans p 1 0))
                   (while l
                     (setq p (closestpoint p l)
                           m (cons (cons 10 p) m)
                           l (vl-remove p l)
                     )
                   )
                   (entmake
                     (append
                           (list
                              '(000 . "LWPOLYLINE")
                              '(100 . "AcDbEntity")
                              '(100 . "AcDbPolyline")
                               (cons 90 (length m))
                              '(070 . 0)
                           )
                           m
                     )
                   )
               )
         )
       )
   )
   (princ)
)
(defun closestpoint ( p l / d q r x )
   (setq r (car l)
         d (distance p r)
   )
   (foreach q (cdr l)
       (if (< (setq x (distance p q)) d)
         (setq r q d x)
       )
   )
   r
)

zamri_uut 发表于 2022-7-5 18:51:57

谢谢你,李先生,这正是我所期望的。我将尝试把我创建的功能。再次感谢您一直以来的帮助。

Lee Mac 发表于 2022-7-5 19:07:16

不客气!

BIGAL 发表于 2022-7-5 19:12:18

使用纯lisp的Lee排序有点麻烦,vl排序有助于解决这个问题,它有一个列表(ptnum dist(x Y))(1 23(100 100))(2 25(23 23))(3 35(50 50)),因此pt2比pt1近,但pt3远。
 
我确实发现了这一点,这是我一直在寻找的其他东西,并将排序点非常快使用这种方法,这比使用while测试更容易。
 
; example from help
(vl-sort '((1 3) (2 2) (3 1))
            (function (lambda (e1 e2)
                        (< (cadr e1) (cadr e2)))))
((3 1) (2 2) (1 3))   

 
我的测试

(setq lst (list (list 1 23 (list 100 100))(list 2 22 (list 50 100))(list 3 35 (list 50 50))))

(vl-sort lst
   (function (lambda (e1 e2)
   (< (cadr e1) (cadr e2)))))
; result
((2 22 (50 100)) (1 23 (100 100)) (3 35 (50 50)))

Lee Mac 发表于 2022-7-5 19:26:59

注意,不需要对点进行排序,因为我们只寻找最近的点,因此不需要按距离给定点距离的递增顺序对其余点进行排序。
 
还请注意,需要对处理的每个点执行此类排序,因为我们不是按与单个给定点的距离排序,而是按与每个连续点的距离排序(贪婪算法)。
 
整个任务本质上是最短路径问题,有几种著名的算法-注意,这里实现的贪婪算法不一定会产生最佳结果。

BIGAL 发表于 2022-7-5 19:31:51

李不用担心。
页: [1]
查看完整版本: 选择点并连接