Để tự viết tiện ích AutoLISP, bạn cần nắm các hàm thường dùng nhất. Bài viết giới thiệu bộ hàm cơ bản cho người mới: cú pháp ngoặc đơn, setq gán biến, nhóm hàm get (getpoint, getreal, getstring) nhận dữ liệu, command gọi lệnh AutoCAD, defun tạo lệnh mới, if xử lý điều kiện, các hàm toán học và xử lý điểm kèm ví dụ ghép thành một lệnh hoàn chỉnh.
Hàm AutoLISP Thường Dùng: Bộ Lệnh Cơ Bản Cho Người Mới
Sau khi biết AutoLISP là gì và cách nạp file Lisp, bước tiếp theo để tự viết được tiện ích là nắm các hàm AutoLISP thường dùng. Hàm là các khối lệnh dựng sẵn, mỗi hàm làm một việc cụ thể như gán biến, hỏi người dùng, gọi lệnh AutoCAD hay tính toán. Thuộc một số hàm cốt lõi là đủ để bạn bắt đầu viết các lệnh tự động hữu ích.
Bài viết giới thiệu bộ hàm AutoLISP cơ bản cho người mới: cú pháp ngoặc đơn, setq, nhóm hàm get nhận dữ liệu, command, defun, if, các hàm toán học và xử lý điểm, ví dụ ghép thành một lệnh và mẹo. Đây là bài trong loạt thiết kế AutoCAD trên AutoLISP, nối tiếp AutoLISP là gì bạn đã học.
Cú pháp ngoặc đơn của AutoLISP
Mọi biểu thức trong AutoLISP đều bao trong cặp dấu ngoặc đơn, với cấu trúc: mở ngoặc, tên hàm, rồi các tham số, cuối cùng đóng ngoặc. Ví dụ biểu thức cộng hai và ba được viết là mở ngoặc, dấu cộng, hai, ba, đóng ngoặc, và cho kết quả năm.
Điểm đặc trưng là tên hàm hoặc toán tử luôn đứng đầu, trước các tham số, gọi là ký pháp tiền tố. Các biểu thức có thể lồng nhau, một biểu thức làm tham số cho biểu thức khác. Vì vậy, việc cân đối số dấu ngoặc mở và đóng là cực kỳ quan trọng. Nắm vững cú pháp ngoặc đơn là nền tảng để đọc và viết mọi hàm AutoLISP, vì toàn bộ ngôn ngữ đều dựa trên cấu trúc này.
Hàm setq: gán giá trị cho biến
Hàm setq là hàm cơ bản và dùng nhiều nhất, dùng để gán một giá trị cho một biến. Ví dụ setq r 50 nghĩa là gán giá trị 50 cho biến tên r. Sau đó, bạn có thể dùng lại biến r ở những chỗ khác trong mã, và nó mang giá trị đã gán.
Biến trong AutoLISP có thể chứa số, chuỗi chữ, toạ độ điểm, hoặc kết quả của một hàm khác. Ví dụ thường gặp là gán kết quả của một hàm hỏi người dùng vào biến để dùng tiếp. setq cho phép gán nhiều biến cùng lúc bằng cách liệt kê từng cặp tên và giá trị. Hiểu setq là điều kiện để lưu trữ và tái sử dụng dữ liệu trong chương trình, là viên gạch đầu tiên của mọi lệnh Lisp.
(setq r 50) ; gán 50 cho r (setq p (getpoint)) ; gán điểm chọn vào p
Nhóm hàm nhận dữ liệu: getpoint, getreal, getstring
Để chương trình tương tác với người dùng, AutoLISP có nhóm hàm bắt đầu bằng get. Hàm getpoint yêu cầu người dùng chọn một điểm trên màn hình và trả về toạ độ điểm đó. Hàm getreal yêu cầu nhập một số thực, ví dụ bán kính hay khoảng cách. Hàm getstring nhận vào một chuỗi chữ.
Các hàm này thường kèm một câu nhắc hiển thị trên dòng lệnh để hướng dẫn người dùng, ví dụ nhắc Chọn tâm hay Nhập bán kính. Kết quả trả về thường được gán vào biến bằng setq để dùng tiếp. Ngoài ba hàm trên còn có getint cho số nguyên, getangle cho góc và nhiều hàm get khác. Nắm nhóm hàm nhận dữ liệu giúp lệnh của bạn linh hoạt, nhận thông tin từ người dùng thay vì cố định cứng trong mã.
Hàm command: gọi lệnh AutoCAD
Hàm command là cầu nối giữa AutoLISP và các lệnh quen thuộc của AutoCAD. Nó cho phép gọi và chạy bất kỳ lệnh nào ngay trong mã Lisp, kèm các tham số. Ví dụ command với chuỗi circle, một điểm tâm và một bán kính sẽ vẽ một đường tròn đúng như khi bạn gõ lệnh CIRCLE bằng tay.
Trong hàm command, tên lệnh được viết trong dấu ngoặc kép, theo sau là các giá trị mà lệnh yêu cầu theo đúng thứ tự. Đây chính là cách AutoLISP thực hiện các thao tác vẽ và hiệu chỉnh thực tế trên bản vẽ. Hầu hết các tiện ích Lisp đều dùng command để tự động hoá các lệnh. Nắm hàm command giúp bạn biến dữ liệu và logic trong Lisp thành hành động cụ thể trên bản vẽ.
Hàm defun: định nghĩa lệnh mới
Hàm defun dùng để định nghĩa một hàm hoặc một lệnh mới. Điều quan trọng cho người mới là khi đặt tên hàm bắt đầu bằng c: theo sau là tên lệnh, ví dụ c:TRON, thì bạn tạo ra một lệnh có thể gõ trực tiếp từ dòng lệnh AutoCAD, ở đây là gõ TRON để chạy.
Sau tên, trong cặp ngoặc, bạn có thể khai báo các tham số và biến cục bộ, biến cục bộ đặt sau dấu gạch chéo để chỉ tồn tại trong hàm. Thân hàm gồm các biểu thức được thực hiện khi lệnh chạy. defun chính là hàm gói toàn bộ logic của một tiện ích lại thành một lệnh dùng được. Nắm defun là bước quyết định để chuyển từ các đoạn mã rời rạc thành một lệnh hoàn chỉnh mà bạn và người khác có thể gọi.
Hàm if và xử lý điều kiện
Hàm if cho phép chương trình ra quyết định dựa trên một điều kiện. Cấu trúc gồm: if, một biểu thức điều kiện, nhánh thực hiện khi điều kiện đúng, và tùy chọn một nhánh khi điều kiện sai. Ví dụ kiểm tra nếu bán kính lớn hơn không thì vẽ đường tròn, ngược lại thì báo lỗi.
Điều kiện thường dùng các hàm so sánh như lớn hơn, nhỏ hơn, bằng. Nhờ if, lệnh của bạn có thể phản ứng khác nhau tùy dữ liệu nhập, ví dụ kiểm tra hợp lệ trước khi thực hiện. Đây là bước nâng cao hơn so với chỉ chạy tuần tự, mang lại sự thông minh cho chương trình. Cùng với if, AutoLISP còn có các hàm điều khiển khác như cond, while cho vòng lặp. Nắm if giúp bạn viết các lệnh an toàn và linh hoạt hơn.
Hàm toán học và xử lý điểm
AutoLISP có đầy đủ các hàm toán học cơ bản như cộng, trừ, nhân, chia, đều viết theo ký pháp tiền tố với toán tử đứng trước. Bên cạnh đó là nhóm hàm xử lý toạ độ điểm rất hữu ích trong vẽ kỹ thuật. Hàm car lấy thành phần X của một điểm, hàm cadr lấy thành phần Y.
Hàm distance tính khoảng cách giữa hai điểm, hàm polar trả về một điểm mới cách một điểm cho trước theo một góc và một khoảng cách. Các hàm này cho phép bạn tính toán vị trí, kích thước ngay trong chương trình, ví dụ tính điểm đặt, độ dài, hay tạo các điểm theo quy luật. Nắm nhóm hàm toán học và xử lý điểm giúp bạn viết các tiện ích tính toán và dựng hình tự động, vượt xa việc chỉ gọi lệnh đơn thuần.
Ví dụ thực hành: ghép các hàm thành một lệnh
Hãy ghép các hàm đã học thành một lệnh vẽ tròn nhập tâm và bán kính. Dùng defun đặt tên c:VT để tạo lệnh VT. Bên trong, dùng getpoint để hỏi tâm và gán vào biến p bằng setq, dùng getreal để hỏi bán kính và gán vào biến r.
Sau đó dùng command gọi lệnh circle với điểm p và bán kính r để vẽ. Kết thúc hàm bằng princ để tránh in giá trị thừa ra dòng lệnh. Sau khi nạp file chứa lệnh này, bạn gõ VT, chương trình sẽ hỏi tâm, hỏi bán kính rồi tự vẽ đường tròn. Ví dụ nhỏ này cho thấy cách các hàm cơ bản kết hợp thành một tiện ích thực dụng, và là khuôn mẫu để bạn phát triển các lệnh phức tạp hơn.
(defun c:VT ( / p r ) (setq p (getpoint "\nChon tam: ")) (setq r (getreal "\nNhap ban kinh: ")) (command "circle" p r) (princ))
Mẹo và lỗi thường gặp với hàm AutoLISP
Một số mẹo giúp viết hàm AutoLISP hiệu quả. Luôn đếm và cân đối số dấu ngoặc mở và đóng, dùng trình soạn thảo có tô màu và bắt cặp ngoặc để hỗ trợ. Khai báo biến cục bộ sau dấu gạch chéo trong defun để tránh biến rò rỉ ra ngoài. Viết câu nhắc rõ ràng cho các hàm get để dễ dùng.
Lỗi thường gặp gồm thiếu dấu ngoặc đóng gây lỗi danh sách sai cấu trúc, quên hàm princ ở cuối nên dòng lệnh in ra giá trị thừa, và dùng sai thứ tự tham số trong command khiến lệnh chạy sai. Một lỗi khác là dùng biến chưa được gán giá trị. Khi gặp lỗi, hãy đọc thông báo trên dòng lệnh và kiểm tra ngoặc, tên biến. Nắm các lỗi này giúp bạn viết hàm chạy đúng và dễ sửa.
Câu hỏi thường gặp về hàm AutoLISP
Hàm setq dùng để làm gì?
setq dùng để gán giá trị cho biến, ví dụ (setq r 50) gán 50 cho biến r. Đây là hàm cơ bản nhất để lưu và tái sử dụng dữ liệu trong chương trình AutoLISP.
Tiền tố c: trước tên hàm trong defun nghĩa là gì?
Khi đặt tên hàm dạng c: theo sau là tên lệnh, ví dụ c:TRON, bạn tạo một lệnh gõ được trực tiếp từ dòng lệnh AutoCAD. Không có c: thì đó là hàm phụ trợ, không gọi trực tiếp như lệnh.
Người mới nên học hàm AutoLISP nào trước?
Nên bắt đầu với setq, nhóm hàm get (getpoint, getreal, getstring), command và defun. Bốn nhóm này đủ để viết các lệnh tự động cơ bản, sau đó học thêm if và các hàm toán học, xử lý điểm.
Kết luận
Nắm các hàm AutoLISP thường dùng là chìa khoá để tự viết các tiện ích tự động hoá trong AutoCAD. Hiểu cú pháp ngoặc đơn, hàm setq gán biến, nhóm hàm get nhận dữ liệu, command gọi lệnh, defun tạo lệnh, if xử lý điều kiện, cùng các hàm toán học và xử lý điểm, bạn đã có đủ nền tảng để bắt đầu lập trình AutoLISP.
Hãy luyện tập với ví dụ lệnh vẽ tròn nhập tâm và bán kính, rồi nạp file để chạy thử. Cùng với Script, lệnh tắt, macro và CUI, bộ hàm AutoLISP khép lại nhóm chủ đề AutoCAD nâng cao, giúp bạn từ người dùng cơ bản tiến tới tự động hoá và làm chủ phần mềm một cách chuyên sâu.