- •С чего начать
- •Переменные и присвоение им значений
- •Области видимости
- •Настойчивые переменные
- •Изменяемый тип переменных
- •Присвоение значения по ссылке
- •Выделение памяти и уборка мусора
- •Имена переменных
- •Числовые литералы
- •Строковые литералы
- •Литералы времени
- •Литералы имен объектов
- •Литералы
- •Литералы точек в двумерном и трехмерном пространстве
- •Литералы массивов
- •Выражения
- •Простые выражения
- •Математические выражения
- •Порядок выполнения операций в математических выражениях
- •Полиморфизм
- •Выражения сравнения
- •Логические операции
- •Сокращенное выполнение логических выражений
- •Позиционированные и именованные параметры
- •Приоритет вызова функций
- •Написание вызова функции в несколько строк
- •Другой способ вызова функций
- •Контекстные выражения
- •Комментарии
- •Обращение из одного скрипта к другим
- •Управление порядком выполнения операторов
- •Пропуск выполнения цикла
- •Собственная обработка ошибок
- •Оформление функций
- •Переменная, содержащая функцию
- •Параметры функций
- •Принудительное завершение функции
- •Определение структур
- •Создание функций, локальных внутри структуры
- •Базовые классы maxScript Класс Value
- •Операторы
- •Литералы
- •Операторы
- •Свойства
- •Операторы
- •Точка в трехмерном пространстве
- •Литералы
- •Конструкторы
- •Свойства
- •Операторы
- •Литерал
- •Конструкторы
- •Свойства
- •Произвольный поворот
- •Литералы
- •Конструкторы
- •Операторы
- •Свойства
- •Углы Эйлера
- •Операторы
- •Свойства
- •Прямоугольник
- •Литералы
- •Конструкторы
- •Свойства
- •Операторы
- •Функция
- •Массив_чисел
- •Вспомогательные методы Функция
- •Функция
- •Можно открыть зашифрованный файл, используя функцию
- •Свойства
- •Свойства
- •Особенности работы с ключами анимации
- •Массив параметров
- •Конструкторы
- •Свойства
- •Операторы
- •Множества
- •Шаблонные группы
- •Свойства
- •Операторы
- •Функции для работы с группами
- •Наборы объектов
- •Конструкторы
- •Свойства
- •Операторы
- •Функции, работающие с наборами
- •Дополнительные сведения
- •Конструкторы
- •Свойства
- •Операторы
- •Прочие функции
- •Операторы
- •Конструкторы
- •Свойства
- •Операторы
- •Операторы
- •Конструкторы
- •Конструкторы
- •Свойства
- •Свойства
- •Операторы
- •Литералы
- •Свойства
- •Операторы
- •Конструкторы
- •Свойства
- •Операторы
- •Конструкторы
- •Свойства
- •Операторы
- •Прочие функции
- •Скрипт-утилиты
- •Панель скрипт-утилиты
- •Составные части тела свитка
- •Создание перемещаемых окон
- •Видимость локальных переменных, структур, функций и компонент интерфейса из кода свитка
- •Доступ к локальным переменным и прочим элементам утилит и свитков из внешнего кода
- •Компоненты пользовательского интерфейса
- •Название_компонента Имя_переменной Символьная_строка
- •Общие свойства компонентов пользовательского интерфейса
- •Общие параметры компонентов пользовательского интерфейса
- •Типы компонентов пользовательского интерфейса Для примера рассмотрим утилиту, использующую все возможные компоненты пользовательского интерфейса
- •Битовая карта
- •Параметры
- •Свойства
- •События
- •Параметры
- •Параметры
- •Свойства
- •События
- •Параметры
- •Свойства
- •События
- •Выпадающий список
- •Параметры
- •Свойства
- •События
- •Свойства
- •События
- •Кнопка выбора текстурной карты
- •Параметры
- •Свойства
- •События
- •Кнопка выбора материала
- •Параметры
- •Свойства
- •События
- •Список с возможностью множественного выбора
- •Параметры
- •Свойства
- •События
- •Кнопка выбора объекта
- •Параметры
- •Свойства
- •События
- •Задатчик
- •Параметры
- •Свойства
- •События
- •Параметры
- •Свойства
- •События
- •Кнопки с картинками
- •Скрипт контекстного меню
- •Тело контекстного меню
- •Пункт меню
- •Разделитель
- •Подменю
- •Макро скрипты
- •Создание файлов с иконками
- •Средства работы с мышью
- •Остановить работу средства можно вызовом функции
- •Правила оформления средств работы с мышью
- •События
- •Скрипт плугины
- •Правила построения скрипт-плугина
- •Внесение изменений в плугин
- •Урок 1. Твердые тела
- •Создание набора твердых тел
- •Добавление тел к набору
Присвоение значения по ссылке
Представим себе, что мы завели переменную и присвоили ей значение – символьную строку
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’
принадлежат одной и той же переменной.
