Người làm hồ sơ đất đai và hạ tầng đi tìm lisp xuất tọa độ trong CAD vì cùng một việc: ghi toạ độ từng góc thửa lên bản vẽ rồi lập bảng thống kê, thay vì gõ tay từng con số.
Viện viết một tệp riêng cho việc ấy, và bài này in trọn mã nguồn ngay trong trang để bạn đọc trước khi chạy trên máy mình. Muốn học trọn khâu dựng hình và trình bày hồ sơ thì xem khóa AutoCAD Xây Dựng.
Xuất tọa độ trong CAD: việc cần làm gồm những gì
Một nhãn toạ độ đúng quy cách gồm bốn phần: đường dẫn từ điểm ra chỗ trống, hai dòng số xếp chồng, một vòng tròn mang số hiệu điểm, và cuối cùng là bảng thống kê gom hết lại.
Chỗ quyết định nằm ở thứ tự hai con số. Trắc địa Việt Nam quy ước X là trục bắc, Y là trục đông, trong khi AutoCAD thì X là ngang và Y là dọc. Nói cách khác, X trong bảng toạ độ phải lấy từ Y của AutoCAD.
Mọi bản lisp lưu hành đều đổi trục sẵn, và không hỏi bạn một câu nào. Dùng cho bản đồ địa chính thì đúng, nhưng dùng cho mặt bằng kiến trúc thì con số ra ngược mà không có dấu hiệu gì báo.
Một cách gọi khác hay gặp là lisp pick tọa độ trong cad, và nó chỉ ý định hẹp hơn: bấm một điểm rồi lấy ra cặp số, không cần nhãn cũng không cần bảng. Việc ấy AutoCAD làm sẵn bằng lệnh ID, và cách nhập toạ độ bằng bàn phím nằm ở bài nhập tọa độ trong CAD. Tệp lisp chỉ đáng dùng khi bạn cần nhãn và bảng, tức là khi làm hồ sơ chứ không phải khi tra một con số.
Tải lisp xuất tọa độ trong CAD của Viện
| Lệnh | Việc nó làm |
|---|---|
XTD | chọn các điểm, ghi nhãn toạ độ lên bản vẽ và lập bảng thống kê |
XTDCSV | chọn các điểm rồi ghi thẳng ra tệp .csv, mở bằng Excel |
Cả hai đều hỏi quy ước trục trước khi làm, mặc định là trắc địa. Ai vẽ kiến trúc thì gõ C để giữ nguyên trục của AutoCAD.
;;; ==================================================================
;;; XTD-IIC.LSP - ghi toa do len ban ve va lap bang thong ke
;;; Vien Tin hoc Xay dung (IIC) - Truong Dai hoc Xay dung Ha Noi
;;; https://iic.huce.edu.vn - Tel: 0989 427 809
;;; ------------------------------------------------------------------
;;; Lenh:
;;; XTD chon cac diem, ghi nhan toa do len ban ve va lap bang
;;; XTDCSV chon cac diem roi ghi thang ra tep .csv cho Excel
;;;
;;; Ca hai deu HOI quy uoc truc truoc khi lam, mac dinh la trac dia
;;; (X la truc bac, tuc la lay tu Y cua AutoCAD). Ai ve kien truc thi
;;; go C de giu nguyen truc cua AutoCAD.
;;;
;;; Bon dieu da do tren AutoCAD 2027 va lam theo:
;;; - rtos bi bien DIMZIN cat sach so 0 thua, 584320.00 in ra thanh
;;; 584320. Lenh dat DIMZIN ve 0 trong luc chay roi TRA LAI, ke ca
;;; khi nguoi dung bam ESC.
;;; - khong mot phong .shx Unicode cai san nao co du hinh chu tieng
;;; Viet (da do het 41 phong). Lenh tu thu kieu chu hien hanh,
;;; viet duoc thi dung luon, khong thi tao kieu IIC-VN bang TTF.
;;; - AutoLISP khong ghi duoc tep UTF-8, nen tieu de tep .csv de
;;; khong dau moi chac mo dung o moi may.
;;; - dung entmake chu khong dung (command "text" ...): kieu chu dat
;;; chieu cao co dinh thi dong hoi chieu cao bien mat va moi doi
;;; so sau do lech di mot nhip.
;;;
;;; 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))
;; Cat mot ban sao cac bien he thong roi tra lai nguyen ven.
;; Vao ("dimzin" "cmdecho") -> ra (("dimzin" . 8) ("cmdecho" . 1))
(defun iic-cat-bien (ten)
(mapcar (function (lambda (v) (cons v (getvar v)))) ten)
)
(defun iic-tra-bien (ban)
(foreach c ban (setvar (car c) (cdr c)))
(princ)
)
;;; ------------------------------------------------------------------
;;; Do xem mot kieu chu co viet duoc tieng Viet khong
;;; ------------------------------------------------------------------
;; Phong thieu hinh chu thi AutoCAD thay bang dau hoi, nen be rong
;; khung bao cua chu can thu va cua dau hoi bang nhau. Phep do co
;; doi chung la chinh dau hoi ay.
(defun iic-rong-cua (e / dt g1 g2)
(setq dt (vlax-ename->vla-object e))
(vla-getBoundingBox dt (quote g1) (quote g2))
(abs (- (car (vlax-safearray->list g2)) (car (vlax-safearray->list g1))))
)
;; Chuoi rong thi khong ve ra net nao, va vla-getBoundingBox nem loi
;; "Null extents". O trong cua dong TONG trong bang chinh la chuoi ay,
;; nen phai chan tu dau va van don loi cho chac.
(defun iic-be-rong (kieu ch / e r)
(cond
((or (null ch) (= ch "")) 0.0)
((not (entmake (list (cons 0 "TEXT") (cons 7 kieu)
(cons 10 (list 0.0 0.0 0.0)) (cons 40 1.0) (cons 1 ch))))
0.0)
(T
(setq e (entlast)
r (vl-catch-all-apply (function iic-rong-cua) (list e)))
(entdel e)
(if (vl-catch-all-error-p r) 0.0 r))
)
)
(defun iic-viet-duoc-tiengviet (kieu)
(> (abs (- (iic-be-rong kieu "ờ") (iic-be-rong kieu "?"))) 1e-6)
)
;; Ten kieu chu viet duoc tieng Viet, tao moi neu can.
(defun iic-xtd-kieu-viet (/ nay)
(setq nay (getvar "textstyle"))
(cond
((iic-viet-duoc-tiengviet nay) nay)
((tblsearch "style" "IIC-VN")
(princ "\n Kiểu chữ hiện hành không có dấu tiếng Việt, dùng kiểu IIC-VN.")
"IIC-VN")
((entmake (list (cons 0 "STYLE") (cons 100 "AcDbSymbolTableRecord")
(cons 100 "AcDbTextStyleTableRecord") (cons 2 "IIC-VN")
(cons 70 0) (cons 40 0.0) (cons 41 1.0) (cons 50 0.0)
(cons 71 0) (cons 42 2.5) (cons 3 "arial.ttf") (cons 4 "")))
(princ "\n Đã tạo kiểu IIC-VN (phông Arial) để chữ không ra dấu hỏi.")
"IIC-VN")
(T nay)
)
)
;;; ------------------------------------------------------------------
;;; Ve net va chu bang entmake
;;; ------------------------------------------------------------------
(defun iic-net (a b)
(entmake (list (cons 0 "LINE") (cons 10 a) (cons 11 b)))
)
(defun iic-tron (tam r)
(entmake (list (cons 0 "CIRCLE") (cons 10 tam) (cons 40 r)))
)
;; canh: 0 trai, 1 giua, 2 phai - tinh theo diem p
(defun iic-xtd-chu (p cao noi kieu canh)
(entmake (list (cons 0 "TEXT") (cons 7 kieu) (cons 10 p) (cons 11 p)
(cons 40 cao) (cons 1 noi) (cons 72 canh) (cons 73 0)))
)
;;; ------------------------------------------------------------------
;;; Quy uoc truc
;;; ------------------------------------------------------------------
;; Trac dia Viet Nam: X la truc bac, Y la truc dong. AutoCAD thi X
;; ngang, Y doc. Nen X cua bang phai lay tu Y cua AutoCAD.
(defun iic-cap-so (p trac-dia)
(if trac-dia (list (cadr p) (car p)) (list (car p) (cadr p)))
)
(defun iic-tieu-de (trac-dia)
(if trac-dia
(list "Tọa độ X (bắc)" "Tọa độ Y (đông)")
(list "Tọa độ X" "Tọa độ Y")
)
)
(defun iic-tieu-de-csv (trac-dia)
(if trac-dia
(list "Toa do X (bac)" "Toa do Y (dong)")
(list "Toa do X" "Toa do Y")
)
)
;;; ------------------------------------------------------------------
;;; Nhan toa do dat canh mot diem
;;; ------------------------------------------------------------------
;; Gom: vong tron mang so hieu diem, duong dan cheo len, mot doan ke
;; ngang, va hai dong so xep chong ben tren doan ke.
(defun iic-xtd-ghi-nhan (p stt so cao kieu / r goc khuyu ke rong c1 c2 dau)
(setq r (* 1.2 cao)
goc (/ pi 4.0)
khuyu (polar p goc (* 7.0 cao))
c1 (strcat "X = " (car so))
c2 (strcat "Y = " (cadr so))
rong (max (iic-be-rong kieu c1) (iic-be-rong kieu c2))
ke (polar khuyu 0.0 (* cao (+ rong 0.6)))
dau (polar khuyu 0.0 (* 0.3 cao)))
(iic-tron p r)
(iic-xtd-chu (list (car p) (- (cadr p) (* 0.5 cao)) 0.0) cao (itoa stt) kieu 1)
(iic-net (polar p goc r) khuyu)
(iic-net khuyu ke)
(iic-xtd-chu (polar dau (/ pi 2.0) (* 0.35 cao)) cao c2 kieu 0)
(iic-xtd-chu (polar dau (/ pi 2.0) (* 1.75 cao)) cao c1 kieu 0)
(princ)
)
;;; ------------------------------------------------------------------
;;; Bang thong ke
;;; ------------------------------------------------------------------
;; Be rong tung cot lay so LON HON giua be rong day so va be rong
;; tieu de, neu khong tieu de tran sang cot ben.
(defun iic-rong-cot (kieu cao tieu ds / r)
(setq r (iic-be-rong kieu tieu))
(foreach d ds (setq r (max r (iic-be-rong kieu d))))
(* cao (+ r 1.6))
)
(defun iic-xtd-ve-bang (goc cao kieu trac ds / w0 w1 w2 h x0 y n i hang ten)
(setq ten (iic-tieu-de trac)
w0 (iic-rong-cot kieu cao "TT" (mapcar (function car) ds))
w1 (iic-rong-cot kieu cao (car ten) (mapcar (function cadr) ds))
w2 (iic-rong-cot kieu cao (cadr ten) (mapcar (function caddr) ds))
h (* 2.0 cao)
n (length ds)
x0 (car goc)
y (cadr goc)
i 0)
;; duong ngang: mot duong tren cung, roi moi hang mot duong
(while (<= i (1+ n))
(iic-net (list x0 (- y (* i h)) 0.0)
(list (+ x0 w0 w1 w2) (- y (* i h)) 0.0))
(setq i (1+ i))
)
;; duong doc
(foreach dx (list 0.0 w0 (+ w0 w1) (+ w0 w1 w2))
(iic-net (list (+ x0 dx) y 0.0)
(list (+ x0 dx) (- y (* (1+ n) h)) 0.0))
)
;; tieu de
(iic-xtd-chu (list (+ x0 (* 0.5 w0)) (- y (* 0.65 h)) 0.0) cao "TT" kieu 1)
(iic-xtd-chu (list (+ x0 w0 (* 0.5 w1)) (- y (* 0.65 h)) 0.0) cao (car ten) kieu 1)
(iic-xtd-chu (list (+ x0 w0 w1 (* 0.5 w2)) (- y (* 0.65 h)) 0.0) cao (cadr ten) kieu 1)
;; tung hang: so thu tu can giua, hai cot so can phai cho thang hang don vi
(setq i 1)
(foreach hang ds
(iic-xtd-chu (list (+ x0 (* 0.5 w0)) (- y (* (+ i 0.65) h)) 0.0) cao (car hang) kieu 1)
(iic-xtd-chu (list (- (+ x0 w0 w1) (* 0.6 cao)) (- y (* (+ i 0.65) h)) 0.0)
cao (cadr hang) kieu 2)
(iic-xtd-chu (list (- (+ x0 w0 w1 w2) (* 0.6 cao)) (- y (* (+ i 0.65) h)) 0.0)
cao (caddr hang) kieu 2)
(setq i (1+ i))
)
(princ)
)
;;; ------------------------------------------------------------------
;;; Hoi quy uoc truc va chon diem
;;; ------------------------------------------------------------------
(defun iic-hoi-truc (/ tl)
(initget "TracDia Cad")
(setq tl (getkword "\nQuy ước trục [TracDia/Cad] <TracDia>: "))
(/= tl "Cad")
)
(defun iic-chon-diem (/ ds p)
(setq ds (list))
(while (setq p (getpoint "\nChọn điểm (Enter để dừng): "))
(setq ds (cons (trans p 1 0) ds))
)
(reverse ds)
)
;; Danh sach diem -> danh sach hang ("1" "x" "y") da lam tron hai chu so.
(defun iic-xtd-lap-hang (ds trac / i kq so)
(setq i 0 kq (list))
(foreach p ds
(setq i (1+ i)
so (iic-cap-so p trac)
kq (cons (list (itoa i) (rtos (car so) 2 2) (rtos (cadr so) 2 2)) kq))
)
(reverse kq)
)
;;; ------------------------------------------------------------------
;;; Lenh XTD
;;; ------------------------------------------------------------------
(defun c:XTD (/ *error* cu-error ban cao mac trac ds pb kieu hang i)
(setq cu-error *error*
ban (iic-cat-bien (list "dimzin" "cmdecho")))
(defun *error* (m)
(if (and m (/= m "Function cancelled") (/= m "quit / exit abort"))
(princ (strcat "\nIIC lỗi: " m)))
(iic-tra-bien ban)
(iic-dong-undo)
(setq *error* cu-error)
(princ)
)
(iic-bang-ten)
(setvar "dimzin" 0)
(setq mac (getvar "textsize"))
(if (<= mac 1e-8) (setq mac 2.5))
(setq cao (getreal (strcat "\nChiều cao chữ <" (rtos mac 2 2) ">: ")))
(if (or (null cao) (<= cao 1e-8)) (setq cao mac))
(setq trac (iic-hoi-truc)
ds (iic-chon-diem))
(if (null ds)
(princ "\nKhông chọn điểm nào.")
(progn
(setq hang (iic-xtd-lap-hang ds trac))
(if (setq pb (getpoint "\nVị trí đặt bảng (góc trên bên trái): "))
(progn
(setvar "cmdecho" 0)
(iic-mo-undo)
(setq kieu (iic-xtd-kieu-viet) i 0)
(foreach p ds
(setq i (1+ i))
(iic-xtd-ghi-nhan p i (cdr (nth (1- i) hang)) cao kieu)
)
(iic-xtd-ve-bang (trans pb 1 0) cao kieu trac hang)
(iic-dong-undo)
(princ (strcat "\nĐã ghi " (itoa (length ds)) " điểm."))
)
)
)
)
(iic-tra-bien ban)
(setq *error* cu-error)
(princ)
)
;;; ------------------------------------------------------------------
;;; Lenh XTDCSV
;;; ------------------------------------------------------------------
(defun c:XTDCSV (/ *error* cu-error ban trac ds tep f ten)
(setq cu-error *error*
ban (iic-cat-bien (list "dimzin")))
(defun *error* (m)
(if (and m (/= m "Function cancelled") (/= m "quit / exit abort"))
(princ (strcat "\nIIC lỗi: " m)))
(iic-tra-bien ban)
(setq *error* cu-error)
(princ)
)
(iic-bang-ten)
(setvar "dimzin" 0)
(setq trac (iic-hoi-truc)
ds (iic-chon-diem))
(if (null ds)
(princ "\nKhông chọn điểm nào.")
(progn
(setq tep (getfiled "Ghi tọa độ ra tệp" "toa-do" "csv" 1))
(if (and tep (setq f (open tep "w")))
(progn
(setq ten (iic-tieu-de-csv trac))
(write-line (strcat "TT," (car ten) "," (cadr ten)) f)
(foreach h (iic-xtd-lap-hang ds trac)
(write-line (strcat (car h) "," (cadr h) "," (caddr h)) f)
)
(close f)
(princ (strcat "\nĐã ghi " (itoa (length ds)) " điểm ra " tep))
)
(princ "\nKhông ghi được tệp.")
)
)
)
(iic-tra-bien ban)
(setq *error* cu-error)
(princ)
)
(princ "\nXTD-IIC.LSP: go XTD de ghi nhan va lap bang, XTDCSV de xuat ra Excel.")
(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 bấm 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. Cách nạp chi tiết nằm ở bài lisp cắt dim.
Bước 2 — Chạy lệnh XTD
Gõ XTD rồi Enter. Ba câu hỏi lần lượt hiện ra:
Chiều cao chữ <2.50>:
Quy ước trục [TracDia/Cad] <TracDia>:
Chọn điểm (Enter để dừng):
Chiều cao chữ để mặc định là lấy theo biến TEXTSIZE của bản vẽ. Quy ước trục cứ Enter nếu làm hồ sơ đất đai. Rồi bấm lần lượt các góc thửa, xong thì Enter.
Bước 3 — Đặt bảng thống kê
Vị trí đặt bảng (góc trên bên trái):
Bấm một điểm ở chỗ trống. Bảng tự dựng với ba cột, bề rộng cột lấy theo con số dài nhất, và tiêu đề ghi rõ cột nào là bắc, cột nào là đông. Máy báo:
Đã ghi 5 điểm.
Bước 4 — Hoặc xuất thẳng ra Excel
Gõ XTDCSV, chọn điểm như trên, rồi chọn chỗ lưu. Tệp .csv mở bằng Excel ra đúng ba cột, khỏi phải chép tay từ bảng trên bản vẽ sang bảng tính.
Lisp xuất tọa độ từ CAD sang Excel: tệp ra trông thế nào
Lệnh XTDCSV sinh ra để làm đúng việc này. Nó không vẽ gì lên bản vẽ: chỉ hỏi quy ước trục, cho bạn bấm các điểm, rồi ghi thẳng ra một tệp .csv. Excel mở .csv như mở bảng tính bình thường, không phải chuyển đổi gì thêm.
Chạy thật với năm điểm rồi mở tệp ra đọc từng byte. Tệp nặng đúng 150 byte, nội dung nguyên văn:
TT,Toa do X (bac),Toa do Y (dong)
1,-3507724.07,2732.19
2,-3507724.07,6932.19
3,-3504224.07,7632.19
4,-3502524.07,4532.19
5,-3505124.07,2032.19
Đọc chính tệp ấy thấy được ba điều.
Hai chữ số thập phân còn nguyên. Đây đúng là chỗ bản lisp đang lưu hành hay đánh mất, và nguyên nhân nằm ở biến DIMZIN — nói kỹ ở mục ngay dưới.
Tiêu đề cột để không dấu. Không phải cẩu thả. AutoLISP không ghi được tệp UTF-8, nên chữ có dấu sẽ thành chuỗi escape khi Excel mở ra. Chi tiết kết quả nằm ở mục về tiếng Việt phía dưới.
Xuống dòng theo kiểu Windows. Tệp dùng CRLF, đúng thứ Excel trên Windows chờ đợi, nên mở lên là ra ngay ba cột.
Ai quen gọi việc này là lisp xuất tọa độ trong cad ra excel thì cũng chính là lệnh ấy, không có lệnh nào khác. Còn muốn xuất tọa độ từ CAD sang Excel mà không qua lisp thì vẫn có đường: ghi bảng bằng lệnh XTD rồi chép tay sang bảng tính — đúng việc mà tệp này sinh ra để khỏi phải làm.
Ba chỗ bản lisp đang lưu hành làm hỏng
Bản phổ biến nhất có 104 dòng mã. Nó chạy được, và ý tưởng thì đúng. Nhưng có ba chỗ hỏng, cả ba đều kiểm được trên máy.
Thứ nhất là bảng mã. Trong mã nguồn, tiêu đề cột viết là Täa ®é Y. Đó là chữ Tọa độ Y gõ bằng bảng mã TCVN3 của những năm 2000, chỉ hiện đúng khi bản vẽ dùng đúng phông ấy. Trên máy dùng phông Unicode thông thường, nó ra đúng như ảnh trên.
Thứ hai là phần thập phân. Trang rtos của Autodesk ghi rõ hàm này chịu ảnh hưởng của nhiều biến: "according to the settings of mode, precision, and the AutoCAD UNITMODE, DIMZIN, LUNITS, and LUPREC system variables". Hàm rtos cắt sạch số 0 thừa khi biến DIMZIN bằng 8, mà 8 là giá trị của phần lớn bản vẽ theo hệ mét. Toạ độ 584320.00 in ra thành 584320. Hồ sơ trắc địa mất hai chữ số thập phân là hỏng. Bản của Viện tắt DIMZIN trong lúc chạy rồi trả lại nguyên giá trị cũ, kể cả khi bạn bấm ESC.
Thứ ba là không có bẫy lỗi. Bản cũ mở một nhóm hoàn tác bằng Undo Begin nhưng không có hàm *error*. Bấm ESC giữa chừng là nhóm ấy bỏ ngỏ, và biến CMDECHO nằm lại ở 0 — đo được đúng con số ấy sau khi bấm ESC. Dòng lệnh từ đó thôi hiện lệnh đang chạy, và người dùng không hiểu vì sao.
Nói cho công bằng: Nghe thì tưởng bản cũ cũng bỏ quên chế độ bắt điểm, nhưng OSMODE vẫn về đúng giá trị cũ. Chỗ ấy họ làm đúng.
Tiếng Việt có dấu trong bảng toạ độ
Bảng do lệnh XTD vẽ ra ghi Tọa độ X (bắc) và Tọa độ Y (đông), đủ dấu, bằng Unicode. Muốn làm được điều ấy thì phải trả lời một câu hỏi mà ít tài liệu nói rõ: kiểu chữ nào của AutoCAD viết được tiếng Việt?
Trên bản 2027, thử cả 41 phông .shx Unicode mà AutoCAD cài sẵn. Kết quả, kèm cả trường hợp ngược lại: vẽ thử ký tự ờ, vẽ thử dấu ?, rồi đọc bề rộng khung bao của cả hai. Phông thiếu glyph thì AutoCAD thay bằng dấu hỏi, nên hai bề rộng bằng nhau.
| Kết quả đo trên 41 phông .shx Unicode | Số phông |
|---|---|
| Có đủ glyph tiếng Việt | 0 |
Chỉ có chữ Đ, không có dấu thanh | 1 (GENISO.shx) |
| Không có, chữ ra dấu hỏi | 40 (gồm romans, simplex, txt, isocp) |
Tài liệu About Unicode Font Descriptions của Autodesk viết rằng một phông Unicode "is capable of supporting all languages and platforms". Câu ấy đúng về định dạng, nhưng định dạng không phải là hình chữ. Phông theo chuẩn Unicode mà trong tệp không có hình chữ ờ thì AutoCAD vẫn phải vẽ ra dấu hỏi.
Vì thế lệnh XTD tự đo kiểu chữ hiện hành bằng đúng phép thử trên trước khi viết. Bản vẽ của bạn đã có kiểu chữ viết được tiếng Việt thì lệnh dùng luôn kiểu ấy, giữ nguyên phông riêng của hồ sơ. Không viết được thì lệnh tự tạo kiểu IIC-VN bằng phông TrueType có sẵn trong mọi máy Windows, rồi báo rõ trên dòng lệnh là nó vừa làm gì. Không phải cài thêm phông nào.
Riêng lệnh XTDCSV thì tiêu đề tệp vẫn để không dấu, và đây là chỗ phải chịu. Hai cách ghi tệp của AutoLISP: hàm write-line ghi theo bảng mã ANSI của máy, ký tự ngoài bảng mã bị đổi thành chuỗi \U+1ECD, nên Tọa độ mở bằng Excel sẽ ra T\U+1ECDa \U+0111\U+1ED9. Hàm write-char cũng vậy: ghi thử đủ 255 mã, 128 mã đầu đi qua nguyên vẹn còn 128 mã sau đều bị đổi thành chuỗi escape. AutoLISP không ghi được tệp UTF-8, nên tiêu đề CSV để không dấu là cách duy nhất chắc chắn mở đúng ở mọi máy.
Mã của Viện khác ở đâu
| Chỗ | Bản lưu hành | Bản của Viện |
|---|---|---|
| Quy ước trục | đổi sẵn, không hỏi | hỏi một câu, mặc định trắc địa |
| Phần thập phân | phụ thuộc DIMZIN, hay mất | ép đúng hai chữ số rồi trả biến về |
| Bấm ESC giữa chừng | nhóm hoàn tác bỏ ngỏ, CMDECHO kẹt ở 0 | có hàm *error*, trả lại hết |
| Tiêu đề bảng | bảng mã TCVN3, ra chữ lạ | tiếng Việt Unicode có dấu, lệnh tự chọn kiểu chữ viết được |
| Bề rộng cột | tính theo số, tiêu đề tràn sang cột bên | lấy số lớn hơn giữa bề rộng số và bề rộng tiêu đề |
| Xuất ra Excel | không có | lệnh XTDCSV |
Một khác biệt nữa nằm ở chỗ ít ai để ý: biến cục bộ. Bản cũ để bảy biến chạy ra ngoài phạm vi hàm, gồm cả những tên rất dễ trùng như k và n. Tệp lisp khác đang nạp cùng phiên mà dùng chung tên ấy thì hai bên ghi đè lẫn nhau, và lỗi hiện ra ở chỗ chẳng liên quan gì. Bản của Viện khai hết biến trong danh sách cục bộ.
Còn một chi tiết kỹ thuật đáng nói. Bản cũ tạo chữ bằng (command "text" ...). Cách ấy hỏng khi kiểu chữ hiện hành đặt chiều cao cố định, vì lúc đó dòng hỏi chiều cao biến mất và mọi đối số sau đó lệch đi một nhịp. Bản của Viện dựng chữ bằng entmake, không phụ thuộc kiểu chữ.
Ba điều hay nghe nhưng không đúng
| Điều hay nghe | Thực tế |
|---|---|
| Lisp xuất toạ độ nào cũng như nhau | Khác ở chỗ đổi trục, số lẻ và bẫy lỗi — ba chỗ quyết định hồ sơ đúng hay sai |
| Bảng ra chữ lạ là do máy thiếu phông | Là do mã nguồn viết bằng bảng mã đời cũ, đổi phông không chữa được |
| Muốn có tệp Excel thì phải chép tay | Ghi thẳng ra .csv từ lisp, mở bằng Excel là xong |
Câu hỏi thường gặp
Lisp lấy tọa độ chạy xong mà số không có phần thập phân?
Đó là biến DIMZIN. Đặt nó về 0 trước khi chạy, hoặc dùng tệp ở bài này vì nó tự xử lý rồi trả biến về.
Vì sao cột X trong bảng lại là số của trục đứng?
Vì quy ước trắc địa Việt Nam lấy X là trục bắc. AutoCAD gọi trục đứng là Y, nên bảng phải đổi. Làm mặt bằng kiến trúc thì chọn Cad để giữ nguyên.
Ghi tọa độ trong CAD cho hàng trăm điểm có chậm không?
Không. Lệnh chỉ vẽ nét và chữ, không gọi lệnh nặng nào. Chỗ mất thời gian là bấm chuột chọn điểm.
Bấm nhầm rồi thì sao?
Gõ U một lần. Cả lượt đượ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.
Tệp .csv mở bằng Excel bị dồn hết vào một cột?
Đó là do Excel đang đặt dấu phân cách là chấm phẩy. Mở bằng chức năng nhập dữ liệu rồi chọn dấu phẩy, hoặc đổi trong tuỳ chọn vùng của Windows.