AutoCAD – Bản vẽ

Lisp in hàng loạt trong CAD: cả tập khung tên ra PDF một lượt

Lisp in hàng loạt trong CAD in cả tập khung tên ra PDF một lượt. Nhập thông số bằng hộp thoại, ghi nhớ cho lần sau. Tải tệp mở của Viện, đọc được mã.

  • TS. Đỗ Quốc Hoàng
  • 16 phút đọc
Bốn khung tên khổ A3 xếp trong model, in ra bốn tệp PDF trong một lượt lệnh Ảnh: AutoCAD 2027

Một bộ hồ sơ ba chục tờ mà in từng tờ thì mất cả buổi chiều, nên lisp in hàng loạt trong CAD là tệp được tìm nhiều thứ nhì trong mọi loại lisp. Chỉ có điều tệp đang lưu hành rộng rãi nhất lại ở dạng đã biên dịch, tức là bạn không đọc được nó làm gì trước khi nạp vào máy.

Bài này đo chuỗi lệnh in thật trên AutoCAD 2027 tại Viện, chỉ ra vì sao in tay lại lâu đến thế, và đưa ra tệp của Viện với mã nguồn để mở, nhập thông số bằng hộp thoại. Muốn học trọn khâu trình bày và in hồ sơ thì xem khóa AutoCAD Xây Dựng.

Lệnh in hàng loạt trong CAD: máy có sẵn, nhưng dài dòng

AutoCAD in được ngay mà không cần lisp nào, bằng lệnh -PLOT. Đây là bản dòng lệnh của lệnh in, và chính nó là thứ mọi tệp lisp in hàng loạt gọi tới ở bên dưới.

Vấn đề nằm ở chỗ nó hỏi nhiều. Chạy một lượt trên AutoCAD 2027 và chép lại nguyên văn từng dòng nhắc, đủ mười chín câu cho một tờ.

Detailed plot configuration? [Yes/No] <No>:
Enter a layout name or [?] <Model>:
Enter an output device name or [?] <...>:
Enter paper size or [?] <...>:
Enter paper units [Inches/Millimeters] <Inches>:
Enter drawing orientation [Portrait/Landscape] <Portrait>:
Plot upside down? [Yes/No] <No>:
Enter plot area [Display/Extents/Limits/View/Window] <Window>:
Enter lower left corner of window <...>:
Enter upper right corner of window <...>:
Enter plot scale (Plotted Millimeters=Drawing Units) or [Fit] <Fit>:
Enter plot offset (x,y) or [Center] <0.00,0.00>:
Plot with plot styles? [Yes/No] <Yes>:
Enter plot style table name or [?] (enter . for none) <...>:
Plot with lineweights? [Yes/No] <Yes>:
Enter shade plot setting [As displayed/...] <As displayed>:
Enter file name <...>:
Save changes to page setup [Yes/No]? <N>
Proceed with plot [Yes/No] <Y>:

Nhân mười chín câu ấy với ba chục tờ là ra lý do vì sao người vẽ đi tìm lisp. In xong mỗi tờ, máy còn báo lại vùng in thật sự dùng, chẳng hạn Effective plotting area: 420.00 wide by 297.00 high.

Hai điều nữa đo được trong lúc dựng tệp, và cả hai đều quyết định lệnh chạy hay hỏng.

Câu đầu tiên rẽ thành hai nhánh khác hẳn nhau. Trả lời No cho Detailed plot configuration? thì máy bỏ hết các câu chi tiết và chỉ hỏi thêm một câu mà bảng trên không có: Enter a page setup name <>:. Đường ấy nhanh nhưng không đặt được khổ giấy, hướng giấy, vùng in hay kiểu in. Muốn khai đủ thì phải trả lời Yes, và đó mới là mười chín câu ở trên.

Sau câu hỏi về nét đậm, hai loại thiết bị hỏi khác nhau. Thiết bị ghi tệp như DWG To PDF.pc3 hỏi Enter file name <...>:, còn máy in thật hỏi Write the plot to a file [Yes/No] <N>:. Cả hai nhánh đều chạy được (nhánh máy in dừng lại trước câu Proceed with plot nên không tốn tờ giấy nào). Tệp lisp vì thế đọc dòng nhắc rồi mới trả lời, chứ không đoán — đoán sai một nhịp là mọi câu sau đó lệch hết.

