Описание пользователя
Глава 2. Интерфейс пользователя
§2.10. Редактирование векторной картинки блока
§2.10.12. Пример создания блока с анимированной картинкой
Рассматривается пример создания векторной картинки блока, изображающей манипулятор с захватом, двигающийся при изменении значений переменных блока.
Рис. 167. Изображаемый манипулятор
Создадим блок, картинка которого будет представлять собой условное изображение манипулятора (рис. 167). Манипулятор будет иметь три сегмента и захват. Первый сегмент шарнирно закреплен на неподвижном основании, угол его поворота относительно основания будет задаваться переменной α, нулевому значению которой соответствует вертикальное положение сегмента. Второй сегмент закреплен на конце первого и поворачивается относительно него на угол β, нулевому значению угла соответствует такое положение второго сегмента, при котором он повернут вправо от оси первого на угол 90° (см. рисунок). Третий сегмент с захватом закреплен на конце второго, угол его поворота задается переменной γ, ее нулевое значение соответствует такому положению сегмента, при котором он повернут вправо от оси второго на угол 90°. Положительные направления углов отсчитываются против часовой стрелки. Захват имеет две симметричные губки, положение которых задается переменной C: полностью разведенным губкам соответствует ее единичное значение, полностью сведенным – нулевое. На рис. 167 изображен предполагаемый внешний вид манипулятора при α=β=γ=0, C=1.
Создание блока начнем с создания схемы, в которой он будет находиться. Запустим RDS (программу «rds.exe»), создадим новую пустую схему, выбрав пункт меню «» и сохраним ее на диск вызовом пункта меню «». В ответ на запрос RDS дадим новой схеме какое-нибудь имя – например, «Hand.rds».
При создании новой схемы автоматически открылось пустое окно ее корневой подсистемы с заголовком «Система». Создадим в этой подсистеме новый блок, щелкнув правой кнопкой мыши где-нибудь на ее рабочем поле и выбрав в открывшемся контекстном меню пункт «» (рис. 168). В точке щелчка появится новый блок. У него пока нет картинки, поэтому он изображается пустым белым квадратом, под которым, если настройки RDS не изменены, будет выведено его имя: «Block1». Когда мы добавим к блоку картинку, отображение имени будет нам мешать, поэтому сразу отключим его, щелкнув на блоке правой кнопкой мыши и убрав в контекстном меню флажок возле пункта «» (рис. 169).

(а)

