• Trang Chủ
  • Kiến Trúc
  • Nội Thất
  • Đồ Họa
  • Phần Mềm
  • Tài Liệu
  • Giải Trí
  • Khác
No Result
View All Result
  • Trang Chủ
  • Kiến Trúc
  • Nội Thất
  • Đồ Họa
  • Phần Mềm
  • Tài Liệu
  • Giải Trí
  • Khác
No Result
View All Result
Đặng Tiến Dũng
No Result
View All Result

MAXScript cơ bản cho người mới – phần 3

23/12/2023
in Phần Mềm
Reading Time: 8 mins read

Trong phần này, chúng ta sẽ học làm quen với Function (hàm). Function là một hoặc tập hợp nhiều dòng code dùng để thực hiện một nhiệm vụ cụ thể nào đó. Tập hợp những code này có thể được tái sử dụng nhiều lần trong script bằng cách gọi tên function. Bạn cũng có thể đưa thông tin vào function, và nhận kết quả trả về từ function.

Function cực kỳ hữu ích khi viết script. Bạn nên chuyển bất kỳ đoạn code nào mà có khả năng sẽ cần dùng nhiều thành function. Nó giúp bạn tránh phải viết lại những chức năng lặp đi lặp lại, và giúp code trở nên khoa học và dễ chỉnh sửa hơn. Trong 3ds Max, có những function được viết sẵn và tích hợp vào hệ thống, mà bạn chỉ việc gọi chúng để sử dụng.

Ví dụ, trong các bài viết trước, chúng ta đã biết một trong các function cơ bản của 3ds Max, đó là messageBox x. Function này giúp chúng ta hiển thị một thông báo trên màn hình, với x là nội dung chúng ta nhập. Khi nhập các function này trong MAXScript Editor, nó sẽ được highlight sang chữ màu. Điều này giúp chúng ta biết được đây là một function có sẵn trong hệ thống.

Hãy xem xét ví dụ sau.

try DestroyDialog MAXScript_Test catch()
rollout MAXScript_Test "TEST"
(
 button btn_1 "Button 1"
 button btn_2 "Button 2"
 on btn_1 pressed do 
 (
  delete selection
  messageBox "Deleted!"
  b = box()
 )
 on btn_2 pressed do 
 (
  delete selection
  messageBox "Deleted!"
  b = box()
  select b
 )
)
createDialog MAXScript_Test 100 100

Đoạn code phía trên sẽ tạo ra một dialog với 2 nút bấm. Hãy đọc lại phần 2 nếu bạn chưa quen với những dòng này. Ở đây chú ý phần in đậm. Nó là chức năng của 2 nút bấm. Với nút btn_1, nó sẽ xóa những gì đang chọn (delete selection), hiển thị thông báo “Deleted!” (messageBox), và sau đó tạo ra một khối box ở gốc tọa độ với lệnh box().

Lưu ý rằng box() là một function có sẵn có 3ds Max. Lệnh này dùng để tạo ra 1 khối box cơ bản, kích thước là 25x25x25mm, nằm ở gốc tọa độ. Thực ra, bạn có thể viết box() thay vì b = box(). Tuy nhiên, ở đây tôi cần định danh khối box để gọi lại khi cần, bằng cách gán biến b cho khối box vừa tạo ra. Việc này để phục vụ cho chức năng của btn_2.

Chúng ta thấy rằng nút bấm btn_2 có code gần giống hệt nút bấm đầu tiên. Nó khác ở lệnh cuối cùng. Sau khi tạo khối box, btn_2 sẽ chạy thêm lệnh select b để chọn khối box chúng ta vừa tạo. Hãy chạy thử script và bấm từng nút để xem kết quả.

Trong code phía trên, nếu chúng ta muốn đổi nội dung thông báo “Deleted!” thành “Đã xóa!”, chúng ta sẽ phải đổi nó ở 2 nơi. Trường hợp này, việc edit thủ công không gây nhiều trở ngại. Nhưng với những script mà có hàng chục, hàng trăm chức năng lặp lại, chúng ta sẽ mất rất nhiều công sức để chỉnh sửa hết.

Trong ví dụ này, chúng ta có thể khiến code script khoa học hơn, bằng cách sử dụng function. Hãy thử chỉnh sửa đoạn code trên lại như sau:

try DestroyDialog MAXScript_Test catch()
rollout MAXScript_Test "TEST"
(
 button btn_1 "Button 1"
 button btn_2 "Button 2"
 function tao_khoi_box =
 (
  delete selection
  messageBox "Deleted!"
  b = box()
  return b
 )
 on btn_1 pressed do 
 (
  t = tao_khoi_box()
 )
 on btn_2 pressed do 
 (
  t = tao_khoi_box()
  select t
 )
)
createDialog MAXScript_Test 100 100

