本帖最后由 zhynt 于 2011-7-14 09:23 编辑

- ;;判断点是否在方框内
- (defun point_inm (pt pt1 pt2 pt3 pt4 / dist1 dist2 dist3 dist4 pt pt1
- pt2 pr3 pt4)
- (setq dist1 (point_line pt pt1 pt2)
- dist2 (point_line pt pt2 pt3)
- dist3 (point_line pt pt1 pt4)
- dist4 (point_line pt pt3 pt4)
- )
- (if (equal (+ dist1 dist2 dist3 dist4)
- (+ (distance pt1 pt2) (distance pt2 pt3))
- 1e-10
- )
- t
- nil
- )
- )
- ;;点到直线的垂直距离
- (defun point_line (pt pt1 pt2 / ptangle ptn pt pt1 pt2 dist jptx)
- (setq ptangle (angle pt1 pt2)
- ptn (polar pt (+ (* 0.5 pi) ptangle) 0.01)
- jptx (inters pt ptn pt1 pt2 nil)
- dist (distance pt jptx)
- )
- dist
- )
- ;;将点表中在方框内的点组成新表
- (defun pt_inm (oldlst PT1 PT2 PT3 PT4 / oldlist n pt1 pt2 pt3 pt4
- templst newlst)
- (setq templst '())
- (foreach n oldlst
- (if (/= (point_inm n pt1 pt2 pt3 pt4) nil)
- (setq templst (cons n templst))
- )
- )
- (setq newlst (reverse templst))
- )
- ;;多段线顶点表
- (defun pt_list (ent)
- (mapcar 'cdr
- (vl-remove-if '(lambda (x) (/= 10 (car x))) ent)
- )
- )
- ;;;去除 y 坐标相同的,并从上到下排序
- (defun y_lst (lst rc / it lst2)
- (setq lst2 '())
- (setq lst (vl-sort lst (function (lambda (e1 e2) (> (car e1) (car e2))))))
- (while (setq lst2 (cons (setq it (car lst)) lst2)
- lst (vl-remove-if
- '(lambda (x) (equal (cadr it) (cadr x) rc))
- lst
- )
- )
- )
- lst2
- )
- (defun c:yl (/ pta ptb ptax ptay ptbx ptby ptaxby pybxay se pt_lst n m pta pt )
- (setq pta (getpoint "\n框选第一点:"))
- (setq ptb (getcorner pta "\n框选第二点:"))
- (if (/= ptb nil)
- (progn (setq ptax (car pta)
- ptay (cadr pta)
- ptbx (car ptb)
- ptby (cadr ptb)
- )
- (setq ptaxby (list ptax ptby)
- ptbxay (list ptbx ptay)
- )
- (setq se (ssget "c" pta ptb '((0 . "LWPOLYLINE"))))
- )
- )
- (setq pt_lst (pt_list (entget (ssname se 0))))
- (setq pt_lst (pt_inm pt_lst pta ptaxby ptb ptbxay))
- (setq pt_lst (y_lst pt_lst 1e-5))
- (setq n (length pt_lst)
- m 0
- )
- (setq pta (getpoint "\n位置:"))
- (while (/= m n)
- (setq pt (nth m pt_lst))
- (command "_.line" "NON" pt "NON"(polar pt 0 (- (car pta)(car pt))) "")
- (setq m (1+ m))
- )
- )
|