Класс UserInteractionVisualTool
В этом разделе
Основные понятия
UserInteractionVisualTool - это базовый класс для визуальных инструментов, которые выполняют взаимодействие между пользователем и интерактивным объектом в
ImageViewer-е с помощью устройств ввода (например, клавиатуры, мыши и т. д.). Класс позволяет реализовать пользовательскую (определяемую пользователем) логику взаимодействия между набором интерактивных объектов и пользователем. Классы, производные от этого класса, представляют собой визуальные инструменты, такие как
AnnotationVisualTool,
RectangularSelectionTool,
CustomSelectionTool.
Основными понятиями модели интерактивного взаимодействия являются:
- Взаимодействие - изменение некоторых свойств объекта (размер, местоположение,...) с помощью устройства ввода (например, клавиатура, мышь и т. д.).
-
Интерактивный объект - объект, реализующий интерфейс IInteractiveObject, с которым можно взаимодействовать в интерактивном режиме.
Интерфейс IInteractiveObject определяет базовые свойства интерактивного объекта, необходимые для организации процесса взаимодействия:
-
Контроллер взаимодействия - объект, определяющий логику связи между некоторыми наборами областей взаимодействия и интерактивным объектом (например контроллер типа RectangularObjectTransformer содержит логику трансформации прямоугольных объектов, а также набор областей взаимодействия, с помощью которых трансформируется текущий объект).
Контроллеры интерактивного взаимодействия реализуют интерфейс IInteractionController, который предоставляет им следующие свойства:
-
Область взаимодействия - некоторая область на объекте, с помощью которой пользователь взаимодействует с интерактивным объектом (например, точка, потянув за которую объект можно растянуть или повернуть). Область взаимодействия может быть как невидимымой (например, область, с помощью которой осуществляется перемещение объекта), так и видимой (например, точка вращения, помощник вращения).
Каждая область взаимодействия является производной от класса InteractionArea и имеет следующие особенности:
-
Визуальный инструмент взаимодействия - класс, производный от класса UserInteractionVisualTool и обеспечивающий следующую функциональность:
- хранение коллекции интерактивных объектов
- отображение интерактивных объектов в просмотрщике изображений
- выбор активного объекта (в данный момент идет взаимодействие)
- отображение областей взаимодействия контроллера активного взаимодействия
- определение активной области и конвертация событий из устройства ввода (например, мышь и т. д.) в события взаимодействия для передачи контроллеру взаимодействия активного объекта.
Основные принципы работы модели взаимодействия
Работу модели взаимодействия можно разделить на 5 этапов:
- Визуальный инструмент взаимодействия получает выбранный объект и считает его активным объектом, визуальный инструмент взаимодействия получает контроллер взаимодействия из активного объекта и считает его активным контроллером взаимодействия.
- Визуальный инструмент взаимодействия выполняет вызов метода UpdateInteractionAreas для активного контроллера взаимодействия и получает список областей взаимодействия, используя свойство InteractionAreas контроллера взаимодействия. Визуальный инструмент взаимодействия отображает области взаимодействия поверх других интерактивных объектов в просмотрщике изображений.
- Визуальный инструмент взаимодействия анализирует события, поступающие от устройств ввода (например, нажатие кнопки мыши, перемещение указателя мыши) и определяет область взаимодействия, с которой работает пользователь. События от устройств ввода преобразуются в события взаимодействия в соответствии с типом области взаимодействия, а затем направляются на активный контроллер взаимодействия с помощью метода IInteractionController.OnInteraction(InteractionEventArgs).
- Контроллер взаимодействия в методе OnInteraction выполняет логику взаимодействия между областью взаимодействия и интерактивным объектом. Например: Интерактивный объект поддерживает вращение, реализуя интерфейс интерактивного объекта, в котором существует свойство RotationAngle. После того, как контроллер получит событие взаимодействия с точкой вращения (точка вращения - область взаимодействия), он рассчитает угол поворота, на который необходимо повернуть объект, и изменит свойство объекта RotationAngle на необходимый угол.
- Когда контроллер взаимодействия изменяет какое-либо свойство, которое изменяет состояние объекта (например, угол поворота), объект генерирует событие StateChanged, на которое подписывается визуальный инструмент взаимодействия. Визуальный инструмент взаимодействия будет выполнять обновление интерактивных областей в контроллере активного взаимодействия, а затем перерисовывать интерактивный объект и интерактивные области в просмотрщике изображений.
Иерархия интерфейсов интерактивных объектов
IInteractiveObject - базовый интерфейс, определяющий общие характеристики всех интерактивных объектов.
IRectangularInteractiveObject - определяет прямоугольный объект, поддерживающий вращение.
IPointBasedInteractiveObject - определяет объект, состоящий из набора точек.
Примечание: Тот факт, что свойства интерактивных объектов описываются иерархией интерфейсов, позволил создать интерактивные объекты, которые могли бы реализовывать сразу несколько интерфейсов интерактивных объектов. Например, объект может поддерживать изменение своих базовых точек (
IPointBasedInteractiveObject), а также изменение его формы (растяжение, сжатие, поворот) с использованием прямоугольного интерфейса объекта (
IRectangularInteractiveObject).
Иерархия контроллеров взаимодействия
Контроллеры взаимодействия для удобства разделены на 2 группы:
- построители - выполняют первоначальную постройку нового объекта
- трансформеры - выполяют трансформацию существующего объекта
IInteractionController - базовый интерфейс, определяющий общие характеристики всех интерактивных контроллеров взаимодействия.
RectangularObjectBuilder - построитель объектов, реализующий интерфейс
IRectangularInteractiveObject.
RectangularObjectTransformer - трансформер объектов, реализующий интерфейс
IRectangularInteractiveObject. Предоставляет возможность перемещать, растягивать, сжимать, вращать объект.
PointBasedObjectPointBuilder - построитель объектов, реализующий интерфейс
IPointBasedInteractiveObject. Предоставляет возможность построить объект, добавляя к нему новые точки по щелчку мыши.
PointBasedObjectFreehandBuilder - построитель объектов, реализующий интерфейс
IPointBasedInteractiveObject. Предоставляет возможность построить объект, добавляя к нему новые точки движением мыши.
PointBasedObjectLineBuilder - построитель объектов, реализующий интерфейс
IPointBasedInteractiveObject. Предоставляет возможность построить объект, состоящий из двух точек (линии).
PointBasedObjectRectangularBuilder - построитель объектов, реализующий интерфейс
IPointBasedInteractiveObject. Предоставляет возможность построить объект путем масштабирования всех его точек.
PointBasedObjectPointTransformer - преобразователь объектов, реализующих интерфейс
IPointBasedInteractiveObject. Предоставляет возможность отмечать, перемещать, удалять, добавлять точки объекта.
PointBasedObjectRectangularTransformer - преобразователь объектов, реализующих интерфейс
IPointBasedInteractiveObject. Предоставляет возможность перемещать, растягивать, сжимать, вращать объект.
PointBasedObjectDistortionTransformer - преобразователь объектов, реализующих [IPointBasedInteractiveObject интерфейс. Предоставляет возможность применять искажения и перекос.
CompositeInteractionController - составной контроллер взаимодействия, который может объединять работу нескольких контроллеров взаимодействия и используется для:
- интегрирования функциональности нескольких контроллеров взаимодействия, которые работают с одним интерактивным объектом
- объединения несколько контроллеров, которые работают с разными интерактивными объектами и таким образом организовать взаимодействие с составным интерактивным объектом.
Иерархия областей взаимодействия
Базовым классом для всех областей взаимодействия является класс
InteractionArea.
Области взаимодействия для удобства разделены на 3 группы:
-
Точки интерактивного объекта:
- InteractionPoint - точка взаимодействия в виде круга, характеризующаяся положением и радиусом. Эта область используется как точка изменения размера объекта в большинстве контроллеров взаимодействия.
- InteractionRectangularPoint - точка взаимодействия в форме прямоугольника, характеризующаяся положением и радиусом.
- InteractionPolygonPoint - точка взаимодействия в форме прямоугольника (производная от InteractionRectangularPoint), характеризующаяся индексом точки объекта, с которой она связана. Эта область используется в контроллерах объектов IPointBasedInteractiveObject для взаимодействия с точками объекта.
- RotationPoint - область взаимодействия, производная от InteractionPoint и используемая для вращения объекта.
- RotationAssistantArea - область взаимодействия, определяющая "помощник вращения" - область в форме круга, разделенного на сектора, с помощью которой можно выполнить поворот объекта на дискретный угол.
-
Области взаимодействия, связанные с интерактивным объектом:
- InteractiveObjectArea - область взаимодействия, совпадающая с областью интерактивного объекта, которая определяется методом "IInteractiveObject.IsPointOnObject(X,Y)". Эта область используется в некоторых контроллерах взаимодействия для задания области, с помощью которой осуществляется изменение положения объекта.
- InteractiveObjectBoundingBoxArea - область взаимодействия, совпадающая с ограничивающим прямоугольником интерактивного объекта. Эта область используется в некоторых контроллерах взаимодействия для задания области, с помощью которой реализуется изменение положения объекта.
- InteractiveObjectBoundingBoxSelection - область взаимодействия, производная от InteractiveObjectBoundingBoxArea. Эта область используется в некоторых контроллерах взаимодействия для обозначения области ограничивающего прямоугольника объекта.
-
Области взаимодействия, связанные с просмотрщиком изображений:
- ImageViewerArea - область, охватывающая весь просмотрщик изображений. Эта область используется в построителях для задания области построения объекта.