Đi tìm lisp cắt dim là chuyện gần như ai vẽ bản vẽ kỹ thuật cũng làm một lần. Chân đường gióng dài ngắn lộn xộn, đâm cả vào hình, nhìn bản vẽ mất gọn. Viện viết sẵn một tệp cho việc ấy, chạy thử trên AutoCAD 2027 rồi mới đưa lên, và in nguyên mã nguồn ở đây để bạn đọc trước khi chạy.
Bài cũng nói nốt phần mà các trang khác bỏ qua: AutoCAD có sẵn hai lệnh làm được hai việc người ta hay đi tìm lisp. Muốn học trọn khâu ghi kích thước và trình bày bản vẽ thì xem khóa AutoCAD Xây Dựng.
Cắt dim trong CAD là hai việc khác nhau
Hai yêu cầu rất khác nhau cùng được gọi chung một tên, nên lời khuyên trên mạng hay trật.
Việc thứ nhất: chân đường gióng dài ngắn lộn xộn vì mỗi kích thước bám vào một chỗ cao thấp khác nhau trên hình. Người vẽ muốn chúng dừng lại ở cùng một mức. Đây mới là việc mà tệp lisp giải quyết.
Việc thứ hai: đường kích thước chạy đè lên nét vẽ khác, và người vẽ muốn chừa một khe hở đúng chỗ hai nét giao nhau. Việc này AutoCAD làm sẵn, không cần tệp ngoài nào.
Gõ thử trên AutoCAD 2027 tại Viện. Cả hai tên lệnh mà các bài hướng dẫn hay nhắc đều không phải của phần mềm:
Unknown command "CUTDIM". Press F1 for help.
Unknown command "BD". Press F1 for help.
Chúng là tên hàm trong một tệp lisp của cộng đồng. Không nạp tệp thì gõ vào chỉ nhận câu trên.
Đọc hết ba trang đầu bảng tìm kiếm cho cụm lisp cắt dim trong CAD. Cả ba dạy đúng cùng ba bước bấm nút: gõ tắt AP, trỏ tới tệp, bấm Load. Không trang nào nói tệp ấy làm gì bên trong, cũng không trang nào nhắc rằng phần mềm có sẵn lệnh cho việc thứ hai. Người đọc tải về, chạy được thì mừng, không chạy được thì bỏ đi tìm tệp khác.
Tệp lisp cắt dim của Viện: mã đầy đủ, tải về dùng ngay
CD. Mã để nguyên trong bài, vì chạy mã lạ trên máy mình là việc đáng cẩn thận.;;; ==================================================================
;;; CD-IIC.LSP - cat chan dim cho thang hang
;;; Vien Tin hoc Xay dung (IIC) - Truong Dai hoc Xay dung Ha Noi
;;; https://iic.huce.edu.vn - Tel: 0989 427 809
;;; ------------------------------------------------------------------
;;; Lenh:
;;; CD chon cac dim, roi chon MOT diem. Chan cua moi dim se dung
;;; lai o ngang diem do. Con so do KHONG doi.
;;;
;;; Cach lam: dat rieng cho tung dim hai bien DIMFXL (chieu dai co
;;; dinh cua duong giong) va DIMFXLON (bat che do do). Chi hai muc
;;; nay bi dong vao, moi thu khac cua dim giu nguyen.
;;;
;;; Da do tren AutoCAD 2027: duong giong ve ra dai dung bang
;;; (DIMFXL + DIMEXE) x DIMSCALE, nen muon chan dung o dung cho thi
;;; phai CHIA cho DIMSCALE cua chinh dim do.
;;;
;;; 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, de Ctrl+Z mot cai la tra lai het.
;; 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))
;;; ------------------------------------------------------------------
;;; Hinh hoc cua dim
;;; ------------------------------------------------------------------
;; Huong cua duong kich thuoc, tinh bang radian.
;; dim thang (AcDbRotatedDimension) goc nam san o ma nhom 50
;; dim xien (AcDbAlignedDimension) lay theo hai goc gong 13 - 14
(defun iic-huong-dim (dl dt / ten)
(setq ten (vla-get-ObjectName (vlax-ename->vla-object dl)))
(cond
((= ten "AcDbAlignedDimension")
(angle (cdr (assoc 13 dt)) (cdr (assoc 14 dt))))
((assoc 50 dt) (cdr (assoc 50 dt)))
(T 0.0)
)
)
;; Khoang cach do theo phuong duong giong, tu duong kich thuoc toi diem p.
;; Duong giong vuong goc voi duong kich thuoc, nen day chinh la chieu
;; cao con lai cua chan dim sau khi cat.
(defun iic-cao-chan (dl p / dt g v)
(setq dt (entget dl)
g (iic-huong-dim dl dt)
v (mapcar '- p (cdr (assoc 10 dt)))
)
(abs (- (* (car v) (sin g)) (* (cadr v) (cos g))))
)
;;; ------------------------------------------------------------------
;;; Cat chan MOT dim. Tra ve T neu cat duoc.
;;; ------------------------------------------------------------------
(defun iic-cat-mot (dl p / dtg ty cao)
(setq dtg (vlax-ename->vla-object dl))
(if (vlax-property-available-p dtg "ExtLineFixedLen" T)
(progn
(setq ty (vla-get-ScaleFactor dtg))
(if (<= ty 1e-8) (setq ty 1.0))
(setq cao (/ (iic-cao-chan dl p) ty))
(if (> cao 1e-6)
(progn
(vla-put-ExtLineFixedLen dtg cao)
;; Ten thuoc tinh la "Suppress" nhung do tren may 2027 thi
;; :vlax-true moi la BAT (DIMFXLON = 1). Dat nham :vlax-false
;; la dim khong doi gi ca.
(vla-put-ExtLineFixedLenSuppress dtg :vlax-true)
(vla-Update dtg)
T
)
)
)
)
)
;;; ------------------------------------------------------------------
;;; Lenh CD
;;; ------------------------------------------------------------------
(defun C:CD (/ *error* cu-error bo p i n bo-qua)
(setq cu-error *error*)
(defun *error* (m)
(if (and m (/= m "Function cancelled") (/= m "quit / exit abort"))
(princ (strcat "\nLỗi: " m))
)
(iic-dong-undo)
(setq *error* cu-error)
(princ)
)
(iic-bang-ten)
(princ "\n")
(setq bo (ssget '((0 . "DIMENSION"))))
(cond
((null bo)
(princ "\nKhông chọn được dim nào."))
((null (setq p (getpoint "\nĐiểm cắt chân dim: ")))
(princ "\nĐã huỷ."))
(T
(setq p (trans p 1 0) i 0 n 0 bo-qua 0)
(iic-mo-undo)
(while (< i (sslength bo))
(if (iic-cat-mot (ssname bo i) p)
(setq n (1+ n))
(setq bo-qua (1+ bo-qua))
)
(setq i (1+ i))
)
(iic-dong-undo)
(princ (strcat "\nĐã cắt chân của " (itoa n) " dim."))
(if (> bo-qua 0)
(princ (strcat " Bỏ qua " (itoa bo-qua) " dim không có chân để cắt."))
)
)
)
(setq *error* cu-error)
(princ)
)
(princ "\nCD-IIC.LSP: go CD de cat chan dim.")
(princ)
Ý tưởng gọn thế này. Mỗi kích thước có một ô đặt riêng tên là chiều dài đường gióng cố định. Lệnh đo khoảng cách từ đường kích thước tới điểm bạn chọn, rồi ghi con số ấy vào ô đó cho từng dim. Đường gióng ngắn lại đúng bằng khoảng ấy, còn con số đo thì không ai đụng vào.
Hướng dẫn dùng lệnh cắt dim, từng bước một
Bước 1 — Nạp tệp vào AutoCAD
- Gõ
APPLOADrồi Enter. HộpLoad/Unload Applicationsmở ra. - Ô
Files of typecứ để nguyênAutoCAD Apps, vì tệp.lspnằm trong nhóm này. - Trỏ tới thư mục vừa tải tệp về, chọn
CD-IIC.lsp, rồi bấm nútLoad. - Bấm
Close. Tệp đã nạp cho phiên làm việc này.
Muốn khỏi phải nạp lại mỗi lần mở máy thì vẫn trong hộp ấy, nhìn khung Startup Suite ở góc dưới bên phải, bấm Contents... rồi thêm tệp vào danh sách. Từ đó AutoCAD tự nạp lúc khởi động.
Bước 2 — Chọn các kích thước cần sửa
Gõ CD rồi Enter. Ba dòng giới thiệu của Viện hiện ra, rồi tới dòng nhắc:
Select objects:
Chọn bằng cách nào bạn quen cũng được: bấm từng cái, kéo cửa sổ, kéo cắt ngang. Chọn trùm cả nét vẽ khác cũng không sao, lệnh chỉ nhận đối tượng kích thước. Chọn xong thì Enter.
Một lưu ý khi kéo cửa sổ từ trái sang phải: AutoCAD chỉ nhận vật nằm trọn trong khung. Chân đường gióng chạy tới tận chỗ nó bám trên hình, nên khung phải trùm qua cả chỗ ấy. Không thì máy báo 0 found và bạn tưởng lệnh hỏng.
Bước 3 — Chỉ mức muốn chân dừng lại
Điểm cắt chân dim:
Bấm một điểm ở đúng cao độ bạn muốn mọi chân dừng lại. Không cần bấm trúng vật gì cả, máy chỉ lấy khoảng cách từ đường kích thước tới điểm ấy. Xong, máy báo:
Đã cắt chân của 3 dim.
Lỡ tay thì gõ U
Gõ U một lần là trả lại hết. Cả lượt sửa được gộp thành một bước hoàn tác, nên không phải bấm nhiều lần. Đếm số kích thước đang mang ghi đè ở ba thời điểm: trước khi chạy 0, sau khi chạy 3, sau khi gõ U về lại 0.
Kiểm thêm một việc sau khi chạy bất kỳ tệp lisp nào loại này: chọn một kích thước, mở bảng Properties và đọc lại ô giá trị đo. Con số phải y như trước. Nếu nó đổi thì tệp đang kéo lại điểm gốc chứ không phải cắt chân, và bạn nên hoàn tác ngay trước khi lưu.
Điểm đáng chú ý nằm ở ba con số. Trước và sau khi chạy, kết quả vẫn là 1800, 1200 và 1200. Lệnh chỉ đổi chỗ vẽ chân đường gióng, không đổi giá trị. Đó là khác biệt giữa cắt chân dim và việc kéo lại điểm gốc, vốn làm sai cả bảng khối lượng.
Ba chỗ tệp lisp cutdim tải về hay hỏng
Chỗ thứ nhất là tỉ lệ. Ô chiều dài đường gióng cố định ứng với biến DIMFXL, và con số trong đó bị nhân với tỉ lệ kích thước DIMSCALE. Bản vẽ đặt tỉ lệ 100 mà lệnh ghi thẳng 150 thì hóa ra 15.000 đơn vị, dài hơn cả chân dim, nên lệnh chạy xong trông như không làm gì. Lỗi này rất dễ mắc, và chỉ lộ ra khi đem ảnh trước sau so từng điểm ảnh.
Chỗ thứ hai nguy hơn: ghi đè. Mọi thiết lập riêng của một dim nằm chung trong một khối dữ liệu. Viết đè cả khối là mất luôn cỡ chữ, màu và tỉ lệ đang đặt riêng cho dim ấy. Làm thế thì chữ số cùng mũi tên biến mất sạch khỏi bản vẽ. Tệp phát hành ở trên không còn đụng tay vào khối ấy nữa: nó đặt thẳng hai thuộc tính ExtLineFixedLen và ExtLineFixedLenSuppress của chính đối tượng dim, nên AutoCAD tự thêm đúng hai mục và giữ nguyên mọi mục cũ. Đo lại khối dữ liệu trước và sau khi chạy trên một dim đang để riêng cỡ chữ 199 và màu chữ đỏ: sáu mục cũ còn nguyên, chỉ có thêm hai mục mới, và con số đo vẫn là 2000.
Chỗ thứ ba là một cái bẫy nằm ngay trong tên thuộc tính. ExtLineFixedLenSuppress nghe như "tắt chiều dài cố định", nhưng đo trên bản 2027 thì ngược hẳn: đặt nó bằng :vlax-true mới là bật, khối dữ liệu ghi ra DIMFXLON bằng 1; đặt :vlax-false thì ghi ra 0, tức là tắt. Rất dễ dính đúng chiều sai: lệnh chạy xong, đọc lại thuộc tính thấy đúng số 300, mà ba cái dim trên màn hình không đổi một nét, và không có lỗi nào báo ra. Chỉ đọc thẳng khối dữ liệu mới thấy DIMFXLON đang bằng 0.
Một con số nữa đáng ghi, vì nó giải thích vì sao đặt 300 mà chân lại dài 370: đường gióng vẽ ra dài đúng bằng (DIMFXL + DIMEXE) × DIMSCALE. Phần thò lên trên đường kích thước là DIMEXE, phần thõng xuống dưới mới là DIMFXL. Vì thế lệnh chia khoảng cách bạn chỉ cho DIMSCALE của chính dim ấy trước khi ghi.
Chỗ thứ tư là bảo mật. Nếu máy hiện hộp Security - Unsigned Executable File rồi báo ; error: File load canceled: thì tệp không hỏng. Đó là biến SECURELOAD chặn nạp mã từ thư mục chưa khai báo tin cậy. Cách xử lý và cơ chế đầy đủ nằm trong bài tính diện tích trong CAD.
DIMBREAK: cắt đường kích thước ngay chỗ nó đè lên hình
Đây là việc thứ hai, và AutoCAD làm sẵn bằng lệnh DIMBREAK trong CAD. Trang DIMBREAK của Autodesk mô tả lệnh trong một câu: "Breaks or restores dimension and extension lines where they cross other objects".
Gõ DIMBREAK, dòng nhắc trên bản 2027 chép nguyên văn từ màn hình:
Select dimension to add/remove break or [Multiple]:
Chọn kích thước, rồi chọn nét vẽ cắt qua nó. Khe hở sinh ra bám theo hình: dời hình hay dời kích thước thì khe dời theo, xóa hình thì khe tự mất. Không tệp lisp nào làm được chuyện bám theo ấy.
Cùng họ với nó là DIMSPACE, lệnh dóng các đường kích thước song song cho đều nhau. Dòng nhắc đầu của nó là Select base dimension:. Đây chính là việc mà lệnh BD trong các tệp lisp cộng đồng làm.
Cắt chân dim mà không cần lisp nào
Nếu mọi kích thước trong bản vẽ đều nên có chân dài bằng nhau, bạn không cần lệnh nào cả. Mở bảng kiểu kích thước, thẻ Extension lines, tích ô Fixed length extension lines rồi đặt số vào ô Length. Từ đó mọi dim mang kiểu ấy đều có chân dài đúng bằng số bạn đặt.
Chọn cách nào thì tùy việc. Cả hồ sơ theo một quy cách thì sửa kiểu kích thước gọn hơn, vì sau này thêm dim mới cũng tự đúng. Chỉ vài chỗ cần ngắn lại, hoặc mỗi chỗ một mức khác nhau, thì tệp lisp nhanh hơn hẳn.
Tệp lisp chỉ hơn ở một chỗ: nó đặt riêng cho từng nhóm dim bạn chọn, theo một mức bạn chỉ bằng chuột, thay vì đổi cả kiểu. Cách làm bằng bảng, kèm cái bẫy khiến ô ấy trông như hỏng, nằm ở bài dim trong CAD.
Ba điều hay nghe nhưng không đúng
| Điều hay nghe | Thực tế trên bản 2027 |
|---|---|
CUTDIM là một lệnh của AutoCAD | Gõ vào ra Unknown command "CUTDIM". Đó là tên hàm trong một tệp lisp |
| Cắt chân dim làm sai con số đo | Đo trước và sau: vẫn 1800, 1200, 1200. Lệnh chỉ đổi chỗ vẽ |
| Muốn ngắt đường kích thước chỗ giao nhau thì phải có lisp | DIMBREAK làm sẵn, và khe hở còn bám theo hình khi bạn dời |
Câu hỏi thường gặp
Lisp cắt dim có làm sai kích thước không?
Không, nếu tệp làm đúng cách. Tệp của Viện chỉ ghi vào ô chiều dài đường gióng của từng dim. Đo lại ba giá trị trước và sau khi chạy, cả ba giữ nguyên.
Tải lisp cắt dim về mà nạp không được thì làm sao?
Xem máy có hiện hộp Security - Unsigned Executable File không. Đó là cơ chế chặn mã lạ của AutoCAD, không phải tệp hỏng. Khai thư mục chứa tệp vào danh sách tin cậy là nạp được.
Lệnh CD chạy xong mà không thấy gì đổi?
Gần như chắc là bản vẽ đang dùng tỉ lệ kích thước khác 1 và tệp lisp quên chia. Thử lại bằng tệp ở bài này, nó đọc tỉ lệ của từng dim rồi mới ghi.
Có cần cắt chân dim cho từng bản vẽ không?
Không. Nếu cả bản vẽ cùng một quy cách thì đặt một lần trong kiểu kích thước là xong. Tệp lisp hợp với trường hợp chỉ một nhóm dim cần ngắn lại.
CD và BD khác nhau thế nào?
CD cắt chân đường gióng, BD dóng các đường kích thước cho thẳng hàng. Cả hai đều là tên trong tệp lisp cộng đồng. AutoCAD có DIMSPACE làm việc của BD.
Tệp lisp này dùng được cho AutoCAD LT không?
Bài này đo trên bản AutoCAD đầy đủ 2027. Các bản rút gọn có chính sách riêng về việc chạy mã, nên hãy thử trên đúng bản bạn đang dùng trước khi đưa vào việc thật.