Mụ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 17
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.2 Nhậ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
3.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
58 trang |
Chia sẻ: lynhelie | Lượt xem: 3700 | Lượt tải: 5
Bạn đang xem trước 20 trang tài liệu Đồ án Tìm hiểu ngôn ngữ AutoLISP Và Ứng dụng trong AutoCAD, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
rướ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ăngcủ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