找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 967|回复: 10

[原创]:给等高线高程赋值

[复制链接]
发表于 2006-5-12 22:31:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
只要在垂直于(斜交也可以)等高线确定起点和终点,再按坡向输入等高距和从起点开始的第一条等高线高程值,就可以将起点与终点间的等高线按要求赋值,并用颜色区分首曲线和计曲线.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-5-12 22:52:51 | 显示全部楼层
如果为Lisp文件请贴出源码,编译文件用 西文名称,中文名称附件下载出错机会比较多
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-12 23:48:46 | 显示全部楼层
回班主,按您的要求贴出LISP源码,并做了详细注释.这可是我自学编程贴出的第一个程序,如果您觉得还可以就要给加分哦,给我点鼓励嘛!

  1. ;;; 《给等高线高程赋值》作者:真龙天子2006.04
  2. (defun c:llzz ()
  3. ;——————确定初始参数——————
  4.     (setvar "osmode" 0)                                         ;关闭捕捉
  5.     (setvar "cmdecho" 0)                                        ;关闭命令行回显
  6.     (command "UCS" "w")                                         ;设为世界坐标系
  7.     (setq tt "y")
  8.   (while (/= tt "n")
  9.     (setq pa (getpoint "\n请按坡向确定线选等高线的起点:")      ;按坡向确定线选等高线的起点
  10.           pb (getpoint "\n请按坡向确定线选等高线的终点:")      ;按坡向确定线选等高线的终点
  11.           ss (ssadd)                                            ;建立一个新选择集
  12.           ss (ssget "f" (list pa pb))                           ;将pa至pb间的等高线放入选择集ss
  13.           n  (sslength ss)                                      ;求选择集ss里等高线的条数
  14.           z2 0
  15.     )
  16.     (while (/= z2 1)
  17.            (princ "\n请确定等高距(+ 上坡;- 下坡):<") (princ z00) (princ ">:")
  18.            (setq z (getreal ))
  19.            (if (= z nil) (setq z z00))
  20.            (setq zm (abs z))                                     ;取得等高距的绝对值
  21.            (if (or (= zm 1) (= zm 2) (= zm 2.5) (= zm 5) (= zm 10) (= zm 25)) (setq z2 1))
  22.            (if (/= z2 1) (progn
  23.                (setq str1  (strcat"*****等高距不规范!请重新输入*****")
  24.                      str2  (strcat"  等高距限为;1、2、2.5、5、10、25")
  25.                      str3  (strcat"  或者为;-1、-2、-2.5、-5、-10、-25")
  26.                )
  27.                (alert(strcat str1 "\n" str2 "\n" str3 "\n")))
  28.            )
  29.     )
  30.     (setq p0 (list 0 0 0)                                       ;新建一个XYZ为0 的新表
  31.           m -1                                                  ;确定计数器的起始值
  32.           z0 3
  33.     )
  34.     (while (/= z1 z0)
  35.            (princ "\n请确定起始等高线高程:<") (princ "刚才最后一条等高线高程为:") (princ zn0) (princ ">:")
  36.            (setq z0 (getreal))
  37.            (if (= z0 nil) (setq z0 zn0))
  38.            (setq z1 (* zm (atoi (rtos (/ z0 zm)))))
  39.            (if (/= z0 z1) (alert (strcat"起始等高线高程错误!请重新输入")))
  40.     )
  41.       (command "chprop" "f" pa pb "" "" "c" "byblock" "")    ;修改为颜色随块
  42. ;——————从选择集里取出单条等高线赋予新的高程并根据高程值确定颜色——————
  43.     (repeat n
  44.           (setq m (+ m 1)                  ;计数
  45.                 sl (ssname ss m)           ;从SS选择集里按计数器的顺序取出单条等高线
  46.                 zn (+ z0 (* m z))          ;根据起始等高线高程计算取出的单条等高线高程
  47.                 pz (list 0 0 zn)           ;将高程组合成坐标
  48.            )
  49.       (if (= zm 1) (setq mm1 (/ zn 1)))          ;等高距为1时,将高程除1
  50.       (if (= zm 2) (setq mm1 (/ zn 2)))          ;等高距为2时,将高程除2
  51.       (if (= zm 5) (setq mm1 (/ zn 5)))          ;等高距为5时,将高程除5
  52.       (if (= zm 10) (setq mm1 (/ zn 10)))        ;等高距为10时,将高程除10
  53.       (if (or (= zm 25) (= zm 2.5)) (progn                             ;等高距为25时
  54.                     (setq mm2 (rtos zn 2 0)                    ;转换成字符串
  55.                           mm3 (strlen mm2)                 ;提取字符串长度
  56.                           mm4 (substr mm2 (- mm3 1) 2)     ;提取字符串最后两位
  57.                           mm5 (atof mm4)                   ;将最后两位字符串转换为数值
  58.                     )
  59.                     (if (or (= mm5 00) (= mm5 00)) (setq ys 10 lww 0.25))   ;根据高程值确定其颜色和线宽
  60.                     (if (or (= mm5 25) (= mm5 2.5)) (setq ys 50 lww 0.13))  ;根据高程值确定其颜色和线宽
  61.                     (if (or (= mm5 50) (= mm5 5.0)) (setq ys 90 lww 0.13))  ;根据高程值确定其颜色和线宽
  62.                     (if (or (= mm5 75) (= mm5 7.5)) (setq ys 130 lww 0.13)) ;根据高程值确定其颜色和线宽
  63.                     )
  64.       )  
  65.       (if (or (= zm 1) (= zm 2) (= zm 5) (= zm 10)) (progn
  66.           (setq mm5 (atof (substr (rtos mm1) (strlen (rtos mm1)) 1))) ;转换成字符串,提取字符串长度,提取字符串最后一位,将最后一位字符串转换为数值
  67.           (if (or (= mm5 0) (= mm5 5)) (setq ys 10 lww 0.25))   ;根据高程值确定其颜色和线宽
  68.           (if (or (= mm5 1) (= mm5 6)) (setq ys 50 lww 0.13))   ;根据高程值确定其颜色和线宽
  69.           (if (or (= mm5 2) (= mm5 7)) (setq ys 90 lww 0.13))   ;根据高程值确定其颜色和线宽
  70.           (if (or (= mm5 3) (= mm5 8)) (setq ys 130 lww 0.13))   ;根据高程值确定其颜色和线宽
  71.           (if (or (= mm5 4) (= mm5 9)) (setq ys 170 lww 0.13)))   ;根据高程值确定其颜色和线宽
  72.       )
  73.       (if (= (cdr (nth 1 (entget sl))) "LWPOLYLINE") (progn          ;如果等高线是多段线
  74.           (setq pzz0 (* -1 (cdr (assoc 38 (entget sl)))))            ;提取多段线的z值
  75.           (command "pedit" sl "s" "" ))                              ;将多段线改为曲线
  76.       )
  77.       (if (= (cdr (nth 1 (entget sl))) "SPLINE")                     ;如果等高线是样条曲线
  78.           (setq pzz0 (* -1 (nth 3 (assoc 10 (entget sl)))))           ;提取样条曲线的z值
  79.       )
  80.       (if (= (cdr (nth 1 (entget sl))) "POLYLINE")                   ;如果等高线是多段线改成的样条曲线
  81.           (setq pzz0 (* -1 (nth 3 (assoc 10 (entget sl)))))           ;提取样条曲线的z值
  82.       )
  83.       (setq pzz (list 0 0 pzz0))                                     ;根据原等高线的z值组合新的坐标
  84.       (if (/= pzz0 0) (command "_move" sl "" pzz ""))                ;用相对法将已赋高程值的等高线归0
  85.       (command "_move" sl "" pz "")                                  ;用相对法移动等高线到指定高程
  86.       (command "chprop" sl "" "lw" lww "")                           ;根据高程值修改线宽
  87.       (vla-put-Color (vlax-ename->vla-object sl) ys)                 ;将等高线改为指定的色号
  88.     )  
  89.     (setq z00 z zn0 zn)
  90.     (setq tt (getstring "\n还要继续吗?(Y/N) <Y>:"))
  91.   )   
  92.     (setvar "osmode" 35)                                            ;打开捕捉
  93.   (princ "所选的等高线高程赋值、改线宽己完成!")
  94. (prin1)
  95. )
  96. (prompt " <<给等高线高程赋值>>启动命令:llzz")
  97. (princ)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-15 10:54:45 | 显示全部楼层
