Программирование на языке сценариев SketchUp: В этой статье описана совокупность основных классов, используемых в сценариях SketchUp, а также приводятся примеры их использования. При помощи этих классов можно построить любую трехмерную (далее — 3-D) фигуру, состоящую из отрезков и граней.
Рисунок 1. Вывод в Ruby Console
Рисунок 2. Иерархия класса Entity
Листинг 1. Экструзия при помощи метода followme
Рисунок 3. Экструзия в SketchUp
Листинг 2. Создание и применение материала
Рисунок 4. Материал, примененный к грани
Первая статья серии рассказывает о том, как настроить среду Eclipse для создания, редактирования и выполнения сценариев SketchUp. В ней приводится пример сценария, но не дается ответ на главный вопрос: как работает код внутри сценариев? Цель данной статьи — дать ответ на этот вопрос путем обсуждения SketchUp API. SketchUp API содержит классы, чьи методы рисуют и изменяют аспекты SketchUp-проекта, в том числе линии, поверхности, цвета и изображения. Эта статья не может охватить весь API, поэтому я остановлюсь на основных классах, необходимых для построения фигур SketchUp. Но сначала, поскольку SketchUp API основан на Ruby, я сделаю обзор языка Ruby и опишу, как он работает.
Учитывая популярность языка программирования Java™ и упоминание Eclipse в названии статьи, я полагаю, что вы знакомы с Java. Ruby далеко не так популярен, поэтому я кратко объясню некоторые их сходства и различия. Я надеюсь, что после этого вы будете чувствовать себя с этим языком достаточно комфортно и сможете попробовать его и написать несколько элементарных команд.
Анализ:
- Как и язык Java, Ruby является объектно-ориентированным языком. Фактически все в Ruby является подклассом класса
Object
. В нем нет примитивов, как, например,int
,float
и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

Эти команды могут показаться простыми, но Ruby предоставляет возможности, совсем не похожие на то, что можно увидеть в языках Java, C или C++. К таким уникальным возможностям можно отнести блоки итераторов, параллельное присваивание и диковинки наподобие класса
SketchUp API
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

Наиболее важными объектами
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

Обратите внимание, что траектория должна быть замкнутой, т.е. первая точка первого объекта
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]
. Здесь первый элемент определяет интенсивность красного цвета, второй - интенсивность зеленого, а третий - интенсивность синего. Вместо чисел можно также указать названия цветов, например Red, Plum или 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. Материал, примененный к грани

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