ПрагмаСофтСтудия 2.1

Управление прорисовкой

 

 

Общая информация

Группы в дереве окна Прорисовка, а также в функциях прорисовки окна Функции могут управлять прорисовкой содержащихся в них примитивов.

Для таких групп, при выделении их в деревьях, в окне Свойства отображается группа свойств Прорисовка.

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

 Повторение маски

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

  Без маски

Простая прорисовка примитивов в группе без использования слоя маски, секущей линии или секущего прямоугольника.

  С маской

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

  С инверсной маской
  Новая маска
  Дополнение маски
  Вырезка из маски
  С секущей линией

Примитивы в группе рисуются с учётом линии отсечения.

  С секущим прямоугольником

Примитивы в группе рисуются с учётом прямоугольника отсечения.

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

Управление прорисовкой примитивов в группе основано на использовании 3 механизмов:

Слой маски - это дополнительная поверхность прорисовки, которая используется как трафарет для скрытия части графики в режимах С маской и С инверсной маской. Каждому пикселю на экране соответствует расположенный по тем же координатам пиксель в слое маски. Он может принимать значения 0 и 1. В начале прорисовки слой маски очищается, и все пиксели в нём устанавливаются в значение 0. Режимы Новая маска, Дополнение маски, Вырезка из маски корректируют слой маски. Примитивы в этих режимах прорисовываются не на экран, а в слой маски. При этом пиксели, которые были затронуты при прорисовке установятся в значение 1 ( Новая маска, Дополнение маски) или наоборот будут стёрты и получат значение 0 ( Вырезка из маски). В режимах С маской и С инверсной маской примитивы прорисовываются учитывая текущее состояние слоя маски. Отображены будут только те пиксели, для которых в слое маски установлено значение 1 ( С маской) или значение 0 ( С инверсной маской).

Использование секущей линии и секущего прямоугольника будет описано далее в данной статье.

Давайте рассмотрим каждый режим прорисовки по отдельности.

 

Режимы прорисовки

Повторение маски

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

Режим не изменяет состояние прорисовки группы. Если на момент начала обработки группы действовал какой-либо из остальных имеющихся режимов прорисовки, то он будет действовать и для данной группы. Исключение составляют группы расположенные в окне Прорисовка в корне ветви проекта или одной из задач . Если для них установлен режим прорисовки Повторение маски, то на самом деле будет действовать режим Без маски.

Режим Повторение маски появился не сразу. Он был добавлен после разработки функций прорисовки . Возникла необходимость отображать примитивы, расположенные в группах функции, в каком-то определённом режиме прорисовки, в том, который задан на момент вызова функции.

Предположим, у нас имеется функция прорисовки . Она содержит группу с несколькими примитивами, и для неё задан режимом прорисовки Повторение маски.

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

 

Без маски

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

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

 

С маской

При прорисовке примитивов в группе учитывается состояние слоя маски. На экране будут отображены только те пиксели, образующие тела примитивов находящихся в группе, для которых соответствующие пиксели в слое маски установлены в значение 1. Иначе говоря, на экране отобразятся только те фрагменты, которые пересекаются с нарисованными ранее фрагментами в слое маски.

Предположим мы имеем две группы.

Группа Маска находится в режиме Новая маска. Ее примитив Прямоугольник прорисовывается в слой маски, создавая в нём маску в виде прямоугольника.

Группа Прорисовка находится в режиме С маской. Её окружность и полигон будут прорисованы только в тех местах, в которых они пересеклись с прямоугольником в слое маски. Визуально это будет выглядеть следующим образом.

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

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

 

С инверсной маской

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

На рисунке выше группа Маска находится в режиме Новая маска. Ее примитив Прямоугольник прорисовывается в слой маски, создавая в нём маску в виде прямоугольника.

Группа Прорисовка находится в режиме С инверсной маской. Её окружность и полигон будут прорисованы только в тех местах, в которых они не пересеклись с прямоугольником в слое маски. Визуально это будет выглядеть следующим образом.

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

 

