461045462 发表于 2012-7-20 22:12 
试了试,发现程序高程标注有误。
麻烦看看。
谢谢!
这是修改后的代码,顺便把山顶问题也给解决了 - (defun c:tqgc(/ BZ DGJ DGX1 DGX2 DGXGS EL1 EL2 EN GC1 GC2 H J JLB SS SSJL VLA XHB YSZB ZJD ZJDZB ZXZB DEZB DYZB JL1 JL2);对等高线附近位置进行高程注记
- (princ"\n欢迎使用-----河南中化常怡然!")
- (setq ssjl 50)
- (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 en)jlb));构造距离和相应最近点坐标表
- )
- (setq xhb(VL-SORT-I jlb'(lambda(x y)(< (car x)(car y)))));返回按距离从小到大排序后的表
- (setq jl1(car(nth(car xhb)jlb))gc1(caddr(cadr(nth(car xhb)jlb))))
- (setq dyzb(cadr(nth(car xhb)jlb)));返回离注记点最近的等高线上离注记点最近的点的坐标
- (setq dezb(polar zjd(angle dyzb zjd)100));根据dyzb与注记点连线的夹角返回离zjd距离值为50的点的坐标
- (setq ss(ssget"f"(list zjd dezb)'((0 . "*polyline")(8 . "dgx")))jlb'()j -1)
- (if ss
- (progn
- (repeat(sslength ss)
- (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 jl2(car(nth(car xhb)jlb))gc2(caddr(cadr(nth(car xhb)jlb))))
- (if (= gc1 gc2)
- (command "drawgcd" "" zjd gc1 "");山顶或山底
- (progn
- (setq bz(/ jl1 (+ jl1 jl2)));获得两距离比值
- (setq dgj(- gc2 gc1))
- (setq h (+ gc1 (* dgj bz)))
- (command "drawgcd" "" zjd h "")
- )
- )
- )
- (alert"注记点另外一侧无等高线")
- )
- )
- (alert"没有找到等高线!")
- )
- )
- (alert"注记完毕")
- (princ)
- )
有一种情况会注记错,就是当离注记点最近的一条等高线有回转时,正好构造的射线与该等高线回转的那一部分有交点,这时高程注记值等于等高线的高程值,也就是说是按山顶或山脚处理的,本来利用射线与曲线的交点能完美的解决这一点,但是我发现用vla-intersectwith无法求直线与二维多段线的交点(如果是多段线就可以),所有我暂时没有这样解决,虽然判断等高线是否闭合能解决这种问题,但是治标不治本,当最近的和第二近的等高线都回转时并且分布在注记点同一侧时照样出错,所以用时要考虑到这一点,我再想想有没有更好的解决办法。
|