Читайте также: |
|
Многие объекты 3ds max хранят свои свойства в массивах специального класса, называемого массивом параметров (ArrayParameter). Главное отличие его от обычного массива MAXScript, состоит в том, что его элементы должны быть значениями одного и того же типа.
Конструкторы
Массив параметров можно получить только для конкретного объекта. Например, известно, что для стандартного материала в массиве параметров хранятся текстуры. Чтобы получить массив текстур для материала M, нужно записать такое выражение
M.maps
Его результатом будет массив параметров, содержащий текстуры. Узнать, какие свойства имеет конкретный объект, и какие из них содержатся в массиве можно с помощью функции showProperties. Возьмем для примера тот же стандартный материал.
M = standard ()
showProperties M
В результате работы второй строки приведенного скрипта в окне интерпретатора появится длинный список свойств стандартного материала, в котором, в числе прочих, будут и такие
.UserParam1 (Optional_Param1): float
.mapEnables (Map_Enables): bool array
.maps: texmap array
.mapAmounts (Map_Amounts): percent array
.adTextureLock (Ambient_Diffuse_Texture_Lock): Boolean
вторая, третья и четвертая из приведенных строк как раз означают разнообразные свойства текстур материала, размещенные в массивах. На это указывает слово array в конце описания.
Свойства
Массив параметров имеет только одно свойство
Массив_параметров. count
оно возвращает количество параметров, содержащихся в данном массиве
Операторы
Для массивов параметров определена операция индексирования
Массив_параметров [ Целое_число ]
с помощью этой операции можно получить или наоборот установить любой параметр из массива. Например для того же материала M, можно записать
M.mapEnables[1] = true
Методы
Методов для массива параметров не определено.
Множества
В MAXScript можно выполнить некоторые функции для каждого элемента множества, написав лишь один вызов такой функции. Эти функции называются картированными. Например, скрипт
hide selections
скроет все выбранные объекты сцены, сколько бы их не было. Существенным ограничением для картированных функций является тот факт, что множество должно быть первым аргументом этой функции.
Кроме этого одним оператором можно присвоить значение какому-нибудь свойству всех объектов, входящих во множество. Например, скрипт
$Sphere*.position = [0, 0, 0]
переместит все сферы в сцене в начало координат. Если свойство само является составным объектом и в свою очередь имеет свойства, то попытка присвоить значение “свойству второго уровня” для всех элементов множества за раз, может и не работать. Безопасно можно присваивать значения следующим свойства элементов множества
.angle
.b
.blue
.axis
.controller
.g
.green
.isAnimated
.keys
.r
.red
.track
.x
.x_rotation
.y
.y_rotation
.z
.z_rotation
Все определенные в MAXScript картированные функции, такие как copy, delete или move имеют необязательный параметр #noMap. Если применить картированную функцию к множеству, указав этот параметр, то функция будет вызвана один раз для множества в целом. Если же его не указывать, то функция вызовется столько раз, сколько элементов во множестве, и для каждого из них.
Вы можете написать собственную картированную функцию, указав в ее определении ключевое слово mapped. Например, функция
mapped fn SetRandomColor x = (x.wireColor = random black white)
может быть вызвана как для отдельного объекта, так и для целого множества. Например
SetRandomColor $Sphere01
установит случайный цвет для одной только сферы, а
SetRandomColor objects
для всех объектов сцены. Параметр #noMap для определенных пользователем картированных функций не работает.
Перебор всех элементов множества можно организовать с помощью цикла for. Например, скрипт
h = 0
for obj in $Box* do h = h +obj.height
подсчитывает сумму высот всех элементов сцены, чьи имена начинаются с Box. При этом следует иметь в виду, что для успешной работы цикла состав множеств не должен меняться во время его выполнения. Например, нам надо преобразовать все выбранные сплайны в NURBS-кривые. Такой скрипт
for s in selection do (convertToNURBSCurve s)
не выполнит этой задачи. Дело в том, что функция convertToNURBSCurve переводит все выделенные объекты в обычное состояние, и тем самым изменяет состав множества selection, а, попросту говоря, делает его пустым.
Массивы
Массив (array) является упорядоченным множеством и может содержать любое количество элементов различного типа. К массиву можно применять картированные функции.
Литералы
Литералы для массива описаны в главе о литералах. Вспомним только, что массивы могут записываться как список разделенных запятой элементов в круглых скобках. Перед открывающей скобкой должен стоять знак #. Например
# (1, 2, 3, 4, 5)
# ($Sphere01, $Box01, $Cilinder01)
Конструкторы
Практически любое из описанных ниже множеств может быть преобразовано в массив с помощью оператора преобразования типа
Множество as array
Кроме того, можно, создав с помощью литерала пустой массив, например, так
A = # ()
заполнять его по мере необходимости, используя описанные далее методы.
Свойства
Для любого массива можно получить, но не записать, количество элементов в массиве
Массив. count
Операторы
Естественной для массивов является операция индексирования. С ее помощью можно прочитать или записать любой элемент массива
Массив [ Целое_число ]
Массивы индексируются только целым числом, начиная с единицы. Кроме того, массив может складываться с любым множеством
Массив + Множество
Результатом такой операции будет массив, который содержит элементы, входящие хотя бы в одно из слагаемых. Например, результатом сложения двух массивов
#(1, 2, 3, 4, 5, 6) + #(4, 5, 6, 7, 8)
будет массив
#(1, 2, 3, 4, 5, 6, 7, 8)
Методы
Добавить любой объект MAXScript к массиву можно с помощью с помощью функции
append Массив Value
Массив при этом расширяется. Для вставки элемента в произвольное место массива применяется функция
insertItem Value Массив Целое_число
После вызова этой функции значение, заданное первым параметром, окажется в массиве на месте, определенном третьим параметром. Элементы, начиная с того, который ранее стоял на этом месте, сдвинутся вправо, а размерность массива увеличится на единицу.
Чтобы получить копию массива используйте функцию
copy Массив #noMap
Второй параметр не обязателен. Если он указан, то объекты 3ds max, содержащиеся в массиве, не создаются, а результатом функции будет массив, содержащий те же самые объекты, что и исходный. Параметр #noMap описан выше.
Функция
deleteItem Массив Число
удаляет из массива элемент с индексом, заданным вторым параметром. Число элементов массива при этом, естественно, уменьшается на единицу.
Массив можно объединить с любым множеством с помощью функции
join Массив Множество
Данная функция делает то же самое, что и операция сложения. Разница только в том, что при сложении массивы-слагаемые остаются в своем первоначальном виде, а join добавляет элементы непосредственно к указанному массиву.
Для сортировки массива применяется функция
sort Масив
При этом все элементы массива должны иметь один и тот же тип, для которого определены операции больше, меньше и т.д. В массиве могут содержаться, например, контроллеры, числа и геометрические объекты. В этом случае об их сортировке говорить не приходится. То же касается и функции поиска
findItem Массив Value
Для поиска в массиве MAXScript применяет операцию сравнения = =. Следует позаботиться о том, чтобы значение, заданное вторым параметром, могло корректно сравниваться со всеми элементами массива. Функция возвращает индекс элемента в массив, если он найден и ноль в противном случае.
Функции поиска минимума и максимума
amin Массив
amax Массив
так же используют стандартную операцию сравнения и, следовательно, массивы, к которым они применяются, должны содержать однотипные значения. Функции возвращают соответственно минимальный и максимальный элементы массива. Для сортировки по произвольному алгоритму применяется функция
qsort Массив Функция start: Целое_число end: Целое_число
Пользовательские_параметры
Обязательны только первые два параметра. Например, такой скрипт сортирует объекты сцены по длине имен
fn comparename obj1 obj2 =
(if obj1.name.count > obj2.name.count then return 1
else (if obj1.name.count < obj2.name.count then return -1)
return 0
)
a = objects as array
qsort a comparename
Функция, которую Вы определяете для сравнения, должна иметь как минимум два параметра, для которых и проводится сравнение. Результатом функции должно быть отрицательное число, если первый параметр функции меньше второго, ноль, если они равны и положительное, если первый параметр больше. Корме этого, функции сравнения можно передать неограниченное число именованных параметров. Например, добавим в приведенный ранее пример возможность указать направление сортировки
fn comparename obj1 obj2 direction: =
(case direction of
(#Up: if obj1.name.count>obj2.name.count then return -1
else (if obj1.name.count<obj2.name.count then return 1)
#Down: if obj1.name.count>obj2.name.count then return 1
else (if obj1.name.count<obj2.name.count then return -1)
)
return 0
)
a=objects as array
qsort a comparename direction:#Down
Параметры start и end позволяют задать начальный и конечный элементы сортировки. Элементы массива, находящиеся вне указанного этими параметрами диапазона останутся на своих местах.
Дата добавления: 2015-10-31; просмотров: 122 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Строковый поток | | | Функции, работающие с наборами |