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
Chúng tôi 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.
Tải tệp DNH-IIC.lsp — 5 KB, hai lệnh.
| 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, và lớp tổng được đẩy xuống đúng một bước DIMDLI của bản vẽ.
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.
(vl-load-com)
(defun IIC-GIOI-THIEU ()
(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 - Tel: 0989 427 809")
)
;; Ghi mot kich thuoc thang giua hai diem, duong kich thuoc di qua pd.
(defun IIC:DIM1 (a b pd)
;; Tien to _non: ep bo qua bat diem dang bat. Thieu no thi tren ban ve that
;; (nhieu net, nhieu diem bat) lenh an vao diem khac va kich thuoc ra khong chu.
(command "_.DIMLINEAR" "_non" a "_non" b "_non" pd)
)
;; Khoang cach giua hai lop kich thuoc: lay theo DIMDLI nhan DIMSCALE cua ban ve.
(defun IIC:BUOC ( / d s )
(setq d (getvar "dimdli") s (getvar "dimscale"))
(if (or (null d) (<= d 0)) (setq d 3.75))
(if (or (null s) (<= s 0)) (setq s 1.0))
(* d s)
)
(defun c:DNH ( / e-cu os-cu ce-cu ds p pd i n buoc tong pd2 dai )
(IIC-GIOI-THIEU)
(setq e-cu *error* os-cu (getvar "osmode") ce-cu (getvar "cmdecho"))
(defun *error* (m)
(setvar "osmode" os-cu) (setvar "cmdecho" ce-cu)
(command "_.UNDO" "_End")
(setq *error* e-cu)
(if (and m (not (wcmatch (strcase m) "*CANCEL*,*QUIT*")))
(princ (strcat "\nIIC loi: " m)))
(princ)
)
(command "_.UNDO" "_Begin")
(setq ds nil)
(while (setq p (getpoint "\nChon diem theo thu tu (Enter de dung): "))
(setq ds (cons p ds))
)
(setq ds (reverse ds) n (length ds))
(if (< n 2)
(princ "\nCan it nhat hai diem.")
(progn
(setq pd (getpoint "\nVi tri duong kich thuoc: "))
(if pd
(progn
(initget "Co Khong")
(setq tong (getkword "\nGhi them kich thuoc tong? [Co/Khong] <Co>: "))
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(setq i 0)
(while (< i (1- n))
(IIC:DIM1 (nth i ds) (nth (1+ i) ds) pd)
(setq i (1+ i))
)
(if (/= tong "Khong")
(progn
(setq buoc (IIC:BUOC)
dai (distance (car ds) (last ds)))
;; day lop tong ra xa them mot buoc, theo huong tu diem dau toi pd
(setq pd2 (polar pd (angle (car ds) pd) buoc))
(IIC:DIM1 (car ds) (last ds) pd2)
)
)
(princ (strcat "\nDa ghi " (itoa (1- n)) " doan."))
)
)
)
)
(setvar "osmode" os-cu) (setvar "cmdecho" ce-cu)
(command "_.UNDO" "_End")
(setq *error* e-cu)
(princ)
)
;; DNHP - lay san moi dinh cua mot duong da tuyen, theo dung thu tu dinh.
(defun c:DNHP ( / e-cu os-cu ce-cu es el ds i n pd tong buoc pd2 )
(IIC-GIOI-THIEU)
(setq e-cu *error* os-cu (getvar "osmode") ce-cu (getvar "cmdecho"))
(defun *error* (m)
(setvar "osmode" os-cu) (setvar "cmdecho" ce-cu)
(command "_.UNDO" "_End")
(setq *error* e-cu)
(if (and m (not (wcmatch (strcase m) "*CANCEL*,*QUIT*")))
(princ (strcat "\nIIC loi: " m)))
(princ)
)
(command "_.UNDO" "_Begin")
(setq es (entsel "\nChon duong da tuyen: "))
(if es
(progn
(setq el (entget (car es)) ds nil)
(foreach x el
(if (= (car x) 10) (setq ds (cons (cdr x) ds)))
)
(setq ds (reverse ds) n (length ds))
(if (< n 2)
(princ "\nDuong nay khong du hai dinh.")
(progn
(setq pd (getpoint "\nVi tri duong kich thuoc: "))
(if pd
(progn
(initget "Co Khong")
(setq tong (getkword "\nGhi them kich thuoc tong? [Co/Khong] <Co>: "))
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(setq i 0)
(while (< i (1- n))
(IIC:DIM1 (nth i ds) (nth (1+ i) ds) pd)
(setq i (1+ i))
)
(if (/= tong "Khong")
(progn
(setq buoc (IIC:BUOC)
pd2 (polar pd (angle (car ds) pd) buoc))
(IIC:DIM1 (car ds) (last ds) pd2)
)
)
(princ (strcat "\nDa ghi " (itoa (1- n)) " doan tu " (itoa n) " dinh."))
)
)
)
)
)
)
(setvar "osmode" os-cu) (setvar "cmdecho" ce-cu)
(command "_.UNDO" "_End")
(setq *error* e-cu)
(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:
Chon diem theo thu tu (Enter de dung):
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
Vi tri duong kich thuoc:
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 them kich thuoc tong? [Co/Khong] <Co>:
Enter là có. Máy báo Da ghi 7 doan. và lớp tổng nằm ngay dưới, cách đúng một bước theo DIMDLI.
Kích thước ra nét mà không có số
Đây là sự cố làm chúng tôi mất nửa buổi khi dựng ví dụ cho chính bài này, 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 mà chúng tôi dùng 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. Chúng tôi cũng dính đúng lỗi này một lần.
Đặ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.