回班主,按您的要求贴出LISP源码,并做了详细注释.这可是我自学编程贴出的第一个程序,如果您觉得还可以就要给加分哦,给我点鼓励嘛!

- ;;; 《给等高线高程赋值》作者:真龙天子2006.04
- (defun c:llzz ()
- ;——————确定初始参数——————
- (setvar "osmode" 0) ;关闭捕捉
- (setvar "cmdecho" 0) ;关闭命令行回显
- (command "UCS" "w") ;设为世界坐标系
- (setq tt "y")
- (while (/= tt "n")
- (setq pa (getpoint "\n请按坡向确定线选等高线的起点:") ;按坡向确定线选等高线的起点
- pb (getpoint "\n请按坡向确定线选等高线的终点:") ;按坡向确定线选等高线的终点
- ss (ssadd) ;建立一个新选择集
- ss (ssget "f" (list pa pb)) ;将pa至pb间的等高线放入选择集ss
- n (sslength ss) ;求选择集ss里等高线的条数
- z2 0
- )
- (while (/= z2 1)
- (princ "\n请确定等高距(+ 上坡;- 下坡):<") (princ z00) (princ ">:")
- (setq z (getreal ))
- (if (= z nil) (setq z z00))
- (setq zm (abs z)) ;取得等高距的绝对值
- (if (or (= zm 1) (= zm 2) (= zm 2.5) (= zm 5) (= zm 10) (= zm 25)) (setq z2 1))
- (if (/= z2 1) (progn
- (setq str1 (strcat"*****等高距不规范!请重新输入*****")
- str2 (strcat" 等高距限为;1、2、2.5、5、10、25")
- str3 (strcat" 或者为;-1、-2、-2.5、-5、-10、-25")
- )
- (alert(strcat str1 "\n" str2 "\n" str3 "\n")))
- )
- )
- (setq p0 (list 0 0 0) ;新建一个XYZ为0 的新表
- m -1 ;确定计数器的起始值
- z0 3
- )
- (while (/= z1 z0)
- (princ "\n请确定起始等高线高程:<") (princ "刚才最后一条等高线高程为:") (princ zn0) (princ ">:")
- (setq z0 (getreal))
- (if (= z0 nil) (setq z0 zn0))
- (setq z1 (* zm (atoi (rtos (/ z0 zm)))))
- (if (/= z0 z1) (alert (strcat"起始等高线高程错误!请重新输入")))
- )
- (command "chprop" "f" pa pb "" "" "c" "byblock" "") ;修改为颜色随块
- ;——————从选择集里取出单条等高线赋予新的高程并根据高程值确定颜色——————
- (repeat n
- (setq m (+ m 1) ;计数
- sl (ssname ss m) ;从SS选择集里按计数器的顺序取出单条等高线
- zn (+ z0 (* m z)) ;根据起始等高线高程计算取出的单条等高线高程
- pz (list 0 0 zn) ;将高程组合成坐标
- )
- (if (= zm 1) (setq mm1 (/ zn 1))) ;等高距为1时,将高程除1
- (if (= zm 2) (setq mm1 (/ zn 2))) ;等高距为2时,将高程除2
- (if (= zm 5) (setq mm1 (/ zn 5))) ;等高距为5时,将高程除5
- (if (= zm 10) (setq mm1 (/ zn 10))) ;等高距为10时,将高程除10
- (if (or (= zm 25) (= zm 2.5)) (progn ;等高距为25时
- (setq mm2 (rtos zn 2 0) ;转换成字符串
- mm3 (strlen mm2) ;提取字符串长度
- mm4 (substr mm2 (- mm3 1) 2) ;提取字符串最后两位
- mm5 (atof mm4) ;将最后两位字符串转换为数值
- )
- (if (or (= mm5 00) (= mm5 00)) (setq ys 10 lww 0.25)) ;根据高程值确定其颜色和线宽
- (if (or (= mm5 25) (= mm5 2.5)) (setq ys 50 lww 0.13)) ;根据高程值确定其颜色和线宽
- (if (or (= mm5 50) (= mm5 5.0)) (setq ys 90 lww 0.13)) ;根据高程值确定其颜色和线宽
- (if (or (= mm5 75) (= mm5 7.5)) (setq ys 130 lww 0.13)) ;根据高程值确定其颜色和线宽
- )
- )
- (if (or (= zm 1) (= zm 2) (= zm 5) (= zm 10)) (progn
- (setq mm5 (atof (substr (rtos mm1) (strlen (rtos mm1)) 1))) ;转换成字符串,提取字符串长度,提取字符串最后一位,将最后一位字符串转换为数值
- (if (or (= mm5 0) (= mm5 5)) (setq ys 10 lww 0.25)) ;根据高程值确定其颜色和线宽
- (if (or (= mm5 1) (= mm5 6)) (setq ys 50 lww 0.13)) ;根据高程值确定其颜色和线宽
- (if (or (= mm5 2) (= mm5 7)) (setq ys 90 lww 0.13)) ;根据高程值确定其颜色和线宽
- (if (or (= mm5 3) (= mm5 8)) (setq ys 130 lww 0.13)) ;根据高程值确定其颜色和线宽
- (if (or (= mm5 4) (= mm5 9)) (setq ys 170 lww 0.13))) ;根据高程值确定其颜色和线宽
- )
- (if (= (cdr (nth 1 (entget sl))) "LWPOLYLINE") (progn ;如果等高线是多段线
- (setq pzz0 (* -1 (cdr (assoc 38 (entget sl))))) ;提取多段线的z值
- (command "pedit" sl "s" "" )) ;将多段线改为曲线
- )
- (if (= (cdr (nth 1 (entget sl))) "SPLINE") ;如果等高线是样条曲线
- (setq pzz0 (* -1 (nth 3 (assoc 10 (entget sl))))) ;提取样条曲线的z值
- )
- (if (= (cdr (nth 1 (entget sl))) "POLYLINE") ;如果等高线是多段线改成的样条曲线
- (setq pzz0 (* -1 (nth 3 (assoc 10 (entget sl))))) ;提取样条曲线的z值
- )
- (setq pzz (list 0 0 pzz0)) ;根据原等高线的z值组合新的坐标
- (if (/= pzz0 0) (command "_move" sl "" pzz "")) ;用相对法将已赋高程值的等高线归0
- (command "_move" sl "" pz "") ;用相对法移动等高线到指定高程
- (command "chprop" sl "" "lw" lww "") ;根据高程值修改线宽
- (vla-put-Color (vlax-ename->vla-object sl) ys) ;将等高线改为指定的色号
- )
- (setq z00 z zn0 zn)
- (setq tt (getstring "\n还要继续吗?(Y/N) <Y>:"))
- )
- (setvar "osmode" 35) ;打开捕捉
- (princ "所选的等高线高程赋值、改线宽己完成!")
- (prin1)
- )
- (prompt " <<给等高线高程赋值>>启动命令:llzz")
- (princ)
|