;;;岛的判断
(defun getisland (/ en mplaer ss ss_len ii en
key obj area ptext een area0 pt0
)
(vl-load-com)
(setq en (car (entsel)))
(setq layer (assoc 8 (entget en)))
(setq key (emt_eedvalue en "landuse" "id3"))
(setq obj (vlax-ename->vla-object en))
(setq area (vla-get-area obj))
(setq ss (ssget "c"
(list (nth 0 ptext) (nth 1 ptext))
(list (nth 2 ptext) (nth 3 ptext))
(list (cons 0 "*polyline") (cons 8 layer))
)
)
(if ss
(setq ss (ssdel en ss))
)
(if ss
(setq ss_len (sslength ss)
ii 0
)
(setq ss_len 0
ii 0
)
)
(while (< ii ss_len)
(setq een (ssname ss ii))
(setq obj (vlax-ename->vla-object een))
(setq area0 (vla-get-area obj))
(setq pt0 (emt_labelpofpolygon een))
(if (and (emt_pointinpoly en pt0)
(> (- area area0) 0.01)
(= (emt_eedvalue een code id) key)
)
(progn
(setq s1 (cons een s1))
)
)
(setq ii (1+ ii))
)
s1
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun myarea (en / endata layer en_pt ytm
area ptext ptmin ptmax lar_s
enext_larpoly en1 area1 ytm1 ptext1
ptmin1 ptmax1 lar_s1 lars1_len en2
area2 ytm2
)
(setq rearea 0)
(setq endata (entget en))
(setq layer (cdr (assoc 8 endata)))
(setq en_pt (cdr (assoc 10 endata)))
(setq ytm (emt_eedvalue en "landuse" "id3"))
(setq area (vla-get-area (vlax-ename->vla-object en)))
(setq rearea area)
(setq ptext (emt_getextent en))
(setq ptmin (list (nth 0 ptext) (nth 1 ptext))
ptmax (list (nth 2 ptext) (nth 3 ptext))
)
;;; 得到该图元包含的,被包含的,相碰的多边形的选择集(不包含该图元).
(setq lar_s (ssget "c"
ptmin
ptmax
(list (cons 8 layer) (cons 0 "*polyline"))
)
)
(command "undo" "m")
(command "erase" en "")
(setq enext_larpoly (emt_getpoly layer en_pt))
(command "undo" "b")
(if (and enext_larpoly
(not (equal enext_larpoly en))
(emt_pointinpoly enext_larpoly (emt_labelpofpolygon en))
)
(progn
(ssadd enext_larpoly lar_s)
(setq island_to T)
)
(setq island_to nil)
)
(ssdel en lar_s)
(if lar_s
(setq lars_len (sslength lar_s)
lars_i 0
)
(setq lars_len 0
lars_i 0
)
)
(setq island_own nil)
;;; 计算面积.
;;; 该实体为岛,面积直接为图形面积,否则计算含岛的面积.
(while (< lars_i lars_len)
(setq en1 (ssname lar_s lars_i))
(setq area1 (vla-get-area (vlax-ename->vla-object en1)))
(setq ytm1 (emt_eedvalue en1 "landuse" "id3"))
(if (and (< area1 area)
(= ytm1 ytm)
(emt_pointinpoly en (emt_labelpofpolygon en1))
)
(progn
(setq rearea (- rearea area1))
(setq island_own T)
(setq ptext1 (emt_getextent en1))
(setq ptmin1 (list (nth 0 ptext1) (nth 1 ptext1))
ptmax1 (list (nth 2 ptext1) (nth 3 ptext1))
)
(setq lar_s1 (ssget "c"
ptmin1
ptmax1
(list (cons 8 layer) (cons 0 "*polyline"))
)
)
(ssdel en1 lar_s1)
(if lar_s1
(setq lars1_len (sslength lar_s1)
lars_i1 0
)
(setq lars1_len 0
lars_i1 0
)
)
(while (< lars_i1 lars1_len)
(setq en2 (ssname lar_s1 lars_i1))
(setq area2 (vla-get-area (vlax-ename->vla-object en2)))
(setq ytm2 (emt_eedvalue en2 "landuse" "id3"))
(if (and (< area2 area1)
(= ytm2 ytm1)
(emt_pointinpoly en1 (emt_labelpofpolygon en2))
)
(progn
(setq rearea (+ rearea area2))
)
)
(setq lars_i1 (1+ lars_i1))
)
)
)
(setq lars_i (1+ lars_i))
)
rearea
island_to
island_own
)