SoloScada. Выкатывающаяся и вкатывающаяся тележка выключателя на мнемосхеме

В статье рассказывается про изменение атрибутов графических примитивов во время исполнения. На примере изменения координатов графического элемента (тележки выключателя).

Для этого нам понадобится изображение фидера, включенного и отключенного выключателя.

За положение тележки отвечает переменная telega. За состояние выключателя переменная V_10.

Привяжем включенное и отключенное изображение выключателя к переменной V_10.

Выключатель имеет следующий код (скопировано из редактора):

<g style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 10; fill: none; fill-rule: nonzero; opacity: 1;" transform="translate(0 0)" >

<path d="m 126.62078 245.24079 l 0 7.88433" style="stroke: rgb(102,0,204); stroke-width: 0.51938933; stroke-dasharray: none; stroke-linecap: round; stroke-linejoin: round; stroke-miterlimit: 4; fill: none; fill-rule: nonzero; opacity: 1;" transform=" matrix(1.91 0 0 1.89 -230.88170661014982 -462.4156744418498) " stroke-linecap="round" />

И ещё много разных линий …..

</g>

Видим, что элементы линии сгруппированы и у группы нет свойств х и у, манипулируя которыми мы бы могли перемещать тележку по экрану. Но есть свойство transform, которое отвечает за смещение по осям x и y, а также растягивание.

Почему же мы видим, что смещение translate(0 0) равно нулю, а элемент находится где-то посередине экрана? Это особенность редактора. Чтобы узнать настоящее смещение нужно сохранить схему, проект, заново открыть схему в браузере, открыть исходный код страницы (комбинация клавиш ctrl+U), найти элемент с id V_10_on и V_10_off.

Видим, что у них transform="translate(270.5 293.5)". 270.5 – смещение по оси х, 293.5 - смещение по оси y.

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

Итоговое выражение получилось такое:

"translate("+(data.val.telega*20+270.5)+" 293.5)"

Всю строку берем в кавычки, т.к. в JavaScript transform имеет строковый тип. data.val.telega*20 – если состояние тележки равно 1, то она выкачена, смещаем её вправо на 20 пикселей.

(data.val.telega*20+270.5) – заключаем число в скобки, чтобы интерпретатор JavaScript браузера понял, что это число.

(data.val.telega*20+270.5)+" 293.5)" – получается уже строковое представление трансформации.

Получилось вот так: