plaintext paste
;;;===========================================================
;;;  Multi-Region Circle Counter  v6.0
;;;  Command: JMKTJ
;;;  Output: CSV file (open with Excel)
;;;===========================================================

(defun c:JMKTJ (/ ss ssb ssc sst regs res i e et pts obj cen rad
               dlist txt pt fname fp line)

  (setvar "cmdecho" 0)

  (princ "\nSelect all objects: ")
  (setq ss (ssget))
  (if (null ss) (progn (princ "\nNothing selected!") (exit)))

  (setq ssb (ssadd) ssc (ssadd) sst (ssadd))
  (setq i 0)
  (repeat (sslength ss)
    (setq e (ssname ss i))
    (setq et (cdr (assoc 0 (entget e))))
    (cond
      ((member et '("LINE" "LWPOLYLINE" "POLYLINE" "ELLIPSE" "SPLINE" "ARC"))
        (ssadd e ssb))
      ((= et "CIRCLE")
        (ssadd e ssb)
        (ssadd e ssc))
      ((member et '("TEXT" "MTEXT"))
        (ssadd e sst))
    )
    (setq i (1+ i))
  )

  (if (< (sslength ssb) 1) (progn (princ "\nNo boundary!") (exit)))
  (if (< (sslength ssc) 1) (progn (princ "\nNo circle!") (exit)))
  (if (< (sslength sst) 1) (progn (princ "\nNo text!") (exit)))

  ;; Build region point lists
  (setq regs '())
  (setq i 0)
  (repeat (sslength ssb)
    (setq e (ssname ssb i))
    (setq et (cdr (assoc 0 (entget e))))
    (setq pts '())

    (cond
      ((= et "LINE")
        (setq pts (list (cdr (assoc 10 (entget e)))
                        (cdr (assoc 11 (entget e))))))

      ((or (= et "LWPOLYLINE") (= et "POLYLINE"))
        (setq obj (vlax-ename->vla-object e))
        (setq n (fix (vlax-curve-getEndParam obj)))
        (setq j 0)
        (while (<= j n)
          (setq pt (vlax-curve-getPointAtParam obj j))
          (if pt (setq pts (append pts (list pt))))
          (setq j (1+ j))))

      ((= et "CIRCLE")
        (setq obj (vlax-ename->vla-object e))
        (setq cen (vlax-get obj 'Center))
        (setq rad (vlax-get obj 'Radius))
        (setq j 0)
        (while (< j 36)
          (setq pt (list (+ (car cen) (* rad (cos (* j 0.1745))))
                         (+ (cadr cen) (* rad (sin (* j 0.1745)))) 0))
          (setq pts (append pts (list pt)))
          (setq j (1+ j))))

      ((= et "ELLIPSE")
        (setq obj (vlax-ename->vla-object e))
        (setq cen (vlax-get obj 'Center))
        (setq ma (vlax-get obj 'MajorAxis))
        (setq mi (vlax-get obj 'MinorAxis))
        (setq ml (sqrt (+ (* (car ma) (car ma)) (* (cadr ma) (cadr ma)))))
        (setq sl (sqrt (+ (* (car mi) (car mi)) (* (cadr mi) (cadr mi)))))
        (setq j 0)
        (while (< j 36)
          (setq pt (list (+ (car cen) (* ml (cos (* j 0.1745))))
                         (+ (cadr cen) (* sl (sin (* j 0.1745)))) 0))
          (setq pts (append pts (list pt)))
          (setq j (1+ j))))

      ((= et "SPLINE")
        (setq obj (vlax-ename->vla-object e))
        (setq sp (vlax-curve-getStartParam obj))
        (setq ep (vlax-curve-getEndParam obj))
        (setq j 0)
        (while (<= j 50)
          (setq pt (vlax-curve-getPointAtParam obj (+ sp (* j (/ (- ep sp) 50)))))
          (if pt (setq pts (append pts (list pt))))
          (setq j (1+ j))))

      ((= et "ARC")
        (setq obj (vlax-ename->vla-object e))
        (setq cen (vlax-get obj 'Center))
        (setq rad (vlax-get obj 'Radius))
        (setq sa (vlax-get obj 'StartAngle))
        (setq ea (vlax-get obj 'EndAngle))
        (setq j 0)
        (while (<= j 20)
          (setq pt (list (+ (car cen) (* rad (cos (+ sa (* j (/ (- ea sa) 20))))))
                         (+ (cadr cen) (* rad (sin (+ sa (* j (/ (- ea sa) 20)))))) 0))
          (setq pts (append pts (list pt)))
          (setq j (1+ j))))
    )

    (if (> (length pts) 2)
      (setq regs (append regs (list pts))))
    (setq i (1+ i))
  )

  ;; Point in polygon
  (defun pip (pt pts / in i j xi yi xj yj)
    (setq in nil i 0 j (1- (length pts)))
    (while (< i (length pts))
      (setq xi (car (nth i pts)) yi (cadr (nth i pts)))
      (setq xj (car (nth j pts)) yj (cadr (nth j pts)))
      (if (and (or (> yi (cadr pt)) (> yj (cadr pt)))
               (or (< yi (cadr pt)) (< yj (cadr pt)))
               (or (< xi (car pt)) (< xj (car pt))))
        (if (< xi (+ (* (- (car pt) xi) (/ (- yj yi) (- xj xi))) (car pt)))
          (setq in (not in))))
      (setq j i i (1+ i)))
    in)

  ;; Process each region
  (setq res '())
  (foreach rg regs
    (setq dlist '() i 0)
    (repeat (sslength ssc)
      (setq e (ssname ssc i))
      (setq cen (cdr (assoc 10 (entget e))))
      (if (pip