;;; ==================================================================
;;;  NTD-IIC.LSP  -  doc toa do tu tep CSV (xuat tu Excel) vao ban ve
;;;  Vien Tin hoc Xay dung (IIC) - Truong Dai hoc Xay dung Ha Noi
;;;  https://iic.huce.edu.vn  -  Tel: 0989 427 809
;;; ------------------------------------------------------------------
;;;  Ba lenh:
;;;    NTD     doc tep CSV, cham diem va ghi so hieu tung diem
;;;    NTDP    doc tep CSV, noi cac diem thanh mot da tuyen
;;;    NTDK    doc tep CSV roi chi DEM va IN ra, khong ve gi
;;;
;;;  Vi sao can tep nay: AutoCAD khong doc duoc bang tinh. Cach duy nhat
;;;  san co la chen bang Excel lam doi tuong OLE - nhin thi giong bang
;;;  nhung KHONG phai toa do, khong bat diem duoc, khong do duoc. Muon
;;;  dua 200 diem do dac tu Excel vao ban ve thi phai go tay tung cap so.
;;;
;;;  DANG TEP DOC DUOC: tep van ban thuong, moi dong mot diem.
;;;       so_hieu,X,Y        hoac       X,Y
;;;  Tu Excel: File > Save As > CSV (Comma delimited).
;;;
;;;  NAM DIEU CAN BIET TRUOC KHI CHAY:
;;;    1. QUY UOC TRUC. Trac dia Viet Nam lay X la truc BAC, Y la truc
;;;       DONG, con AutoCAD lay X ngang Y doc. Lenh HOI ban truoc khi ve
;;;       chu khong tu doi bua. Chon sai la ban ve quay 90 do.
;;;    2. DAU THAP PHAN. Tep xuat tu Excel dat ngon ngu tieng Viet dung
;;;       dau PHAY lam dau thap phan. Lenh doc duoc ca kieu ay: con so
;;;       nao khong doc duoc ma co dau phay thi thu lai sau khi doi thanh
;;;       dau cham, VA BAO RA o cuoi da doi bao nhieu con so. Khong sua
;;;       lut mot cai nao.
;;;    3. DONG DAU tep thuong la tieu de cot. Dong nao khong doc ra so
;;;       thi tu dong bi bo qua, nen khong phai xoa tieu de truoc.
;;;    4. DAU PHAN CACH COT chon theo TUNG DONG: dong nao co dau cham
;;;       phay thi tach theo cham phay, khong thi tach theo dau phay.
;;;       Tach theo ca hai cung luc la sai: dong "1;2000,5;1000,5" se vo
;;;       thanh nam manh va lenh lay nham (2000, 5) lam toa do - da do
;;;       duoc loi nay khi thu, va da sua.
;;;    5. Diem cham ra la doi tuong POINT. Muon nhin thay thi dat kieu
;;;       diem bang lenh DDPTYPE, vi kieu mac dinh la mot cham gan nhu
;;;       khong thay gi.
;;;  Sau khi chay, lenh IN ra so dong doc duoc va so dong bo qua.
;;;
;;;  Ten lenh da do truoc khi dat: tep bi danh acad.pgp cua ban 2027
;;;  khong co NTD, NTDP lan NTDK.
;;;
;;;  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)

;;; ------------------------------------------------------------------
;;;  Tach mot dong thanh danh sach chuoi.
;;;
;;;  Dau phan cach cot chon THEO TUNG DONG: dong nao co DAU CHAM PHAY
;;;  thi tach theo cham phay, khong thi tach theo dau phay.
;;;
;;;  KHONG duoc tach theo ca hai cung luc. Da do tren ban 2027: dong
;;;  "1;2000,5;1000,5" (kieu Excel ngon ngu tieng Viet) khi tach theo ca
;;;  hai se vo thanh NAM manh 1 / 2000 / 5 / 1000 / 5, roi lenh lay nham
;;;  hai manh dau thanh toa do (2000, 5). Diem roi vao cho hoan toan
;;;  khac ma KHONG co dau hieu gi bao sai - nguy hiem hon han viec bo qua.
;;; ------------------------------------------------------------------
(defun iic-tach (s / ds o c i pc)
  (setq pc (if (vl-string-search ";" s) ";" ","))
  (setq ds nil o "" i 1)
  (while (<= i (strlen s))
    (setq c (substr s i 1))
    (if (= c pc)
      (progn (setq ds (cons o ds)) (setq o ""))
      (setq o (strcat o c))
    )
    (setq i (1+ i))
  )
  (reverse (cons o ds))
)