(б)
Рис. 168. Создание в подсистеме нового блока (а) и созданный блок (б)
Рис. 169. Отключение вывода имени блока
В этом блоке нам потребуется создать три переменных для углов поворота сегментов и одну переменную для управления губками захвата. Поскольку наш блок не будет иметь собственной модели и все управляющие воздействия будут поступать в него снаружи, эти четыре переменные должны быть входами блока. Согласно рис. 167 назовем их «Alpha», «Beta», «Gamma» и «C» и сделаем их вещественными двойной точности, то есть используем тип RDS «double». Поскольку углы поворота элементов векторной картинки блока, связанные с переменными, по умолчанию считаются заданными в радианах, на входы «Alpha», «Beta» и «Gamma» мы тоже будем подавать значения в радианах. Если мы захотим задавать углы поворота сегментов манипулятора в градусах, нам придется либо переключить единицу измерения углов в параметрах систем координат, либо подключать к нашему блоку значения углов через стандартные библиотечные блоки преобразования градусов в радианы. Будем считать, что мы выбрали второй путь – «Alpha», «Beta» и «Gamma» будут задаваться в радианах, а преобразования, если они потребуются, мы вынесем за пределы создаваемого блока.
С учетом написанного выше, создадим в нашем блоке структуру переменных. Откроем окно параметров блока двойным щелчком на нем или пунктом «» контекстного меню и выберем в нем вкладку «» (рис. 170). На этой вкладке видно, что у нашего блока уже есть две стандартных сигнальных переменных, необходимых каждому простому блоку. Добавим к ним четыре новых, для чего нажмем кнопку «».
Рис. 170. Вызов редактора переменных блока из окна параметров
Нажатие кнопки «» откроет редактор переменных блока, таблицу в котором следует заполнить согласно рис. 171. Стандартные сигнальные переменные «Start» и «Ready» мы трогать не будем – хотя нашему блоку они и не нужны, удалить их нельзя. Единственное, что можно, при желании, сделать – это убрать для них флажок в колонке «», чтобы они не появлялись в списках основных входов и выходов при подключении связей к блоку.
Рис. 171. Задание переменных в редакторе
После того, как редактор переменных заполнен, следует нажать кнопку «» – окно редактора закроется, и на экране снова окажется окно параметров блока, но на вкладке переменных будут теперь перечислены новые, только что созданные, переменные.
Теперь можно перейти к редактированию картинки блока. Выберем в окне параметров вкладку «» (там по умолчанию уже установлен флажок «») и нажмем в левой нижней части вкладки кнопку «» (рис. 172). Поверх окна параметров блока откроется окно редактора картинки с пустым рабочим полем.
Рис. 172. Вызов редактора картинки
Нам предстоит совмещать оси поворота различных элементов, поэтому, если в редакторе отключено изображение осей координат и центров, следует включить их (рис. 173, см. также §2.10.1).
Рис. 173. Окно редактора картинки (включено отображение осей и центров)
Рис. 174. Основание
манипулятора в редакторе
картинки
Сначала нарисуем неподвижное основание манипулятора. Создадим на рабочем поле эллипс размером 40×40 точек и разместим его так, чтобы его центр совпал с началом координат картинки. Это можно сделать вручную, перетащив его мышью в нужное место, или задав координаты его левого верхнего угла равными (−20,−20) – тогда центр эллипса, представляющего собой окружность диаметром в 40 точек, окажется в точке (0,0). Этот эллипс будет изображать шарнир крепления первого сегмента к основанию. Теперь добавим на рабочее поле широкий прямоугольник, высотой больше половины эллипса (например, размером 210×35 точек) и разместим его так, чтобы он перекрывал нижнюю половину эллипса. Основание манипулятора готово (рис. 174).
Если прямоугольник создан после эллипса, то с перекрытием не возникнет никаких проблем – прямоугольник будет находиться ближе к переднему плану, и его изображение перекроет собой эллипс. Если же отступить от приведенного выше порядка создания фигур и сначала нарисовать прямоугольник, а затем – эллипс, то эллипс будет перекрывать прямоугольник. В этом случае, чтобы получить картинку, изображенную на рис. 174, следует отправить эллипс на задний план, либо выбрав соответствующий пункт в его контекстном меню, либо выделив его и нажав Ctrl + PgDn.
Теперь можно приступить к рисованию первого сегмента. Сегмент будет поворачиваться, поэтому необходимо разместить его во вложенной системе координат. Создадим такую систему: нажмем на панели элементов кнопку «» и щелкнем левой кнопкой мыши в точке пересечения осей координат рабочего поля (можно не стараться точно попасть в эту точку – созданную систему координат можно будет переместить потом). Поверх окна редактора картинки откроется новое, с заголовком «система координат – уровень 1», в нем мы и будем рисовать первый сегмент манипулятора.
Рис. 175. Первый сегмент
манипулятора в редакторе
картинки
Создадим в окне редактора узкий высокий (например, размером 20×225 точек) прямоугольник, изображающий сам сегмент, и разместим его так, чтобы вертикальная ось координат проходила через его центр, а его нижняя сторона лежала на горизонтальной оси (рис. 175). Поверх его верхней стороны нарисуем эллипс размером 40×40 точек, изображающий шарнир второго сегмента. Вся эта конструкция будет поворачиваться вокруг своего начала координат, поэтому так важно, чтобы точка пересечения осей координат, то есть ось поворота, пришлась на середину нижней стороны сегмента. Позже мы свяжем созданную вложенную систему координат с переменной блока «Alpha», и нарисованные нами элементы будут поворачиваться против часовой стрелки при ее положительных значениях и по часовой – при отрицательных. При нулевом значении переменной конструкция будет находиться в том положении, в котором мы ее нарисовали, то есть вертикально, как и задумано (см. рис. 167).
Рис. 176. Второй сегмент
манипулятора в редакторе
картинки
Нарисуем второй сегмент – добавим вложенную систему координат в центре верхнего эллипса, то есть в точке крепления второго сегмента к шарниру. Откроется новое окно редактора с заголовком «система координат – уровень 2». Нарисуем в нем конструкцию из прямоугольника и эллипса, похожую на содержимое предыдущей системы координат, но теперь расположим ее горизонтально – нулевой угол поворота второго сегмента соответствует его горизонтальному положению. Начало координат системы должно находиться в середине левой стороны прямоугольника – оно будет осью поворота второго сегмента (рис. 176). Эллипс, изображающий шарнир, можно, при желании, не рисовать заново вручную – точно такой же эллипс мы создали в предыдущей системе координат, поэтому, перед созданием этой его можно скопировать в буфер обмена, нажав Ctrl + C, а в этой системе вставить его оттуда, нажав Ctrl + V.
Рис. 177. Третий сегмент
манипулятора в редакторе
картинки (без губок)
Нарисуем третий сегмент – снова добавим вложенную систему координат в центре эллипса шарнира (заголовком ее окна станет «система координат – уровень 3»). Исходное направление третьего сегмента – вертикально вниз, поэтому поместим в него узкий вертикальный прямоугольник (например, размером 20×45 точек) так, чтобы пересечение осей координат пришлось на середину его верхней стороны (рис. 177). Прямо под ним нарисуем горизонтальный прямоугольник, по которому будут двигаться губки захвата (размер прямоугольника на рисунке – 70×15 точек).
Теперь необходимо добавить к третьему сегменту подвижные губки. Двигать их можно по-разному: можно, например, поместить каждую губку в отдельную систему координат, связать горизонтальные координаты «X» этих систем с переменными блока и, изменяя значения этих переменных, двигать губки. Однако, такой метод обладает двумя недостатками. Во-первых, для этого необходимы две переменных, одна из которых будет увеличиваться, а другая в это же время – уменьшаться (иначе губки будут не сдвигаться и раздвигаться, а вместе перемещаться в одном и том же направлении). Во-вторых, перемещение губок придется задавать в точках экрана, что не всегда удобно – при изменении картинки придется корректировать коэффициенты пересчета относительного раскрытия захвата в точки экрана. Ранее мы решили, что положение губок будет задаваться одной переменной «C», нулевое значение которой соответствует полностью сдвинутым губкам, единичное – полностью раздвинутым. Здесь удобнее поступить следующим образом: каждую губку поместить в отдельную систему координат с запретом масштабирования (назовем эти системы «внутренними»), а получившиеся две системы с губками максимально раздвинуть и поместить внутрь еще одной системы (назовем ее «внешней»), масштабный коэффициент которой связан с переменной «C». Начала координат двух внутренних систем должны лежать на горизонтальной оси внешней симметрично относительно ее вертикальной оси. При этом будет происходить следующее:
- При единичном значении «C» содержимое внешней системы будет выглядеть как при редактировании, то есть губки будут находиться в максимально раздвинутом состоянии.
- При уменьшении «C» координаты всех элементов внутри внешней системы, то есть координаты двух внутренних систем, будут умножаться на число, меньшее единицы. В результате начала координат внутренних систем начнут сближаться – они будут двигаться строго по горизонтали, поскольку вертикальные координаты обеих внутренних систем равны нулю и не будут изменяться, на какое бы число они ни умножались. При этом, поскольку масштабирование для внутренних систем запрещено, размеры губок не будут уменьшаться.
- Когда «C» станет равной нулю, начала координат обеих внутренних систем встретятся в начале координат внешней – все координаты будут умножены на ноль и станут равны нулю. В результате губки захвата окажутся сдвинутыми до конца.
Таким образом, изменяя масштабный коэффициент внешней системы, мы синхронно перемещаем обе губки захвата по горизонтали в разные стороны, сохраняя их размер неизменным за счет запрета масштабирования внутренних систем.
Вместо того, чтобы, как раньше, создать новую вложенную систему координат и наполнять ее содержимым, сначала нарисуем губки в той же системе координат, в которой находится третий сегмент манипулятора (см. рис. 177), а затем поместим их внутрь системы. Поскольку нам необходимо нарисовать губки в полностью разведенном состоянии, удобнее видеть при этом горизонтальный прямоугольник, по которому они будут перемещаться. Если же мы сначала создадим новую систему, она откроется в новом окне, и мы не будем видеть элементов, которые ее окружают.
Рис. 178. Левая губка захвата
(масштаб увеличен)
Сначала добавим левую губку – нарисуем ее как многоугольник, левая верхняя точка которого совпадает с левой нижней точкой горизонтального прямоугольника, по которому эта губка будет двигаться вправо при закрытии захвата (рис. 178). Правую губку можно нарисовать вручную симметрично левой, либо, что гораздо удобнее, продублировать левую, (выделив ее и нажав Ctrl + D или скопировав ее в буфер обмена нажатием Ctrl + C, а затем вставив копию нажатием Ctrl + V), после чего отразить ее горизонтально, выбрав в контекстном меню появившейся на рабочем поле копии пункт «», установив в открывшемся окне флажок «» и нажав кнопку «». Получившийся после этого многоугольник следует переместить так, чтобы его крайняя правая точка совпадала с правой нижней точкой горизонтального прямоугольника (рис. 179).
Рис. 179. Обе губки нарисованы
Теперь обе губки захвата нарисованы, но перемещаться они пока не способны: нужно поместить их во вложенные системы координат – сначала по отдельности, а затем – вместе, как было описано выше). Выделим многоугольник левой губки, щелкнув по нему левой кнопкой мыши, и выберем в главном меню редактора пункт «». На выделенной губке появится перекрестие в круге, отмечающее начало координат созданной системы. Оно находится примерно посередине многоугольника, то есть не там, где нам нужно. Перетащим это начало координат в правый верхний угол многоугольника (рис. 180) – теперь горизонтальная ось внутренней системы координат левой губки совпадает с ее верхней стороной, а вертикальная – с правой. Осталось запретить ее масштабирование, чтобы при изменении переменной «C» губка не меняла размер, а просто перемещалась. Для этого нужно нажать на изображении губки правую кнопку мыши, выбрать в контекстном меню пункт «», в открывшемся окне на вкладке «» установить флажок «», а затем закрыть окно кнопкой «» (рис. 181).

