Trong phần trước, chúng ta đã xuất bản được một script cơ bản nhất. Những script như vậy chỉ thực thi một lần duy nhất trong 3ds Max. Khi muốn sử dụng lại, chúng ta sẽ lại phải mở thủ công bằng Scripting > Open Script, hoặc lại kéo thả file script vào viewport.
Trong phần này, chúng ta sẽ học cách tạo giao diện người dùng cho script, để nó có thể thực thi lệnh nhiều lần trước khi kết thúc. Nút bấm, danh sách, thanh trượt,…, cũng sẽ giúp người dùng có nhiều lựa chọn hơn khi sử dụng script.
Đầu tiên, mở 3ds Max lên và setup lại giao diện làm việc như lần trước.
Nhập vào của sổ Editor như sau. Nhớ là nhập bằng tay nhé.
delete selection
Bạn sẽ thấy rằng chữ delete được tự động chuyển thành màu xanh và selection chuyển thành màu cam. Những màu sắc này thể hiện rằng những từ khóa này là biến và tính năng có sẵn trong 3ds Max. Ở đây, selection cũng có thể được viết tắt bằng ký hiệu $ (đồng đô-la). Khi bắt đầu, chúng ta vẫn nên cứ viết chúng là selection để dễ đọc hơn.
Dòng lệnh này ở đây có nghĩa giống hệt nghĩa đen của nó: xóa những gì đang chọn. Đây là ưu điểm lớn nhất của MAXScript, vì nó rất gần với văn viết bình thường. Việc chúng ta cần làm chỉ là học các từ vựng có sẵn. Tất nhiên, giống như mọi ngôn ngữ khác, điều này sẽ cần thời gian, đừng sốt ruột, rồi bạn sẽ dần dần học hết chúng.
Thử chọn một vài vật thể, sau đó click vào cửa sổ Editor và chạy Tools > Evaluate All (nút tắt Ctrl + E). Những gì chúng ta vừa chọn đã bị xóa đi. Chúng ta vừa viết được tính năng Delete có sẵn của 3ds Max. Bây giờ việc cần làm là tạo một giao diện cho nó.
Xóa dòng delete selection vừa viết khỏi Editor, và nhập vào dòng lệnh sau.
rollout xoaVatThe "Xoa Vat The" ( ) createDialog xoaVatThe 150 150
Evalute All (nút tắt Ctrl + E). Bạn sẽ thấy một cửa sổ có tên là Xoa Vat The sẽ hiển thị trên viewport của 3ds Max. Tuyệt vời, đây là giao diện người dùng đầu tiên bạn tạo được. Hãy ghi nhớ những dòng lệnh phía trên. Nó là mẫu cơ bản và hay dùng nhất để tạo ra một giao diện người dùng (rollout user interface).
Để ý rằng phía sau lệnh rollout, chúng ta có dấu mở ngoặc và đóng ngoặc. Các thiết kế giao diện, và tính năng của script sẽ được đặt trong hai dấu ngoặc này. Lệnh createDialog sẽ biến rollout thành một dialog (bảng) hiển thị trên viewport của 3ds Max. Chuỗi số 150 150 phía sau chính là kích thước chiều rộng và chiều cao của dialog.
Thử đổi con số này thành 150 300 và evalute lại đoạn code của chúng ta trong Editor. Một cửa sổ mới sẽ hiện ra với kích thước lớn hơn cửa sổ cũ. Nhưng bạn có để ý rằng trên viewport của 3ds Max đang có 2 cửa sổ Xoa Vat The cùng một lúc không?
Điều này xảy ra là vì chúng ta chưa đóng lại bảng Xoa Vat The cũ. Người dùng có thể tạo ra hàng trăm cửa sổ Xoa Vat The trên màn hình với code hiện tại. Để khắc phục, thêm dòng lệnh sau vào đầu script.
destroyDialog xoaVatThe
Lệnh destroyDialog là lệnh ngược lại với createDialog. Giờ chạy lại script (Evaluate All). Cửa sổ Xoa Vat The cũ sẽ được đóng lại trước khi tạo ra cửa sổ mới. Điều này đảm bảo trên viewport 3ds Max sẽ chỉ luôn có 1 cửa sổ Xoa Vat The duy nhất.
Bây giờ bạn hãy lưu script này, thử khởi động lại 3ds Max và chạy lại script. Vài dòng chữ đỏ thông báo lỗi sẽ hiện ra ở Listener. Vì sao lần này lại có lỗi? Chuyện gì đã xảy ra?
Ở phiên làm việc trước, chúng ta đã khai báo về rollout xoaVatThe. Định nghĩa này nằm trong bộ nhớ của 3ds Max, vì thế khi thêm lệnh destroyDialog, script vẫn hợp lệ. Tuy nhiên, ngay sau khi khởi động lại 3ds Max, định nghĩa xoaVatThe chưa có trong 3ds Max. Lệnh xóa dialog trở thành không hợp lệ, vì khai báo định nghĩa về biến xoaVatThe lại nằm sau lệnh destroyDialog.
Để khắc phục điều này, chúng ta sẽ sửa code thành như sau:
try destroyDialog xoaVatThe catch()
Cặp lệnh try … catch() có nghĩa là thử chạy lệnh …, nếu không được thì những lệnh trong cặp dấu mở ngoặc sau chữ catch sẽ được chạy. Ở đây, chúng ta không viết gì vào trong dấu đóng mở ngoặc này, nên lệnh phía trên có thể dịch thành: thử đóng cửa sổ xoaVatThe, nếu không được thì thôi, không làm gì cả. Lệnh này sẽ ngăn Listener báo lỗi khi chạy script khi mở lần đầu.
Bây giờ chúng ta sẽ tạo một nút bấm cho nó, và gán lệnh delete selection ở đầu bài viết vào nút bấm này. Hãy thêm dòng sau vào giữa hai dấu ngoặc sau rollout:
button nutXoa "Xoa"
Evaluate lại script. Một nút bấm nhỏ xinh sẽ hiển thị trên dialog của chúng ta. Chúng ta vừa định nghĩa một nút bấm có tên trong script là nutXoa, tên hiển thị trong dialog là Xoa.
Hiện tại, bấm vào nút này sẽ không có tác dụng vì chúng ta chưa gán bất kỳ lệnh nào cho nó. Thêm dòng sau vào ngay phía dưới (lưu ý là vẫn trong dấu dóng mở ngoặc của rollout):
on nutXoa pressed do delete selection
Tương tự, chúng ta có thể dễ dàng hiểu được ý nghĩa của câu này: khi (on) nutXoa được bấm (pressed) thì (do) xóa những vật thể đang chọn (delete selection). Hãy evaluate lại script và thử công dụng của nó. Chọn một vật thể và bấm vào nút Xoa. Kỳ diệu phải không, bạn đã làm nút bấm đầu tiên hoạt động!
Bây giờ, tôi muốn hiển thị một thông báo sau khi xóa vật thể. Bạn còn nhớ lệnh messageBox ở trong bài trước chứ, chúng ta sẽ dùng lệnh này để tạo ra thông báo trên màn hình.
Chỉnh sửa câu lệnh phía trên thành:
on nutXoa pressed do ( delete selection messageBox "Ban vua xoa cac vat the dang chon!" )
Giống như rollout, chúng ta sẽ “đóng gói” các nội dung sẽ chạy sau khi bấm nutXoa bằng dấu đóng mở ngoặc. Ở đây bạn có thể thêm bao nhiêu lệnh tùy thích. Các lệnh sẽ phân biệt với nhau bởi dấu xuống dòng. Hãy chạy lại script. Chọn một vật thể vào bấm nút Xoa. Script sẽ xóa vật thể đó và hiển thị thông báo như hình.
Xin chúc mừng! Bạn đã tạo ra script có giao diện đầu tiên của riêng mình. Đây cũng là cách làm thường dùng nhất khi tạo giao diện, vì thế hãy ghi nhớ nó cẩn thận mẫu phía dưới. Bạn cũng có thể thử thêm các nút bấm với thông báo khác nhau.
try destroyDialog myScript catch() rollout myScript "My Script" ( ) createDialog myScript 100 100
Bài học đến đây là hết. Hẹn gặp các bạn ở phần tiếp theo.