Một chi tiết nhỏ mà hữu ích: tên khổ giấy phải gõ đúng từng chữ. Muốn xem danh sách thì ở câu hỏi khổ giấy gõ dấu hỏi, máy in ra toàn bộ. Ví dụ dòng dành cho khổ A3 nằm ngang là ISO full bleed A3 (420.00 x 297.00 MM). Đó chính là chuỗi bạn phải điền vào tệp lisp.

Tệp lisp đang lưu hành là bản biên dịch

Tệp lisp in hàng loạt được chia sẻ rộng rãi nhất, mở ra xem thì thấy điều này. Nó không phải tệp .lsp mà là .VLX, tức bản đã biên dịch.

Vài con số về chính tệp ấy: 23.964 byte, mở đầu bằng chuỗi nhận dạng VRTLIB-1, và ngay dòng sau có khai báo (:protected . T). Quét toàn bộ tệp tìm chuỗi (defun — chuỗi bắt đầu mọi hàm AutoLISP — và không có một lần nào.

Nói cho công bằng: biên dịch là quyền của tác giả, và không có gì chứng tỏ tệp ấy làm điều xấu. Nhưng hệ quả thì rõ.

Bạn không đọc được nó làm gì. Bạn không sửa được khổ giấy hay kiểu in mặc định. Và khi AutoCAD hiện hộp thoại Security - Unsigned Executable File hỏi có nạp hay không, bạn không có cách nào tự kiểm tra để trả lời. Cách xử lý hộp thoại ấy nằm ở bài lisp đánh số thứ tự trong CAD.

Vì thế tệp của Viện để nguyên dạng .lsp. Mở bằng Notepad là đọc được từng dòng.

Tệp IN-IIC.lsp của Viện

Tải tệp IN-IIC.lsp29 KB, ba lệnh, mã nguồn để mở. Bản mới nhập thông số bằng hộp thoại và ghi nhớ chúng cho lần sau.
LệnhViệc nó làm
INHLin hàng loạt theo khung tên là block, xếp theo hàng rồi từ trái sang phải
INHLCin hàng loạt theo các hình chữ nhật trên một lớp, khỏi cần block
INHL1in thử một khung để kiểm thông số trước khi chạy cả loạt

Nếu tên lệnh trùng với một lisp khác đang nạp, gõ tên dự phòng: INHLIIC, INHLCIIC, INHL1IIC.

Cả ba mở cùng một hộp thoại. Máy in, khổ giấy và kiểu in được chọn từ danh sách lấy thẳng trong AutoCAD, nên không còn phải gõ đúng từng chữ tên khổ giấy. Bấm OK là thông số được lưu vào Registry của Windows; tắt AutoCAD mở lại, hộp thoại vẫn điền sẵn giá trị cũ.

Phần gọi lệnh in nằm gọn trong một hàm, và mỗi dòng có chú thích nó đang trả lời câu hỏi nào của -PLOT:

(defun iic-in-mot (p1 p2 tep)
  (command "_.-PLOT"
           "_Y"                                  ; Detailed plot configuration? -> Yes
           ""                                    ; Enter a layout name -> Model
           *iic-in-may*                          ; Enter an output device name
           *iic-in-kho*                          ; Enter paper size
           "_M"                                  ; Enter paper units -> Millimeters
           (if (= *iic-in-huong* "P") "_P" "_L") ; Enter drawing orientation
           "_N"                                  ; Plot upside down? -> No
           "_W"                                  ; Enter plot area -> Window
           p1                                    ; Enter lower left corner of window
           p2                                    ; Enter upper right corner of window
           "_F"                                  ; Enter plot scale -> Fit
           "_C"                                  ; Enter plot offset -> Center
           "_Y"                                  ; Plot with plot styles? -> Yes
           *iic-in-ctb*                          ; Enter plot style table name
           "_Y")                                 ; Plot with lineweights? -> Yes
  (command "")                                   ; Enter shade plot setting -> As displayed
  ;; Den day hai loai thiet bi hoi khac nhau, nen doc dong nhac.
  (if (wcmatch (strcase (getvar "lastprompt")) "*PLOT TO A FILE*")
    (command "_N")                               ; may in that: khong ghi ra tep
    (command tep)                                ; thiet bi ghi tep: dua ten tep
  )
  (command "_N")                                 ; Save changes to page setup? -> No
  (command "_Y")                                 ; Proceed with plot -> Yes
  (princ)
)

Lệnh INHL1 đáng dùng trước tiên. In thử một khung, mở tệp PDF ra xem tỉ lệ và nét đã đúng chưa, rồi mới chạy cả loạt. Sai ở tờ thử thì sửa một lần; sai ở tờ thứ ba mươi thì phải in lại từ đầu.

Hướng dẫn dùng, từng bước một

Bước 1 — Nạp tệp và khai thư mục tin cậy

Chép tệp vào một thư mục riêng, chẳng hạn C:\Lisp, rồi gõ APPLOAD, chọn tệp, bấm Load. Dòng lệnh báo Đã nạp IN-IIC... là xong. Nếu hộp thoại an toàn hiện ra, hãy khai thư mục ấy là nơi tin cậy trong OPTIONS, thẻ Files, mục Trusted Locations.

Muốn lần nào mở AutoCAD cũng có sẵn lệnh, trong hộp APPLOAD bấm Contents... ở mục Startup Suite rồi Add tệp này.

Bước 2 — Chuẩn bị bản vẽ

Các khung bản vẽ đặt trong Model, xếp thành hàng. Ví dụ dưới đây có năm khung tên là block KHUNG-A3 xếp hai hàng, và một hình chữ nhật đỏ trên lớp KHUNG-IN dùng cho lệnh INHLC.

Năm khung tên là block xếp hai hàng trong Model, cạnh đó là một hình chữ nhật đỏ trên lớp KHUNG-IN để in bằng INHLC Ảnh: AutoCAD 2027

Bước 3 — Chỉ vào một khung tên mẫu

Gõ INHL. Máy hỏi:

Chọn MỘT khung tên mẫu (phải là block):

Bấm vào nét của một khung tên bất kỳ. Máy báo lại tên block nó nhận ra, ví dụ Tên block khung tên: KHUNG-A3, rồi mở hộp thoại IN HANG LOAT - IIC.

Hộp thoại của lệnh INHL: máy in, khổ giấy, kiểu in, hướng giấy, thư mục lưu, tiền tố, số bắt đầu và dung sai hàng Ảnh: AutoCAD 2027

Bước 4 — Điền hộp thoại

ÔĐiền gì
Máy inDanh sách máy in AutoCAD đang có. In ra PDF chọn DWG To PDF.pc3. Đổi máy in thì danh sách khổ giấy tự nạp lại theo máy đó.
Khổ giấyChọn từ danh sách của máy in. Bản vẽ không chừa lề trắng thì chọn loại ISO full bleed, chẳng hạn ISO full bleed A3 (420.00 x 297.00 MM).
Kiểu inTệp .ctb (hoặc .stb nếu bản vẽ dùng kiểu in theo tên). In đen trắng chọn monochrome.ctb; chọn (Không dùng) để in đúng màu.
Hướng giấyNgang (Landscape) hoặc Dọc (Portrait).
Thư mục lưu PDFGõ đường dẫn hoặc bấm nút ... để chọn. Thư mục chưa có thì lisp tự tạo. In ra máy in thật thì ô này không dùng đến.
Tiền tố tên tệp, Số bắt đầuTên tệp là tiền tố cộng số thứ tự ba chữ số: tiền tố TO-, số bắt đầu 1 cho ra TO-001.pdf, TO-002.pdf... Dòng Tệp đầu tiên ở cuối hộp thoại cho xem trước tên.
Dung sai hàngHai khung có tâm lệch nhau theo phương Y nhỏ hơn số này thì coi là cùng một hàng. Đặt khoảng nửa chiều cao khung: khung A3 tỉ lệ 1:1 cao 297 thì đặt 100–150; khung phóng 100 lần (cao 29.700) thì giá trị mặc định 1000 vẫn hợp. Đặt lớn quá thì hai hàng bị gộp làm một, thứ tự in sẽ sai.
Lớp khung inChỉ dùng cho lệnh INHLC: lớp chứa các hình chữ nhật khung in.
Khổ giấy chọn từ danh sách của chính máy in đang chọn, không phải gõ tay tên khổ Ảnh: AutoCAD 2027

Bấm OK, lisp kiểm các ô trước khi in. Ô nào sai thì dòng cuối hộp thoại báo lỗi và con trỏ nhảy về ô đó, hộp thoại không đóng. Bấm Cancel để thoát lệnh mà không in gì.

Gõ chữ vào ô Số bắt đầu: hộp thoại giữ nguyên và báo lỗi ở dòng cuối Ảnh: AutoCAD 2027

Bước 5 — Quét chọn rồi để máy in

Chọn các khung tên cần in:

Quét chọn cả bộ rồi Enter. Chọn thừa đối tượng khác cũng không sao, lisp chỉ lấy đúng block khung tên. Máy báo số tờ, ví dụ Sẽ in 4 tờ, theo thứ tự từ trái sang phải, trên xuống dưới., rồi in lần lượt.

Bốn khung tên khổ A3 xếp hai hàng trong model. Một lệnh INHL cho ra bốn tệp TO-001 đến TO-004, đúng thứ tự trái sang phải rồi trên xuống dưới Ảnh: AutoCAD 2027

Bước 6 — Chờ trình ghi PDF làm nốt

Đây là chỗ rất dễ tưởng nhầm là hỏng.

Liệt kê thư mục ngay khi lệnh vừa trả về, kết quả là: TO-001.pdf đã đủ 2.142 byte, còn TO-002.pdf tiếp theo mới có tên mà dung lượng bằng 0. Vài giây sau nó mới đủ. Nói cách khác, lệnh đã xong nhưng trình ghi PDF thì chưa.

Biến BACKGROUNDPLOT trên máy đang bằng 2. Theo bảng của Autodesk, mức ấy nghĩa là lệnh in chạy ở tiền cảnh còn lệnh xuất bản mới chạy ở nền. Vậy độ trễ này không phải do in nền, mà do chính trình ghi tệp PDF hoàn tất sau khi lệnh đã trả quyền về.

Vì thế tệp của Viện không kết luận bằng cách tìm tệp ngay lập tức — làm thế sẽ báo thiếu. Nó chỉ báo đã gửi đi bao nhiêu tờ, rồi đếm lại số tệp .pdf đang có trong thư mục để bạn đối chiếu.

Khi in xong hẳn, AutoCAD hiện một bong bóng nhỏ ở góc phải dưới: Plot and Publish Job Complete, kèm dòng No errors or warnings found. Thấy dòng ấy là chắc chắn.

In theo hình chữ nhật và in thử một khung

In theo hình chữ nhật (INHLC). Tạo một lớp riêng, ví dụ KHUNG-IN, vẽ hình chữ nhật bằng lệnh RECTANG bao đúng từng tờ. Nên đặt lớp này không in (Plot = No) để nét khung không ra giấy. Gõ INHLC, hộp thoại hiện ra với ô Lớp khung in được bật; chọn lớp, bấm OK, rồi quét chọn vùng chứa các hình chữ nhật. Lisp chỉ lấy polyline nằm trên lớp đã chọn.

Hộp thoại của lệnh INHLC có thêm ô Lớp khung in Ảnh: AutoCAD 2027

In thử một khung (INHL1). Gõ INHL1, bấm góc dưới trái rồi góc trên phải của một khung. Hộp thoại hiện ra, hai ô dung sai hàng và lớp không dùng nên bị làm mờ. Mở tệp PDF vừa in, kiểm tỉ lệ, nét dày, khổ giấy. Đúng thì chạy INHL hoặc INHLC cho cả loạt: thông số vừa nhập đã được điền sẵn.

Hộp thoại của lệnh INHL1: dung sai hàng và lớp khung in bị làm mờ vì chỉ in một khung Ảnh: AutoCAD 2027

Thông số được ghi nhớ ở đâu

Mỗi lần bấm OK, các thông số được lưu vào khóa Registry HKEY_CURRENT_USER\Software\IIC\IN-IIC. Số bắt đầu cũng được giữ nguyên, nên khi in tiếp loạt khác vào cùng thư mục hãy đổi số bắt đầu hoặc tiền tố để không ghi đè tệp cũ. Muốn về thông số mặc định, xóa khóa Registry ấy.

Hai điều nên biết thêm. Để đọc danh sách khổ giấy, lisp tạm đổi máy in của trang Model rồi trả lại như cũ, vì thế AutoCAD có thể đánh dấu bản vẽ là đã thay đổi. Và nếu vì lý do nào đó hộp thoại không mở được, lisp tự chuyển sang hỏi từng thông số trên dòng lệnh.

In hàng loạt trong CAD: chuẩn bị bản vẽ thế nào

Ba việc làm một lần cho cả đời hồ sơ.

Khung tên phải là block. Đây là điều kiện bắt buộc của mọi tệp lisp in hàng loạt, kể cả tệp của Viện, vì lệnh cần một cách chắc chắn để nhận ra đâu là một tờ. Vẽ khung bằng các đường rời rạc thì máy không có cách nào gom lại. Cách tạo khối nằm ở bài block trong CAD.

Nếu hồ sơ cũ đã lỡ vẽ khung bằng đường thì vẫn còn lối: dùng INHLC, đặt một hình chữ nhật bao quanh từng tờ trên một lớp riêng, chẳng hạn KHUNG-IN, rồi in theo lớp ấy.

Đặt khung thẳng hàng. Lệnh sắp thứ tự theo hàng, nên các khung trong cùng một hàng nên có tung độ gần nhau. Lệch vài trăm đơn vị thì dung sai lo được; lệch cả mét thì máy coi là hai hàng khác nhau.

Chọn sẵn một kiểu in. Tệp .ctb quyết định nét nào in đậm, nét nào in nhạt. Đặt một lần rồi dùng mãi, khỏi phải nhớ mỗi lần in. Cách quản lý nét theo lớp nằm ở bài layer trong CAD.

Ba điều hay nghe nhưng không đúng

Điều hay ngheThực tế đo trên bản 2027
Không có lisp thì không in hàng loạt đượcLệnh -PLOT làm được, chỉ là phải trả lời mười chín câu cho mỗi tờ
Tệp lisp nào cũng đọc được vì là tệp văn bảnTệp lưu hành rộng nhất ở dạng .VLX đã biên dịch, khai cả (:protected . T)
Lệnh chạy xong là có đủ tệp trong thư mụcTệp kế tiếp mới có tên mà còn 0 byte, vài giây sau mới đủ

Câu hỏi thường gặp

Lisp in hàng loạt cad có in được sang PDF không?

Có. Chọn DWG To PDF.pc3 ở ô Máy in của hộp thoại, rồi khai thư mục lưu. Mỗi tờ ra một tệp riêng, đánh số tăng dần.

Tải lisp in hàng loạt trong CAD ở đâu cho an toàn?

Tải từ nơi bạn biết rõ, và ưu tiên tệp .lsp đọc được thay vì .VLX đã biên dịch. Mở bằng Notepad xem qua trước khi nạp.

Máy báo chọn nhầm khi bấm vào khung tên?

Vì khung tên của bạn không phải block. Hãy dùng lệnh INHLC và đặt hình chữ nhật bao quanh từng tờ trên một lớp riêng.

Thứ tự in ra lộn xộn thì sửa thế nào?

Tăng con số ở ô Dung sai hàng trong hộp thoại. Nếu các khung trong một hàng lệch tung độ hơn con số ấy, máy sẽ coi chúng là những hàng khác nhau.

Lisp in nhiều bản vẽ trong cad có in được từ layout không?

Tệp này in theo vùng trong model, vốn là cách làm phổ biến của hồ sơ Việt Nam. Hồ sơ dựng theo layout thì dùng lệnh in sẵn có của AutoCAD sẽ gọn hơn.

Vì sao thư mục chưa có đủ tệp dù máy báo xong?

Vì trình ghi PDF hoàn tất sau khi lệnh đã trả quyền về. Chờ vài giây, và xem bong bóng Plot and Publish Job Complete ở góc phải dưới.

Về tác giả

TS. Đỗ Quốc Hoàng — Phó Viện trưởng Viện Tin học Xây dựng – Trường Đại học Xây dựng Hà Nội, chuyên gia lập trình phần mềm trong xây dựng