等高线之间标注高程值
本帖最后由 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编辑方法与代码。
请高手指教。
谢谢
祝大家元宵节快乐!
回复 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处的高程 节日快乐!共同快乐! 回复 sy100 的帖子
谢谢你的关注。
祝你元宵节快乐。
在新的一年万事如意 本帖最后由 461045462 于 2011-2-17 16:14 编辑
Gu_xl 发表于 2011-2-17 10:22 static/image/common/back.gif
回复 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 修改,代码要怎样编辑?或者采用什么较好的方式来实现?
请指教
谢谢
从事测绘行业的吧,这个问题比较麻烦,无论哪种方法都很难避免高曲矛盾。经过多年实践,还是觉得南方cass下自带的功能比较实用,效果很好。无需自己写代码。
回复 就一小卒 的帖子
南方cass有这样高程点内插的功能吗 ? 上面461045462发的那个程序从运行结果来看已经离成功差一步了,尽管这样也能实现内插高程点的目的,但是不能按使用者的意愿点选的位置写高程,是个缺憾,还有一个问题,注记完一个高后,要么回到命令提示符下,要么继续按提示点选第一、第二条线进行下去,把这些问题解决了这是个比较实用的程序。期待中。。。。。。 就一小卒 发表于 2011-2-18 19:45 static/image/common/back.gif
从事测绘行业的吧,这个问题比较麻烦,无论哪种方法都很难避免高曲矛盾。经过多年实践,还是觉得南方cass下 ...
好像只有等高线内插,没有标注高程的功能?........
请指教
谢谢 指教谈不上,共同学习吧。
操作1:首先将等高线生成数据文件。 dat格式的
2: 用“查询指定点高程”命令访问生成的数据文件
3: 根据提示可随意的添加高程点