Лучших работников в сфере IT РАБОТА-КА Вам поможет найти! о нас ✈
Я ищу работу в IT сфере ✈ Я ищу резюме в IT сфере ✈
Инженер схемотехник! 80000-100000 руб. ТК. соц.пак. Подробнее ✈

Трехмерное моделирование с использованием SketchUp и Eclipse: Часть 2. Программирование на языке сценариев SketchUp

Программирование на языке сценариев SketchUp: В этой статье описана совокупность основных классов, используемых в сценариях SketchUp, а также приводятся примеры их использования. При помощи этих классов можно построить любую трехмерную (далее — 3-D) фигуру, состоящую из отрезков и граней.
Первая статья  серии рассказывает о том, как настроить среду Eclipse для создания, редактирования и выполнения сценариев SketchUp. В ней приводится пример сценария, но не дается ответ на главный вопрос: как работает код внутри сценариев? Цель данной статьи — дать ответ на этот вопрос путем обсуждения SketchUp API. SketchUp API содержит классы, чьи методы рисуют и изменяют аспекты SketchUp-проекта, в том числе линии, поверхности, цвета и изображения. Эта статья не может охватить весь API, поэтому я остановлюсь на основных классах, необходимых для построения фигур SketchUp. Но сначала, поскольку SketchUp API основан на Ruby, я сделаю обзор языка Ruby и опишу, как он работает.

Часто используемые сокращения

  • API: Application programming interface (интерфейс программирования приложений)
  • DHTML: Dynamic Hypertext Markup Language (динамический язык разметки гипертекста)
  • UI: User interface (пользовательский интерфейс)