Новая маска

Дополнение маски

В обоих режимах находящиеся в группе примитивы прорисовываются не на экран, а в слой маски. Пиксели, которые при этом будут затронуты, получат значение 1. Для пикселей, уже имеющих значение 1, ничего не изменится.

Данные режимы призваны строить маску. Примитивы своими телами дорисовывают, дополняют конфигурацию маски.

Режим Новая маска отличается от режима Дополнение маски тем, что при встрече в дереве группы с таким режимом прорисовки, происходит очистка слоя маски. Все пиксели маски получают значение 0, и это занимает некоторое время. В связи с этим мы советуем вам использовать режим Новая маска только в случае реальной необходимости. Например, когда требуется на месте уже построенной в ходе данной прорисовки маски создать новую маску. При этом, возможно, более быстрым по скорости прорисовки будет решение использовать перед данной группой группу с режимом Вырезка из маски для очистки не всего, а только части слоя маски, достаточной для создания на её месте новой маски.

 

Вырезка из маски

В данном режиме примитивы в группе прорисовываются не на экран, а в слой маски. Пиксели, которые при этом будут затронуты, получат значение 0. Для пикселей, уже имеющих значение 0, ничего не изменится.

Режим позволяет телами примитивов удалять, вырезать фрагменты из слоя самки.

 

С секущей линией

В случае, если свойство Использование группы установлено в значение С секущей линией, то группа свойств Прорисовка будет выглядеть, как показано на следующем рисунке.

Приведём в таблице описание полей свойств.

Прорисовка

 

  Использование

Значение С секущей линией переводит группу в режим, когда на экране показывается только то, что находится с одной из сторон от линии отсечения. Графика, которая будет создана вложенными в группу примитивами отобразится только с той стороны от линии отсечения, которая противоположна стороне, указанной в поле Сторона.

  Сторона

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

Левая

Секущая линия расположена по вертикали. Отсекается то, что слева от неё.

Правая Секущая линия расположена по вертикали. Отсекается то, что справа от неё.
Верх Секущая линия расположена по горизонтали. Отсекается то, что выше её.
Низ

Секущая линия расположена по горизонтали. Отсекается то, что ниже её.

Координата

Координата, через которую проходит линия отсечения. В зависимости от её ориентации это может быть X или Y координата. Координата, заданная в данном поле свойств, включается в отсекаемую область.

В окне Редактор секущая линия прорисовывается пунктирной оранжево-серой линией. Если группа в дереве выделена, то дополнительно равномерно по всей длине секущей линии размещается пять маркеров .

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

Режим С секущей линией добавляет в дерево в элемент группы пиктограмму .

 

С секущим прямоугольником

В случае, если свойство Использование группы установлено в значение С секущим прямоугольником, то группа свойств Прорисовка будет выглядеть, как показано на следующем рисунке.

Приведём в таблице описание полей свойств.

Прорисовка

 

  Использование

Значение С секущим прямоугольником переводит группу в режим, когда на экране показывается только то, что попало внутрь прямоугольника отсечения. Графика, которая будет создана вложенными в группу примитивами проверяется на попадание в данный прямоугольник. Всё, что окажется за его приделами не будет показано на экране.

  X

Координата левого нижнего угла прямоугольника отсечения по оси X.

Y

Координата левого нижнего угла прямоугольника отсечения по оси Y.

Ширина

Ширина прямоугольника отсечения.

Высота

Высота прямоугольника отсечения.

В окне Редактор секущий прямоугольник выглядит в виде прямоугольника прорисованного пунктирной оранжево-серой линией. Если группа в дереве выделена, то дополнительно в углах прямоугольника появляются два маркера .

Левый нижний маркер позволяет изменить координаты X,Y секущего прямоугольника, а правый верхний - его Ширину и Высоту.

Режим С секущим прямоугольником добавляет в дерево в элемент группы пиктограмму .

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

 

 

Авионика и Софт

forum.aviosoft.ru

 

сборка: 706