(а)

(б)

(в)
Рис. 180. Перемещение начала координат левой губки (масштаб увеличен): исходное положение (а), перетаскивание перекрестия (б), новое положение начала координат (в)
Рис. 181. Запрещение масштабирования системы координат левой губки захвата
Рис. 182. Губки помещены в системы координат
Теперь необходимо симметрично повторить описанные выше действия для правой губки: выделить ее, поместить во вложенную систему координат, перетащить перекрестие начала координат (на этот раз в левую верхнюю точку многоугольника) и запретить масштабирование созданной системы. Если все сделано правильно, система координат третьего сегмента манипулятора в данный момент должна выглядеть так, как на рис. 182 (на рисунке выделение со всех элементов снято, включено отображение осей координат и центров).
Итак, изображения губок захвата помещены в отдельные системы координат, для которых запрещено масштабирование. Теперь необходимо поместить обе эти системы внутрь еще одной, масштабным коэффициентом которой будет управлять переменная «C». Для этого необходимо выделить обе губки одновременно, как показано на рис. 183 а (например, щелкнув левой кнопкой мыши по одной губке, а затем, нажав клавишу Shift, щелкнув по другой), а затем выбрать в главном меню редактора уже знакомый пункт «». Начало координат новой созданной системы будет отмечено перекрестием с большим кругом, начала координат двух ее внутренних вложенных систем – перекрестиями с маленькими кругами (рис. 183 б).

