Изменяемый тип переменных




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

x = 4.5 -- сейчас x – вещественное число

x = “Hello, world” -- а сейчас – строка

Более того, элементы одного и того же массива так же могут иметь разный тип.

a[1] = 12

a[2] = 13.5

a[3] = “Character Line”

 

Присвоение значения по ссылке

Представим себе, что мы завели переменную и присвоили ей значение – символьную строку

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’

принадлежат одной и той же переменной.

 

Литералы

Литералы, или иными словами константы, записанные в тексте программы, могут использоваться, например, для присвоения начальных значений переменным. Поскольку переменные могут содержать данные разных типов, то разных типов могут быть и литералы.

 

Числовые литералы

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

0.128

2.56

-0.03

0.2e-8

вещественные числа, а

-5

0x12E

целые. Последнее число записано в шестнадцатеричной системе счисления. В этом случае ему предшествует два символа – ноль и малое икс.

 

Строковые литералы

Строковые литералы используются для записи символьных строк и окружаются двойными кавычками. Например:

“I can’t speak English”

строковый литерал

Для записи в строковом литерале некоторых управляющих символов или тех же двойных кавычек применяется знак обратного слеша - \

\” – двойные кавычки

\n – переход на новую строку

\r – возврат каретки

\t – знак табуляции

\? – вопросительный знак

\* - звездочка

\\ - обратный слеш

\% - знак процента

Чтобы ввести в строковый литерал символ, которого нет на клавиатуре, можно использовать последнее стандартное сочетание с обратным слешем.

\x<две шестнадцатеричные цифры>

Например

text = “Copyright \xA9 2002, Petrov & Co”

вставляет в текст символ ©, шестнадцатеричный код которого – A9. Поскольку в именах файлов часто используются знаки обратного слеша, в MAXScript принято записывать их примерно так

path = “c:\\3dsmax4\\meshes”

хотя допускается заменять два обратных слеша на один прямой и записать тот же литерал так

path = “c:/3dsmax4/meshes”

 

Литералы времени

Работая с анимацией, трудно обойтись без времени. В MAXScript время измеряется в минутах, секундах, фреймах и тиках (tick). В одной секунде 4800 тиков или тридцать фреймов. Возможны два формата записи времени. Первый может выглядеть примерно так

2.8s – две и восемь десятых секунды

3m5s2f4t – три минуты, пять секунд, два фрейма, четыре тика

73f – семьдесят три фрейма

Второй пишется так – сначала минуты, через двоеточие секунды, через точку фреймы. Тики в такой записи не указываются. Например

2:6.28 – то же самое, что 2m6s28f

0:0.73 – то же самое, что 73f

 

Литералы имен объектов

Поскольку MAXScript предназначен для работы с объектами, составляющими сцену, логично иметь возможность работы с именами этих объектов и, соответственно, иметь литералы, обозначающие имена объектов. Для этого записывается имя объекта, то самое, которое появляется в списке при выборе объекта в 3ds max, а к нему слева приписывается знак $. Например

$box01

Поскольку объекты часто объединяются в иерархии, для их обозначения применяются такие литералы

$man/torso/hand

то есть данным литералом поименован объект hand, который является дочерним по отношению к объекту torso, который в свою очередь происходит от объекта man.

С помощью литералов имен объектов можно выбрать и целую группу объектов с похожими именами. Для этого используются символы * и?. Например литерал

$box*

обозначает все объекты, имена которых начинаются с box. При этом звездочку можно ставить не только в конце, но и в любом месте литерала и даже в нескольких местах. Например, такая строка

$*box*

именует все объекты, в имени которых сочетание букв box находится в любом месте имени. Очень удобно использовать символ * при работе с иерархиями объектов. Например, литерал

$man/*

выберет всех прямых потомков объекта man.

Если Вам надо выбрать не только прямых, но всех прочих потомков какого-либо объекта на всех уровнях иерархии, то для этого используют такую запись

$man/…/*

или, что то же самое

$man…*

При этом если надо найти всех потомков, чьи имена начинаются, например, на букву h, то можно написать

$man…h*

Разница между символами * и? следующая. Если символ * заменяет любую группу символов, то? любой одиночный символ. Представим себе сцену, в которой содержатся три объекта: box1, box2 и box16. В этом случае скрипт

hide box*

скроет все объекты сцены, а

hide box?

только box1 и box2.

кроме того, существует и один специальный литерал - $. Он означает все выбранные объекты сцены. Например

hide $

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

hide selection

выполнит ту же самую работу аккуратнее.

В именах объектов могут использоваться пробелы или специальные символы. В таком случае для написания подобных имен, как и для имен переменных, используются одинарные кавычки. Например

$’Snow man’

При этом в число символов, защищаемых кавычками, не входят * и?. Поэтому если Вы хотите именовать объекты, в имени которых содержатся эти символы, используйте обратный слеш. Например, имя объекта konjak*** запишется так

$’konjak\*\*\*’

Символ пробела, защищаемый кавычками, может быть заменен символом подчеркивания “_”. Например, приведенные ниже литералы обозначают имя одного и того же объекта

$’Snow Man’

$Snow_Man

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: