|
<< Click to Display Table of Contents >> Navigation: Создание окон для клиента визуализации > Рекомендации по созданию окон > Динамизация SVG элементов > Структура XML файла > Теги XML > XML "<SvgDef>" > Альтернативы CreateCommonAvary > CSS для кастомизации состояния рамки SVG |
Воспользуемся CSS для детальной кастомизации аварийного состояния рамки SVG.
1.В первую очередь в SVG нужно добавить рамку и анимацию. Открываем в блокноте или редакторе кода SVG add_circle_css_alarm.svg:
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M11 17H13V13H17V11H13V7H11V11H7V13H11V17ZM12 22C10.6167 22 9.31667 21.7375 8.1 21.2125C6.88333 20.6875 5.825 19.975 4.925 19.075C4.025 18.175 3.3125 17.1167 2.7875 15.9C2.2625 14.6833 2 13.3833 2 12C2 10.6167 2.2625 9.31667 2.7875 8.1C3.3125 6.88333 4.025 5.825 4.925 4.925C5.825 4.025 6.88333 3.3125 8.1 2.7875C9.31667 2.2625 10.6167 2 12 2C13.3833 2 14.6833 2.2625 15.9 2.7875C17.1167 3.3125 18.175 4.025 19.075 4.925C19.975 5.825 20.6875 6.88333 21.2125 8.1C21.7375 9.31667 22 10.6167 22 12C22 13.3833 21.7375 14.6833 21.2125 15.9C20.6875 17.1167 19.975 18.175 19.075 19.075C18.175 19.975 17.1167 20.6875 15.9 21.2125C14.6833 21.7375 13.3833 22 12 22ZM12 20C14.2333 20 16.125 19.225 17.675 17.675C19.225 16.125 20 14.2333 20 12C20 9.76667 19.225 7.875 17.675 6.325C16.125 4.775 14.2333 4 12 4C9.76667 4 7.875 4.775 6.325 6.325C4.775 7.875 4 9.76667 4 12C4 14.2333 4.775 16.125 6.325 17.675C7.875 19.225 9.76667 20 12 20Z" fill="black"/> </svg> |
2.Добавим рамку с помощью тега rect, который будет соответствовать ширине и высоте SVG.
Также внутри тега rect добавим id="alarm_border", чтобы потом регулировать данную рамку с помощью селекторов:
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <rect id="alarm_border" x="0.5" y="0.5" width="23" height="23"/> <path d="M11 17H13V13H17V11H13V7H11V11H7V13H11V17ZM12 22C10.6167 22 9.31667 21.7375 8.1 21.2125C6.88333 20.6875 5.825 19.975 4.925 19.075C4.025 18.175 3.3125 17.1167 2.7875 15.9C2.2625 14.6833 2 13.3833 2 12C2 10.6167 2.2625 9.31667 2.7875 8.1C3.3125 6.88333 4.025 5.825 4.925 4.925C5.825 4.025 6.88333 3.3125 8.1 2.7875C9.31667 2.2625 10.6167 2 12 2C13.3833 2 14.6833 2.2625 15.9 2.7875C17.1167 3.3125 18.175 4.025 19.075 4.925C19.975 5.825 20.6875 6.88333 21.2125 8.1C21.7375 9.31667 22 10.6167 22 12C22 13.3833 21.7375 14.6833 21.2125 15.9C20.6875 17.1167 19.975 18.175 19.075 19.075C18.175 19.975 17.1167 20.6875 15.9 21.2125C14.6833 21.7375 13.3833 22 12 22ZM12 20C14.2333 20 16.125 19.225 17.675 17.675C19.225 16.125 20 14.2333 20 12C20 9.76667 19.225 7.875 17.675 6.325C16.125 4.775 14.2333 4 12 4C9.76667 4 7.875 4.775 6.325 6.325C4.775 7.875 4 9.76667 4 12C4 14.2333 4.775 16.125 6.325 17.675C7.875 19.225 9.76667 20 12 20Z" fill="black"/> </svg> |
Пока рамка не отображается, ее можно будет увидеть во время отладки.
Почему rect параметры не соответствуют viewBox SVG?
В SVG обводка (рамка, stroke) рисуется по центру линии. Если rect будет с параметрами x="0" y="0" width="24" height="24", то половина обводки окажется за краем SVG и не будет видна.
Чтобы рамка была видна полностью по всем сторонам SVG, rect немного сдвигают внутрь (x="0.5" y="0.5") и делают меньше (width="23" height="23").
3.Далее, между тегами svg и path нужно создать новый тег style с экранированием CDATA:
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <style type="text/css"><![CDATA[
/* Здесь ваш CSS код */
]]> </style> <rect id="alarm_border" x="0.5" y="0.5" width="23" height="23"/> <path d="M11 17H13V13H17V11H13V7H11V11H7V13H11V17ZM12 22C10.6167 22 9.31667 21.7375 8.1 21.2125C6.88333 20.6875 5.825 19.975 4.925 19.075C4.025 18.175 3.3125 17.1167 2.7875 15.9C2.2625 14.6833 2 13.3833 2 12C2 10.6167 2.2625 9.31667 2.7875 8.1C3.3125 6.88333 4.025 5.825 4.925 4.925C5.825 4.025 6.88333 3.3125 8.1 2.7875C9.31667 2.2625 10.6167 2 12 2C13.3833 2 14.6833 2.2625 15.9 2.7875C17.1167 3.3125 18.175 4.025 19.075 4.925C19.975 5.825 20.6875 6.88333 21.2125 8.1C21.7375 9.31667 22 10.6167 22 12C22 13.3833 21.7375 14.6833 21.2125 15.9C20.6875 17.1167 19.975 18.175 19.075 19.075C18.175 19.975 17.1167 20.6875 15.9 21.2125C14.6833 21.7375 13.3833 22 12 22ZM12 20C14.2333 20 16.125 19.225 17.675 17.675C19.225 16.125 20 14.2333 20 12C20 9.76667 19.225 7.875 17.675 6.325C16.125 4.775 14.2333 4 12 4C9.76667 4 7.875 4.775 6.325 6.325C4.775 7.875 4 9.76667 4 12C4 14.2333 4.775 16.125 6.325 17.675C7.875 19.225 9.76667 20 12 20Z" fill="black"/> </svg> |
4.Создаем пустые 3 селектора, которые будут отвечать за состояние рамки: отключенное состояние рамки (Off), предупредительная рамка (Warning) и аварийная рамка (Danger):
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <style type="text/css"><![CDATA[ #alarm_border.Off{ } #alarm_border.Warning{ } #alarm_border.Danger{ } ]]> </style> <rect id="alarm_border" x="0.5" y="0.5" width="23" height="23"/> <path d="M11 17H13V13H17V11H13V7H11V11H7V13H11V17ZM12 22C10.6167 22 9.31667 21.7375 8.1 21.2125C6.88333 20.6875 5.825 19.975 4.925 19.075C4.025 18.175 3.3125 17.1167 2.7875 15.9C2.2625 14.6833 2 13.3833 2 12C2 10.6167 2.2625 9.31667 2.7875 8.1C3.3125 6.88333 4.025 5.825 4.925 4.925C5.825 4.025 6.88333 3.3125 8.1 2.7875C9.31667 2.2625 10.6167 2 12 2C13.3833 2 14.6833 2.2625 15.9 2.7875C17.1167 3.3125 18.175 4.025 19.075 4.925C19.975 5.825 20.6875 6.88333 21.2125 8.1C21.7375 9.31667 22 10.6167 22 12C22 13.3833 21.7375 14.6833 21.2125 15.9C20.6875 17.1167 19.975 18.175 19.075 19.075C18.175 19.975 17.1167 20.6875 15.9 21.2125C14.6833 21.7375 13.3833 22 12 22ZM12 20C14.2333 20 16.125 19.225 17.675 17.675C19.225 16.125 20 14.2333 20 12C20 9.76667 19.225 7.875 17.675 6.325C16.125 4.775 14.2333 4 12 4C9.76667 4 7.875 4.775 6.325 6.325C4.775 7.875 4 9.76667 4 12C4 14.2333 4.775 16.125 6.325 17.675C7.875 19.225 9.76667 20 12 20Z" fill="black"/> </svg> |
Подобная запись #alarm_border.Off означает следующее:
a.Нужно найти id alarm_border;
b.С селектором Off;
c.Если удастся найти нужный id и селектор, то к элементу будут применены соответствующие стили из CSS;
d.Данный пример подразумевает регулирование подходящего селектора: Off, Warning, Danger с помощью выпадающего списка в MasterSCADA 4D.
5.Добавим стили для каждого селектора:
Off - мы отключим любую анимацию и обводку.
Warning - активируем анимацию и сделаем обводку оранжевого цвета (orange).
Danger - тоже активируем анимацию, но сделаем обводку красного цвета (red).
Примечание: В SVG у элементов, таких как <rect>, <circle>, <path> и т.д., нет свойства border в том смысле, в котором оно есть в HTML. Вместо этого, для создания контура (рамки) используется атрибут stroke, а для толщины контура - stroke-width.
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <style type="text/css"><![CDATA[ #alarm_border.Off{ stroke: none; } #alarm_border.Warning{ stroke: orange; animation: 1000ms linear 0s infinite normal none running flash; } #alarm_border.Danger{ stroke: red; animation: 1000ms linear 0s infinite normal none running flash; } ]]> </style> <rect id="alarm_border" x="0.5" y="0.5" width="23" height="23"/> <path d="M11 17H13V13H17V11H13V7H11V11H7V13H11V17ZM12 22C10.6167 22 9.31667 21.7375 8.1 21.2125C6.88333 20.6875 5.825 19.975 4.925 19.075C4.025 18.175 3.3125 17.1167 2.7875 15.9C2.2625 14.6833 2 13.3833 2 12C2 10.6167 2.2625 9.31667 2.7875 8.1C3.3125 6.88333 4.025 5.825 4.925 4.925C5.825 4.025 6.88333 3.3125 8.1 2.7875C9.31667 2.2625 10.6167 2 12 2C13.3833 2 14.6833 2.2625 15.9 2.7875C17.1167 3.3125 18.175 4.025 19.075 4.925C19.975 5.825 20.6875 6.88333 21.2125 8.1C21.7375 9.31667 22 10.6167 22 12C22 13.3833 21.7375 14.6833 21.2125 15.9C20.6875 17.1167 19.975 18.175 19.075 19.075C18.175 19.975 17.1167 20.6875 15.9 21.2125C14.6833 21.7375 13.3833 22 12 22ZM12 20C14.2333 20 16.125 19.225 17.675 17.675C19.225 16.125 20 14.2333 20 12C20 9.76667 19.225 7.875 17.675 6.325C16.125 4.775 14.2333 4 12 4C9.76667 4 7.875 4.775 6.325 6.325C4.775 7.875 4 9.76667 4 12C4 14.2333 4.775 16.125 6.325 17.675C7.875 19.225 9.76667 20 12 20Z" fill="black"/> </svg> |
Что означает animation: 1000ms linear 0s infinite normal none running flash?
i.1000ms (animation-duration) - продолжительность анимации. 1000ms означает 1000 миллисекунд, или 1 секунду. Это время, за которое один цикл анимации должен завершиться;
ii.linear (animation-timing-function) - функция анимации. linear обеспечивает равномерное движение без ускорения или замедления. Другие возможные значения: ease, ease-in, ease-out, ease-in-out и т.д.;
iii.0s (animation-delay) - задержка перед началом анимации. 0s означает, что анимация начнется немедленно после применения стилей к элементу. Можно указать положительное значение, чтобы анимация началась через определенное время;
iv.infinite (animation-iteration-count) - количество повторений анимации. infinite означает, что анимация будет повторяться бесконечно, пока стили, содержащие эту анимацию, применяются к элементу. Можно указать числовое значение, чтобы анимация повторилась заданное количество раз;
v.normal (animation-direction) - направление воспроизведения анимации. normal означает, что анимация будет воспроизводиться в прямом порядке (от начала к концу) каждый раз при повторении. Другие возможные значения: reverse, alternate, alternate-reverse;
vi.none (animation-fill-mode) - режим заполнения анимации. none означает, что стили элемента вернутся к исходным значениям после окончания анимации. Другие возможные значения: forwards, backwards, both;
vii.running (animation-play-state) - состояние воспроизведения анимации. running указывает, что анимация должна быть активна. Другое возможное значение: paused;
viii.flash (animation-name): Это имя анимации. flash - это название @keyframes правила, которое определяет последовательность кадров анимации. @keyframes задает, как именно должна выглядеть анимация flash в течение 1 секунды. Именно это имя связывает запись animation: ... flash; с конкретной анимацией.
6.Теперь добавим правило @keyframes, которое полностью повторяет свойство Мигание из MasterSCADA:
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <style type="text/css"><![CDATA[ #alarm_border.Off{ stroke: none; } #alarm_border.Warning{ stroke: orange; animation: 1000ms linear 0s infinite normal none running flash; } #alarm_border.Danger{ stroke: red; animation: 1000ms linear 0s infinite normal none running flash; } @keyframes flash { 0% { opacity: 1; } 50% { opacity: .1; } 100% { opacity: 1; } } ]]> </style> <rect id="alarm_border" x="0.5" y="0.5" width="23" height="23"/> <path d="M11 17H13V13H17V11H13V7H11V11H7V13H11V17ZM12 22C10.6167 22 9.31667 21.7375 8.1 21.2125C6.88333 20.6875 5.825 19.975 4.925 19.075C4.025 18.175 3.3125 17.1167 2.7875 15.9C2.2625 14.6833 2 13.3833 2 12C2 10.6167 2.2625 9.31667 2.7875 8.1C3.3125 6.88333 4.025 5.825 4.925 4.925C5.825 4.025 6.88333 3.3125 8.1 2.7875C9.31667 2.2625 10.6167 2 12 2C13.3833 2 14.6833 2.2625 15.9 2.7875C17.1167 3.3125 18.175 4.025 19.075 4.925C19.975 5.825 20.6875 6.88333 21.2125 8.1C21.7375 9.31667 22 10.6167 22 12C22 13.3833 21.7375 14.6833 21.2125 15.9C20.6875 17.1167 19.975 18.175 19.075 19.075C18.175 19.975 17.1167 20.6875 15.9 21.2125C14.6833 21.7375 13.3833 22 12 22ZM12 20C14.2333 20 16.125 19.225 17.675 17.675C19.225 16.125 20 14.2333 20 12C20 9.76667 19.225 7.875 17.675 6.325C16.125 4.775 14.2333 4 12 4C9.76667 4 7.875 4.775 6.325 6.325C4.775 7.875 4 9.76667 4 12C4 14.2333 4.775 16.125 6.325 17.675C7.875 19.225 9.76667 20 12 20Z" fill="black"/> </svg> |
7.Проведем небольшую отладку SVG:
В rect добавим новый атрибут class и в него запишем значение Warning (class="Warning"), потом Danger (class="Danger"), чтобы убедиться в работоспособности. И оставим class по умолчанию со значением Off (class="Off"), это будет означать состояние по умолчанию для SVG:
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <style type="text/css"><![CDATA[ #alarm_border.Off{ stroke: none; } #alarm_border.Warning{ stroke: orange; animation: 1000ms linear 0s infinite normal none running flash; } #alarm_border.Danger{ stroke: red; animation: 1000ms linear 0s infinite normal none running flash; } @keyframes flash { 0% { opacity: 1; } 50% { opacity: .1; } 100% { opacity: 1; } }
]]> </style> <rect id="alarm_border" class="Off" x="0.5" y="0.5" width="23" height="23"/> <path d="M11 17H13V13H17V11H13V7H11V11H7V13H11V17ZM12 22C10.6167 22 9.31667 21.7375 8.1 21.2125C6.88333 20.6875 5.825 19.975 4.925 19.075C4.025 18.175 3.3125 17.1167 2.7875 15.9C2.2625 14.6833 2 13.3833 2 12C2 10.6167 2.2625 9.31667 2.7875 8.1C3.3125 6.88333 4.025 5.825 4.925 4.925C5.825 4.025 6.88333 3.3125 8.1 2.7875C9.31667 2.2625 10.6167 2 12 2C13.3833 2 14.6833 2.2625 15.9 2.7875C17.1167 3.3125 18.175 4.025 19.075 4.925C19.975 5.825 20.6875 6.88333 21.2125 8.1C21.7375 9.31667 22 10.6167 22 12C22 13.3833 21.7375 14.6833 21.2125 15.9C20.6875 17.1167 19.975 18.175 19.075 19.075C18.175 19.975 17.1167 20.6875 15.9 21.2125C14.6833 21.7375 13.3833 22 12 22ZM12 20C14.2333 20 16.125 19.225 17.675 17.675C19.225 16.125 20 14.2333 20 12C20 9.76667 19.225 7.875 17.675 6.325C16.125 4.775 14.2333 4 12 4C9.76667 4 7.875 4.775 6.325 6.325C4.775 7.875 4 9.76667 4 12C4 14.2333 4.775 16.125 6.325 17.675C7.875 19.225 9.76667 20 12 20Z" fill="black"/> </svg> |
SVG готов, теперь нужно настроить выпадающий список в XML, который будет подставлять нужный селектор: Off, Warning, Danger.
8.Создадим базовый XML. Для этого выполним импорт add_circle_css_alarm.svg в MasterSCADA 4D:
ПК мыши по Окну > Импорт SVG:

Добавим новый параметр нажатием на кнопку Добавить параметр:

Заполним его следующим образом:
Имя параметра |
Id элемента SVG |
Атрибут элемента SVG |
state |
alarm_border |
class |
alarm_border - это название того самого id внутри SVG, который был добавлен в пункте 2.
Нажимаем Применить.

9.Теперь откроем XML: add_circle_css_alarm.xml.
Сейчас в нем используется только один параметр state. Данный параметр нужно расширить до выпадающего списка:
<?xml version="1.0" encoding="utf-8"?> <SvgDef xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" CreateCommonAvary="false"> <ParameterDefs> <ParameterDef DisplayName="state" Type="STRING" ParamType="Attribute" ItemId="alarm_border" Path="class" /> </ParameterDefs> </SvgDef> |
10.После Path="class" уберем лишний слэш "/", чтобы создать полноценный закрывающий тег </ParameterDef>.
Внутри ParameterDef создадим 3 тега Value, каждый из которых обозначает элемент выпадающего списка:
<?xml version="1.0" encoding="utf-8"?> <SvgDef xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" CreateCommonAvary="false"> <ParameterDefs> <ParameterDef DisplayName="state" Type="STRING" ParamType="Attribute" ItemId="alarm_border" Path="class"> <Value DisplayName="Откл">Off</Value> <Value DisplayName="Предупреждение">Warning</Value> <Value DisplayName="Авария">Danger</Value> </ParameterDef> </ParameterDefs> </SvgDef> |
XML готов.
11.Теперь нужно сделать повторный импорт SVG, чтобы обновить свойство state в MasterSCADA.
В окне импорта необходимо нажать Применить, после чего state превратится в выпадающий список:

Внутри него будут три элемента списка: Off, Warning, Danger:

12.Создадим окно и разместим в него выпадающий список и две SVG.
У первой (слева) будет активирована галочка Формировать признак аварии, справа будет SVG, который настроен с помощью CSS:

13.Для выпадающего списка выставим следующие свойства:
•Свойство Список: По умолчанию~Предупреждение~Авария;
•Свойство Выбор: По умолчанию.
Настроим динамизацию выпадающего списка, чтобы он отправлял верные данные в переменную alarm_status:
Источник |
Приемник |
По умолчанию |
0 |
Предупреждение |
1 |
Авария |
2 |

14.Теперь настроим динамизацию SVG от параметра alarm_status в дереве проекта в свойство state:
Источник |
Приемник |
0 |
Off |
1 |
Warning |
2 |
Danger |

Закрываем окно конвертации.
15.Назначаем Окно 5 как стартовое и запускаем проект на исполнение.
SVG готов:

Ссылка на проект, иконки и видео: https://disk.yandex.ru/d/axKlH4-6E8YoRg