Trong phần này, chúng ta sẽ học về String. Đây là kiểu dữ liệu được sử dụng để lưu xâu ký tự trong MAXScript. Thực ra, ngay từ phần 1 trong chuỗi bài viết này, chúng ta đã làm quen với String. Bạn còn nhớ câu lệnh đầu tiên mà chúng ta đã viết trong Mini Listener chứ?
messageBox "Hello world!"
Ở câu lệnh trên, “Hello world” chính là một String. Không chỉ dùng cho các thành phần giao diện và thông báo, đôi lúc String cũng có thể được sử dụng cho các thuật toán chạy ngầm trong MAXScript. Dưới đây, tôi sẽ trình bày những thuộc tính cơ bản nhất của String. Trong bài sau, chúng ta sẽ ứng dụng nó để tạo ra một script chuyên dùng để đổi tên hàng loạt các vật thể đang được chọn hoặc trong cả scene 3ds Max hiện tại. Hãy cùng bắt đầu.
MỤC LỤC
Lý thuyết chung
Có hai cách để khai báo một String. Cách đầu tiên, như ví dụ trên, là đặt trực tiếp một chuỗi ký tự vào trong hai dấu ngoặc kép. Lưu ý, chuỗi ký tự sẽ chuyển màu khi được đặt trong dấu ngoặc kép. Nếu bạn không thấy nó chuyển màu, có thể bạn đã viết thiếu dấu ngoặc kép, hoặc thừa ký tự bên ngoài dấu ngoặc kép. Ví dụ, lệnh messageBox sẽ chỉ nhận dữ liệu nhập vào là String, ta có thể thử như sau:
messageBox "Đây là một chuỗi ký tự" --> 3ds Max hiện thông báo "Đây là một chuỗi string". messageBox "Đây là một chuỗi" ký tự --> 3ds Max báo lỗi ở chữ "ký tự".
Cách thứ hai là dùng cú pháp <giá trị> as string để chuyển một giá trị bất kỳ thành string. Khi được viết kết hợp cùng các lệnh khác, bạn phải để cú pháp này trong dấu ngoặc đơn, để tránh việc 3ds Max chỉ đọc <giá trị> và báo lỗi. Ví dụ như sau:
a = 5 as string b = 5 messageBox a --> 3ds Max hiện thông báo "5". messageBox b --> 3ds Max báo lỗi vì b là một số nguyên. messageBox 5 as string --> 3ds Max báo lỗi vì nó chỉ đọc giá trị 5. messageBox (5 as string) --> 3ds Max hiện thông báo "5".
Properties (thuộc tính)
String chỉ có một thuộc tính duy nhất, đó là count. Nó dùng để đếm số ký tự của String. Hãy nhập các lệnh sau vào MAXScript Listener:
"Hello world".count --> 3ds Max trả về kết quả "11". s = "Day la mot string." --> Gán giá trị cho biến s. s.count --> 3ds Max trả về kết quả "18".
Lưu ý rằng thuộc tính count là thứ chỉ đọc (read-only). Tức là bạn sẽ không thể thay đổi trực tiếp độ dài của string thông qua thuộc tính này.
Operators (xử lý dữ liệu)
Bạn có thể gộp 2 string bằng cách dùng dấu “+”. Ví dụ:
messageBox ("Day" + "la" + "mot" + "string") --> 3ds Max hiện thông báo "Daylamotstring".
Bạn cũng có thể so sánh 2 string bằng các dấu toán học == (bằng nhau), != (khác nhau), > (lớn hơn), < (nhỏ hơn), >= (lớn hơn hoặc bằng), <= (nhỏ hơn hoặc bằng). Kết quả trả về sẽ là true (đúng) hoặc false (sai). Ví dụ:
"Tien" == "Tien" --> 3ds Max trả về kết quả true (đúng). "Tien" <= "D" --> 3ds Max trả về kết quả false (sai). "Tien" != "Dung" --> 3ds Max trả về kết quả true (đúng).
Để đọc hoặc ghi một ký tự thứ n trong string, chúng ta dùng cú pháp <string>[n]. Ví dụ:
s = "Dang Tien Dung" --> gán string cho biến s. messageBox s[1] --> 3ds Max hiện thông báo "D", là ký tự thứ 1 trong s. messageBox s[3] --> 3ds Max hiện thông báo "n", là ký tự thứ 3 trong s. messageBox s[s.count] --> 3ds Max hiện thông báo "g", là ký tự cuối cùng trong s. s[5] = "_" --> thay ký tự thứ 5 bằng dấu gạch dưới. s[10] = "_" --> thay ký tự thứ 10 bằng dấu gạch dưới. messageBox s --> 3ds Max hiện thông báo "Dang_Tien_Dung"
Ở trên, chúng ta có thể chuyển bất kỳ một giá trị gì thành string bằng lệnh as string, thì chiều ngược lại cũng khả thi. Ví dụ:
s = "123.45" --> gán string cho biến s. n = s as float --> 3ds Max trả về giá trị số 123.45. n = s as integer --> 3ds Max trả về giá trị số nguyên 123. n = s as array --> 3ds Max báo lỗi, vì không thể chuyển "123.45" thành array.
Methods (phương pháp)
Ở đây, tôi sẽ liệt kê các method hay được sử dụng nhất của string. Các method nâng cao hơn, bạn có thể đọc trong tài liệu dành cho nhà phát triển của 3ds Max tại đây.
Execute
Excute dùng để thực thi những nội dung trong dấu ngoặc kép của string. Ví dụ, nếu viết execute “2+2”, nó sẽ tương ứng với viết trực tiếp 2+2 không có dấu ngoặc kép, và 3ds Max sẽ trả về kết quả là 4. Ví dụ khác:
-- công thức: execute s --> thực thi string trong s. f = "Không có việc gì khó!" s = "messageBox f" messageBox s --> 3ds Max hiện thông báo "messageBox f". execute s --> 3ds Max hiện thông báo "Không có việc gì khó!".
findString
Tìm kiếm vị trí bắt đầu của một chuỗi ký tự trong string.
-- công thức: findString s <ký_tự_đầu_vào> --> tìm vị trí bắt đầu của <ký_tự_đầu_vào> trong s. s = "Toi hoc 3ds Max!" findString s "3ds" --> tìm vị trí bắt đầu của "3ds" trong s, kết quả là 9. findString s "khac" --> tìm vị trí bắt đầu của "khac" trong, kết quả là undefined (không xác dịnh).
filterString
Tách string đầu vào thành một array chứa các string con.
-- công thức: filterString s <token_string> --> tách s bằng các ký tự trong <token_string>. s = "Toi hoc 3ds Max!" filterString s " " --> tách s bằng token dấu cách (" "), kết quả trả về là array #("Toi","hoc","3ds","Max").
Với array trả về, bạn có thể dùng các kiến thức trong bài 7 để xử lý nó.
substring
Trích một chuỗi ký tự trong string đầu vào.
-- công thức: subString s x y --> trích các ký tự trong s bắt đầu từ ký tự thứ x, kéo dài y ký tự. -- nếu y > s.count hoặc y < 0 thì trích toàn bộ các ký tự còn lại bắt đầu từ ký tự thứ x. s ="Toi hoc 3ds Max!" ss = substring s 1 3 --> kết quả trả về "Toi" ss = substring s 4 -1 --> kết quả trả về "hoc 3ds Max!" ss = substring s 5 100 --> kết quả trả về "hoc 3ds Max!"
replace
Tương tự substring, nhưng là thay thế một chuỗi ký tự trong string đầu vào.
-- công thức: replace s x y ss --> thay thế các ký tự trong s bắt đầu từ ký tự thứ x, kéo dài y ký tự bằng ss. s ="Toi hoc 3ds Max!" ss = replace s 1 3 "Ban" --> kết quả trả về "Ban hoc 3ds Max!"
toUpper và toLower
In hoa hoặc in thước ký tự đầu vào.
-- công thức: toUpper s --> in hoa string s. -- công thức: toLower s --> in thuong string s. s = "Toi hoc 3ds Max!" s1 = toUpper s --> kết quả trả về "TOI HOC 3DS MAX!" s2 = toLower s --> kết quả trả về "toi hoc 3ds max!"
Bài tập thực hành
Kết thúc phần này, như thường lệ, chúng ta sẽ có một số bài tập nho nhỏ để thực hành ứng dụng. Lưu ý: hãy cố gắng giải bài tập trước khi xem lời giải. Dùng chuột bôi đen phần phía dưới mỗi đề bài để thấy đáp án. Nếu có thể, hãy thử nghĩ ra một cách giải khác.
Bài tập số 1
Cho array test = #(“Box001”, “Box002”, “TestBox”, “Boxxxx”, “TheBox”, “Bo_x_Box”). Mỗi phần tử trong Array đều chứa 1 chuỗi “Box”. Hãy viết một script để tự động thay thế “Box” thành “KhoiHop”, sau đó trả hiển thị thông báo trên màn hình 3ds Max. Gợi ý: sử dụng findString, replaceString và kiến thức đã học được về vòng lặp trong phần 6 và Array trong phần 7.
test = #("Box001", "Box002", "TestBox", "Box Box Box", "TheBox", "Bo_x_Box") for i = 1 to test.count do ( k = findString test[i] "Box" test[i] = replace test[i] k 3 "KhoiHop" ) messageBox (test as string) --> #("KhoiHop001", "KhoiHop002", "TestKhoiHop", "KhoiHop Box Box", "TheKhoiHop", "Bo_x_KhoiHop")
Bài tập số 2
Cho string s = “Hoc MAXScript that la thu vi!”. Hãy viết script để thay thế tất cả dấu cách trong string này thành dấu gạch dưới. Sau đó hiện thông báo trên màn hình. Gợi ý: sử dụng filterString và kiến thức đã học được về vòng lặp trong phần 6 và Array trong phần 7.
s = "Hoc MAXScript that la thu vi !" arr = filterString s " " --> arr sẽ có giá trị là #("Hoc","MAXScript","that","la","thu","vi","!") new_s = arr[1] --> tạo một string có giá trị là "Hoc". for i = 2 to arr.count do new_s += ("_" + arr[i]) messageBox new_s ---> "Hoc_MAXScript_that_la_thu_vi_!"
Trong bài sau, bằng cách sử dụng String, chúng ta sẽ thực hành viết một macroScript dùng để đổi tên hàng loạt các vật thể đang được chọn. Hẹn gặp các bạn ở phần tiếp theo!