;;; ==================================================================
;;;  DCD-IIC.LSP  -  cong tong chieu dai cac doi tuong da chon
;;;  Vien Tin hoc Xay dung (IIC) - Truong Dai hoc Xay dung Ha Noi
;;;  https://iic.huce.edu.vn  -  Tel: 0989 427 809
;;; ------------------------------------------------------------------
;;;  Ba lenh:
;;;    TCD     chon doi tuong, in tong chieu dai ra dong lenh
;;;    TCDT    nhu tren, roi ghi con so ay thanh mot dong chu tren ban ve
;;;    TCDL    cong rieng tung LOP (layer) va in thanh bang
;;;
;;;  Vi sao can tep nay: lenh LIST doc tung doi tuong mot, lenh MEASUREGEOM
;;;  chi do mot doi tuong moi lan. Muon biet tong chieu dai 300 doan ong
;;;  hay 80 doan duong bao thi phai cong tay, va cong tay thi sai.
;;;
;;;  Cach lam: dung vlax-curve-getDistAtParam tren tham so cuoi cua
;;;  duong. Ham nay dung cho MOI loai duong cong nen khong phai viet
;;;  rieng cho line, cung tron, da tuyen, elip hay spline.
;;;
;;;  BON DIEU CAN BIET TRUOC KHI CHAY - cac tep tren mang khong noi:
;;;    1. HAI NET NAM CHONG LEN NHAU duoc cong HAI lan. May khong biet
;;;       chung trung nhau. Chay lenh OVERKILL don net trung truoc khi
;;;       cong, neu khong con so se lon hon thuc te.
;;;    2. DUONG TRON va ELIP duoc tinh bang CHU VI. Neu ban chi muon
;;;       chieu dai cac doan thang thi dung loc bo chung o bang phan
;;;       loai ma lenh in ra.
;;;    3. DOI TUONG NAM TRONG BLOCK KHONG duoc tinh. Chi dem nhung gi
;;;       nam truc tiep tren ban ve. Muon tinh thi pha block ra truoc,
;;;       hoac dem rieng roi nhan so ban chen.
;;;    4. DA TUYEN CO BE RONG van duoc tinh theo DUONG TIM, khong phai
;;;       theo mep. Dung cho ong nuoc, sai cho tuong ve bang da tuyen.
;;;  Sau khi chay, lenh IN ra bang phan loai theo tung loai doi tuong,
;;;  de doi chieu chu khong phai tin mot con so tron.
;;;
;;;  Don vi: con so in ra dung DON VI BAN VE. Ban ve don vi mm thi ket
;;;  qua la mm. Lenh in ra ca con so chia cho 1000 de doc nhanh ra met.
;;;
;;;  Ten lenh da do truoc khi dat: tep bi danh acad.pgp cua ban 2027
;;;  khong co TCD, TCDT lan TCDL.
;;;
;;;  Nap tep: go APPLOAD, chon tep nay, bam Load.
;;;  Tep luu bang ma UTF-8. Sua bang Notepad thi nho luu lai dung UTF-8.
;;; ==================================================================

(vl-load-com)

