Переменные и присвоение им значений




С чего начать

MAXScript - язык программирования, предназначенный, главным образом, для реализации потребностей, которые возникли у пользователя, но которых пока нет в текущей версии 3D Studio Max, или они есть, но реализованы не так, как хотелось бы. Самые простые знания и навыки в работе с ним можно получить, работая с окном интерпретатора MAXScript (MAXScript Listener). Для этого в главном меню 3ds max выберем пункт “MAXScript”, а в появившемся меню – пункт “MAXScript Listener … F11”

На экране появится примерно такое окно

это и есть интерпретатор. Если в нем набрать любую конструкцию языка и нажать клавишу Enter, то она (конструкция, конечно, а не клавиша) немедленно выполнится, а результат ее выполнения выведется в это же окно, но синим цветом. Доступ к окну интерпретатора можно получить так же, выбрав закладку Utilites и нажав в ней кнопку MAXScript. Откроется свиток,

в котором надо нажать кнопку Open Listener.

Однако работать с окном интерпретатора довольно неудобно. Если Ваша программа состоит из большого числа строк, то в ней не мудрено допустить ошибку, а для ее исправления надо снова вводить всю программу. Кроме того, придумав прекрасную программу, Вы, наверное, захотите воспользоваться ей неоднократно. Глупо было бы записывать ее на бумажку и при надобности вводить ее каждый раз заново. Разумеется, MAXScript имеет средства для сохранения и загрузки программ. Более того, с его помощью можно дорабатывать пользовательский интерфейс 3ds max, но об этом далее. Пока воспользуемся меню окна интерпретатора. Выберем пункт File, а в открывшемся меню пункт New Script

(по сложившейся традиции, программа на MAXScript называется скрипт). Появится окно, напоминающее текстовый редактор Notepad.

В нем можно набрать любой сложности скрипт, и сохранить его в файл. Традиционное расширение для файлов, содержащих скрипты – ms. В меню File редактора скриптов, кроме обычных New, Open, Close, Save и Save As, есть пункт “Evaluate All Ctrl-E”.

Выбрав его, Вы выполните скрипт, содержащийся в редакторе.

Нетрудно догадаться, что пункты Open Script и Run Script из меню File окна интерпретатора, служат для того, чтобы открыть имеющийся скрипт или выполнить его.

Впрочем, если хотите, можно набирать текст скрипта например в Notepad или подобном редакторе. Этих средств программирования вполне хватит для написания скриптов любой сложности.

Как и всякий язык, MAXScript имеет свою грамматику, которую и начнем изучать с операции присвоения значений переменным.

 

Переменные и присвоение им значений

Оператор присваивания в MaxScript имеет примерно такой вид:

x = 145.2

Все просто. Слева имя переменной, справа то значение, которое ей присваивается. Разумеется, в качестве значения может выступать не только действительное число, но и любое, принятое в MAXScript, значение. Например, точка в трехмерном или двумерном пространстве, объект (сфера, параллелепипед, пирамида и т.д.) и прочее, на чем подробно остановимся далее. Кроме того, справа может быть имя другой переменной, или выражение, составленное из переменных, констант, и прочее. Например:

x = y

z = (2.0 * x + c) / 2.5

Можно ставить несколько операторов присваивания подряд

x = y = z = 3.62

Слева от знака присваивания может быть не просто переменная, а элемент массива, например, так:

x[21] = 3.14 * R

Или свойство объекта, вот так:

box.height = box.width

О массивах и свойствах поговорим подробно потом, а теперь остановимся на областях видимости.

 

Области видимости

Дело в том, что любая переменная может быть объявлена глобальной или локальной. Значения локальных доступны только на определенном участке программы, глобальных – везде. Рассмотрим пример. Создайте и выполните такой скрипт.

(

k = 10

)

print k

Круглые скобки как раз и означают начало и конец некоторого участка, далее называемого областью видимости. Все переменные, объявленные в этом участке, считаются локальным, если прямо не указано обратное. На первый взгляд все кажется просто. Переменной присваивается число, в данном случае 10, затем это значение выводится на экран. Не то на самом деле. Поскольку первый раз переменная встречается внутри области видимости, то внутри нее она получает значение 10. После выхода из этой области значение k теряется и в операторе print k участвует уже другая переменная – глобальная, так как все переменные, объявленные или в первый раз встретившиеся вне какой-либо области видимости, считаются глобальными. Объявить локальную переменную вне области видимости просто не удастся, получите сообщение об ошибке. Но вернемся к нашему примеру. Результатом работы оператора вывода print k будет вывод на экран сообщения

