Пример создания анимированных объектов

В данном примере рассмотрен процесс создания внешне идентичных анимированных объектов SimInTech двумя различными способами:

  • ­ добавлением графических примитивов непосредственно в схемное окно проекта;
  • ­ созданием составного объекта, обособленного в контейнере "графическая группа".

На рисунке ниже представлен внешний вид этих объектов.

Внешне идентичные анимированные объекты: а – объект, скомпонованный из примитивов непосредственно в схемном окне проекта; б – объект, скомпонованный внутри контейнера "графическая группа"

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

Процесс создания анимированного объекта условно можно разделить на три этапа:

  • 1) Компоновка изображения для будущей анимации.
  • 2) Создание необходимого окружения из сигналов, переменных, глобальных свойств.
  • 3) Описание связей между созданным окружением и свойствами графических примитивов, а также логики работы.

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

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

Нулевой этап – создание модели, предмета визуализации

Для этого создадим новый пустой проект типа "Схема модели общего вида" (процесс создания анимированных объектов во всех типах проектов одинаков). Затем соберём в нём следующую модель на основе библиотечных блоков SimInTech.

Исходная расчетная модель

Изменим свойства блоков источников следующим образом:

  • ­ синусоидальный источник: амплитуда = 50;
  • ­ константа = 50;
  • ­ пилообразный источник: размах = 4.

Характеристики динамических блоков модели

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

Первый этап – компоновка изображения для будущей анимации

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

Виртуальный прибор, скомпонованный непосредственно в схемном окне проекта

  • 1. Сначала в любом доступном редакторе графики создадим растровое изображение лицевой панели нашего будущего прибора.

Растровое изображение лицевой панели будущего виртуального прибора

Пурпурный цвет (RGB: 255 0 255) используется в тех местах, которые в окончательном варианте должны стать прозрачными. Можно использовать любой другой цвет, однако использование пурпурного для этих целей является традиционным. Сохраняем полученный рисунок в одном из растровых форматов: BMP, JPG, PNG. Дальнейшие действия выполняются в окне созданного ранее проекта SimInTech.

  • 2. Для продолжения нам понадобятся графические примитивы. Панель с примитивами можно вызвать из меню главного окна SimInTech: "ГО: Вставка→ Панель примитивов...".

Панель графических примитивов SimInTech

  • 3. Для добавления созданного изображения лицевой панели нашего прибора в схемное окно проекта нужно использовать графический примитив "Растровое изображение". После его добавления в схемное окно проекта нужно вызвать окно свойств примитива по двойному клику на нём и в свойстве "Растровое изображение / RasterImage" указать файл с подготовленным ранее рисунком.

Свойства примитива "Растровое изображение / RasterImage"

  • 4. Затем нужно установить следующие свойства примитива:
  • ­ "Прозрачность / Transparent" – Да;
  • ­ "Прозрачный цвет / TransColor" – выбрать пурпурный (RGB: 255 0 255);
  • ­ "Сохранять пропорции / Proportional" – Да.

По завершении установок нажать в окне "Свойства" кнопку "Ок". В результате в схемном окне проекта должно появиться нечто похожее на изображение ниже.

Вид примитива "Растровое изображение / RasterImage" после предварительной настройки

Изменяя размеры примитива можно добиться более приемлемого отображения.

Вид примитива "Растровое изображение / RasterImage" после изменения размеров

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

Взаимное расположение вершин полигона

Пусть полигон перекрывает по высоте длинную щель в лицевой панели нашего виртуального прибора.

Добавление полигона

  • 6. Затем нужно переместить получившийся полигон за растровую картинку. Это можно сделать, например, выделив полигон, и в контекстном меню, вызванном по правой кнопке мыши, выбрать пункт " Поместить назад". Полигон отобразится за растровым изображением после того, как с него будет снято выделение.

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

  • 7. Следующим шагом нанесём градуировку на шкальную часть нашего прибора. Для этого проще всего использовать примитив " Линейная шкала". Разместим его под щелью с полигоном, выровняем шкалу так, чтобы её крайние риски совпадали с левой и правой границами полигона и установим следующие свойства:
  • - "Число делений на шаг / DivCount" – 4;
  • - "Толщина малого штриха / SmallWidth" – 2;
  • - "Толщина большого штриха / LargeWidth" – 2.
  • 8. В итоге изображение должно стать похожим на рисунок ниже.