;;; ------------------------------------------------------------------
;;;  Doi chuoi thanh so, nil neu khong phai so.
;;;
;;;  Neu chuoi khong doc duoc va co DAU PHAY thi thu lai mot lan nua sau
;;;  khi doi dau phay thanh dau cham - day la tep xuat tu Excel dat ngon
;;;  ngu tieng Viet. Moi lan phai doi nhu vay deu duoc DEM va BAO ra o
;;;  cuoi, chu khong sua lut.
;;; ------------------------------------------------------------------
(defun iic-so (s / v)
  (if s
    (progn
      (setq s (vl-string-trim " \t\r\n\"" s))
      (cond
        ((= s "") nil)
        ((setq v (distof s 2)) v)
        ((vl-string-search "," s)
         (setq v (distof (vl-string-translate "," "." s) 2))
         (if v (progn (setq *IIC-DOIPHAY* (1+ (if *IIC-DOIPHAY* *IIC-DOIPHAY* 0))) v))
        )
        (T nil)
      )
    )
  )
)

;;; ------------------------------------------------------------------
;;;  Doc tep, tra ve danh sach (so_hieu x y) theo TRUC CUA AUTOCAD
;;;  qu = "T" (trac dia: cot thu nhat sau so hieu la X-bac)
;;;       "C" (cad: cot thu nhat sau so hieu la X-ngang)
;;;  Tra ve (danh_sach . so_dong_bo_qua)
;;; ------------------------------------------------------------------
(defun iic-doc (tep qu / f dong o a b n ds bo stt)
  (setq f (open tep "r"))
  (if (null f)
    nil
    (progn
      (setq ds nil bo 0 stt 0 *IIC-DOIPHAY* 0)
      (while (setq dong (read-line f))
        (setq o (iic-tach dong))
        (cond
          ;; ba cot tro len: so_hieu , so , so
          ;; Doi chuoi thanh so NGAY TRONG phep thu, khong goi iic-so hai
          ;; lan cho cung mot o: goi hai lan thi bo dem "da doi dau phay"
          ;; cong len gap doi, va con so bao cho nguoi dung se sai.
          ((and (>= (length o) 3)
                (setq a (iic-so (nth 1 o)))
                (setq b (iic-so (nth 2 o))))
           (setq ds (cons (list (vl-string-trim " \t\r\n\"" (nth 0 o))
                                (if (= qu "T") b a)
                                (if (= qu "T") a b)) ds))
          )
          ;; hai cot: so , so
          ((and (= (length o) 2)
                (setq a (iic-so (nth 0 o)))
                (setq b (iic-so (nth 1 o))))
           (setq stt (1+ stt))
           (setq ds (cons (list (itoa stt)
                                (if (= qu "T") b a)
                                (if (= qu "T") a b)) ds))
          )
          (T (setq bo (1+ bo)))
        )
      )
      (close f)
      (cons (reverse ds) bo)
    )
  )
)

