|
发表于 2004-10-17 14:47:00
|
显示全部楼层
不好意思!我不会贴图,比如一个四边图形,底边是直边顶边是弧线,二边是直线,但不相等,请问底边到弧边最远点的距离,目的是我知道最远点的距离也就可以知道用多宽的钢板下料了,如果我用在网上下载的的方法也可以检查出最远点,但麻烦,我想能不能直接测量出最远点.下面是我网上下载的,相当好用.
;_求共面曲线间最近距离及最近点的LISP程序__BY__WKAI__晓东CAD论坛______________
;_2004.01.05.16.02___________________________________________________________
;____________________________________________________________________________
;____________________________________________________________________________
(defun c:ln (/ ent1 ent2 n1 n2 dist)
(princ "\n请选择共面的线段、圆、圆弧,或者复义线,第一段:")
(setq vlobject1 (vlax-ename->vla-object (setq ent1 (car (entsel)))))
(princ "\n请选择共面的线段、圆、圆弧,或者复义线,第二段:")
(setq vlobject2 (vlax-ename->vla-object (setq ent2 (car (entsel)))))
(setq int (vlax-variant-value (vla-intersectwith vlobject1 vlobject2 acextendnone)))
(if (> (vlax-safearray-get-u-bound int 1) 0)
(princ "\n最小距离为:0")
(progn
(setq s1 (is_pl ent1 vlobject1))
(setq s2 (is_pl ent2 vlobject2))
(setq n1 0
n2 0
)
(repeat (sslength s1)
(setq ent1 (ssname s1 n1)
n1 (1+ n1)
n2 0
)
(repeat (sslength s2)
(setq ent2 (ssname s2 n2)
n2 (1+ n2)
)
(setq dist (append dist (list (distance_between_ents ent1 ent2))))
)
)
(setq dist (car (vl-sort dist (function (lambda (e1 e2) ( (sslength s) 1)
(command "erase" s "")
)
)
;____________________________________________________________________________
;____________________________________________________________________________
;____________________________________________________________________________
(defun distance_between_arc_and (a1 a2 / dd en1 en2 di1 di2)
(if (= "CIRCLE" (cdr (assoc 0 (entget (vlax-vla-object->ename a1)))))
(progn
(setq cen1 (vlax-safearray->list (vlax-variant-value (vla-get-center a1))))
(setq di3 (vlax-curve-getClosestPointTo a2 cen1))
(setq en3 (polar cen1 (angle cen1 di3) (vla-get-radius a1)))
(setq dd (append dd (list (list (distance di3 en3) en3 di3))))
)
(progn
(setq en1 (vlax-safearray->list (vlax-variant-value (vla-get-startpoint a1))))
(setq en2 (vlax-safearray->list (vlax-variant-value (vla-get-endpoint a1))))
(setq cen1 (vlax-safearray->list (vlax-variant-value (vla-get-center a1))))
(setq di1 (vlax-curve-getClosestPointTo a2 en1))
(setq di2 (vlax-curve-getClosestPointTo a2 en2))
(setq di3 (vlax-curve-getClosestPointTo a2 cen1))
(setq en3 (polar cen1 (angle cen1 di3) (vla-get-radius a1)))
(setq dd (append dd (list (list (distance di1 en1) en1 di1))))
(setq dd (append dd (list (list (distance di2 en2) en2 di2))))
(if (vlax-curve-getParamAtPoint a1 en3)
(setq dd (append dd (list (list (distance di3 en3) en3 di3))))
)
)
)
(car (vl-sort dd (function (lambda (e1 e2) (list (vlax-variant-value (vla-get-startpoint a1))))
(setq en2 (vlax-safearray->list (vlax-variant-value (vla-get-endpoint a1))))
(setq di1 (vlax-curve-getClosestPointTo a2 en1))
(setq di2 (vlax-curve-getClosestPointTo a2 en2))
(setq dd (append dd (list (list (distance di1 en1) en1 di1))))
(setq dd (append dd (list (list (distance di2 en2) en2 di2))))
(car (vl-sort dd (function (lambda (e1 e2) (vla-object e1))
(setq vlo2 (vlax-ename->vla-object e2))
(setq int (vlax-variant-value (vla-intersectwith vlo1 vlo2 acextendnone)))
(if (> (vlax-safearray-get-u-bound int 1) 0)
(princ "\n距离为0")
(progn
(if (or (= "ARC" (cdr (assoc 0 (entget e1))))
(= "CIRCLE" (cdr (assoc 0 (entget e1))))
)
(setq dd_l (append dd_l (list (distance_between_arc_and vlo1 vlo2))))
(setq dd_l (append dd_l (list (distance_between_line_and vlo1 vlo2))))
)
(if (or (= "ARC" (cdr (assoc 0 (entget e2))))
(= "CIRCLE" (cdr (assoc 0 (entget e2))))
)
(setq dd_l (append dd_l (list (distance_between_arc_and vlo2 vlo1))))
(setq dd_l (append dd_l (list (distance_between_line_and vlo2 vlo1))))
)
(setq dd_l (car (vl-sort dd_l (function (lambda (e1 e2) (< (car e1) (car e2)))))))
dd_l
)
)
)
;____________________________________________________________________________
;____________________________________________________________________________
;____________________________________________________________________________
(princ "\n求共面曲线间最近距离及最近点的LISP程序__BY__WKAI__晓东CAD论坛") |
|