明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 13625|回复: 34

等高线之间标注高程值

  [复制链接]
发表于 2011-2-17 05:45:27 | 显示全部楼层 |阅读模式
本帖最后由 461045462 于 2011-2-17 05:47 编辑

  做了矢量化的图后,需要在带属性等高线之间适当增加高程注记。如图上的高程:1639.12、1659,45......等等。手工一个一个的加很麻烦,我想要能够直接点击两跟等高线,根据等高线的属性(带高程值),然后在两跟等高线之间点击一下,就在图上标出高程点值,例1639.12.
高程注记为:选择对象: ((-1 . <图元名: 7ef80018>) (0 . "TEXT") (330 . <图元名: 7ef9bcc0>) (5
. "47AC3") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "GCD") (100 .
"AcDbText") (10 491168.0 4.38831e+006 1659.45) (40 . 4.0) (1 . "1659.45") (50 .
0.0) (41 . 0.8) (51 . 0.0) (7 . "txt") (71 . 0) (72 . 0) (11 491168.0
4.38831e+006 1659.45) (210 0.0 0.0 1.0) (100 . "AcDbText") (73 . 2) (-3
("SOUTH" (1000 . "202111"))))

等高线为:选择对象: ((-1 . <图元名: 7ef800c8>) (0 . "LWPOLYLINE") (330 . <图元名:
7ef9bcc0>) (5 . "47AD9") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .
"dgx") (62 . 3) (6 . "Continuous") (100 . "AcDbPolyline") (90 . 5) (70 . 128)
(43 . 0.600134) (38 . 1660.0) (39 . 0.0) (10 491144.0 4.3883e+006) (40 .
0.600134) (41 . 0.600134) (42 . 0.0) (10 491149.0 4.3883e+006) (40 . 0.600134)
(41 . 0.600134) (42 . 0.0) (10 491155.0 4.3883e+006) (40 . 0.600134) (41 .
0.600134) (42 . 0.0) (10 491160.0 4.38831e+006) (40 . 0.600134) (41 . 0.600134)
(42 . 0.0) (10 491160.0 4.38831e+006) (40 . 0.600134) (41 . 0.600134) (42 .
0.0) (210 0.0 0.0 1.0) (-3 ("SOUTH" (1000 . "201102"))))
请问用lsp要如何编辑?
求lsp编辑方法与代码。
请高手指教。
谢谢
祝大家元宵节快乐!



本帖子中包含更多资源

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

x

点评

程序的功底很深...  发表于 2012-3-7 14:19
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2011-2-17 10:22:25 | 显示全部楼层
回复 461045462 的帖子

给你个思路
1、选取两根等高线en1 en2
2、选取标注点pt,用(vlax-curve-getclosestpointto en1 pt) 、(vlax-curve-getclosestpointto en2 pt)得到等高线上两点 p1、p2,将p1、p2投影到0高程平面,划直线enline,用、(vlax-curve-getclosestpointto enline pt)的到p3点,根据p1 p3 p2内插p3处的高程
发表于 2011-2-17 14:39:33 | 显示全部楼层
节日快乐!共同快乐!
 楼主| 发表于 2011-2-17 15:12:43 | 显示全部楼层
回复 sy100 的帖子

谢谢你的关注。
祝你元宵节快乐。
在新的一年万事如意
 楼主| 发表于 2011-2-17 16:09:59 | 显示全部楼层
本帖最后由 461045462 于 2011-2-17 16:14 编辑
Gu_xl 发表于 2011-2-17 10:22
回复 461045462 的帖子

给你个思路

谢谢版主的指教
由于刚学习lsp不久,对于类似(vlax-curve-getclosestpointto en1 pt)的语句还没有学习掌握,不会使用。不好意思。
现在传上一个不理想的,请版主能否抽空帮我看看,提出一些指导意见。

