Объектно-ориентированное программирование

Введение

Для написания сценариев нужно, прежде всего, иметь ясное представление о структуре класса, используемой в MAXScript. Вместо того чтобы обучать каждой команде, необходимой для написания сценария, в этой главе показано, как следует работать со структурой класса в MAXScript для поиска необходимой информации в справочном руководстве по MAXScript. Многие команды, представленные в этой главе, уже знакомы вам из материала предыдущих глав.

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

Справочное руководство по MAXScript (MAXScript Reference Help), входящее в состав 3dsMax, периодически обновляется. Поэтому загрузите последнюю его версию с Web-сайта компании Autodesk, прежде чем приступать к изучению ма­териала этой главы.

Для этого обратитесь по адресу www.autodesk.com на Web-сайт компании Autodesk и выберите в крупном заголовке вариант Media & Entertainment (Муль­тимедиа и развлечения). Далее выберите вариант Training (Обучение) в левом боковом поле открывшейся страницы, а затем вариант Autodesk 3dsMax из раскрывающегося списка. На следующей странице выберите вариант Documentation, Online Tutorials, Sample Files (Документация, диалоговые учебные пособия, файлы примеров). В нижней части открывшейся страницы появится ссылка MAXScript8 Help.

Если вы не можете получить этот файл, воспользуйтесь справочным руководством по MAXScript, которое предоставляется на прилагаемом к этой книге CD-ROM в файле maxscript.chm. Вы можете просматривать это руководство непосредственно на CD-ROM или же переписать его в папку 3dsmax8\help на жестком диске своего компьютера, заменив существующую его версию.

В MAXScript используется метод, называемый объектно-ориентированным программированием (ООП). Термином "объект" описываются не только объекты, находящиеся на сцене 3dsMax. В MAXScript под объектом понимается любой


Объекты и классы

элемент, которым можно манипулировать, в том числе геометрическая форма, мо­дификатор, контроллер, цвет и числовое значение.

Объект можно рассматривать в качестве контейнера для хранения информации. Хранящаяся в объекте информация меняется в зависимости от типа объекта. Рас­смотрим, например, сферу, находящуюся на сцене. В MAXScript сферический объект не является собственно трехмерной сферой. Его следует, скорее, рассматривать в качестве виртуального контейнера, обозначенного как сфера, для хранения наименования, радиуса, положения, ориентации и другой информации о трехмерной сфере. Именно с этим контейнером и приходится работать в MAXScript.

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

В MAXScript объекты могут служить контейнерами для хранения следующей информации.

• Любого объекта, создаваемого на панели Create, включая параллелепипед, окружность, свободно направленный прожекторный источник света, фиктивный объект или пространственный исказитель силы тяжести.

• Материалов, в том числе стандартных (Standard), смешанных (Blend), двухсторонних (Double Sided). Такой объект содержит всю информацию о картах и параметрах материала.

• Ограничений и контроллеров, например ограничений по линии пути (PathConstraint) или контроллера управления по списку (Rotation List Controller).

Такой объект содержит все параметрические данные контроллера.

• Эффектов визуализации, включая размытость движения и зернистость пленки. Такой объект содержит все параметрические эффекты.

• Цветов.

• Числовых типов данных, включая целые числа, числа с плавающей точкой и данные типа Point 3. Такой тип объекта обычно является переменной. Например, в строке кода x = 3 значение 3 присваивается переменной x. В данном случае переменная x представляет собой объект.

• Строк.

• Значений true и false (т.е. логических типов данных).

• Массивов и совокупностей.

• Элементов пользовательского интерфейса, в том числе флажков, кнопок и счетчиков.

Для простоты все эти элементы здесь и далее называются объектами, а объек­ты 3dsMax — объектами сцены.

Объект содержит не только свойства, но и методы. В этом и состоит фундамен­тальное отличие ООП от традиционного, процедурного программирования.


Глава 4

Истинный потенциал ООП кроется именно в таком объединении свойств (данных) и методов (функций) в объект.

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