Добавление шкалы

  • 9. Теперь добавим стрелочный прибор во второй вырез в лицевой панели виртуального прибора. Для этого будем использовать примитив " Стрелочный прибор". Установим для него следующие свойства:
  • - Верхний предел – 4;
  • - Шаг – 1;
  • - Число делений на шаг – 0;
  • - Угол охвата шкалы (радианы) – 2;
  • - Число больших делений на шаг – 1;
  • - Шрифт – Arial, Размер – 8, Жирный.
  • 10. Затем получившийся стрелочный прибор нужно вписать в правый вырез прибора, чтобы получилось следующее изображение. По окончании переместить примитив на задний план: контекстное меню, пункт " Поместить назад".

Встраивание стандартного стрелочного прибора

  • 11. В качестве завершающего эстетического элемента можно разместить за прибором чёрную подложку в виде примитива " Залитый прямоугольник".

Добавление и изменение размера прямоугольника для фона

Изменение цвета заливки фонового прямоугольника на черный

Перенос фонового прямоугольника на задний план

  • 12. Для читаемости стрелочной шкалы изменим цвет её элементов на белый:
  • - Цвет – выбрать белый (RGB: 0 0 0);
  • - Цвет стрелки – выбрать белый (RGB: 0 0 0);
  • - Шрифт – выбрать белый (RGB: 0 0 0).

Новый внешний вид виртуального прибора

Осталось дополнить проект цифровым прибором, который будет показывать в зависимости от положения выключателя либо значение сигнала sin1, либо значение сигнала pila1. Для этого разместим в схемном окне проекта рядом с нашим виртуальным прибором примитив " Текст".

Добавление текстового примитива для отображения значений источников из модели

Оставим данный примитив без изменений и добавим управляющий графический примитив " Кнопка".

Добавление кнопки для переключения между источниками для текстового примитива

Итак, изображение в схемном окне проекта скомпоновано.

Второй этап – создание окружения

  • 13. Для использования значений, рассчитываемых в модели, необходимо организовать их запись в сигналы проекта либо базы данных. Создадим два сигнала проекта. Вызовем редактор сигналов: "ГО:Графика→Сигналы". Откроется окно "Редактор сигналов проекта".

Окно редактора связей

  • 14. В открывшемся окне по нажатию на кнопку поочередно создадим два сигнала. По двойному щелчку в полях "Имя" и "Название" можно ввести произвольные имена и описания сигналов. Имена могут состоять из цифр и латинских букв, описания также могут содержать русские буквы. Все обращения к сигналам в SimInTech осуществляются по их именам, например, в редакторе связей или в скриптах. Установим свойства сигналов, как показано на следующем рисунке.

Настройки для добавляемых в проект сигналов

  • 15. Теперь необходимо организовать запись расчётных величин из модели в эти сигналы. Это можно сделать с помощью библиотечного блока "Запись в список сигналов" из вкладки "Данные" главного окна. В свойстве "Имена сигналов" (вкладка "Свойства" окна "Свойства":<Имя_Объекта>) для каждого из этих блоков нужно вписать Имя сигнала, заготовленного для регистрации расчётной величины. Окно свойств блока вызывается по двойному клику на блоке.

Установление соответствия между выходами схемы модели и сигналами проекта

Теперь при запуске расчёта модели в сигналы sin1 и pila1 будут записываться значения синусоиды и пилы от источников из нашей схемы, собранной в схемном окне проекта.

Третий этап – описание связей и логики работы

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

Сначала рассмотрим использование редактора связей.

  • 16. Установим с помощью редактора связей соответствие между сигналом pila1 и показаниями стрелочной шкалы. Для этого нужно вызвать редактор связей из меню главного окна: "ГО: Сервис→Связи...". Откроется окно редактора связей.

Окно редактора связей

  • 17. Затем нужно выбрать вкладку "Сигнал" в правой части открывшегося окна: появится список сигналов проекта.
  • 18. Сигнал pila1 нужно переместить в правую часть окна в ячейку "источник", перетянув строку с сигналом курсором мыши в эту ячейку.