大哥,我CAD2002,运行你的程序出错:
错误: no function definition: VLAX-ENAME->VLA-OBJECT
什么原因呢?可能是改变颜色出现问题?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-15 12:48:58 | 显示全部楼层
这一名可以不要
(vla-put-Color (vlax-ename->vla-object sl) ys)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-5-15 17:58:47 | 显示全部楼层
回温柔女神;(vla-put-Color (vlax-ename->vla-object sl) ys)是XYP班主的通用函数库里的函数,你没装自然就不能用该函数了,现在你用(command "chprop" sl "" "c" ys "") 替代(vla-put-Color (vlax-ename->vla-object sl) ys)就行了.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-5-15 20:32:41 | 显示全部楼层
2002 下程序前面加上
  1. (vl-load-com)

补充一句,vlax-ename->vla-object 不是 xyp 版主函数库的函数,这是 CAD 的 Lisp 函数。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-5-23 18:56:53 | 显示全部楼层
请问2006里有自动生成等高线的命令吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-6-9 08:23:34 | 显示全部楼层
我是菜鸟,请问VLK扩展名的文件如何调用啊?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-6-9 11:23:26 | 显示全部楼层
不错,谢谢高手,我这几天在编一个三维地形图自动取端面的程序,我将端面线生产3dface后与等高线用intersectwith函数求交点,但好像不行,看到你将等高线归零后,我想我也可以先提取z后,在归0,再求出交点后,将z用提取的z换掉就可以了。
还有,在判断等高线类型时,将cdr改成cadr,使程序更加规范一点!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-6-15 09:31:40 | 显示全部楼层
感谢真龙天子,我找了好久类似这样的程序,谢谢了!! 以后有好东西共享啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-18 19:33 , Processed in 0.199006 second(s), 53 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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