Ghi kích thước là khâu ngốn thời gian nhất khi hoàn thiện bản vẽ, nên lisp dim nhanh là thứ người vẽ đi tìm sớm nhất. Nhưng trước khi tải tệp về, có một điều đáng biết: AutoCAD đã có sẵn bốn cách ghi hàng loạt, và phần lớn người dùng chỉ biết một.
Bài này nói cả hai phía. Muốn học trọn khâu ghi kích thước và trình bày hồ sơ thì xem khóa AutoCAD Xây Dựng.
Dim nhanh trong CAD: bốn lệnh có sẵn
Gõ từng lệnh trên AutoCAD 2027 tại Viện và chép nguyên văn dòng nhắc.
QDIM là lệnh đúng nghĩa dim nhanh. Trang QDIM của Autodesk nói rõ nó hợp với việc gì: "This command is particularly useful for creating a series of baseline or continued dimensions, or for dimensioning a series of circles and arcs". Chọn cả cụm hình rồi máy ghi một loạt:
Select geometry to dimension:
Chọn hụt thì nó nói thẳng: No objects found to dimension.
Lệnh DIM của các bản mới còn đa năng hơn. Nhìn dòng nhắc là thấy nó gom gần hết mọi kiểu.
Select objects or specify first extension line origin or [Angular/Baseline/Continue/Ordinate/aliGn/Distribute/Layer/Undo]:
Hai lệnh cổ điển vẫn còn nguyên. DIMCONTINUE hỏi Select continued dimension: rồi nối tiếp trên cùng một đường kích thước. DIMBASELINE hỏi Select base dimension: rồi ghi từ cùng một gốc, mỗi kích thước một lớp.
Khoảng cách giữa các lớp của DIMBASELINE không phải số ngẫu nhiên: nó là biến DIMDLI nhân với tỉ lệ kích thước DIMSCALE. Đặt lại một lần là cả bản vẽ đều theo.
Trong chính lệnh QDIM còn chín lựa chọn nữa mà ít ai mở ra xem: Continuous, Staggered, Baseline, Ordinate, Radius, Diameter, Datum Point, Edit và Settings. Lựa chọn Staggered xếp các kích thước so le từng bậc, rất hợp với mặt bằng nhiều lớp tường. Lựa chọn Edit cho thêm hay bớt điểm ngay trong lúc đang ghi, khỏi phải làm lại từ đầu.
Lisp dim hàng loạt trong CAD: tệp của Viện
Bốn lệnh trên mạnh, nhưng thiếu đúng một thứ mà người vẽ hồ sơ Việt Nam cần: ghi cả chuỗi theo đúng thứ tự mình chỉ, rồi thêm một lớp kích thước tổng bên dưới. QDIM nhanh hơn nhưng thứ tự do máy quyết, và không tự thêm lớp tổng.
| Lệnh | Việc nó làm |
|---|---|
DNH | chọn một chuỗi điểm, đặt một mức đường kích thước, máy ghi liên tiếp từng đoạn |
DNHP | lấy sẵn mọi đỉnh của một đường đa tuyến, khỏi bấm lại từng điểm |
Cả hai đều hỏi có ghi thêm kích thước tổng không. Lớp tổng được đẩy ra xa chuỗi theo phương vuông góc, cách một khoảng đủ để hai dòng chữ không chồng nhau.
Vì sao lại cần thứ tự do mình chỉ? Vì hồ sơ thi công đọc theo mạch. Một dãy trụ và ô cửa phải hiện ra theo đúng trình tự người thợ đi từ đầu tường tới cuối tường, chứ không phải theo trình tự máy tìm thấy các nét. Khi bản vẽ có thêm nét phụ nằm xen giữa, thứ tự máy chọn càng khó đoán, và sửa lại từng kích thước còn lâu hơn là ghi tay từ đầu.
Một lý do nữa là lớp kích thước tổng. Quy cách hồ sơ Việt Nam gần như luôn đòi một dòng tổng nằm dưới chuỗi chi tiết, để người đọc kiểm nhanh phép cộng. Không lệnh sẵn nào tự thêm dòng ấy, nên dù dùng lisp dim nhanh hay ghi tay thì đó vẫn là một thao tác riêng. Tệp ở bài này gộp luôn vào một câu hỏi.
;;; ==================================================================
;;; DNH-IIC.LSP - ghi ca chuoi kich thuoc trong mot luot
;;; Vien Tin hoc Xay dung (IIC) - Truong Dai hoc Xay dung Ha Noi
;;; https://iic.huce.edu.vn - Tel: 0989 427 809
;;; ------------------------------------------------------------------
;;; Lenh:
;;; DNH bam lan luot cac moc theo dung thu tu muon doc, dat mot
;;; muc duong kich thuoc, may ghi lien tiep tung doan.
;;; DNHP lay san moi dinh cua mot duong da tuyen, khoi bam lai.
;;;
;;; Ca hai deu hoi co ghi them mot lop kich thuoc TONG hay khong.
;;;
;;; Hai dieu da do tren AutoCAD 2027 va lam theo:
;;; - lop tong bi day ra theo phuong VUONG GOC voi chuoi, chu khong
;;; theo huong tu diem dau toi diem vua bam; chuoi nam xien thi
;;; cach kia cho lop tong di cheo.
;;; - khoang cach giua hai lop lay so LON HON giua DIMDLI x DIMSCALE
;;; va 2,2 lan chieu cao chu. Tren ban ve mau cua Vien DIMDLI = 8
;;; con DIMTXT = 180, lay DIMDLI khong thi hai dong chu chong nhau.
;;;
;;; 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)
;;; ------------------------------------------------------------------
;;; Phan chung
;;; ------------------------------------------------------------------
(defun iic-bang-ten ()
(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)
)
;; Gop ca lenh vao MOT buoc undo. Dung danh dau cua ActiveX chu khong
;; dung (command "_.UNDO" ...): ban 2027 CAM goi (command) tu trong ham
;; bay loi *error*, con danh dau nay thi goi duoc o moi noi.
(defun iic-tai-lieu () (vla-get-ActiveDocument (vlax-get-acad-object)))
(defun iic-mo-undo () (vla-StartUndoMark (iic-tai-lieu)) (princ))
(defun iic-dong-undo () (vla-EndUndoMark (iic-tai-lieu)) (princ))
;; Khoi chua doi tuong moi: dang o to giay thi la paper space.
(defun iic-noi-ve (/ tl)
(setq tl (vla-get-ActiveDocument (vlax-get-acad-object)))
(if (and (= 0 (getvar "tilemode")) (= 1 (getvar "cvport")))
(vla-get-PaperSpace tl)
(vla-get-ModelSpace tl)
)
)
;;; ------------------------------------------------------------------
;;; Hinh hoc
;;; ------------------------------------------------------------------
;; Vec to don vi vuong goc voi huong g.
(defun iic-phap-tuyen (g) (list (- (sin g)) (cos g) 0.0))
;; Tich vo huong cua hai vec to phang.
(defun iic-nhan-vo-huong (a b) (+ (* (car a) (car b)) (* (cadr a) (cadr b))))
;; Diem p day di mot doan d theo vec to v.
(defun iic-doi-cho (p v d)
(list (+ (car p) (* d (car v))) (+ (cadr p) (* d (cadr v))) (caddr p))
)
;; Khoang cach giua lop chuoi va lop tong.
(defun iic-cach-lop (/ a b ty)
(setq ty (getvar "dimscale"))
(if (<= ty 1e-8) (setq ty 1.0))
(setq a (* (getvar "dimdli") ty)
b (* 2.2 (getvar "dimtxt") ty))
(max a b)
)
;;; ------------------------------------------------------------------
;;; Ve mot kich thuoc thang, quay theo huong cua chuoi
;;; ------------------------------------------------------------------
(defun iic-ghi-doan (kg p1 p2 pd g)
(if (> (distance p1 p2) 1e-8)
(progn
(vla-AddDimRotated kg (vlax-3d-point p1) (vlax-3d-point p2)
(vlax-3d-point pd) g)
T
)
)
)
;;; ------------------------------------------------------------------
;;; Ghi ca chuoi. Tra ve so doan ghi duoc.
;;; ------------------------------------------------------------------
(defun iic-ghi-chuoi (ds pd co-tong / kg g n con pd2 huong lech)
(setq kg (iic-noi-ve)
g (angle (car ds) (last ds))
n 0
con ds)
(while (cdr con)
(if (iic-ghi-doan kg (car con) (cadr con) pd g) (setq n (1+ n)))
(setq con (cdr con))
)
;; lop tong: day tiep ra xa chuoi, theo dung phia ma nguoi dung da bam
(if (and (> n 1) co-tong)
(progn
(setq huong (iic-phap-tuyen g)
lech (iic-nhan-vo-huong (mapcar (function -) pd (car ds)) huong)
pd2 (iic-doi-cho pd huong (* (if (minusp lech) -1.0 1.0) (iic-cach-lop))))
(iic-ghi-doan kg (car ds) (last ds) pd2 g)
)
)
n
)
;;; ------------------------------------------------------------------
;;; Hoi cho het phan chung cua hai lenh
;;; ------------------------------------------------------------------
(defun iic-hoi-muc-va-tong (/ pd tl)
(if (setq pd (getpoint "\nVị trí đường kích thước: "))
(progn
(initget "Co Khong")
(setq tl (getkword "\nGhi thêm kích thước tổng? [Co/Khong] <Co>: "))
(list (trans pd 1 0) (/= tl "Khong"))
)
)
)
;;; ------------------------------------------------------------------
;;; Lenh DNH
;;; ------------------------------------------------------------------
(defun c:DNH (/ *error* cu-error ds p pd n)
(setq cu-error *error*)
(defun *error* (m)
(if (and m (/= m "Function cancelled") (/= m "quit / exit abort"))
(princ (strcat "\nIIC lỗi: " m)))
(iic-dong-undo)
(setq *error* cu-error)
(princ)
)
(iic-bang-ten)
(setq ds (list))
(while (setq p (getpoint "\nChọn điểm theo thứ tự (Enter để dừng): "))
(setq ds (cons (trans p 1 0) ds))
)
(setq ds (reverse ds))
(if (< (length ds) 2)
(princ "\nCần ít nhất hai điểm.")
(if (setq pd (iic-hoi-muc-va-tong))
(progn
(iic-mo-undo)
(setq n (iic-ghi-chuoi ds (car pd) (cadr pd)))
(iic-dong-undo)
(princ (strcat "\nĐã ghi " (itoa n) " đoạn."))
)
)
)
(setq *error* cu-error)
(princ)
)
;;; ------------------------------------------------------------------
;;; Lenh DNHP - lay dinh tu duong da tuyen
;;; ------------------------------------------------------------------
;; Moi dinh cua duong cong nam o tham so nguyen. Lay theo vlax-curve
;; thi duoc luon toa do WCS, dung cho ca LWPOLYLINE lan POLYLINE cu.
(defun iic-dinh-cua (e / het i ds)
(setq het (vl-catch-all-apply (function vlax-curve-getEndParam) (list e)))
(if (or (vl-catch-all-error-p het) (null het))
nil
(progn
(setq i 0 ds (list))
(while (<= i het)
(setq ds (cons (vlax-curve-getPointAtParam e i) ds) i (1+ i))
)
(setq ds (reverse ds))
;; duong khep kin tra ve dinh cuoi trung dinh dau: bo bot mot cai,
;; neu khong thi huong cua chuoi tinh ra bang khong.
(if (and (cdr ds) (< (distance (car ds) (last ds)) 1e-8))
(setq ds (reverse (cdr (reverse ds))))
)
ds
)
)
)
(defun c:DNHP (/ *error* cu-error ch ds pd n)
(setq cu-error *error*)
(defun *error* (m)
(if (and m (/= m "Function cancelled") (/= m "quit / exit abort"))
(princ (strcat "\nIIC lỗi: " m)))
(iic-dong-undo)
(setq *error* cu-error)
(princ)
)
(iic-bang-ten)
(setq ch (entsel "\nChọn đường đa tuyến: "))
(if (null ch)
(princ "\nKhông chọn được đường nào.")
(progn
(setq ds (iic-dinh-cua (car ch)))
(if (or (null ds) (< (length ds) 2))
(princ "\nĐường này không đủ hai đỉnh.")
(if (setq pd (iic-hoi-muc-va-tong))
(progn
(iic-mo-undo)
(setq n (iic-ghi-chuoi ds (car pd) (cadr pd)))
(iic-dong-undo)
(princ (strcat "\nĐã ghi " (itoa n) " đoạn từ "
(itoa (length ds)) " đỉnh."))
)
)
)
)
)
(setq *error* cu-error)
(princ)
)
(princ "\nDNH-IIC.LSP: go DNH de ghi chuoi kich thuoc, DNHP de lay dinh duong da tuyen.")
(princ)
Hướng dẫn dùng, từng bước một
Bước 1 — Nạp tệp
Gõ APPLOAD, trỏ tới tệp, bấm Load rồi Close. 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.
Bước 2 — Chọn chuỗi điểm
Gõ DNH rồi Enter. Máy hỏi:
Chọn điểm theo thứ tự (Enter để dừng):
Bấm lần lượt các mốc theo đúng thứ tự muốn đọc, thường là từ trái sang phải. Bật bắt điểm đầu mút cho chắc. Xong thì Enter.
Bước 3 — Đặt mức đường kích thước
Vị trí đường kích thước:
Bấm một điểm ở mức bạn muốn cả chuỗi nằm trên đó. Không cần bấm trúng vật gì.
Bước 4 — Chọn có ghi tổng hay không
Ghi thêm kích thước tổng? [Co/Khong] <Co>:
Enter là có. Máy báo Đã ghi 7 đoạn. và lớp tổng nằm ngay dưới chuỗi.
Khoảng cách giữa hai lớp là chỗ dễ sai. Sách vở lấy DIMDLI nhân DIMSCALE, nhưng trên bản vẽ mẫu của Viện DIMDLI bằng 8 trong khi DIMTXT bằng 180, nên lớp tổng chỉ cách chuỗi 8 đơn vị và hai dòng chữ chồng lên nhau. Bản bạn tải về lấy số lớn hơn giữa DIMDLI × DIMSCALE và 2,2 lần chiều cao chữ. Nó cũng đẩy lớp tổng theo phương vuông góc với chuỗi, chứ không theo hướng từ điểm đầu tới điểm bạn bấm. Chuỗi nằm xiên thì cách cũ cho lớp tổng đi chéo.
Kích thước ra nét mà không có số
Đây là sự cố mất nửa buổi để tìm ra, nên xin kể lại đầy đủ.
Nguyên nhân hay gặp nhất là kiểu chữ của dimstyle. Bản vẽ mẫu có năm kiểu kích thước, cả năm đều trỏ vào một kiểu chữ tên ROMANS. Mọi kích thước ghi ra đều đủ đường gióng, đủ đường kích thước, đủ đầu mút, mà không có lấy một con số.
Phép thử để tìm ra: viết bốn dòng chữ bằng bốn kiểu chữ khác nhau rồi nhìn. Ba kiểu hiện bình thường, riêng ROMANS không vẽ ra gì cả — dù tệp phông romans.shx vẫn nằm trong thư mục Fonts của AutoCAD 2027, và dù một kiểu chữ khác cũng dùng đúng phông ấy thì lại chạy tốt. Chuyển kiểu chữ của dimstyle sang kiểu chạy được là hết.
Nguyên nhân thứ hai là đoạn quá hẹp. Chữ cao 250 đơn vị mà đoạn cần ghi chỉ 600 thì không lọt giữa hai đường gióng. Máy đẩy chữ ra ngoài, và nó đè lên lớp kích thước bên dưới. Ví dụ trong bài để đoạn ngắn nhất 1200 chính vì thế.
Nguyên nhân thứ ba là nhân hai lần. DIMTXT được nhân với DIMSCALE. Đặt DIMTXT 250 rồi để tỉ lệ 100 là ra chữ cao 25.000 đơn vị, to hơn cả bức tường. Lỗi này rất dễ mắc.
Đặt lớp và kiểu kích thước trước khi ghi
Hai việc nên làm trước khi bấm điểm đầu tiên, và cả hai đều tiết kiệm nhiều thời gian sửa về sau.
Thứ nhất là lớp. Kích thước nên nằm trên một lớp riêng, thường đặt tên là DIM. Lớp hiện hành lúc bạn gọi lệnh là lớp mà kích thước rơi vào, nên đang vẽ dầm mà quên đổi lớp là cả chuỗi kích thước nằm lẫn vào lớp dầm. Lúc cần tắt hiện hay đổi màu in thì không tách ra được nữa.
Thứ hai là kiểu kích thước. Đừng dựa vào kiểu đang có của bản vẽ người khác gửi tới, vì bạn không biết nó được đặt cho tỉ lệ nào. Chọn một kiểu chuẩn của mình, kiểm nhanh ba con số là đủ: chiều cao chữ, cỡ đầu mút, và khoảng cách giữa hai lớp kích thước. Ba con số ấy đều nhân với DIMSCALE, nên chỉ cần đổi một biến là cả bản vẽ theo đúng tỉ lệ in.
Trong ví dụ ở bài này, bức tường nằm trên lớp tường, ô cửa nằm trên lớp cửa, còn kích thước nằm trên lớp DIM màu đỏ. Nhìn ảnh là phân biệt được ngay ba nhóm nét, và đó cũng là cách một bộ hồ sơ giao đi nên trông như thế.
Ba điều hay nghe nhưng không đúng
| Điều hay nghe | Thực tế trên bản 2027 |
|---|---|
| Muốn ghi hàng loạt thì phải có lisp | QDIM làm sẵn, và lệnh DIM còn gom cả Baseline lẫn Continue |
| Kích thước mất số là do bản vẽ lỗi | Thường là kiểu chữ của dimstyle, hoặc đoạn quá hẹp so với chữ |
| Khoảng cách giữa các lớp phải căn tay | Đó là biến DIMDLI nhân DIMSCALE, đặt một lần cho cả bản vẽ |
Câu hỏi thường gặp
Lisp dim tự động trong cad có thay được QDIM không?
Không thay, mà bù. QDIM nhanh hơn khi bạn chỉ cần ghi hết một cụm hình. Tệp lisp hợp khi thứ tự đọc quan trọng, hoặc khi cần thêm lớp kích thước tổng.
Lệnh dim liên tục trong cad gõ tắt là gì?
DIMCONTINUE, và dòng nhắc đầu là Select continued dimension:. Trên các bản mới bạn còn gọi được nó từ lựa chọn Continue ngay trong lệnh DIM.
Ghi xong thấy các lớp kích thước cách nhau quá xa hoặc quá gần?
Đổi biến DIMDLI. Con số thực tế là DIMDLI nhân DIMSCALE, nên nhớ tính cả hai.
Dim hàng loạt trong cad mà chọn nhầm nét khác thì sao?
Gõ U một lần. Cả lượt được gộp thành một bước hoàn tác.
Vì sao chữ kích thước nhảy ra ngoài đường gióng?
Vì đoạn hẹp hơn bề ngang của chữ. Hoặc nới đoạn, hoặc hạ DIMTXT, hoặc cho phép chữ nằm ngoài bằng biến DIMTIX.
Nên đặt kích thước vào lớp nào?
Một lớp riêng, thường tên là DIM, để tắt hiện hay đổi màu in cả loạt. Cách quản lý lớp nằm ở bài layer trong CAD, còn cách chỉnh cỡ chữ và chân dim ở bài dim trong CAD.