461045462 发表于 2012-7-17 21:41 
首先谢谢changyiran 的分享!
收藏了,学习学习。
试了试,觉得有些待改进:
这个符合你的要求,距离100是足够了,不管是拟不拟合也都行,你试下! - (defun c:tqgc(/ BZ DGJ DGX1 DGX2 DGXGS EL1 EL2 EN GC1 GC2 H J JLB SS SSJL VLA XHB YSZB ZJD ZJDZB ZXZB);对等高线附近位置进行高程注记
- (setq ssjl 100)
- (while (setq zjd(getpoint"\n请选择注记点位置:"))
- (setq zjd(list(car zjd)(cadr zjd)));三维点转换为二维点
- (setq yszb(list(+ ssjl (car zjd))(+ ssjl (cadr zjd)))zxzb(list(- (car zjd)ssjl)(- (cadr zjd)ssjl)));构造搜索范围框
- (setq ss(ssget "c"yszb zxzb'((0 . "*polyline")(8 . "dgx")))jlb'()j -1)
- (if (and ss(>= (setq dgxgs(sslength ss))2))
- (progn
- (repeat dgxgs
- (setq en(ssname ss(setq j(1+ j))))
- (setq vla(vlax-ename->vla-object en));转换成vla对象
- (setq zjdzb(vlax-curve-getClosestPointTo vla zjd));获得离注记点最近的曲线上的点的坐标
- (setq jlb(cons (list (distance zjd zjdzb)zjdzb)jlb));构造图元名和相应距离表
- )
- (setq xhb(VL-SORT-I jlb'(lambda(x y)(< (car x)(car y)))));返回按距离从小到大排序后的表
- (setq jl1(car(nth(car xhb)jlb))jl2(car(nth(cadr xhb)jlb)));获得指定点与离指定点最近的两条等高线之间的距离
- (setq gc1(caddr(cadr(nth(car xhb)jlb)))gc2(caddr(cadr(nth(cadr xhb)jlb))));获得离指定点最近的两条等高线的高程值
- (setq bz(/ jl1 (+ jl1 jl2)));获得两距离比值
- (setq dgj(- gc2 gc1))
- (setq h (+ gc1 (* dgj bz)))
- (command "drawgcd" "" zjd h "")
- )
- (alert"没有找到等高线!")
- )
- )
- (alert"注记完毕")
- (princ)
- )
|