(а)

(б)

(в)

(г)
Рис. 183. Помещение губок в общую систему координат: выделенные по отдельности губки (а), после помещения в общую систему (б), перетаскивание начала координат (в), новое положение начала координат (г)
Теперь необходимо переместить начало координат внешней системы так, чтобы оно находилось точно посередине между началами координат внутренних систем с губками (рис. 183 в), тогда изменение масштаба внешней системы будет двигать губки строго по горизонтали. После того, как это будет сделано, останется связать масштабный коэффициент этой системы с переменной «C». Для этого следует вызвать контекстное меню системы координат, щелкнув правой кнопкой мыши на изображении любого ее внутреннего элемента (в данном случае – на изображении одной из губок или между ними, поскольку эта область тоже попадает внутрь описывающего прямоугольника системы) и выбрать в нем пункт «». В окне параметров на вкладке «» (рис. 184) на панели «» переменную «C» можно выбрать в выпадающем списке или ввести ее имя вручную.
Рис. 184. Связь масштабного коэффициента системы с переменной
Создание блока мы начали с задания списка переменных, поэтому сейчас, когда мы редактируем картинку, переменные блока уже известны, и их можно выбирать в списках в окнах параметров различных графических элементов. Если бы мы начали с редактирования картинки, выпадающие списки были бы пусты, но имена переменных все равно можно было бы вводить вручную с клавиатуры. Редактор картинки не требует, чтобы переменная, связь с которой указывается в окне параметров элемента, существовала. Если переменная с указанным именем отсутствует, элемент будет вести себя так же, как и при отсутствии связи, а как только переменная появится в блоке, связь будет установлена автоматически.
Теперь в системе координат третьего сегмента манипулятора есть работающий захват, но сама эта система еще не связана с переменной «Gamma», которая должна определять угол ее поворота. Чтобы установить эту связь, необходимо закрыть окно редактора системы координат уровня 3 (обычной кнопкой закрытия окна Windows или кнопкой панели функций «») и вернуться к редактированию системы уровня 2, то есть системы координат второго сегмента манипулятора. По сравнению с рис. 176, ее внешний вид изменился – теперь в ней присутствует система координат третьего сегмента со всем своим содержимым (рис. 185). Если при создании системы третьего сегмента мы не очень точно попали курсором мыши в центр эллипса шарнира, третий сегмент манипулятора будет смещен, как на рис. 185 а, кроме того, третий сегмент находится ближе к переднему плану, чем этот эллипс, поэтому верхняя часть прямоугольника третьего сегмента не скрыта под ним.

