Đánh số cột, số cọc, số tờ bản vẽ hay số phòng là việc lặp đi lặp lại đến mức không ai muốn gõ tay, nên lisp đánh số thứ tự trong CAD là tệp được tìm nhiều nhất trong mọi loại lisp. Nhưng tải về rồi chạy thử, rất nhiều người thấy các con số nhảy lung tung chứ không chạy từ trái sang phải như mong đợi.
Bài này chỉ ra nguyên nhân bằng phép đo trên AutoCAD 2027, và đưa ra tệp của Viện đã sửa đúng chỗ ấy. Muốn học trọn cách dựng và quản lý bản vẽ thì xem khóa AutoCAD Xây Dựng.
Lệnh đánh số thứ tự trong CAD đã có sẵn, tên là TCOUNT
Trước khi đi tải tệp, có một điều đáng biết: AutoCAD bản đầy đủ đã kèm sẵn bộ Express Tools, và trong đó có lệnh TCOUNT làm đúng việc này. Trang TCOUNT của Autodesk mô tả nó gọn một câu: "Adds sequential numbering to text and mtext objects as a prefix, suffix, or replacement text."
Trên máy của Viện, biến ACADPREFIX chứa thư mục AutoCAD 2027\Express, nghĩa là bộ ấy nằm ngay trong bản cài tiêu chuẩn. Lần gọi đầu tiên máy in Initializing... rồi chạy, không phải cài thêm gì.
Chúng tôi gõ lệnh và chép nguyên văn từng dòng nhắc.
Sort selected objects by [X/Y/Select-order] <Select-order>:
Specify starting number and increment (Start,increment) <1,1>:
Placement of numbers in text [Overwrite/Prefix/Suffix/Find&replace..] < Prefix>:
4 objects modified.
Một chi tiết nhỏ đáng ghi nhận: trang trợ giúp vẫn in dòng nhắc theo lối cũ, Sort selection set by X, Y, or Select-order, còn bản 2027 thực tế hỏi theo lối mới có ngoặc vuông. Khi hai thứ vênh nhau, hãy tin vào dòng lệnh trước mặt.
Ba cách sắp xếp nói lên toàn bộ sức mạnh của lệnh: X là từ trái sang phải, Y là từ trên xuống dưới, còn Select-order là theo đúng thứ tự bạn bấm chọn. Bốn kiểu đặt số cũng vậy: Overwrite thay hẳn nội dung, Prefix thêm vào đầu, Suffix thêm vào cuối, Find&replace.. tìm một chuỗi rồi thay bằng số.
Phép thử của chúng tôi: bốn dòng chữ A đặt cách nhau 1500, chọn sắp theo X, bắt đầu 1,1, đặt kiểu Prefix. Kết quả lần lượt là 1 A, 2 A, 3 A và 4 A.
Vậy TCOUNT làm được mọi thứ rồi sao? Không hẳn. Chúng tôi quét chọn một cụm tám block có thuộc tính rồi gõ lệnh, và máy trả lời gọn một dòng:
0 found
TCOUNT chỉ làm việc trên các đối tượng chữ. Con số nằm trong thuộc tính của block thì nó không chạm tới. Đó chính là khoảng trống mà một tệp lisp lấp vào.
Hộp thoại chặn khi nạp tệp lisp lạ
Đây là chỗ nhiều người tưởng tệp hỏng rồi bỏ cuộc. Trên bản 2027, biến SECURELOAD mặc định bằng 1. Autodesk mô tả mức ấy là "Loads executable files only if their location is in the trusted locations specified in the TRUSTEDPATHS system variable." Nạp một tệp .lsp nằm ngoài các thư mục tin cậy là máy dừng lại và hỏi.
Nguyên văn câu hỏi: "The publisher of this executable file could not be verified and the file is not located in a trusted folder. What do you want to do?" Bên dưới là lời nhắc "Make sure that this executable file comes from a trusted source and is located in a trusted folder."
Ba nút có ý nghĩa khác hẳn nhau:
| Nút | Việc nó làm |
|---|---|
Always Load | nhớ tệp này, lần sau không hỏi nữa |
Load Once | nạp lần này thôi, lần sau vẫn hỏi lại |
Do Not Load | không nạp, lệnh trong tệp sẽ không có |
Cách làm gọn cho cả đời dùng: tạo một thư mục riêng, chẳng hạn C:\Lisp, chép mọi tệp lisp vào đó, rồi khai báo thư mục ấy là nơi tin cậy. Gõ OPTIONS, sang thẻ Files, mở mục Trusted Locations và thêm đường dẫn. Danh sách ấy chính là biến TRUSTEDPATHS, nên bạn cũng có thể đặt thẳng bằng SETVAR.
Lisp đánh số thứ tự tăng dần trong CAD: chỗ hỏng là thứ tự
Phần lớn tệp lisp đang lưu hành đều sắp xếp theo cùng một ý: xếp các đối tượng theo tung độ giảm dần, và nếu hai cái có tung độ bằng nhau thì xếp tiếp theo hoành độ tăng dần. Nghe rất hợp lý.
Vấn đề nằm ở chữ "bằng nhau". Trong một bản vẽ thật, hai block trông như cùng một hàng gần như không bao giờ có tung độ bằng nhau đến từng chữ số. Chỉ cần lệch vài phần nghìn đơn vị là phép so sánh ấy không còn nhận ra chúng cùng hàng, và thứ tự rơi về so sánh tung độ — tức là ngẫu nhiên.
Chúng tôi dựng một phép thử để đo. Tám block xếp hai hàng bốn cột, tung độ trong mỗi hàng lệch nhau nhiều nhất 0,003 đơn vị — mắt thường không thấy, và ở tỉ lệ in thì càng không. Rồi chạy hai tệp lisp trên cùng bộ block ấy, cùng một lượt chọn.
Đọc từ trái sang phải, kết quả đo được:
| Hàng | Lisp phổ biến | Tệp của Viện |
|---|---|---|
| hàng trên | 03, 01, 04, 02 | 01, 02, 03, 04 |
| hàng dưới | 05, 08, 06, 07 | 05, 06, 07, 08 |
Cách chữa không có gì bí hiểm: thay phép so sánh "bằng nhau đúng từng chữ số" bằng một dung sai hàng. Hai block lệch tung độ nhỏ hơn dung sai thì coi là cùng một hàng, rồi trong hàng mới xếp theo hoành độ. Đặt dung sai bằng khoảng nửa bước hàng là chạy đúng với mọi bản vẽ vẽ tay.
Tệp STT-IIC.lsp của Viện
Chúng tôi tải tệp đang lưu hành về, đọc hết 44 dòng của nó, rồi tự viết lại một lisp đánh số thứ tự trong CAD theo đúng nhu cầu hồ sơ Việt Nam.
Tải tệp STT-IIC.lsp — 7 KB, ba lệnh.
| Lệnh | Việc nó làm |
|---|---|
STT | đánh số vào thuộc tính của block, xếp theo hàng rồi từ trái sang phải |
STTT | đánh số cho các dòng chữ đã có, theo đúng thứ tự bạn bấm chọn |
STTD | đặt một chuỗi số mới, mỗi lần bấm một điểm là một số |
Cả ba đều hỏi cùng một bộ bốn thông số: tiền tố, số bắt đầu, bước nhảy và bề rộng chữ số. Bề rộng 2 cho ra 01, 02; bề rộng 3 cho ra 001, 002. Máy nhớ các giá trị ấy trong phiên làm việc, nên đánh tiếp sang bản vẽ khác thì chỉ cần Enter.
Phần lõi của phép sắp xếp, chính là chỗ khác với các tệp khác:
(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)
Mỗi lệnh đều chạy trong một nhóm hoàn tác. Gõ U một lần là trả lại nguyên trạng, và dòng lệnh báo rõ GROUP STT để bạn biết nó vừa hoàn tác cái gì.
Hướng dẫn dùng, từng bước một
Bước 1 — Nạp tệp
Chép tệp vào thư mục lisp của bạn, gõ APPLOAD, trỏ tới tệp, bấm Load rồi Close. Nếu hộp thoại an toàn hiện ra thì xem lại mục trên. Muốn khỏi nạp lại mỗi lần mở máy thì thêm tệp vào ô Startup Suite ngay trong hộp ấy.
Nạp xong, dòng lệnh in ra tên ba lệnh và tên gọi dự phòng.
Bước 2 — Chỉ vào một thuộc tính mẫu
Gõ STT rồi Enter. Máy hỏi:
Chon MOT thuoc tinh mau trong block can danh so:
Bấm vào nét chữ của một thuộc tính bất kỳ trong block cần đánh. Lưu ý: bấm vào khoảng trống giữa hai chữ số là trượt, phải trúng nét. Máy báo lại tên block và tên thuộc tính vừa nhận ra, ví dụ Block: IIC-STT | Thuoc tinh: STT.
Bước 3 — Khai bốn thông số
Tien to (Enter de giu) <>:
So bat dau <1>:
Buoc nhay <1>:
Be rong chu so (2 = 01, 3 = 001) <2>:
Enter là giữ nguyên giá trị trong ngoặc.
Bước 4 — Đặt dung sai hàng rồi chọn block
Dung sai hang (hai block lech Y nho hon so nay la cung hang) <1.000>:
Con số này tính theo đơn vị bản vẽ. Với các block rải thưa, cứ để mặc định. Với bảng thống kê có dòng cách nhau 300, hãy đặt khoảng 100.
Chon cac block can danh so:
Quét chọn cả cụm rồi Enter. Máy báo Da danh so 8 thuoc tinh tren 8 block.
Lisp đánh số thứ tự block att: cần chuẩn bị gì
Chữ "att" trong các truy vấn là viết tắt của attribute, tức thuộc tính của block. Đây là cách làm đúng cho số hiệu, vì con số đi liền với hình vẽ: chép block sang chỗ khác là con số đi theo, xóa block là con số biến mất cùng.
Ba bước chuẩn bị:
- Vẽ hình bao quanh số, thường là một vòng tròn hoặc một ô chữ nhật.
- Gõ
ATTDEF. Trong hộp thoại, điền ôTagmột tên không dấu, chẳng hạnSTT. Đặt căn chữ vào giữa để số nào cũng nằm cân trong hình. - Gõ
BLOCK, chọn cả hình lẫn thuộc tính vừa tạo, đặt tên và chọn điểm chèn ở tâm.
Từ đó trở đi, chèn block ấy vào chỗ nào cần đánh số, rồi chạy một lượt STT cho cả bản vẽ. Cách tạo và sửa khối nằm ở bài block trong CAD, còn cách chỉnh chữ và cỡ chữ ở bài chữ trong CAD.
Hai tệp lisp trùng tên lệnh thì sao
Chuyện này xảy ra nhiều hơn người ta tưởng, và chúng tôi gặp ngay khi thử nghiệm: tệp đang lưu hành cũng đặt tên lệnh là STT. Nạp cả hai vào cùng một phiên thì tệp nạp sau đè lên tệp nạp trước, và bạn không nhận được lời cảnh báo nào.
Vì thế tệp của Viện có thêm ba tên gọi dự phòng: STTIIC, STTTIIC và STTDIIC. Ba tên này gọi thẳng vào phần thân nên không bao giờ bị tệp khác chiếm.
Nếu gõ STT mà thấy máy hỏi những câu lạ, đó là dấu hiệu một tệp khác đang giữ tên ấy. Gõ STTIIC là xong.
Ba điều hay nghe nhưng không đúng
| Điều hay nghe | Thực tế đo trên bản 2027 |
|---|---|
| Muốn đánh số hàng loạt thì phải có lisp | TCOUNT của Express Tools làm sẵn, có cả ba cách sắp xếp |
| Phải cài thêm Express Tools mới gõ được TCOUNT | Bản đầy đủ đã kèm sẵn; lần đầu máy chỉ in Initializing... rồi chạy |
| Lisp sắp theo hàng là chạy đúng | Chỉ đúng khi phép so sánh có dung sai; so bằng đúng từng chữ số thì hỏng |
Câu hỏi thường gặp
Một lisp đánh số thứ tự trong CAD có thay được TCOUNT không?
Không thay, mà bù. TCOUNT nhanh hơn khi số nằm trong chữ. Lisp là thứ duy nhất chạm được vào thuộc tính của block.
Đánh số thứ tự trong CAD mà không cần lisp được không?
Được, nếu con số nằm trong một dòng chữ. Gõ TCOUNT, chọn cụm chữ, chọn cách sắp xếp rồi chọn kiểu đặt số. Chỉ khi số nằm trong thuộc tính của block mới cần tới lisp.
Vì sao các số nhảy lung tung chứ không chạy từ trái sang phải?
Vì phép sắp xếp trong tệp lisp so tung độ bằng nhau tuyệt đối. Hai block lệch nhau vài phần nghìn đơn vị đã bị coi là hai hàng khác nhau. Tệp của Viện đặt dung sai hàng để tránh đúng lỗi này.
Download lisp đánh số thứ tự tăng dần trong CAD ở đâu cho an toàn?
Tải từ nơi bạn biết rõ, và mở tệp .lsp ra đọc trước khi nạp — nó là tệp văn bản thuần. Đừng tắt biến SECURELOAD để cho nhanh, vì đó chính là lớp chặn cuối cùng.
Máy báo chọn nhầm khi bấm vào thuộc tính?
Vì bạn bấm vào khoảng trống giữa hai chữ số. Chúng tôi đo bằng cách bấm thử khắp ô chữ: chỉ những điểm nằm trên nét chữ mới bắt được. Hãy bấm vào mép của một chữ số.
Đánh nhầm rồi thì hoàn tác thế nào?
Gõ U một lần. Cả lượt được gộp thành một bước, và dòng lệnh báo GROUP STT.