选择点并连接
https://www.dropbox.com/s/gb1abelb1r3dhy5/Thread%2002.jpg?dl=0大家好。。。
我试图构建一个lisp,可以用“ssget”从一个点连接到另一个点,但需要按前面提出的点进行连接,如何根据与第一个点的距离顺序选择一个点?有人知道吗?
提前感谢! 蛮力法=慢:
(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
) 谢谢你,李先生,这正是我所期望的。我将尝试把我创建的功能。再次感谢您一直以来的帮助。 不客气! 使用纯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)))
注意,不需要对点进行排序,因为我们只寻找最近的点,因此不需要按距离给定点距离的递增顺序对其余点进行排序。
还请注意,需要对处理的每个点执行此类排序,因为我们不是按与单个给定点的距离排序,而是按与每个连续点的距离排序(贪婪算法)。
整个任务本质上是最短路径问题,有几种著名的算法-注意,这里实现的贪婪算法不一定会产生最佳结果。 李不用担心。
页:
[1]