明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: yanshengjiang

南方CASS 内插高程点程序

    [复制链接]
发表于 2012-7-20 21:29:30 | 显示全部楼层
changyiran 发表于 2012-7-20 18:48
我的这个程序其实是针对两条等高线之间的点的高程注记来编写的,所以你的这个问题不好解决,希望你能想出 ...

谢谢changyiran
理解您的程序是针对两条等高线之间的点的高程所求,只是一直没有找到好的方式,所以提及试试。
谢谢!
发表于 2012-7-20 22:12:08 | 显示全部楼层
本帖最后由 461045462 于 2012-7-20 22:18 编辑
changyiran 发表于 2012-7-18 12:39
这个符合你的要求,距离100是足够了,不管是拟不拟合也都行,你试下!

试了试,发现程序高程标注有误。
麻烦看看。
谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
发表于 2012-7-21 11:24:39 | 显示全部楼层
461045462 发表于 2012-7-20 22:12
试了试,发现程序高程标注有误。
麻烦看看。
谢谢!

这确实是个问题,我这个程序的基本思想是根据指定距离构建一个矩形框,将与矩形框相交的所有等高线根据其到指定注记位置的距离进行排序,认为指定注记位置两侧的等高线应该就是距离最近的两条等高线,然后以此来实现高程内插,但是根据你的提醒我发现我的这个想法有点想当然,正如你指出的这两个错误,就不符合“注记位置两侧的等高线应该就是距离最近的两条等高线”这个要求,因而出错,我想这个应该有解决办法。
发表于 2012-7-21 11:38:52 | 显示全部楼层
461045462 发表于 2012-7-20 22:12
试了试,发现程序高程标注有误。
麻烦看看。
谢谢!

我想到了一个解决思路,离注记位置最近的那一条等高线肯定是该位置两侧的两条等高线中的一条,那么就根据这条等高线上离注记位置最近的那个点与注记位置这两点构造一射线(要有一定长度,保证有等高线与之相交),那么与该射线相交的等高线中离注记位置最近的那个等高线必是注记位置两侧的另外一条等高线,我试着编下。
发表于 2012-7-21 13:53:28 | 显示全部楼层
461045462 发表于 2012-7-20 22:12
试了试,发现程序高程标注有误。
麻烦看看。
谢谢!

