AutoCAD – Bản vẽ

Lisp dóng thẳng hàng dim: một cú bấm cho cả dim ngang lẫn dim đứng

Lisp dóng thẳng hàng dim của Viện đưa cả dim ngang lẫn dim đứng về một điểm bấm. So với DIMSPACE và DIM aliGn có sẵn, kèm cái bẫy của lựa chọn Auto.

  • TS. Đỗ Quốc Hoàng
  • 12 phút đọc
Cùng một bộ kích thước, DIMSPACE và DIM aliGn chỉ dóng được dim ngang, còn lisp DHD đưa cả dim đứng về điểm bấm Ảnh: Sơ đồ của Viện Tin học Xây dựng

Ghi kích thước xong một mặt bằng, các đường kích thước nằm cao thấp lộn xộn: cái cách tường 300, cái 450, cái 380. Kéo từng cái bằng điểm móc thì mất cả buổi. Lisp dóng thẳng hàng dim của Viện làm việc ấy trong một lệnh: chọn cả loạt, bấm một điểm, mọi đường kích thước về cùng một hàng.

Tải tệp DHD-IIC.lsp5 KB, một lệnh DHD. Mã in nguyên trong bài để bạn đọc trước khi chạy. Muốn học trọn khâu ghi kích thước, Viện có khoá AutoCAD cho ngành xây dựng.

Dóng thẳng hàng dim trong CAD: AutoCAD có sẵn hai cách

Trước khi dùng lisp, nên biết AutoCAD đã có sẵn gì, vì với nhiều trường hợp hai lệnh có sẵn là đủ.

CáchGọi thế nàoCần kích thước gốcDim đứng lẫn dim ngang
DIMSPACE giá trị 0Gõ DIMSPACECóKhông
Lựa chọn aliGn của DIMGõ DIM rồi GCóKhông
Lisp DHD của ViệnGõ DHDKhông, bấm thẳng một điểmCó, cùng một lượt

Để so sánh cho công bằng, cả ba cách chạy trên cùng một bộ kích thước. Ba kích thước ngang đo 1000, 1500 và 800, đường kích thước nằm cách chân 300, 450 và 380. Thêm một kích thước đứng đo 1200, đường kích thước ở hoành độ 4300.

Lệnh dimspace trong CAD: giá trị 0 là dóng, số dương là giãn

Tài liệu Autodesk tóm lệnh này: "Adjusts the spacing between linear dimensions or angular dimensions." Và nói rõ cách dóng thẳng hàng: "You can also make the dimension lines of a series of linear or angular dimensions line up by using a spacing value of 0."

Dòng nhắc nguyên văn của bản 2027.

BướcMáy hỏiBạn làm
1Select base dimension:Bấm kích thước làm chuẩn
2Select dimensions to space:Bấm các kích thước còn lại, Enter
3Enter value or [Auto] <Auto>:Gõ 0 để dóng thẳng hàng

Chọn kích thước 1000 làm gốc, bấm ba cái kia, nhập 0. Kết quả: cả ba kích thước ngang về đúng độ cao 300 của kích thước gốc. Riêng kích thước đứng thì nhận vào lựa chọn nhưng không dời, và máy không báo gì cả.

Lý do nằm trong trang DIMSPACE của Autodesk: "Spacing is applied only to parallel linear dimensions or to angular dimensions that share a common vertex." Chỉ kích thước song song với kích thước gốc mới được đụng tới.

Giãn đều dim trong CAD bằng cùng lệnh ấy

Nhập một số dương thay cho 0 thì lệnh chuyển sang giãn đều. Ba kích thước chồng tầng, đo 1000, 2000 và 3000, đường kích thước đang ở 300, 350 và 900. Chọn cái 1000 làm gốc, nhập 250.

Kết quả: kích thước gốc giữ ở 300, hai cái kia xếp lại ở 550 và 800. Các tầng cách nhau đều đúng 250.

Cái bẫy của lựa chọn Auto

Ở câu hỏi thứ ba, máy đề nghị sẵn <Auto>. Nhiều người cứ thế nhấn Enter.