(а)

(б)
Рис. 185. Содержимое системы координат второго сегмента манипулятора: сразу
после редактирования третьего сегмента (а) и в окончательном виде (б)
Чтобы привести изображение в порядок, необходимо сделать две вещи: во-первых, переместить третий сегмент так, чтобы его начало координат (перекрестие в большом круге) совпало с центром эллипса шарнира, во-вторых, отправить эллипс на передний план (выделив его и нажав Ctrl + PgUp). При перемещении третьего сегмента мышью следует обратить внимание на то, за какую именно точку его перетаскивать. Если попасть курсором мыши в большой круглый маркер выделения, вместо перемещения всей системы координат будет перемещаться только ее начало (мы использовали это при создании губок захвата, см. рис. 180). Перетаскивать систему координат вместе с ее содержимым следует за какую-либо свободную точку, на которой нет маркеров. В нашем случае – за одну из губок или за один из двух прямоугольников третьего сегмента. После выполнения всех указанных действий содержимое системы координат второго уровня примет вид, изображенный на рис. 185 б – центр эллипса шарнира совпадает с осью поворота третьего сегмента, концы сегментов скрыты под эллипсом.
Теперь можно связать угол поворота системы координат третьего сегмента с переменной «Gamma». Для этого следует выбрать в контекстном меню системы координат пункт «», и в открывшемся окне на вкладке «» выбрать эту переменную из выпадающего списка (рис. 186). В результате этого при изменении значения «Gamma» третий сегмент манипулятора будет поворачиваться вокруг оси, совпадающей с центром эллипса шарнира, чего мы и добивались. Редактирование системы второго сегмента на этом завершено – можно закрывать окно редактора и возвращаться к редактированию первого сегмента.
Рис. 186. Связь угла поворота системы с переменной
В системе координат первого сегмента теперь видны второй и третий, однако, как и в предыдущем случае, второй сегмент расположен поверх эллипса шарнира и, возможно, смещен в сторону (рис. 187 а). Необходимо совместить начало координат второго сегмента с центром эллипса и переместить этот эллипс на передний план. Окончательный вид содержимого системы координат первого сегмента изображен на рис. 187 б. Осталось только уже описанным выше способом связать угол поворота системы второго сегмента с переменной «Beta», после чего окно системы первого сегмента можно закрывать и возвращаться к редактору всей картинки.

