Download AutoCad Bản Quyền

Lisp gán cao độ đường đồng mức: lệnh GDM và mã nguồn 2026

Lisp gán cao độ đường đồng mức lệnh GDM: mã nguồn đầy đủ, hai dòng nhắc thật, cách nạp trên AutoCAD 2026 và cách gán bằng CHANGE khi không có lisp.

  • autocad123.vn
  • 21/08/2023

Lisp gán cao độ đường đồng mức là thứ dân san nền hay tìm nhất khi phải xử lý một tờ bình đồ. Việc cần làm rất đơn giản về ý: chọn lần lượt các đường, phần mềm tự đặt cao độ tăng dần. Bản cũ của bài này chỉ có bốn bước và ba tấm ảnh. Lần viết lại đã mở gói tải về, soi lại từng tấm ảnh, và bổ sung thứ bản cũ không hề có là mã nguồn đọc được.

Tóm tắt. Link Google Drive gắn trên bài này trỏ nhầm gói: nó dẫn tới thư viện block đèn s093, không phải tệp lisp. Tên tệp đúng lộ ra ngay trong ảnh của bài cũ là GDM - GanCaoDoDDM.vlx, ngày 29/03/2020. Hai dòng nhắc thật của lệnh cũng đọc được từ ảnh, kèm một con số đáng ngờ: chênh cao mặc định 10000. Bản cũ dặn phải đổi ô Files of type sang Visual LISP Executables, nhưng chính tấm ảnh đó cho thấy bộ lọc mặc định AutoCAD Apps đã bao gồm đuôi .vlx. Bài này đưa mã nguồn thay thế gồm hai lệnh GDMGDM1, và một cách làm không cần lisp bằng lệnh CHANGE.

Cao độ của đường đồng mức nằm ở đâu trong bản vẽ

Trước khi bàn tới công cụ, phải rõ mình đang sửa cái gì. Đường đồng mức trên tờ bình đồ quét về thường là polyline nằm bẹp ở cao độ 0. Nhìn trên mặt bằng thì không sao. Nhưng muốn dựng mặt địa hình, muốn tính khối lượng đào đắp, hay muốn cắt trắc dọc, phần mềm cần biết mỗi đường ở độ cao nào.

Với một polyline hai chiều, độ cao đó là một thuộc tính duy nhất tên Elevation, nằm trong mục Geometry của bảng Properties. Trong tệp DWG và DXF, tài liệu Autodesk ghi mã nhóm 38 của đối tượng LWPOLYLINE là Elevation (optional; default = 0). Với polyline kiểu cũ thì mã nhóm 10 được mô tả là một điểm giả, X và Y luôn bằng 0, còn Z chính là cao độ của đường. Hai kiểu khác nhau về cách lưu nhưng giống nhau ở một điểm quan trọng: cả đường chỉ có một con số cao độ.

Đó là lý do việc này tự động hoá được. Việc ngược lại là ghi ký hiệu ra bản vẽ, xem lisp đánh cao độ mặt bằng. Còn đường 3D polyline thì mỗi đỉnh giữ một Z riêng, nên không có ô Elevation nào để gán, và cũng không cần gán vì nó đã mang sẵn cao độ.

Polyline nhẹ (LWPOLYLINE) Một ô Elevation cho cả đường, mã DXF 38. Gán được bằng Properties, CHANGE hoặc lisp. Polyline kiểu cũ (POLYLINE) Cao độ là Z của điểm giả, mã DXF 10. Gán được y hệt, chỉ khác cách lưu trong tệp. 3D Polyline, Spline, Line Mỗi đỉnh giữ một Z riêng của nó. Không có ô Elevation nào để gán một lượt. Z

Hình 1. Chỉ hai kiểu đường trên cùng mới có một ô cao độ chung. Kiểu dưới cùng thì cao độ nằm rải ở từng đỉnh.

Lisp gán cao độ đường đồng mức chạy ra sao

Bản cũ mô tả bốn bước và kèm hai ảnh chụp dòng nhắc. Hai ảnh đó vẫn sống, và chúng cho biết nguyên văn câu hỏi mà tệp đưa ra. Câu đầu tiên hỏi cao độ khởi điểm.

Dong nhac Nhap cao do ban dau cua lenh GDM trong AutoCAD

Hình 2. Dòng nhắc thứ nhất hiện ngay tại con trỏ: Nhap cao do ban dau. Chữ không dấu, đúng kiểu lisp viết cho bản AutoCAD đời cũ.