Autodesk mô tả Auto là "The resulting spacing distance is twice the height of the dimension text." Nhưng chiều cao ấy là con số ghi trong kiểu kích thước, chưa nhân tỉ lệ DIMSCALE. Trên bản vẽ thử có DIMTXT bằng 0,18 và DIMSCALE bằng 40, lựa chọn Auto chỉ giãn 0,36 đơn vị giữa các tầng. Ba kích thước gần như chồng khít lên nhau.

Vậy trên bản vẽ có tỉ lệ, đừng nhấn Enter ở câu ấy. Nhập thẳng khoảng cách mong muốn tính bằng đơn vị bản vẽ.

Lệnh dim align trong CAD: lựa chọn aliGn của lệnh DIM

Lệnh DIM gộp nhiều kiểu ghi kích thước vào một lệnh, và có sẵn lựa chọn dóng hàng. Dòng nhắc đầu của nó liệt kê đủ: Select objects or specify first extension line origin or [Angular/Baseline/Continue/Ordinate/aliGn/Distribute/Layer/Undo]:

Gõ G để vào aliGn. Máy hỏi Select base dimension:, rồi Select dimensions to align:. Chọn giống như trên: gốc là kích thước 1000, rồi ba cái kia.

Ba kích thước ngang về đúng 300. Kích thước đứng lần này bị từ chối thẳng, máy báo nguyên văn Parallel, concentric, or same datum dimensions required. rồi 1 was filtered out.

Chọn xong nhớ nhấn Enter thêm một lần để thoát. Lệnh DIM không tự kết thúc mà quay lại dòng nhắc đầu, chờ bạn ghi kích thước tiếp.

Căn thẳng hàng kích thước trong CAD bằng lisp DHD

Hai lệnh có sẵn cùng vướng hai chỗ. Chúng cần một kích thước gốc nằm sẵn ở đúng độ cao mong muốn. Và chúng chỉ xử lý kích thước song song với gốc, nên dim ngang và dim đứng phải làm hai lượt.

Lisp DHD bỏ cả hai chỗ vướng ấy. Bạn không chọn gốc, mà bấm thẳng một điểm. Mỗi đường kích thước được đẩy theo phương vuông góc với chính nó, cho tới khi đi qua điểm ấy.

Cách dùng: nạp tệp bằng APPLOAD theo bài lệnh appload trong CAD, rồi gõ DHD.

BướcMáy hỏiBạn làm
1Chọn các kích thước cần dóng thẳng hàng:Quét chọn cả vùng, kể cả nét khác; lisp chỉ lấy kích thước
2Bấm điểm mà các đường kích thước phải đi qua:Bấm một điểm

Chạy trên cùng bộ kích thước, lần này thêm một kích thước theo cạnh xiên và một kích thước bán kính. Quét chọn cả vùng, bấm điểm (4600, 700).

Kích thướcTrướcSau
Ba kích thước ngang300 · 450 · 380700 · 700 · 700
Kích thước đứngx = 4300x = 4600
Kích thước theo cạnh xiênnằm lệchđường kích thước đi qua đúng điểm bấm
Kích thước bán kính—bỏ qua

Có một điều phải để ý khi dùng trên mặt bằng thật. Mọi kích thước ngang được chọn đều về cùng một cao độ, và mọi kích thước đứng về cùng một hoành độ. Nếu quét chọn cả chuỗi kích thước phía trên lẫn chuỗi phía dưới công trình trong một lượt, chuỗi dưới sẽ bị kéo lên nằm chung hàng với chuỗi trên. Vì vậy mỗi lượt chỉ chọn các kích thước ở một phía: chạy một lần cho phía trên, một lần cho phía dưới, rồi lần lượt hai bên hông.

Máy báo Đã dóng thẳng hàng 5 kích thước. Bỏ qua 1 kích thước không phải kích thước thẳng. Kích thước bán kính, đường kính, góc và toạ độ không có "đường kích thước" để dóng, nên lisp đếm và để yên.

Con số đo của mọi kích thước không đổi: vẫn 1000, 1500, 800, 1200 và 1.414,21. Lisp chỉ dời vị trí đường kích thước và chữ đi cùng, không đụng tới hai điểm gốc.

Cả lệnh gộp thành một bước hoàn tác. Thử trên bộ ba kích thước chồng tầng đang nằm ở 300, 350 và 900: chạy DHD đưa cả ba về một hàng, rồi gõ U một lần, cả ba trở về đúng 300, 350 và 900.

Mã nguồn lisp căn dim thẳng hàng

