Bảng khối lượng trên bản vẽ hầu hết là chữ rời chứ không phải bảng thật. Muốn biết tổng một cột bốn mươi con số thì phải gõ lại vào máy tính, mà gõ lại thì sai. Muốn căn cho cả cột thẳng hàng thì phải kéo từng dòng.
Bài này phát hành tệp lisp của Viện làm bốn việc ấy, và in trọn mã nguồn để bạn đọc trước khi chạy. Lisp cộng text trong CAD là lệnh hay dùng nhất, nhưng cái bẫy đi kèm nó mới là phần quan trọng của bài. Muốn học trọn cách trình bày chữ và bảng trên bản vẽ thì xem khóa AutoCAD Xây Dựng.
Bốn việc với chữ mà AutoCAD không làm sẵn
| Việc | Cách sẵn có | Hụt ở đâu |
|---|---|---|
| Cộng một cột số ghi trên bản vẽ | không có | Phải gõ lại vào máy tính |
| Cộng thêm hoặc trừ bớt hàng loạt | không có | Sửa tay từng dòng |
| Căn lề cho cả cột thẳng hàng | JUSTIFYTEXT | Đổi chuẩn căn lề chứ không dời chỗ, nhìn vẫn lệch |
| Đổi cỡ chữ hàng loạt | bảng Properties | Được, nhưng chỉ khi các dòng cùng loại |
Dòng thứ ba là chỗ bị hiểu nhầm nhiều nhất. JUSTIFYTEXT của Express Tools đổi điểm neo của dòng chữ mà giữ nguyên vị trí, nên nhìn trên màn hình không có gì đổi. Muốn cả cột thẳng hàng thì phải dời chỗ các dòng, và đó là việc khác hẳn.
Tải tệp của Viện
| Lệnh | Việc nó làm |
|---|---|
TXC | cộng tổng các con số nằm trong các dòng chữ đã chọn |
TXN | cộng thêm hoặc trừ bớt một lượng vào mọi con số đã chọn |
TXL | căn lề các dòng chữ về cùng một mép |
TXH | đổi chiều cao chữ hàng loạt |
;;; ==================================================================
;;; 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)
Lisp cộng text trong CAD và phép đối chiếu
Bản vẽ thử có bảy dòng chữ. Bốn dòng là số thuần: 12.5, 30, 7.25, 100. Ba dòng còn lại cài sẵn bẫy: 12,5 viết dấu phẩy, 12.5 m2 có chữ cái, và Cot C1 không phải số.
Cộng tay bốn dòng số: 149,75.
Chọn cả bảy dòng rồi chạy TXC, máy in ra:
7 found
So dong cong duoc : 4
So dong bo qua : 3
TONG : 149.750
(dong bo qua la dong co chu cai, hoac dung dau phay lam dau thap phan)
Khớp đúng phép tính tay. Và quan trọng không kém: máy nói rõ ba dòng bị bỏ qua chứ không im lặng cộng ra một con số rồi để bạn tin.
Dấu phẩy thập phân: bẫy nặng nhất với người Việt
Dòng 12,5 bị bỏ qua hoàn toàn. Nó không được đọc thành 12,5 mà cũng không được đọc thành 12 — nó rơi hẳn khỏi phép cộng.
Đây là chỗ nguy hiểm nhất của cả bài, vì hai lý do.
Thứ nhất, người Việt viết số thập phân bằng dấu phẩy theo thói quen, còn AutoCAD và mọi tệp lisp đều đọc theo dấu chấm. Bảng khối lượng chép từ Excel sang rất hay mang theo dấu phẩy.
Thứ hai, và tệ hơn: khi một dòng bị bỏ qua, tổng vẫn ra một con số trông hợp lý. Không có gì trên màn hình bảo rằng thiếu. Nếu tệp lisp không in số dòng bỏ qua thì không ai phát hiện được.
Cách làm đúng: nhìn dòng So dong bo qua. Nếu nó khác 0 mà bạn nghĩ cả cột đều là số, thì có dòng viết sai định dạng. Sửa dấu phẩy thành dấu chấm rồi cộng lại. Cách sửa chữ hàng loạt trên bản vẽ có trong bài sửa text hàng loạt trong CAD.
Dòng 12.5 m2 cũng bị bỏ qua vì có chữ cái. Điều này thường là đúng — đơn vị nên nằm ở tiêu đề cột chứ không nên đi kèm từng con số.
Lisp cộng trừ text trong CAD: sửa cả loạt một lúc
Lệnh TXN hỏi cộng thêm bao nhiêu rồi sửa luôn nội dung các dòng chữ. Khai số âm là trừ bớt.
Phép thử với cùng bảy dòng ấy, cộng thêm 10:
| Trước | Sau |
|---|---|
12.5 | 22.50 |
30 | 40.00 |
7.25 | 17.25 |
100 | 110.00 |
12,5 | không đổi |
12.5 m2 | không đổi |
Cot C1 | không đổi |
Bốn dòng số đổi đúng, ba dòng kia không bị đụng tới. Đây là cách chỉnh cả loạt cao độ khi mốc chuẩn thay đổi, hay cộng thêm chiều dày lớp phủ vào cả bảng cốt nền.
Lưu ý con số sau khi sửa được ghi với hai chữ số thập phân, kể cả khi trước đó viết gọn. 30 thành 40.00 chứ không thành 40. Muốn giữ đúng cách viết cũ thì phải sửa tay.
Lisp căn lề text trong CAD: dời chỗ chứ không đổi chuẩn
Lệnh TXL hỏi căn theo mép trái, mép phải hay giữa, rồi kéo các dòng về đúng một toạ độ.
Phép thử: bảy dòng đặt lệch nhau 37 đơn vị theo phương ngang.
| Toạ độ X | |
|---|---|
| Trước | 1000, 1037, 1074, 1111, 1148, 1185, 1222 |
| Sau khi căn lề trái | cả bảy dòng đúng 1000 |
Mép trái lấy dòng trái nhất làm mốc, mép phải lấy dòng phải nhất, còn giữa thì lấy trung bình cộng. Lệnh in ra cả toạ độ mốc để bạn biết nó căn về đâu.
Khác biệt với JUSTIFYTEXT nằm ở đây: lệnh này dời chỗ dòng chữ, còn lệnh kia đổi điểm neo mà giữ nguyên chỗ. Nhìn trên bản vẽ thì chỉ cách này mới làm cột chữ thẳng hàng.
Đổi cỡ chữ hàng loạt
Lệnh TXH hỏi chiều cao mới rồi đặt cho mọi dòng đã chọn. Phép thử: bảy dòng cao 100, đổi thành 250, cả bảy đều thành 250.
Việc này hay cần khi nhận bản vẽ của đơn vị khác về mà cỡ chữ không hợp tỉ lệ in. Cỡ chữ và kiểu chữ có trong bài chữ trong CAD.
Một lưu ý: chữ đặt chế độ ghi chú theo tỉ lệ thì không nên đổi chiều cao kiểu này, vì chiều cao thật của nó do tỉ lệ ghi chú quyết định. Với loại chữ ấy phải đổi tỉ lệ ghi chú chứ không đổi số.
Lisp đếm text trong CAD: dùng chính lệnh cộng
Lệnh cộng cũng chính là cách đếm nhanh nhất. Dòng So dong cong duoc cộng với dòng So dong bo qua là tổng số dòng chữ trong vùng chọn, và dòng 7 found ngay trên đó cũng cho con số ấy.
Cách dùng thực tế: khoanh một khu rồi chạy lệnh, không cần quan tâm tổng, chỉ đọc hai con số kia là biết khu ấy có bao nhiêu dòng chữ và bao nhiêu dòng không phải số.
Bộ lọc của lệnh chỉ nhận hai loại đối tượng chữ là TEXT và MTEXT. Chữ nằm trong block, chữ của kích thước, và thuộc tính của block đều không vào. Muốn đếm cả những thứ ấy thì phải làm cách khác, và con số hai lệnh cho ra sẽ khác nhau — nên khi báo cáo phải nói rõ đếm loại nào.
Về mặt kỹ thuật, phép thử "đây có phải số không" dựa vào hàm distof của AutoLISP. Tài liệu Autodesk mô tả hàm này là "Converts a string that represents a real (floating-point) value into a real value", và trả về "A real number, if successful; otherwise nil." Chuỗi nào không đổi được thì hàm trả về rỗng, và đó chính là tín hiệu để lệnh xếp dòng ấy vào nhóm bỏ qua.
Mấy điều hay nghe nhưng không đúng
| Người ta hay nói | Thực tế đo được |
|---|---|
| AutoCAD cộng được cột số trên bản vẽ | Không có lệnh nào làm việc đó |
| Số viết dấu phẩy vẫn cộng được | 12,5 bị bỏ qua hẳn, không vào tổng |
| Tổng ra số đẹp là cộng đủ rồi | Tổng vẫn hợp lý khi thiếu dòng; phải đọc số dòng bỏ qua |
JUSTIFYTEXT làm cột chữ thẳng hàng | Nó đổi chuẩn căn lề mà giữ nguyên vị trí |
| Cộng thêm số thì giữ nguyên cách viết | 30 thành 40.00, luôn hai chữ số thập phân |
Câu hỏi thường gặp
Lệnh nào cộng cột số trên bản vẽ?
TXC. Chọn các dòng chữ rồi Enter, máy in tổng kèm số dòng cộng được và số dòng bỏ qua.
Vì sao tổng thiếu mất vài dòng?
Những dòng ấy không đọc được thành số: có chữ cái, hoặc dùng dấu phẩy làm dấu thập phân. Đọc dòng So dong bo qua để biết có bao nhiêu.
Số viết dấu phẩy thì sửa thế nào?
Phải đổi dấu phẩy thành dấu chấm. Trên bản vẽ có thể dùng lệnh tìm và thay thế, sau đó cộng lại.
Cộng thêm một lượng vào cả cột được không?
Được, dùng TXN rồi khai số cần cộng. Khai số âm là trừ bớt.
Căn lề cả cột chữ thì dùng lệnh nào?
TXL, chọn mép trái, phải hay giữa. Lệnh dời chỗ các dòng chứ không chỉ đổi chuẩn căn lề.
Đổi cỡ chữ cho nhiều dòng cùng lúc?
TXH rồi khai chiều cao mới. Riêng chữ ghi chú theo tỉ lệ thì nên đổi tỉ lệ chứ đừng đổi số.