;;; ==================================================================
;;;  TXT-IIC.LSP  -  lam viec voi CHU hang loat
;;;  Vien Tin hoc Xay dung (IIC) - Truong Dai hoc Xay dung Ha Noi
;;;  https://iic.huce.edu.vn  -  Tel: 0989 427 809
;;; ------------------------------------------------------------------
;;;  Bon lenh:
;;;    TXC     cong tong cac con so nam trong cac dong chu da chon
;;;    TXN     cong them hoac tru bot mot luong vao MOI con so da chon
;;;    TXL     can le cac dong chu ve cung mot mep (trai / phai / giua)
;;;    TXH     doi chieu cao chu hang loat
;;;
;;;  Vi sao can tep nay: bang khoi luong tren ban ve thuong la chu roi
;;;  chu khong phai bang that. Muon cong mot cot 40 con so thi phai go
;;;  lai vao may tinh, go lai thi sai. Con can le thi lenh JUSTIFYTEXT
;;;  cua Express Tools doi CHUAN CAN LE chu khong DOI CHO chu, nen nhin
;;;  van le loi.
;;;
;;;  BON DIEU CAN BIET TRUOC KHI CHAY:
;;;    1. TXC chi cong nhung dong chu la SO. Dong nao co chu cai thi bo
;;;       qua, va lenh IN RA so dong bi bo qua de khong ai tuong da cong
;;;       het. Dong "12.5 m2" bi bo qua vi co chu m2.
;;;    2. Dau phan cach thap phan phai la DAU CHAM. Dong "12,5" bi BO QUA
;;;       HAN - da do tren ban 2027: no khong thanh 12,5 ma cung khong
;;;       thanh 12, no roi hoan toan khoi phep cong. Day la bay nang nhat
;;;       voi nguoi Viet vi bang tinh thuong dung dau phay, va vi tong
;;;       van ra mot con so trong hop ly.
;;;    3. TXL DOI CHO dong chu chu khong doi chuan can le. Sau khi chay,
;;;       diem chen cua tung dong van nhu cu, chi toa do X bi keo ve cung
;;;       mot gia tri.
;;;    4. Chu nhieu dong (MTEXT) co ma dinh dang trong noi dung, vi du
;;;       "\A1;12.5". TXC da cat cac ma dang \A...; nhung ma la thi van
;;;       lam dong do bi bo qua - va van duoc dem vao so dong bo qua.
;;;  Moi lenh deu IN ra so dong da dung toi, de doi chieu.
;;;
;;;  Ten lenh da do truoc khi dat: tep bi danh acad.pgp cua ban 2027
;;;  khong co TXC, TXN, TXL lan TXH.
;;;
;;;  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)

;;; ------------------------------------------------------------------
;;;  Cat ma dinh dang dau dong cua MTEXT: "\A1;12.5" -> "12.5"
;;; ------------------------------------------------------------------
(defun iic-sach (s / i)
  (if (and s (> (strlen s) 2) (= (substr s 1 1) "\\"))
    (progn
      (setq i (vl-string-search ";" s))
      (if i (substr s (+ i 2)) s)
    )
    s
  )
)

;;; ------------------------------------------------------------------
;;;  Doi mot dong chu thanh so. Tra ve nil neu khong phai so.
;;;  distof tra nil khi chuoi co ky tu la, nen dung duoc lam phep thu.
;;; ------------------------------------------------------------------
(defun iic-so (s / c)
  (setq c (iic-sach s))
  (if c
    (progn
      (setq c (vl-string-trim " \t" c))
      (if (= c "") nil (distof c 2))
    )
  )
)

;;; lay / dat noi dung chu cua mot doi tuong
(defun iic-lay (e) (cdr (assoc 1 (entget e))))
(defun iic-dat (e s)
  (entmod (subst (cons 1 s) (assoc 1 (entget e)) (entget e)))
)

