874185423 发表于 2011-9-17 13:20:53

求助:多边形内高程点的最大值和最小值



编程要求步骤:1,选择高程点的范围:(1,选择已有的多边形,2,绘制高程点范围)
                      2,显示最大高程值和最小高程值,并标注在多边形内。


gufeng 发表于 2011-9-17 13:20:54

;_选择与绘制的多边形要在完全显示在当前屏幕内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)
)

874185423 发表于 2011-9-22 06:19:00

多谢gufeng,能够显示最大和最小高程值,但是绘制多边形不可用,希望能修改下

gufeng 发表于 2011-9-22 19:40:19


;_把这句
(setq ename (DrawPl))
;_修改成下面的就可以 ,忘记改了
(setq ename (AT:DrawPl))

874185423 发表于 2011-9-24 13:08:33

多谢,修改后可以绘多边形了
页: [1]
查看完整版本: 求助:多边形内高程点的最大值和最小值