Добавление сигнала pila1 в качестве источника

  • 19. Затем нужно в соседней ячейке "приемник" установить свойство "Value" анимируемого примитива "Стрелочный прибор". Для этого нужно в схемном окне проекта выбрать данный примитив, а в окне редактора связей выбрать вкладку "Объект": отобразится список свойств выбранного примитива. В открывшемся списке нужно найти свойство "Value" и перетащить его курсором мыши в ячейку "приемник" напротив заполненной ячейки "источник". Связь установлена.

Добавление свойства Value стрелочного прибора в качестве приемника сигнала pila1

Для установления остальных связей требуются дополнительные преобразования, поэтому мы опишем их с помощью скрипта.

  • 20. Теперь наша задача состоит в том, чтобы "привязать" ширину зелёного полигона к значению сигнала sin1 таким образом, чтобы положение правой границы полигона отмечало на шкале под ним значение, соответствующее текущему значению сигнала. Для этого нам нужно описать алгоритм изменения координат второй и третьей вершин полигона.
  • 21. Вызовем свойства полигона двойным кликом ЛКМ по его изображению и скопируем в буфер обмена содержимое ячейки "Points" на вкладке "Свойства".

Окно свойств объекта

  • 22. Затем закроем окно свойств, а в левой части схемного окна проекта выберем вкладку "Параметры". Откроется текстовый редактор для описания скриптов. Вставим в редактор содержимое буфера обмена. Вставится текст, содержащий координаты вершин нашего четырехугольного полигона в формате свойства "Points".

Редактор скриптов

  • 23. По значениям координат определим координаты правой верхней и правой нижней вершин. В нашем случае это вторая и третья пара координат. Очевидно для перемещения правой вертикальной границы полигона нам нужно задавать одинаковые значения координаты Х в этих парах. Также необходимо привести диапазон значений сигнала sin1 к диапазону координат Х. Для этого нужно разделить диапазон координат Х на диапазон значений сигнала sin1. Полученное значение будет равно приращению координаты Х, соответствующему единичному значению сигнала sin1. Итак, описание координат нужно привести к следующему виду:
[ (448 , -64), (744 , -64) , (744, -24) , (448 , -24) ]    

Формирование динамически изменяющихся координат для полигона

  • 24. Теперь осталось присвоить свойству Points нашего полигона получившееся динамически рассчитываемое выражение. Для этого дополним его операцией присвоения.
polygon2.points = [ (448 , - 64) (448 + (744 - 448) * sin1 / 100, - 64), (448 + (744 - 448) * sin1 /100 , - 24) (448 , - 24)]    

Окончательный вид строки скрипта для привязки размера шкалы из полигона к значению источника sin1

Как видно из примера формат записи свойств графических объектов в скрипте формируется в манере языков объектно-ориентированного программирования: <имя_графического_объекта>.<название_свойства> .

  • 25. Чтобы проверить работу созданной нами анимации вернемся на вкладку "Схема" в схемном окне проекта и переведём окно в режим "Индикация" нажатием кнопки на панели инструментов схемного окна. Затем запустим процесс расчета модели нажатием кнопки "Пуск" в панели инструментов ГО. Анимация должна выглядеть примерно так.

Пример анимации на текущей стадии

  • 26. Теперь дополним наш скрипт логикой, описывающей механизм переключения значения, отображаемого текстовым примитивом, с помощью примитива "Кнопка".
if button1.down then
begin
  textlabel4.text = "Значение pila1 = ";
  textlabel4.values = pila1;
end
else 
begin
  textlabel4.text = "Значение sin1 = ";
  textlabel4.values = sin1;
end   

Обратите внимание: свойство "Text" примитива "Текст / TextLabel" предназначено для хранения статичных надписей. Динамически изменяющиеся значения должны присваиваться свойству "Values".

Свойство button1.down принимает значение TRUE при нажатой кнопке и FALSE при отжатой. На основании значения этого свойства свойствам текстового примитива textlabel4.text и textlabel4.values присваиваются соответственно текстовое описание и значение либо для сигнала pila1, либо для сигнала sin1.

