﻿;;; ============================================================
;;;  IN-IIC.lsp  -  In hang loat ban ve ra PDF
;;;  Vien Tin hoc Xay dung - Truong Dai hoc Xay dung Ha Noi
;;;  https://iic.huce.edu.vn
;;;
;;;  INHL   : in hang loat theo KHUNG TEN la block
;;;  INHLC  : in hang loat theo cac HINH CHU NHAT tren mot lop
;;;  INHL1  : in thu MOT khung de kiem thong so truoc khi in ca loat
;;;
;;;  Ma nguon de mo, doc duoc, sua duoc. Chuoi tra loi cua lenh -PLOT trong
;;;  tep nay da duoc do nguyen van tren AutoCAD 2027 tai Vien.
;;; ============================================================

(vl-load-com)

(defun IIC:banner ()
  (princ "\nLisp được lập trình bởi RDSIC - Viện Tin học Xây dựng")
  (princ "\nwebsite: https://iic.huce.edu.vn")
  (princ "\nTel: 0989 427 809")
  (princ))


;;; --- tien ich -------------------------------------------------------

(defun IIC:hoi-chu (nhac mac / v)
  (setq v (getstring t (strcat nhac " <" mac ">: ")))
  (if (= v "") mac v))

(defun IIC:hoi-so (nhac mac / v)
  (initget 4)
  (setq v (getint (strcat nhac " <" (itoa mac) ">: ")))
  (if v v mac))

(defun IIC:so-dem (n rong / s)
  (setq s (itoa n))
  (while (< (strlen s) rong) (setq s (strcat "0" s)))
  s)

(defun IIC:mo-undo () (vla-StartUndoMark (vla-get-ActiveDocument (vlax-get-Acad-Object))))
(defun IIC:dong-undo () (vla-EndUndoMark (vla-get-ActiveDocument (vlax-get-Acad-Object))))