Tên lệnh DHD đã kiểm không trùng lệnh gốc nào của AutoCAD 2027, không trùng lệnh tắt nào trong acad.pgp, và không trùng lệnh nào trong bộ lisp của Viện. Mọi hàm phụ đều mang tiền tố iic-dhd-, để nạp cùng lúc với các tệp lisp khác mà không đè lên nhau.

;;; ==================================================================
;;;  DHD-IIC.LSP  -  dong thang hang cac duong kich thuoc
;;;  Vien Tin hoc Xay dung (IIC) - Truong Dai hoc Xay dung Ha Noi
;;;  https://iic.huce.edu.vn  -  Tel: 0989 427 809
;;; ------------------------------------------------------------------
;;;  Lenh:
;;;    DHD    chon mot loat kich thuoc, bam MOT diem. Moi duong kich
;;;           thuoc duoc day theo phuong vuong goc voi chinh no cho toi
;;;           khi di qua diem ay. Kich thuoc ngang ve cung mot cao do,
;;;           kich thuoc dung ve cung mot hoanh do, trong CUNG MOT lan.
;;;
;;;  Khac voi DIMSPACE va lua chon aliGn cua lenh DIM co san:
;;;    - khong can mot kich thuoc goc, ban bam thang vi tri muon dong;
;;;    - chon lan ca kich thuoc ngang, dung va xien cung mot luc.
;;;
;;;  Chi dong kich thuoc thang (ngang, dung, xoay goc, theo canh xien).
;;;  Kich thuoc ban kinh, duong kinh, goc, toa do bi bo qua va dem lai.
;;;  Con so do (khoang cach hai diem goc) KHONG doi, chi doi vi tri
;;;  duong kich thuoc va chu.
;;;
;;;  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 - moi ham phu deu mang tien to iic-dhd- de khong de
;;;  len ham cung ten cua tep lisp khac dang nap trong cung ban ve.
;;; ------------------------------------------------------------------

(defun iic-dhd-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)
)

(defun iic-dhd-tai-lieu () (vla-get-ActiveDocument (vlax-get-acad-object)))

