Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MAXScript Part 3.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
80 Кб
Скачать
☆

Пропуск выполнения цикла

Иногда, по ходу выполнения программы, необходимо, в зависимости от некоторых условий, пропустить некоторые операторы цикла. Для for этот вопрос иногда может быть решен с помощью where, однако и в этом случае эффективнее может оказаться применение оператора continue. Он пропускает все следующие за ним операторы и передает управление к началу цикла do, while или for. Например, собрать все сферы в массив ArraySphere, можно так (хотя это далеко не лучшее решение)

ArraySphere = for b in $* collect

( if classOf b ! = Sphere continue

b

)

Преждевременный выход из цикла

Может случиться, что в процессе выполнения цикла станет ясно, что дальнейшее его выполнение необходимо прекратить. Для этого используется оператор exit, выполнение которого прерывает работу цикла. Продолжая тему сфер, предположим, что в сцене должны содержаться сферы радиусом не более 10 и нам необходимо проверить, что так оно и есть. Эту задачу можно решить следующим образом.

global OKS

for b in $* do where classof b = = Sphere

( OKS = false

if b.radius>10 then exit

OKS = true

)

if OKS then

( … Действия в случае успешного прохождения теста

)

else

( … В противном случае

)

Собственная обработка ошибок

Некоторые действия во время выполнения скрипта могут привести к генерации сообщения об ошибке. Например, попытка вычислить функцию синуса от неопределенного значения приведет к появлению сообщения

-- Unable to convert: undefined to type: Float

Если подобная ошибка допущена при выполнении скрипта, содержащегося в файле, то его выполнение прервется, что не всегда желательно. Этого можно избежать, если написать такую конструкцию.

try sin x

catch print “sin function execute error”

Разумеется, как выражение, проверяемое на ошибку, так и выражение, выполняющееся в случае ошибки, могут быть сколь угодно сложными. В данном случае программа так же выдает сообщение об ошибке, но не прерывает выполнение скрипта.

Можно принудительно вызвать ошибку, вызвав функцию throw. Это может пригодиться при написании собственных функций. Например, такой код может содержать функция, делающая какие-нибудь вычисления только для положительных аргументов

if x < 0 then throw “Negative argument”

В качестве аргумента функции throw передается строка, содержащая сообщение об ошибке. При выполнении приведенного скрипта с отрицательным значением x произойдет то же самое – выполнение скрипта прервется, а в окно интерпретатора будет выдано сообщение

-- Runtime error: Negative argument

При этом конструкция try … catch будет так же добросовестно работать и в этом случае.

Оформление функций

Создать в MAXScript собственную функцию достаточно просто. Для этого надо написать ключевое слово function или, что то же самое, fn. После этого пишется имя функции, которое Вы будете использовать для ее вызова, затем список параметров, который завершается символом “=” и, наконец, выражение, которое будет выполняться при вызове функции. Выражение называется телом функции и чаще всего, но не обязательно, является блоковым. Рекурсивные функции, то есть такие, которые вызывают сами себя, в MAXScript допускаются.

Определению функции может предшествовать ключевое слово mapped. Если функция определена с этим словом, то она называется картированной. Это означает, что если в качестве первого параметра задан массив или группа объектов, то данная функция будет автоматически выполняться для каждого элемента этой группы или массива. Для примера определим функцию, которая устанавливает цвет объекта

mapped function SetColor obj ObjColor =

obj.wireColor = ObjColor

С помощью определенной таким образом функции можно, например, установить красный цвет для всех выбранных объектов сцены.

SetColor $ red

Функция при обращении к ней возвращает значение выражения, являющегося ее телом. То есть, если тело функции – блоковое выражение, то возвращается значение последнего выполненного выражения.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]