Câu thứ hai hỏi chênh cao giữa hai đường liền nhau. Chỗ này có một chi tiết mà bản cũ bỏ qua.

Dong nhac Nhap chenh cao giua cac duong dong muc mac dinh 10000

Hình 3. Giá trị mặc định trong ngoặc là 10000.00000. Con số đó chỉ có nghĩa khi bản vẽ tính bằng milimét.

Chênh cao 10000 nghe vô lý nếu bạn nghĩ theo mét, vì không tờ bình đồ nào có hai đường đồng mức cách nhau 10 km. Đó là dấu vết bản vẽ của người viết lisp. Gần như chắc chắn họ vẽ theo milimét, vì 10000 mm đúng bằng 10 mét, một bước đường đồng mức rất bình thường. Bài học rút ra thì cụ thể: con số bạn gõ vào phải cùng đơn vị với bản vẽ của bạn. Vẽ theo mét mà gõ 10000 thì cả tờ bình đồ bay lên mây.

Còn một điểm nữa bản cũ nói đúng và nên giữ. Công cụ chỉ biết cộng dồn, nên nó bắt bạn bắt đầu từ đường thấp nhất rồi chọn dần lên cao. Bấm nhầm thứ tự thì cả dãy sai theo, và không có cách nào sửa ngoài chạy lại. Trước khi chạy, hãy nhìn kỹ tờ bình đồ xem sườn dốc đi hướng nào.

Link tải của bài này trỏ nhầm gói

Link Google Drive gắn trong bài từ năm 2020 vẫn sống, nhưng nó không dẫn tới tệp lisp. Mở trang Drive ra đọc thẻ tiêu đề thì tên tệp là s093-đường chéo hình vuông.rar. Tải về giải nén bằng mật khẩu xaydungso.vn thì ruột là 77 tệp DWG thư viện đèn, nặng 13,5 MB. Không có một dòng lisp nào.

Đây không phải chuyện riêng của bài này. Cùng một mã Drive đó đang được dán vào bốn bài khác nhau trên trang, trong đó có bài thư viện đèn chiếu sáng s093 là nơi gói thuộc về thật. Link vẫn được giữ nguyên xi ở đây để ai cần bộ đèn thì lấy, nhưng phải nói rõ nó là bộ đèn.

Trang này không phát tệp lisp. Đường link tải cũ của bài trỏ sang một gói khác (thư viện block đèn), nên đã gỡ đi. Toàn bộ mã nguồn hai lệnh GDMGDM1 nằm ngay trong bài, chép vào một tệp .lsp rồi nạp bằng APPLOAD là dùng được.

Vậy tệp lisp gốc tên gì? Ảnh chụp hộp thoại trong bài cũ trả lời hộ: dòng đang được chọn ghi GDM - GanCaoDoDDM.vlx, ngày sửa 29/03/2020. Tệp đó không nằm sau link nào trên trang nữa. Vì thế phần tiếp theo đưa hẳn mã nguồn để bạn tự dựng lại công cụ, không phải đi xin ai. Các tiện ích cùng ngành gom trong bài lisp CAD cho trắc địa.

Mã nguồn thay thế, hai lệnh GDM và GDM1

Đoạn mã dưới đây làm đúng việc mà lisp gán cao độ đường đồng mức bản cũ làm, cộng thêm một lệnh thứ hai cho tình huống mà bản cũ không tính tới. Chép cả khối vào Notepad rồi lưu thành gdm.lsp, sau đó nạp bằng APPLOAD. Mã chỉ dùng ký tự ASCII nên chọn kiểu mã hoá nào cũng chạy.

Toàn bộ mã nguồn