Иерархия классов

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

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

Value

MAXWrapper

Node

GeometryClass

Box

Capsule

ChamferBox

Эти три геометрических объекта выбраны потому, что они указаны первыми в алфавитном порядке и служат удобным основанием для исследования особого назначения иерархии классов.

Ниже классов Box, Capsule и ChamferBox отсутствуют другие классы. Эти классы находятся в самом низу иерархии и представляют собой классы объектов, из которых можно создавать объекты в MAXScript. Иными словами, класс геометрического объекта (GeometryClass) не существует, но в то же время имеются объекты класса Box, Capsule и ChamferBox.

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

Примечание. Такие имена классов, как MAXWrapper и Node, не имеют какого-то особого значения. Это просто имена, которые разработчики MAXScript придумали для классов.

В следующем упражнении вам предстоит воспользоваться справочным руко­водством по MAXScript, чтобы посмотреть, каким образом классы организованы в MAXScript.

1. Откройте справочное руководство по MAXScript одним из следующих

способов.

• Выберите команду Help ⇨ MAXScriptReference из главного меню 3dsMax.

• Откройте файл maxscript.chm из папки help на прилагаемом к этой книге CD-ROM.

• Откройте файл maxscript.chm из папки 3dsmax8\help на жестком диске своего компьютера.


Объекты и классы

Справочное руководство по MAXScript состоит из оперативно доступных "книг". Каждая такая книга помечена знаком "плюс" и пиктограммой книги в подокне Contents (Содержание) программы просмотра справки. Для перехода к отдельным разделам книги необходимо открыть ее.

2. Перейдите к книге MAXScript Language Reference ⇨ 3dsMax Objects ⇨ Node: MAXWrapper ⇨ Node Subclasses (Справочник по языку MAXScript ⇨ Объекты 3dsMax ⇨ Класс Node: MAXWrapper ⇨ Подклассы класса Node).

 

 

 

Книга Node Subclasses состоит из отдельных книг по подклассам, расположенным ниже класса Node. Их имена должны быть вам знакомы, поскольку они обозначают объекты сцены, которые вы можете создавать на панели Create в 3dsMax.

Раскройте книгу GeometryClass: Node.

Название этой книги указывает на то, что класс GeometryClass находится в иерархии непосредственно под классом Node.

3. Откройте раздел "GeometryClass: Node."

В этом разделе приведены все подклассы, расположенные ниже класса GeometryClass.

4. Откройте раздел "Geometry — Standard and Extended Objects" (Геометрия — стандартные и расширенные примитивы).

5. Щелкните на ссылке Box, чтобы открыть раздел "Box: GeometryClass".

В этом разделе приведены конструктор и свойства класса объектов парал­лелепипедов. Более подробно все эти термины рассматриваются в последующих разделах данной главы.


Глава 4

Наследование классов

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

В MAXScript у класса Node имеются определенные свойства, которые наследует класс GeometryClass. Эти же свойства, в свою очередь, наследуют классы Box, Capsule и ChamferBox.

Для изучения свойств узла выполните следующее упражнение.

1. Откройте раздел Node: MAXWrapper ⇨ Node Common Properties, Operators, and Methods ⇨ General Node Properties (Node: MAXWrapper ⇨ Общие свойства, операторы и методы ⇨ Общие свойства узла) справочного руководства по MAXScript. Первый листинг в этом разделе выглядит следующим образом: <node>.name

В этом листинге указано имя свойства (name), доступное для всех объектов класса Node, включая все геометрические объекты, формы, источники света, вспомогательные объекты и пространственные исказители.

Кроме того, в данном листинге приведено правило, указывающее, как пользоваться данным свойством в MAXScript. О том, как истолковываются правила, речь пойдет далее в этой главе. А пока что достаточно сказать, что <node> означает любой класс объектов, стоящий ниже класса Node.

Итак, рассмотрим свойства параллелепипеда, который будет создан в сцене.

2. Введите в окне приемника команд следующий фрагмент кода:

b = box()

b.name

Вторая строка этого фрагмента кода возвращает имя параллелепипеда. Это свойство можно использовать для изменения имени параллелепипеда.

3. Введите следующую строку кода:

b.name = "Newbox"

В этой строке параллелепипед получает новое имя Newbox.

4. Перейдите в разделе "General Node Properties" справочного руководства к заголовку "Viewport Related Properties" (Свойства, связанные с видовыми окнами), прокрутив текст вниз почти наполовину. В этом разделе описываются некоторые уже знакомые вам свойства:

<node>.isSelected

<node>.isHidden

Эти свойства имеют логические значения (true или false), которые указывают, выделен объект или скрыт.

Они знакомы вам как параметры, которые вы устанавливаете в диалоговом окне Object Properties (Свойства объекта). Многие, хотя и не все, свойства объектов класса Node соответствуют свойствам объектов 3dsMax.


Объекты и классы

5. Введите в окне приемника команд следующую строку кода:

b.isSelected = true

В этой строке установлено логическое значение true свойства .isSelected. Таким образом, параллелепипед выделяется, а в приемнике команд возвращается логическое значение true.

6. Введите следующую строку кода: b.isHidden = true

Теперь параллелепипед скрыт. Опробуйте те же самые свойства на объекте другого типа.

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

7. Введите следующий фрагмент кода:

c = capsule()

c.isSelected = true

В этом коде создается, а затем выделяется капсула.

Эти свойства класса Node являются общими и для всех остальных классов, стоящих ниже него в иерархии.

Наследование классов составляет саму суть объектно-ориентированного программирования. Благодаря этому свойства и прочие данные становятся в MAXScript общими для классов.

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

Определение типов классов

В MAXScript предоставляются средства высокого уровня для отображения информации о классах объектов, доступных в 3dsMax. В этом разделе рассматри­ваются два метода определения класса и суперкласса, к которому относится любое значение MAXScript. В программировании на C++ или C это называется опреде­лением типов во время выполнения (RTTI — Run Time Type Identification).

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

Для поиска класса и суперкласса отдельного объекта выполните следующее упражнение.

1. Введите в приемнике команд следующую строку кода: classOf c

Объект c принадлежит классу Capsule, поэтому данная строка кода возвращает класс Capsule.


Глава 4

2. Для поиска класса, которому принадлежит данный класс, воспользуйтесь методом classOf, указав имя самого класса:

ClassOf Capsule

Эта строка кода возвращает класс GeometryClass, стоящий в иерархии непосредственно над классом Capsule.

3. Для поиска следующего вверх по иерархии класса воспользуйтесь методом superClassof:

superClassOf Capsule

Эта строка кода возвращает класс Node.

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

Ниже приведен краткий сценарий, демонстрирующий применение запросов классов при определении пользовательского интерфейса в сценарии:

 

If ((spherePath != undefined) and (spherePath.isDisplayed == true)) do (destroyDialog spherePath)

rollout spherePath "Sphere and Path"

(

pickbutton pick_sphere "Click to Pick Sphere"

pickbutton pick_path "Click to Pick Path"

on pick_sphere picked sphObject do

(

if classOf sphObject != sphere then \

messagebox "Please pick a sphere."

)

on pick_path picked pathObject do

(

if classOf pathObject != line and classOf pathObject != SplineShape

then messagebox "Path must be a line or editable spline."

)

)

createDialog spherePath

 

Дополнительные сведения по данному вопросу приведены в следующих разделах справочного руководства по MAXScript.

• MAXScript Language Reference ⇨ Values ⇨ Working with Values (Справочник по языку MAXScript ⇨ Значения ⇨ Работа со значениями)

• MAXScript Language Reference ⇨ 3dsMax Objects ⇨ ldentifying and Accessing MAXScript Classes and Properties (Справочник по языку MAXScript Объекты 3dsMax ⇨ Определение и доступ к классам MAXScript и их свойствам)


Объекты и классы