(defun iic-dhd-cong (a b) (mapcar '+ a b))
(defun iic-dhd-tru (a b) (mapcar '- a b))
(defun iic-dhd-nhan (v k) (mapcar '(lambda (x) (* x k)) v))
(defun iic-dhd-cham (a b) (apply '+ (mapcar '* a b)))

;; Goc cua duong kich thuoc. Tra ve nil neu khong phai kich thuoc thang.
;;   kieu 0: kich thuoc ngang / dung / xoay goc -> goc nam o ma 50
;;   kieu 1: kich thuoc theo canh xien          -> goc tu diem 13 toi 14
(defun iic-dhd-goc (d / kieu)
  (setq kieu (logand (cdr (assoc 70 d)) 7))
  (cond
    ((= kieu 0) (cdr (assoc 50 d)))
    ((= kieu 1) (angle (cdr (assoc 13 d)) (cdr (assoc 14 d))))
    (t nil)
  )
)

;; Day duong kich thuoc theo phap tuyen cua no cho toi khi di qua p.
;; Dich ca diem dinh duong kich thuoc (ma 10) lan diem giua chu (ma 11)
;; cung mot vec to, nen chu di theo duong kich thuoc.
(defun iic-dhd-doi (en p / d g n p10 p11 dl)
  (setq d (entget en)
        g (iic-dhd-goc d))
  (if g
    (progn
      (setq n   (list (- (sin g)) (cos g) 0.0)
            p10 (cdr (assoc 10 d))
            p11 (cdr (assoc 11 d))
            dl  (iic-dhd-nhan n (iic-dhd-cham (iic-dhd-tru (list (car p) (cadr p) (caddr p10)) p10) n)))
      (setq d (subst (cons 10 (iic-dhd-cong p10 dl)) (assoc 10 d) d))
      (if p11 (setq d (subst (cons 11 (iic-dhd-cong p11 dl)) (assoc 11 d) d)))
      (entmod d)
      (entupd en)
      T
    )
    nil
  )
)

;;; ------------------------------------------------------------------
;;;  Lenh DHD
;;; ------------------------------------------------------------------

(defun c:DHD (/ *error* ss p i n bo)
  (defun *error* (m)
    (vla-EndUndoMark (iic-dhd-tai-lieu))
    (if (not (wcmatch (strcase m) "*CANCEL*,*QUIT*,*BREAK*"))
      (princ (strcat "\nLỗi: " m))
    )
    (princ)
  )
  (iic-dhd-bang-ten)
  (princ "\nChọn các kích thước cần dóng thẳng hàng:")
  (setq ss (ssget '((0 . "DIMENSION"))))
  (if ss
    (progn
      (setq p (getpoint "\nBấm điểm mà các đường kích thước phải đi qua: "))
      (if p
        (progn
          (setq p (trans p 1 0))
          (vla-StartUndoMark (iic-dhd-tai-lieu))
          (setq i 0 n 0 bo 0)
          (while (< i (sslength ss))
            (if (iic-dhd-doi (ssname ss i) p)
              (setq n (1+ n))
              (setq bo (1+ bo))
            )
            (setq i (1+ i))
          )
          (vla-EndUndoMark (iic-dhd-tai-lieu))
          (princ (strcat "\nĐã dóng thẳng hàng " (itoa n) " kích thước."))
          (if (> bo 0)
            (princ (strcat " Bỏ qua " (itoa bo) " kích thước không phải kích thước thẳng."))
          )
        )
      )
    )
    (princ "\nKhông chọn được kích thước nào.")
  )
  (princ)
)

(princ "\nĐã nạp DHD-IIC: gõ DHD để dóng thẳng hàng kích thước.")
(iic-dhd-bang-ten)

Bản dòng nhắc tiếng Anh: dhd-iic-en.lsp.

Nên dùng cách nào

Tình huốngNên dùng
Đã có một kích thước nằm đúng chỗ, chỉ cần kéo mấy cái song song về theoDIMSPACE giá trị 0, hoặc DIM → G
Muốn các tầng kích thước cách đều nhauDIMSPACE với khoảng cách cụ thể, đừng dùng Auto
Muốn cả dim ngang lẫn dim đứng về một vị trí bấm tự doLisp DHD
Muốn cắt chân đường gióng cho gọnlisp cắt dim

Muốn ghi cả chuỗi kích thước trong một lượt cho khỏi phải dóng về sau, xem lisp dim nhanh.

Ba điều hay nghe nhưng không đúng

Hay ngheBản 2027 thực sự làm gì
DIMSPACE dóng được mọi kích thước đã chọnChỉ kích thước song song với gốc; dim đứng bị bỏ qua mà không báo
Cứ Enter chọn Auto là giãn vừa đẹpAuto lấy chiều cao chữ chưa nhân DIMSCALE; bản vẽ tỉ lệ 40 chỉ giãn 0,36
Dóng lại vị trí dim làm sai con số đoSố đo giữ nguyên, chỉ vị trí đường kích thước đổi

Câu hỏi thường gặp

Lisp dóng thẳng hàng dim dùng thế nào?

Nạp tệp dhd-iic.lsp, gõ DHD, quét chọn các kích thước, rồi bấm một điểm mà các đường kích thước phải đi qua.

Không có lisp thì dóng thẳng hàng dim bằng gì?

Gõ DIMSPACE, chọn kích thước gốc, chọn các kích thước còn lại, nhập 0. Chỉ các kích thước song song với gốc được dóng.

Vì sao dim đứng không chịu dóng theo dim ngang?

DIMSPACE và DIM → aliGn chỉ xử lý kích thước song song với kích thước gốc. Lisp DHD thì xử lý cả hai loại trong cùng một lượt.

Dóng xong có làm sai số đo không?

Không. Số đo giữ nguyên, chỉ vị trí đường kích thước và chữ thay đổi.

Giãn đều các tầng dim thế nào?

DIMSPACE, chọn gốc, chọn các tầng còn lại, rồi nhập khoảng cách, ví dụ 250. Đừng nhấn Enter nhận Auto trên bản vẽ có tỉ lệ.

Lỡ dóng sai thì sao?

Gõ U một lần. Cả lệnh DHD được gộp thành một bước hoàn tác.

Về tác giả

TS. Đỗ Quốc Hoàng — Phó Viện trưởng Viện Tin học Xây dựng, Trường Đại học Xây dựng Hà Nội, chuyên gia phát triển phần mềm cho ngành xây dựng