;; GDM - gan cao do tang dan cho tung duong dong muc.
;; GDM1 - gan mot cao do cho nhieu duong cung luc.
(vl-load-com)
;; Ham chung, tra ve T neu gan duoc cao do z cho doi tuong e.
(defun gdm:dat (e z / obj ten)
(setq obj (vlax-ename->vla-object e))
(setq ten (vla-get-ObjectName obj))
(if (member ten (list "AcDbPolyline" "AcDb2dPolyline"))
(progn (vla-put-Elevation obj z) T)
(progn (princ (strcat "\n Bo qua mot " ten " - khong phai polyline 2D.")) nil)))
;; Lenh GDM, hoi cao do dau va chenh cao roi cho chon tung duong.
(defun c:GDM ( / z0 dz z e n)
(setq z0 (getreal "\nCao do cua duong thap nhat <0>: "))
(if (null z0) (setq z0 0.0))
(setq dz (getreal "\nChenh cao giua hai duong lien tiep <0.5>: "))
(if (null dz) (setq dz 0.5))
(setq z z0)
(setq n 0)
(while (setq e (car (entsel (strcat "\nChon duong se mang cao do " (rtos z 2 3) " : "))))
(if (gdm:dat e z) (setq z (+ z dz) n (1+ n))))
(princ (strcat "\nDa gan cao do cho " (itoa n) " duong dong muc.\n"))
(princ))
;; Lenh GDM1, mot cao do cho ca nhom duong vua chon.
(defun c:GDM1 ( / z ss i n)
(setq z (getreal "\nCao do gan cho ca nhom: "))
(setq n 0)
(princ "\nChon cac duong dong muc cung mot cao do: ")
(setq ss (ssget (list (cons 0 "LWPOLYLINE,POLYLINE"))))
(if (and z ss)
(progn
(setq i 0)
(while (< i (sslength ss))
(if (gdm:dat (ssname ss i) z) (setq n (1+ n)))
(setq i (1+ i)))))
(princ (strcat "\nDa gan cao do cho " (itoa n) " duong.\n"))
(princ))

Mã cố ý không đổi một biến hệ thống nào, nên bấm Esc giữa chừng cũng không để lại di chứng gì cho bản vẽ. Nó cũng cố ý viết không thụt đầu dòng. Lý do rất thực tế: nhiều trang web đẩy khoảng trắng thụt đầu dòng thành ký tự trắng không ngắt, và AutoLISP không coi ký tự đó là dấu cách. Chép về mà dính phải nó thì báo lỗi cú pháp ở chỗ nhìn không thấy gì.

Vì sao phải hỏi tên đối tượng trước khi gán

Dòng đáng chú ý nhất nằm trong hàm chung: (vla-get-ObjectName obj). Nó trả về tên lớp thật của đối tượng, và chỉ hai tên được nhận là AcDbPolyline với AcDb2dPolyline. Bộ lọc chọn của lệnh GDM1 khai "LWPOLYLINE,POLYLINE", nghe thì kín nhưng thật ra vẫn lọt: 3D polyline trong tệp DWG cũng là đối tượng POLYLINE, chỉ khác một bit cờ. Không kiểm tên lớp thì lisp sẽ đòi gán Elevation cho một thứ không có thuộc tính đó, và cả lệnh chết ngang.

Cách viết này còn một cái lợi. Gặp đối tượng lạ, lisp in ra đúng tên lớp của nó rồi chạy tiếp, không dừng. Bạn nhìn dòng thông báo là biết ngay mình vừa bấm nhầm vào cái gì.

Ba chỗ nên sửa cho hợp bản vẽ của bạn

Thứ nhất là mặc định. Hai số 0 và 0.5 trong mã hợp với bản vẽ tính bằng mét. Bản vẽ tính bằng milimét thì sửa 0.5 thành 500 cho khỏi gõ lại mỗi lần.

Thứ hai là số chữ số thập phân hiện trên dòng nhắc, nằm ở (rtos z 2 3). Số 3 là số chữ số sau dấu phẩy, đổi thành 2 hay 4 tuỳ bạn. Số 2 phía trước là chế độ thập phân, đừng đổi.

