©©tđttđt20122012 đ t đ t2012©2012 ©t đ t đ © © tđttđt2012 © 2012 © 1 6. Hộp thoại DCL Ngôn ngữ DCL dùng để tạo các hộp thoại. So với cách giao tiếp trên dòng lệnh, hộp thoại có nhiều ưu điểm như: Nhập liệu thuận tiện, Giao diện thân thiện hơn… Các hộp thoại và các biến cố được điều khiển bằn g AutoLISP Các nút điều khiển trên hộp thoại gọi là các tile. Các tile này có thể được kết hợp theo nhóm subasembly, sắp xếp trong 1 dòng hoặc cột (cluster). Các tile trong nhóm assembly được gọi là children. 6.1. Thiết kế hộp thoại DCL Hộp thoại được tổ chức theo cấu trúc cây, với phần gốc là tile có tên dialog, định nghĩa bản thân hộp thoại, tiếp đến là các tile, các cluster, subassembly… Hộp thoại được định nghĩa qua file văn bản ASCII, viết theo cú pháp của ngôn ngữ DCL. File chứa định nghĩa các tile, cluster, subassembly, cách sắpxếpvàđộ lớncủa chúng đượclưu trong file có phầnmở rộng * .DCL. sắp xếp và độ lớn của chúng được lưu trong file có phần mở rộng .DCL. Một file DCL có thể chứa nhiều hộp thoại. Lưu ý DCL phân biệt chữ hoa và chữ thường. Để xem trước kết quả thiết kế hộp thoại, chọn Tools / Interface tools / Preview DCL Cú pháp chung để khai báo 1 tile có dạng: name : item1 [ : item2 …] name – tên tile mới { attribute1 = value1; item – tile đã định nghĩa trước attribute2 = value2; (ACAD hoặc tự đ/nghĩa) … } value – giá trị của thuộc tính 6.1. Thiết kế hộp thoại DCL (2) Để tham chiếu tới tile (đưa tile vào trong cluster hoặc hộp thoại) có thể sử dụng một trong 2 cú pháp sau: name; hoặc : name { attribute = value ; ; … } trong đó name là tên tile đã định nghĩa Với cú pháp thứ nhất, tất cả các thuộc tính của tile được giữ nguyên theo định nghĩa. Cấu trúc thứ 2 cho phép thêm hoặc sửa đổi các thuộc tính của tile. Lưu ý rằng cú pháp này chỉ áp dụng cho tile đơn (không áp dụng cho nhóm subassembly) Chú thích bắt đầu bằng // Các tile hoạt động có sẵn button – các nút ấn như Ok, Cancel… image_button – nút ấn, nhưng trên nó thể hiện ảnh(ACAD slide) edit_box –hộp văn bản, dùng để nhập dữ liệu popup_list – danh sách thu gọn (pulldown) list_box – hộp danh sách (nếu danh sách chọn vượt quá g iới hạn của box này, thanh trượt – scrollbar sẽ xuất hiện) radio_button – nút chọn radio (dùng chọn 1 trong số ít các lựa chọn đã định trước) toggle – nút kiểm (check) slider – thanh trượt, dùng chọn giá trị nằm trong vùng cho trước Các cluster dialog – gom các tile, cluster, subassembly để tạo hộp thoại row – gom các tile thành hàng boxed_row – gom các tile thành hàng và vẽ đường bao quanh column – gom các tile thành cột boxed_column – gom các tile thành cột và vẽ đường bao quanh radio_row – gom các nút radio thành nhóm (sắp xếp theo hàng) boxed_radio_row –như trên nhưng tạo thêm đường viền quanh radio_column – gom các nút radio thành nhóm (sắp xếp theo cột) boxed_radio_column –như trên nhưng thêm đường viền quanh Các tile trang trí image -hiển thị hình ảnh lên hộp thoại. Khác với image_button có thể nhận tác động từ người dùng như một nút ấn, image chỉ hiện hình ảnh mà không nhận một tác động nào. text -hiển thị văn bản lên hộp thoại. Khác với text_box để nhập dữ liệu text chỉ hiểnthị dữ liệumàthôi dữ liệu , text chỉ hiển thị dữ liệu mà thôi . spacer – bình thường khoảng cách giữa các tile được tự động tính toán, space dùng để thay đổi lại các khoảng cách này theo ý người thiết kế hộp thoại. ©©tđttđt20122012 đ t đ t2012©2012 ©t đ t đ © © tđttđt2012 © 2012 © 2 Thuộc tính của tile action –chuỗi ký tự thể hiện biểu thức AutoLISP (không chứa hàm command) sẽ thực hiện khi người dùng chọn tile này. alignment – cách dóng các tile theo chiều ngang hoặc dọc trong nhóm cluster. Giá trị cho alignment gồm các từ khóa: left (mặc định), right, centered (với cột) và top, bottom, centered (với dòng) color –màu nền của nút ảnh: có thể là số nguyên (1 = đỏ, 2 = vàng… hoặc các từ khóa như dialog_foreground, dialog_background, red (đỏ), blue (xanh dương)… edit_width –chiều rộng của hộp nhập dữ liệu (số ký tự có thể chứa trong hộp) height –chiều cao của hộp nhập dữ liệu (số dòng ký tự có thể chứa trong hộp) is_cancel –giá trị gồm true hoặc false xử lý tác động của phím Esc. Khi là true, nhấn phím Esc sẽ tương ứng với việc chọn tile này. is_default –tương tự trên nhưng với phím Enter. Các thuộc tính is_cancel và is_default chỉ áp dụng với các button. Thuộc tính của tile (2) is_enable –true hoặc false: cho phép tile có truy cập được hay không ngay khi khởi tạo. Có thể thay đổi thuộc tính với hàm mode_tile. key –chuỗi ký tự thể hiện khóa tham chiếu đến tile. Phân biệt chữ hoa và thường label –chuỗi ký tự thể hiện trên nút button, sau dấu kiểm, nút radio, tiêu đề nhóm, tiêu đề hộpthoạiThêmdấu&vàotrướckýtự để tiêu đề nhóm, tiêu đề hộp thoại … Thêm dấu & vào trước ký tự để đặt phím tắt cho tile. Ví dụ: label = “&Hỏi thêm” list –các lựa chọn sẽ được dùng trong danh sách (list_box, popup_list) ngay khi khởi tạo. Giá trị cho dạng chuỗi ký tự, các lựa chọn cách nhau bởi chuỗi ký tự “\n”. Ví dụ: list = “Red\nBlue\nGreen” mnemonic –phím tắt của tile (phải là ký tự thể hiện trong label). Ví dụ label = “Hỏi thêm”; mnemonic = “H” value –giá trị (chuỗi ký tự) đặt cho tile khi khởi tạo hộp thoại. Có thể thay đổi bằng hàm set_tile. Ví dụ: value = “1” hoặc value = “0” width –chiều rộng của tile (đo bằng số ký tự) Ví dụ -cấu trúc cây dialog image_button row boxed_column popup_list list_box edit_box to gg le gg toggle boxed_column radio_button radio_button radio_button radio_button toggle toggle toggle row image button button button DCL code InputData : dialog { label = “ Nhập thông số “; // tiêu đề hộp thoại : image_button { // định nghĩa hộp hình ảnh minh họa width = 35; aspect_ration = 2.0; height = 12; l0 co l or = 0 ; key = “hv_image”; allow_accept = true; } : row { // hàng thứ nhất : boxed_column { // cột thứ nhất trong hàng label = “Kích thước”; // tiêu đề : popup_list { // các tile trong cột này key = “kichthuoc”; edit_width = 10; } Ví dụ -DCL code : list_box { label = “Mô tả chi tiết”; key = “motachitiet”; width = 4; height = 6; } di b { : e di t_ b ox { label = “Chiều dài”; key = “l”; edit_width = 10; } : toggle { label = “Ren suốt chiều dài vít”; value = “0”; // mặc định không chọn key = “allren”; } Ví dụ -DCL code : toggle { label = “Góm nhóm các nét vẽ”; value = “1”; // mặc định chọn key = “group”; } } // kết thúc cột thứ nhất bdl { // ộ hứ 2 : b oxe d _co l umn { // c ộ t t hứ 2 label = “Vẽ hình chiếu: “; : radio_button { label = “&1”; key = “hcc”; } : radio_button { label = “&2”; key = “hcd”; value = “1”; // mặc định chọn } ©©tđttđt20122012 đ t đ t2012©2012 ©t đ t đ © © tđttđt2012 © 2012 © 3 Ví dụ -DCL code (….) : toggle { label = “Vẽ đệm vênh”; key = “demvenh”; value = “0”; // mặc định không chọn } }//kế hú ộ 2 } // kế t t hú c c ộ t 2 : row { // sang dòng 2, gồm các tile đơn đã định nghĩa mesys11; ok1; cancel1; help1; } // hết row 2 } // kết thúc hộp thoại InputData // Các tile đơn định nghĩa gồm mesys1, ok1, cancel1, help1 xem trang tiếp theo DCL code mesys11 : image { width = 8; height = 2; fixed_width = true; color = dialog_background; key = “mesys11”; cancel1 : button { label = “&Không”; width = 13; fixed_width = true; is_cancel = true; key = “cancel”; } ok1 : button { label = “&Vẽ”; width = 13; fixed_width = true; is_default = true; key = “accept”; } } help1 : button { label = “&Hỏi thêm”; width = 13; fixed_width = true; alignment = centered; key = “help”; } 6.2. Điều khiển hộp thoại Hàm (load_dialog tênfileDCL) để nạp file DCL vào bộ nhớ. Ví dụ: (setq dcl_id (load_dialog “vidu110.dcl”)) Gọi hàm (new_dialog tênhộpthoại dcl_id) để gọi hộp thoại có tên chỉ định đã lưu trong file DCL. Ví dụ, hộp thoại tên “InputData” (new_dialog “InputData” dcl_id) Nế hà h ô hà ả ề T l ihà ả ề NIL Nế u t hà n h c ô n g , hà m tr ả v ề T , n g ược l ạ i , hà m tr ả v ề NIL . Đặt lại các thông số cho các tile bằng các hàm xử lý tile. Gọi hàm (start_dialog) để hiện hộp thoại. Hàm này hoạt động cho đến khi người dùng chọn tile đã được gán biểu thức AutoLISP chứa hàm done_dialog. Hàm start_dialog trả về giá trị status trong biểu thức gọi hàm done_dialog, còn nếu bỏ qua tham số status, hàm trả về 1 khi người dùng chọn tile được gán is_default = true, 0 khi chọn tile được gán is_cancel = true. Hàm (done_dialog [status]) đóng hộp thoại này, chỉ được gọi trong biểu thức liên quan đến chọn tile – hàm action_tile. Gọi hàm (unload_dialog dcl_id) để giải phóng hộp thoại. Các hàm xử lý tile (action_tile key action) - gán các biểu thức cần thiết khi người dùng chọn tile có key đã khai báo trong DCL. (mode_tile key mode) -thay đổi các đặc tính tile. Hàm luôn trả về giá trị NIL. (set_tile key value) - đặt lại giá trị value của tile. Trả về giá trị value vừa đ ặ t l ạ i cho tile. ặ ạ (get_tile key) -lấy giá trị value hiện thời của tile tương ứng. Hàm trả về chuỗi ký tự thể hiện giá trị hiện thời của tile. Các hàm thao tác với popup_list và list_box gồm: start_list – thực hiện tạo mới, thêm hoặc sửa đổi danh sách , add_list – thêm hoặc thay đổi một thành phần trong danh sách trả về bởi hàm start_list và end_list –kết thúc các thao tác với danh sách. Các hàm thao tác với tile ảnh gồm start_image –bắt đầu các thao tác ảnh, vector_image –vẽ đoạn thẳng, fill_image – tô màu vùng tile, slide_image –gắn ảnh lên tile và end_image –kết thúc. Hàm action_tile Hàm (action_tile key action) gán các biểu thức cần thiết khi người dùng chọn tile có key đã khai báo trong DCL. key – khóa tham chiếu (khi định nghĩa tile) action –chuỗi ký tự thể hiện các tác vụ sẽ thực hiện khi chọn tile này. Ví dụ 1: (action_tile “l” “(setq chieudai (atof (get_tile \”l\”)))”) –sẽ đọc biểu thức do n g ười dùn g nhập tron g hộp “Chiều dài” – xem hộp thoại 110, kết quả được chuỗi ký tự, sau đó chuyển đổi chuỗi ký tự này thành số thực và gán cho biến chieudai. Ví dụ 2: (action_tile “kichthuoc” (setq size $value) –sẽ trả về chuỗi ký tự thể hiện thứ tự phần tử đã chọn trong danh sách các kích thước vít tiêu chuẩn hiện trong hộp popup_list: “0” – phần tử đầu, “1” – phần tử thứ 2… Biểu thức kiểu $X được gọi là callback. Các callback hay dùng gồm $key – trả về giá trị thuộc tính key của tile đã chọn, $value – trả về giá trị value của tile. mode_tile, set_tile và get_tile Hàm (mode_tile key mode) thay đổi các đặc tính tile như cho phép chọn hay không (is_enable), bật tắt hình ảnh của tile key – khóa tham chiếu (khi định nghĩa tile) mode –số nguyên, thể hiện đặc tính mới của tile: 0 – cho phép chọn tile (đặt is_enable = true) 1 – không cho phép chọn tile (làm tile mờ đi trên hộp thoại) 2 – đặt focus tới tile này (tương tự như dùng Tab để chuyển đến) 3 – chọn nội dung văn bản trong hộp edit_box. Khi nhập giá trị, phần nội dung cũ sẽ bị ghi đè lên. 4 – bật / tắt hình ảnh trên tile (image, image_button) Hàm (set_tile key value) thay đổi giá trị value của tile, trả về giá trị value mới. value –chuỗi ký tự, thể hiện giá trị mới của tile Hàm này thường được dùng để đưa các kết quả tính toán lên hộp thoại. Hàm (get_tile key) lấy giá trị value hiện thời của tile, kết quả của hàm là chuỗi ký tự. ©©tđttđt20122012 đ t đ t2012©2012 ©t đ t đ © © tđttđt2012 © 2012 © 4 Các hàm thao tác với popup_list và list_box Hàm (start_list key [ope [ind]]) tạo mới hoặc sửa đổi danh sách ope –nhận các giá trị 1 (thay đổi nội dung danh sách), 2 (thêm thành phần mới vào danh sách) hoặc mặc định 3 (tạo mới danh sách). Nếu danh sách đã tồn tại và ope được gán giá trị 3 (hoặc bỏ qua), danh sách cũ sẽ bị x óa v à t h ay m ớ i bằ n g các t h à nh p h ầ n ở h à m add li st cũ sẽ bị xóa và thay mới bằng các thành phần ở hàm add _ list ind –số nguyên thể hiện thành phần cần thay đổi. Các thành phần được đánh số từ 0. Hàm (add_list item) thêm hoặc thay đổi thành phần trong danh sách. Hàm này được dùng ngay sau hàm start_list. item –chuỗi ký tự thể hiện thành phần mới của danh sách Hàm (end_list) kết thúc các thao tác với danh sách Lưu ý: Ba hàm này luôn đi cùng nhau theo thứ tự trên. Ví dụ về popup_list và list_box ; lấy các phần tử trong danh sách AutoLISP và đưa vào popup_list (setq llst (list “red” “blue” “green”)) (start_list “popup”) ; tạo danh sách mới có key là popup (mapcar ‘add_list llst) ; chạy hàm add_list với các thành phần của danh sách llst (end_list) ; kết thúc thao tác ; thay thê thành phần “ blue ” thành “ xanh” ; thay thê thành phần blue thành xanh (start_list “popup” 1 1) ; “blue” là thành phần thứ 2 trong danh sách (add_list “xanh”) (end_list) ; thêm vào cuối danh sách hai thành phần mới “cyan” và “gray” (start_list “popup” 2) ; ope = 2, tức thêm vào danh sách (add_list “cyan”) (add_list “gray”) (end_list) Kết quả danh sách popup mới sẽ là “red”, “xanh”, “green”, “cyan”, “gray”. Thao tác với các tile hình ảnh Hàm (start_image key) bắt đầu các thao tác với tile hình ảnh có key chỉ định trong hàm. Sau đó để thực hiện các thao tác với hình ảnh sẽ phải gọi các hàm vector_image, fill_image hoặc slide_image. Hàm (end_image) kết thúc các thao tác với hình ảnh cho tile được gọi bởi hàm start_key. Để xác định kích thướccủa tile có thể sử dụng các hàm: Để xác định kích thước của tile có thể sử dụng các hàm: (dimx_tile key): trả về chiều rộng của tile. (dimy_tile key): trả về chiều cao của tile. Trong đó, key là khóa tham chiếu tới tile cần tìm kích thước Hàm slide_image chỉ gắn các ảnh slide do AutoCAD tạo ra, được lưu riêng lẻ (*.SLD) hoặc trong file thư viện ảnh (*.SLB). Ảnh *.SLB được tạo từ các hình ảnh trên bản vẽ bằng lệnh MSLIDE. Các ảnh này được đưa vào thư viện SLB thông qua chương trình SLIDELIB.EXE filename, với filename là tên của file văn bản, chứa nội dung gồm tên các file SLB. Hàm vector_image Hàm (vector_image x1 y1 x2 y2 color) vẽ đoạn thẳng từ 2 điểm có tọa độ (x1 y1) và (x2 y2) trên tile với màu có số hiệu color. Ví dụ: Vẽ 2 đường chéo màu đỏ qua các đỉnh của tile có key là “img1”: (setq color 1 w (dimx_tile “img1”) h (dimy tile “ img1 ” )) h (dimy _ tile img1 )) (start_image “img1”) (vector_image 0 0 w h color) (vector_image 0 h w 0 color) (end_image) Lưu ý, màu color là số nguyên, tương ứng với số hiệu màu trong AutoCAD: 1 = đỏ, 2 = vàng… hoặc các giá trị sau: -2 = BGLCOLOR – màu màn hình nền AutoCAD hiện hành -15 = DBGCOLOR – màu nền hộp thoại hiện hành -16 = DFGLCOLOR – màu văn bản trên hộp thoại hiện hành -18 = LINELCOLOR – màu đường viền hộp thoại hiện hành. Hàm fill_image và slide_image Hàm (fill_image x1 y1 width height color) tô màu color lên vùng chữ nhật trên tile có đỉnh (x1 y1) và các cạnh có độ lớn width và height. Ví dụ: Tô màu vàng cho toàn bộ tile có key “img1”: (setq color 2 w (dimx_tile “img1”) h( dimy tile “img1 ” )) h ( dimy _ tile img1 )) (start_image “img1”) (fill_image 0 0 w h color) (end_image) Hàm (slide_image x1 y1 width height sldname) gắn ảnh AutoCAD Slide lên vùng chữ nhật trên tile có đỉnh (x1 y1) và các cạnh có độ lớn width và height. Tham số sldname là tên file slide sẽđược dùng. Nếu ảnh slide này được lưutrongthư viện ảnh thì sldname sẽ phải đượcviếtdướidạng libname(sldname), với libname là tên file thư viện. Phầnmở rộng của file slide hoặc file thư viện không cầnkèmphầntên. . Điều khiển hộp thoại Hàm (load_dialog tênfileDCL) để nạp file DCL vào bộ nhớ. Ví dụ: (setq dcl_ id (load_dialog “vidu110 .dcl )) Gọi hàm (new_dialog tênhộpthoại dcl_ id) để gọi hộp thoại có tên. ©t đ t đ © © tđttđt2012 © 2012 © 1 6. Hộp thoại DCL Ngôn ngữ DCL dùng để tạo các hộp thoại. So với cách giao tiếp trên dòng lệnh, hộp thoại có nhiều ưu điểm như: Nhập liệu thuận tiện, Giao diện thân thiện hơn… Các hộp thoại. rộng .DCL. Một file DCL có thể chứa nhiều hộp thoại. Lưu ý DCL phân biệt chữ hoa và chữ thường. Để xem trước kết quả thiết kế hộp thoại, chọn Tools / Interface tools / Preview DCL Cú