这是修改后的代码,顺便把山顶问题也给解决了
  1. (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);对等高线附近位置进行高程注记
  2. (princ"\n欢迎使用-----河南中化常怡然!")
  3.   (setq ssjl 50)
  4.   (while (setq zjd(getpoint"\n请选择注记点位置:"))
  5.        (setq zjd(list(car zjd)(cadr zjd)));三维点转换为二维点
  6.        (setq yszb(list(+ ssjl (car zjd))(+ ssjl (cadr zjd)))zxzb(list(- (car zjd)ssjl)(- (cadr zjd)ssjl)));构造搜索范围框
  7.        (setq ss(ssget "c"yszb zxzb'((0 . "*polyline")(8 . "dgx")))jlb'()j -1)
  8.        (if (and ss(>= (setq dgxgs(sslength ss))2))
  9.        (progn
  10.          (repeat dgxgs
  11.      (setq en(ssname ss(setq j(1+ j))))
  12.      (setq vla(vlax-ename->vla-object en));转换成vla对象
  13.      (setq zjdzb(vlax-curve-getClosestPointTo vla zjd));获得离注记点最近的曲线上的点的坐标
  14.      (setq jlb(cons (list (distance zjd zjdzb)zjdzb en)jlb));构造距离和相应最近点坐标表
  15.          )
  16.          (setq xhb(VL-SORT-I  jlb'(lambda(x y)(< (car x)(car y)))));返回按距离从小到大排序后的表
  17.          (setq jl1(car(nth(car xhb)jlb))gc1(caddr(cadr(nth(car xhb)jlb))))
  18.          (setq dyzb(cadr(nth(car xhb)jlb)));返回离注记点最近的等高线上离注记点最近的点的坐标
  19.          (setq dezb(polar zjd(angle dyzb zjd)100));根据dyzb与注记点连线的夹角返回离zjd距离值为50的点的坐标
  20.          (setq ss(ssget"f"(list zjd dezb)'((0 . "*polyline")(8 . "dgx")))jlb'()j -1)
  21.          (if ss
  22.        (progn
  23.          (repeat(sslength ss)
  24.           (setq en(ssname ss(setq j(1+ j))))
  25.           (setq vla(vlax-ename->vla-object en));转换成vla对象
  26.           (setq zjdzb(vlax-curve-getClosestPointTo vla zjd));获得曲线上的点的坐标
  27.           (setq jlb(cons (list (distance zjd zjdzb)zjdzb)jlb));构造距离和相应最近点坐标表
  28.                 )
  29.          (setq xhb(VL-SORT-I  jlb'(lambda(x y)(< (car x)(car y)))))
  30.          (setq jl2(car(nth(car xhb)jlb))gc2(caddr(cadr(nth(car xhb)jlb))))
  31.          (if (= gc1 gc2)
  32.              (command "drawgcd" "" zjd gc1 "");山顶或山底
  33.              (progn
  34.          (setq bz(/ jl1 (+ jl1 jl2)));获得两距离比值
  35.                 (setq dgj(- gc2 gc1))
  36.                (setq h (+ gc1 (* dgj bz)))
  37.                 (command "drawgcd" "" zjd h "")
  38.        )
  39.          )
  40.        )
  41.        (alert"注记点另外一侧无等高线")
  42.          )
  43.        )
  44.        (alert"没有找到等高线!")
  45.    )
  46.   )
  47.   (alert"注记完毕")
  48.   (princ)
  49. )
有一种情况会注记错,就是当离注记点最近的一条等高线有回转时,正好构造的射线与该等高线回转的那一部分有交点,这时高程注记值等于等高线的高程值,也就是说是按山顶或山脚处理的,本来利用射线与曲线的交点能完美的解决这一点,但是我发现用vla-intersectwith无法求直线与二维多段线的交点(如果是多段线就可以),所有我暂时没有这样解决,虽然判断等高线是否闭合能解决这种问题,但是治标不治本,当最近的和第二近的等高线都回转时并且分布在注记点同一侧时照样出错,所以用时要考虑到这一点,我再想想有没有更好的解决办法。
发表于 2012-7-21 16:35:40 | 显示全部楼层
changyiran 发表于 2012-7-21 13:53
这是修改后的代码,顺便把山顶问题也给解决了有一种情况会注记错,就是当离注记点最近的一条等高线有回转 ...

谢谢changyiran !
先下载试试。
谢谢您一再的修改,辛苦了。
谢谢!
发表于 2012-7-21 17:27:58 | 显示全部楼层
changyiran 发表于 2012-7-21 13:53
这是修改后的代码,顺便把山顶问题也给解决了有一种情况会注记错,就是当离注记点最近的一条等高线有回转 ...

试了后,觉得较理想。
觉得:采用 构造搜索范围框  的方式欠佳,如果调出程序,能不考虑范围就比较方便。
您说的1000米,或许范围够大了;是较大了。然而我去年就有30~50平方公里的等高线图形合并在一起检查。
我收集了一个加注高程的程序,只对拟合线有效,没有范围的限制;缺点是山顶与同高回合线部位处理不到位。但程序是.fas,无法修改。
您这样对多段线也有效,比较方便。
谢谢了!
发表于 2012-7-21 17:34:00 | 显示全部楼层
本帖最后由 461045462 于 2012-7-21 17:34 编辑
changyiran 发表于 2012-7-21 13:53
这是修改后的代码,顺便把山顶问题也给解决了有一种情况会注记错,就是当离注记点最近的一条等高线有回转 ...


您提到的:判断等高线是否闭合能解决这种问题
但是图形中,时常等高线是不闭合的
谢谢!
发表于 2012-7-21 18:09:16 | 显示全部楼层
461045462 发表于 2012-7-21 17:34
您提到的:判断等高线是否闭合能解决这种问题
但是图形中,时常等高线是不闭合的
谢谢!

如果不考虑搜索范围的话那只能针对所有等高线了,但是这样的话程序运行效率未免有些低,还有我对你说的同高回合线不是太理解,另外你可不可以把你在实际用的时候处理不正确的情况给罗列一下,最好有个附图,我想只要理论上能行就一定能解决!
回复 支持 0 反对 1

使用道具 举报

发表于 2012-7-21 21:12:57 | 显示全部楼层
本帖最后由 changyiran 于 2012-7-21 21:22 编辑
461045462 发表于 2012-7-21 17:27
试了后,觉得较理想。
觉得:采用 构造搜索范围框  的方式欠佳,如果调出程序,能不考虑范围就比较方便。 ...

  1. (defun dgxjd(sxen dgxen / EL GCZB JDZB VLA VLA1);求射线与等高线之间的交点
  2.   (setq vla1(vlax-ename->vla-object sxen)vla(vlax-ename->vla-object dgxen))
  3.   (setq el(entget dgxen))
  4.   (if(=(cdr(assoc 0 el))"POLYLINE")
  5.      (progn
  6.              (setq gczb(assoc 10 el));含有高程的子表
  7.              (setq el(subst '(10 0 0)gczb el))
  8.              (entmod el)
  9.              (setq jdzb(vlax-invoke vla1'IntersectWith vla 0))
  10.              (setq el(subst gczb(assoc 10 el)el))
  11.              (entmod el)
  12.                     (setq jdzb (list(car jdzb)(cadr jdzb)(last gczb)))
  13.      )
  14.      (progn
  15.              (setq gczb(assoc 38 el));含有高程的子表
  16.              (setq el(subst '(38 . 0)gczb el))
  17.              (entmod el)
  18.              (setq jdzb(vlax-invoke vla1'IntersectWith vla 0))
  19.              (setq el(subst gczb(assoc 38 el)el))
  20.              (entmod el)
  21.                     (setq jdzb (list(car jdzb)(cadr jdzb)(cdr gczb)))
  22.      )
  23.   )
  24. )
  25. (defun c:tqgc(/ BZ DGJ DGX1 DGX2 DGXGS EL1 EL2  GC1 GC2 H J  SS SSJL VLA XHB YSZB  ZJDZB ZXZB  DYZB JL1 JL2 DEZB EN JDZB JLB SXEN VLA1 ZJD);对等高线附近位置进行高程注记
  26. (princ"\n欢迎使用-----河南中化常怡然!")
  27.   (setq ssjl 50)
  28.   (while (setq zjd(getpoint"\n请选择注记点位置:"))
  29.       (setq zjd(list(car zjd)(cadr zjd)));三维点转换为二维点
  30.       (setq yszb(list(+ ssjl (car zjd))(+ ssjl (cadr zjd)))zxzb(list(- (car zjd)ssjl)(- (cadr zjd)ssjl)));构造搜索范围框
  31.       (setq ss(ssget "c"yszb zxzb'((0 . "*polyline")(8 . "dgx")))jlb'()j -1)
  32.       (if (and ss(>= (setq dgxgs(sslength ss))2))
  33.       (progn
  34.         (repeat dgxgs
  35.    (setq en(ssname ss(setq j(1+ j))))
  36.    (setq vla(vlax-ename->vla-object en));转换成vla对象
  37.    (setq zjdzb(vlax-curve-getClosestPointTo vla zjd));获得离注记点最近的曲线上的点的坐标
  38.    (setq jlb(cons (list (distance zjd zjdzb)zjdzb en)jlb));构造距离和相应最近点坐标表
  39.         )
  40.         (setq xhb(VL-SORT-I  jlb'(lambda(x y)(< (car x)(car y)))));返回按距离从小到大排序后的表
  41.         (setq jl1(car(nth(car xhb)jlb))gc1(caddr(cadr(nth(car xhb)jlb))))
  42.         (setq dyzb(cadr(nth(car xhb)jlb)));返回离注记点最近的等高线上离注记点最近的点的坐标
  43.         (setq dezb(polar zjd(angle dyzb zjd)100));根据dyzb与注记点连线的夹角返回离zjd距离值为50的点的坐标
  44.         (entmake(list'(0 . "line")(list 10(car zjd)(cadr zjd))(list 11(car dezb)(cadr dezb))))
  45.         (setq sxen(entlast))
  46.         (setq vla1(vlax-ename->vla-object sxen))
  47.         (setq ss(ssget"f"(list zjd dezb)'((0 . "*polyline")(8 . "dgx")))jlb'()j -1)
  48.         (if ss
  49.      (progn
  50.        (repeat(sslength ss)
  51.        (setq en(ssname ss(setq j(1+ j))))
  52.        (setq vla(vlax-ename->vla-object en));转换成vla对象
  53.        (setq jdzb(dgxjd sxen en));获得射线与曲线的交点坐标
  54.        (setq jlb(cons (list (distance zjd jdzb)jdzb vla)jlb));构造距离和相应交点坐标、vla对象表
  55.               )
  56.        (entdel sxen);删除辅助射线
  57.        (setq xhb(VL-SORT-I  jlb'(lambda(x y)(< (car x)(car y)))))
  58.        (setq jl2(distance(vlax-curve-getClosestPointTo (caddr(nth(car xhb)jlb)) zjd)zjd)gc2(caddr(cadr(nth(car xhb)jlb))))
  59.        (if(/= jl1 0)
  60.           (progn
  61.            (setq bz(/ jl1 (+ jl1 jl2)));获得两距离比值
  62.            (setq dgj(- gc2 gc1))
  63.                  (setq h (+ gc1 (* dgj bz)))
  64.           )
  65.                (setq h gc1)
  66.               )
  67.               (command "drawgcd" "" zjd h "")
  68.      )
  69.      (alert"注记点另外一侧无等高线")
  70.         )
  71.       )
  72.       (alert"没有找到等高线!")
  73.   )
  74.   )
  75.   (alert"注记完毕")
  76.   (princ)
  77. )
这个把等高线回转的也解决了,原来是因为直线与等高线不共面才求不到交点的,因此专门编个函数来求等高线与射线的交点,试验下,如果有什么问题再交流。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-5-20 10:49 , Processed in 0.171217 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表