;;; ------------------------------------------------------------------
;;;  TXC - cong tong cac con so
;;; ------------------------------------------------------------------
(defun c:TXC (/ ss i e v tong n bo)
  (princ "\nChon cac dong chu can cong: ")
  (setq ss (ssget '((0 . "TEXT,MTEXT"))))
  (if ss
    (progn
      (setq tong 0.0 n 0 bo 0 i 0)
      (while (< i (sslength ss))
        (setq e (ssname ss i)
              v (iic-so (iic-lay e)))
        (if v
          (setq tong (+ tong v) n (1+ n))
          (setq bo (1+ bo))
        )
        (setq i (1+ i))
      )
      (princ "\n")
      (princ (strcat "\n  So dong cong duoc : " (itoa n)))
      (princ (strcat "\n  So dong bo qua    : " (itoa bo)))
      (princ (strcat "\n  TONG              : " (rtos tong 2 3)))
      (if (> bo 0)
        (princ "\n  (dong bo qua la dong co chu cai, hoac dung dau phay lam dau thap phan)")
      )
      (princ "\n")
      (setq *IIC-TONG* tong)
    )
    (princ "\nKhong chon duoc dong chu nao.")
  )
  (princ)
)

;;; ------------------------------------------------------------------
;;;  TXN - cong them / tru bot mot luong vao moi con so
;;; ------------------------------------------------------------------
(defun c:TXN (/ d ss i e v n bo)
  (setq d (getreal "\nCong them bao nhieu (so am la tru bot): "))
  (if (null d) (progn (princ "\nChua khai so.") (exit)))
  (princ "\nChon cac dong chu can sua: ")
  (setq ss (ssget '((0 . "TEXT,MTEXT"))))
  (if ss
    (progn
      (setq n 0 bo 0 i 0)
      (while (< i (sslength ss))
        (setq e (ssname ss i)
              v (iic-so (iic-lay e)))
        (if v
          (progn (iic-dat e (rtos (+ v d) 2 2)) (setq n (1+ n)))
          (setq bo (1+ bo))
        )
        (setq i (1+ i))
      )
      (princ (strcat "\nDa sua " (itoa n) " dong, bo qua " (itoa bo) " dong."))
    )
    (princ "\nKhong chon duoc dong chu nao.")
  )
  (princ)
)

;;; ------------------------------------------------------------------
;;;  TXL - can le cac dong chu ve cung mot toa do X
;;; ------------------------------------------------------------------
(defun c:TXL (/ k ss i e p x moc ds n)
  (initget "Trai Phai Giua")
  (setq k (getkword "\nCan le theo mep nao [Trai/Phai/Giua] <Trai>: "))
  (if (null k) (setq k "Trai"))
  (princ "\nChon cac dong chu can can le: ")
  (setq ss (ssget '((0 . "TEXT,MTEXT"))))
  (if ss
    (progn
      ;; nhat toa do X cua tung dong
      (setq ds nil i 0)
      (while (< i (sslength ss))
        (setq e (ssname ss i)
              p (cdr (assoc 10 (entget e))))
        (setq ds (cons (cons e (car p)) ds))
        (setq i (1+ i))
      )
      ;; moc can le
      (setq moc (cdar ds))
      (foreach o ds
        (cond
          ((= k "Trai") (if (< (cdr o) moc) (setq moc (cdr o))))
          ((= k "Phai") (if (> (cdr o) moc) (setq moc (cdr o))))
        )
      )
      (if (= k "Giua")
        (progn
          (setq x 0.0)
          (foreach o ds (setq x (+ x (cdr o))))
          (setq moc (/ x (float (length ds))))
        )
      )
      ;; doi cho
      (setq n 0)
      (foreach o ds
        (if (/= (cdr o) moc)
          (progn
            (command "_.MOVE" (car o) "" (list (cdr o) 0.0) (list moc 0.0))
            (setq n (1+ n))
          )
        )
      )
      (princ (strcat "\nDa can le " (itoa (length ds)) " dong theo mep "
                     k ", doi cho " (itoa n) " dong."))
      (princ (strcat "\nToa do X cua moc: " (rtos moc 2 3)))
    )
    (princ "\nKhong chon duoc dong chu nao.")
  )
  (princ)
)

;;; ------------------------------------------------------------------
;;;  TXH - doi chieu cao chu hang loat
;;; ------------------------------------------------------------------
(defun c:TXH (/ h ss i e n)
  (setq h (getreal "\nChieu cao chu moi: "))
  (if (or (null h) (<= h 0)) (progn (princ "\nChieu cao phai lon hon 0.") (exit)))
  (princ "\nChon cac dong chu can doi chieu cao: ")
  (setq ss (ssget '((0 . "TEXT,MTEXT"))))
  (if ss
    (progn
      (setq n 0 i 0)
      (while (< i (sslength ss))
        (setq e (ssname ss i))
        (entmod (subst (cons 40 h) (assoc 40 (entget e)) (entget e)))
        (setq n (1+ n) i (1+ i))
      )
      (princ (strcat "\nDa doi chieu cao " (itoa n) " dong chu thanh " (rtos h 2 2) "."))
      (princ "\nLuu y: chu co ghi chu theo ti le (annotative) thi khong nen doi kieu nay.")
    )
    (princ "\nKhong chon duoc dong chu nao.")
  )
  (princ)
)

(princ "\nTXT-IIC da nap. Lenh: TXC (cong), TXN (cong them/tru bot), TXL (can le), TXH (doi co chu).")
(princ)
