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.
Chuyên trang:
MẠNG XÂY DỰNG
- Cung cấp những kiến thức cơ bản nhất về ngành xây dựng
- Chia sẻ những video hướng dẫn bản quyền
- Crack những phần mềm nổi tiếng như: Hitosoft, G8, Autocad, Revit, sap,...
- Mọi thông tin liên hệ: ksphamtai@gmail.com
- Vui lòng ghi rõ thông tin khi chia sẻ qua các trang xã hội khác
MẠNG XÂY DỰNG
- Cung cấp những kiến thức cơ bản nhất về ngành xây dựng
- Chia sẻ những video hướng dẫn bản quyền
- Crack những phần mềm nổi tiếng như: Hitosoft, G8, Autocad, Revit, sap,...
- Mọi thông tin liên hệ: ksphamtai@gmail.com
- Vui lòng ghi rõ thông tin khi chia sẻ qua các trang xã hội khác