;; gom thanh hang theo dung sai roi xep trai sang phai trong tung hang
(defun IIC:xep-hang (ds dsai / con hang y0 ra)
  (setq con (vl-sort ds '(lambda (a b) (> (cadr (cadr a)) (cadr (cadr b))))))
  (while con
    (setq y0 (cadr (cadr (car con))) hang nil)
    (while (and con (<= (abs (- (cadr (cadr (car con))) y0)) dsai))
      (setq hang (cons (car con) hang) con (cdr con)))
    (setq hang (vl-sort hang '(lambda (a b) (< (car (cadr a)) (car (cadr b))))))
    (setq ra (append ra hang)))
  ra)

;; tam cua mot doi tuong, dung de xep thu tu
(defun IIC:tam (e / o mn mx)
  (setq o (vlax-ename->vla-object e))
  (vla-GetBoundingBox o 'mn 'mx)
  (setq mn (vlax-safearray->list mn) mx (vlax-safearray->list mx))
  (list (/ (+ (car mn) (car mx)) 2.0) (/ (+ (cadr mn) (cadr mx)) 2.0)))

;; hai goc cua mot doi tuong
(defun IIC:goc (e / o mn mx)
  (setq o (vlax-ename->vla-object e))
  (vla-GetBoundingBox o 'mn 'mx)
  (list (vlax-safearray->list mn) (vlax-safearray->list mx)))

;;; --- hoi bo thong so in --------------------------------------------

(defun IIC:hoi-in ()
  (or *iic-may*   (setq *iic-may*   "DWG To PDF.pc3"))
  (or *iic-giay*  (setq *iic-giay*  "ISO full bleed A3 (420.00 x 297.00 MM)"))
  (or *iic-ctb*   (setq *iic-ctb*   "monochrome.ctb"))
  (or *iic-huong* (setq *iic-huong* "L"))
  (or *iic-thu*   (setq *iic-thu*   "C:/In-CAD/"))
  (or *iic-ten*   (setq *iic-ten*   "BanVe"))
  (or *iic-so*    (setq *iic-so*    1))
  (setq *iic-may*   (IIC:hoi-chu "\nMáy in (tên thiết bị)" *iic-may*)
        *iic-giay*  (IIC:hoi-chu "\nKhổ giấy" *iic-giay*)
        *iic-ctb*   (IIC:hoi-chu "\nKiểu in (tệp .ctb), gõ dấu chấm nếu không dùng" *iic-ctb*)
        *iic-huong* (strcase (IIC:hoi-chu "\nHướng giấy: L là ngang, P là dọc" *iic-huong*))
        *iic-thu*   (IIC:hoi-chu "\nThư mục lưu tệp PDF" *iic-thu*)
        *iic-ten*   (IIC:hoi-chu "\nTiền tố tên tệp" *iic-ten*)
        *iic-so*    (IIC:hoi-so  "\nSố bắt đầu" *iic-so*))
  (if (/= (substr *iic-thu* (strlen *iic-thu*)) "/")
    (setq *iic-thu* (strcat *iic-thu* "/")))
  t)

;;; --- in MOT khung ----------------------------------------------------
;;  p1 p2 : hai goc vung in
;;  tep   : duong dan tep PDF
(defun IIC:in-mot (p1 p2 tep / cu)
  (setq cu (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (command "_.-PLOT"
           "_Y"                                  ; che do chi tiet
           ""                                    ; layout hien hanh
           *iic-may*                             ; may in
           *iic-giay*                            ; kho giay
           "_M"                                  ; don vi milimet
           (if (= *iic-huong* "P") "_P" "_L")    ; huong giay
           "_N"                                  ; khong lat nguoc
           "_W"                                  ; vung in la cua so
           (list (car p1) (cadr p1))             ; goc duoi trai
           (list (car p2) (cadr p2))             ; goc tren phai
           "_F"                                  ; vua khung giay
           "_C"                                  ; can giua
           "_Y"                                  ; co dung kieu in
           *iic-ctb*                             ; ten kieu in
           "_Y"                                  ; in theo be rong net
           ""                                    ; kieu to bong: giu mac dinh
           tep                                   ; ten tep ra
           "_N"                                  ; khong ghi de page setup
           "_Y")                                 ; dong y in
  (setvar "cmdecho" cu)
  ;; Trinh ghi PDF hoan tat SAU khi lenh tra quyen ve: do duoc 20/09/2026, tep
  ;; ke tiep moi co ten ma con 0 byte. Vi vay khong dung (findfile) de ket luan,
  ;; ma chi bao da gui di; cuoi lenh dem lai so tep .pdf mot lan nua.
  t)

;; dem so tep .pdf that su co trong thu muc
(defun IIC:dem-tep (thu / ds)
  (setq ds (vl-directory-files thu "*.pdf" 1))
  (if ds (length ds) 0))

;;; --- INHL : in hang loat theo khung ten la block ---------------------
(defun c:INHL (/ ent ten ss i e ds dsai n dem g tep)
  (IIC:banner)
  (setq ent nil)
  (while (not ent)
    (setq ent (car (entsel "\nChọn MỘT khung tên mẫu (phải là block): ")))
    (if (and ent (/= (cdr (assoc 0 (entget ent))) "INSERT"))
      (progn (princ "\nĐó không phải block. Chọn lại.") (setq ent nil))))
  (setq ten (cdr (assoc 2 (entget ent))))
  (princ (strcat "\nTên block khung tên: " ten))
  (IIC:hoi-in)
  (or *iic-dsai* (setq *iic-dsai* 1000.0))
  (setq dsai (atof (IIC:hoi-chu "\nDung sai hàng (hai khung lệch Y nhỏ hơn số này là cùng hàng)" (rtos *iic-dsai* 2 0))))
  (if (<= dsai 0.0) (setq dsai *iic-dsai*))
  (setq *iic-dsai* dsai)
  (princ "\nChọn các khung tên cần in: ")
  (setq ss (ssget (list (cons 0 "INSERT") (cons 2 ten))))
  (if (null ss)
    (princ "\nKhông chọn được khung nào.")
    (progn
      (setq i -1 ds nil)
      (repeat (sslength ss)
        (setq i (1+ i) e (ssname ss i) ds (cons (list e (IIC:tam e)) ds)))
      (setq ds (IIC:xep-hang ds dsai) n *iic-so* dem 0)
      (princ (strcat "\nSẽ in " (itoa (length ds)) " tờ, theo thứ tự từ trái sang phải, trên xuống dưới."))
      (foreach c ds
        (setq g (IIC:goc (car c))
              tep (strcat *iic-thu* *iic-ten* "-" (IIC:so-dem n 3) ".pdf"))
        (princ (strcat "\n  -> " tep))
        (IIC:in-mot (car g) (cadr g) tep)
        (setq dem (1+ dem))
        (setq n (1+ n)))
      (setq *iic-so* n)
      (princ (strcat "\nXong: đã gửi " (itoa dem) " tờ sang máy in."))
      (princ (strcat "\nTrong thư mục hiện có " (itoa (IIC:dem-tep *iic-thu*)) " tep .pdf: " *iic-thu*))))
  (princ))

;;; --- INHLC : in hang loat theo hinh chu nhat tren mot lop -------------
(defun c:INHLC (/ lop ss i e ds dsai n dem g tep)
  (IIC:banner)
  (or *iic-lop* (setq *iic-lop* "KHUNG-IN"))
  (setq *iic-lop* (IIC:hoi-chu "\nTên lớp chứa các hình chữ nhật khung in" *iic-lop*))
  (IIC:hoi-in)
  (or *iic-dsai* (setq *iic-dsai* 1000.0))
  (setq dsai (atof (IIC:hoi-chu "\nDung sai hàng (hai khung lệch Y nhỏ hơn số này là cùng hàng)" (rtos *iic-dsai* 2 0))))
  (if (<= dsai 0.0) (setq dsai *iic-dsai*))
  (setq *iic-dsai* dsai)
  (princ "\nChọn các hình chữ nhật khung in: ")
  (setq ss (ssget (list (cons 0 "LWPOLYLINE") (cons 8 *iic-lop*))))
  (if (null ss)
    (princ "\nKhông chọn được hình chữ nhật nào trên lớp đó.")
    (progn
      (setq i -1 ds nil)
      (repeat (sslength ss)
        (setq i (1+ i) e (ssname ss i) ds (cons (list e (IIC:tam e)) ds)))
      (setq ds (IIC:xep-hang ds dsai) n *iic-so* dem 0)
      (princ (strcat "\nSẽ in " (itoa (length ds)) " tờ, theo thứ tự từ trái sang phải, trên xuống dưới."))
      (foreach c ds
        (setq g (IIC:goc (car c))
              tep (strcat *iic-thu* *iic-ten* "-" (IIC:so-dem n 3) ".pdf"))
        (princ (strcat "\n  -> " tep))
        (IIC:in-mot (car g) (cadr g) tep)
        (setq dem (1+ dem))
        (setq n (1+ n)))
      (setq *iic-so* n)
      (princ (strcat "\nXong: đã gửi " (itoa dem) " tờ sang máy in."))
      (princ (strcat "\nTrong thư mục hiện có " (itoa (IIC:dem-tep *iic-thu*)) " tep .pdf: " *iic-thu*))))
  (princ))

;;; --- INHL1 : in thu MOT khung ----------------------------------------
(defun c:INHL1 (/ p1 p2 tep)
  (IIC:banner)
  (princ "\nIn thử một khung để kiểm thông số trước khi in cả loạt.")
  (setq p1 (getpoint "\nGóc dưới trái vùng in: "))
  (if p1 (setq p2 (getcorner p1 "\nGóc trên phải vùng in: ")))
  (if (and p1 p2)
    (progn
      (IIC:hoi-in)
      (setq tep (strcat *iic-thu* *iic-ten* "-thu.pdf"))
      (princ (strcat "\n  -> " tep))
      (if (IIC:in-mot p1 p2 tep)
        (princ "\nĐã tạo được tệp. Nếu mở ra thấy đúng thì chạy INHL cho cả loạt.")
        (princ "\nKHÔNG tạo được tệp. Kiểm lại tên máy in, khổ giấy và thư mục.")))
    (princ "\nChưa chọn đủ hai góc."))
  (princ))

;;; ten goi du phong, khong bao gio bi lisp khac chiem
(defun c:INHLIIC  () (c:INHL))
(defun c:INHLCIIC () (c:INHLC))
(defun c:INHL1IIC () (c:INHL1))

(princ)
(IIC:banner)
(princ "\nĐã nạp IN-IIC. Lệnh: INHL (theo khung tên block), INHLC (theo hình chữ nhật),\nINHL1 (in thử một khung). Tên dự phòng: INHLIIC / INHLCIIC / INHL1IIC.\n")
(princ)