Учитывая популярность языка программирования Java™ и упоминание Eclipse в названии статьи, я полагаю, что вы знакомы с Java. Ruby далеко не так популярен, поэтому я кратко объясню некоторые их сходства и различия. Я надеюсь, что после этого вы будете чувствовать себя с этим языком достаточно комфортно и сможете попробовать его и написать несколько элементарных команд.
Анализ:
  • Как и язык Java, Ruby является объектно-ориентированным языком. Фактически все в Ruby является подклассом класса Object. В нем нет примитивов, как, например, intfloat и boolean в языке Java.
  • В Ruby не нужно объявлять типы переменных, так что вы можете присвоить х значение 5 в одной команде, и затем значение "Hello world!" - в следующей.
  • Методы Ruby вызываются с использованием той же точечной нотации, что и в программировании на Java, но скобки (()) и точки с запятой (;) необязательны. Каждый класс Ruby имеет метод конструктор класса, именуемыйnew.
  • Объекты String в Ruby могут быть заключены в двойные (") или одинарные (') кавычки; разница в том, что в объектах String, заключенных в двойные кавычки, интерпретатор распознает escape-последовательности (\n\tи т.д.). Ruby допускает односимвольные объекты String, но у него нет отдельной структуры данных для символьных (char) объектов.
  • Однострочные комментарии начинаются со знака фунта (#). Многострочные комментарии ограничиваются при помощи =begin и =end.
  • Классы Ruby выполняют те же функции, что и классы Java, но в дополнение к классам Ruby поддерживает еще имодули. Модуль Ruby похож на класс Java, который содержит только статические методы. Экземпляр модуля Ruby создать невозможно; это просто набор процедур в отдельном пространстве имен.
  • Наиболее распространенными методами вывода текста являются puts, который добавляет знак новой строки в конец вывода, и print, который его не добавляет.
Памятуя об этих правилах, можно начинать эксперименты с кодом Ruby. В SketchUp нажмите Window > Ruby Console. Затем попробуйте выполнить любую (или все) из следующих команд:
  • 2 * (5 + 5) / 4 * 1.0
  • 6.class
  • print 'Hello world'; puts '!'
  • m = Time.new; m.month
  • x = [4, true, 'hi there!']
  • puts x[2].to_s + " is a " + x[2].class.to_s
В последней команде метод to_s класса Object Ruby выполняет ту же функцию, что и метод ToString () классаObject Java: он возвращает String, представляющий Object. На рисунке 1 показана консоль программы SketchUp (Ruby Console) с результатами выполнения этих команд.

Рисунок 1. Вывод в Ruby Console
Рисунок 1. Вывод в Ruby Console 

Эти команды могут показаться простыми, но Ruby предоставляет возможности, совсем не похожие на то, что можно увидеть в языках Java, C или C++. К таким уникальным возможностям можно отнести блоки итераторов, параллельное присваивание и диковинки наподобие класса Range. Но если говорить о SketchUp API, можно продвинуться очень далеко, имея лишь общее представление о языке. Этот API подробно рассматривается в следующем разделе.
SketchUp API
В первой статье серии приводится пример сценария SketchUp и рассказывается, как его выполнить, используя командуload SketchUp и приложение SketchUp Bridge. Но в этой статье не объясняется, как работает сценарий. Команды сценария являются частью SketchUp API — предмета этого раздела. Сначала я представляю фундаментальные структуры данных SketchUp (Sketchup и Model), а затем объясню, как создать объекты Edge (ребро) и Face (грань). После этого я объясню два метода экструзии (pushpull и followme) и закончу описанием применения к объектам материалов (materials) SketchUp.
Каждый модуль Ruby представляет собой коллекцию методов; модуль Sketchup является наиболее важным модулем в SketchUp API. Его методы предоставляют информацию, связанную с полной установкой SketchUp. Пять из них перечислены ниже:
  • os_language — возвращает название операционной системы, на которой работает SketchUp.
  • locale — возвращает код языка для текущей локали.
  • find_support_files — возвращает путь к файлам каталога верхнего уровня SketchUp.
  • version_number — возвращает версию SketchUp.
  • active_model — возвращает объект Model, представляющий текущий проект.
Аналогично статическому методу в языке Java, для вызова метода модуля Ruby необходимо указать имя модуля с точкой и именем метода. Например, чтобы найти версию приложения SketchUp, можно в Ruby Console ввести следующую команду: Sketchup.version_number.
Из всех методов модуля Sketchup самым важным является метод active_model. Он возвращает объект Model, который содержит всю информацию текущего проекта SketchUp. Каждый проект имеет один объект Model, и каждый объектModel воплощает один проект. Говоря "всю информацию", я имею в виду, что объект Model хранит расположение каждой вершины, цвет каждой фигуры, стили, доступные для проекта, и многое другое. Model хранит информацию в последовательности объектов-контейнеров, которые включают в себя следующие компоненты:
  • Entities — все фигуры в текущем проекте.
  • Materials — цвета и текстуры.
  • Layers — графические слои проекта.
  • Styles — настройки внешнего вида проекта.
Вообще говоря, целью сценария SketchUp является изменение данных в объектах-контейнерах. Для этого вызовите соответствующий метод в классе Model. Эти методы легко запомнить: метод layers возвращает объект Layers, методstyles возвращает объект Styles, метод entities возвращает объект Entities и т.д. Например, следующий код извлекает контейнер Entities текущего объекта Model:
model = Sketchup.active_model
ents = model.entities

Можно объединить их в одну команду:
ents = Sketchup.active_model.entities

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

Рисунок 2. Иерархия класса Entity
Рисунок 2. Иерархия класса Entity 

Наиболее важными объектами Entity являются Edge и Face, которые служат строительными блоками любой фигуры в проекте SketchUp. Edge - это отрезок, а объекты Edge добавляются в проект посредством метода add_line классаEntities. Этот метод принимает два трехэлементных массива, в которых содержатся начальная и конечная точки объекта Edge. Например, чтобы создать отрезок из точки [0, 0, 0] в точку [5, 5, 5], можно использовать следующий код:
ents = Sketchup.active_model.entities
edge = ents.add_line [0,0,0], [5, 5, 5]

Когда выполняется вторая команда, SketchUp в окне проекта автоматически рисует линию, соответствующую объектуEdge. Свойства линии можно читать и изменять, вызывая методы класса Edge. Например, метод length возвращает длину линии от ее начальной точки до конечной. Существуют также методы, изменяющие внешний вид линии, например,smooth и hidden.
Как следует из названия, объект Face (грань) отображает двумерную (далее — 2-D) поверхность. Метод add_face классаEntities рисует поверхность в окне проекта и возвращает объект Face. Этот метод принимает набор точек или объектовEdge. Например, приведенный далее код создает два объекта Face — один в плоскости х-у, а другой в плоскости y-z. Оба объекта Face имеют по четыре вершины, но вы можете создать Face с любым количеством точек.
ents = Sketchup.active_model.entities
# Создание грани из точек
face1 = ents.add_face [0,0,0], [3,0,0], [3,3,0], [0,3,0]
# Создание грани из ребер
edge1 = ents.add_line [0,0,0], [0,3,0]
edge2 = ents.add_line [0,3,0], [0,3,3]
edge3 = ents.add_line [0,3,3], [0,0,3]
edge4 = ents.add_line [0,0,3], [0,0,0]
face2 = ents.add_face [edge1, edge2, edge3, edge4]

Методы класса Face обращаются к свойствам соответствующей фигуры. Метод area возвращает площадь поверхности, метод edges возвращает массив объектов Edge, которые формируют грань, а метод normal возвращает вектор нормали поверхности, который задает направление, перпендикулярное поверхности. Например, face1.normal возвращает [0, 0, 1], потому что направление +z перпендикулярно плоскости х-у. Конечно, вектор [0, 0, -1] также перпендикулярен, и вы можете зеркально отразить нормальный вектор объекта Face, вызвав метод reverse!.
Процесс формирования 3-D фигуры из 2-D поверхности называется экструзией (вытягиванием). Класс Face содержит два метода, которые выполняют экструзию: pushpull и followme. Важно отметить, что в SketchUp нет отдельного класса для 3-D фигур. Вместо этого, в процессе экструзии, SketchUp создает объекты Edge и Face, которые формируют фигуру.
Метод pushpull проще в использовании и выполняет ту же операцию, что и инструмент pushpull в SketchUp. Т.е. он создает 3-D фигуру путем вытягивания по направлению вектора нормали объекта Face. Его единственный обязательный аргумент - расстояние, на которое должна быть выполнена экструзия. Это расстояние может быть отрицательным для экструзии в направлении, противоположном вектору нормали объекта Face. Например, в предыдущей статье мы формировали параллелепипед путем создания прямоугольного объекта Face и вызова метода pushpull с аргументом-9.
Второй метод экструзии - это followme, который служит той же цели, что и инструмент followme в SketchUp. В отличие отpushpull, который осуществляет экструзию только в одном направлении, followme делает это в любом направлении по вашему выбору. Например, если вы создали объект Face в виде круга, можно сформировать цилиндр путем вытягивания вдоль оси круга. Но вы также можете создать тор или сферу путем экструзии по круговой траектории. Чтобы установить траекторию экструзии, необходимо определить объект Edge или массив объектов Edge. Это продемонстрировано в листинге 1, который создает треугольную грань и вытягивает ее по прямоугольной траектории (также см. раздел Загрузка).

Листинг 1. Экструзия при помощи метода followme
# Обращение к объекту Entities
model = Sketchup.active_model
ents = model.entities

# Создание треугольной грани
triangle = ents.add_face [1, 0, 0], [0, 1, 0], [0, -1, 0]

# Создание траектории экструзии
path = ents.add_edges [0, 0, 0], [0, 0, 10], [0, -10, 10], 
   [0, -10, 0], [0, 0, 0]

# Вытягивание треугольника по прямоугольной траектории
triangle.followme path

Метод add_edges создает массив объектов Edge из последовательности точек. На рисунке 3а показаны треугольный объект Face и прямоугольная траектория. На рисунке 3b показан результат выполнения последней команды сценария (triangle.followme path), которая вытягивает треугольник по траектории.

Рисунок 3. Экструзия в SketchUp
Рисунок 3. Экструзия в SketchUp 

Обратите внимание, что траектория должна быть замкнутой, т.е. первая точка первого объекта Edge траектории должна иметь те же координаты, что и последняя точка последнего объекта Edge.
Теперь, когда вы знаете, как кодировать фигуры, вам предстоит узнать, как задавать их внешний вид. Это можно сделать путем создания объекта Material, его настройки и связывания с фигурой, например с объектом Edge или Face. Для объекта Material можно определить цвет, текстуру или то и другое. Чем более детализирован объект Material, тем более реалистичным и профессиональным будет выглядеть рисунок. SketchUp предоставляет ряд готовых материалов. Чтобы посмотреть, как они выглядят в SketchUp, выберите Window > Materials.
Так же как контейнер Entities модели содержит объекты Entity, контейнер Materials содержит объекты Material. Чтобы добавить в проект новый объект Material, необходимо вызвать метод add класса Materials. Этот метод принимает имя материала и возвращает новый объект Material. Например, следующий код обращается к контейнеруMaterials и создает объект Material под названием RedBrick:
mats = Sketchup.active_model.materials
rb_mat = mats.add "RedBrick"

После создания объекта Material вы можете обратиться к нему и настроить его свойства при помощи методов классаMaterial, в числе которых следующие:
  • color — устанавливает цвет объекта Material.
  • texture — определяет текстуру объекта Material.
  • materialType — возвращает число, которое определяет, имеет ли объект Material цвет (0), текстуру (1) или то и другое (2).
  • display_name — возвращает имя объекта Material.
В SketchUp есть специальный объект Color, но легче заменить его простым RGB-массивом, например [64, 128, 255]. Здесь первый элемент определяет интенсивность красного цвета, второй - интенсивность зеленого, а третий - интенсивность синего. Вместо чисел можно также указать названия цветов, например RedPlum или MintGreen. Чтобы просмотреть полный перечень названий цветов для X11, введите Sketchup::Color.names в консоли Ruby Console. Например, чтобы задать красный цвет объекту rb_mat, можно ввести любую из следующих команд:
rb_mat.color = [255, 0, 0]
rb_mat.color = "Red"

На языке 3-D графики текстура - это изображение, примененное к области проекта в качестве шаблона обоев: изображение повторяется или вырезается столько раз, сколько необходимо для покрытия поверхности. SketchUp предоставляет специальный объект Texture, но проще заменить его именем файла изображения. SketchUp может создавать текстуры из файлов JPG, PNG, PSD, TIF, TGA и BMP; следующая команда демонстрирует, как сделать изображение C:/scripts/tex.targa текстурой объекта Material под названием rb_mat.
rb_mat.texture = "C:/scripts/tex.targa"

После настройки цвета или текстуры объекта Material назначьте его фигуре (или нескольким фигурам) проекта. Сделать это просто: класс Drawingelement (подкласс Entity, суперкласс Edge и Face) предоставляет метод под названием material, который принимает объект Material и применяет к элементу цвет или текстуру объекта Material. Это показано в листинге 2, который создает объект Material с текстурой (C:/scripts/brick.jpg) и цветом (DodgerBlue). Путь к файлу изображения определяется в первой строке; сценарий не будет работать, если путь указан неправильно.

Листинг 2. Создание и применение материала
image_file_path = "C:/scripts/brick.jpg"

# Создать новый материал
mats = Sketchup.active_model.materials
brick_mat = mats.add "red_brick"

# Назначить цвет и текстуру
brick_mat.texture = image_file_path
brick_mat.color = "DodgerBlue"

# Нарисовать объект Face (грань) и установить его материал
ents = Sketchup.active_model.entities
face = ents.add_face [10, -10, 0], [10, 10, 0], 
   [-10, 10, 0], [-10, -10, 0]
face.reverse!
face.material = brick_mat

Обратите внимание, что цвет brick_mat определен после его текстуры, чтобы изменить цвет текстуры перед нанесением ее на поверхность. Хотя изображение brick.jpg первоначально красное, окончательная текстура имеет синий цвет, потому что цвет объекта Material определен позже. На рисунке 4 показано, как выглядит этот синий цвет.

Рисунок 4. Материал, примененный к грани
Рисунок 4. Материал, примененный к грани 
Поиск IT персонала , python, perl, java, js, erlang, ARM и т.д. Давайте решать задачи вместе! rabota@rabota-ka.ru


Отправить комментарий