求助:多边形内高程点的最大值和最小值
编程要求步骤:1,选择高程点的范围:(1,选择已有的多边形,2,绘制高程点范围)
2,显示最大高程值和最小高程值,并标注在多边形内。
;_选择与绘制的多边形要在完全显示在当前屏幕内GCD层的块参照没处理
(defun c:tt (/ ENAME GCZ I MAXGC MAXRETURN MINRETURN MIXGC OLDENTLAST PLIST SLECTMODE SS AT:ENTSEL AT:DRAWPL AT:PL_PLIST)
;_线坐标表
(defun AT:PL_Plist (ename / en entl flag vlist pt Elev LI_item)
(defun LI_item (n alist)
(cdr (assoc n alist))
)
(setq
vlist '()
entl(entget ename)
en (LI_item 0 entl)
)
(cond
((= en "LWPOLYLINE")
(setq
vlist '()
Elev(LI_item 38 entl)
)
(foreachpt entl
(if (= (car pt) 10)
(setq vlist (cons (list (cadr pt) (caddr pt) Elev) vlist))
)
)
(setq vlist (reverse vlist))
)
((= en "POLYLINE")
(setq
ename (entnext ename)
entl(entget ename)
en (LI_item 0 entl)
vlist '()
)
(while (= en "VERTEX")
(setq flag (LI_item 70 entl))
(if (and
(zerop (logand flag 1))
(zerop (logand flag 2))
(zerop (logand flag 8))
(/= flag 128)
)
(setq
pt (LI_item 10 entl)
vlist (cons pt vlist)
)
)
(setq
ename (entnext ename)
entl (entget ename)
en (LI_item 0 entl)
)
)
(setq vlist (reverse vlist))
)
)
vlist
)
;_绘制多边形
(defun AT:DrawPl (/ loop mod p1 pn pt vpoint)
(setq loop t)
(if(setq p1 (getpoint "\n开始点<退出>:"))
(progn
(command "pline" p1)
(princ "\n指定下一步<退出>:")
(while loop
(setq vpoint (grread t 4 0))
(setq mod (car vpoint))
(setq pt (cadr vpoint))
(cond((= mod 3)
(command pt)
(setq pn pt)
)
((= mod 5)
(redraw)
(grvecs (list 3 pt p1))
(and pn (grvecs (list 3 pn pt)))
)
(t (setq loop nil))
)
)
(command "c")
(redraw)
)
)
(entlast)
)
;_条件Entsel
(defun AT:Entsel (arg fun str / ename)
(while
(progn (setq ename (car (fun str)))
(cond
((eq 'ENAME (type ename))
(if (and arg (not (arg ename)))
(princ "\n无效的对象选择.....")
)
)
)
)
)
ename
)
(initget "S D")
(setq slectmode (getkword "\n选择多边形(S)/绘制范围(D)<选择多边形>:"))
(if (= slectmode "D")
(progn
(setq oldentlast (entlast))
(setq ename (DrawPl))
(if (equal oldentlast ename)
(setq ename nil)
)
)
(progn
(setq ename
(AT:Entsel
(lambda (x)
(wcmatch (cdr (assoc 0 (entget x))) "*POLYLINE")
)
entsel
"\n选择多边形: "
)
)
)
)
(if ename
(progn
(setq plist (AT:PL_Plist ename))
(setq ss (ssget "cp" plist '((8 . "8320") (0 . "TEXT"))))
(if ss
(progn
(setq i -1)
(setq maxgc -99999999) ;_设定默认最大高程值
(setq mixgc 99999999) ;_设定默认最小高程值
(while (setq ename (ssname ss (setq i (1+ i))))
(setq gcz (atof (cdr (assoc 1 (entget ename)))))
(if(= gcz maxgc)
(progn
(setq maxreturn (cons ename maxreturn))
(setq maxgc gcz)
)
)
(if(> gcz maxgc)
(progn
(setq maxreturn (list ename))
(setq maxgc gcz)
)
)
(if(= gcz mixgc)
(progn
(setq minreturn (cons ename minreturn))
(setq mixgc gcz)
)
)
(if(< gcz mixgc)
(progn
(setq minreturn (list ename))
(setq mixgc gcz)
)
)
)
(command "chprop" ss "" "c" 7 "")
(foreach i maxreturn
(command "chprop" i "" "c" 1 "")
)
(foreach i minreturn
(command "chprop" i "" "c" 3 "")
)
(princ "\n多边形内-最大值高程值颜色红色,最小值颜色绿色")
)
(princ "\n多边形内没有高程点...")
)
)
)
(princ)
)
多谢gufeng,能够显示最大和最小高程值,但是绘制多边形不可用,希望能修改下
;_把这句
(setq ename (DrawPl))
;_修改成下面的就可以 ,忘记改了
(setq ename (AT:DrawPl))
多谢,修改后可以绘多边形了
页:
[1]