Справочник по специальным кодам

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

Второй символ трехсимвольной строки (описание длины вектора) должен быть 0, либо можно указать цифру специального кода. Например, верными будут как код 008, так и код 8.

Специальные коды

Код

Описание

000

Конец определения формы

Режим отрисовки включается в начале каждой формы. При включенном режиме отрисовки (код 1) происходит отрисовка линий, заданных векторами. При отключенном режиме отрисовки (код 2) происходит перенос пера к новой позиции без проведения линии.

001

Включение режима отрисовки (опускание пера)

002

Отключение режима отрисовки (поднятие пера)

003

Деление длин векторов на следующий байт

Высота, указанная при вводе команды ФОРМА, первоначально считается длиной одного ортогонального вектора (в направлении 0, 4, 8 или C). Код 3 делит длину векторов на следующий байт. Код 4 умножает длину векторов на следующий байт. За кодами 3 и 4 следует байт, в котором содержится целочисленный масштабный коэффициент (от 1 до 255).

Если требуется, чтобы высота формы задавала размер всей формы, и для ее прорисовки используется длина векторов 10, можно использовать 3,10 для масштабирования описания высоты. Значение масштабного коэффициента накапливается для формы; то есть, умножение на 2, а потом на 6 дает в результате масштабный коэффициент 12. Обычно необходимо отменить результат применения масштабных коэффициентов в конце формы, в особенности для субформ и шрифтов текста. Программа не выполняет сброс масштабного коэффициента.

004

Умножение длин векторов на следующий байт

005

Занесение текущей позиции в стек

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

Переполнение позиционного стека в форме nnn

Аналогично, если попытаться считать из стека больше значений, чем туда было загружено, при отрисовке формы появляется сообщение:

Потеря значимости позиционного стека в форме nnn

006

Восстановление текущей позиции из стека

007

Отрисовка субформы, номер которой определяется следующим байтом

Для шрифтов, не относящихся к стандарту Unicode, байт описания, следующий за кодом 7, -- номер формы от 1 до 255. Для шрифта Unicode за кодом 7 следует номер формы Unicode в диапазоне от 1 до 65535. Номера форм Unicode считаются как два байта.

Производится отрисовка формы с заданным номером, хранящейся в том же файле. Автоматической установки режима отрисовки для новой формы не происходит. По завершении построения субформы возобновляется отрисовка текущей формы.

008

Смещение по осям X-Y, заданное следующими двумя байтами

Стандартные коды позволяют выполнять отрисовку линий только в 16 фиксированных направлениях, причем максимальная длина вектора равна 15 единиц. Это ограничение повышает эффективность процедуры построения форм, но подчас существенно ограничивает ее возможности. Код 8 определяет смещение по осям X-Y , заданное следующими двумя байтами. За кодом 8 должны следовать два байта в формате:

8,X-displacement,Y-displacement

Значения X-Y-смещений могут находиться в диапазоне от -128 до +127. Указание + перед значением не обязательно, а для улучшения читаемости можно использовать скобки. В следующем примере описывается вектор, соединяющий текущую точку с точкой, отстоящей от нее на 10 единиц влево и на 3 единицы вверх.

8,(-10,3)

После того как вектор по смещению отрисован, восстанавливается режим построения стандартных векторов.

Код 9 используется для последовательности "нестандартных" векторов. После него может следовать любое количество пар значений смещения по X-Y. Последовательность завершается значением (0,0). В следующем примере описывается построение трех нестандартных векторов с последующим возвратом в обычный режим.

9,(3,1),(3,2),(2,-3),(0,0)

Если не завершить последовательность смещений X-Y парой (0,0), программа не сможет правильно трактовать идущие далее векторы нормали и специальные коды.

009

Ряд из нескольких смещений по осям X-Y, оканчивающийся на (0,0)

00A

Октантная дуга, заданная следующими двумя байтами

Дуга называется октантной, так как она стягивает один или несколько 45-градусных октантов, причем начало и конец дуги лежат точно на границах октантов. Октанты нумеруются в направлении против часовой стрелки, начиная с положения "три часа", как показано на следующем рисунке.

Описание дуги имеет вид

10,radius,(-)0SC

Значение параметра "радиус" может быть в диапазоне от 1 до 255. Второй байт описания указывает направление дуги (против часовой стрелки, если значение положительно, и по часовой стрелке, если отрицательно), начальный октант ( s , значение от 0 до 7) и количество охватываемых дугой октантов ( с , значение от 0 до 7, где 0 соответствует восьми октантам или полной окружности). Для удобочитаемости можно использовать круглые скобки. Рассмотрим в качестве примера следующий фрагмент определения формы:

...012,10,(1,-032),01E,...

Отрисовывается единичный вектор вверх-вправо, затем дуга по часовой стрелке (радиусом 1 единица, начиная с октанта 3, с охватом двух октантов), и, наконец, единичный вектор вниз-вправо, как показано на чертеже.

00B

Дробная дуга, заданная следующими пятью байтами

В определении используются 5 байт.

11,start_offset,end_offset,high_radius,radius,(-)0SC

Смещение_начала и смещение_конца задают величины удаления начальной и конечной точек дуги от границ октанта. Радиус_ст - это старшие 8 бит значения радиуса; они остаются нулевыми, если радиус не превышает 255 единиц. Для того чтобы получить значение радиуса дуги, превышающего 255 единиц, нужно умножить радиус_ст на 256 и добавить к полученному числу радиус . Радиус и завершающий байт задаются точно так же, как и для описанной ранее октантной дуги (код 00A).

Смещениеначала определяется путем вычисления разности (в градусах) между начальной границей октанта (кратной 45 градусам) и началом дуги. Затем эта разность умножается на 256 и делится на 45. Если дуга начинается на границе октанта, смещение_начала равно 0.

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

Например, дробная дуга радиусом 3 единицы, проведенная между направлениями 55 и 95 градусов, кодируется так:

11,(56,28,0,3,012)

Пояснение к значениям параметров:

start_offset     = 56 because ((55 - 45) * 256 / 45) = 56 
end_offset       = 28 because ((95 - 90) * 256 / 45) = 28
high_radius      = 0  because (radius < 255) 
radius           = 3 
starting octant  = 1  because arc starts in the 45 degree octant
ending octant    = 2  because arc ends in the 90 degree octant

00C

Дуга, заданная смещением X-Y и прогибом

Они аналогичны кодам 8 и 9 в том отношении, что позволяют задавать смещения по X-Y. Однако, в кодах 00C и 00D отрисовка дуг производится на основании коэффициента прогиба относительно вектора смещения. Код 00C отрисовывает один дуговой сегмент, а код 00D несколько дуговых сегментов (полидуг) до тех пор, пока не последует смещение (0,0).

За кодом 00C должны следовать три байта в формате:

0C,X-displacement,Y-displacement,Bulge

Смещения по X и Y и прогиб, который задает кривизну дуги, могут принимать значения от -127 до +127. Если длина смещения равна D, а стрелка прогиба (т.е. расстояние по нормали от середины вектора смещения до дуги) равна H, коэффициент прогиба определяется как ((2* H / D) * 127). Если дуга рисуется от текущего до нового положения по часовой стрелке, знак будет отрицательным.

Полукруг обладает прогибом 127 (или –127). Это - наибольшая дуга, которую можно построить с использованием этих кодов (более крупные дуги необходимо комбинировать из двух последовательно соединенных сегментов). Нулевым прогибом описывается прямолинейный сегмент. Однако предпочтительнее представлять прямолинейные сегменты кодом 8, т. к. это позволяет сэкономить один байт в описании формы.

За кодом полидуги (00D, или 13) следует 0 или тройки параметров, описывающих элементарные дуговые сегменты. Полидуга заканчивается смещением (0,0). Значение прогиба после нулевого смещения задавать не требуется. Например, букву S можно описать так:

13,(0,5,127),(0,5,-127),(0,0)

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

Использование числа -128 в дуговых сегментах и полидугах не допускается.

00D

Несколько дуг, заданных прогибом

00E

Обработка следующей команды только для вертикального текста

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

В горизонтальном тексте начальной точкой каждого символа является левый конец его базовой линии. В вертикальном тексте начальной точкой является центр верхней линии символа. В конце каждого символа, как правило, выполняется подъем пера и переход к начальной точке следующего символа. В горизонтальном тексте переход происходит вправо, в вертикальном - вниз. Специальный код 00E (14) предназначен прежде всего для учета различий начальных и конечных точек, что позволяет применять одно и то же описание символа как для горизонтальной, так и для вертикальной ориентации текста. Например, следующее описание прописной буквы D может быть использовано в любой ориентации:

*68,22,ucd 
2,14,8,(-2, 6),1,030,012,044,016,038,2,010,1,06C,2,050,
14,8,(-4,-3),0