Вновь запустим процесс расчета модели: цифровой индикатор должен отображать значения в соответствии с положением переключателя. Сам переключатель должен срабатывать по клику ЛКМ.

Виртуальный прибор, скомпонованный в графическом контейнере

  • 27. Теперь соберём аналогичный виртуальный показывающий прибор внутри графического контейнера. Для наглядности в качестве контейнера мы используем графический примитив "Группа", который разместим в том же проекте. Для этого выберем в панели графических примитивов объект "Группа" и поместим его в свободное место схемного окна проекта.

Вид вновь добавленной в схемное окно проекта пустой группы

  • 28. Для удобства установим в свойствах группы свойство "Прозрачный фон" в значение "Да". Окно свойств группы можно вызвать из контекстного меню.

Свойства графического контейнера Group1

  • 29. Для редактирования группы нужно дважды кликнуть на её изображении ЛКМ: откроется окно графического редактора с содержимым группы. Чтобы не отрисовывать наш показывающий прибор заново внутри группы просто скопируем его.
  • 30. Нам осталось дополнить группу глобальными свойствами и с их помощью описать связи между сигналами проекта и свойствами графических примитивов. Для это вызовем редактор глобальных свойств из меню графического редактора: "Сервис→Глобальные свойства...". Откроется показанное ниже окно

Редактор глобальных (общих) свойств

Как и в случае с предыдущим прибором нам нужно передавать в свойства примитивов значения сигналов sin1 и pila1. Поэтому подготовим два глобальных свойства для трансляции этих значений в группу.

Набор необходимых глобальных свойств и их характеристики

  • 31. После добавления глобальных свойств закроем это окно. Если теперь закрыть окно редактирования группы и вновь вызвать её свойства, в конце списка мы увидим два вновь добавленных свойства.

Отображение вновь добавленных глобальных свойств графического контейнера в общем списке

  • 32. Последующие действия повторяют операции, описанные в п. 16 – 24 за исключением того, что окна редактора связей и редактора скриптов вызываются не из ГО, а из окна графического редактора, в котором редактируется группа. Итак, откроем редактор связей из меню графического редактора: "Сервис→Связи..." и выберем вкладку "Общее свойство".

Список глобальных свойств графического контейнера во внутреннем редакторе связей

Перетащим свойство pila1_into_gr в ячейку "Источник" в правой части окна, как мы поступали до этого с сигналом проекта.

Выбор глобального свойства pila_into_gr в качестве источника значений…

Теперь выделим в окне редактирования группы примитив стрелочного прибора, чтобы во вкладке "Объект" отобразились его свойства и перетащим в ячейку "Приемник" свойство "Value".

…И свойства Value второго стрелочного прибора в качестве приемника значений

  • 33. В случае с индикатором в виде прямоугольного полигона повторим действия, описанные в п.23 и 24, взяв за основу координаты полигона внутри группы и используя глобальное свойство вместо сигнала. Редактор скриптов для нашего контейнера вызывается из меню графического редактора "Сервис→Скрипт...". Результат должен выглядеть примерно так. Код, описывающий логику работы переключателя можно скопировать из скрипта в схемном окне проекта, поскольку наименования всех объектов внутри группы совпадают с таковыми в схемном окне, но имена сигналов нужно заменить на имена соответствующих им глобальных свойств.

Окончательный текст скрипта

  • 34. На данном этапе прописаны все связи внутри группы, но ещё необходимо установить соответствие между глобальными свойствами и сигналами проекта. Чтобы сделать это, закроем окно редактирования группы и вызовем редактор связей, на этот раз из меню главного окна SimInTech: "ГО:Сервис→Связи...". Для отображения нужных свойств выделим в схемном окне проекта нашу группу. Установим следующее соответствие, последовательно перетаскивая в правую часть окна свойства и сигналы.

Полный набор связей внутри графического контейнера

  • 35. Для того, чтобы переключатель внутри группы реагировал на нажатия мышки нужно установить свойство группы "Чувствительность" в значение "Да".

Свойство "Чувствительность / Sensible" в значении "Да"

  • 36. Теперь установление соответствия между сигналами проекта и содержимым группы завершено. Можно запустить расчет и убедиться в идентичности показаний двух наших приборов.

Вид готовых анимированных объектов