;;; hoi tep + quy uoc truc, tra ve (danh_sach . bo_qua) hoac nil
(defun iic-hoi (/ tep qu r)
  (setq tep (getfiled "Chon tep toa do (CSV hoac TXT)" "" "csv;txt" 4))
  (if (null tep)
    (progn (princ "\nChua chon tep.") nil)
    (progn
      (initget "Tracdia Cad")
      (setq qu (getkword "\nQuy uoc truc [Tracdia/Cad] <Tracdia>: "))
      (if (null qu) (setq qu "Tracdia"))
      (setq r (iic-doc tep (if (= qu "Tracdia") "T" "C")))
      (if (null r)
        (progn (princ "\nKhong mo duoc tep.") nil)
        (progn
          (princ (strcat "\n  Doc duoc : " (itoa (length (car r))) " diem"))
          (princ (strcat "\n  Bo qua   : " (itoa (cdr r)) " dong"))
          (if (> (cdr r) 0)
            (princ "\n  (dong tieu de, dong trong, hoac dong khong doc ra so)")
          )
          (if (and *IIC-DOIPHAY* (> *IIC-DOIPHAY* 0))
            (princ (strcat "\n  Da doi dau phay thanh dau cham o "
                           (itoa *IIC-DOIPHAY*)
                           " con so (tep xuat tu Excel tieng Viet)."))
          )
          r
        )
      )
    )
  )
)

;;; ------------------------------------------------------------------
;;;  NTD - cham diem va ghi so hieu
;;; ------------------------------------------------------------------
(defun c:NTD (/ r ds cao o)
  (setq r (iic-hoi))
  (if r
    (progn
      (setq ds (car r))
      (setq cao (getvar "TEXTSIZE"))
      (if (or (null cao) (<= cao 0)) (setq cao 2.5))
      (foreach o ds
        (entmake (list (cons 0 "POINT") (cons 10 (list (cadr o) (caddr o) 0.0))))
        (entmake (list (cons 0 "TEXT")
                       (cons 10 (list (+ (cadr o) (* cao 0.5))
                                      (+ (caddr o) (* cao 0.5)) 0.0))
                       (cons 40 cao)
                       (cons 1 (car o))))
      )
      (princ (strcat "\n  Da cham " (itoa (length ds)) " diem kem so hieu."))
      (princ "\n  Neu khong thay diem thi go DDPTYPE roi chon mot kieu diem de nhin.")
    )
  )
  (princ)
)

;;; ------------------------------------------------------------------
;;;  NTDP - noi cac diem thanh mot da tuyen
;;; ------------------------------------------------------------------
(defun c:NTDP (/ r ds kin dt o)
  (setq r (iic-hoi))
  (if r
    (progn
      (setq ds (car r))
      (if (< (length ds) 2)
        (princ "\n  Can it nhat hai diem moi noi duoc.")
        (progn
          (initget "Co Khong")
          (setq kin (getkword "\nKhep kin da tuyen [Co/Khong] <Khong>: "))
          (setq dt (list (cons 0 "LWPOLYLINE")
                         (cons 100 "AcDbEntity")
                         (cons 100 "AcDbPolyline")
                         (cons 90 (length ds))
                         (cons 70 (if (= kin "Co") 1 0))))
          (foreach o ds
            (setq dt (append dt (list (cons 10 (list (cadr o) (caddr o))))))
          )
          (entmake dt)
          (princ (strcat "\n  Da noi " (itoa (length ds)) " diem thanh mot da tuyen."))
        )
      )
    )
  )
  (princ)
)

;;; ------------------------------------------------------------------
;;;  NTDK - chi doc va in ra, khong ve gi
;;; ------------------------------------------------------------------
(defun c:NTDK (/ r ds o n)
  (setq r (iic-hoi))
  (if r
    (progn
      (setq ds (car r) n 0)
      (princ "\n")
      (princ "\n  So hieu        X (cad)          Y (cad)")
      (princ "\n  ---------------------------------------------")
      (foreach o ds
        (setq n (1+ n))
        (if (<= n 20)
          (princ (strcat "\n  " (car o) "\t" (rtos (cadr o) 2 3)
                         "\t" (rtos (caddr o) 2 3)))
        )
      )
      (if (> n 20) (princ (strcat "\n  ... va " (itoa (- n 20)) " diem nua")))
      (princ "\n")
    )
  )
  (princ)
)

(princ "\nNTD-IIC da nap. Lenh: NTD (cham diem), NTDP (noi da tuyen), NTDK (chi doc thu).")
(princ)
