2. Giới thiệu chung
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.
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)
b. 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
• 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 <Y/N>:”));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)
) 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 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
}
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 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