;高线间内插高程点
(defun c:nc(/ p0 p1 p2 h h0 h1 h2 len ang dat strl min sec sec1 num num1 ss)
       (SETVAR "OSMODE" 512);给系统变量赋值 OSMODE 设置对象的捕捉类型 512 TANgent
       (while
          (SETQ P0 (GETPOINT "\n指定第一条等高线:    "));暂停程序等待用户输入一点,并返回这个点
           (WHILE (not (SETQ P2 (GETPOINT "\n指定相邻的另一条等高线:    "))))
           (setq h1 (nth 2 p0) h2 (nth 2 p2) p0 (list (nth 0 p0) (nth 1 p0)) p2 (list (nth 0 p2) (nth 1 p2)))
              ;nth返回表中第二个元素 h1h2两点高程 p0p2两点xy坐标
           (setq len (distance p0 p2) ang (angle p0 p2));求出两点之间的角度和长度
           (if (and (/= h1 h2) (/= h1 0.0) (/= h2 0.0)) (progn

               (SETQ DAT (rtos (* (GETVAR "CDATE") 100000000) 2 8));读取时间
               (setq strl (strlen dat));求出dat的长度
               (setq min (atoi (substr dat (- strl 5) 2)));截取dat的第三位和第四位
               (if (= min 0) (setq min 0.5))
               (setq sec (atoi (substr dat (- strl 3) 2)));截取dat的第五位和第六位
               (if (= sec 0) (setq sec 0.5))
               (setq sec1 (atoi (substr dat (- strl 1))));截取dat的第七位
               (if (= sec1 0) (setq sec1 0.5)(setq sec1 sec1))
               (setq num1 (/ (+ PI (* sec1 min)) sec))
               (IF (< NUM1 0.1) (SETQ NUM (* NUM1 10)))
               (if (AND (> NUM1 0.1) (< num1 1)) (setq num num1))
               (if (and (> num1 1) (< num1 10)) (setq num (/ num1 10.0)))
               (if (and (> num1 10) (< num 100)) (setq num (/ num1 100.0)))
               (if (and (> num1 100) (< num 1000)) (setq num (/ num1 1000.0)))
               (if (and (> num1 1000) (< num 10000)) (setq num (/ num1 10000.0)))
               (SETQ NUM (/ (ATOI (RTOS (* NUM 1000) 2 0)) 1000.0)) ;;;随机数函数 用日期生成随机数

               (setq h (+ h1 (* num (- h2 h1))));用随机数生成高差
               (setq p1 (polar p0 ang (* len num)));以指定的角度和距离返回一个在用户坐标系上的三维点
               (setq p1 (list (car p1) (cadr p1) h))

               (SETQ P2 (LIST (+ (CAR P1) 1.5) (- (CADR P1) 0.5) H));
               (SETVAR "OSMODE" 0);
               (command "layer" "m" "DGX" "")
               ;建立单行文本
               (SETQ SS (SSGET "W" (LIST (- (CAR P1) 0.3) (- (CADR P1) 0.3))
                                   (LIST (+ (CAR P1) 0.3) (+ (CADR P1) 0.3))));写块
               (IF SS (COMMAND "ERASE" SS ""));删除对象
               (COMMAND "ELEV" "0.0" (rtos h 2 3));设置物体的拉伸厚度与标高
               (command "clayer" "DGX");设置当前图层
               (command "dd" "202101"  "1" p1  "");设置地物编码202101一般高程点
               (setvar "osmode" 0)
           ));;;end of IF
           (princ "\n.\n.\n.")
           (if (= h1 h2) (princ "\n警告: 等高线有严重错误或选中同一条等高线!两等高线之间的高差为0!!"))
           (SETVAR "OSMODE" 512)
       );;;end of WHILE
    );;;end of ADD_HI子函数

现在运行存在一些问题:
第一次运行,随机数生成高差一个高程数据,第二次点击就不行了;不知要怎样让它可以继续操作,连续点击生出数据?
例如:
命令: nc
指定第一条等高线:
指定相邻的另一条等高线:
.  ;(此时生成一个数据)
. ;(命令行又接着显示如下提示);这是我操作生成的结果说明
.
指定第一条等高线:
指定相邻的另一条等高线:
点无效。
指定点:
输入高程:<1604.16>
.......;另外,如果采用不是随机方式,就是象您提出的思路,求出两点的平面距离,然后采用第三点来根据自己的需要点取高程(曾经想过取一半的值,0.5的方式,那样不好)。
用 lsp 修改,代码要怎样编辑?或者采用什么较好的方式来实现?
请指教
谢谢

发表于 2011-2-18 19:45:12 | 显示全部楼层
从事测绘行业的吧,这个问题比较麻烦,无论哪种方法都很难避免高曲矛盾。经过多年实践,还是觉得南方cass下自带的功能比较实用,效果很好。无需自己写代码。
发表于 2011-2-18 23:09:07 | 显示全部楼层
回复 就一小卒 的帖子

南方cass有这样高程点内插的功能吗 ?
发表于 2011-2-18 23:27:56 | 显示全部楼层
上面  461045462  发的那个程序从运行结果来看已经离成功差一步了,尽管这样也能实现内插高程点的目的,但是不能按使用者的意愿点选的位置写高程,是个缺憾,还有一个问题,注记完一个高后,要么回到命令提示符下,要么继续按提示点选第一、第二条线进行下去,把这些问题解决了这是个比较实用的程序。期待中。。。。。。
 楼主| 发表于 2011-2-19 06:41:42 | 显示全部楼层
就一小卒 发表于 2011-2-18 19:45
从事测绘行业的吧,这个问题比较麻烦,无论哪种方法都很难避免高曲矛盾。经过多年实践,还是觉得南方cass下 ...

好像只有等高线内插,没有标注高程的功能?........
请指教
谢谢
发表于 2011-2-19 20:07:24 | 显示全部楼层
指教谈不上,共同学习吧。
操作1:首先将等高线生成数据文件。 dat格式的
    2: 用“查询指定点高程”命令访问生成的数据文件
    3: 根据提示可随意的添加高程点
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-4-30 11:38 , Processed in 0.171762 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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