Размеры на графике в LabVIEW

Шауэрман Александр А. shamrel@yandex.ru

Меня всегда удивляло отсутствие возможности нанести размеры на график в LabVIEW. Кроме курсоров не удобного инструмента для выделения каких-то участков сигнала, а при создании измерительных приборов (разве это не одно из назначений пакета LabVIEW)? часто нужно указать амплитуду сигнала, размах, обозначить период, длительность фронта, спада и многое другое. Речь идет о стрелках, как на рисунке ниже.

top.png

В LabVIEW у всех стандартных графиков можно добавить фоновое изображение. Есть три слоя. Предлагаю воспользоваться этой возможностью и создать удобный виртуальный прибор (ВП, он же VI) для прорисовки размерных стрелок.

В ЕСКД довольно жестко прописаны толщины линий, пропорции стрелок, но в компьютерных приложениях, где дело приходится иметь с пиксельной графикой, придется хоть и с оглядкой на ГОСТ, но делать так, что бы смотрелось прежде всего эстетично. Поэтому все пропорции и толщины будем задавать в целых значениях пикселей. Из ЕСКД почерпнем, что для нанесения размеров используется собственно размерная линия, ограниченная стрелками и выносные линии. Стрелочки могут быть располагаться как внутри выносных линий, так и снаружи:

type_dimention.png

Наш виртуальный прибор будет добавлять размерную стрелку с заданными параметрами на двумерное изображение. Постараемся создать виртуальный прибор с наибольшей гибкостью, сделав его как можно более универсальным. Однако следует предусмотреть для всех параметров такие значения по умолчанию, чтобы VI было удобно использовать не задавая все параметры.

Что должен уметь наш VI:

  1. Отрисовывать на входное изображения (тип – 2D picture) размерную линию со стрелками.
  2. Менять тип размерной линии: внутренние или внешние стрелки.
  3. Управлять длиной размерной линии.
  4. Менять угол поворота (ориентацию) размерной линии.
  5. Задавать координаты начальной точки построения и режим выравнивания: начальная точка может быть крайней левой, крайней правой или располагаться по середине.
  6. Задавать параметры линии: толщина и стиль.

Я был неприятно удивлен, когда понял, какой скудный инструментарий для работы с 2D рисунками предоставляет стандартный (базовый) комплект LabVIEW. Где масштабирование и вращение объектов? Где отрисовка основных базовых примитивов? Не то, что бы их совсем нет, но хотелось бы большего.

picture_functions.png

Собственно, для отрисовки стрелок можно использовать Draw Line и Draw Multiple Lines. Оба VI принимают на вход изображение и дополняют его результатом своей работы. Первая функция проводит линию из заранее установленной точки (например с помощью функции Move Pen) в указанную точку. На вход этого VI подается координата конечной точки и тип линии. К плюсам этого VI можно отнести, что он умеет работать с относительными координатами (терминал выбора "absolute coordinates?"), в этом режиме задаем приращение по координате X и Y. Существенный минус – каждый отрезок строится отдельным вызовом этой функции. На вход прибора "Draw Multiple Lines" подается массив координат точек, по которым строится ломанная. Также как у "Draw Line" можно задать тип и цвет линии. Однако построение в относительных координатах невозможно, этот несущественный минус можно обойти, если рисовать изображение относительно нулевой точки, а затем сдвинуть его в нужное место.

Для построения будем использовать функцию "Draw Multiple Lines". Итак, нам нужно задать массив координат вершин ломаной. Конечно такой массив можно задать "вручную" в виде набора магических констант, но для того, чтобы сделать гибкую настройку отображения стрелок постараемся создать такой массив параметрически. Однако все же пойду на компромисс с внутренним перфекционистом и позволю себе оставить размер самой стрелочки не настраиваемой. Создам базовое изображение, состоящее из двух отрезков на рисунке ниже координаты точек. Традиционно, первая цифра – это координата Х, вторая – Y. Однако следует учесть, что Х увеличивается вправо, а Y вниз, кроме того, у рисунка точка начала координат располагается в верхнем левом углу, поэтому все точки с отрицательными координатами выходят за границу видимости и не отображаются.

arrow_min.png

На рисунке пунктирными стрелочками показано направление построения. Хотя нам требуется построить всего два отрезка и три точки, в массиве мы должны отразить пять переходов: (0, 0) → (-5, 3) → (0, 0) → (-5, -3) → (0, 0).

arrow_array.png

Простой VI покажет что получилось:

 

exemple1.png

Для того, чтобы галочка попала в видимую область, мне пришлось сместить ее на 10 пикселей по X и Y.

Добавим к стрелке выносные линии и размерную линию. Длины выносных линий будет задавать параметр SerifLen, длину основной линии – параметр ExtLen.

arrow_serif.png

Для построения выносных линий требуется три элемента массива, для построения размерной линии – две. Соединим массивы с помощью функции Build Array, используем режим "Concatenate Inputs" – выбирается в контекстном меню.

exemple2.png

Отлично. Мы получили настраиваемую стрелку. Теперь используя ее мы можем получить изображение размерных линий. Начнем с самого простого: создадим две стрелки на расстоянии DimLen (от английского Dimension Len) и соединим их линией. Левая стрелка должна быть развернута, достигается это умножением всех координат X на -1, но так как у нас стрелка симметрична относительно оси X, то для простоты можно на -1 умножить весь массив. Правую стрелку нужно лишь сместить на расстояние DimLen, для этого ко всем координатам X добавляем параметр DimLen. После манипуляций объединяем массивы:

exemple3.png

Если же правую стрелку вначале инвертировать, и потом сместить, а левую оставить без изменения, то получим другое отображение размеров, тоже часто используемое. Рационально будет выбор режима отображения доверить внешнему сигналу, через селектор типа Enum.

exemple4.png

Добавим возможность менять положение размерной линии. Как перемещать по плоскости я уже говорил: достаточно прибавлять смещение к требуемой координате. А вот с вращением есть определенные сложности. Я не нашел готовой функции в стандартном пакете LabVIEW, но для тех кто помнит аналитическую геометрию (или умеет пользоваться Википедией) проблем возникнуть не должно. На плоскости собственное вращение в прямоугольных декартовых координатах относительно нулевой точки выражается формулами:

gwrcty2.png

h99o29h.png

где φ – угол поворота.

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

exemple5.png

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

example6.png

Контакты ввода-вывода на соединительной панели располагаем таким образом, чтобы было удобно подключать провода в VI верхнего уровня. Выбираем стандартный шаблон 4х2х2х4 – 4 терминала слева, 4 справа и по два сверху и снизу – итого, 12 контактов. Располагаем входные данные (2D Picture In) напротив результата из обработки (2D Picture Out). У меня получилось так:

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

10 февраля 2017
Прикрепленные файлы: 
ВложениеДатаРазмер
Иконка пакета Виртуальный прибор. Размерные стрелки 2D06/02/201740.16 КБ
Орфографическая ошибка в тексте:
Чтобы сообщить об ошибке автору, нажмите кнопку "Отправить сообщение об ошибке". Вы также можете отправить свой комментарий.