(а)

(б)
Рис. 187. Содержимое системы координат первого сегмента манипулятора: сразу
после редактирования второго сегмента (а) и в окончательном виде (б)
В редакторе самой картинки (в заголовке его окна не будет слов «система координат: уровень...») необходимо выполнить похожие действия: переместить систему координат первого сегмента (в ней находятся первый, второй и третий сегменты вместе) так, чтобы ее начало совпало с центром эллипса шарнира, связать угол ее поворота с переменной «Alpha» и спрятать конец первого сегмента под эллипсом. В данном случае нельзя отправлять эллипс на передний план, поскольку он должен быть перекрыт прямоугольником неподвижного основания – вместо этого можно отправить на задний план всю систему координат первого сегмента, выделив ее и нажав Ctrl + PgDn. В результате всех действий готовая картинка блока в окне редактора должна выглядеть так же, как на рис. 188. Окно редактора теперь можно закрывать – на экране снова появится окно параметров блока с активной вкладкой «», только на панели просмотра картинки вместо слова «нет» появится уменьшенное изображение нарисованного нами манипулятора. Окно параметров блока необходимо закрыть кнопкой «», в противном случае параметры блока не будут изменены и созданная нами картинка будет потеряна.
Рис. 188. Готовая картинка блока в редакторе
После нажатия «» в окне параметров блока внешний вид нашего блока на рабочем поле подсистемы изменится – вместо небольшого белого квадрата появится созданная нами картинка. Картинка получилась довольно большой, поэтому, вероятнее всего, мы увидим только ее левую нижнюю часть, то есть область вблизи ее начала координат. Необходимо перетащить блок мышью куда-нибудь в центр видимой части рабочего поля (возможно, придется увеличить размер окна подсистемы, чтобы весь блок был виден) и подключить к его входам «Alpha», «Beta», «Gamma» и «C» какие-нибудь органы управления: поля ввода, рукоятки и т.п. Следует помнить, что при заданных нами параметрах связи с переменными картинка блока будет воспринимать углы поворота в радианах (см. рис. 186), поэтому, если мы хотим задавать углы поворота в градусах, необходимо либо подключать органы управления к нашему блоку не напрямую, а через блоки перевода градусов в радианы (такой стандартный блок находится на вкладке «алгебра» панели блоков, на его кнопке написано «G/R»), либо изменить параметры систем координат картинки так, чтобы значения переменных считались заданными в градусах.
На рис. 189 изображен пример схемы, с помощью которой можно проверить работу созданного нами блока. В схему добавлено четыре поля ввода (с вкладки «интерфейс» панели блоков), с заголовками «α», «β», «γ» и «Захват» (чтобы ввести греческие буквы в заголовок поля ввода, необходимо в окне его параметров поменять шрифт заголовка, например, на «Symbol»). Поле «Захват» непосредственно соединено с входом «C» нашего блока, а поля «α», «β» и «γ» – с блоками перевода градусов в радианы, которые, в свою очередь, соединены с входами «Alpha», «Beta» и «Gamma» соответственно. Запустив расчет и меняя значения в полях ввода, можно заставить манипулятор двигаться (рис. 190).
Рис. 189. Пример схемы для тестирования созданного блока
Рис. 190. Управление манипулятором в режиме расчета
Мы рассмотрели пример связи с переменными углов поворота и масштабных коэффициентов частей картинки блока. Точно так же с переменными можно связывать цвета, размеры, координаты, тексты и т п. – у каждого элемента картинки есть свой индивидуальный набор параметров, которые могут быть связаны с переменными блока.