undefined

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

k = 10

Теперь, после предыдущего выполнения этого скрипта будет считаться, что k – глобальная переменная, поскольку она была упомянута вне областей видимости. Ей и присвоится значение 10 и при выводе print k на экран выйдет сообщение

Отсюда правило: с переменными надо быть крайне осторожным. Все глобальные переменные лучше всего объявлять в начале скрипта. Делается это, например, так:

global k

(--Начало области видимости

k = 10

) --Конец области видимости

print k

Вот теперь все правильно. Если Вам все же нужно, чтобы внутри области видимости переменная k была локальной, то напишите так:

global k

(local k --Начало области видимости

k = 10

) --Конец области видимости

print k

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

global k

(local k --Начало первой области видимости

k = 10

(--Начало второй области видимости

print k

) --Конец второй области видимости

) --Конец первой области видимости

print k

В этом случае мы имеем дело с двумя переменными k, во второй области видимости, вложенной в первую, используется та же самая k, что и в первой.

Круглые скобки – не единственный способ начать новую область видимости. Кроме них новая область начинается

  • С началом новой функции.
  • С началом цикла for.
  • С началом определения утилиты, свитка, контекстного меню, Macro Script-а или инструмента (tool).
  • С началом обработчика событий утилиты, свитка, контекстного меню, Macro Script-а или инструмента (tool).
  • С началом when

Небольшое исключение. Переменная, управляющая циклом for локальна внутри него всегда. В скрипте

(local i = 50

(for i = 1 to 5 do print i

)

print i

)

две переменных i, а не одна, первая объявлена локальной в первой области видимости, другая управляет циклом. В этом нетрудно убедится, выполнив приведенный скрипт.

 

Настойчивые переменные

Именно так “настойчивый”, переводится с английского слово persistent. Более подробный словарь дает, правда, перевод “постоянный”, но “постоянные переменные” звучит диковато. Настойчивость их заключается в том, что глобальные переменные, объявленные со словом persistent, запоминаются при сохранении сцены в файл и восстанавливаются при открытии этого файла. Впрочем, отделаться от этих настырных объектов не трудно, достаточно выполнить скрипт

persistents.remove <имя переменной>

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

persistents.removeAll()

Если же Вас интересует список всех настойчивых переменных, то к Вашим услугам функция

persistents.show()

Разберем такой скрипт

persistents.removeAll()

persistent global a=10,b=20,c=30

persistents.show()

persistents.remove #a

persistents.show()

persistents.removeAll()

persistents.show()

print a

print b

print c

Первый оператор удаляет все ранее созданные настойчивые переменные. Второй объявляет таковыми три переменных – a, b и c. Третий выводит список всех настойчивых переменных, в нем должно быть три упомянутых элемента. Четвертый оператор удаляет из списка переменную a. Знак # перед именем переменной не случаен, без него ничего не получится. Что он означает, разберем позднее, когда речь пойдет об именах переменных. Далее снова выводится список настойчивых переменных, чтобы убедиться, что a в нем отсутствует. Затем удаляем из списка настойчивых все переменные, и убеждаемся, что этот список пуст. После этого на экран выводятся все переменные, чтобы убедится, что их значения остались в целости и сохранности.

У настойчивых переменных есть одна тонкость. Рассмотрим следующий скрипт.

persistent global b,sm

b = box()

sm = standard()

Вкратце он делает следующее – создает коробочку b и стандартный материал sm. Теперь выполним его и сохраним сцену. После того, как мы перезапустили 3ds max и загрузили сохраненную сцену, то по свойствам настойчивых переменных логично было бы ожидать, что значения b и sm сохранились, но это не совсем так. Сохранилось значение только b, а sm будет иметь значение undefined. Слегка дополним скрипт

persistent global b,sm

b = box()

sm = standard()

b.material = sm

Вот теперь все будет работать правильно. Вся разница в последней строке, где материал sm применяется к коробочке b. Иными словами, если настойчивая переменная содержит объект 3ds max, но этот объект не содержится непосредственно в сцене, то значение такой переменной не сохраняется и, соответственно, не восстанавливается. В первом случае переменная sm содержала материал, который не использовался ни одним объектом сцены, ее значение и не сохранилось. Во втором случае этот материал использовался коробочкой b, и результат не замедлил проявиться.

 



Поделиться:




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

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


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