Tìm hiểu ngôn ngữ AutoLISPVàỨng dụng trong AutoCAD
Trang 1ĐỒ ÁN TỐT NGHIỆP ĐẠI HỌC HỆ CHÍNH QUY
NGÀNH CÔNG NGHỆ THÔNG TIN
Tìm hiểu ngôn ngữ AutoLISP
Và Ứng dụng trong AutoCAD
Giáo viên hướng dẫn: Thạc sĩ Đỗ Văn Chiểu Sinh viên : Lưu Thị Thu Trang
Hải Phòng, 2007
Trang 2Mục lục
Lời cảm ơn 4
Phần 1: Giới thiệu 5
1 Tên và mục đích của đề tài 5
2 Giới thiệu vài nét về cơ quan thực tập 5
Phần 2: Nội dung 6
Lời mở đầu 6
1 Khái quát về lập trình trong AutoCAD 8
1.1 Kỹ thuật tự động ActiveX (ActiveX Automation) 8
1.2 AutoCAD VBA 8
1.3 AutoLISP và Visual LISP 9
1.4 ObjectARX 9
2 Giới thiệu chung 10
2.1 Vài nét sơ lược về LISP 10
2.2 Lịch sử phát triển AutoLisp 10
2.3 Ưu nhược điểm của AutoLisp 11
3.Ngôn ngữ lập trình AutoLISP 12
3.1 Căn bản về AutoLisp 12
3.1.1 Xây dựng biểu thức AutoLISP 12
3.1.2 Cách nhập biểu thức AutoLISP: 13
3.1.3 Các hàm số học 13
3.2 Biến và ký hiệu trong AutoLISP 14
3.2.1 Gán giá trị cho biến 14
3.2.2 Giá trị trả về của hàm AutoLISP 14
3.2.3 Sử dụng các biến tại dòng lệnh AutoCAD 14
3.2.4 Các quy định về đặt tên biến 14
3.2.5 Nhập giá trị cho tham số 14
3.2.6 Phạm vi các biến trong AutoLISP 15
3.3 File chương trình AutoLISP 16
3.3.1 Tên file AutoLISP 16
3.3.2 Tạo file chương trình 16
3.3.3 Gọi file chương trình AutoLISP 16
3.3.4 Chú thích 17
3.3.5 Các hàm tự tạo 17
3.3.6 Biến toàn cục và biến cục bộ 18
3.3.7 Tạo các lệnh AutoCAD mới 18
3.4 Nhập dữ liệu 19
3.4.1 Nhập số nguyên 19
3.4.2Nhập số thực 19
3.4.3 Nhập chuỗi 19
3.4.5 Tham số không rỗng 19
3.4.6 Kiểm soát dữ liệu nhập vào 19
3.4.7 Biến hệ thống 19
3.5 Một số hàm cơ bản 20
3.5.1 Hàm chuyển kiểu dữ liệu từ chuỗi thành số và ngược lại 20
3.5.2 Các hàm số học 21
3.5.3 Các hàm về chuỗi 23
3.6 Xử lý danh sách 25
3.6.1 Phân loại : 25
Trang 33.6.2 Tạo danh sách 25
3.6.3 Các hàm xử lý danh sách cơ bản 25
3.6.4 Các hàm xử lý danh sách nâng cao 26
3.7 Biểu thức điều kiện 28
3.7.1 Biểu thức điều kiện 28
3.7.2 Rẽ nhánh chương trình 29
3.7.3 Các hàm logic 30
3.8 Vòng lặp 31
3.8.1 Hàm Repeat 31
3.8.2 Hàm While 31
3.8.3 Hàm Append 31
3.8.4 Hàm 1+ 32
3.8.5 Hàm 1- 32
3.8.6 Truy xuất từng phần tử trong danh sách 32
3.9 Tạo hộp thoại 33
3.9.1 Khái niệm về file DCL và các thành phần của hộp thoại 33
3.9.2 Phân loại các ttile 34
3.9.3 Các thuộc tính của tile 40
3.9.4 Các hàm điều khiển hộp thoại 41
3.9.5 Các hàm điều khiển các tile 42
3.9.6 Một số chú ý khi thiết kế hộp thoại 42
3.10 Các hàm xử lý màn hình đồ hoạ và thiết bị nhập 44
3.10.1 Màn hình đồ họa 44
3.10.2 Gọi hiển thị các menu 45
3.10.3 Các hàm truy xuất màn hình đồ họa và thiết bị nhập 46
4 Chương trình minh hoạ 48
4.1 Lỗ Gujong 48
4.2 Dầm chữ I 51
5 Kết luận 55
6 Các tài liệu tham khảo 56
Trang 4Lời cảm ơn
Lời đầu tiên, em muốn bày tỏ lòng biết ơn chân thành đối với các thầy giáo, côgiáo trường Đại học Dân lập Hải Phòng, những người thầy không những đã tận tìnhtruyền đạt kiến thức mà còn luôn động viên, quan tâm, giúp đỡ chúng em trong học tậpcũng như trong cuộc sống suốt bốn năm học tại trường
Em xin chân thành cảm ơn thầy giáo Th.S Đỗ Văn Chiểu, người thầy đã trựctiếp giảng dậy và hướng dẫn em trong quá suốt trình làm đồ án tốt nghiệp này Cảm ơnthầy đã luôn động viên, hướng dẫn và định hướng cho em trong thời gian qua
Cuối cùng, hơn hết em muốn bày tỏ lòng biết ơn tới cha mẹ tôi, các thành viên tronggia đình em, cũng như tất cả bạn bè em, những người luôn ở bên động viên, cổ vũ vàgiúp đỡ em trong học tập cũng như trong cuộc sống
Sinh viên
Lưu Thị Thu Trang
Trang 5Phần 1: Giới thiệu
1 Tên và mục đích của đề tài
• Tên đề tài: Tìm hiểu ngôn ngữ AutoLISP và ứng dụng trong AutoCAD
• Mục đích của đề tài: tìm hiểu AutoLISP và cách lập trình các tiện ích cho phầnmềm AutoCAD
2 Giới thiệu vài nét về cơ quan thực tập
Công ty CP Điện Tử Tin Học Viễn Thông có tiền thân là Công Ty Đầu Tư vàPhát Triển Kỹ Thuật Phát Thanh Truyền Hình Hải Phòng được thành lập năm 1993.Đến năm 1996 công ty đổi tên thành Công ty dịch vụ tin học Hải Phòng (quyết định số25/4QĐ-UB) trên cơ sở hợp nhất hai đơn vị: Công Ty Đầu Tư và Phát Triển Kỹ ThuậtPhát Thanh Truyền và Công ty điện tử tin học Hải Phòng Năm 2004, thực hiện nghịquyết TW3, công ty chuyển thành Công ty cổ phần điện tử tin học Viễn Thông (Cty cổphần có sự góp vốn của Nhà Nước Giấy chứng nhận đăng ký kinh doanh Cty cổ phần
số 0203000819-Quyết định số 1869/QĐ-UB ngày 22/4/2004 của ủy Ban Nhân Dânthành phố Hải Phòng)
Ngày 01/5/2004 Cty Cổ Phần Điện Tử Tin Học Viễn Thông chính thức đi vàohoạt động với tổng vốn điều lệ là 3 tỷ VN đồng, tên giao dịch quốc tế là ElectronicTelecommunication Informatic Joint
Trụ sở chính của Cty: số 18 Trần Hưng Đạo, phường Hoàng Văn Thụ, quậnHồng Bàng, thành phố Hải Phòng
Công ty Cổ Phần Điện Tử Tin Học Viễn thông kinh doanh các ngành nghềsau:
- Kinh doanh và dịch vụ hàng điện tử, điện lạnh, điện máy, vật tư, thiết bị vàcác đồ dùng dân dụng Đại lý hàng điện máy
- Sửa chữa bảo hành, lắp giáp các thiết bị truyền thanh, truyền hình, tin học
- Sản xuất máy thu thanh FM, máy tăng âm và ăng ten thu phát vô tuyến
- Vận tải và dịch vụ vận tải hàng hóa
- Dịch vụ văn hóa thể thao
Lắp đặt bảo dưỡng sửa chữa cung ứng vật tư thiết bị truyền hình cáp MMDS
Kinh doanh khách sạn nhà nghỉ và cho thuê văn phòng
- Kinh doanh các thiết bị tin học và đào tạo tin học
Trang 6Phần 2: Nội dung
Lời mở đầu
Khi mới ra đời, công nghệ thông tin không có nhiều ứng dụng trong cuộc sống
mà chủ yếu phục vụ cho ngành khoa học cơ bản nhằm giải quyết các bài toán lớn, mấtnhiều thời gian tính toán hay những bài toán đòi hỏi sự chính xác gần như tuyệt đối
Trước kia, để thiết kế ra các công trình xây dựng hay chế tạo ra chi tiết máymới, các kỹ sư thiết kế phải tốn rất nhiều thời gian để thiết kế và tính toán các thông số
kỹ thuật sao cho chính xác Trong quá trình thiết kế các bản vẽ bằng tay họ phải lặp đilặp lại một số chi tiết hay khi vẽ sai phải thực hiện bản vẽ đó lại từ đầu Điều nàykhiến cho người thiết kế mất rất nhiều thời gian và làm giảm chất lượng bản vẽ Từthực tế đó, rất nhiều kỹ sư thiết kế mong muốn có được công cụ hỗ trợ mình trongcông việc thiết kế nhằm nâng cao chất lượng bản vẽ Nắm bắt nhu cầu này, các công typhần mềm đã cho ra đời một loạt các phần mềm hỗ trợ như AutoCAD, SAP,AutoCAD Mechanical…
Tuy nhiên, trên thực tế các phần mềm hỗ trợ cũng chỉ đáp ứng được các yêucầu chung nhất, tổng quát nhất của các kỹ sư thiết kế Ví dụ như trong ngành thiết kếcông trình nhà ở, cầu đường…, Việt Nam có những tiêu chuẩn riêng do bộ CôngNghiệp đặt ra đối với các bản vẽ này mà không theo tiêu chuẩn chung của thế giới.Trong khi đó, các phần mềm hỗ trợ công việc thiết kế lại tuân theo những tiêu chuẩnchung của thế giới Do đó bắt buộc người kỹ sư thiết kế phải tự mình thực hiện cácthao tác để vẽ các chi tiết tuân theo các tiêu chuẩn của riêng nước mình dù đôi khi việcnày tốn khá nhiều thời gian hay các chi tiết này lặp đi lặp lại qua từng bản vẽ
Có thể nói trong số các phần mềm của hệ thống CAD/CAM thì AutoCAD củahãng Autodesk là một công cụ tuyệt vời của kỹ sư mọi ngành nghề từ điện tử, vi mạchtới chế tạo máy, từ vô tuyến tới xây dựng Có nhiều chương trình vẽ kĩ thuật tiện íchkhác ra đời như ArchiCAD, COMPAS 3D, Turbo CAD nhưng có thể nói trong lĩnhvực vẽ 2D, AutoCAD là ông “trùm”
Điều ấy sở dĩ tồn tại được là bởi 2 lí do[6]: 1- AutoCAD không ngừng hoànthiện mình, 2- AutoCAD để ngỏ cho người sử dụng cách tự hoàn thiện theo nhu cầuriêng một cách dễ dàng Trong AutoCAD có tồn tại ít nhất là 3 ngôn ngữ lập trình lớnVisualLisp, VisualBasic và Visual C
Vậy thành thạo ngôn ngữ lập trình trong AutoCAD để làm gì?
Việc viết code trong AutoCAD nói riêng và việc lập trình thường chiếm thờigian rất lâu đối với người không chuyên Trong ba ngôn ngữ kể trên thì Visual LISPđược yêu thích hơn cả bởi câu lệnh đơn giản lại có thể sử dụng sẵn các câu lệnh củaAutoCAD một cách tiện lợi Ít câu lệnh và ít thuật toán rắc rối, dễ học, dễ viết Chính
vì thế Visual LISP trong đại đa số người sử dụng là một phương pháp hoàn thiện, tíchhợp các lệnh vẽ có sẵn của AutoCAD theo yêu cầu của từng cá nhân
Visual Studio trong AutoCAD là công cụ mạnh nhất giúp đột phá các giới hạncủa các câu lệnh AutoCAD cho người sử dụng Ví dụ như khi vẽ cầu thang cuốn, cácmặt phức tạp bậc cao, nếu không muốn bị hiện rõ chỗ gấp khúc khi phóng đại tỉ lệ thì
Trang 7chỉ có lựa chọn duy nhất là VS (trong AutoCAD 2007 đã hỗ trợ helix) VS cũng làcông cụ lập trình dùng cho các đề bài lớn như tự động hóa tính toán ổn định cho đập
bê tông, tự động hóa thiết kế nhà máy thủy điện, chuyển dữ liệu excel thành địahình 3D
VBA không mạnh như VS, không tiện như Visual LISP, bởi thế người họcVBA thường là người có căn bản về VB và muốn tiết kiệm thời gian
Nói đến VisualLISP (Visual List Processor) thì trước hết nên nói đếnAutoLISP AutoLisp, tập con ngôn ngữ LISP, là ngôn ngữ lập trình bậc cao thích hợpvới các ứng dụng đồ hoạ AutoLISP là một ngôn ngữ thông dịch, được viết theo cúpháp và thủ tục chặt chẽ như ngôn ngữ LISP Tuy nhiên, nó được bổ sung thêm cáchàm để phù hợp với AutoCAD
Sử dụng AutoLISP ta có thể viết các chương trình marco để tạo lệnh mới choAutoCAD hoặc các chương trình tự động thiết kế bản vẽ được sử dụng thường xuyên,thực hiện với các lệnh có sẵn của AutoCAD để góp phần tăng năng suất thiết kế Bạn
có thể sử dụng bất kỳ trình soạn thảo văn bản nào để tạo các chương trình AutoLISP
và gọi chúng vào trong CAD để kiểm tra và thực hiện
Có thể nói, để làm chủ lập trình AutoCAD thì AutoLISP chính là cánh cửa đầutiên mà bạn cần vượt qua
Trang 81 Khái quát về lập trình trong AutoCAD
Các ngôn ngữ thường được sử dụng để lập trình cho AutoCAD gồm có:ActiveX, VBA, AutoLISP, Visua LISP và ObjectARX Việc sử dụng ngôn ngữ nào đểlập trình cho AutoCAD là tuỳ thuộc vào mục đích của chương trình và thói quen lập
trình của mỗi người.
1.1 Kỹ thuật tự động ActiveX (ActiveX Automation)
Kỹ thuật tự động ActiveX được phát triển bởi Microsoft® trên nền tảng kiếntrúc COM (mô hình đối tượng thành phần) Bạn có thể sử dụng ActiveX để tuỳ chỉnhAutoCAD, chia sẻ bản vẽ của bạn với các ứng dụng khác và tự động hoá các thao tác
Sử dụng ActiveX để tích hợp trong AutoCAD có hai ưu điểm sau đây:
- Chương trình truy cập bản vẽ AutoCAD được mở rộng đối với nhiều
môi trường lập trình khác Trước ActiveX, những chuyên viên thiết kế
đã giới hạn chỉ trong AutoLISP hoặc C++
- Chia sẻ dữ liệu với những ứng dụng Windows như Exel, Word dễ
dàng hơn
1.2 AutoCAD VBA
Sự tích hợp VBA vào AutoCAD đã cung cấp một công cụ trực quan dễ sử dụng đểtùy chỉnh AutoCAD Ví dụ bạn có thể tạo ra ứng dụng trích thuộc tính thông tin mộtcách tự động, chèn kết quả trực tiếp vào bảng tính Exel và thực hiện bất kỳ sự chuyểnđổi thông tin mà bạn cần
Có ba thành phần cơ bản của chương trình VBA trong AutoCAD Đầu tiên chính
là AutoCAD, nó có bộ thiết lập đối tượng rộng lớn bao gồm các thực thể, dữ liệu, vàcác câu lệnh AutoCAD AutoCAD là một cấu trúc ứng dụng mở với rất nhiều mức độgiao tiếp Thành phần thứ hai là bộ giao tiếp tự động ActiveX AutoCAD, nó thiết lập
sự giao tiếp với các đối tượng AutoCAD Lập trình trong VBA yêu cầu sự hiểu biết cơbản về ActiveX Phần tử thứ ba chính là bản thân VBA Nó có bộ thiết lập đối tượngđối tượng, từ khoá, hằng số…của riêng nó, cung cấp chương trình điều khiển, gỡ rối
và thi hành
Sử dụng VBA cho AutoCAD có những ưu điểm sau:
- Tốc độ : ứng dựng trong cùng tiến trình với VBA, ActiveX chạy
nhanh hơn các ứng dụng trong AutoLISP
- Dễ sử dụng: ngôn ngữ lập trình và môi trường phát triển dễ sử dụng và
cài đặt với AutoCAD
- Khả năng liên vận hành giữa các window: ActiveX và VBA được thiết
kế để sử dụng với các ứng dụng Windows khác và cung cấp mộtđường dẫn tuyệt với để trao đổi thông tin giữa các ứng dụng
- Cung cấp nhiều mẫu khác nhau: sự phát triển giao diện nhanh chóng
của VBA cung cấp một môi trường hoàn hảo cho các ứng dụng mẫu,
dù là những ứng dụng này sẽ được phát triển bởi ngôn ngữ khác
- Dễ học
Trang 91.3 AutoLISP và Visual LISP
AutoLISP dựa trên nền tảng của ngôn ngữ lập trình LISP, dễ học và là một ngônngữ lập trình mạnh Do AutoCAD có bộ trình thông dịch LISP, bạn có thể đưa đoạn
mã AutoLISP ở dấu nhắc lệnh của AutoCAD hoặc tải các file vào autocad để chạy.Visual LISP (VLISP) là công cụ phần mềm được thiết kế để thực hiện các chươngtrình AutoLISP
AutoLISP được tăng cường với Visual LISP, đưa ra một môi trường phát triển tíchhợp (IDE) gồm trình biên dịch, trình gỡ rối và những công cụ phát triển khác để tănghiệu suất VLISP có thêm nhiều khả năng và mở rộng ngôn ngữ để tương tác với cácđối tượng sử dụng ActiveX VLISP cũng cho phép AutoLISP đáp ứng những sự kiệnthông qua đối tượng phản ứng
Các ứng dụng hay thường trình AutoLISP có thể tương tác với AutoCAD bằngnhiều cách Những thường trình này có thể nhắc người dùng nhập câu lệnh, truy cậpcâu lệnh có sẵn trong AutoCAD một cách trực tiếp và đinh dạng hoặc tạo các đốitượng trong cơ sở dữ liệu Bằng cách tạo các thường trình AutoLISP bạn có thể thêmnhững câu lệnh đặc biệt vào AutoCAD Một vài câu lệnh chuẩn của AutoCAD thực ra
là những ứng dụng AutoLISP
Do AutoCAD có thể đọc đoạn mã AutoLISP một cách trực tiếp mà không cầnbiên dịch Trong khi Visual LISP đưa ra một IDE, bạn có thể thử nghiệm bằng cáchđưa đoạn mã vào tại dòng nhắc lệnh, nó sẽ cho bạn nhìn thấy kết quả ngay lập tức
Có thể nói, trong số các ngôn ngữ lập trình mà AutoCAD hỗ trợ thì AutoLISP vàVisual LISP dễ học và dễ tương tác với AutoCAD hơn cả Bạn có thể soạn thảo cácđoạn mã AutoLISP bằng bất kỳ trình soạn thảo nào thậm chí có thể soạn thảo ngaytrong AutoCAD mà không cần cài đặt các chương trình soạn thảo riêng như VS,VBA…
Trong khuân khổ của đồ án này, em xin trình bày về ngôn ngữ AutoLISP_ đượcxem như là cách cửa đầu tiên để tiếp xúc với lập trình trong AutoCAD
Trang 102 Giới thiệu chung
2.1 Vài nét sơ lược về LISP
LISP_List Processing là một chuẩn ngôn ngữ lập trình được John McCarthayphát triển vào năm 1956 trong dự án nghiên cứu Artificial Intellegence Phiên bản đầutiên LISP 1.5 được giới thiệu vào đầu thập niên 60 và phát triển với nhiều biến thể nhưBBNLisp, Interlisp, MacLisp, NIL(New Implementation of Lisp), Franz Lisp… Vàothập niên 70 và đầu những năm 80 đã có máy tính chuyên dụng như Lisp Machinesđược thiết kế riêng để chạy những chương trình LISP Đến năm 1981, để chuẩn hóaLISP các nhà lập trình đã tập hợp và chuẩn hóa thành Common LISP Năm 1984Golden Common Lisp trở thành chuẩn chính thức cho máy tính IBM và sau này pháttriển thành XLISP- tiền thân của AutoLISP ngày nay
2.2 Lịch sử phát triển AutoLisp
AutoLISP là một nhánh của Common LISP - một ngôn ngữ lập trình cũ đượcdùng để lập trình cho trí tuệ nhân tạo AutoLisp là ngôn ngữ lập trình thông dịch, bạn
có thể chạy trực tiếp chương trình
AutoLISP được phát triển trên nền ngôn ngữ XLISP là ngôn ngữ lập trình trênmôi trường AutoCAD do David Betz xây dựng lên và được công bố phiên bản đầutiên 2.18 vào tháng 1năm 1986 Cùng với sự phát triển của AutoCAD các phiên bảnAutoLisp ngày càng được hoàn thiện với nhiều tính năng mới cho đến tận phiên bảnRelease 12 vào tháng 6 năm 1992 Sau đó, sự phát triển của nó bị sao nhãng bởi hãngAutodesk chú đến việc phát triển các ngôn ngữ mới Tuy nhiên nó vẫn được duy trìtrong AutoCAD
Vital-LISP được coi như là một phiên bản mở rộng của AutoLISP gồm cácphần IDE, debugger và complier được phát triển và bán bởi công ty thứ 3 BasisSoftware Vital LISP là phiên bản mạnh nhất trong các phiên bản AutoLisp và đượctích hợp trong VBA AutoDesk đã mua lại nó và đặt tên là Visual Lisp, và trong mộtthời gian ngắn đã bán nó như là một phần mềm add-on Nó được tích hợp vàoAutoCAD để thay thế cho AutoLisp trong AutoCAD 2000 phiên bản ra đời tháng3/1999 Sau đó Autodesk đã tạm dừng phát triển Visual LISP một thời gian để tậptrung phát triển VBA và ObjectARX Có thể khẳng định rằng AutoLISP chính là hiệnthực hoá của LISP [6]
Ta có thể kể đến một vài phiên bản tiêu biểu như sau:
-Phiên bản 2.5 tích hợp vào AutoCAD R7 với một số tính năng cơ bản về cáctương tác với các đối tượng trong bản vẽ
- Phiên bản 2.6 tích hợp vào AutoCAD R7 với chức năng 3D và một số hàmmới getcorner,getword và initget
-Phiên bản tích hợp vào AutoCAD R12 giới thiệu một số hàm GUI và ngôn ngữđiều khiển hộp thoại DCL(Dialog Control Language)
-Phiên bản Visual LISPTM giới thiệu cùng AutoCAD R14 là một môi trườngphát triển AutoLisp độc lập trực quan với sự hỗ trợ của các công cụ gỡ rối
- Visual LISPTM được chính thức tích hợp vào AutoCAD2000 và từ đó đến nayđược bổ sung nhiều tính năng mới
Trang 11AutoLisp là một ngôn ngữ lập trình rất mạnh , bạn sẽ cần tốn một thời gian đểhọc và làm chủ nó
2.3 Ưu nhược điểm của AutoLisp
• Ưu điểm
Làm việc rất tốt và dễ dàng với điểm và các yếu tố hình học
Rất mềm dẻo , không khắt khe
Không cần trình dịch , lập trình và thực hiện lệnh
Chạy được trên các hệ điều hành với cùng 1 file Lisp
Quản lý đối tượng với List-kiểu dữ liệu rất thích hợp trong quản lý tọa
Ngôn ngữ trung gian nên thực thi chậm
Hầu như không thể tương tác với hệ thống
Có thể khẳng định AutoLisp là ngôn ngữ dễ tiếp cận so với một số ngôn ngữlập trình khác vì nó là ngôn ngữ lập trình theo kịch bản Tuy nhiên để có thể tiếp cậnvới AutoLisp yêu cầu người học phải có kiếm thức nền về lập trình và nắm vững vềAutoCAD, đồng thời phải có kiến thức nhất định về hình học Chương trình AutoLisp
là một tổ hợp những kịch bản được định trước nắm điều khiển AutoCAD thực thi theosuy nghĩ của người thiết kế
Đa số mọi người muốn học Autolisp là để giải quyết những bài toán trong lĩnhvực chuyên môn của mình Để tiếp cận và ứng dụng tốt Autolisp trong công việc yêucầu người lập trình phải có sự liên hệ với nhu cầu công việc thực tế, điều này phụthuộc rất lớn vào sở trường của mỗi người Bạn đang thực hiện một vài thao tác đểhoàn thiện bản vẽ của mình và bạn chợt nhận ra nó cứ lặp lại liên tục Một ý tưởng nảy
ra là bạn cần thực hiện một đoạn chương trình Autolisp để tự động thực hiện các thaotác này và chương trình Autolisp được hoàn thành
Trang 123.Ngôn ngữ lập trình AutoLISP
3.1 Căn bản về AutoLisp
3.1.1 Xây dựng biểu thức AutoLISP
Khi ta nhập dòng text tại dòng nhắc lệnh thì AutoCAD sẽ so sánh dòng text vớidanh sách lệnh của nó Nếu tương ứng với lệnh trong AutoCAD thì sẽ thi hành Khicode AutoLISP được chuyển vào trong AutoCAD thì AutoCAD sẽ chuyển code nàyđến bộ biên dịch AutoLISP
Danh sách (List) là cấu trúc cơ bản trong AutoLISP Danh sách là tập hợp cácphần tử chứa trong dấu ngoặc đơn và cách nhau bởi khoảng trắng Có hai loại danhsách là :
Biểu thức
Danh sách dữ liệu
Biểu thức là thành phần cơ bản nhất trong các chương trình AutoLISP Phần tửđầu tiên của biểu thức là một hàm Hàm này sẽ được AutoLISP định giá trị và trả vềkết quả
Một biểu thức AutoLISP đơn giản giống như một biểu thức toán học.Sự khácnhau chủ yếu giữa chúng la thứ tự các phần tử và phải có dấu () trong AutoLISP.Biểu thức toán học Biểu thức AutoLISP
Trang 133.1.2 Cách nhập biểu thức AutoLISP:
Ta có thể nhập giống như nhập lệnh AutoCAD:
Nhập trực tiếp tại dòng nhắc lệnh
Gọi từ menu
Tải file chương trình
Nếu biểu thức không bị lỗi, kết quả sẽ được trả về tại dòng nhắc lệnh Nếu bị
lỗi, thông báo lỗi sẽ xuất hiện kèm với biểu thức bị lỗi.
• Trong AutoLISP ta có thể lồng các hàm với nhau để tính các biểu thức
phức tạp Khi chuyển các biểu thức toán học phức tạp thành các biểu thức AutoLISP, trước tiên ta nên tạo các biểu thức ở mức sâu nhất, sau đó chuyển dần sang các biểu thức bên ngoài
Trang 143.2 Biến và ký hiệu trong AutoLISP
Các giá trị tĩnh như tên hàm AutoLISP, tên hàm tự tạo hay các hằng số gọichung là các ký hiệu, các dữ liệu thay đổi trong các chương trình gọi là biến Dữ liệuchứa trong các biến thay đổi tuỳ theo các tham số cung cấp cho chương trình Tronghầu hết các chương trình, dữ liệu và các biến được tạo ra và quản lý là tương tự nhau.Tên gọi của chúng phụ thuộc vào giá trị tĩnh hay động Tên biến và ký hiệu khôngphân biệt hoa, thường
3.2.1 Gán giá trị cho biến
• Cú pháp: ( setq tênbiến1 giatrị1 tênbiến2 giátrị2… )
3.2.2 Giá trị trả về của hàm AutoLISP
• Hàm setq có thể trả về giá trị rỗng “nil”, true “T” hoặc các số, chuỗi, danh sách
• Để đổi dấu giá trị kiểu số chứa trong biến, ta dùng hàm trừ với một tham số duynhất
• Khi tham số của hàm là tên biến, AutoLISP sẽ định giá trị của biến và sử dụnggiá trị này làm tham số
• Kiểu dữ liệu chứa trong biến phải phù hợp với kiểu dữ liệu mà hàm yêu cầu.Các dữ liệu chuỗi không thể dùng làm tham số cho các hàm số học
3.2.3 Sử dụng các biến tại dòng lệnh AutoCAD
Để lấy giá trị của biến, ta đặt dấu ! trước tên biến
3.2.4 Các quy định về đặt tên biến
• Tên biến có thể chứa bất kỳ ký tự nào, trừ ( ) ‘ “ và khoảng trắng
• AutoLISP chứa các hằng số tạo sẵn như pi = 3.1415926, ta không nên gán giátrị khác cho các hằng số này vì giá trị cũ sẽ bị mất đi không lấy lại được
• Không đặt tên biến trùng với tên hàn AutoLISP
• Không đặt tên quá dài và phức tạp
• Tên ngắn dễ nhập, khi nhập không bị lỗi và được truy xuất nhanh hơn
3.2.5 Nhập giá trị cho tham số
• Cú pháp: (getpoint [pt] [prompt])
• Hàm getpoint không tham số sẽ dừng quá trình tính toán cho đến khi ngườidùng nhập vào một điểm hoặc thoát ra khỏi hàm
Trang 15• Hàm này trả về giá trị dạng danh sách Để AutoLISP không xem danh sách này
là biểu thức ta dùng hàm quote hoặc dấu ‘
3.2.6 Phạm vi các biến trong AutoLISP
Trong các phiên bản cũ của AutoCAD, các biến AutoLISP được khởi tạo lại
và nhận các giá trị mặc định ban đầu khi ta tạo mới hoặc mở bản vẽ khác Do đó, cácgiá trị gán cho biến chỉ có tác dụng trong phạm vi một bản vẽ
Từ AutoCAD 14, các biến AutoLISP chỉ được khởi tạo lại khi ta đóng cửa sổchương trình AutoCAD Giá trị gán cho biến vẫn tồn tại khi ta tạo mới hay mở bản vẽkhác Nếu mở nhiều chương trình AutoCAD cùng một lúc thì biến của chương trìnhnày không thể được truy xuất bởi chương trình kia
Để khởi tạo lại các biến AutoLISP khi tạo mới hay mở bản vẽ khác trong cùngmột cửa sổ chương trình, ta gán giá trị biến hệ thống LISPINIT = 1 hoặc mở hộp thoạiPreference/Compatibility đánh dấu mục Reload AutoLISP between drawings
Trang 163.3 File chương trình AutoLISP
3.3.1 Tên file AutoLISP
Tên file có thể dài 256 ký tự, phần mở rộng là LSP Trong một số trường hợp
có thể dùng tên mở rộng khác : mnl,…
3.3.2 Tạo file chương trình
• Sử dụng các trình soạn thảo notepad, MS word…
• Sử dụng AutoCAD:
Lệnh Vlide
Tools / AutoLISP / Visual Lisp Editor
Hình1.Cửa sổ soạn thảo lệnhChú ý:
Một biểu thức có thể viết trên nhiều dòng
Dùng các khoảng trắng để chương trình dễ đọc
Mỗi biểu thức AutoLISP phải được đặt trong dấu ngoặc đơn
Các dữ liệu kiểu chuỗi phải đặt trong dấu nháy chuỗi Nếu chuỗi
dữ liệu không đặt trong dấu nháy chuỗi, AutoLISP sẽ xem đó làtên hàm
3.3.3 Gọi file chương trình AutoLISP
• Hàm load dùng để đọc file chương trình, kiểm tra lỗi cú pháp, định giá trị cácbiểu thức và trả về giá trị của biểu thức cuối cùng
Trang 17• Cú pháp : (load tênfile [onfailure])
Tên file: tên mở rộng mặc định là *.LSP Khi cần thiết ta phải cung cấpđầy đủ tên file và đường dẫn
o VD: (load “vd” “Loi:khong tim thay file”); lệnh sẽ trả về dòngthông báo lỗi :”Loi:khong tim thay file” vì không tồn tại filevd.lsp trong máy
o Ngoài hàm load ta còn sử dụng Appload để tải các ứng dụngAutoLISP, ARX, ADS…
3.3.4 Chú thích
• Tất cả các ký tự đứng bên phải dấu chấm phẩy( ; ) cho đến hết dòng được xemnhư là chú thích trong AutoLISP Các chú thích có thể đứng đầu dòng hoặcđứng sau biểu thức
• Chú thích có thể đứng giữa biểu thức, chứ trong cặp ;| chú thích |;
• VD: (setq R ;| gán giá trị cho R |; 10 )
• Hàm prompt dùng để hiện dòng thông báo lên màn hình Hàm này hiện kiểu dữliệu chuỗi chứa trong tham số Message và trả về giá trị nil
• Cú pháp: (prompt Message)
• Princ tương tự Prompt nhưng không trả về giá trị nil mà trả về chuỗi thông báo
3.3.5 Các hàm tự tạo
• Cú pháp :
(defun [tên hàm] [danh sách biến] [biểu thức])
Tên hàm: tên hàm tuân theo các quy định về đặt tên biến
Danh sách biến: gồm hai phần ngăn cách nhau bởi dấu / Phầnthứ nhất chứa các tham số cần thiết khi gọi hàm, phần thứ haichứa các biến cục bộ của hàm
Biểu thức: khi hàm được gọi các biểu thức này lần lượt đượctính
• Ví dụ: tạo hàm nhân đôi giá trị tham số đưa vào
(defun nhandoi (n) (* 2 n))
Trang 183.3.6 Biến toàn cục và biến cục bộ
• Biến toàn cục là các biến vẫn giữ nguyên giá trị trong phạm vi bản vẽ hiệnhành
• Biến cục bộ là các biến được định nghĩa trong phạm vi một hàm và giá trịcủa nó sẽ mất khi đi việc gọi hàm kết thúc
3.3.7 Tạo các lệnh AutoCAD mới
• Ta có thể sử dụng một trong hai đặc điểm sau để áp dụng cho các hàm tựtạo: C: Option và S::Startup Option
(prompt “\n Hoan thanh”) ;thong bao ket thuc ham )
Ta có thể tải file này và gọi lệnh duongthang như một lệnh củaAutoCAD
Trang 19• Biến T được AutoLISP định nghĩa trước và có giá trị là T (True) Ta khôngnên thay đổi giá trị biến T.
3.4.6 Kiểm soát dữ liệu nhập vào
• Hàm initget cung cấp danh sách các giá trị nhập hợp lệ bằng cách gán cácbit kiểm tra (bit code) và danh sách các từ khoá
Cú pháp: (initget [bits] [string])
• Hàm getkword
Hàm này yêu cầu nhập dữ liệu ở dạng từ khoá
Hàm này chỉ chấp nhận 2 bit code là 1 và 128
Cú pháp : (getkword [prompt])
3.4.7 Biến hệ thống
• Lấy giá trị biến hệ thống
Cú pháp : (getvar tên biến)
• Gán giá trị biến hệ thống
Cú pháp : (setvar [tên biến] [giá trị])
• Biến CmdEcho:
CmdEcho =1: kết quả tính toán trung gian sẽ hiện lên màn hình
CmdEcho =0: kết quả tính toán trung gian sẽ không hiện lên mànhình
Trang 203.5 Một số hàm cơ bản
3.5.1 Hàm chuyển kiểu dữ liệu từ chuỗi thành số và ngược lại
AutoLISP cung cấp các hàn getreal và getstring để nhập số thực và chuỗi Dữliệu nhập vào có thể sử dụng cho các hàm AutoLISP hoặc các lệnh AutoCAD Tuynhiên trên thực tế dữ liệu có thể nhập vào từ các nguồn khác nhau và không đúng cácdạng mong muốn Do đó ta phải chuyển đổi kiểu dữ liệu từ số sang kiểu chuỗi vàngược lại
α Hàm ATOF (Ascii TO Floating point decimal): chuyển đổi một chuỗi thành sốthực
• Cú pháp: (Atof string)
• Ví dụ:
(setq A “5.25” B “45” )
(atof “21”) ;trả về 21.0 (atof “A”) ;trả về 5.25
β Hàm DISTOF (Distance TO Floating point decimal): tương tự hàm atof
• Cú pháp: (distof string [mode])
χ Hàm ATOI (Ascii TO Integer): chuyển một chuỗi thành số nguyên
• Cú pháp: (Atoi string [mode])
δ Hàm RTOS (Real TO String): chuyển một số thành một chuỗi
• Cú pháp: (Rtos number [mode [precision]])
ε Hàm ITOA (Integer TO Ascii): chuyển số nguyên thành chuỗi
• Cú pháp: (Itoa integer)
• Hàm itoa chỉ chấp nhận tham số là số nguyên, không nhận tham số là chuỗi,chỉ có một tham số
Trang 21φ Hàm ANGTOS (Angle to string): chuyển số đo một góc thành một chuỗi
• Cú pháp: (Angtos ange [mode [precision]])
γ Hàm ANGTOF (Angle to floating point decimal): chuyển đổi một chuỗi chứa
số đo góc thành một số thực
• Cú pháp: (Angtof string [mode])
Hàm ASCII: chuyển ký tự đầu tiên trong một chuỗi thành mã Asciitương ứng và trả về mã này
a Hàm Rem: trả về số dư của phép chia
• Cú pháp: (Rem number number …)
c Hàm Max: trả về giá trị lớn nhất trong các số
• Cú pháp: (Max munber number number… )
d Hàm Min: trả về giá trị nhỏ nhất trong các số
• Cú pháp: (Min munber number number… )
Trang 223.5.2.3 Các hàm lượng giác
a Hàm Sin: trả về giá trị sin của một góc
• Cú pháp: (Sin angle)
• Giá trị trả về là số thực, tham số angle phải được tính bằng radian
b Hàm Cos: trả về giá trị cos của một góc
• Cú pháp: (Cos angle)
c Hàm Atan: trả về giá trị arc tang của một góc
• Cú pháp: (Atan num1 [num2])
3.5.2.4 Các hàm luỹ thừa, khai căn, logarit
a Hàm Expt: tính luỹ thừa của một số
• Cú pháp: (Expt base power)
a Hàm chuyển đổi đơn vị góc đo:
• CVUNIT: dùng để chuyển đổi một giá trị hoặc toạ độ một điểm từ đơn vị đonày sang đơn vị đo khác
• Cú pháp : (Cvunit value from to)
b Hàm Angle: trả về góc đo (bằng radian) tạo bởi đường thẳng qua hai điểm với trục
X trong mặt phẳng XY
• Cú pháp: (Angle PT1 PT2)
• Nếu các điểm PT1, PT2 là các điểm 3D, chúng sẽ được chiếu lên mặt phẳng
XY hiện hành sau đó hai điểm chiếu này được dùng để tính góc
c Hàm Distance: trả về khoảng cách giữa hai điểm
• Cú pháp: (Distance PT1 PT2)
d Hàm Polar: dùng toạ độ cực để tạo ra điểm 2D mới từ điểm ban đầu
• Cú pháp: (Polar PT Angle Distance)
• Ví dụ: (Polar ‘(1 0) 0 3) trả về (4.0 0.0) : góc bằng 0, khoảng cách bằng 3
so với điểm ban đầu
Trang 23e Hàm Getangle: yêu cầu nhập vào giá trị góc đo, hoặc chọn hai điểm trên màn hìnhbằng cách bấm chuột Hàm này trả về kết quả tính bằng Radian.
• Cú pháp: (Getangle [PT] [prompt])
• Ví dụ: (getangle ‘(12 45))
(getangle “\n Chi ra vi tri cua goc”)
f Hàm Getdis: yêu cầu nhập vào giá trị khoảng cách, hoặc chọn hai điểm trên mànhình bằng cách nhấn chuột
• Hàm Getdis trả về một số thực
• Hàm Getdis thường được sử dụng khi các điểm không có sẵn trước trongchương trình
• Ví dụ: viết chương trình tính khoảng cách hai điểm nhập vào
(defun C:khoangcach (/ diem kc) (setq p1 (getpoint “\n chon diem dau tien”)) (setq p2 (getpoint “\n chon diem thu hai”)) (prompt “\n Khoang cach giua hai diem la:”) (distance p1 p2)
)
3.5.3 Các hàm về chuỗi
3.5.3.1 Các hàm hiển thị thông tin
a Hàm Prin1: in dữ liệu chứa trong tham số EXPR lên màn hình hoặc in thành file vàtrả về kết quả là tham số này
• Cú pháp: (Prin1 [Expr [File-Desc]])
Expr: có thể chứa các kiểu dữ liệu khác nhau
File-Desc: là file dùng để chứa kết quả trả về của hàm
b Hàm Princ: in dữ liệu chứa trong tham số EXPR lên màn hình hoặc in thành file vàtrả về kết quả là tham số này, tương tự hàm prin1
• Cú pháp: (Princ [Expr [File-Desc]])
c Hàm Print: tự động xuống dòng, sau đó in dữ liệu chứa trong tham số EXPR lênmàn hình hoặc in thành file và trả về kết quả là tham số này, tương tự hàm prin1
• Cú pháp: (Print [Expr [File-Desc]])
d Ví dụ:
(prin1 “ABC”) ;in “ABC” và trả về “ABC”
(princ “ABC”) ;in ABC và trả về “ABC”
(print “ABC”) ; sang dòng mới, in “ABC” và trả về “ABC”
(prin1 “\nABC”) ;không nhận biết được ký tự xuống dòng
;in “\nABC” và trả về “\nABC”
(princ “\nABC”); nhận biết được ký tự xuống dòng, in ABC và trả về “\nABC”
Trang 243.5.3.2 Các hàm xử lý chuỗi
a Hàm STRCASE: biến các ký tự trong chuỗi thành chữ hoa hoặc chữ thường
• Cú pháp: (Strcase String [which])
b Hàm STRCAT: dùng để kết nối nhiều chuỗi thành một chuỗi
• Cú pháp: (Strcat string1 string2… )
c Hàm STRLEN: trả về độ dài một chuỗi
• Cú pháp: (Strlen [string]… )
• Nếu có nhiều tham số string, hàm trả về tổng chiều dài các chuỗi
d Hàm SUBSTR: trả về một chuỗi con
• Cú pháp: (Substr string start [length])
• Ví dụ: (setq A “Ngon ngu AutoLISP”)
(substr A 1 8) ; trả về “Ngon ngu”
(substr A 10) ; trả về “AutoLISP”
Trang 253.6 Xử lý danh sách
3.6.1 Phân loại :
Danh sách được chia thành 3 loại chính:
• Biểu thức (Expression list): chứa tên hàm và các tham số của hàm Biểuthức cần được định giá trị
• Toạ độ điểm (Point coordinate List): đây là trường hợp đặc biệt của danhsách kho dữ liệu, trong đó thông tin lưu trữ là toạ độ điểm
• Kho dữ liệu (Data Storage List): có thể chứa bất kỳ kiểu dữ liệu nào
3.6.2 Tạo danh sách
• Khi viết chương trình ta có thể lưu từng dữ liệu vào từng biến, tuy nhiên khi
số lượng dữ liệu tăng lên kéo theo số lượng biến tăng theo sẽ khó quản lýcác biến Do vậy ta phải lưu dữ liệu vào danh sách Một danh sách dù chứanhiều phần tử vẫn có thể gán cho một biến nhờ đó mà làm đơn giản việcquản lý và truy cập dữ liệu
• Cú pháp: (List expression)
• Ví dụ: (setq L (list “Nha” “Tran” “cua so” 78.5 ‘(20 20 30)))
;có 5 phần tử với các kiểu dữ liệu khác nhau trong danh sách
;”Nha”, “Tran”, “cuaso” :kiểu chuỗi
;78.5 : kiểu thực
;’(20 20 30) :danh sách không định giá trị
• Trước khi tạo ra danh sách, hàm list sẽ định giá trị cho các tham số củamình (trừ tham số là danh sách không định giá trị)
Trang 263.6.4 Các hàm xử lý danh sách nâng cao
a Hàm ASSOC (Association): trả về danh sách con trong danh sách phức
• Cú pháp: (Assoc item alist)
Alist phải là danh sách phức hợp
Item là phần tử đầu tiên của danh sách con trả về
• Ví dụ: danh sách Form chứa chiều dài, chiều rộng, chiều cao và thể tích mộtkhối chữ nhật
(setq Form ‘((chieudai 185.0) (chieurong 75.0) (chieucao 45.0) (thetich624370.0)))
(cadr (assoc ‘chieudai Form)) ; trả về 185.0
(cadr (assoc ‘chieurong Form)) ; trả về 75.0
(cadr (assoc ‘chieucao Form)) ; trả về 45.0
(cadr (assoc ‘thetich Form)); trả về 624370.0
b Hàm CONS
• Các danh sách con trong danh sách phức hợp có các dạng khác nhau và cóthể chứa nhiều phần tử Một dạng thường gặp của danh sách con là dottedpair Đây là dạng danh sách chứa hai phần tử cách nhau bởi dấu chấm.AutoLISP thường dùng dạng danh sách này để lưu trữ và truy xuất dữ liệulấy từ cơ sở dữ liệu các đối tượng của AutoCAD
• Hàm cons có hai tham số Nếu tham số thứ hai là một danh sách, hàm này sẽ
bổ sung tham số thứ nhất vào vị trí đầu tiên trong danh sách này
• Cú pháp: (cons new-first-element list)
• Ví dụ:
(setq a 100)
(cons 10 ‘(50 40 60)) ; trả về (10 50 40 60) (cons ‘a ‘(b v)) ; trả về (a b v) (cons a ‘(b v)) ; trả về (100 b v)
• Nếu tham số thứ hai là kiểu dữ liệu không phải dạng danh sách, hàm sẽ trả
• Cú pháp: (member expr alist)
• Hàm member kết hợp với hàm assoc, cxxxxr để giảm bớt các biểu thức điềukiện
Trang 283.7 Biểu thức điều kiện
3.7.1 Biểu thức điều kiện
• Cú pháp: (equal expr1 expr2 [fuzz])
Tham số fuzz cung cấp sai số cho phép bằng nhau và chỉ áp dụng với
dữ liệu kiểu số Các giá trị được coi là bằng nhau nếu sai số giữachúng nhỏ hơn giá trị fuzz
c Hàm EQ: so sánh sự trùng nhau giữa hai danh sách