Будет ли ОПС реализована в рамках самого ЯГС или путем использования возможностей соответствующей физической станции или другого устройства ввода-вывода, оставляется на усмотрение разработчика.
Функции ОПС и отсечение
Как и для других станций, сегмент заносится в ОПС только в том случае, если ОПС активна в момент его создания. С каждым примитивом при этом связывается прямоугольник отсечения. Если запись «индикатор отсечения» в таблице состояния ЯГС в момент создания сегмента имеет значение ОТСЕКАТЬ, то в качестве прямоугольника отсечения берется прямоугольник отсечения из таблицы состояния ЯГС, в противном случае указывается область [0., 1.] X [0., 1.] в НК-
Функция ВЫВЕСТИ СЕГМЕНТ НА СТАНЦИЮ копирует примитивы из находящегося в ОПС сегмента на заданную графическую станцию. Функция преобразует примитивы в соответствии с преобразованием сегмента и помещает связанные с примитивами прямоугольники отсечения и преобразованные примитивы на видовой конвейер в точку, откуда информация была взята, однако информация посылается только на станцию, заданную в данном конкретном обращении, в соответствии с черт. 9. В момент обращения к функции сегмент не может быть открыт. В отличие от функции СВЯЗАТЬ СЕГМЕНТ СО СТАНЦИЕЙ эта функция не приводит к запоминанию сегмента на станции.
Функция СВЯЗАТЬ СЕГМЕНТ СО СТАНЦИЕЙ копирует сегмент в ППС заданной графической станции таким образом, как это было бы, если бы станция была активной в момент создания сегмента. Прямоугольники отсечения копируются без изменения. К этой функции также нельзя обращаться, когда сегмент открыт.
Функция ВСТАВИТЬ СЕГМЕНТ позволяет преобразовать и вновь включить в поток примитивов вывода примитивы, входящие в записанный в ОПС сегмент. Функция ВСТАВИТЬ СЕГМЕНТ сначала считывает примитивы из сегмента в ОПС, выполняет преобразование включения, после чего засылает их в видовой конвейер в точку, предшествующую точке распределения данных по станциям. Все прямоугольники отсечения во вставляемом сегменте игнорируются. Каждому обрабатываемому примитиву приписывается новый прямоугольник отсечения, который совпадает с прямоугольником отсечения из таблицы состояния ЯГС, если запись «индикатор отсечения» в таблице состояния ЯГС имеет значение ОТСЕКАТЬ и устанавливается равным [0., 1.] X [0., 1.], если «индикатор отсечения» имеет значение БЕЗ ОТСЕЧЕНИЯ. Другими словами, прямоугольники отсечения приписываются вставляемым примитивам точно таким же образом, как и непосредственно генерируемым примитивам. Таким образом, всем примитивам, обработанным одним обращением к функции ВСТАВИТЬ СЕГМЕНТ, приписывается один и тот же прямоугольник отсечения. Внесенная информация может быть снова записана в ОПС, если в этот момент ОПС является активной и сегмент открыт.
Обращение к функции ВСТАВИТЬ СЕГМЕНТ не влияет на примитивы вывода, передаваемые по видовому конвейеру до или после этого обращения. Функция ВСТАВИТЬ СЕГМЕНТ используется в случае, когда сегмент открыт, но сам открытый сегмент не может быть вставлен.
Ввод графических данных
Логические устройства ввода
Прикладная программа получает графические данные от оператора с помощью логических устройств ввода, которые передают значения входных данных программе.
Логические устройства ввода идентифицируются идентификатором станции, классом устройства ввода и номером устройства.
Идентификатор станции определяет открытую графическую станцию, категории ввода или ввода/вывода. Логическое устройство ввода является частью графической станции.
Класс устройств ввода определяет тип входных данных, выдаваемых логическим устройством ввода. Существует шесть классов устройств ввода и соответствующих им типов входных данных:
ВВОД ПОЗИЦИИ: выдает значения координат позиции в системе мировых координат и номер преобразования нормирования;
ВВОД ПОСЛЕДОВАТЕЛЬНОСТИ ПОЗИЦИЙ: выдает последовательность позиций в системе мировых координат и номер преобразования нормирования;
ВВОД ЧИСЛА: выдает действительное число;
ВЫБОР АЛЬТЕРНАТИВЫ: выдает признак ВЫБОР и неотрицательное целое число, определяющее выбор из набора альтернатив;
УКАЗАНИЕ ОБЪЕКТА: выдает признак УКАЗАНИЕ, имя сегмента и идентификатор указания;
ВВОД СТРОКИ: выдает последовательность литер.
Различные логические устройства ввода одного и того же класса одной и той же станции различаются по номеру.
Графическая станция ввода и станция ввода-вывода должны содержать по крайней мере одно логическое устройство ввода. Реализация ЯГС, которая поддерживает, по крайней мере, одну станцию ввода-вывода, должна обеспечить оператора не менее чем одним логическим устройством ввода каждого класса, определенного на данном уровне реализации.
Каждое логическое устройство ввода может работать в трех режимах: ЗАПРОС, ОПРОС, СОБЫТИЕ. В каждый момент времени логическое устройство ввода может находиться в одном и только одном режиме, установленном путем обращения к какой- либо из функций группы ЗАДАТЬ <класс устройства ввода> РЕЖИМ.
В зависимости от режима работы входные данные с устройств получают следующими способами:
ЗАПРОС — каждое обращение к функции ЗАПРОСИТЬ <класс устройства ввода> вызывает попытку чтения значения входных данных с заданного логического устройства ввода, которое должно находиться в режиме ЗАПРОС. Затем ЯГС ожидает пока оператор не введет входные данные или не выполнит команду принудительного прекращения ввода. Действия, выполняемые по команде принудительного прекращения ввода, зависят от конкретного логического устройства ввода и от реализации. Если выход из режима производится вследствие принудительного прекращения ввода, то значение входных данных оказывается неопределенным;
ОПРОС — обращение к функции ОПРОСИТЬ <класс устройства ввода> приводит к тому, что ЯГС, не ожидая действий оператора, выдает текущее значение входных данных с заданного логического устройства ввода, которое должно находиться в режиме ОПРОС;
СОБЫТИЕ — ЯГС поддерживает очередь событий, состоящую из упорядоченных по времени отчетах о событиях. Отчет о событии содержит идентификатор логического устройства ввода и значение входных данных с устройства. Отчет о событиях генерируется асинхронно в результате воздействий оператора на устройства ввода, находящееся в режиме СОБЫТИЕ. Прикладная программа может выбрать из очереди самый «старый» отчет о событии и проанализировать его содержимое, а также удалить из очереди все отчеты о событиях, поступившие от определенного логического устройства ввода.
Логическое устройство ввода осуществляет взаимодействие с оператором в течение времени, пока оно находится в режимах ОПРОС или СОБЫТИЕ, а в режиме ЗАПРОС — только во время выполнения функции ЗАПРОСИТЬ <класс устройства вво- да>.
Несколько устройств, входящих в состав нескольких станций, могут принимать участие во взаимодействиях одновременно.
Модель логического устройства ввода
Для описания действий, выполняемых логическими устройствами ввода, определим их взаимосвязь с физическими устройствами ввода, используя концепции измерений и фиксаторов.
Логическое устройство ввода содержит данные об измерении, фиксаторе, начальном значении, типе подсказки и эха, области эха, а также блок данных, содержащий детальную информацию о типе подсказки и эха. Измерение и фиксатор логического устройства ввода являются частями реализации станции. Начальное значение, тип подсказки и эха, область эха и блок данных могут быть заданы прикладной программой.
Измерение логического устройства ввода представляет собой значение, определяемое одним или несколькими физическими устройствами ввода, вместе с отображением измерения. Одним и тем же физическим устройством ввода может одновременно определяться более чем одно измерение, при этом для каждого измерения задается свое отображение. Измерение может рассматриваться как состояние независимого, активного процесса (процесс измерения). Каждое такое состояние в точности соответствует значению входных данных, поступающих в ЯГС. Процесс измерения существует, пока логическое устройство ввода принимает участие во взаимодействии.
При запуске процесса измерения осуществляется проверка относящихся к данному логическому устройству ввода данных в таблице состояния станции. Прежде всего начальное значение проверяется на допустимость в соответствии с правилами, зависящими от входного класса. Если проверка заканчивается успешно, то в качестве текущего состояния процесса измерения используется начальное значение, в противном случае используется значение, зависящее от применяемого логического устройства ввода. Затем выводится подсказка для указания готовности устройства к использованию. (Форма подсказки для устройства определяется типом подсказки и эха для этого устройства, который может быть выбран путем вызова соответствующей функции ИНИЦИА- .ЛИЗИРОВАТЬ). Этим завершается запуск процесса измерения.
Если процесс измерения сопровождает эхо, оператору досылается информация о текущем состоянии процесса измерения.
Фиксатор логического устройства ввода представляет собой одно или несколько физических устройств ввода вместе с «отображением фиксатора». Фиксатор используется оператором для указания существенных моментов времени. Это моменты, когда фиксатор «срабатывает». Одно действие оператора (например нажатие кнопки или концевого переключателя светового пера) вызывает срабатывание не более одного фиксатора. С одним и тем же фиксатором могут быть связаны несколько логических устройств ввода.
Фиксатор можно .рассматривать как независимый активный процесс (процесс фиксации), который посылает сообщение о срабатывании одному или нескольким получателям. Логическое устройство ввода может быть получателем для своего фиксатора, если оно находится в неудовлетворенном состоянии ЗАПРОС или в режиме СОБЫТИЕ. Оба этих условия могут быть справедливы одновременно для различных логических устройств ввода. Процесс фиксации существует только в том случае, если у фиксатора имеется по крайней мере один получатель, в противном случае процесс не существует.
Если в момент срабатывания фиксатора логическое устройство ввода находится в неудовлетворенном состоянии ЗАПРОС, то значение измерения этого логического устройства ввода используется в качестве результата выполнения операции ЗАПРОС.
Если одно или несколько устройств, содержащие данный фиксатор находятся в режиме СОБЫТИЕ, то при срабатывании фиксатора идентификаторы этих устройств и значения их измерений записываются в очередь событий в виде отдельных отчетов о событиях.
Если срабатывание фиксатора приводит к выполнению операции ЗАПРОС или к добавлению отчетов о событиях в очереди событий, ЯГС оповещает об этом оператора, причем форма оповещения зависит от реализации логического устройства вывода и никак не контролируется функциями ЯГС.
Режимы работы логических устройств ввода
Режим работы логического устройства ввода может быть изменен путем вызова одной из функций ЗАДАТЬ РЕЖИМ <класс устройств ввода >.
После вызова функции ЗАДАТЬ РЕЖИМ <класс устройств ввода> с параметром «режим работы», имеющим значение ЗАПРОС, измерение устройства не выполняется, и идентификатор устройства отсутствует в списке получателей фиксатора устройства.
После вызова функции ЗАДАТЬ РЕЖИМ <класс устройств ввода> с параметром «режим работы», имеющим значение СОБЫТИЕ, запускается процесс измерения данного устройст- sa, и идентификатор устройства присутствует в списке получателей фиксатора устройства.
После вызова функции ЗАДАТЬ РЕЖИМ <класс устройств ввода> с параметром «режим работы», имеющим значение ОПРОС, запускается процесс измерения данного устройства, но идентификатор устройства в списке получателей фиксатора этого устройства не устанавливается.
Первоначально логическое устройство ввода находится в режиме ЗАПРОС.
Пока устройство находится в режиме ЗАПРОС, значение входных данных может быть получено путем обращения к соответствующей функции ЗАПРОСИТЬ < класс устройств ввода >. В результате выполняются следующие действия:
запускается процесс измерения данного устройства, значение входных данных этого устройства устанавливается равным начальному значению из таблицы состояния графической станции (см. п. 2.8.4). Процессом измерения формируется ЭХО, если ЭХО включено для данного устройства;
индикатор устройства добавляется в список получателей фиксатора этого устройства. Если перед этим список был пуст, то процесс фиксации запускается;
выполнение функций ЯГС приостанавливается до тех пор, пока не сработает фиксатор данного устройства или оператор принудительно не прекратит взаимодействие;
если фиксатор сработал, то значение входных данных устанавливается равным значению текущего состояния процесса измерения;
прекращается процесс измерения;
идентификатор устройства удаляется из списка получателей фиксатора этого устройства. Если этот список пуст, то процесс фиксации прекращается;
если фиксатор сработал, то выдается значение входных данных и признак ЕСТЬ. В противном случае выдается признак ОТБОЙ.
Пока логическое устройство находится в режиме ОПРОС, значение входных данных может быть получено путем обращения к функции ОПРОСИТЬ УСТРОЙСТВО <класс устройств ввода >. В результате выполнения этой функции значение входных данных, не ожидая срабатывания фиксатора, устанавливается равным значению текущего состояния процесса измерения.
Пока логическое устройство ввода находится в режиме СОБЫТИЕ, значения входных данных добавляются в виде отчетов о событиях в очередь событий и могут быть получены последовательно путем обращения к функции ОЖИДАТЬ СОБЫТИЕ с последующим обращением к одной из функций ПОЛУЧИТЬ < класс устройств ввода >.