Đồ án Tìm hiểu nguôn ngữ AutoLISP và ứng dụng trong AutoCad

Tài liệu Đồ án Tìm hiểu nguôn ngữ AutoLISP và ứng dụng trong AutoCad: BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC DÂN LẬP HẢI PHÒNG ĐỒ Á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 Mục lục Lờ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ình truyề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ập cũ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ực tiế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 ơn thầ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 trong gia đì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 đỡ ...

doc56 trang | Chia sẻ: hunglv | Lượt xem: 1592 | Lượt tải: 0download
Bạn đang xem trước 20 trang mẫu tài liệu Đồ án Tìm hiểu nguôn ngữ AutoLISP và ứng dụng trong AutoCad, để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC DÂN LẬP HẢI PHÒNG ĐỒ Á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 Mục lục Lờ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ình truyề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ập cũ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ực tiế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 ơn thầ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 trong gia đì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 Phầ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ần mề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ật Phá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ân thà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ào hoạ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à Electronic Telecommunication Informatic Joint. Trụ sở chính của Cty: số 18 Trần Hưng Đạo, phường Hoàng Văn Thụ, quận Hồ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 . Sản xuất bao bì và bảng kẽm. Xây dựng công trình dân dụng, công nghiệp, giao thông thủy lợi, thương mại và đường ống cấp thoát nước. Kinh doanh vận tải hành khách bằng xe taxi. Phầ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ất nhiề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áy mớ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 đi lặ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ày khiế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 trong cô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 ty phầ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êu cầ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ông Nghiệ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ẩn chung 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ác thao 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ệc nà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ủa hã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ạch tớ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 ích khác ra đời như ArchiCAD, COMPAS 3D, Turbo CAD... nhưng có thể nói trong lĩnh vự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àn thiện mình, 2- AutoCAD để ngỏ cho người sử dụng cách tự hoàn thiện theo nhu cầu riê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ớn VisualLisp, 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ời gian 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ủa AutoCAD 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ích hợ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ạn củ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ác mặ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ì chỉ 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 địa hình 3D.... VBA không mạnh như VS, không tiện như Visual LISP, bởi thế người học VBA 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 đến AutoLISP. AutoLisp, tập con ngôn ngữ LISP, là ngôn ngữ lập trình bậc cao thích hợp vớ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ác hà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 cho AutoCAD 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 đầu tiên mà bạn cần vượt qua. 1. 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ến trúc COM (mô hình đối tượng thành phần). Bạn có thể sử dụng ActiveX để tuỳ chỉnh AutoCAD, 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ột cá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. 1.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ôn ngữ 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ương trì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ích hợ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ăng hiệ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ện thô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ằng nhiề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ập câ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 đối tượ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êm nhữ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ần biê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. 1.4 ObjectARX Kỹ thuật ObjectARX cung cấp những thiết lập cho các ứng dụng thiết kế phần mềm để chia sẻ dữ liệu đối tượng thông minh. ObjectARXTM (Phần mở rộng thời gian thực AutoCAD) là một môi trường biên dịch ngôn ngữ lập trình để phát triển các ứng dụng AutoCAD. Môi trường lập trình ObjectARX bao gồm một số thư viện liên kết động chạy trong một không gian địa chỉ giống như AutoCAD và thao tác trực tiếp với lõi cấu trúc cơ sở dữ liệu và mã AutoCAD. Những thư viện này có được ưu điểm của kiến trúc mở AutoCAD, cung cấp các truy cập trực tiếp đến cấu trúc cơ sơ dữ liệu, hệ thống đồ hoạ, và phương tiện hình học để mở rộng cách lớp và các khả năng của AutoCAD tại thời gian thực. Thêm vào đó, bạn có thể sử dụng DLLs để tạo các câu lệnh mới để thực hiện chính xác giống như các câu lệnh có sẵn của AutoCAD. 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 ngay trong 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_ được xem như là cách cửa đầu tiên để tiếp xúc với lập trình trong AutoCAD. 2. 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 McCarthay phát triển vào năm 1956 trong dự án nghiên cứu Artificial Intellegence. Phiên bản đầu tiê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ào thậ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óa LISP các nhà lập trình đã tập hợp và chuẩn hóa thành Common LISP. Năm 1984 Golden Common Lisp trở thành chuẩn chính thức cho máy tính IBM và sau này phát triể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ũ được dù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ên môi trường AutoCAD do David Betz xây dựng lên và được công bố phiên bản đầu tiê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ản AutoLisp 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ản Release 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ãng Autodesk 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ác phần IDE, debugger và complier được phát triển và bán bởi công ty thứ 3 Basis Software. Vital LISP là phiên bản mạnh nhất trong các phiên bản AutoLisp và được tích hợp trong VBA. AutoDesk đã mua lại nó và đặt tên là Visual Lisp, và trong một thời gian ngắn đã bán nó như là một phần mềm add-on. Nó được tích hợp vào AutoCAD để thay thế cho AutoLisp trong AutoCAD 2000 phiên bản ra đời tháng 3/1999. Sau đó Autodesk đã tạm dừng phát triển Visual LISP một thời gian để tập trung phát triển VBA và ObjectARX. Có thể khẳng định rằng AutoLISP chính là hiện thự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ác tươ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àm mớ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ường phá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 . AutoLisp 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 độ điểm. Mã nguồn mở và cộng đồng phát triển Autolisp rộng lớn. Nhược điểm Hình thức không đẹp . Không có trình biên dịch . 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ận vớ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 theo suy 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ĩnh vự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êu cầ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 thao tác này và chương trình Autolisp được hoàn thành. 3.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ới danh sách lệnh của nó. Nếu tương ứng với lệnh trong AutoCAD thì sẽ thi hành. Khi code 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ác phần tử chứa trong dấu ngoặc đơn và cách nhau bởi khoảng trắng. Có hai loại danh sá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ác nhau 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 hàm 1 + 2 = 3 Tham số kquả hàm Command: ( + 1 2 ) Tham số Giá trị trả về : 3 3.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. 3.1.3 Các hàm số học Hàm cộng :nhận vào nhiều tham số và trả về tổng các tham số này. (+ [thamsố1 thamsố2……] ) Hàm trừ : ( - [thamsố1 tham số2…….]) Hàm nhân: (* [thamsố1 tham số2……]) Hàm chia: (/ [thamsố1 thamsố2…….]) 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. 3.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ọi chung 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ệu chứa trong các biến thay đổi tuỳ theo các tham số cung cấp cho chương trình. Trong hầ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ông phâ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ố duy nhấ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ụng giá 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. VD: Vẽ đường tròn với bán kính X=10 (setq X 10 ) Cirlec 3P /2P / TTR / : Diameter /: ! X 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ười dùng nhập vào một điểm hoặc thoát ra khỏi hàm. 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ác giá 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ình nà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ùng mộ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ại Preference/Compatibility đánh dấu mục Reload AutoLISP between drawings. 3.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ệnh Chú ý: 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ác biểu thức và trả về giá trị của biểu thức cuối cùng. 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. VD: (load E:/Autolisp/vd.LSP) hoặc (load E:\\Autolisp\\vd.lsp) onfailure: tham số tuỳ chọn: nếu AutoLISP gặp phải lỗi khi thi hành hàm load, nó sẽ trả về kết quả và giá trị của tham số này. Tham số onfailure có thể chứa các biểu thức tạo ra các hành vi tương ứng với nguyên nhân gây ra lỗi: hiển thị thông báo lỗi, cung cấp đường dẫn thư mục khác tìm kiếm file… VD: (load “vd” “Loi:khong tim thay file”); lệnh sẽ trả về dòng thông báo lỗi :”Loi:khong tim thay file” vì không tồn tại file vd.lsp trong máy. Ngoài hàm load ta còn sử dụng Appload để tải các ứng dụng AutoLISP, 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 xem như 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ần thứ nhất chứa các tham số cần thiết khi gọi hàm, phần thứ hai chứ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 được tính. Ví dụ: tạo hàm nhân đôi giá trị tham số đưa vào (defun nhandoi (n) (* 2 n)) 3.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ện hà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. C: Option Để có thể sử dụng hàm tự tạo tương tự lệnh của AutoCAD, ta đặt ký hiệu C: vào trước tên hàm trong phần định nghĩa hàm tự tạo. Ví dụ: xây dựng hàm vẽ đường thẳng đi qua 2 điểm ; nhập vào 2 điểm (defun C:duongthang (/ diem1 diem2) (prompt “\n Ve duong thang qua hai diem”) (setq diem1 (getpoint “\n nhap diem thu nhat”)) (setq diem2 (getpoint “\n nhap diem thu nhat”)) (command “LINE” diem1 diem2 “”) (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ủa AutoCAD. S::Startup Option Khi khởi động AutoCAD, hàm này định nghĩa trong file ACADR14.LSP sẽ được tự động gọi thi hành. Đây là hàm duy nhất có tính chất này.Vì được thực hiện tự động nên nó không được chứa bất kỳ tham số nào. Thông thường hàm này được dùng để thực hiện các thao tác khởi tạo bản vẽ. 3.4. Nhập dữ liệu 3.4.1 Nhập số nguyên Cú pháp: (getint [prompt]) Ví dụ: (getint “\n Nhap vao so hang:”) Nhập số thực Cú pháp: (getreal [prompt]) Các số thực được chứa dưới dạng dấu chấm động với độ chính xác kép, cung cấp tối thiểu 14 chữ số thập phân có nghĩa. 3.4.3 Nhập chuỗi Chuỗi nhập vào không được quá 132 ký tự Cú pháp : (getstring [prompt]) 3.4.5 Tham số không rỗng Tham số không rỗng là tham số chỉ chấp nhận các giá trị khác rỗng. Có hai cách cung cấp tham số không rỗng : dùng biến T hoặc dùng một giá trị cụ thể. Biến T được AutoLISP định nghĩa trước và có giá trị là T (True). Ta không nê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ác bit 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àn hình. 3.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. Tuy nhiê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ác dạ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]) Ví dụ : (distof “8.2500E+01” 1) ;trả về 82.5 MODE 1 (distof “82.50” 2) ;trả về 82.5 MODE 2 (distof “6’-10.50\”” 3) ;trả về 82.5 MODE 3 (distof “6’-10 ½ \”” 4) ;trả về 82.5 MODE 4 (distof “82 1/2” 5) ;trả về 82.5 MODE 5 Hàm ATOI (Ascii TO Integer): chuyển một chuỗi thành số nguyên Cú pháp: (Atoi string [mode]) Ví dụ: (setq A “5.25” B “45” ) (atoi “5.55”) ;trả về 5 (atoi “A”) ;trả về 3 (atoi “4.3E03”) ;trả về 4 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ố. 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ã Ascii tương ứng và trả về mã này. Cú pháp: (Ascii string) Hàm CHR (Ascii character to string): chuyển đổi mã ascii thành ký tự tương ứng trong bảng mã ascii. Các mã ascii chuẩn có giá trị từ 32 đến 126. Cú pháp: (Chr integer) Hàm READ: trả về phần tử đầu tiên chứa trong một chuỗi và chuyển đổi chuỗi này về kiểu dữ liệu tương ứng. Cú pháp: (Read string) 3.5.2. Các hàm số học 3.5.2.1 Các hàm kiểm soát dạng số a.Hàm FIX: trả về phần nguyên của một số. Phần số nguyên này không được làm tròn. Cú pháp: (Fix number) Ví dụ : (fix 52.34) ;trả về 52 b.Hàm FLOAT: chuyển một số có kiểu số nguyên thành kiểu số thực. Cú pháp : (Float number) c. Hàm ABS: trả về giá trị tuyệt đối của một số. Cú pháp: (Abs number) 3.5.2.2 Các hàm khác a. Hàm Rem: trả về số dư của phép chia. Cú pháp: (Rem number number …) Ví dụ: (setq Q (fix (/ 27.5 5))) (setq R (rem 27.5 5)) b. Hàm GCD: trả về ước số chung lớn nhất của hai số nguyên Cú pháp: (Gcd munber1 number2) 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…..) 3.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) Ví dụ (expt 4 2) ; trả về (4)2 = 16 b. Hàm Sqrt: trả về căn bậc hai của một số. Cú pháp: (Sqrt number) Ví dụ: (Sqrt 16) ; trả về 4.0 c. Hàm Log: trả về giá trị logarit của một số. Cú pháp: (Log number) Ví dụ: (log 6) ;trả về 1.79176 d. Hàm Exp: trả về giá trị luỹ thừa en. Cú pháp: (Exp number ) Ví dụ: (Exp 1) ; trả về 2.71828 3.5.2.5 Các hàm về khoảng cách và góc đo 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ị đo nà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. e. 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ình bằ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àn hì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 trong chươ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ê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: (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” 3.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” 3.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ểu thức cần được định giá trị. Toạ độ điểm (Point coordinate List): đây là trường hợp đặc biệt của danh sá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ứa nhiều phần tử vẫn có thể gán cho một biến nhờ đó mà làm đơn giản việc quả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ủa mình (trừ tham số là danh sách không định giá trị). 3.6.3 Các hàm xử lý danh sách cơ bản a. Hàm CAR: trích ra phần tử đầu tiên của danh sách Cú pháp: (Car list) b. Hàm CDR: tạo ra danh sách từ một danh sách gốc bằng cách loại bỏ phần tử đầu tiên trong danh sách gốc, chỉ lấy các phần tử còn lại. Cú pháp: (Cdr list) c. Hàm CADR: trả về phần tử thứ hai trong danh sách. Cú pháp : (Cadr list) d. Hàm CADDR: trả về phần tử thứ ba trong danh sách. Cú pháp: (Caddr list) e. Hàm LAST: trả về phần tử cuối cùng của danh sách. Cú pháp: (Last list) f. Hàm LENGTH: trả về số lượng phần tử có trong danh sách. Cú pháp: (Length list) 3.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ột khối chữ nhật. (setq Form ‘((chieudai 185.0) (chieurong 75.0) (chieucao 45.0) (thetich 624370.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à dotted pair. Đâ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ệu lấ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ả về dạng dotted pair. Ví dụ: (setq A 10 B “Muoi”) (cons 1 “mot”) ; trả về (1 . “mot”) (cons A B) ;trả về (10 . “muoi”) (cons ‘(1 2 3) A) ; trả về ((1 2 3) . 10) Hàm MEMBER: Duyệt danh sách list để tìm xem expr có là phần tử của danh sách này hay không. Nếu tìm thấy, kết quả trả về là phần tử còn lại của danh sách list, bắt đầu từ phần tử expr. 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ều kiện. Ví dụ: (setq X ‘(1 2 3 4)) (member 2 X) ; trả về (2 3 4) (member 5 X) ; trả về nil d. Hàm REVERSE: trả về danh sách theo thứ tự ngược lại. Cú pháp: (Reverse list) Ví dụ : (setq X ‘(1 2 3 4)) (reverse X) ; trả về 4 3 2 1 e. Hàm NTH: lấy ra phần tử ở vị trí n trong danh sách. Cú pháp: (NTH n list) Vị trí các phần tử trong danh sách được đánh số bắt đầu từ 0 Ví dụ : (setq X ‘(5 6 12 78 3 98 1 2 )) (nth 3 X) ;trả về 78 (nth 5 X) ;trả về 98 3.7. Biểu thức điều kiện 3.7.1. Biểu thức điều kiện 3.7.1.1 Các hàm so sánh a. Hàm = Hàm này trả về giá trị T nếu các phần tử bằng nhau. Cú pháp: (= phantu1 phantu2 ….) Hàm chỉ chấp nhận tham số kiểu số hoặc kiểu chuỗi. Khi so sánh chuỗi cần phân biệt chữ hoa, chữ thường. b. Hàm EQUAL Định giá trị các biểu thức và kiểm tra các giá trị này có bằng nhau không. Hàm chấp nhận mọi kiểu dữ liệu. 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ữa chúng nhỏ hơn giá trị fuzz. c. Hàm EQ: so sánh sự trùng nhau giữa hai danh sách. Cú pháp: ( Eq expr1 expr2) Nếu expr1 expr2 trùng nhau, hàm trả về T. d. Hàm /= Cú pháp: (/= phantu1 phantu2…) e. Hàm nhỏ hơn < Cú pháp: (< phantu1 phantu2…) f. Hàm nhỏ hơn hoặc bằng Cú pháp: (<= phantu1 phantu2…..) g. Hàm lớn hơn < Cú pháp: (> phantu1 phantu2…..) h. Hàm lớn hơn hoặc bằng Cú pháp: (>= phantu1 phantu2…..) 3.7.1.2 Các hàm kiểm tra kiểu dữ liệu a. Hàm ATOM : Cú pháp: (Atom phần tử) b. Hàm LISTP Kiểm tra dữ liệu có phải là kiểu danh sách hay không. Cú pháp: (Listp phantu) c. Hàm NUMBERP kiểm tra xem dữ liệu có phải kiểu số hay không. Cú pháp: (numberp phantu) d. Hàm MINUSP Kiểm tra dữ liệu có phải số âm hay không. Cú pháp: (minusp phantu) e. Hàm ZEROP Kiểm tra dữ liệu có phải là số 0 không. Cú pháp: (zerop phantu) f. Hàm BOUNDP: trả về T nếu tham số là nguyên tố và nó được gắn với một giá trị. Ngược lại sẽ trả về nil. Cú pháp: (Boundp phantu) g. Hàm NULL: kiểm tra một biến hoặc danh sách có rỗng hay không. Cú pháp: (null phantu) h. Hàm TYPE: Trả về kiểu dữ liệu của tham số. Cú pháp: (type item) 3.7.2. Rẽ nhánh chương trình 3.7.2.1 Hàm IF (If biểu thức điều kiện biểu thức) - Dạng IF THEN. Nếu biểu thức điều kiện đúng thì biểu thức sẽ được thực hiện. Ngược lại biểu thức sẽ không được thực hiện. Ví dụ: viết chương trình cho phép người dùng lựa chọn vẽ hoặc không vẽ đường tròn (defun C:duongtron () (initget 1 “Yes No”) (if (= “Yes” (getkword “\n Co ve vong tron khog :”));biểu thức kiểm tra (command “.Circle”);biểu thức ) (princ) ) (If biểu thức điều kiện biểu thức Else_biểu thức) - Dạng IF THEN ELSE. Nếu biểu thức điều kiện đúng thì biểu thức được thực hiện. Ngược lại Else_biểu thức được thực hiện. Ví dụ: chương trình kiểm tra số nhập vào có là số hay không (defun number (a / b) (if (numberp a) ;biểu thức điều kiện (princ (setq b (- a 32))) ;biểu thức (princ “\n Khong phai dang so”) ;else_biểu thức ) (princ) ) 3.7.2.1 Hàm Progn Hàm này dùng để nhóm nhiều biểu thức thành một biểu thức duy nhất dùng trong hàm If. Cú pháp: (Progn biểu thức…..) Ví dụ: (Progn (setq Z 12) (Setq X 2) (setq Y (- Z X))) 3.7.3 Các hàm logic a. Hàm AND Cú pháp: (And biểu thức….) Ví dụ: (setq a 10 b”ham” c nil d ‘(0 0) e 20.12) (and (> a 0) (<a 20)) ;trả về T (and (> a 0) (= a 12) (<a 20)) ;trả về nil b. Hàm OR Cú pháp: (Or biểu thức…) Ví dụ: (setq a nil b nil c 20) (or (> c -10) (< c 30)) ;trả về T (or a b) ;trả về nil c. Hàm NOT Cú pháp: (Not phần tử) Ví dụ: (not nil) ; trả về T (not T) ; trả về nil (not (and 1 3)) ; trả về nil 3.8. Vòng lặp 3.8.1 Hàm Repeat Hàm Repeat tạo ra vòng lặp với số lần nhất định. Cú pháp: (Repeat num expr) Num: là một số nguyên dương, xác định số lần định giá trị các biểu thức expr. Hàm trả về giá trị cuối cùng trong vòng lặp. Nếu Num là số âm hoặc 0 thì hàm repeat không định giá trị các biểu thức và trả về nil. Ví dụ: (setq x 10 y 4) (repeat 10 (setq x (+ 2 x)) (setq y (+5 y)) ) ; hàm trả về 54 3.8.2 Hàm While Hàm while tạo ra vòng lặp có điều kiện. Vòng lặp sẽ kết thúc khi điều kiện lặp không còn thoả mãn. Cú pháp: (while đk lặp biểu thức) Khi điều kiện lặp vẫn trả về giá trị khác nil, các biểu thức sẽ tiếp tục được định giá trị. Quá trình được thực hiện khi điều kiện lặp trả về giá trị nil. Ví dụ: vòng lặp sẽ kết thúc khi nhập vào một số âm (setq n 0) (while (not (minusp n)) (setq n (getint “\n Nhap vao mot so bat ky khong am”)) ) 3.8.3 Hàm Append Hàm Append gộp nhiều danh sách thành một danh sách duy nhất. Hàm này có ý nghĩa là thêm các phần tử vào vị trí cuối cùng của một danh sách có sẵn. Cú pháp: (Append biểu thức) Sử dụng hàm Append trong vòng lặp while, ta có thể bổ sung thêm phần tử vào một danh sách có sẵn. Ví dụ: nhập vào số thực bổ sung cho danh sách realnum, dừng khi ấn Enter (setq realnum nil) (while (setq x (getreal “\n nhap vao so thuc (an Enter de dung): ”)) (set realnum (append realnum (list x))) ) 3.8.4 Hàm 1+ Cú pháp: (1+ num) 3.8.5 Hàm 1- Cú pháp: (1- num) Ví dụ: (1- 4) ; trả về 3 3.8.6 Truy xuất từng phần tử trong danh sách a. Hàm FOREACH Hàm Foreach duyệt từng phần tử trong danh sách. Tại mỗi thời điểm, giá trị của từng phần tử trong danh sách được gán tạm thời cho biến name. Sau đó các biểu thức expr được định giá trị. Nếu trong các biểu thức có chứa biến name, thì giá trị biến name trong từng thời điểm sẽ khác nhau. Nếu danh sách rỗng thì hàm trả về nil. Cú pháp: (Foreach name list expr) Ví dụ: in ra màn hình từ 1 đến 5 (foreach dsach (list “1” “2” “3” “4” “5”) princ (strcat “\n” dsach))(princ) b. Hàm SET Hàm set rất có ich khi làm việc với biến và tên biến trong hàm foreach. Cú pháp: (Set sym expr) Sym phải là kiểu biến không định giá trị. Hàm set gán giá trị của expr cho biến chứa trong tham số sym. So sánh hàm setq và set Hàm setq gán giá trị cho một biến mà không định giá trị cho biến này. Hàm set trước tiên định giá trị của biến sym, sau đó mới gán giá trị cho biến tìm được. Setq = set + quote c. Hàm EVAL Hàm eval trả về kết quả của việc định giá trị biểu thức expr. Biểu thức expr được định giá trị cho đến mức cuối cùng, loại bỏ các kết quả ở mức trung gian. Ví dụ: (setq X “yes” Y 15 Z ‘Y w Z) (eval X) ;trả về “yes” (eval Y) ;trả về 15 3.9. Tạo hộp thoại 3.9.1 Khái niệm về file .DCL và các thành phần của hộp thoại File .DCL sử dụng để mô tả cấu trúc của hộp thoại. File này có dạng file văn bản ASCII tương tự như file chương trình AutoLISP. Các hộp thoại của AutoCAD được mô tả trong file acad.dcl. Các thành phần của hộp thoại như các nút lệnh (button) hoặc các hộp văn bản (edit box)…, gọi là các tile. Hình dáng, kích thước, chức năng…của các tile được xác định bởi các thuộc tính của chúng. Ngoài ra, ta có thể sử dụng các tile để tạo ra các Prototype hoặc các Subassembly để sử dụng được nhiều lần trong các file DCL khác nhau. AutoCAD đã mô tả cấu trúc mặc định cho các tile, và cách sắp xếp các thành phần của nó được thực hiện tự động. Vì vậy, ta chỉ khai báo giá trị cho những thuộc tính nào cần thiết. Bảng phân loại các tile Phân loại Các tile Mô tả Active tiles Button Edit_box Image_button List_box Popup_list Radio_button Slider Toggle Có khả năng nhận được con trỏ, do đó nhận được giá trị nhập của người sử dụng. Là các tile cở sở,có thể sử dụng để tạo ra các tile phức tạp hoặc các cluster. Tile cluster Boxed_column Boxed_radio_column Boxed_radio_row Boxed_row Column Dialog Radio_column Radio_row Row sử dụng để nhóm các tile thành một hàng hoặc một cột. Decorative & Informative tiles Image Text Spacer Spacer_0 Spacer_1 sử dụng để tăng tính thẩm mỹ cho hộp thoại. Text cluster Concatenation Paragraph Text_part sử dụng để tăng khả năng định dạng và sắp xếp các dòng chữ trong hộp thoại. Exit buttons and Error tile Err_tile Ok_only Ok_cancel Ok_cancel_help Ok_cancel_help_errtile Ok_cancel_help_info Đây là các subassembly do AutoCAD tạo sẵn sử dụng cho chức năng đóng hộp thoại. err_tile là một vùng ở góc trái dưới hộp thoại sử dụng để hiện thông báo lỗi khi người dùng đưa vào dữ liệu không thích hợp. Trong file DCL, để mô tả cấu trúc của một hộp thoại, ta liệt kê lần lượt các tile và các thuộc tính của chúng theo thứ tự từ trên xuống, theo cấu trúc cây: Mức cao nhất của cây, gọi là gốc luôn là dialog. Các tile mức 1: toggle, boxed_column, row gọi là con của hộp thoại. Các tile mức 2: edit_box là con của boxed_column. row: là một subassembly chứa các tile: ok_button, cancel_button, err_tile Ghi chú: Tên các tile phải viết bằng chữ thường, bắt đầu bằng dấu hai chấm (:) Các tile được liệt kê theo thứ tự từ trên xuống như trong hộp thoại. Các dòng chú thích bắt đầu bằng // Các thuộc tính của một tile được đặt trong cặp dấu {} và kết thúc mỗi thuộc tính là dấu (;). Các hộp thoại phải chứ một exit tile để đóng hộp thoại. 3.9.2. Phân loại các ttile Các thuộc tính sử dụng để xác định hình dạng, kích thước, vị trí của các tile. Một số thuộc tính sử dụng được cho nhiều tile, một số thuộc tính chỉ sử dụng riêng cho một tile. Các thuộc tính của các tile có thể là: action, alignment, allow_aceept, color, edit_limit, height, key, layout…(tham khảo thêm ở [2]). 3.9.2.1 Các Active tile Dialog Dialog là tile sử dụng để mô tả bản thân hộp thoại. Các tile con của dialog được sắp xếp thành một cốt theo thứ tự từ trên xuống : dialog { init_focus label value key } trong đó: init_focus: tên tile được nhận con trỏ khi hộp thoại xuất hiện. label : tiêu đề của hộp thoại value : tiêu đề của hộp thoại. Thường được sử dụng trong thời gian chạy . Button Nút lệnh, có hình dạng nút nhấn. Khi người sử dụng nhấn vào nút này, nó sẽ thực hiện một chức năng được liên kết với nó. Mỗi hộp thoại phải có ít nhất một button để đóng hộp thoại. : button { action alignment fixed_hieght fixed_width height is_cancel is_default is_enable key is_tabstop label mnemonic width } Edit box Edit_box cho phép người dùng nhập và sửa nội dung của chuỗi xuất hiện trên hộp thoại. : edit_box { action alignment allow_accept fixed_height edit_limit edit_width fixed_width height is_enable is_tab_stop key label mnemonic } trong đó: label: tiêu đề của edit_box value: chuỗi xác định giá trị mặc định ban đầu của edit_box . Image button Image_button hiển thị hình ảnh và hoạt động giống button. Hình ảnh sử dụng có thể là một slide của AutoCAD hoặc là các vector. Ta có thể xác thực được toạ độ điểm chọn trên hình ảnh, nhờ đó mà thực hiện các lệnh thích hợp. Các thuộc tính chiều cao và chiều rộng bắt buộc phải có hoặc thông qua tỉ lệ giữa chúng aspect_ratio. : image_button { action alignment allow_accept aspect_ratio color fixed_height fixed_width height is_enable is_tab_stop key label mnemonic width } List box List_box sử dụng để cung cấp cho người sử dụng một danh sách các chuỗi sắp xếp theo cột để lựa chọn. Khi có nhiều phần tử không thể xuất hiện đủ trên danh sách. : list_box{ action alignment allow_accept fixed_height fixed_width_font tabs fixed_width height is_enable is_tab_stop key label list mnemonic multiple_select tab_truncate } trong đó: label: tiêu đề xuất hiện phía trên danh sách list : chuỗi trong dấu nháy kép chứa nội dung các phần tử xuất hiện trong danh sách, được ngăn cách nhau bằng ký tự xuống dòng “\n” . value: chuỗi trong dấu nháy kép chứa số nguyên xác định phần tử được chọn trong danh sách, được đánh số từ 0. Popup list Tương tự như list_box và không cho phép chọn nhiều giá trị một lúc : popup_box{ action alignment edit_width fixed_height fixed_width_font tabs fixed_width height is_enable is_tab_stop key label list mnemonic tab_truncate value width } trong đó: label: tiêu đề xuất hiện bên trái của popup_list edit_width : chiều rộng của phần xuất hiện chữ. Giá trị này là các số thực hoặc nguyên . value: chuỗi trong dấu nháy kép chứa số nguyên xác định phần tử được chọn trong danh sách, được đánh số từ 0. Radio_button Các radio_button cung cấp một số lựa chọn, và tại một thời điểm chỉ có một trong số đó được chọn. Cac radio_button không được cài đặt trực tiếp trong dialog mà chỉ có thể cài đặt trong radio_row hoặc radio_column : radio_button{ action alignment fixed_height fixed_width height is_enable is_tab_stop key label list mnemonic value width } trong đó: label: tiêu đề xuất hiện bên phải radio_button. Value: chuỗi trong dấu nháy kép chứa số nguyên xác định trạng thái ban đầu của radio_button. “0” nghĩa là không được chọn, “1” nghĩa là được chọn. Toggle Các toggle cho phép người dùng lựa chọn đồng thời nhiều mục. Khi sử dụng chuột nhấn vào toggle thì giá trị của nó sẽ thay đổi. : toggle { action alignment fixed_height fixed_width height is_enable is_tab_stop value width} 3.9.2.2 Các tile cluster Các tile cluster dùng để nhóm các tile có chức năng liên quan đến nhau cho dễ quản lý và sử dụng trong hộp thoại. Ta không thể sử dụng chuột chọn được chính các cluster mà chỉ có thể chọn các tile bên trong của nó. Trừ radio_row và radio_column, ta không thể gán chức năng cho các cluster. Column Các tile được sắp xếp thành cột từ trên xuống. Chúng được xem là con của column. Column có thể chứa tất cả các loại tile, ngoại trừ radio_button đứng một mình. :column { alignment children_alignment children_fixed_height children_fixed_width fixed_height fixed_width height label width } Boxed_column Tương tự như column, bao quanh nó là một khung chữ nhật và một tiêu đề. : box_column { alignment children_alignment children_fixed_height children_fixed_width fixed_height fixed_width height label width } Row Row có chức năng tương tự column, ngoại trừ các tile con được sắp xếp theo hàng ngang từ trái sang phải. :row { alignment children_alignment children_fixed_height children_fixed_width fixed_height fixed_width height label width } Boxed_row Tương tự như row, bao quanh nó là một khung chữ nhật và một tiêu đề :boxed_row { alignment children_alignment children_fixed_height children_fixed_width fixed_height fixed_width height label width } Radio column Radio_column là cluster sử dụng để chứa các radio_button. Các radio_button được sắp xếp thành một cột, và có thể gán chức năng cho radio_column. :radio_column { alignment children_alignment children_fixed_height children_fixed_width fixed_height fixed_width height label width } Boxed radio column Tương tự radio column nhưng có thêm khung viền hình chữ nhật và tiêu đề :boxed_radio_column { alignment children_alignment children_fixed_height children_fixed_width fixed_height fixed_width height label width } Radio_row Radio_row là cluster sử dụng để chứa các radio_button. Các radio_button được sắp xếp thành hàng ngang từ trái sang phải, và có thể gán chức năng cho radio_column. :radio_row { alignment children_alignment children_fixed_height children_fixed_width fixed_height fixed_width height label width} Boxed radio row Tương tự radio row nhưng có thêm khung viền hình chữ nhật và tiêu đề :boxed_radio_row { alignment children_alignment children_fixed_height children_fixed_width fixed_height fixed_width height label width } 3.9.2.3 Informative tile Các informative tile sử dụng để cung cấp thông tin cho người dùng thông qua hình ảnh và chữ. Image Image dùng để hiện thị hình ảnh chứa trong một slide file, hoặc được vẽ bằng các vector. Ta phải khai báo chính xác kích thước dài và rộng cho image tile hoặc một trong hai kích thước này cùng với hệ số tỉ lệ aspect_ratio. :image { action alignment aspect_ratio color fixed_height fixed_width height is_enable is_tab_stop key label mnemonic value width } Text Text dùng để hiển thị thông tin ở dạng chuỗi, thường là các thông tin động thay đổi trong khi thực hiện chương trình. Ta không nên dùng text để hiển thị tiêu đề của các tile khác, và cũng không nên dùng text để hiển thị thông báo lỗi. :text { alignment fixed_height fixed_width height is_bold key label value width } trong đó: label: dùng để hiện nội dung ban đầu cho text. Chiều dài của chuỗi chứa trong label sẽ được so sánh với giá trị thuộc tính width. Giá trị lớn hơn sẽ được dùng làm chiều rộng của text. Do đó ta phải khai báo ít nhất một trong hai giá trị này. Value: dùng để thay đổi nội dung chương trình đang chạy. Thuộc tính không ảnh hưởng đến chiều rộng của text. Text part Text_part dùng để hiển thị các thông tin động, kết nối với các thông tin tĩnh tạo thành nội dung của text tile. Ta có thể sắp xếp các text_part theo phương thẳng đứng để tạo ra dòng chữ theo phương thẳng đứng. :text_part { label } Paragraph Paragraph là một cluster dùng để chứa các text_part và concatenation và sắp xếp chúng thành một cột theo thứ tự từ trên xuống. :paragraph { } 3.9.2.4 Các error tile và exit tile Errtile Ok_only Ok_cancel Ok_cancel_help Ok_cancel_help_errtile Ok_cancel_help_info 3.9.3 Các thuộc tính của tile Action: biểu thức chứa trong thuộc tính action sẽ được thực hiện khi tile được chọn. Đối với một vài tile, biểu thức chứa trong thuộc tính action cũng sẽ được thực hiện khi chuyển sang tile khác. Alignment = left: xác định vị trí canh lề theo phương nằm ngang hoặc thẳng đứng khi tile được đặt trong cluster. Khi chứa trong column: left, right, centered Khi chứa trong row: top, bottom, centered Để sắp xếp vị trí cho các tile ta phải sử dụng các spacer. Allow_accept = false: khi giá trị này bằng true và nếu tile đang nhận con trỏ và ta ấn Enter thì: biểu thức chứa trong thuộc tính action của tile này sẽ được thi hành. Sau đó, tile nào có key là accept sẽ được chọn để đóng hộp thoại. Aspect_ratio = 1.0: tỉ lệ giữa chiều rộng và chiều cao của hình ảnh xuất hiện trên image tile hoặc image_button. Khi thuộc tính này bằng 0, kích thước tile sẽ đúng bằng kích thước hình ảnh. Children_alignment = right: xác định vị trí canh lề theo phương ngang hoặc thẳng đứng của các tile con trong cluster, khi các tile con không được khai báo thuộc tính alignment của mình Children_fixed_height = true; Children_fixed_width = true: các tile con sẽ giữ cố định chiều cao (chiều rộng) khi giá trị bằng true. Khi giá trị bằng false các tile con sẽ thay đổi chiều cao hoặc rộng cho phù hợp với các khoảng trống trong cluster. Color = dialog_background; color = white: xác định màu nền của image tile. Edit_limit = 32: số lượng các ký tự có thể nhập trong edit_box. Edit_width = 16: xác định số lượng các ký tự có thể nhìn thấy của phần nhập ký tự của edit_box. Fixed_height = true; fixed_width = true: thay đổi chiều cao, chiều rộng của tile. Fixed_width_font = true Height = 3: xác định chiều cao của tile. Initial_focus: xác định tile được nhận con trỏ ban đầu, khi hộp thoại xuất hiện. Is_bold = true Is_cancel = true Is_default = true Is_enable = true: xác định trạng thái ban đầu của tile và có thể thay đổi bằng chương trình AutoLISP. Is_tab_stop = true: khi hộp thoại đang hiện trên màn hình, nếu ta nhấn Tab liên tục, con trỏ sẽ di chuyển qua các tile. Key = “key name”: tên của tile dùng để truy xuất khi chạy chương trình. Label = “label text”: tiêu đề của tile. List = “list1\n list2”: chuỗi chứa trong dấu nháy kép. Mnemonic = “d”: xác định ký tự sử dụng làm phím nóng. Multiselect = true Value = “1”: kiểu chuỗi, xác định giá trị ban đầu của tile. Width = 8: xác định chiều rộng của tile. 3.9.4 Các hàm điều khiển hộp thoại LOAD_DIALOG Hàm load_dialog dùng để mở file DCL và chuyển các dòng mô tả hộp thoại và các tile hộp thoại vào bộ nhớ. Cú pháp: (load_dialog DCLFILE) Giá trị trả về bằng: -1 nếu không tải được file DCL và bộ nhớ số nguyên lớn hơn 0 nếu tải thành công. Giá trị này dùng để truy xuất đến các mã lệnh DCL. NEW_DIALOG Hàm new_dialog dùng để khởi tạo một hộp thoại có được mô tả bằng mã DCL đã được tải vào bộ nhớ Cú pháp: (new_dialog DLGNAME DCL_ID[ACTION_EXPRESSION [SCREEN_PT]]) DLGNAME: tên hộp thoại. DCL_ID: số nguyên do hàm load_dialog trả về. ACTION_EXPRESSION: chuỗi chứa biểu thức AutoLISP. SCREEN_PT: vị trí xuất hiện hộp thoại trên màn hình. START_DIALOG Hàm start_dialog làm xuất hiện hộp thoại được tạo ra bằng hàm new_dialog và bắt đầu khởi động hộp thoại làm việc. Cú pháp: (start_dialog) Giá trị trả về của hàm tuỳ thuộc vào kết quả của hàm done_dialog được gọi. DONE_DIALOG Hàm done_dialog dùng để đóng hộp thoại. Cú pháp: (done_dialog [status]) Tham số status là một số nguyên. Khi hàm done_dialog được gọi, số nguyên này sẽ được truyền cho hàm start_dialog. UNLOAD_DIALOG Hàm unload_dialog dùng để loại bỏ các mã lệnh file DCL không còn sử dụng trong bộ nhớ. Cú pháp: (unload_dialog DCL_ID) 3.9.5 Các hàm điều khiển các tile SET_TILE Hàm set_tile dùng để gán giá trị ban đầu cho các tile hoặc thay đổi giá trị trong thời gian chạy chương trình. Cú pháp: (set_tile key value) Key: khoá của tile cần gán giá trị. Value : giá trị gán cho key. ACTION_TILE Hàm action_tile dùng để gán cho tile một biểu thức AutoLISP Cú pháp: (action_tile key action_expression) Key: khoá của tile cần gán biểu thức. Action_expression: biểu thức AutoLISP. MODE_TILE Hàm mode_tile dùng để thay đổi trạng thái của các tile trong khi chạy chương trình. Cú pháp: (mode_tile key status) Key: khoá của tile cần thay đổi trạng thái. Status: trạng thái gán cho tile. GET_TILE Hàm get_tile dùng để lấy ra giá trị hiện hành của tile có khoá chứa trong tham số key. Cú pháp: (get_tile key ) 3.9.6 Một số chú ý khi thiết kế hộp thoại Các phím nóng: đây là chức năng quan trọng mà người dùng thường dùng. Mỗi tile có một phím nóng riêng không trùng với phím nóng của các tile khác Các tab stop: chức năng này cho phép người sử dụng di chuyển lần lượt qua các tile bằng cách dùng phím tab. Con trỏ chỉ dừng lại ở các active tile và thuộc tính is_tab_stop của chúng phải bằng true. Thông thường, thứ tự di chuyển qua các tile giống thứ tự mô tả các tile trong file DCL, nhưng ta có thể thay đổi được thứ tự này. Kiểm tra lỗi: việc này là rất cần thiết khi trong hộp thoại có chứa các edit_box. Sắp xếp các tile: Các tile liên quan với nhau nên được sắp xếp gần nhau. Các tile quan trọng nên đặt ở vị trí nổi bật, dễ nhìn thấy. Nên sử dụng các column cluster thay cho các row cluster. Các dòng chữ xuất hiện trên hộp thoại nên được định dạng giống các dòng chữ trên hộp thoại của AutoCAD. Đóng hộp thoại: hộp thoại không nên thực hiện các chức năng ảnh hưởng đến bản vẽ trước khi được đóng lại. Chức năng trợ giúp Help: đối với các hộp thoại phức tạp, ta nên cung cấp nút help để hướng dẫn cách dùng. 3.10. Các hàm xử lý màn hình đồ hoạ và thiết bị nhập 3.10.1 Màn hình đồ họa TEXTSCR Hàm textscr dùng để chuyển từ màn hình đồ họa sang màn hình văn bản . Hàm luôn trả về nil, do đó nó thường được dùng để làm biểu thức điều kiện cho các hàm if, cond, while... Cú pháp: (textscr) TEXTPAGE Hàm textpage tương tự hàm textscr. Cú pháp: (textpage) GRAPHSCR Hàm gráphcr dùng để chuyển từ màn hình văn bản sang màn hình đồ họa. Cú pháp: (Graphscr) REDRAW Hàm redraw dùng để làm nổi bật hoặc vẽ lại các đối tượng được chọn trên màn hình Hàm redraw không tham số dùng để xóa các dấu blipmode hoặc các vector tạm trên màn hình. Cú pháp: (redraw [ename][mode]) Ename là mã của đối tượng được chọn Mode xác định chức năng hoạt động của hàm redraw, có các giá trị: Mode Chức năng 1 Hiện đối tượng lên màn hình 2 Không hiện đối tượn lên màn hình 3 Làm nổi bật đối tượng bằng đường nét đứt ( nếu đối tượng này đang hiện trên màn hình) 4 Đưa đối tượng trở về trạng thái bình thường 3.10.2 Gọi hiển thị các menu Hệ thống menu của AutoCAD bao gồm nhiều menu khác nhau. Các menu này được mô tả trong các menu file. Mỗi menu file chia thành nhiều đoạn ( section) tương ứng với các menu thành phần của hệ thống. Mỗi section bắt đầu bằng một nhãn có dạng ***section_name Nhãn Menu ***MENUGROUP Tên của menu group ***BUTTONSn Các button menu. Đây là các menu xuất hiện khi ấn các nút của thiết bị trỏ (không phải chuột) ***AUXn Các menu xuất hiện khi nhấn các nút của chuột ***POPn Các pull-down và shortcut menu ***TOOLBARS Các thanh công cụ ***IMAGE Các menu hình ảnh ***SCREEN Menu màn hình ***TABLETn Các tablet menu sử dụng cho thiết bị nhập là bản đồ họa ***HELPSTRINGS Chuỗi xuất hiện ở thanh trạng thái khi một mục pull-down hoặc shortcut menu được chọn hoặc khi con trỏ chuột đang kéo ngang qua nút lệnh của thanh toolbar ***ACCELERATORS Các phím tắt MENUCMD Hàm menucmd dùng để làm xuất hiện các menu trên màn hình. Hàm này luôn trả về nil. Nếu menu muốn gọi đến không có trong menu file, hàm vẫn trả về nil mà không thông báo lỗi Cú pháp: (menucmd string) string có dạng: “menu_area = value” menu_area Menu section B1 – B4 Các button menu từ 1 đến 4 P0 – P16 Các pull-down menu từ 0 đến 16 I Các menu hình ảnh S Các menu màn hình T1 – T4 Các tablet menu A1 – A4 Các auxiliary menu từ 1 đến 4 M Các biểu thức chuỗi diesel Gmenugroup.nametag Xác định bằng tên của menu group MENUGROUP Hàm menu group dùng để kiểm tra một menu group đã được tải hay chưa Cú pháp: (menugroup groupname) groupname chứa tên của menu group cần kiểm tra. Nếu menu group này được tải, kết quả trả về là tên này. Ngược lại trả về nil. 3.10.3 Các hàm truy xuất màn hình đồ họa và thiết bị nhập GRCLEAR Hàm grclear dùng để che các đối tượng trên khung nhìn hiện hành. Ta có thể sử dụng hàm redraw mode 2 để thay thế. Cú pháp: (grclear) GRDRAW Hàm grdraw dùng để vẽ một vector đi qua 2 điểm trên màn hình trong hệ trục UCS hiện hành. Cú pháp:(grdraw from to color [highlight]) Tham số from và to là toạ độ của điểm gốc và điểm ngọn của vector Tham số color, highlight xác định màu sắc và dạng đường của vector. Vector này không phải là đối tượng của bản vẽ, ta không thể xoá bỏ, sao chép hoặc di chuyển nó chỉ có các lệnh vẽ lại màn hình như redraw, zoom…sẽ xoá vector này. Tham số color chứa số nguyên xác định màu của vector, tương tự như màu của lớp vẽ. Nếu không có highlight hoặc highlight = 0 thì vector được vẽ bằng dạng đường liên tục. Nếu chiều dài vector vượt quá kích thước khung nhìn hiện hành thì sẽ bị cắt xén 2 đầu cho vừa khít màn hình GRVECS Hàm grvecs dùng để vẽ lại nhiều vector trên màn hình cùng lúc. Cú pháp: (grvecs vlist [trans]) Tham số vlist là danh sách lần lượt chứa mã màu của các vector và toạ độ các điểm của các vector có giá trị từ 0 đến 255. Tham số trans là một ma trận biến hình, cho phép thay đổi vị trí và tỉ lệ của các điểm trong danh sách vlist. GRTEXT Hàm grtext dùng để viết lên một chuỗi lên dòng trạng thái hoặc lên menu màn hình Cú pháp: (grtext [box text [highlight]]) Box: -1 hoặc -2 ghi chuỗi lên vị trí mode hoặc coordinate của dòng trạng thái. Nếu là số nguyên thì ghi chuỗi lên menu màn hình Text: chuỗi văn bản được ghi lên dòng trạng thái hoặc menu màn hình. Highlight: chỉ dùng khi ghi chuỗi lên menu màn hình, có hai giá trị là 0 (bỏ việc chiếu sáng) và 1(chiếu sáng). 4. Chương trình minh hoạ Để minh họa cho lợi ích của việc sử dụng các hàm tự tạo AutoLISP trong thiết kế các bản vẽ kỹ thuật bằng AutoCAD, em đã xây dựng lên hai hàm tự tạo để vẽ các chi tiết thường được dùng khi thiết kế các chi tiết máy và trong thiết kế cầu đường. Đó là: Lỗ Gujong có tác dụng đệm trong một số chi tiết máy. Nó có thể làm bằng cao su, thép hay các vật liệu tổng hợp khác Dầm chữ I bê tông dự ứng lực trước trong cầu đường, bốn lỗ dùng để căng cáp thép dự ứng lực (hay dùng trong dầm cầu) 4.1 Lỗ Gujong Mô tả cụ thể: Lỗ Gujong được dùng trong các bản thiết kế chi tiết máy, là một chi tiết nhỏ trong tổng thể một chi tiết máy hoàn chỉnh. Lỗ Gujong gồm bốn chi tiết con. Hình dạng như sau: Hình 2. Chi tiết Gujong Các bước để vẽ bằng tay Vẽ đường tròn lớn bên ngoài (dùng lệnh circle). Bắt dính tâm của đường tròn vừa vẽ, vẽ đường tròn có kích thước nhỏ hơn (dùng lệnh Object Snap, circle). Tạo layer phụ tên là centre có kiểu đường là center, màu xanh Bắt dính tâm đường tròn đã vẽ, chọn layer hiện hành là centre và vẽ một đường tròn nằm nữa hai đường tròn vừa vẽ (dùng lệnh Object Snap, circle). Vẽ đoạn thẳng nằm trên đường tròn có layer là centre (dùng lệnh Object Snap, line) Chọn layer chính, sau đó bắt dính giao điểm của đoạn thẳng vừa vẽ với đường tròn có layer la centre làm tâm của lỗ tròn nhỏ, vẽ đường tròn nhỏ (kích thước phải nhỏ hơn khoảng cách hai đường tròn màu trắng, dùng lệnh Object Snap, circle). Dùng lệnh array để vẽ các lỗ tròn nhỏ còn lại Qua các bước mô tả như ở trên, ta phải thực hiện khá nhiều thao tác mới có thể vẽ hoàn chỉnh được chi tiết này, điều này gây mất thời gian cho người thiết kế. Do đó, em đã xây dựng lên một hàm với tên là holes.lsp để vẽ chi tiết này chỉ bằng một câu lệnh đơn giản. (defun c:holes(/ bm cm sm layer C1 R1 D C num hole) ; khởi tạo giá trị cho các biến (if (not (= (type R1) 'real)) (setq R1 100.0) ) (if (not (= (type D) 'real)) (setq D 20.0) ) (if (not (= (type num) 'int)) (setq num 10) ) (if (not (= (type hole) 'real)) (setq hole 10.0) ) (setq C1 (getpoint "\n nhap toa do tam"));chọn vị trí vẽ ;gọi hộp thoại và thiết lập các biến hệ thống,khởi tạo môi trường bản vẽ (setq dcl (load_dialog "holes.dcl")) (if (not (new_dialog "holes" dcl)) (exit) ) (setq bm (getvar "blipmode") cm (getvar "cmdecho") sm (getvar "osmode") layer (getvar "clayer") ) (setvar "blipmode" 0) (setvar "cmdecho" 0) (set_tile "Bkinh" (rtos R1)) (set_tile "doday" (rtos D)) (set_tile "numholes" (itoa num)) (set_tile "holedia" (rtos hole)) ;định nghĩa hàm gán giá trị các biến cho hộp thoại (defun setall1() (setq R1 (atof (get_tile "Bkinh")) D (atof (get_tile "doday")) num (atoi (get_tile "numholes")) hole (atof (get_tile "holedia")) ) ) (action_tile "cancel" "(done_dialog) (exit)") (action_tile "accept" "(setall1) (done_dialog)") (start_dialog) (unload_dialog dcl) ; hàm đổi độ sang radian (defun Degrees2Radians(numberOfDegrees) (* pi (/ numberOfDegrees 180.0)) ) (if (> D hole ) ; kiểm tra thông số nhập vào (progn ;vẽ hai đường tròn chính (setq C (- (/ R1 2) (/ D 2))) (command "circle" C1 (/ R1 2)) (command "circle" C1 (- (/ R1 2) D)) (setvar "osmode" 0) (setq ra (/ 180 num)) ;xác định tọa độ các điểm để vẽ lỗ tròn nhỏ và đoạn thẳng nằm trên đường tròn phụ (setq pt1 (polar C1 (Degrees2Radians ra) C ) pt2 (polar pt1 (Degrees2Radians (+ 180 ra)) hole) pt3 (polar pt2 (Degrees2Radians ra) (* hole 2)) ) ; vẽ lỗ tròn nhỏ và đoạn thẳng nằm trên đường tròn phụ (command "circle" pt1 (/ hole 2) "array" "L" "" "P" C1 num "360" "Y" "layer" "m" "centre" "c" "green" "" "l" "center" "" "" "circle" C1 C "line" pt2 pt3 "" "array" "L" "" "P" C1 num "360" "Y" ) ) (alert "Duong kinh lo vuot qua lon!") ) ;sau khi vẽ xong thì trở về môi trường ban đầu (setvar "blipmode" bm) (setvar "cmdecho" cm) (setvar "osmode" sm) (setvar "clayer" layer) ) Sau khi biên dịch và kiểm tra lỗi, ta lưu file holes.lsp và file holes.dcl (là hàm tạo hộp thoại ) vào trong thư mục support của AutoCAD. Cuối cùng, để vẽ chi tiết trên ta làm như sau: Gõ lệnh appload (hoặc vào tool/load application) chọn file holes.lsp. Gõ holes tại cửa sổ command của autoCAD, điền các thông số chi tiết, nhấn nút OK. Hình3. Hộp thoại vẽ chi tiết Gujong Kết quả ta có một chi tiết kỹ thuật như hình 2 4.2 Dầm chữ I Mô tả cụ thể: chi tiết dầm chữ I dùng trong các bản vẽ thiết kế cầu đường, gồm hai chi tiết con tạo thành gồm các đoạn thẳng và các hình tròn nhỏ. Hình 4. Chi tiết dầm chữ I Các bước để vẽ bằng tay: vì chi tiết này có tính đối xứng nên ta chỉ cần vẽ nửa chi tiết sau đó sẽ dùng lệnh để lấy đối xứng vẽ nữa chi tiết còn lại. Dùng lệnh line để vẽ nửa thân chữ I hoặc dùng lệnh Rec để vẽ hai hình chữ nhật giao nhau sau đó sẽ dùng lệnh trim để cắt xén. Dùng lệnh mirror để vẽ nữa chi tiết còn lại Vẽ lỗ tròn Dùng lệnh array để vẽ nốt 3 lỗ tròn còn lại Tương tự như chi tiết gujong, ta sẽ xây dựng hàm chu_i.lsp và hàm chu_i.dcl để vẽ chi tiết. Sau đó lưu hai file này vào thư mục support của AutoCAD. (defun c:chu_i(/ bm cm sm rong dai day cao dkinh kcach P1 P2 P3 P4 P5) ;khởi tạo giá trị ban đầu (if (not (= (type rong) 'real)) (setq rong 15.0) ) (if (not (= (type cao) 'real)) (setq cao 30.0) ) (if (not (= (type dkinh) 'real)) (setq dkinh 5.0) ) (if (not (= (type kcach) 'real)) (setq kcach 18.0) ) (if (not (= (type dai) 'real)) (setq dai 40.0) ) (if (not (= (type day) 'real)) (setq day 10.0) ) (setq P1 (getpoint "\n nhap toa do tam"));vị trí vẽ chi tiết ;thiết lập hộp thoại và môi trường vẽ (setq dcl (load_dialog "chu_i.dcl")) (if (not (new_dialog "chu_i" dcl)) (exit) ) (setq bm (getvar "blipmode") cm (getvar "cmdecho") sm (getvar "osmode") ) (setvar "blipmode" 0) (setvar "cmdecho" 0) (set_tile "chieurong" (rtos rong)) (set_tile "chieucao" (rtos cao)) (set_tile "duongkinh" (rtos dkinh)) (set_tile "khoangcach" (rtos kcach)) (set_tile "chieudai" (rtos dai)) (set_tile "doday" (rtos day)) ;gán giá trị biến cho hộp thoại (defun setall() (setq rong (atof (get_tile "chieurong")) cao (atof (get_tile "chieucao")) dkinh (atof (get_tile "duongkinh")) kcach (atof (get_tile "khoangcach")) dai (atof (get_tile "chieudai")) day (atof (get_tile "doday")) ) ) (action_tile "cancel" "(done_dialog) (exit)") (action_tile "accept" "(setall) (done_dialog)") (start_dialog) (unload_dialog dcl) (if (>= day cao)(alert "\n do day phai nho hon chieu cao") (progn (if (>= dkinh rong) (alert "\n Dkinh phai nho hon do rong dau chu I") (progn (if (>= dkinh day) (alert "\n Dkinh phai nho hon do day") (progn (if (>= kcach cao)(alert "\n kcach phai nho hon chieu cao") ( progn ;xác định tọa độ các điểm để vẽ (setq P2 (polar P1 0 (/ dai 2)) P3 (polar P2 (- (/ pi 2)) (/ (- cao day) 2)) P4 (polar P3 0 rong) P5 (polar P4 (/ pi 2) (/ cao 2)) );end of setq ;vẽ chi tiết (command "redraw" "Pline" P1 P2 P3 P4 P5 "" "select" "L" "" "mirror" "P" "" P1 (polar P1 (/ pi 2) 1) "N" "mirror" "P" "L" "" P5 (polar P5 0 1) "N" "circle" (list (- (car P5) (/ rong 2)) (- (cadr P5) (/ kcach 2))) "d" kinh "array" "L" "" "R" 2 2 kcach (-(+ rong dai)) ) );end of progn );end of if );end progn );end of if );end ptogn );end of if );end progn );end of if ;thoát khỏi môi trường vẽ, trở về môi trường vẽ ban đầu (setvar "blipmode" bm) (setvar "cmdecho" cm) (setvar "osmode" sm) ) Sau khi biên dịch và kiểm tra lỗi, ta lưu file chu_i.lsp và file chu_i.dcl (là hàm tạo hộp thoại ) vào trong thư mục support của AutoCAD. Cuối cùng, để vẽ chi tiết trên ta làm như sau: Gõ lệnh appload (hoặc vào tools/load application) chọn file chu_i.lsp Gõ chu_i tại cửa sổ command của autoCAD, nhập các thông số của chi tiết, ấn OK Hình 5.Hộp thoại vẽ chi tiết dầm chữ I Kết quả ta sẽ có được một chi tiết như hình 4. 5 Kết luận Autolisp là một ngôn ngữ lập trình đơn giản, dễ tiếp cận và hiệu quả công việc nó đem lại là đáng kể. Những đoạn chương trình Autolisp đơn giản nhưng có thể giảm được thời gian đáng kể trong việc hoàn thiện các bản vẽ. Một chương trình Autolisp thành công không phải là chương trình có qui mô lớn đến vài chục ngàn dòng lệnh mà đó là chương  hiệu quả, giải quyết được các yêu cầu của người thiết kế và tiết kiệm được thời gian thực hiện công việc. Hiện nay, AutoLISP không được sử dụng nhiều do sự ra đời của Visual LISP đã khắc phục được những nhược điểm của AutoLISP nhưng AutoLISP vẫn được tích hợp trong các bản Realease của AutoCAD nhằm giúp cho người dùng lần đầu tiên tiếp xúc với AutoLISP có những kiến thức cơ bản nhất về ngôn ngữ này. Trên cơ sở đã tìm hiểu và nghiên cứu kỹ AutoLISP, người dùng AutoCAD có thể học và sử dụng thành thạo Visual LISP, đặc biệt là đối với những người không chuyên về lập trình. Đồ án đã tìm hiểu được những nét cơ bản về ngôn ngữ AutoLISP và lập trình trong AutoCAD như các hàm cơ bản trong AutoLISP, cách xây dựng hàm tự tạo, các biến, các kiểu dữ liệu... Đồ án cũng đã xây dựng hai hàm vẽ hai chi tiết dùng trong các bản vẽ thiết kế chi tiết máy và xây dựng cầu đường là chi tiết Gujong và dầm chữ I. Trong thời gian tiếp theo, đồ án sẽ tiếp tục tìm hiểu về cơ sở dữ liệu và cách truy nhập thực thể trong AutoCAD để từ đó có thể xây dựng lên một chương trình có sử dụng cơ sở dữ liệu vừa giúp người dùng dễ sử dụng vừa giúp người lập trình dễ dàng chỉnh sửa khi có thay đổi. Hải Phòng, ngày……tháng 7 năm 2007 Sinh viên Lưu Thị Thu Trang 6 Các tài liệu tham khảo Autodesk, Customization Guide 2004 (tài liệu điện tử) . TS.Nguyễn Hữu Lộc, Nguyễn Thanh Trung, Lập trình thiết kế với AutoLISP và Visual LISP, NBX TP.Hồ Chí Minh, 2003. Giảng viên Trần Anh Bình, Lập trình trong AutoCAD_ giáo trình điện tử. KS.Trần Việt An và KS.Lữ Đức Hảo, Hướng dẫn sử dụng Visual LISP 2007 AutoLISP 2007, NXB Giao Thông Vận Tải, 2006. Một số trang Web tham khảo www.cadviet.com www.forum.wru.edu.vn

Các file đính kèm theo tài liệu này:

  • docbaocao.doc
  • pptbc.ppt
Tài liệu liên quan