MAXScript

Материал из Энциклопедия о программировании
Перейти к: навигация, поиск

Шаблон:Карточка языка программирования MAXScript (Макс скрипт) — встроенный скриптовый язык для пакета трёхмерного моделирования Autodesk 3ds Max, предназначенный для автоматизации рутинных задач, оптимизации использования существующего функционала, создания новых инструментов редактирования и пользовательского интерфейса. Через скриптовый API позволяет контролировать и модифицировать объекты трёхмерной сцены: геометрию, текстуры, анимацию и другое. Возможно создание различных плагинов и утилит для ускорения выполнения специфических задач. Инструменты Autodesk 3ds Max используют MAXScript во множестве функций, включая оригинальные утилиты и элементы интерфейса.

Целевая аудитория и простота использования

Язык предназначен для широкого круга пользователей — начиная от художников-моделеров, заканчивая техническими директорами и программистами. Он предоставляет достаточно вольный синтаксис больше схожий с языком BASIC, чем с C++ или командной оболочкой UNIX (как в случае с Maya MEL script). Внутренняя структура имеет много общего с языком LISP и основывается на выражениях. Созданная с помощью MAXScript новая пользовательская функция легко интегрируется в 3ds Max и затем может быть использована как и любое другое встроенное по умолчанию средство. Язык рассчитан на обычного пользователя и по замыслу создателей для его использования не нужно иметь большой опыт программирования на каком-либо из распространенных языков программирования.

Инструменты

В программе 3ds Max имеется набор инструментов для работы с MAXScript.

MacroRecorder — очень полезная штука, которая записывает все действия и отображает их в виде команд в редакторе MAXScript. В новых версиях программы 3ds Max MacroRecorder по-умолчанию выключен и его надо включать. Сделать это можно через главное меню: Menu — MAXScript — MacroRecorder, или же через меню окна MAXScript Listener: Menu — MacroRecorder — Enable.

IDEs

В 3ds Max имеется встроенная IDE для языка MAXScript — MAXScript Listener. В MAXScript Listener есть как редактор кода, так и консоль вывода. Причём писать код можно в любом из окон.

В MAXScript Listener скрипты на MAXScript выполняются построчно один раз на строку. Выполнение каждой строки можно инициировать сколько угодно раз нажатием клавиши Enter.

Горячие клавиши MAXScript Listener

  • Enter — выполнение текущей строки кода
  • Shift + Enter — пакетное выполнение нескольких выделенных строк

Oсобенности синтаксиса

  • Вектора задаются квадратными скобками так: someVector = [5,10,20]
  • Строки задаются к кавычках так: someString = «string value»

Комментарии

Комментарии выделяются символами «--» (двойное тире) в начале строки. Блоковые комментарии выделяются используя C-подобный синтаксис:

-- ваш обычный комментарий
/* ваш блоковый комментарий */

Регистронезависимость и строковые переменные

Язык не чувствителен к регистру символов. Единственное исключение лишь сравнение строковых переменных. Предоставлен также специальный тип переменных name, которые чувствительны к регистру и обычно используются как перечисляемый тип для передачи в функции вместо строк. Для декларирования подобной переменной используется символ #. Также присутствует встроенная функция matchPattern, которая позволяет сравнивать строки с учётом и без учёта регистра:

 "HELLO" == "hello"
  -->false
  "HELLO" as name == "hello" as name --конвертирует в тип name
  -->true
  #HELLO == #hello  --# декларирует переменную типа name
  -->true
  matchPattern "HELLO" pattern:"hello"
  -->true
  matchPattern "HELLO" pattern:"hello" ignorecase:false
  -->false

Операторы

  • $ — grabbed object from scene by name. Scene object variable.
  • = — value assignment for variable

Инструкции

Инструкции не нужно заканчивать точкой с запятой (;). Это необходимо делать лишь в случае, когда они находятся на одной строке:

      a = 10
      print a
      --запись аналогична следующей:
      a = 10;
      print a;
      --которая аналогична идущей ниже:
      a = 10; print a;

Декларирование переменных

Переменные не требуют явного декларирования типа или присваивания значения. Неинициализированные переменные всегда возвращают специальное значение undefined, которое эквивалентно NULL. Тип переменной зависит от значения, которое она хранит, и может меняться динамически:

      a = 10 -- тип переменной а - целое число
      a = "b" -- тип переменной а стал строкой

Организация кода

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

Массивы

Массивы обозначаются с использованием синтаксиса #() и не имеют строго типа членов — один и тот же массив может содержать элементы любого типа, включая другие массивы. Индексация массивов начинается с единицы (1).

Битовые массивы

Фигурные скобки используются только как часть декларирования битового массива (bitArray) следующим образом #{}. Битовые массивы — сжатые списки, которые содержат только флаги (ложь или истина) и используются для хранения состояния выделенных элементов, такие как точки вершин или треугольники трёхмерного объекта.

Доступ по индексу

Квадратные скобки используются для индексированного или именного доступа к частям объектов или элементов массивов:

       aBox = box() -- создаём куб
       --> $Box:Box01 @ [0.000000,0.000000,0.000000]
       aBox[3] -- получаем третью анимационную дорожку
       --> SubAnim:Transform
       aBox[#Transform] --получаем эту же анимационную дорожку используя доступ по имени
       --> SubAnim:Transform
       aBox[3][1] -- получаем первый элемент из дорожки трансформации
       --> SubAnim:Position
       aBox[3][1][2] --получаем второй элемент из дорожки позиции
       --> SubAnim:Y_Position
       someArray = #(1,2,5,6,"Hello") -- декларируем массив
       --> #(1,2,5,6,"Hello") 
       someArray[4] --получаем 4-й элемент
       --> 6
       someArray[5] --получаем 5-й элемент
       --> "Hello"
       someArray[6] --получаем 6-й элемент - он не существует
       --> undefined

Доступ к объектам сцены

Ноды сцены (объекты сцены) могут быть доступны используя префикс $ в начале имени. Для примера, $Box01 вернёт объект с именем Box01. Этот же синтаксис может быть использован для доступа к нескольким объектам со схожими именами используя *. Для примера, $Box* вернёт список всех объектов имена которых начинаются с Box, такие как «Box01», «Box02», «Boxer» и так далее.

Доступ к свойствам объектов

Свойства доступны с использованием точки в конце переменной, по аналогии с другими известными языками (Объект. ИмяСвойства), или через вызовы GetProperty/SetProperty функций. Для получения списка доступных свойств надо использовать метод showProperties (или более краткая запись show). Скажем, для получения свойств объекта Box01 нужно сделать следующее:

      showProperties $Box01
      --или более короткая запись:
      show $Box01
      -- чтобы получить список всех свойств в качестве имён:
      theProperties = getPropNames $Box01

Ссылки