- •С чего начать
- •Переменные и присвоение им значений
- •Области видимости
- •Настойчивые переменные
- •Изменяемый тип переменных
- •Присвоение значения по ссылке
- •Выделение памяти и уборка мусора
- •Имена переменных
- •Числовые литералы
- •Строковые литералы
- •Литералы времени
- •Литералы имен объектов
- •Литералы
- •Литералы точек в двумерном и трехмерном пространстве
- •Литералы массивов
Присвоение значения по ссылке
Представим себе, что мы завели переменную и присвоили ей значение – символьную строку
Text1 = “Hello”
По какой-либо причине мы хотим сохранить это значение в новой переменной, а первый символ старой строки изменить.
Text2 = Text1
Text1[1] = “C”
Казалось бы, мы имеем две переменных, одну со значением “Hello”, другую – ”Cello”, но это только кажется. На самом деле в переменных MAXScript хранится не само значение, а его адрес в памяти компьютера. Когда мы меняем значение какого-нибудь элемента, в нашем случае первого символа строки, то изменению подвергается как раз значение, а не адрес. Таким образом, мы имеем две переменных, содержащих адрес одного и того же значения – строковой константы “Cello”. Помните об этом, если Вы хотите, например, сохранить значение какого-нибудь объекта, имея в мыслях вернуться к нему в случае отмены действий пользователем.
Чтобы такого не произошло, используйте специально предназначенную для этого функцию – copy.
Text1 = “Hello”
Text2 = copy Text1
Text1[1] = “C”
Вот теперь все правильно. Следует только отметить, что если Вы присваиваете новое значение не какому-нибудь элементу, например, первому символу строки, а всей переменной, то дело сойдет гладко и без дополнительных усилий.
Text1 = “Hello”
Text2 = Text1
Text1 = “Cello”
Попробуйте выполнить приведенные выше скрипты, и пронаблюдайте за результатами.
Выделение памяти и уборка мусора
Для нормальной работы MAXScript, ему выделяется некоторый участок памяти. Величина этого участка может быть определена в диалоге Preference Settings, который вызывается из меню Customize пунктом Preferences. На этом диалоге есть закладка MAXScript, в которой вы можете изменить значение Initial heap allocation (MBytes), то есть изначально выделенная память (в Мегабайтах). Можно увеличить (но не уменьшить) память и по ходу выполнения программы. Для этого увеличивается значение переменной heapSize, например, так:
heapSize=heapSize+2000
что увеличит доступную память аж на две тысячи байт. Хотя MAXScript поддерживает операцию увеличения, поэтому более грамотно написать то же самое можно так:
heapSize += 2000
В процессе работы объекты то создаются, то уничтожаются, то вновь создаются. В отличие от некоторых других языков программирования, в MAXScript Вам не придется следить за тем, чтобы память, использованная уничтоженным объектом, вновь возвращалась в строй. Если же у Вас есть подозрение, что MAXScript не справляется с обязанностями по уборке мусора, вызовите функцию gc(). Кстати, она возвращает количество свободных байт памяти, имеющихся в распоряжении MAXScript. Однако для информационных целей лучше использовать переменную heapFree, так как если на момент вызова в памяти имеется много мелких переменных, то gc() может работать до нескольких секунд. Кстати, попробовав несколько раз вывести значение heapFree, вы можете получить все время разные значения. Отчего это происходит, лучше спросить у фирмы discreet. Видимо в 3ds max постоянно кипят какие-то невидимые простым глазом процессы.
Имена переменных
Имена переменных в MAXScript подчиняются обычным для языков программирования правилам. Имя должно начинаться с буквы, но может содержать цифры. Символ подчеркивания “_” считается буквой, прочие символы не допускаются. Длина имени не ограничена.
MAXScript нечувствителен к регистру символа. Иными словами имена
RotationX
rotationx
ROTATIONX
принадлежат одной и той же переменной
Кроме того, в MAXScript имеется специальный тип данных – имя. Он представляет собой имя переменной, которой предшествует знак #. Используется этот тип данных главным образом для того, чтобы передать имя переменной какой-нибудь стандартной функции. Например, уже знакомая нам функция persistents.remove требует, чтобы ей передавали как раз имена переменных
persistent global a
persistents.remove #a
Убрав знак # из приведенного скрипта, Вы получите ошибку.
Если Вам все же очень хочется использовать в имени переменной пробелы и знаки пунктуации, то это можно сделать, окружив имя одинарными кавычками. Например:
‘Rotation X’=12
‘Translation (Z)’=48.5
При этом знак подчеркивания в обычном имени эквивалентен символу пробела в имени, окруженном кавычками, то есть имена
Scale_X
‘Scale X’
принадлежат одной и той же переменной.