Thứ ba là tên lệnh. Máy bạn đã có sẵn một lệnh GDM của bộ khác thì chỉ cần đổi chữ đứng sau c: trong dòng (defun c:GDM thành tên khác. Trong AutoLISP, chỉ phần sau dấu hai chấm mới là chữ bạn gõ vào dòng lệnh. Lệnh GDM1 đổi được y hệt, và hàm chung gdm:dat thì cứ để nguyên vì nó không phải lệnh.

Nạp tệp lisp trên AutoCAD 2026

Lệnh nạp là APPLOAD, gõ tắt AP. Trình tự đầy đủ nằm ở bài cách load lisp trong CAD. Hộp thoại hiện ra tên Load/Unload Applications, và đây là tấm ảnh của bản cũ, chụp trên một bản AutoCAD đời 2015.

Hop thoai Load Unload Applications dang mo o lua chon Files of type

Hình 4. Ô Files of type đang mở. Dòng thứ hai từ trên xuống, AutoCAD Apps, đã liệt kê sẵn đuôi .vlx.

Bản cũ dặn phải đổi ô đó sang Visual LISP Executables thì mới thấy tệp. Chính tấm ảnh của bài bác lại lời dặn ấy. Danh sách đọc được trong ảnh là AutoCAD Apps (*.arx;*.crx;*.lsp;*.dvb;*.dbx;*.vlx;*.fas), tức bộ lọc mặc định đã bao gồm cả .vlx lẫn .fas. Chỉ khi bạn lỡ chọn một bộ lọc hẹp hơn thì tệp mới biến mất khỏi danh sách.

Chuyện đáng lo trên bản 2026 là chuyện khác. Trên bản cài mặc định, biến SECURELOAD bằng 1 còn TRUSTEDPATHS để rỗng. Nghĩa là chỉ thư mục cài đặt trong Program Files được tin cậy ngầm, còn tệp để ở Downloads sẽ luôn bị hỏi. Hộp thoại hiện ra tên Security - Unsigned Executable File với ba nút Always Load, Load OnceDo Not Load.

Ca khó chẩn đoán nhất. Nếu ai đó đặt SECURELOAD bằng 2, tương ứng mức High trong hộp thoại SECURITYOPTIONS, thì AutoCAD bỏ qua tệp trong im lặng. Không hỏi, không báo lỗi, không có lệnh mới. Người dùng tưởng tệp hỏng hoặc tải thiếu. Gặp cảnh nạp xong mà gõ GDM không ra gì, hãy gõ SECURELOAD xem giá trị trước đã. Các nguyên nhân khác gom ở bài không load được lisp trong CAD.

Muốn nạp một lần dùng mãi thì thêm tệp vào Startup Suite. Nhưng tài liệu Autodesk nói rõ, từ đời 2014 trở đi ứng dụng trong Startup Suite vẫn phải nằm trong thư mục đã khai ở TRUSTEDPATHS. Đây đúng là lý do của cảnh chạy tay thì được, khởi động lại thì mất lệnh.

Về máy khác nhau: tệp .vlx.fas chỉ chạy trên Windows. AutoCAD LT có AutoLISP từ đời 2024, và tài liệu Autodesk ghi phần lớn hàm vl-, vla-, vlax- đều được hỗ trợ, nên đoạn mã ở trên chạy được trên LT bản Windows. Thứ LT không có là thư viện ActiveX bên ngoài như Excel, mà mã này không dùng tới.

Làm việc này mà không cần lisp

Không phải lúc nào cũng đáng đi cài thêm. Bản vẽ chỉ vài chục đường thì AutoCAD có sẵn hai đường nhanh hơn.

Đường thứ nhất là bảng Properties. Chọn đường, mở bảng bằng tổ hợp Ctrl và phím 1, tìm ô Elevation trong mục Geometry rồi gõ số. Chọn nhiều đường cùng lúc cũng được, nhưng cả nhóm sẽ nhận chung một con số. Với đường đồng mức thì cách này chỉ hợp khi vài vòng khép kín cùng nằm ở một mức, chuyện rất hay gặp ở đỉnh đồi hay lòng chảo.

Đường thứ hai là lệnh CHANGE, thứ ít người còn nhớ. Gõ CHANGE, chọn đối tượng, Enter, gõ P để vào nhóm Properties, rồi gõ E cho Elev và nhập cao độ. Tài liệu AutoCAD 2026 mô tả tuỳ chọn này nguyên văn là Changes the Z-axis elevation of 2D objects, kèm một điều kiện quan trọng: You can change the elevation of an object only if all its points have the same Z value. Đường nào đã bị vênh Z ở vài đỉnh thì lệnh từ chối.

Đừng nhầm với lệnh ELEV. Nhiều người gõ ELEV rồi tưởng đã sửa được bản vẽ. Tài liệu Autodesk viết thẳng: ELEV controls only new objects; it does not affect existing objects. Nó chỉ đặt cao độ mặc định cho nét vẽ sau này, lưu trong biến ELEVATION. Còn một bẫy nữa: giá trị này bị đưa về 0.0 mỗi khi bạn chuyển hệ toạ độ về WCS.

Bạn cần gán cao độ cho bao nhiêu đường? Một đường lẻ Mở Properties, gõ số vào ô Elevation. Hoặc lệnh CHANGE, chọn P rồi chọn E. Nhiều đường, cùng một cao độ Chọn cả nhóm rồi làm y như trên. Hoặc lệnh GDM1 của đoạn mã trong bài. Cả dãy, chênh đều nhau Đây mới là chỗ đáng dùng lisp: lệnh GDM. Nhập cao độ thấp nhất và bước chênh cao, rồi chọn lần lượt từ thấp lên cao.

Hình 5. Ba tình huống, ba cách làm. Chỉ tình huống dưới cùng mới bõ công đi nạp tệp lisp.

Cách làmHợp khi nàoHạn chế
Properties, ô ElevationMột đường, hoặc nhóm đường cùng mứcCả nhóm nhận chung một số
CHANGE, tuỳ chọn ElevVài đường, không muốn cài thêm gìMọi điểm của đường phải cùng một Z
Lệnh GDMDãy dài, chênh cao đều nhauPhải chọn đúng thứ tự từ thấp lên cao
Lệnh GDM1Nhiều vòng rời cùng một mứcPhải nạp tệp lisp trước
ELEV và biến ELEVATIONĐặt trước khi vẽ nét mớiKhông đụng tới đường đã có

Kiểm lại sau khi gán

Gán xong đừng tin ngay. Có ba phép kiểm nhanh và đều không tốn gì.

Phép thứ nhất là xoay góc nhìn. Gõ VPOINT rồi nhập 1,-1,1, hoặc bấm một góc trên ViewCube, cả tờ bình đồ sẽ dựng thành bậc thang. Đường nào còn nằm bẹp dưới đáy là đường bị bỏ sót.

Phép thứ hai là bảng Properties. Chọn từng đường và đọc lại ô Elevation, đúng như bản cũ đã chỉ ở bước bốn. Chỗ này bản cũ nói chuẩn, chỉ viết sai chính tả tên bảng.

Phép thứ ba dành cho ai cẩn thận: chọn hết đường đồng mức rồi mở Properties, nếu ô Elevation hiện chữ *VARIES* thì các đường đang mang nhiều giá trị khác nhau, đúng như mong đợi. Còn nếu nó hiện một con số duy nhất, bạn vừa lỡ gán chung một mức cho tất cả.

Video dưới đây của kênh Sổ Tay Trắc Địa đi qua đúng trình tự vừa mô tả, làm trực tiếp trên một tờ bình đồ.

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

Lisp gán cao độ đường đồng mức có chạy trên AutoCAD LT không

Đoạn mã trong bài chạy được trên AutoCAD LT bản Windows từ đời 2024 trở đi, vì đó là đời đầu tiên LT có AutoLISP và DCL. Bản LT cũ hơn thì không, và bản cho macOS cũng không nạp được tệp .vlx.

Gõ GDM mà báo unknown command là vì sao

Ba khả năng theo thứ tự hay gặp. Một là tệp chưa nạp thật, do bạn bấm Load rồi bấm Close mà không để ý dòng báo ở đáy hộp thoại. Hai là SECURELOAD đang ở mức 2 nên tệp bị bỏ qua im lặng. Ba là bạn nạp ở bản vẽ này rồi mở bản vẽ khác, vì lisp chỉ sống trong tài liệu đã nạp nó.

Gán cao độ xong thì dựng mặt địa hình thế nào

AutoCAD bản thường không có công cụ dựng mặt từ đường đồng mức. Việc đó thuộc Civil 3D, nơi bộ đường đồng mức đã mang đúng cao độ sẽ trở thành dữ liệu đầu vào của một Surface. Nói cách khác, gán cao độ là bước chuẩn bị, không phải bước cuối.

Đường đồng mức của tôi là spline thì làm sao

Spline không có ô Elevation nên không gán theo cách trên được. Nếu đường đang nằm phẳng ở cao độ 0, hãy dời nó lên bằng lệnh MOVE: chọn đường, bấm một điểm gốc bất kỳ, rồi nhập độ dời dạng 0,0,cao độ. Đây là độ dời tương đối, nên đường đang ở cao độ khác 0 thì phải trừ đi phần đã có. Cách này dùng được cho mọi kiểu đối tượng, chỉ chậm vì phải làm từng đường.

Có nên tin con số chênh cao mặc định 10000 không

Không. Đó là giá trị người viết lisp để lại từ bản vẽ của họ, tính bằng milimét. Luôn tự nhập lại con số theo đơn vị bản vẽ của bạn.