Tự Học Autolisp Cơ Bản
Mình sẽ dựa theo bài tham khảo của những tiền bối khác để tổng hợp lại việc bắt đầu với Autolisp theo cách riêng của mình. Hi vọng mọi người sẽ có hứng thú với nó. Việc ứng dụng lisp đem lại hiệu quả rất khác là điều không phải bàn cãi, nhưng về lâu dài việc bạn có thể tự lập trình một lisp cho riêng mình sẽ cho bạn một cảm giác thú vị không diễn tả được bằng lời đâu. Tin mình đi.
Okie… Giờ chúng ta bắt đầu.
Phần 1:B1: Copy đoạn code sau [của bác Ssg] vào notepad rồi save lại dưới tên hinhin.lsp [Lưu ý: Encoding ANSI theo mặc định, không được save as dạng Unicode]
(
defun C:hinhin(/ W H1 H2 p1 p2 p3 p4 p5 OldOs)
;;;Nhap so lieu
(setq
W (getreal “\nChieu rong nha W = “)
H1 (getreal “\nChieu cao nha H1 = “)
H2 (getreal “\nChieu cao chop nha H2 = “)
p1 (getpoint “\nDiem chuan: “)
;;;———————————————————-
;;;Tinh toa do
p2 (polar p1 0.0 W)
p3 (polar p2 (/ pi 2) H1)
p4 (polar p3 pi W)
p5 (list (+ (car p4) (/ W 2)) (+ (cadr p4) H2))
)
;;;———————————————————-
;;;Luu bien osmode
(setq OldOs (getvar “osmode”))
;;;———————————————————-
;;;Set object snap OFF
(setvar “osmode” 0)
;;;———————————————————-
;;;Goi lenh AutoCAD
(command “line” p1 p2 p3 p4 “c”)
(command “line” p3 p5 p4 “”)
;;;———————————————————-
;;;Tai lap osmode
(setvar “osmode” OldOs)
;;;———————————————————-
(princ)
)
;;;———————————————————-
;;;SUMMARY: setq, getreal, getpoint, polar, list, car, cadr, caddr,
+ – * /, command, comment, getvar, setvar, princ
- B2: Mở AutoCad lên, vào Tools => Load Application để load file hinhin.lsp. Khi có thông báo hinhin.lsp successfully loaded là được.
- B3: Gõ lệnh hinhin để chạy trương trình. Làm theo thông báo cho đến khi hết chương trình.
Okie. Sau khi chạy thử bạn có thể phần nào hiểu được ứng dụng của lisp trong AutoCad rồi, chúng ta sẽ tìm hiểu kĩ hơn chức năng của từng dòng lệnh.
Giờ ta sẽ tìm hiểu xem lisp là gì và ứng dụng của nó ra sao [Cũng giống như ta phải cảm thấy một cô gái thú vị ra sao đó rồi mới tìm hiểu về cô gái ấy ra ấy vậy ^^~]
1. Lisp là gì?
- Lisp là một ngôn ngữ lập trình kiểu thông dịch chạy trong môi trường AutoCad, sử dụng các mã lisp giúp AutoCAD mạnh hơn, nhanh hơn, thú vị hơn rất nhiều.
2. Cách sử dụng?
- Bạn vào Tools => Load Application để load file lisp (lệnh tắt ap). Click vào ô contents trong phần Startup suite để AutoCad tự động load lisp này mỗi khi khởi động AutoCad.
- Tại dòng nhắc lệnh command của AutoCad gõ trực tiếp lệnh của lisp vào.
3. Tên lệnh của lisp?
Chính là tên sau dòng mã defun C: [Ở ví dụ trên là hinhin]
Okie… Tiếp theo chúng ta sẽ đi vào phân tích một chương trình lisp… Lấy ví dụ lisp ở bài 1.
- Một biểu thức lisp luôn luôn bắt đầu bằng dấu mở ngoặc đơn và kết thúc bằng dấu đóng ngoặc đơn. Do đó trong biểu thức hoặc chương trình lisp, số lượng dấu mở ngoặc luôn luôn đúng bằng số lượng dấu đóng ngoặc.
- Biểu thức lisp có thể rất đơn giản như: (princ “\n Chao mung den voi giothangmuoi.info”)
Nhưng cũng có khi lồng ghép vào với nhau tạo thành một biểu thức lisp phức tạp, một chương trình lisp cũng có thể coi là một biểu thức lisp phức tạp.
Giờ ta thử phân tích từng dòng lệnh của lisp trên để có cái nhìn cơ bản về nó.
defun C:hinhin(/ W H1 H2 p1 p2 p3 p4 p5 OldOs)
=>
- Gán tên lệnh để thực thi lisp là hinhin.
- Các biến số trong lisp là W H1 H2 p1…
;;;Nhap so lieu
=>
- Các thông số đặt sau ;;; dùng để giải thích, nó không có tác dụng hay ảnh hưởng gì trong lisp, đôi khi chúng ta dùng nó để phân cách các hàm cho dễ nhìn kiểu như ;;;—— ở trên.
(setq
W (getreal “\nChieu rong nha W = “)
…
)
=>
- Xuống dòng, hiển thị trên Text Windown của AutoCad dòng chữ “Chieu rong nha W =”
- Chờ người dùng nhập giá trị từ bàn phím vào và enter
- Đọc giá trị người dùng nhập, chuyển thành số thực (real), gán giá trị đó cho biến W
Phần 2:
Trong phần 1, chúng ta đã xây dựng được 1 chương trình lisp có thể nói là thô sơ nhất thế giới. Và nó có 1 nhược điểm: mỗi lần load thì viết ra lệnh. Muốn viết lại phải appload thêm 1 lần nữa.
Để điều khiển được thời điểm viết, và viết được nhiều lần, chúng ta phải định nghĩa một hàm AutoCAD, để mỗi khi gọi hàm này, chương trình sẽ viết ra màn hình text mà không cần phải appload lại file lisp. Trên file hoclisp.lsp, chúng ta thêm mã lệnh để trở thành như sau:
(defun c:chao()
(princ “\nChao bant”)
(princ)
)
Như vậy chúng ta đã định nghĩa được một lệnh của AutoCAD mang tên chao, mỗi lần gọi lệnh chao tại dòng nhắc Command, chương trình sẽ viết ra trên màn hình text dòng chữ: Chao ban.
Trong 2 dòng vừa thêm, hàm defun là hàm định nghĩa lệnh AutoCAD. Có cấu trúc: (defun tenham() noidungham) trong đó:
- tenham là tên hàm cần định nghĩa, nếu muốn định nghĩa một lệnh trong AutoCAD thì thêm ‘C:’ vào trước tên hàm.
- noidungham là tập các lệnh mà hàm vừa định nghĩa sẽ thực thi.
Phần 3:Trong phần 2, chúng ta đã tạo được một chương trình lisp có giao tiếp với AutoCAD thông qua tên lệnh. Tại phần 3 này, chúng ta sẽ viết một chương trình thực sự, có ích hẳn hoi.
Đó là chương trình tính diện tích của một đối tượng. Trên file hoclisp.lsp, hãy sửa tên hàm chao thành tdt và thêm các mã lệnh như sau:
(defun c:tdt( / sel ent dientich)
(princ “\nChao ban”)
(setq sel (entsel “\nHay chon doi tuong: “))
(setq ent (car sel))
(command “.area” “o” ent)
(setq dientich (getvar “area”))
(princ “\nDien tich doi tuong vua roi la: “)
(princ dientich)
(princ “\nm2″)
(princ)
)
Bạn thử appload file hoclisp.lsp mới và gọi lệnh tdt thử xem, chương trình sẽ yêu cầu bạn nhập vào 1 đối tượng. Và nó sẽ kết xuất diện tích đối tượng vừa rồi ra màn hình:
Command: tdt
Chao ban
Hay chon doi tuong: .area
Specify first corner point or [Object/Add/Subtract]: o
Select objects:
Area = 46546736.0000, Perimeter = 28320.0000
Command:
Dien tich doi tuong vua roi la: 4.65467e+007m2
Điều gì làm nên sự khác biệt này vậy: chúng ta hãy lần theo từng lệnh nhé.
- Lệnh (entsel “\nHay chon doi tuong: “) là lệnh trả về đối tượng được pick, kết quả trả về là một tập hợp gồm 2 thành phần: thứ nhất là đối tượng được pick, thứ 2 là tọa độ pick.
- Lệnh (setq sel (entsel “\nHay chon doi tuong: “)) là lệnh gán kết quả vừa pick vào biến sel. Bạn nhớ là lệnh (setq a là gán giá trị a bằng giá trị b.
Trong trường hợp này a là sel, b là kết quả của hàm entsel.
- Lệnh (car sel) là lệnh lấy giá trị đầu tiên của biến sel (biến sel có dạng tập hợp) tức là đối tượng được chọn.
- lệnh (setq ent (car sel)) là lệnh gán giá trị biến ent bằng ename của đối tượng được chọn. ename của một đối tượng là giá trị chỉ ra đối tượng trong một bản vẽ cad.
Như vậy, 2 dòng lệnh
(setq sel (entsel “\nHay chon doi tuong: “))
(setq ent (car sel))
có ý nghĩa là gán giá trị biến ent cho đối tượng vừa được chọn bằng phương pháp pick. Tiếp đến, lệnh (command “.area” “o” ent) tương đương với gõ tại dòng lệnh command:.area rồi gõ tiếp o và pick đối tượng. Bạn nhớ là lệnh (command a b c d e f…) tương đương với việc gõ các giá trị a, b, c, d, e, f … vào dòng lệnh của cad.
Như vậy, lệnh trên tương đương với việc tính diện tích của đối tượng vừa được chọn.
- Lệnh (setq dientich (getvar “area”)) : gán giá trị biến dientich bằng giá trị của biến hệ thống AREA
(biến hệ thống AREA chứa diện tích vừa được tính bằng lệnh AREA trước đó của cad).
-cụm lệnh:
(princ “\nDien tich doi tuong vua roi la: “)
(princ dientich)
(princ “m2″)
chắc chắn bạn biết đó là lệnh viết dòng chữ ‘Dien tich doi tuong vua roi la: ‘ diện tích đối tượng vừa rồi ‘m2′. Trên màn hình bạn còn nhìn thấy các dòng chữ khác ngoài dòng chữ trên đó là do các lệnh area của CAD sinh ra.
Trong bài học sau chúng ta sẽ biết cách loại bỏ chữ này.