- 积分
- 14474
- 明经币
- 个
- 注册时间
- 2006-7-5
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|

楼主 |
发表于 2012-5-9 11:27:58
|
显示全部楼层
我用高highflybir 的那个改了两点
一是将选择点改成了选择线的端点,二是将点重合的去掉
修改后,发现并不能求的最近的点,哪们大侠给看看
(defun C:te ();;(/ olderr en errmsg oldmode oce sl ss t0 ptlist pp pp1)
;;定义错误函数和预处理
(setvar "errno" 0)
; (setq olderr *error*)
; (defun *error* (msg)
; (setq en (getvar "errno"))
; (setq errmsg (strcat "errno=" (itoa en) "\nError:" msg))
; (alert errmsg)
; (setq *error* olderr)
; )
(graphscr)
(setq oldmode (getvar "osmode"))
(setq oce (getvar "cmdecho"))
(setvar "cmdecho" 0)
(command ".ucs" "W")
;;也可以用其他方式取得点集
;(setq sl '((0 . "POINT")))
(setq t0 (getvar "TDUSRTIMER"))
(SETQ myobj1 nil)
(SETQ ss nil)
(while (not ss)
(princ "\n选择所有需要输入的直线...")
(setq ss (ssget '((0 . "LINE,SPLINE,ARC,POLYLINE,LWPOLYLINE,ELLIPSE,SPLINE")))))
(setq ptlist (getpt ss))
(setq ptlist (sortx ptlist))
(setq pp1 (f2 ptlist))
(princ pp1)
; (if (= nil pp)
; (progn
; (alert "不存在有最小距离的一对点!")
; (command ".ucs" "p")
; (setvar "osmode" oldmode)
; (setvar "cmdecho" oce)
; (princ)
; )
; (progn
; ;;画最短距离的点对集的连线,可能有多条
; (setvar "osmode" 0)
; (foreach nn pp
; (entmake
; (append
; '((0 . "line")(100 . "AcDbEntity")(100 . "AcDbLine"))
; (list (cons 10 (car nn)))
; (list (cons 11 (cadr nn)))
; (list (cons 62 1))
; )
; )
; )
; (command ".ucs" "P")
; (setvar "osmode" oldmode)
; (setvar "cmdecho" oce)
; (princ)
; )
; )
)
;;取点函数,其中i为点的编号
;(defun getpt (ss / i listpp a b c)
; (setq i 0 listpp nil )
; (if ss
; (repeat (sslength ss)
; (setq a (ssname ss i))
; (setq b (entget a))
; (setq c (cdr (assoc 10 b)))
; (setq listpp (cons c listpp))
; (setq i (1+ i))
; )
; )
; (reverse listpp)
;)
(defun getpt (ss / i listpp ent ent_pt1 ent_pt2 entobj)
(setq i 0 listpp nil )
(if ss
(repeat (sslength ss)
(setq ent (ssname ss i))
(setq entobj (vlax-ename->vla-object ent))
(setq ent_pt1 (vlax-curve-getPointAtParam entobj (vlax-curve-getStartParam entobj))
ent_pt2 (vlax-curve-getPointAtParam entobj (vlax-curve-getEndParam entobj)))
(setq listpp (cons ent_pt1 listpp))
(setq listpp (cons ent_pt2 listpp))
(setq i (1+ i))
)
)
(reverse listpp)
)
;;从J到K的表
(defun cut (ptlist j k / i ptlist1)
(setq i 0 ptlist1 nil)
(foreach n ptlist
(if (and (>= i j) (<= i k) )
(setq ptlist1 (cons n ptlist1))
)
(setq i (1+ i))
)
(reverse ptlist1)
)
;;对X排序
(defun sortX (lst / lst1 lst2 a e1 e2)
(setq lst1 '()
lst2 '()
)
(foreach a lst
(if (not (member (car a) lst1))
(setq lst1 (cons (car a) lst1)
lst2 (cons a lst2)
)
)
)
(vl-sort lst2 '(lambda (e1 e2) (< (car e1) (car e2))))
)
;;在带形区域查找
(defun searchX (ptlist1 x1 x2 / pp n)
(setq pp nil)
(foreach n ptlist1
(if (and (>= (car n) x1)(<= (car n) x2))
(setq pp (cons n pp))
)
)
(reverse pp)
)
;;在矩形区域查找
(defun searchXY (ptlist2 x1 x2 y1 y2 / pp n)
(setq pp nil)
(foreach n ptlist2
(if (and (>= (car n) x1)
(<= (car n) x2)
(>= (cadr n) y1)
(<= (cadr n) y2)
)
(setq pp (cons n pp))
)
)
(reverse pp)
)
;;最多6点最小距离
(defun 6ptmin (ptlist4 pt / 6pmin 6plist)
(setq 6pmin (mapcar '(lambda (x) (distance x pt)) ptlist4))
(setq 6pmin (apply 'min 6pmin) 6plist nil)
(foreach 6name ptlist4
(if (equal (distance 6name pt) 6pmin 1e-8)
(setq 6plist (cons (list pt 6name) 6plist))
)
)
(list 6pmin 6plist)
)
;;***************
;;程序主段-------
(defun f2 (ptlist / l p1 p2 p3 dd 3pmind 3plist ptlist1 ptlist2 ptlist3 ptlist4
n m midpt mind1 mind2 mindt a b c d Dismin Dnmin nplist mindi)
(setq n (length ptlist)
d 0
dist1 (distance (nth 0 ptlist)(nth 1 ptlist)))
(princ dist1)
(if (> n 1)
(progn
(setq m 0)
(repeat (- n 1)
(setq i 1)
(repeat (- n m 1)
(setq dist0 (distance (nth m ptlist)(nth (+ m i) ptlist)))
(if (< dist0 dist1)(setq dist1 dist0 pt1 (nth m ptlist) pt2 (nth (+ m i) ptlist)))
(setq i (1+ i))
)
(setq m (1+ m))
)))
(cons pt1 (cons pt2 (cons dist1)))
) |
|