• autocad计算带岛图形的面积


    ;;;岛的判断
    (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
    )
  • 相关阅读:
    07-selenium、PhantomJS(无头浏览器)
    06爬虫-异步协程
    Numpy数值类型与数值运算-03
    05爬虫-requests模块基础(2)
    初识Matplotlib-01
    03爬虫-requests模块基础(1)
    Django安装与简单事例-02
    JavaWeb学习总结(二):Http协议
    Tomcat学习总结(一):目录简介
    Web服务器学习总结(一):web服务器简介
  • 原文地址:https://www.cnblogs.com/cthulhu/p/2942774.html
Copyright © 2020-2023  润新知