;;; ------------------------------------------------------------------
;;;  Chieu dai cua MOT doi tuong. Tra ve nil neu doi tuong khong phai
;;;  duong cong (chu, hatch, block...).
;;; ------------------------------------------------------------------
(defun iic-dai (e / p)
  (if (and e (not (vl-catch-all-error-p
                    (setq p (vl-catch-all-apply
                              'vlax-curve-getEndParam (list e))))))
    (if p
      (vl-catch-all-apply 'vlax-curve-getDistAtParam (list e p))
    )
  )
)

;;; ------------------------------------------------------------------
;;;  Gom mot tap chon thanh danh sach (loai . (so_luong . tong_dai))
;;; ------------------------------------------------------------------
(defun iic-gom (ss / i e loai d bang o bo)
  (setq bang nil bo 0 i 0)
  (while (< i (sslength ss))
    (setq e    (ssname ss i)
          loai (cdr (assoc 0 (entget e)))
          d    (iic-dai e))
    (if (and d (numberp d))
      (progn
        (setq o (assoc loai bang))
        (if o
          (setq bang (subst (cons loai (cons (1+ (cadr o)) (+ (cddr o) d)))
                            o bang))
          (setq bang (cons (cons loai (cons 1 d)) bang))
        )
      )
      (setq bo (1+ bo))
    )
    (setq i (1+ i))
  )
  (cons bang bo)
)

;;; ------------------------------------------------------------------
;;;  In bang phan loai + tong. Tra ve tong chieu dai.
;;; ------------------------------------------------------------------
(defun iic-in (bang bo / tong)
  (setq tong 0.0)
  (princ "\n")
  (princ "\n  Loai doi tuong        So luong      Chieu dai")
  (princ "\n  ---------------------------------------------")
  (foreach o (reverse bang)
    (setq tong (+ tong (cddr o)))
    (princ (strcat "\n  " (iic-dem (car o) 20)
                   (iic-phai (itoa (cadr o)) 8)
                   (iic-phai (rtos (cddr o) 2 2) 15)))
  )
  (princ "\n  ---------------------------------------------")
  (princ (strcat "\n  TONG" (iic-phai (rtos tong 2 2) 39)))
  (princ (strcat "\n  Chia 1000" (iic-phai (rtos (/ tong 1000.0) 2 3) 34)))
  (if (> bo 0)
    (princ (strcat "\n  Bo qua " (itoa bo)
                   " doi tuong khong phai duong (chu, hatch, block...)"))
  )
  (princ "\n")
  tong
)

;;; canh trai trong o rong n
(defun iic-dem (s n)
  (while (< (strlen s) n) (setq s (strcat s " ")))
  s
)
;;; canh phai trong o rong n
(defun iic-phai (s n)
  (while (< (strlen s) n) (setq s (strcat " " s)))
  s
)

;;; ------------------------------------------------------------------
;;;  TCD - cong tong chieu dai, in ra dong lenh
;;; ------------------------------------------------------------------
(defun c:TCD (/ ss r)
  (princ "\nChon cac doi tuong can cong chieu dai: ")
  (setq ss (ssget))
  (if ss
    (progn
      (setq r (iic-gom ss))
      (iic-in (car r) (cdr r))
    )
    (princ "\nKhong chon duoc gi.")
  )
  (princ)
)

;;; ------------------------------------------------------------------
;;;  TCDT - cong roi ghi ket qua thanh mot dong chu tren ban ve
;;; ------------------------------------------------------------------
(defun c:TCDT (/ ss r tong p cao chu)
  (princ "\nChon cac doi tuong can cong chieu dai: ")
  (setq ss (ssget))
  (if ss
    (progn
      (setq r    (iic-gom ss)
            tong (iic-in (car r) (cdr r)))
      (setq p (getpoint "\nChi cho dat dong chu: "))
      (if p
        (progn
          (setq cao (getvar "TEXTSIZE"))
          (if (or (null cao) (<= cao 0)) (setq cao 2.5))
          (setq chu (strcat "Tong chieu dai = " (rtos tong 2 2)))
          (entmake (list (cons 0 "TEXT")
                         (cons 10 p)
                         (cons 40 cao)
                         (cons 1 chu)))
          (princ (strcat "\nDa ghi: " chu))
        )
      )
    )
    (princ "\nKhong chon duoc gi.")
  )
  (princ)
)

;;; ------------------------------------------------------------------
;;;  TCDL - cong rieng tung lop
;;; ------------------------------------------------------------------
(defun c:TCDL (/ ss i e lop d bang o tong bo)
  (princ "\nChon cac doi tuong can cong theo lop: ")
  (setq ss (ssget))
  (if ss
    (progn
      (setq bang nil bo 0 i 0)
      (while (< i (sslength ss))
        (setq e   (ssname ss i)
              lop (cdr (assoc 8 (entget e)))
              d   (iic-dai e))
        (if (and d (numberp d))
          (progn
            (setq o (assoc lop bang))
            (if o
              (setq bang (subst (cons lop (cons (1+ (cadr o)) (+ (cddr o) d)))
                                o bang))
              (setq bang (cons (cons lop (cons 1 d)) bang))
            )
          )
          (setq bo (1+ bo))
        )
        (setq i (1+ i))
      )
      (setq tong 0.0)
      (princ "\n")
      (princ "\n  Lop                   So luong      Chieu dai")
      (princ "\n  ---------------------------------------------")
      (foreach o (reverse bang)
        (setq tong (+ tong (cddr o)))
        (princ (strcat "\n  " (iic-dem (car o) 20)
                       (iic-phai (itoa (cadr o)) 8)
                       (iic-phai (rtos (cddr o) 2 2) 15)))
      )
      (princ "\n  ---------------------------------------------")
      (princ (strcat "\n  TONG" (iic-phai (rtos tong 2 2) 39)))
      (if (> bo 0)
        (princ (strcat "\n  Bo qua " (itoa bo) " doi tuong khong phai duong"))
      )
      (princ "\n")
    )
    (princ "\nKhong chon duoc gi.")
  )
  (princ)
)

(princ "\nDCD-IIC da nap. Lenh: TCD (in ra dong lenh), TCDT (ghi thanh chu), TCDL (tach theo lop).")
(princ)