Hãy để ý đoạn code được in đậm. Đây là công thức để tạo ra 1 function cơ bản. Bắt đầu với từ khóa function, sau đó là tên function, và cuối cùng là tập hợp code của bạn trong cặp dấu ngoặc đơn.

Ở ví dụ trên, tôi đã tạo ra function là tao_khoi_box. Khi cần dùng function này, tôi có thể viết tao_khoi_box(). 3ds Max sẽ tự động thay thế từ khóa này bằng code trong dấu ngoặc đơn của function. Khi chạy function này, 3ds Max sẽ lại xóa những gì đang chọn, hiển thị thông báo, tạo ra khối box.

function tên_function =
(
 -- code của bạn ở đây...
)

Chạy thử lại script phía trên và bấm thử từng nút. Bạn sẽ thấy rằng script vẫn hoạt động bình thường như code ban đầu của chúng ta. Lúc này, nếu muốn đổi nội dung của thông báo, tôi sẽ chỉ cần cập nhật code của function tao_khoi_box, các nút bấm sẽ được tự động cập nhật.

Thêm một điều nữa, bạn có để ý rằng ở cuối function có lệnh return không? Nó dùng để trả về 1 kết quả bạn chọn được tính toán trong function. Nếu tôi viết tao_khoi_box(), function sẽ vẫn trả về kết quả là khối box vừa tạo, tuy nhiên kết quả đấy sẽ không được sử dụng. Bằng việc dùng lệnh t = tao_khoi_box(), tôi gán t cho kết quả mà function tao_khoi_box() trả về, mà cụ thể ở đây là khối box vừa tạo. Khi này tôi có thể dùng lệnh select t trong btn_2.

Lưu ý rằng bạn có thể viết tắt chỉ là b thay vì return b và fn thay vì function. Tuy nhiên, tôi khuyên bạn nên viết dạng đầy đủ của nó để đọc được dễ dàng hơn. Điều này rất có ích với những người mới bắt đầu với MAXScript.

Trong ví dụ trên, chúng ta không đưa thông tin gì vào function, mà chỉ nhận kết quả của nó. Bây giờ chúng ta sẽ cùng xem xét 1 ví dụ khác.

messageBox (250 as string)
messageBox (428 as string)
messageBox (553 as string)

Trong ví dụ trên, 250, 428, 553 là các con số nguyên. Nếu bạn viết messageBox 250, script sẽ báo lỗi, vì messageBox chỉ có thể hiển thị ký tự – văn bản. Khi viết (250 as string), chúng ta đã chuyển 250 thành “250”, tức là một văn bản. Lúc này lệnh messageBox mới hoạt động được. Điều này rất bất tiện nếu phải dùng nó liên tục để trả kết quả về màn hình. Chúng ta có thể viết 1 function để giải quyết vấn đề trên.

function mess_box input = messageBox (input as string)

mess_box 250
mess_box 428
mess_box 553

Hãy chạy thử script trên. Nó đã hoạt động, và giờ bạn có thể dùng mess_box thay cho lệnh messageBox mà không lo nó sẽ bị lỗi. Bạn có thấy rằng lần này phía sau tên function có thêm từ input không? Đây là thông tin mà chúng ta sẽ nhập vào trong function. Khi tôi viết mess_box 250, 3ds Max sẽ hiểu là chạy function mess_box với giá trị nhập vào là 250. Tức 250 sẽ thay thế input, và lệnh mess_box 250 sẽ được 3ds Max dịch thành:

messageBox (250 as string)

Bạn có thể đổi input thành bất kỳ từ khóa hoặc ký tự nào bạn muốn. MAXScript cũng không giới hạn số biến nhập vào. Thêm function plus_box vào dưới function mess_box và chạy thử script.

function mess_box input = messageBox (input as string)

function plus_box x y =
(
 z = x + y
 mess_box z
)

plus_box 15 20

Script sẽ hiển thị thông báo trên màn hình: 35. Function plus_box có tác dụng cộng hai số chúng ta nhập vào, và sau đó gọi function mess_box để biến kết quả thành văn bản và hiển thị thông báo trên màn hình. Chúng ta đã “lồng” một function vào một function khác, giống như lồng lệnh box() trong tao_khoi_box(). Hãy xóa lệnh plus_box 15 20 và thử với 2 lệnh sau:

plus_box "test" "thu"
plus_box "so" 1

Trong lệnh đầu tiên, function đã hoạt động hoàn hảo. Kết quả trả về là “testthu”. Ở lệnh số 2, script báo lỗi trong listener. Bởi vì phép cộng 1 văn bản (string) và số nguyên (integer) đã không thực hiện được. Đây cũng là điều bạn cần cẩn thận khi khai báo biến, hãy kiểm soát giá trị nhập vào biến là loại gì.

Trong phần này, bạn đã học được cách viết 1 function cơ bản nhất. Bài tập của bạn là áp dụng nó và tạo ra một script có giao diện gồm 10 nút. Hãy làm cho chúng có tác dụng giống hệt nhau, tuy nhiên thông báo trả về sẽ khác nhau.

Chúc các bạn thành công, và hẹn gặp lại trong các phần tới.

Bài Viết Liên Quan

Incremental Saves trong SketchUp
Phần Mềm

Incremental Saves trong SketchUp

28/04/2025
43
Cách để trích xuất map gốc từ ảnh texture seamless
Phần Mềm

Cách để trích xuất map gốc từ ảnh texture seamless

24/04/2025
417
Tổng hợp lisp nhỏ cho AutoCAD
Phần Mềm

Tổng hợp lisp nhỏ cho AutoCAD (phần 2)

22/02/2025
845

Trả lời Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Nhiều lượt xem

Tổng hợp lisp nhỏ cho AutoCAD

Tổng hợp lisp nhỏ cho AutoCAD

17/05/2024
10.7k
Tổng hợp script nhỏ cho 3ds Max

Tổng hợp script nhỏ cho 3ds Max

27/02/2024
5.2k
Hiệu ứng phác thảo cho bản vẽ AutoCAD

Hiệu ứng phác thảo cho bản vẽ AutoCAD

19/03/2024
3.7k
Kiếm tiền từ bán model trên 3dsky

Kiếm tiền từ bán model trên 3dsky

25/03/2024
2.6k
Khắc phục lỗi AutoCAD bị treo khi sửa chữ

Khắc phục lỗi AutoCAD bị treo khi sửa chữ

15/02/2024
2.3k

Mới chỉnh sửa

Kiến trúc tả thực

Kiến trúc tả thực

12/05/2025
14
Incremental Saves trong SketchUp

Incremental Saves trong SketchUp

28/04/2025
43
Thời đại của học giả bàn phím

Thời đại của học giả bàn phím

09/04/2025
25
Cách để trích xuất map gốc từ ảnh texture seamless

Cách để trích xuất map gốc từ ảnh texture seamless

24/04/2025
417
Phát triển công cụ mở rộng cho 3ds Max: bắt đầu từ đâu?

Tuyển dụng MAXScript Developer

30/03/2025
120

Bài ngẫu nhiên

Trần coffered trong thiết kế nội thất

Trần coffered trong thiết kế nội thất

28/12/2023
285
Phát triển công cụ mở rộng cho 3ds Max: bắt đầu từ đâu?

Phát triển công cụ mở rộng cho 3ds Max: bắt đầu từ đâu?

25/11/2023
373
Sửa lỗi GPU quá nhiệt khi sử dụng màn hình thứ 3

Sửa lỗi GPU quá nhiệt khi sử dụng màn hình thứ 3

31/01/2024
138
Tổng hợp lisp nhỏ cho AutoCAD

Tổng hợp lisp nhỏ cho AutoCAD

17/05/2024
10.7k
Thiết kế khóa vòm trang trí

Thiết kế khóa vòm trang trí

24/11/2023
257

Bài mới nhất

Kiến trúc tả thực

Kiến trúc tả thực

12/05/2025
14
Incremental Saves trong SketchUp

Incremental Saves trong SketchUp

28/04/2025
43
Cách để trích xuất map gốc từ ảnh texture seamless

Cách để trích xuất map gốc từ ảnh texture seamless

24/04/2025
417
Thời đại của học giả bàn phím

Thời đại của học giả bàn phím

09/04/2025
25
Phát triển công cụ mở rộng cho 3ds Max: bắt đầu từ đâu?

Tuyển dụng MAXScript Developer

30/03/2025
120
  • Giới thiệu
  • Cửa hàng
  • Facebook
  • Youtube
  • Liên hệ

Tổng số lượt truy cập: 72083  |  Hôm nay: 61  |  Hôm qua: 156

No Result
View All Result
  • Kiến Trúc
  • Nội Thất
  • Đồ Họa
  • Phần Mềm
  • Tài Liệu
  • Khác

Tổng số lượt truy cập: 72083  |  Hôm nay: 61  |  Hôm qua: 156