ChartLib Библиотека деловой и научной графики

Версия 1.03,   май 2001,   © К. В. Воронцов, ММВБ
 

Введение Команды Серии Выражения ChartLib TSliChart CDrawer Интерактивность

Библиотека ChartLib предназначена для построения графиков в пользовательских прикладных программах. Функции библиотеки принимают входной поток данных в формате CHD (CHart Description) и выводят графическое изображение в окно прикладной программы или файл одного из распространённых графических форматов.

Библиотека позволяет строить графики следующих типов

Поддерживаются четыре механизма передачи входных данных Поддерживаются три типа устройств вывода Предлагаются на выбор три уровня использования библиотеки Состав дистрибутива ChartLib для Windows


Введение: входной формат CHD

Введение Команды Серии Выражения ChartLib TSliChart CDrawer Интерактивность

Синтаксис формата CHD

Библиотека ChartLib ориентирована на приём входных данных в виде потока строк формата CHD (CHart Description).

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

Введение: Синтаксис строк данных

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

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

Даты задаются в формате YY[YY]/M[M]/D[D] или D[D]/M[M]/YYYY. Время задаётся в формате hh[:mm[:ss]]. Дата и время отделяются пробелом или знаком подчёркивания. Если задана только дата, время полагается равным 00:00:00. Если задано только время, в качестве даты берётся значение параметра SystemDate или системная (сегодняшняя) дата, если этот параметр не задан. Значения типа дата/время можно также задавать целыми числами, совместимыми с типом time_t языка С, обычно такое число интерпретируется как число секунд, прошедших с полуночи 1 января 1970 года.

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

Введение: Объекты

Библиотека ChartLib оперирует объектами четырёх уровней: Слайды
Основным рабочим объектом является слайд. Слайд - это изображение, которое целиком выводится в пользовательское окно или графический файл.

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

Фильмы
Фильм - это последовательность слайдов. При просмотре слайда в окне пользователь имеет возможность переключаться с одного слайда на другой внутри одного фильма.

Слайд вставляется в фильм командой SetFilm. Слайд не может принадлежать нескольким фильмам одновременно. Внутри фильма слайды располагаются в порядке их создания.

Задать имя фильма можно также при создании слайда командой NewSlide. По умолчанию, если имя фильма не задано, слайд вставляется в фильм с именем default.

Панели на слайдах
Слайд может содержать один или несколько графиков, текстовые поля и легенду. График вместе с примыкающими к нему вспомогательными областями (заголовками, осями и их названиями) образует панель. Каждая панель имеет уникальное имя, которое даётся ей при создании командой NewPanel. Созданная панель сразу становится активной, и в неё направляется входной поток команд. Любую панель можно активизировать по имени или порядковому номеру на слайде командой Panel.

Если на слайде создано несколько панелей, их размещение и относительные размеры задаются командой Group. Без этой команды панели имеют одинаковый размер и размещаются друг под другом.

Использовать команды SetFilm, NewSlide и NewPanel в явном виде не обязательно. Если их не использовать, будет автоматически создан фильм default с единственным слайдом default, содержащий единственную панель с именем default.

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

Области на панелях 2D

Chart Двумерный график - основной объект на панели
Title Заголовок графика, выводимый над графиком
TitleBelow Заголовок графика, выводимый под графиком
XAxis Горизонтальная ось
YAxis Основная вертикальная ось
ZAxis Вторая вертикальная ось. Не изображается, если ни одна точка графика не имеет параметра Z
XName Название горизонтальной оси, размещается внизу
YName Название основной вертикальной оси, размещается вверху слева
ZName Название второй вертикальной оси, размещается вверху справа
TextNear Текстовое поле для надписей внутри точек
TextInner Текстовое поле для надписей рядом с точками
TextRight Текстовое поле для надписи рядом с активной точкой

Области на панелях pie

Chart Круговая диаграмма - основной объект
Title Заголовок над графиком
TitleBelow Заголовок под графиком
TextNear Текстовое поле для надписей рядом с секторами
TextInner Текстовое поле для надписей внутри секторов
TextRight Текстовое поле для надписи рядом с активным сектором

Области на панелях text

Text Текстовое поле - основной объект

Области на слайдах

StatusBar Панель 0 - статусная строка

Введение: Синтаксис управляющих команд

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

Управляющие команды бывают трёх видов:

# имя_объекта . имя_параметра = значение
# имя_параметра = значение
# имя_объекта = значение
В первом случае команда присваивает значение параметру указанного объекта на текущем слайде. Текущий слайд также является объектом. К нему можно обратиться по имени Slide или по имени, данному ему при создании командой NewSlide.

Во втором случае имя объекта опущено, и команда относится к текущему объекту на слайде. Для всех графиков это объект Chart. Если на слайде несколько панелей с графиками, текущим считается объект Chart на панели, активизированной последней командой Panel или NewPanel. Текущая панель также является объектом, и к ней можно обратиться по имени Panel или по имени, данному ей при создании командой NewPanel.

В третьем случае имя параметра опущено, и команда относится к основному свойству объекта. Для заголовков, названий осей и других текстовых объектов основным свойством является Text, для легенды - Line. Например, следующие команды эквивалентны:

#Title.Text = график зависимости
#Title = график зависимости
При поиске объекта по имени сначала просматриваются все объекты текущей панели, затем все объекты текущего слайда. Если объект не найден, команда игнорируется. Описанные правила служат для сокращения записи и позволяют в большинстве случаев обходиться командами "без точки".

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

Знак равенства можно заменять пробелом. Имена команд чувствительны к регистру: например, команда Visible=on верна, а команда visible=on - нет, и будет проигнорирована.

Введение: Пример 1
Достаточно всего двух команд

Формат CHD очень прост, если не заниматься дизайном графика. Для описания графика вполне хватает двух команд NewData и Series, за которыми следуют строки данных.

Команда NewData создаёт новую матрицу данных с заданными столбцами и делает её текущей. Число значений в каждой последующей строке данных должно равняться количеству столбцов в матрице.

Команда Series создаёт серию точек на графике и описывает её свойства, такие как X-координата, Y-координата, цвет, форма точки, и т.д. Каждое свойство может быть либо константой, либо именем столбца данных из какой-либо матрицы текущего слайда. Cвойства точек подробно описаны в разделе Серии.

Следующий график показывает динамику цен и объёмов торгов акциями компании ЛУК ОЙЛ на ММВБ с февраля по ноябрь 1999 года.

Пример графика: Торги акциями ЛУК ОЙЛ, 1999 год

График был построен по входному потоку, содержавшему по 3 значения в каждой строке: дату, цену и объём. Каждая строка соответствовала одному дню. Ниже приводится начальный отрывок входного потока:

#NewData day, price, value
#Series X=day Y=price S=0 LC=1
#Series X=day Z=value S=0 LC=3
28/01/99 25.35 216335
29/01/99 25.68 124938
01/02/99 25.57 10226
...
У этого графика много недостатков: даты отображаются числами, отсутствует заголовок и названия осей, слишком много нулей в метках правой вертикальной оси, и так далее... Таково форматирование графика по умолчанию.

Введение: Пример 2
И всё-таки двух команд не достаточно

Тот же график можно сделать существенно более понятным и привлекательным, если задать фоновую заливку, установить русскую локализацию, добавить заголовки и ещё несколько команд форматирования:
#Locale= rus
#Slide.Background= 17 17 7 7, bidir
#Slide.GradMaxSize= 2
#Title Торги акциями ЛУК ОЙЛ, 1999 год
#YName= цена
#ZName= объём, млн. руб
#XAxis.Type= date
#YAxis.Color= 1
#ZAxis.Color= 3
#NewData day, price, value
#Let vmill= value / 1000000
#Series X=day Y=price S=0 LP=2 LW=2 LC=1
#Series X=day Z=vmill S=0 LP=2 LW=1 LC=3 FD=1 FP=2 FC=15
#Series X=day Z=0 S=0
28/01/99 25.35 216335
29/01/99 25.68 124938
01/02/99 25.57 10226
...
Пример сформатированного графика: Торги акциями ЛУК ОЙЛ, 1999 год

Введение: Пример 3
Несколько графиков на одном слайде

Продолжим пример с графиком хода торгов. Биржевые графики часто рисуют друг под другом: сверху цены, снизу объёмы. Ход цены изображают с помощью интервальных гистограмм или японских подсвечников:

Пример сформатированного графика: Торги акциями ЛУК ОЙЛ, 1999 год

Данные для этого графика те же самые, что и в примерах 1 и 2. Слайд разбивается на две панели командами NewPanel. Команда Group размещает эти панели друг под другом и говорит, что верхняя панель в три раза выше. Команда CandleWidth задаёт ширину японских подсвечников в секундах (здесь это одна неделя).

## определяем данные
#NewData day, price, value
#Let vmill= value / 1000000
#Slide.Background= 17 17 7 7, bidir
#Slide.GradMaxSize= 2

## определяем верхнюю панель цен
#NewPanel price
#Title Торги акциями ЛУК ОЙЛ, 1999 год
#YName= цена
#XAxis.Type= date
#XAxis.Visible off
#Series X=day MC=price MS=2 C=7
#CandleWidth 604800

## определяем нижнюю панель объёмов
#NewPanel volume
#Title.Border 0, 1, 0, 1
#Title.IndentVert 0
#XAxis.Type= date
#XAxis.SpaceVert 1
#XAxis.IndentVert 0
#Series X=day MC=vmill ML=0 MS=3 C=15
#CandleWidth 604800

## располагаем панели друг под другом, синхронизируем оси
#Group (3,1)(1) main= price, volume
#SyncAxis price.XAxis, volume.XAxis

27/01/99 24.85 66913
28/01/99 25.35 216335
29/01/99 25.68 124938
...

Введение: Пример 4
Биржевые торги - необычный ракурс

Можно пойти дальше и задаться целью построить третий график по тем же колонкам данных. Например, это могла бы быть гистограмма распределения объёмов торгов по ценам. Кажется, под таким углом зрения ещё никто не смотрел на биржевые торги:

Пример сформатированного графика: Торги акциями ЛУК ОЙЛ, 1999 год

Создадим ещё одну панель и разместим на ней гистограммную серию. Для построения гистограммы распределения необходимы две дополнительных команды. HorizHist говорит, что гистограмма горизонтальная и каждая точка отображается отдельно внутри столбца. Команда ColWidth задаёт ширину колонки гистограммы.

## определяем данные
#NewData day, price, value
#Let vmill= value / 1000000
#Slide.Background= 17 17 7 7, bidir
#Slide.GradMaxSize= 2

## определяем верхнюю панель цен
#NewPanel price
#Title Торги акциями ЛУК ОЙЛ, 1999 год
#YName= цена
#XAxis.Type= date
#XAxis.SpaceVert 1
#XAxis.IndentVert 0
#XAxis.RulePose both
#Series X=day MC=price MS=2 C=7
#CandleWidth 604800

## определяем нижнюю панель объёмов
#NewPanel volume
#Title.IndentVert 0
#XAxis.Type= date
#XAxis.Visible off
#Series X=day MC=vmill ML=0 MS=3 C=15
#CandleWidth 604800

## определяем правую панель с гистограммой объёмов
#NewPanel hist
#HorizHist= detailed
#ColWidth=5
#YAxis.Visible off
#Series Y=price HW=vmill HS=time C=15

## располагаем панели друг под другом, синхронизируем оси
#Group (3,1)(2,1) main= price, hist, volume
#SyncAxis price.XAxis, volume.XAxis
#SyncAxis price.YAxis, hist.YAxis

27/01/99 24.85 66913
28/01/99 25.35 216335
29/01/99 25.68 124938
...

Введение: Пример 5
Можно обходиться без данных

Точнее, данные можно вычислять по формулам. Например, чтобы построить график функции номального распределения, достаточно всего четырёх строк описания:
#Let x= pointno/5-4
#Let y= FNorm(x)
#ResizeData 40
#Series X=x Y=y
Команда Let создаёт новый столбец данных, значения в котором вычисляются по указанной формуле. Встроенная переменная pointno даёт порядковый номер текущей точки, а команда ResizeData устанавливает число строк в столбцах x и y, то есть число точек на графике.
Вот что в итоге получается:

Пример сформатированного графика: Торги акциями ЛУК ОЙЛ, 1999 год


Управляющие команды

Введение Команды Серии Выражения ChartLib TSliChart CDrawer Интерактивность
Условные обозначения в описаниях команд:


Команды: Общие свойства, применимые ко всем объектам

В этом разделе описаны свойства, которыми обладают все объекты без исключения: слайды, панели, графики, оси, тексты.

Visible = b

Отображать объект. Visible=off скрывает объект.
Совет:
Применяйте команду  #Slide.Visible=off  если хотите, чтобы слайд пропускался при прокрутке фильма.

Color = color

Основной цвет объекта. Параметр color задаёт номер цвета в палитре.

BorderColor = color

Цвет рамки объекта. Параметр color задаёт номер цвета в палитре.

Border = wL [ , wT, wR, wB ]

Толщина рамки объекта. Команда с четырьмя аргументами задаёт толщину 4-х сторон рамки: левой, верхней, правой и нижней соответственно. По умолчанию рамок нет.

Border3D = we, wi

Ширина внешней we и внутренней wi фаски рамки для объёмного эффекта. Если перед шириной поставить минус, то фаска вдавленная, иначе - выпуклая. Сумма we и wi не должна превышать значение Border. По умолчанию объёмный эффект отсутствует: we = wi = 0.

Background = color

Цвет фона объекта. Параметр color задаёт номер цвета в палитре.

Background = LT, TR, RB, BL [ , bidir ]

Отображать фон объекта градиентной заливкой.
Первые четыре параметра задают цвета левого верхнего, правого верхнего, правого нижнего и левого нижнего углов закрашиваемой области соответственно. Эффективность прорисовки выше для вертикального (LT=TR, RB=BL) и горизонтального (TR=RB, BL=LT) градиента.
Необязательный параметр bidir задаёт двустороннюю заливку.

Background = off

Отключить прорисовку фона. Объект изображается поверх имеющегося фона.

Transparency = n

Прозрачность фона; n может принимать вещественные значения от 0 (прозрачный фон) до 1 (непрозрачный). По умолчанию 1. Если для фона задана градиентная заливка, параметр Transparency игнорируется.
Совет:
Применяйте эту команду к объекту TextRight, чтобы задать полупрозрачный транспарант для вывода текстового комментария рядом с активной точкой.

GradMaxSize = n
GradMinCells = n

Параметры эффективности градиентной заливки. Заливка рисуется сеткой из прямоугольных ячеек различных цветов. GradMaxSize задаёт максимальный размер ячейки в пикселах (по умолчанию 20). GradMinCells задаёт минимальное число ячеек (по умолчанию 20).

FontStyle = style

Стиль шрифта текста, style может принимать одно из 8 предопределённых значений: title, name, label, info, inside, near, right, status, либо font1, ..., font9 для пользовательских шрифтов. По умолчанию стиль шрифта устанавливается в соответствии с назначением текстового поля, см. команду DefFont.

IndentHoriz = n

Горизонтальный отступ слева и справа от основного содержимого объекта.

IndentLeft = n
IndentRight = n

Горизонтальный отступ соответственно слева и справа от основного содержимого объекта.

IndentVert = n

Горизонтальный отступ слева и справа от основного содержимого объекта.

IndentTop = n
IndentBottom = n

Вертикальный отступ соответственно слева и справа от основного содержимого объекта.

SpaceHoriz = n

Горизонтальный промежуток между отдельными элементами внутри объекта.

SpaceVert = n

Вертикальный промежуток между отдельными элементами внутри объекта.

MinWidth = len
MinHeight = len

Минимальная ширина и высота области в пикселах. Используется для тонкой настройки расположения осей и текстов на графиках.
Совет:
С помощью команды #ZAxis.MinWidth=10 можно слегка отодвинуть правый край графика от границы слайда.

Style = style_name

Применить к объекту стиль с именем style_name, ранее определёный командой DefStyle.
Пример:  последовательность команд
#DefStyle bsty
    #Background 17
    #Border 2
#EndStyle
#XAxis.Style bsty
эквивалентна командам
#XAxis.Background 17
#XAxis.Border 2
Поскольку все команды по умолчанию направляются на текущий слайд, установка стиля для самого слайда Slide.Style действует как макрос. При этом содержимое стиля исполняется в точности так, как если бы оно было записано вместо этой команды.
Невозможно определить стиль, с помощью которого можно было бы задавать общие свойства как слайду, так и другим объектам. Например, команда
#Slide.Style bsty
изменит свойства Background и Border не для самого слайда, а для объекта Chart, так как для слайда он является текущей областью и все команды "без точки" направляеются именно ему.


Команды: Свойства текстовых полей

К текстовым полям относятся: заголовки графика Title и TitleBelow; названия осей XName, YName, ZName; текстовые поля TextInner, TextRight и TextNear; панели типа text, легенда Legend и статусная строка StatusBar. Текстовые поля могут быть многострочными с заранее заданным разбиением на строки.

Text = text

Выводимый текст. Строки разделяются символом \n. Является основным свойством для текстовых объектов, поэтому следующие команды эквивалентны:
#Title.Text = график синуса
#Title = график синуса

Justify = s

Горизонтальное выравнивание строк текста, s может принимать значения left, center, right.

Shadow = x, y, t, s

Текст отбрасывает тень. Параметры x и y задают смещение тени, число t в диапазоне от 0 до 1 - прозрачность тени (0 соответствует невидимой тени, 1 - полностью непрозрачной). число s - размытость тени в пикселах. По умолчанию t = 0.5, s = 0.
Если x = y = 0 или t = 0, то тень не изображается.


Команды: Свойства легенды

Легенда представляет собой отдельную панель с комментариями. Слева от каждого комментария находится пиктограмма. 
Легенда создаётся командой NewPanel с указанием типа панели legend.

Line = list -text

Задать очередную строку легенды. Строка состоит из пиктограммы, задаваемой списком параметров list и комментария text. В списке list указываются свойства C, W, S, U, TC, LC, LW, LS, LA, FC, FS и их числовые значения аналогично команде Series. Line является основным свойством объекта Legend, поэтому его имя вместе с точкой можно опускать.
Пример:
#Legend  C=5 S=3 W=8 LC=3 LW=2 -Сделки

PlacingStyle = s

Способ размещения строк легенды:
    column - в одну колонку,
    lines - плотно в несколько строк,
    table - таблицей.
При первом способе не умещающиеся в колонку строки отбрасываются. При втором и третьем гарантируется вывод всех строк легенды. По умолчанию table.

PatternWidth = n
PatternHeight = n

Ширина и высота пиктограмм в пикселах, по умолчанию 23 и 8 соответственно.


Команды: Свойства осей

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

Type = type

Тип оси:
    date - по оси откладываются даты;
    time - по оси откладывается время;
    real - числовая ось (по умолчанию).
Тип оси влияет на формат вывода меток и цену деления линейки.

DateTimeRange =  date1, date2, time1, time2

Разрывная горизонтальная ось дат-времени с диапазоном дат date1-date2 и диапазоном времени time1-time2 внутри каждой даты.
Тип такой оси автоматически устанавливается в time, поэтому команду  Type  можно не задавать.
Если свойство графика  Chart.EmptyIntervals  выключено, то будет произведён анализ данных и все интервалы, не содержащие данных, удалятся из оси. По умолчанию это свойство выключено.

Ranges = min1 , max1 [, per1 , n1]   | ... |   minN , maxN [, perN , nN]

Разрывная горизонтальная ось, составленная из N диапазонов. Каждый диапазон - это либо один интервал [min, max], либо серия из n интервалов равной длины, отстоящих друг от друга на величину периода per:
[min,  max],
[min + per,  max + per],
... и так далее до ...
[min + (n-1) per,  max + (n-1) per].
Диапазоны обязаны идти в порядке возрастания, не перекрывая друг друга (значение max + (n-1) per для i-го диапазона не должно превосходить min для (i+1)-го диапазона).
Если свойство графика  Chart.EmptyIntervals  выключено, то будет произведён анализ данных и все интервалы, не содержащие данных, удалятся из оси. По умолчанию это свойство выключено.
Для оси дат-времени тип  Type=time  должен быть установлен перед командой Ranges.

SyncMaster = b

Если off, то масштаб оси является зависимым от масштабов синхронизированных осей. По умолчанию on.
Совет:
Применяйте эту команду в том случае, когда оси двух графиков синхронизированы, но определяющим при выборе масштаба является только первый график. Чтобы точки второго графика не учитывались при масштабировании, задайте для него #SyncMaster=off.

Rule = width, depth, tickext, tickint
Rule = off

Параметры линейки, изображающей шкалу оси. Если один, два или три последних параметра опущены, их значения не меняются. В скобках приводятся значения по умолчанию:
    width - ширина линейки (3); если width<0, то рисуются только деления шкалы;
    depth - глубина линейки (0);
    tickext - внешний выступ тиков (2);
    tickint - внутренний выступ тиков (3).
Второй вариант команды убирает линейку.

RulePose = s

С какой стороны оси изображать линейку, s принимает значения:
    left - слева;
    right - справа;
    top - сверху;
    bottom - снизу;
    both - с обеих сторон.
Для вертикальных осей по умолчанию right, для горизонтальных - top.

RuleColor = color

Цвет линейки. Параметр color задаёт номер цвета в палитре. Цвет текстовых надписей около делений линейки устанавливается командой Color.

SpaceInterv = p

Только для разрывной горизонтальной оси. Максимальная толщина разделителя интервалов в процентах относительно ширины интервала. По умолчанию 4%. Кроме того, толщина разделителя не превышает значения SpaceHoriz для данной оси.

DateFormat = format

Формат вывода дат для оси типа date или разрывной многодневной оси. По умолчанию %#d%b %y. Форматная строка format задаётся с помощью спецификации вывода дат и времени.

LabelFormat = format

Формат вывода меток оси. Если не задан, оптимальный формат подбирается автоматически. Для оси типа real форматная строка format должна содержать одну из спецификаций f, e, E, g, G. Для оси типа time формат задаётся с помощью спецификации вывода дат и времени.
Пример:
Команда LabelFormat=%.2f ограничивает вывод чисел двумя знаками после запятой.

Labels = b

Отображать на оси текстовые метки.

Justify = s

Горизонтальное выравнивание текстовых меток:
    left - влево;
    right - вправо;
    center - по центру;
    auto - оптимальное (по умолчанию).


Команды: Управление потоком данных

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

NewData n = [type1] name1 , ... , [typeN] nameN

Создать новую матрицу данных с именем или номером n, состоящую из N столбцов. Созданная матрица становится текущей. Все строки данных, следующие за этой командой, должны содержать по N значений.
Каждый столбец задаётся своим именем name, перед которым через пробел может быть указан тип хранимых в столбце данных type:
    byte - целые,
    real - вещественные,
    text - текстовые.
Если тип type опущен, предполагается real.
Имя матрицы n может быть опущено, но тогда к ней нельзя будет обратиться по имени в командах Data, ClearData, DeleteData и ResizeData

Data = n

Сделать текущей матрицу данных с именем или номером n. Число значений во всех строках данных, следующих за этой командой, должно быть равно числу столбцов в матрице n.
Совет:
Если на Вашем слайде несколько матриц, и строки данных поступают вперемежку, используйте команду Data.

ClearData = n

Очистить матрицу с именем или номером n. Число строк в матрице становится равным нулю, число и типы столбцов сохраняются.
Если имя опущено, очищается текущая матрица.

DeleteData = n

Удалить все столбцы данных (включая выражения, заданные командой Let) в матрице с именем или номером n. Данный способ очистки является более радикальным по сравнению с ClearData.
Если имя опущено, очищается текущая матрица.

Let [type] name = expr

Создать в текущей матрице столбец данных с именем name и типом type, вычисляющийся по выражению expr. Выражения могут содержать в качестве переменных имена столбцов матриц данных, определённых на текущем или любом другом слайде (в последнем случае перед именем столбца через точку записывается имя слайда). Если тип опущен и не определяется однозначно по типу выражения, предполагается real.
Вычислимый столбец не содержится в исходных данных и не хранится в памяти, а вычисляется для каждой точки по заданному выражению expr.
Совет:
Чтобы взять столбец данных из другого слайда, используйте в качестве имени переменной конструкцию slide.name, где slide - имя слайда. Альтернативный способ: после команды #DataSlide=slide к столбцам указанного слайда можно обращаться без явного указания имени слайда и точки.

ResizeData n rows

Задать число строк в матрице с именем или номером n равным rows. Обычно число строк в матрице определяется автоматически по мере поступления строк данных. Команда ResizeData необходима только в том случае, когда все векторы в матрице были созданы командой Let и являются вычислимыми.
Если имя матрицы n опущено, команда применяется к текущей матрице.


Команды: Свойства двумерных графиков и гистограмм

График состоит из серий. Серия состоит из точек. Каждая точка имеет около 50 свойств. Обычно большинство свойств задаются константами или вообще опускаются. В таком случае они фактически являются свойствами серии.
Серия не является самостоятельным объектом. Все команды, перечисленные в настоящем разделе, являются свойствами объекта Chart на панелях типа 2D.

Series name : property1=value1 , ... , propertyN=valueN

Создать на графике новую серию точек с именем name и набором свойств property1, ... , propertyN. Каждое свойство серии задаётся одно- или двух-буквенным именем property и значением value. Значением может быть либо имя столбца данных, либо числовая константа. Можно указывать имя столбца данных с другого слайда с помощью конструкции slide.name, где slide - имя слайда, из которого берётся столбец данных. Имя серии name может быть опущено.
Подробное описание команды Series с полным перечнем свойств см. здесь.

SeriesModify name : property1=value1 , ... , propertyN=valueN

Изменение одного или нескольких свойств ранее определённой серии. Список свойств имеет такой же синтаксис, как и в команде Series. Если имя name опущено, подразумевается последняя созданная серия.

SeriesOn = name
SeriesOff = name

Две команды соответственно включают и отключают отображение серии с именем n. Если имя опущено, подразумевается последняя созданная серия.

ExtraX = min [, max]
ExtraY = min [, max]
ExtraZ = min [, max]

Дополнительный отступ слева и справа по горизонтальной оси. Числа min и max задаются в процентах от ширины графика. Если max опущен, полагается min = max. По умолчанию отступы отсутствуют.

CandleWidth = n

Ширина свечей на биржевых графиках (в секундах). Значение n может задаваться в форматах времени:
    чч:мм:сс
    чч:мм
а также в виде числа дней, недель, месяцев или лет:
    n days
    n weeks
    n months
    n years
По умолчанию CandleWidth=00:05:00.

CandleBase = n

Базовая точка отсчёта свечей на биржевых графиках. Значение n может задаваться в формате дат-времени. По умолчанию 0.
Совет:
Задавайте этот параметр равным произвольному понедельнику на недельных свечных графиках, иначе все свечи будут начинаться в четверг.
Задавайте этот параметр равным первому дню произвольного месяца при построении месячных графиков.

ZoomX = x1, x2
ZoomX = min, x
ZoomX = max, x
ZoomX = max

Задать интервал оси X, в котором просматривается график, одним из 4 способов соответственно:
    [x1, x2] - заданы обе границы интервала;
    [min, min+x] - задана длина начальной части;
    [max-x, max] - задана длина конечной части;
    [min, max] - вместить все точки графика.
Координаты x1, x2, x можно задавать в процентах относительно длины (max-min). Для этого перед координатой ставится символ %. Пример: выдать среднюю треть графика ZoomX = %33, %67.
После загрузки слайда для всех графиков по умолчанию устанавливается ZoomX = %0, %100.

ZoomY
ZoomZ

Команды для осей Y и Z, аналогичные ZoomX.

SyncYZ = y0, z0
SyncYZ = max
SyncYZ = off

Синхронизировать масштабирование по осям Z и Y. Если AutoScaleZ>0, параметр SyncZY игнорируется. По умолчанию max.
В первом варианте команды координата y0 по оси Y совмещается с координатой z0 по оси Z.
Во втором варианте совмещаются максимальные интервалы, в которых находятся все точки графика.
Третий вариант отключает синхронизацию.

EmptyIntervals = b

Включать пустые интервалы, не содержащие точек, в разрывную ось X (разрывные оси формируются командами Ranges и DateTimeRange). Игнорируется, если ось X не является разрывной. По умолчанию off.

AutoScaleX = s
AutoScaleY = s
AutoScaleZ = s

Режим автоматического масштабирования по осям X, Y и Z соответственно. В режиме автомасштабирования масштаб по оси устанавливается так, чтобы видны были все или почти все (за исключеним "далёких выбросов") точки графика. Параметр s принимает значения:
    off - без автомасштабирования (по умолчанию);
    max - интервал, в котором видны все точки;
    robust - интервал, в котором могут быть не видны далеко отстоящие точки, см. RobustPoints и RobustLimit;
    var - интервал равен среднему квадратичному отклонению, помноженному на RobustFactor.
Автомасштабирование производится по всем точкам со свойством U=8 и по всем точкам с U=16, имеющим размер. Автомасштабирование не может производиться по вертикальной и горизонтальной оси одновременно.
Для гистограмм с вертикальными столбцами работает только AutoScaleX, с горизонтальными - только AutoScaleY.

RobustPoints = n
RobustLimit = n

Параметры, используемые при отбрасывании точек в режиме масштабирования AutoScale = robust. Далеко отстоящими считаются не более RobustPoints точек при условии, что они отстоят от ближайшей точки на расстояние не менее (Max-Min)*RobustLimit. Параметр распространяется на все оси. По умолчанию RobustPoints=2, RobustLimit=0.5.

RobustFactor = n

Параметр, используемый при отбрасывании точек в режиме масштабирования AutoScale = var. Далеко отстоящими считаются точки, находящиеся от среднего арифметического, вычисленного по всем точкам, на расстоянии более Var * RobustFactor, где Var - среднее квадратичное отклонение. Действие параметра распространяется на все три оси. По умолчанию 2.

VGrid = n

Вид вертикальной сетки. Если n<0, сетка не изображается. Если n=0, сетка рисуется сплошными линиями. Если n>0, сетка рисуется штрихами длины n в узлах сетки. По умолчанию 0.

HGrid = n

Вид горизонтальной сетки. Команда аналогична VGrid.

GridOverFills = b

Рисовать линии сетки поверх заливок. По умолчанию on.

GridColor = color

Цвет линий сетки. Параметр color задаёт номер цвета в палитре.

SelectColor = color

Цвет выделенных точек, по умолчанию белый. Параметр color задаёт номер цвета в палитре.

ActiveColor = color

Цвет активной точки, по умолчанию жёлтый. Параметр color задаёт номер цвета в палитре.

HighlightColor = color

Цвет подсветки точки при указании на неё курсором мыши, по умолчанию жёлтый. Параметр color задаёт номер цвета в палитре.

ShowTN = s

Режим вывода текстов TN рядом с точками:
    never - не выводятся для всех точек;
    always - выводятся для всех точек;
    last - только для последней точки серии;
    select - только для выделенных точек.
По умолчанию в интерактивном режиме select, в не интерактивном - always.

PoseTN = s

Расположение текста TN рядом с точками:
    off - не выводить;
    left - слева от точки;
    right - справа от точки;
    up - сверху от точки;
    down - снизу от точки.
По умолчанию right. Если комментарий не влезает в область графика, расположение текста может быть автоматически изменено.

ShowLN = s

Режим вывода текстов LN рядом с линиями. Принимает те же значения, что и параметр ShowTN. По умолчанию never.

TableTitle = text

Заголовок сводной таблицы выделенных точек, состоящий из заголовков столбцов, разделяемых символом ";". По умолчанию ";Info". Если заголовок начинается с символа-разделителя ";", то в первую колонку таблицы выводятся номера строк.

ArrowSize = n
ArrowAngle = n

Параметры стрелок для отрезков со свойством LA. Задают размер и угол (в градусах) крыльев стрелки соответственно. По умолчанию 10 и 10.

StatusOnMouseMove = expr

Статусная строка, выводимая при перемещении курсора мыши на графике. Строка со вставками expr может содержать имена столбцов данных, а также переменные CoordX, CoordY, CoordZ, CoordXText, CoordYText, CoordZText, обозначающие текущее положение курсора в реальных координатах.
По умолчанию
StatusOnMouseMove = "[CoordXText]; [CoordYText]"
Команда StatusOnMouseMove должна идти непосредственно после описания серии (командой Series), к X-координатам точек которой привязывается выводимая информация.

StatusOnMouseDrag = expr

Статусная строка, выводимая при выделении мышью прямоугольной области на графике. Строка со вставками expr может содержать имена столбцов данных, те же переменные, что и в команде StatusOnMouseMove, а также переменные CoordXStart, CoordYStart, CoordXStartText, CoordYStartText, обозначающие начальное положение курсора в реальных координатах.
По умолчанию
StatusOnMouseDrag = "[CoordXStartText] -- [CoordXText];  [CoordYStartText] -- [CoordYText]"
Команда StatusOnMouseDrag должна идти непосредственно после описания серии (командой Series), к X-координатам точек которой привязывается выводимая информация.


Команды: Свойства гистограмм

Все команды, перечисленные в настоящем разделе, так же, как и в предыдущем, являются свойствами объекта Chart на панелях типа 2D. Они работают только в том случае, если на графике присутствуют гистограммные серии точек.

VertHist = type

Тип вертикальной гистограммы, значение type должно быть одним из следующих:
    simple - простая гистограмма со столбцами одного или разных цветов;
    detailed - детальная гистограмма, столбцы состоят из отдельных точек разного цвета;
    pie - круговая диаграмма;
    piedetailed - круговая диаграмма с секторами, состоящими из отдельных точек разного цвета.

HorizHist = type

Тип горизонтальной гистограммы. Параметр аналогичен VertHist.

nCols = n
nPointsPerCol = n
ColWidth = n

Три альтернативных способа задать разбиение диапазона значений на колонки. По умолчанию используется nCols=15.
    nCols - число колонок гистограммы;
    nPointsPerCol - среднее число точек в колонке;
    ColWidth - ширина колонок.

ColumnsThickness = n

Толщина колонок в процентах относительно расстояния между соседними колонками.

AverageColors = b

Если включено, цвет каждой колонки гистограммы вычисляется как средневзвешенное цветов составляющих её точек.

OutlineColumns = b

Если включено, то для гистограмм типа detailed и piedetailed каждая колонка (сектор) гистограммы обводится рамкой.


Команды: Параметры трёхмерных изображений

Все команды данного раздела являются свойствами панели типа 3D.

ViewTheta = f

Параметр исходного расположения сцены. Угол взгляда (в градусах от -180 до +180) вдоль меридиана.

ViewFi = f

Параметр исходного расположения сцены. Угол взгляда (в градусах от -180 до +180) вдоль параллели.

ViewPersp = f

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

ViewScaleX = f
ViewScaleY = f
ViewScaleZ = f

Параметры исходного расположения сцены. Коэффициенты растяжения сцены по трём осям.


Команды: Управление слайдами и фильмами

Команды, работающие со слайдами и фильмами, не являются свойствами какого-либо объекта. Это глобальные команды.

NewSlide = name

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

NewSlide

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

Slide = nslide

Активизировать (сделать текущим) слайд, указанный параметром nslide. Последующие команды и строки данных будут относиться именно к этому слайду. Слайд должен быть предварительно создан командой NewSlide. Если указанный слайд не существует, команда игнорируется.
Параметр nslide принимает следующие значения:
name @ film  слайд с именем name в фильме film;
n @ film     слайд с номером n;
<< @ film    первый слайд;
>> @ film    последний слайд;
< n         слайд с номером, на n меньшим номера текущего слайда;
> n         слайд с номером, на n большим номера текущего слайда;
<          предыдущий слайд;
>           следующий слайд;
Имя фильма можно опускать. Если оно не указано, имеется в виду текущий фильм. Невозможно перемещаться по слайдам в фильме с именем default, так как от отведён под отдельные слайды.

SlideMove = nslide

Поставить текущий слайд перед слайдом, расположение которого задано параметром nslide. Этот параметр принимает все те же значения, что и параметр команды Slide.

DataSlide = nslide
DataSlide off

Установить связь с источником данных на другом слайде. После этого команды LetиSeries могут обращаться к столбцам данных на слайде nslide как к своим собственным, не используя имён с точкой. Параметр nslide принимает все те же значения, что и параметр команды Slide.
Второй вариант команды разрывает связь с источником данных.

ClearSlide

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

DeleteSlide

Удалить текущий слайд, уничтожив все его данные, панели, параметры форматирования, и исключив его из текущего фильма. Эта команда действует более радикально, чем ClearSlide.

SetFilm = name

Изъять слайд из текущего фильма и включить его в фильм с именем name. По умолчанию до команды SetFilm слайд принадлежит фильму default.

DeleteFilm = name

Удалить фильм с именем name и все его слайды. Если имя name опущено, удаляется фильм, которому принадлежит текущий слайд. Если фильма с именем name не существует, команда игнорируется.


Команды: Панели на слайдах

Команды, описанные в этом разделе, применяются к слайду. Они позволяют компоновать слайд из отдельных панелей с графиками или текстовыми комментариями.

NewPanel n [ : type ]

Создать на слайде панель типа type с именем или номером n.  Допустимые типы панелей:
    2D - двумерный график или гистограмма;
    3D - трёхмерный точечный график;
    pie - круговая диаграмма;
    text - текстовый комментарий;
    legend - легенда.
Если тип опущен, предполагается 2D.
По умолчанию на слайде есть одна панель с именем default, номером 1 и типом 2D. Первая команда NewPanel заменяет её новой панелью.
Если панель с именем n уже существует, она уничтожается и заменяется новой.

Panel = n

Активизировать на слайде панель с именем или порядковым номером n. Все последующие команды и строки данных будут формировать указанную панель.
Панели нумеруются начиная с 0 в порядке их создания на текущем слайде. Панели с номерами 0 и 1 зарезервированы для статусной строки и легенды.

Group (hrows) (wcols)  group = panels

Сгруппировать панели и группы, перечисленные в списке panels, в группу с именем group. Панели располагаются прямоугольной таблицей слева направо, сверху вниз. Строки таблицы имеют относительные высоты, указанные в списке чисел hrows. Столбцы имеют относительные ширины, указанные в списке wcols.

Пример: команда

#Group (2,1)(2,1,1) gr5 = p1, p2, p3, p4, p5
группирует панели p1, p2, p3, p4, p5 в группу gr5:
 
p1
p2
p3
p4
p5

Если слайд имеет несколько панелей, а команда Group отсутствует, по умолчанию применяется вертикальное группирование Group (1,...,1)(1).

SyncAxis = panel1.axis1 , ... ,  panelN.axisN

Синхронизировать N осей, находящихся на панелях panel1 , ... ,  panelN. Именами осей axis1 , ... ,  axisN могут быть XAxis, YAxis или ZAxis. После синхронизации масштабирование одного из графиков автоматически масштабирует остальные. Команды Zoom и Type действуют на все синхронизированные оси; остальные команды воспринимаются синхронизированными осями индивидуально. Нельзя синхронизировать горизонтальную ось с вертикальной.

TitlePose = s

Положение верхнего заголовка на текущей панели:
    normal - над названиями осей Y и Z,
    econom - экономно (между названиями осей).

TitleBelowPose = s

Положение нижнего заголовка на текущей панели:
    normal - под названием оси X,
    econom - экономно (рядом с названием оси X).

XNamePose = s

Положение названия оси X на текущей панели:
    left - слева,
    right - справа,
    left-econom - слева рядом с делениями оси Х,
    right-econom - экономно справа (по умолчанию).

About = text

Текст, выводимый в статусную строку по окончании размещения слайда.


Команды: Параметры интерактивного режима

Параметры интерактивного режима не являются свойствами какого-либо объекта. Это глобальные команды.

SelectShape = s

Форма выделителя точек, s принимает значения:
    no - нельзя выделять области, только отдельные точки
    rect - прямоугольник (по умолчанию);
    ellipse - эллипс;
    half - полуплоскость;
    strip - полоса.

SelectMode = s

Режим выделения:
    no - нельзя выделять ни области, ни отдельные точки
    add - выделять точки;
    sub - снимать выделение точек;
    xor - менять выделение точек (по умолчанию).

SelectOutside = b

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

Cursor = s

Форма курсора, отмечающего текущее положение мыши:
    off - курсор не выводится (по умолчанию);
    cross - пунктирный крест;
    ticks - отметки по бокам графика.

DrawBlockSize = n

Размер блока при фоновой прорисовке. По умолчанию 100.
Совет:
Если прорисовка графика в окне замедляет работу других приложений, значение этого параметра надо уменьшить.


Команды: Глобальные параметры

Глобальные параметры не являются свойствами какого-либо объекта. Их действие распространяется на все объекты, в том числе на все слайды.

DefColor color = R, G, B

Добавить в палитру цвет с номером color, заданный триплетом Красный, Зелёный, Синий. Если color<27, команда изменяет стандартный предопределённый цвет.

DefFont style = library : family,  width x height,  flags, angle

Установка стиля шрифта style. Значение style должно быть либо именем стандартного стиля, либо номером шрифта в палитре шрифтов. По умолчанию в палитре определены 8 стандартных шрифтов с номерами 1-8 и оставлено место для определения 9 пользовательских:
    1 = title - шрифт для заголовка,
    2 = name - шрифт для названий осей,
    3 = label - шрифт для меток осей,
    4 = info - шрифт для надписей на графике,
    5 = inside - шрифт для надписей внутри точек TI,
    6 = near - шрифт для надписей около точек TN,
    7 = right - шрифт для комментария TR,
    8 = status - шрифт для статусной строки,
    9 = font1 - шрифт, определяемый пользователем,
    ...
    17 = font9 - шрифт, определяемый пользователем.

library
Имя шрифтовой библиотеки, зависящее от операционной системы и текущей реализации ChartLib. В настоящей версии поддерживаются две библиотеки шрифтов:
    Win - шрифты Windows, используемые при рисование в окно и файлы EMF или BMP;
    GdFont - шрифты, используемые при формировании файлов GIF.
Каждому стилю style соответствует определённый шрифт в каждой библиотеке library. Параметр не может быть опущен.

family
Название семейства шрифта, принятое в данной шрифтовой библиотеке library.

width
Ширина символов в пикселах. Если параметр width опущен или равен нулю, выбирается пропорциональный шрифт.

height
Высота символов в пикселах.

flags
Флаги дополнительных свойств шрифта, кодируемые буквами:
    B - жирный,
    b - полужирный,
    I - наклонный,
    U - подчёркнутый,
    S - перечёркнутый.
Если параметр flags опущен, выбирается нормальный шрифт.

angle
Угол поворота шрифта в градусах против часовой стрелки. Если опущен, то 0 - текст располагается горизонтально слева направо.

Пример:

#DefFont  title = Win: Times New Roman, 8x20, BI
#DefFont  title = GdFont: Courier, 9x15, BI

DefStyle = style_name

Начать определение стиля с именем style_name. Все последующие команды вплоть до первой EndStyle или DefStyle будут не исполняться, а запоминаться в списке команд стиля.
Запомненный список команд (стиль) может быть применён в дальнейшем к любой области, в том числе к слайду, с помощью команды Style.

EndStyle

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

Syntax = usage1 {symbols1} ... usageN {symbolsN}

Установить синтаксис входного потока данных. Каждому символу строки symbolsi назначается роль usagei. Роли задаются однобуквенными кодами:
    C - допустимые символы начала управляющей команды
    N - допустимые символы-разделители десятичных знаков в числах
    T - допустимые символы-разделители часов-минут-секунд
    D - допустимые символы-разделители дня-месяца-года
    F - допустимые символы-разделители полей в строках данных
    Q - два символа для левой и правой кавычки в строках данных
В строках symbolsi разрешается указывать непечатные спецсимволы.
По умолчанию входной синтаксис задан командой
#Syntax = C{#} N{.} T{:} D{/} Q{""} F{\t,}

Locale = text

Установить локализацию (установки страны и языка) по правилам функции setlocale языка C. Строка описания text может принимать значения eng, rus, american, deu, fra, и другие. Данная команда влияет только на формат вывода чисел и дат. Формат ввода устанавливается командой Syntax.
 

Encoding = char

Указывает кодировку входного потока строк. Символ char может принимать только 4 значения:
    W - кодировка Windows CP-1251,
    D - кодировка DOS альтернативная,
    K - кодировка KOI-8,
    I - кодировка ISO-8859-5.
Если параметр не задан, строки входного потока не перекодируются.

OutEncoding = char

Указывает выходную кодировку при формировании таблиц и выдаче информации о точках графика. По умолчанию W.

SystemDate = date
SystemDate = today

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

Include filename

Включить во входной поток строк содержимое текстового файла формата CHD с именем filename.


Команды: Средства отладки

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

DumpFile  [ filename ]

Устанавливает имя отладочного файла, в который выводится вся информация отладочными командами Dump***. Если имя файла опущено, все последующие отладочные команды будут игнорироваться. Имя отладочного файла может совпадать с именем файла-протокола ошибок, устанавленного с помощью интерфейсной функции CL_WorkDebug.

DumpData  expr

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

DumpDataStructure

Выводит в отладочный файл информацию о всех векторах во всех матрицах данных на текущем слайде.

DumpSeriesStructure

Выводит в отладочный файл информацию о всех векторах во всех сериях точек текущего графика.

DumpSlideStructure

Выводит в отладочный файл информацию о всех областях на текущем слайде.

DumpSlidesList

Выводит в отладочный файл список всех доступных слайдов.

DumpPcode  expr

Выводит в отладочный файл результат компиляции (псевдокод) выражения expr.

EchoFile  [ filename ]

Включить копирование входного потока строк в файл с именем filename. Если имя файла опущено, эхо будет отключено.

Echo str

Выводит в файл-протокол строку str. Строку не надо заключать в кавычки.


Команды: Устаревшие команды

Эти команды являются свойствами объекта Chart на панелях типа 2D. Все они связаны с командой Format, работавшей в ранних версиях библиотеки.
Все эти команды, а также свойства серий DR, DB, DT в дальнейшем могут не поддерживаться.

Format = format

Форматная строка format задаёт структуру одной или нескольких серий точек и определяет состав столбцов матрицы данных. Если текущая матрица данных уже содержит столбцы, то создаётся новая матрица.

Управляющая команда Format совмещает в себе команды NewData, Let и Series. По причине своей крайней перегруженности она не будет поддерживаться в следующих версиях библиотеки. С ней тесно связаны команды Matrix, MatrixClear, MatrixEnable и SeriesSize также считающиеся устаревшими. Вместо них рекомендуется использовать команды NewData, Data, ClearData, ResizeData, SeriesOn и SeriesOff.

Команда Format задаёт свойства серий с помощью списка свойств так же, как это делает команда Series, но со следующими отличиями:

Команда Format сокращает число необходимых команд, но делает описание графика менее удобочитаемым. Например, следующие два описания строят один и тот же график:

Описание 1

#Let x= pointno/10-4
#Let y= exp(-x^2/2)
#Let z= FNorm(x)
#Series p: X=x Y=y S=0 LC=13 LW=2
#Series f: X=x Z=z S=0 LC=33 LW=2
#SeriesSize 80: f, p
Описание 2
#Format X=(pointno/10-4) Y=(exp(-X^2/2)) S=0 LC=13 LW=2 ...
    \ Z=(FNorm(X)) S=0 LC=33 LW=2
#SeriesSize 80

SeriesSize = size:  name1 , ... , nameN

Установить число точек в сериях с именами name1 , ... , nameN равным size. Обычно число точек определяется автоматически при чтении входного потока данных. Команда нужна только в том случае, когда все свойства указанных серий заданы константами или вычислимыми столбцами данных.
Если список серий опущен, берётся последняя созданная серия.

Matrix = n
Matrix = name

Активизировать матрицу данных с номером n или именем name. Если такой матрицы ещё нет, она будет создана. Все последующие строки данных вплоть до другой команды Matrix или Format будут направляться в данную матрицу. Нумерация матриц начинается с нуля. Имя команды Matrix можно сокращать до одной буквы M.

MatrixClear [ = n]

Очистить матрицу данных с номером или именем n. Если имя или номер не указаны, очищается активная на данный момент матрица. Команда удаляет только данные, не затрагивая форматы. Используется для переформирования графика.
Команда MatrixClear действует только на имеющиеся в данный момент серии, поэтому она должна даваться после команды Format.

MatrixEnable = [ n, ] b

Показать или спрятать все серии точек, хранящиеся в матрице с номером или именем n. Если имя или номер не указаны, команда относится к активной матрице. В отличие от MatrixClear, установка MatrixEnable = off не уничтожает данные, а только убирает соответствующие серии точек с графика. По умолчанию on.
Команда MatrixEnable действует только на имеющиеся в данный момент серии, поэтому она должна даваться после команды Format.


Команды: Палитра цветов

Цвет любого объекта на слайде задаётся номером в палитре. Примерами команд, задающих цвет, являются Color и BorderColor. Цвета точек в команде Series также задаются номерами в палитре с помощью цветовых свойств серий C, G, LC, LG, FC, FG.

Стандартная палитра библиотеки ChartLib содержит 27 цветов с номерами от 0 до 26. Команда DefColor позволяет добавлять новые цвета и переопределять уже имеющиеся. Изменения, сделанные в палитре цветов, глобальны, и влияют на все слайды и фильмы.

Стандартная палитра цветов


Свойства серий

Введение Команды Серии Выражения ChartLib TSliChart CDrawer Интерактивность
Внешний вид серии точек на графике определяется набором её свойств. Каждое свойство может быть либо общим для всей серии, либо индивидуальным для каждой точки. Если свойство не задано, оно принимается равным стандартному значению по умолчанию. Названия, смысл и стандартные значения всех свойств перечисляются ниже.

Серия создаётся командой Series. Каждое свойство серии задаётся одно- или двухбуквенным именем, за которым следует знак равенства и значение. Значением должна быть либо числовая константа, либо имя столбца данных, определённого командами NewData или Let. Свойства разделяются запятыми или пробелами.

Например, следующая команда образует новую серию с именем priceline:

#Series priceline: X=time Y=price S=0 LP=2 LC=1
В этой серии координаты точек X и Y задаются столбцами данных time и price соответственно. Свойства S, LP и LC одинаковы для всех точек серии. Все остальные свойства имеют стандартные значения.

Созданную серию можно переопределить заново, повторно задав команду Series с тем же именем серии и другими значениями свойств. Например, чтобы заменить красный цвет линий на синий, следует дать команду

#Series priceline: X=time Y=price S=0 LP=2 LC=3
Тот же результат достигается более короткой командой:
#SeriesModify priceline: LC=3
Команда SeriesModify имеет тот же синтаксис, что и Series, но в отличие от последней не создаёт серию заново, а только изменяет указанные свойства.

Имя серии можно опускать при создании серии. Однако если после этого определить ещё одну серию, то доступ к первой для команд Series, SeriesOn, SeriesOff, SeriesModify и SeriesSize будет закрыт навсегда.

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

Если свойства серии не ссылаются ни на один столбец данных, определённый командой NewData, то число точек в такой серии по умолчанию равно нулю. Чтобы явным образом задать число точек, следует использовать команду SeriesSize или ResizeData.


Свойства серий: Параметры точек

Точки изображаются на графике фигурами фиксированного размера в пикселах.

X

Xcoord; X-координата точки. Если для данной серии параметр X не указан, он берётся из предыдущей серии. Если при этом данная серия является первой в матрице, то X полагается равным номеру точки (нумерация точек начинается с 0). Свойство X несовместимо с TX.

Y

Ycoord; Y-координата точки. Свойство Y несовместимо с TY, Z и MC.

Z

Zcoord; альтернативная Y-координата точки, ось которой отображается справа. Если точка имеет параметр Z, то параметр Y игнорируется.

TX

TextX; Метка точки, выводимая на горизонтальной оси вместо X-координаты. Свойство X игнорируется, точки располагаются по оси X с равномерным шагом в порядке поступления, начиная с нуля.

TY

TextY; Метка точки, выводимая на вертикальной оси вместо Y-координаты. Свойства Y, Z, MC игнорируются, точки располагаются по оси Y с равномерным шагом в порядке поступления, начиная с 0.

C

Color; номер цвета точки. В палитре предопределены 27 цветов с номерами от 0 до 26, и можно определять другие с помощью команды DefColor.
По умолчанию C равно номеру серии.

G

Gradient; второй цвет точки, также задаётся номером в палитре. Игнорируется, если параметр I не задан.
По умолчанию G=0 - чёрный.

I

Intensity; интенсивность. Если параметр I не указан, то цвет точек в серии определяется только параметром C. Иначе цвет вычисляется таким образом, чтобы при минимальном значении параметра I он был равен C, а при максимальном - G. При промежуточных значениях I цвет C плавно переходит в G.

O

OutlineColor; цвет обводки точки, задаётся номером в палитре.
Если не задано, то берётся значение свойства Color текущего графика, по умолчанию 0.

W

Weight; размер точки в пикселах. Если не задан, берётся W=5. Если W=0, точка не изображается.

S

Shape; форма точки. Если S=0, точка не изображается. Допустимые значения приведены в таблице:

График функции нормального распределения

Если точка имеет свойство TI, то её размер устанавливается по тексту TI, который изображается внутри точки. При этом свойство S регулирует форму фигуры, заключающей этот текст:

График функции нормального распределения

K

Key; ключевой номер точки. Любые две точки на графике можно соединить линией, называемой парным соединением (см. ниже). Для этого обе точки должны иметь ключевые номера. Соединять можно точки, находящиеся как в одной серии, так и в разных. Никакие две точки на одном графике не должны иметь одинаковых номеров K.
По умолчанию точка не имеет ключевого номера и может соединяться только с соседней точкой.

U

Usage; режимы использования точки, задаваемые суммой следующих значений (по умолчанию 16):
    U=1 - обязательная предварительная прорисовка точки;
    U=2 - обязательная предварительная прорисовка линии;
    U=4 - обязательная предварительная прорисовка заливки;
    U=8 - обязательный учёт точки при автомасштабировании;
    U=16 - учёт точки при автомасштабировании, если она имеет размер;
    U=32 - не отображать обводку точки.

TI

TextInside; текст внутри точки. При выводе текста точка расширяется до размера минимального прямоугольника,  вмещающего текст. Допускаются многострочные тексты, разделителем строк является пара символов "\n".
Несколько меняется смысл свойств S (форма точки) и W (размер точки). Свойство S модифицирует контур прямоугольника, добавляя к нему выступы различной формы (см. таблицу). Свойство W задаёт величину выступов.

График функции нормального распределения

TN

TextNear; текст рядом с точкой. Допускаются многострочные тексты, разделителем строк является пара символов "\n".

TR

TextRight; текст, выводимый при активизации точки правой клавишей мыши. Допускаются многострочные тексты, разделителем строк является пара символов "\n".
Cвойство работает только при выводе графика в окно.

TB

TextStatusBar; текст, выводимый в статусную строку, когда курсор мыши останавливается на точке.
Cвойство работает только при выводе графика в окно.

TT

TextTable; текст, выводимый в сводную таблицу выбранных точек. Разделителем колонок является символ ";". Если точка не имеет поля TT, по умолчанию в таблицу выводятся координаты точки.
Cвойство работает только при выводе графика в окно.

TQ

TextQuery; текст, выдаваемый по запросу информации о точке через интерфейсную функцию CL_ChartGetPointInfo.

TC

TextColor; цвет текстов TN, TR и TI, задаётся номером в палитре. По умолчанию чёрный.


Свойства серий: Параметры боксов

Если заданы свойства BX, BY, BZ, точка изображается не фигурой фиксированного размера в пикселах, а боксом. Бокс - это прямоугольник на двумерном графике или параллелепипед на трёхмерном графике. Свойства X, Y, (Z) и BX, BY, (BZ) задают координаты двух противоположных углов бокса. К боксам применимы все свойства точек кроме W.

BX

BoxX; вторая координата по оси X. Ширина бокса вдоль оси X равна |X-BX|.

BY

BoxY; вторая координата по оси Y. Ширина бокса вдоль оси Y равна |Y-BY|.

BZ

BoxZ; вторая координата по оси Z. Ширина бокса вдоль оси Z равна |Z-BZ|.


Свойства серий: Параметры гистограмм

Серия считается гистограммной, если она содержит одно из свойств HS или HW. В текущей реализации ChartLib на графике может находиться только одна гистограмма (это ограничение будет снято в дальнейшем). Она строится по всем точкам всех гистограммных серий. При этом на гистограмму могут накладываться обычные графики.

HS

HistSort; значения, по которым точки упорядочиваются в столбцах гистограмм. Если не указано, точки располагаются в порядке поступления.

HW

HistWeight; вес (вклад) точки в столбец гистограммы, по умолчанию 1.


Свойства серий: Параметры биржевых графиков

Биржевые графики отличаются тем, что вместо точек на них изображаются свечи. Свеча имеет четыре Y-координаты: цена открытия, максимальная цена, минимальная цена и цена закрытия.
Строки в матрице данных соответствуют либо отдельным сделкам, либо интервалам времени. В первом случае достаточно задать MC равным цене (или объёму) сделки. Во втором случае необходимо задать все четыре параметра MO, MH, ML, MC. В обоих случаях форма свечей вычисляется согласно параметру CandleWidth, который задаёт длительность всех свечей в секундах.

X

Xcoord; X-координата точки в секундах. Для корректного вычисления свечей необходимо, чтобы точки входного потока следовали в хронологическом порядке.

MC

MarketClose; последнее значение на интервале времени (например цена закрытия или цена последней сделки). Параметр MC является обязательным для точек, используемых при формировании биржевых графиков. Если точка имеет MC, то свойства Y и Z игнорируются.

MO

MarketOpen; первое значение на интервале времени (например цена открытия или цена первой сделки). Если параметр MO отсутствует у точки, по умолчанию полагается MO=MC.

MH

MarketHigh; максимальное значение на интервале времени. Если у точки отсутствует параметр MH, по умолчанию полагается MH=MC.

ML

MarketLow; минимальное значение на интервале времени. Если у точки отсутствует параметр ML, по умолчанию полагается ML=MC.

MS

MarketStyle; стиль свечи. Если MS=0, свеча не изображается. По умолчанию установлен стиль интервальных гистограмм с ценами открытия и закрытия (MS=1). Допустимые значения перечислены в таблице:

График функции нормального распределения

MT

MarketTrades; число точек (сделок), образующих свечу. Этот параметр не влияет на изображение свечи и используется только для вывода текстовых комментариев TN, TR или TB, содержащих переменную CandleCount (см. ниже).

C

Цвет бычьей (MO<MC) свечи при MS=2 или 3, задаётся номером в палитре.
По умолчанию C=7 - белый.

G

Цвет медвежьей (MO>MC) свечи при MS=2 или 3, задаётся номером в палитре.
По умолчанию G=0 - чёрный.

I

Intensity; интенсивность. Если параметр I не указан, то цвет свечей определяется только параметрами C и G. Иначе действует правило: чем выше I, тем цвет ближе к среднему между C и G.

O

Цвет контура свечи, задаётся номером в палитре. Если не задан, то берётся значение свойства Color текущего графика, по умолчанию 0.

TN, TR, TB

Текстовые свойства имеют для свечей тот же смысл, что и для точек. Если текстовое свойство задаётся с помощью выражения, то в нём допускается использовать переменные - параметры текущей свечи.
Cвойства TR и TB работают только при выводе графика в окно.


Свойства серий: Параметры линий

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

LC

LineColor; цвет линии, задаётся номером в палитре. Параметр аналогичен C.
По умолчанию LC равно номеру серии.

LG

LineGradient; второй цвет линии, задаётся номером в палитре. Параметр аналогичен G.
По умолчанию LG=0 - чёрный.

LI

LineIntensity; интенсивность линии. Параметр аналогичен I.

LW

LineWeight; толщина линии в пикселах. Если не задан, то LW=1.

LS

LineShape; форма линии. По умолчанию LS=1. Допустимые значения перечислены в таблице:

График функции нормального распределения

LP

LinePath; форма траектории. По умолчанию LP=1. Линия не рисуется, если LP=0. Допустимые значения перечислены в таблице:

График функции нормального распределения

LD

LineDirection; направление линии. По умолчанию LD=1.
    LD=0 - нет линии,
    LD=1 - линия соединяет текущую точку со следующей в серии,
    LD=2 - линия соединяет текущую точку с такой же точкой в следующей серии,
    LD=3 - рисуются обе линии.
Для последней серии могут быть отображены только линии типа 1.

LA

LineArrow; тип стрелки. По умолчанию LA=0. Допустимые значения перечислены в таблице:

График функции нормального распределения


Свойства серий: Параметры парных соединений

Серия, содержащая свойства PA и PB, описывает линии, а не точки. Концы каждой линии задаются ключевыми номерами соединяемых точек. Все свойства такой серии, за исключением параметров линии LC, LG, LI, LW, LS, LP, LD, LA, игнорируются. Если указано только одно из свойств PA или PB, вся серия игнорируется. Соединять можно любые точки, даже если они находятся в разных сериях. Нельзя соединять точки, находящиеся на разных панелях.

PA

PairA; ключевой номер первой точки отрезка. Парное соединение игнорируется, если ни одна из точек графика не имеет ключевого номера K, совпадающего со значением свойства PA.

PB

PairB; ключевой номер второй точки отрезка. Парное соединение игнорируется, если ни одна из точек графика не имеет ключевого номера K, совпадающего со значением свойства PB.

LB

LineStatusBar; текст, выводимый в статусную строку, когда курсор мыши останавливается на линии. Свойство LB применимо только к парным соединениям, но не к отрезкам, соединяющим соседние точки (см. выше).
Cвойство работает только при выводе графика в окно.


Свойства серий: Параметры заливок

К любой точке можно привязать заливку. Свойство FD устанавливает, какие ещё точки следует использовать наряду с текущей для определения формы заливки.

FC

FillColor; цвет заливки, задаётся номером в палитре. Параметр аналогичен C.

FG

FillGradient; второй цвет заливки, задаётся номером в палитре. Параметр аналогичен G.

FI

FillIntensity; интенсивность заливки. Параметр аналогичен I.

FS

FillShape; форма заливки. Цвет штриховки задаётся свойствами LC, LG, LI. По умолчанию FS=1. Допустимые значения перечислены в таблице:

График функции нормального распределения

FD

FillDir; направление заливки от линии, соединяющей текущую и следующую точки в текущей серии. Если FD=0, заливка не изображается. По умолчанию FD=1. Допустимые значения перечислены в таблице:

График функции нормального распределения

FP

FillPath; форма траектории, соединяющей соседние точки в текущей серии. Параметр аналогичен LP. По умолчанию FP=1.
Контур заливки определяется парой свойств FD и FP. Например, следующая таблица отличается от предыдущей тем, что вместо FP=1 было задано FP=3:

График функции нормального распределения


Свойства точек в сериях: Столбцы данных

Свойства DB, DR, и DT введены для того, чтобы в команде Format можно было определять столбцы данных, не имеющие непосредственного назначения и используемые только в выражениях. В каждой серии можно задавать сколько угодно полей данных.
Как и сама команда Format, эти свойства являются анахронизмами и, возможно, не будут поддерживаться в следующих версиях библиотеки. Вместо них следует использовать команду Let.

DB

DataByte; Данные типа Byte (целые числа).

DR

DataReal; Данные типа Real (вещественные числа).

DT

DataText; Данные типа Text (текстовые строки).


Использование выражений

Введение Команды Серии Выражения ChartLib TSliChart CDrawer Интерактивность
Библиотека ChartLib оснащена встроенным калькулятором выражений. Выражения используются главным образом в командах Let и Format для определения вычислимых столбцов в матрицах данных. Кроме того, выражения задаются в командах Status, DumpData, DumpPcode и в интерфейсной функции CL_ChartGetXYInfo.

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

В роли переменных выступают имена столбцов данных, введённых командами NewData и Let. Имена переменных могут состоять из любых символов, однако если имя содержит спецсимволы (знаки операций, скобки) или пробелы, его следует заключать в апострофы.

Область действия имён ограничивается текущим слайдом. Чтобы обратиться к столбцу данных, определённому на другом слайде, следует использовать "имя с точкой":

ИмяСлайда . ИмяСтолбцаДанных
Имена переменных и предопределённых констант чувствительны к регистру, например PI - это константа, а pi - переменная; переменные XYZ и xyz различны. В то же время имена функций не чувствительны к регистру, например sin, SIN и Sin - три корректных имени функции синуса.

Выражения: Типы данных и константы

Допустимые типы данных: Приведение типов в выражениях осуществляется автоматически, но можно использовать также функции преобразования типа (см. ниже). Типы bool и datetime являются подмножествами int. При приведении числовых типов к bool положительные значения преобразуются в true, отрицательные и 0 - в false. Тип error эквивалентен строковому и содержит сообщение об ошибке.

Целочисленные константы можно задавать как в десятичной системе счисления, так и в бинарной или шестнадцатеричной, например:

0b0100.1010  - двоичное 74
0xFFFF       - шестнадцатеричное 65535
В двоичных и шестнадцатеричных константах точка служит для визуального отделения разрядов и при вычислениях игнорируется.

Вещественные константы задаются либо в экспоненциальной форме, либо с плавающей точкой:

2.345e+8
2345E-8
20.345
Строковые константы записываются в двойных кавычках. В строковые константы можно включать символы с любыми кодами, в том числе следующие спецсимволы:
    \ddd - символ, заданный десятичным кодом ddd
    \xHH - символ, заданный шестнадцатеричным кодом HH
    \a - символ AlertBel,  \x07
    \b - символ Backspace,  \x08
    \t - символ HorizontalTab,  \x09
    \n - символ Newline,  \x0A или \x0D \x0A
    \v - символ VerticalTab,  \x0B
    \f - символ Formfeed,  \x0C
    \r - символ CarriageReturn,  \x0D
    \\ - символ обратного слэша \
    \" - символ двойной кавычки "

Константы даты-времени задаются как строковые с преобразованием типа. По умолчанию разделителем года, месяца и дня в датах является символ "/". Разделитель можно изменить командой Syntax:

datetime ("2005/08/21 11:15:20").
Неинициализированные значения, которым в матрице данных соответствует пропуск или ???, имеют значение empty. Преобразование empty к числовым типам даёт 0, к строковому типу - "empty".

По умолчанию в библиотеке предопределены значения некоторых констант, которые можно использовать во всех выражениях:

empty;
false   = 0;
true    = 1;
PI      = 3.1415926535897931;
MINUTE  = 60;
HOUR    = 60 * 60;
DAY     = 60 * 60 * 24;
WEEK    = 60 * 60 * 24 * 7;

Выражения: Переменные

Имеются предопределённые переменные, используемые в различных контекстах.

Характеристики текущей матрицы данных

Используются главным образом для построения графиков функций, задаваемых аналитически, а не таблицей данных. Допустимы в команде Let.
 
RowIndex номер строки в матрице (нумерация строк начинается с нуля)
RowsCount число строк в матрице

Характеристики текущей свечи

Группа переменных предназначена для вывода текстовой информации на биржевых графиках. Эти переменые используются в выражениях, задающих текстовые комментарии TN, TR, TB в свечных сериях.
 
CandleLeft X-координата левого края свечи
CandleRight X-координата правого края свечи
CandleOpen Y-координата первой точки свечи (цена открытия)
CandleClose Y-координата последней точки свечи (цена закрытия)
CandleLow минимальная Y-координата точек свечи
CandleHigh максимальная Y-координата точек свечи
CandleCount число точек, которыми образована свеча

Характеристики точки слайда

Группа переменных используется в двух контекстах:
CoordX, 
CoordXText
X-координата курсора мыши, пересчитанная в реальные координаты 
CoordY, 
CoordYText
Y-координата курсора мыши, пересчитанная в реальные координаты
CoordZ, 
CoordZText
Y-координата курсора мыши, пересчитанная в реальные координаты относительно оси Z, если она имеется на графике. 
CoordXStart,
CoordXStartText
X-координата курсора мыши в начальной точке при выделении прямоугольной области, пересчитанная в реальные координаты
CoordYStart,
CoordYStartText
Y-координата курсора мыши в начальной точке при выделении прямоугольной области, пересчитанная в реальные координаты

Переменные с суффиксом Text содержат значения координат, оптимально отформатированные с учётом текущего масштаба графика.

Выражения: Строки со вставками

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

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

"Число пи=" & PI & ", более точно пи=" & format ("%.16f", PI) & "."
"Число пи=[PI], более точно пи=[PI%.16f]."
Результатом обоих выражений будет строка
Число пи=3.14159, более точно пи=3.1415926535897931
После выражения-вставки может следовать формат вывода, начинающийся знаком % и продолжающийся до закрывающей квадратной скобки. Такие же форматы вывода используются в функции format.

Выражения: Форматы вывода чисел

Числовые форматы используются в строках со вставками и в функции format.
Форматы задаются по правилам функции printf языка С. Числовой формат содержит знак %, за которым следуют необязательные параметры: и завершается одной из ключевых букв d, i, o, u, x, X, f, e, E, g, G.
 
%[flag][width]d или i целое число со знаком
%[flag][width]u целое число без знака
%[flag][width]o восьмеричное целое число без знака
%[flag][width]x шестнадцатеричное целое без знака, используются прописные буквы a, b, c, d, e, f
%[flag][width]X шестнадцатеричное целое без знака, используются заглавные буквы A, B, C, D, E, F
%[flag][width][.prec]e
%[flag][width][.prec]E
вещественное в экспоненциальнойформе: 1.2e4, 3.1E-4
%[flag][width][.prec]f вещественное с плавающей точкой: 12000.0, 0.00031
%[flag][width][.prec]g
%[flag][width][.prec]G
кратчайшая из двух формe и f

Выражения: Форматы дат и времени

Форматы дат и времени используются в строках со вставками и в функции format.
Форматы задаются по правилам функции strftime языка С. В отличие от числовых форматов любое количество форматов дат-времени можно объединить для вывода одного значения. Например, результатом выражения
"Today [now() %#d %B %Y, %A, %H:%M:%S]."
будет строка вида
Today 4 February 2000, Monday, 15:04:55
Необязательный аргумент [flag] может принимать только одно значение #. Для форматов %#c и %#x он выводит дату в более подробной форме. Для остальных форматов - удаляет лидирующие нули (4 вместо 04).
 
%[flag]c стандартное представление даты и времени
%[flag]x стандартное представление даты
%X стандартное представление времени
%[flag]Y четырёхзначный год (от 1970)
%[flag]y последние две цифры года (от 00 до 99)
%B полное название месяца
%b сокращённое название месяца
%[flag]m номер месяца (от 01 до 12)
%[flag]d день месяца (от 01 до 31)
%[flag]H часы (от 00 до 24)
%[flag]I часы (от 00 до 12)
%p индикатор до полудня / после полудня
%[flag]M минуты (от 00 до 59)
%[flag]S секунды (от 00 до 59)
%a сокращённое название дня недели
%A полное название дня недели
%[flag]w порядковый номер дня недели (0=воскресенье, 1=понедельник, ..., 6=суббота.)
%[flag]j порядковый номер дня в году (от 001 до 366)
%[flag]U порядковый номер недели в году (от 00 до 51) если неделя начинается с воскресенья
%[flag]W порядковый номер недели в году (от 00 до 51) если неделя начинается с понедельника
%z
%Z
полное и сокращённое название часового пояса

Форматы даты-времени d, x, X конфликтуют с одноимёнными числовыми форматами. Если одна из этих букв оказалась последней в формате даты-времени, после неё следует поставить букву T:

"Today [now() %#xT]."

Выражения: Операции и их приоритет

В выражениях допускаются следующие операции (в порядке повышения приоритета):
 
, последовательное вычисление
:= присваивание
or логическое ИЛИ
and логическое И
not логическое НЕ
<= >= <> < > = операции сравнения
& конкатенация строк
+ - арифметическое сложение и вычитание
* / mod арифметическое умножение, деление и остаток
^ возведение в степень

Приоритет операций может быть изменён с помощью скобок.

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

exp (23.67*x*x+1.2905*x-45.892) + 1/exp (23.67*x*x+1.2905*x-45.892)
T:= exp (23.67*x*x+1.2905*x-45.892),  T+1/T
Результатом операции присваивания является значение выражения справа от знака :=.

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

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

Небольшое отличие от традиционных языков программирования имеется в операциях сравнения. Запись 0<=x<1 корректна и является сокращением более длинного выражения 0<=x and x<1,  то есть имеет традиционный математический смысл. Допускаются цепочки сравнений произвольной длины, включающие любые из 6 операций сравнения, например 0<x<=y1=y2>1.

Выражения: Функции

Функции в общем случае могут иметь произвольное число аргументов, которые записываются после имени функции в скобках через запятую.

По числу аргументов функции разбиваются на 4 группы:

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

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

Спецификации приводятся в виде

имя_функции (типы_входных_аргументов): тип_значения
Необязательные аргументы заключаются в квадратные скобки [ ]. Аргументы, которые могут повторяться более одного раза, заключаются в фигурные скобки { }. Слово any означает, что аргумент может иметь произвольный тип.
 

Выражения: Функции преобразования типов

Bool (any): bool

преобразование any в логический тип

Int  (any): int

преобразование any в целый тип

Real (any): real

преобразование any в вещественный тип

String (any): string

преобразование any в строковой тип

Datetime (any): datetime

преобразование any в дату и время

Выражения: Функции проверки значений

IsEmpty (any): bool

TRUE если any пустое или ошибочное

IsNumber (any): bool

TRUE если any приводимо к типу real

IsTime (any): bool

TRUE если any приводимо к datetime

Выражения: Числовые функции с фиксированным числом аргументов

Abs  (real): real

абсолютная величина (модуль) числа real

Sign (real): int

сигнум числа real, принимает значения: -1 при real<0;   0 при real=0;   1 при real>0

Max  ({real}): real

максимум чисел

Min  ({real}): real

минимум чисел

Sqrt (real): real

квадратный корень числа real

Sin  (real): real

синус числа real

Cos  (real): real

косинус числа real

Tg   (real): real

тангенс числа real

Arcsin (real): real

арксинус числа real

Arccos (real): real

арккосинус числа real

Arctg (real): real

арктангенс числа real

Sh   (real): real

гиперболический синус числа real

Ch   (real): real

гиперболический косинус числа real

Th   (real): real

гиперболический тангенс числа real

Exp  (real): real

экспонента числа real

Log  (real, [real2]): real

логарифм real1 по основанию real2, либо натуральный, если real2 опущен

FNorm (real, [real1], [real2]): real

функция нормального распределения с МО=real1 и СКО=real2.
Если real2 опущено, полагается МО=0, СКО= real1.
Если real1 и real2 опущены, полагается МО=0, СКО=1.

rand ([real1], [real2]): real

случайное число из диапазона [real1,real2), [0,real1) или [0,1)

round (real): real

округление до ближайшего целого

upround (real): real

ближайшее большее или равное целое (потолок)

dnround (real): real

ближайшее меньшее или равное целое (пол)

Выражения: Логические функции

Xor  (bool, {bool}): bool

логическое исключающее ИЛИ

Выражения: Битовые функции для целых чисел

Bit  (int1, int2): bool

int2-ый бит в целом числе int1

SetBit (int1, [int2], [bool]): int

установить int1-ый бит числа int2 (0 если опущен) в bool (1 если опущен)

NotBit (int): int

побитовое отрицание

OrBit (int, {int}): int

побитовое ИЛИ

AndBit (int, {int}): int

побитовое И

XorBit (int, {int}): int

побитовое исключающее ИЛИ

Выражения: Функции для работы с датой и временем

now  ( ): datetime

текущая дата-время

time (any): datetime

преобразование any в datetime с выделением времени

date (any): datetime

преобразование any в datetime с выделением даты

year (datetime): int

выделение года из datetime

month (datetime): int

номер месяца в году, нумерация с 1

day  (datetime): int

номер для в месяце, нумерация с 1

hours (datetime): int

выделение часов с полуночи из datetime

minutes (datetime): int

выделение минут из datetime

seconds (datetime): int

выделение секунд из datetime

WeekDay (datetime): int

номер дня недели, ВС=0, ПН=1, ..., СБ=6

YearDay (datetime): int

номер дня в году

Выражения: Функции для работы со строками

len  (string): int

длина строки

pos  (string1, string2): string

позиция строки string2 в строке string1, или (-1) если не найдена; нумерация символов строки начинается с 0

left (string, int): string

головная часть строки длиной int

right (string, int): string

хвост строки длиной int

mid  (string, int1, int2): string

средняя часть строки начиная с позиции int1 длиной int2, нумерация с 0

format (string, any): string

форматный вывод any согласно спецификации, заданной в string

Выражения: Условные и пороговые функции

if   ({bool1, any1}, [anyLast]): any

условное выражение, возвращает:
    any1, если bool1=TRUE,
    any2, если bool2=TRUE,
    ... и так далее ... ,
    anyLast, если все нечётные аргументы равны FALSE.

steps (real1, {real}): int

ступенчатая функция, возвращает:
    0, если real1<real2,
    1, если real2<=real1<real3,
    2, если real3<=real1<real4,
    ... и так далее ...

switch (any, {any1, any2} [anyLast]): any

переключатель значений, возвращает:
    any2, если any=any1,
    any4, если any=any3,
    ... и так далее...
    anyLast, если все равенства не верны.

API: функции библиотеки ChartLib

Введение Команды Серии Выражения ChartLib TSliChart CDrawer Интерактивность
Чтобы использовать функции библиотеки ChartLib в программе на С или С++, надо включить в свой проект заголовочный файл cl.h:
#include "cl.h"
Работа с библиотекой ChartLib включает следующие обязательные шаги:
  1. Инициализация библиотеки функцией CL_WorkStart.
  2. Формирование слайда функциями CL_DataLine, CL_DataVector, CL_DataFile.
  3. Создание нового рисователя CL_DrawerCreate, либо активизация старого CL_DrawerUse.
  4. Установка размеров слайда CL_SlideSetRect на поверхности рисователя,  в пикселах.
  5. Установка области просмотра для всех графиков на слайде CL_SlideMaxZoom или CL_ChartSetZoom.
  6. Оптимальное размещение областей на слайде CL_SlideRefresh.
  7. Рисование слайда целиком CL_SlideDraw, либо порциями CL_SlideBeginDraw и CL_SlideContinueDraw.
  8. Окончание работы CL_WorkFinish.
Передача строк в библиотеку и из библиотеки осуществляется через тип clString:
typedef const char* clString;
При передаче строк следует соблюдать два правила:
  1. Если строка служит для передачи данных в интерфейсную функцию, то она передаётся как clString и библиотека не может её модифицировать.
  2. Если строка служит для возвращения данных из интерфейсной функции, то она передаётся как clString* и вызывающая программа не должна её модифицировать.

API: Коды ошибок, возвращаемых интерфейсными функциями

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

CL_ERR_NOTSTARTED = -1001;    // библиотека не была инициализирована функцией CL_WorkStart
CL_ERR_CANTSTART = -1002;     // невозможно инициализировать библиотеку
CL_ERR_EXCEPTION = -1005;     // исключительная ситуация, отловленная try-catch
CL_ERR_OPENLOG = -1008;       // не получается открыть лог-файл
CL_ERR_SLIDE = -1011;         // не существует слайд
CL_ERR_CHART = -1012;         // не существует график на слайде
CL_ERR_POINTINFO = -1015;     // не существует записи с информацией о точке
CL_ERR_DRAWER = -1020;        // невозможно создать или использовать указанный рисователь
CL_ERR_DRAWERUPDATE = -1021;  // текущий рисователь не поддерживает функцию обновления
CL_ERR_DRAWERSAVE = -1022;    // текущий рисователь не поддерживает функцию сохранения
CL_ERR_DRAWERDELETE = -1023;  // невозможно удалить активный рисователь
CL_ERR_FILENAME = -1030;      // не задано имя файла
CL_ERR_DATA = -1040;          // обнаружены ошибки в данных
CL_ERR_DATAMATRIX = -1041;    // невозможно установить структуру матрицы
CL_ERR_DATARECORD = -1051;    // не определёна запись для чтения данных из вектор-столбца
CL_ERR_VECTOR = -1052;        // на слайде нет вектора-столбца с указанным именем
CL_ERR_VECTORSIZE = -1053;    // в вектор-столбце не существует строки с указанным номером
CL_ERR_VECTOREADONLY = -1054; // невозможно записать данные в вектор-столбец
CL_ERR_AREANOTFOUND = -1060;  // слайд не имеет такой области
CL_ERR_AXIS = -1070;          // график не имеет оси
CL_ERR_OVERZOOM = -1071;      // превышение допустимой точности при масштабировании графика
CL_ERR_NOSERIES = -1081;      // нет такой серии
CL_ERR_NOPOINT = -1082;       // нет такой точки в серии
CL_ERR_POINTSELECT = -1091;   // точка не может быть выделена
CL_ERR_POINTACTIVE = -1092;   // нет активной точки
CL_ERR_UNDERDEVEL = -1999;    // функция ещё не реализована

API: Инициализация и завершение

int CL_WorkStart ( )

Инициализация библиотеки. Функция должна быть вызвана перед первым обращением к другим функциям библиотеки, например при запуске приложения. Повторная инициализация не является ошибкой, и только увеличивает счётчик инициализаций.
Возвращает CL_ERR_CANTSTART, если не удаётся инициализировать библиотеку. Это фатальная ошибка, и дальнейшее использование библиотеки невозможно.

int CL_WorkFinish ( )

Освобождение библиотеки по окончании работы. Уменьшает счётчик инициализаций, так что реальное освобождение произойдёт только после того, как CL_WorkFinish будет вызвана столько же раз, сколько была вызвана CL_WorkStart. После реального освобождения обращение к другим функциям библиотеки, кроме CL_WorkStart, может привести к непредсказуемым последствиям.

int CL_WorkDebug (clString filename, FErrorsHandler errfunc)

Установка лог-файла filename и внешнего обработчика ошибок errfunc. Если filename=0, выдача в лог-файл отключается. Если errfunc=0, внешняя обработка ошибок отключается. По умолчанию нет ни лог-файла, ни внешней обработки ошибок.
Для каждой ошибки, кроме собственно сообщения, в лог-файл выводится последняя переданная CHD-строка и её номер, а также ссылка на место в исходном C++ коде, в котором данная ошибка была обнаружена.
Функция внешней обработки ошибок errfunc описана в файле clTypes.h следующим образом (внешний обработчик ошибок не может изменять или освобождать символьные строки srcfile, chdline и message):
typedef int (*FErrorsHandler) (
    int srcline,         // номер строки исходного кода
    const char* srcfile, // имя исходного файла
    int chdlineno,       // номер строки в CHD-потоке
    const char* chdline, // обрабатываемая CHD-строка
    const char* message  // текст сообщения
);

API: Функции для работы с устройствами вывода

int CL_DrawerCreate (TDrawerDef* data)

Создать и активизировать устройство вывода заданного типа. Возвращает номер устройства, с помощью которого его можно повторно активизировать функцией CL_DrawerUse. Структура TDrawerDef содержит данные, необходимые для создания устройств различных типов:
struct TDrawerDef {
    TDrawerType type;  // тип рисователя
    char* filename;    // имя файла для GPT, GIF, WMF
    FILE* fout;        // файл, открытый вне библиотеки, используется если filename==0
    int fhandle;       // дескриптор файла, используется если filename==0 и fout==0
    TIntRect Rect;     // прямоугольная область рисования
    int hdc;           // контекст устройства для Windows-рисователей
};

// Прямоугольная область в экранных координатах
struct TIntRect {
    int x1, y1;
    int x2, y2;
};

// Типы устройств
enum TDrawerType {
    CL_DRAWER_NO = 0,  // тип неизвестен
    CL_DRAWER_BUF = 1,  // буфер в памяти
    CL_DRAWER_GPT = 2,  // отладочный текстовый файл GTP
    CL_DRAWER_GIF = 3,  // GIF-файл
    CL_DRAWER_WIN = 4,  // окно или другой контекст устройства Windows
    CL_DRAWER_WMF = 5,  // Windows матафайл
    CL_DRAWER_EMF = 6   // Enhanced Windows матафайл
};

Для устройства CL_DRAWER_GIF необходимо задать размер области вывода Rect и имя файла filename.
Для устройства CL_DRAWER_WIN задаётся дескриптор контекста hdc.
Для устройств CL_DRAWER_WMF, CL_DRAWER_EMF задаётся имя файла.

int CL_DrawerUpdate (TDrawerDef* data)

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

int CL_DrawerUse (int drawer)

Активизировать устройство вывода с номером drawer.
Устройство должно быть предварительно создано функцией CL_DrawerCreate.

int CL_DrawerSave ( )

Сохранить всю графику из активного устройства в файл, заданный при создании (CL_DrawerCreate) или обновлении (CL_DrawerUse) устройства.  Некоторые устройства могут НЕ поддерживать данную функцию.
Устройство должно быть предварительно создано функцией CL_DrawerCreate.

int CL_DrawerDelete (int drawer)

Удалить устройство вывода с номером drawer.
Устройство должно быть предварительно создано функцией CL_DrawerCreate. Чтобы удалить устройство, активное в настоящий момент, необходимо сначала активизировать какое-либо другое устройство.

API: Функции работы с данными

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

int CL_DataVector (int slide, const TInputData* data)

Добавить вектор данных к слайду. Структура TInputData позволяет задавать вектора, составленные из разнотипных данных. Следует учитывать, что поля unused и Type являются 4-байтовыми целыми, а суммарный размер структуры TInputData - 16 байт:
struct TInputData {
    int unused;
    TDataType Type;
    union {
        Byte byte;
        double real;
        char* text;
    };
};

// Типы входных данных
enum TDataType {
    CL_DATA_NODATA,   // конец строки данных
    CL_DATA_BYTE,   // целое число 0..255
    CL_DATA_REAL,   // вещ число
    CL_DATA_TEXT,   // строка char*
};

Последним в векторе должен быть элемент типа CL_DATA_NODATA.
Пропуски в данных передаются следующими значениями:
#define CL_EMPTY_BYTE (-32768)
#define CL_EMPTY_REAL (-1.7E308)
#define CL_EMPTY_TEXT "???"

int CL_DataLine (int* slide, clString line)

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

int CL_DataFile (int* slide, clString filename)

Считать строки данных из файла и добавить их к слайду. Функция реализована через циклическое обращение к CL_DataLine. Для всех слайдов, в которые поступили новые строки данные, устанавливается максимальная область просмотра (см. CL_SlideMaxZoom).
 

int CL_DataMatrix (int slide, int rows, clString description, FMatrixInterface func, void* object)

Зарегистрировать внешнюю матрицу данных для слайда slide. Число строк в матрице задаётся перемнной rows. Число и типы столбцов, а также имя матрицы, передаются через текстовую строку description. Ее синтаксис в точности такой же, как и у аргументов команды NewData. Вообще, действие интерфейсной функции CL_DataMatrix полностью аналогично действию NewData, за тем исключением, что данные хранятся не самой библиотекой, а вне её.

Внешняя матрица задаётся с помощью функции доступа к данным func. Эта функция определяется пользователем библиотеки и вызывается изнутри библиотеки. Тип функции FMatrixInterface описан следующим образом:

typedef int (*FMatrixInterface) (void* object, int row, int col, TInputData* data);
Функция доступа должна вычислить значение в ячейке матрицы, стоящей на пересечении row-ой строки и col-ого столбца. Вычисленное значение и его тип должны быть занесены в структуру TInputData.

Указатель object можно использовать для того, чтобы передать функции доступа какие-либо данные. Это необходимо в том случае, когда одна и та же функция доступа используется для представления нескольких матриц. Объект, указаный при регистрации функции доступа, будет передаваться ей при каждом вызове в качестве первого аргумента. Совершенно безопасно делать указатель object нулевым.

Чтобы переопределить внешнюю матрицу (изменить rows, func или object), необходимо повторно вызвать CL_DataMatrix, передав ей в качестве description только имя матрицы.

int CL_DataGetValue (int slide, int point, clString colname, TInputData* data)

Считать значение из ячейки данных, стоящей на пересечении строки с номером point и столбца с именем colname. Значение записывается в структуру TInputData по указателю data.
Возвращает значение 0, если нет ошибки;
CL_ERR_VECTOR если на слайде нет столбца с указанным именем;
CL_ERR_VECTORSIZE если в столбце не существует строки с указанным номером.

int CL_DataSetValue (int slide, int point, clString colname, const TInputData* data)

Записать значение в ячейку данных, стоящую на пересечении строки с номером point и столбца с именем colname. Записываемое значение передаётся через указатель data на структуру типа TInputData.
Функция возвращает 0, если нет ошибок;
CL_ERR_VECTOR если на слайде нет столбца с указанным именем;
CL_ERR_VECTORSIZE если в столбце не существует строки с указанным номером;
CL_ERR_VECTOREADONLY если столбец содержит не хранимые, а вычислимые данные.

API: Функции работы со слайдами

Все функции работы со слайдами требуют, чтобы предварительно было активизировано какое-либо устройство отображения. Даже если функция не выводит графику, она может обращаться к устройству при определении размера текста.
Функции, принимающие на входе номер слайда, возвращают код ошибки CL_ERR_SLIDE, если текущий слайд не определён.

int CL_SlideMaxZoom (int slide)

Установить для всех графиков на слайде максимальную область просмотра. Максимальная область позволяет увидеть все точки на всех графиках.

int CL_SlideRefresh (int slide)

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

int CL_SlideSetRect (int slide, int xleft, int ytop, int xright, int ybottom)

Задать размеры слайда в координатах текущего устройства вывода.

int CL_SlideGetSize (int slide, clString area, int *xleft, int *ytop, int *xright, int *ybottom)

Выдать размер и положение области слайда с именем area. Ошибка CL_ERR_AREANOTFOUND - нет такой области. См. допустимые имена областей.

int CL_SlideDraw (int slide)

Отобразить слайд целиком на текущее устройство вывода. При выводе слайда в окно вместо CL_SlideDraw рекомендуется использовать функции CL_SlideBeginDraw и CL_SlideContinueDraw (см. ниже), так как это позволяет другим процессам выполняться одновременно с прорисовкой слайда.

int CL_SlideBeginDraw (int slide, int from_stage)
int CL_SlideContinueDraw (int slide, int to_stage)

Функция CL_SlideBeginDraw начинает прорисовку слайда с этапа from_stage включительно, но сама ничего не рисует.
Функция CL_SlideContinueDraw продолжает прорисовку слайда до этапа to_stage включительно.
Допустимы этапы прорисовки со следующими номерами:
0    начало прорисовки
1    все неграфические области, фон, сетка, обязательные элементы графиков
2    закрашенные площади
3    боксы
4    гистограммы
5    свечи
6    линии и парные соединения
7    точки
8    активная точка, включая текстовый комментарий
9    инициация поиска текущей точки
10    продолжение поиска текущей точки, её подсветка и вывод статусной информации
11    динамические элементы на графиках
12    конец прорисовки
Функция CL_SlideContinueDraw прорисовывают слайд поэтапно. Основная работа происводится на этапах 2--7.
На 2-м этапе для всех точек всех графиков прорисовываются только площади. На 3-м этапе снова просматриваются все точки всех графиков и изображаются только боксы. И так до 7-го этапа включительно. Указанная последовательность этапов (слоёв) прорисовки выбрана специально, чтобы менее обширные элементы (такие, как линии и точки) рисовались поверх более обширных (площадей, боксов, и т.п.).
Прорисовка оптимизирована таким образом, чтобы на каждом этапе серии, не имеющие соответствующих элементов, пропускались целиком.
Число элементов, отображаемых функцией CL_SlideContinueDraw за один раз , задаётся командой DrawBlockSize.
Начиная с 8-го этапа отображаются непостоянные (динамические) элементы графиков.

API: Функции работы с графиком

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

int CL_ChartGetZoom (int slide, double *x1, double *y1, double *x2, double *y2)

Выдать текущую прямоугольную область графика в реальных координатах.

int CL_ChartGetMaxZoom (int slide, double *x1, double *y1, double *x2, double *y2)

Выдать максимальную прямоугольную область графика в реальных координатах.

int CL_ChartSetZoom (int slide, double x1, double y1, double x2, double y2)

Установить прямоугольную область графика в реальных координатах.

int CL_ChartScreenToReal (int slide, int x, int y, double* X, double* Y, double* Z)

Преобразовать экранные кординаты (x,y) в реальные (X,Y,Z).

int CL_ChartRealToScreen (int slide, double X, double Y, int* x, int* y)

Преобразовать реальные  (X,Y) кординаты в экранные (x,y).

int CL_ChartGetXYInfo (int slide, int x, int y, clString series_name, clString expr, clString *buffer)

Выдать текстовую информацию о точке серии с именем series_name по экранным координатам (x,y). Информация вычисляется по выражению expr (обычно это строка со вставками) и выдаётся через указатель на строковой буфер buffer. Выражение expr записывается по тем же правилам, что и для команды Let. В частнисти, оно может содержать имена хранимых и вычислимых столбцов данных.
Вызвавшая программа не имеет права модифицировать данные по указателю buffer.

int CL_ChartGetPointInfo (int slide, TPointInfo* info)

Выдать информацию о точке с порядковым номером info->point в серии с порядковым номером info->series=0. Нумерация серий и точек начинается с нуля.
Возвращает код ошибки:
CL_ERR_NOSERIES - если нет такой серии,
CL_ERR_NOPOINT - если нет такой точки в серии.
Данная функция позволяет перебрать все точки графика. Для каждой точки в структуру TPointInfo записывается номер серии, номер точки, текстовая информация TQ и признак выделенности:
struct TPointInfo {
    clString panel_name;    // имя панели
    clString series_name;   // имя серии
    int series;             // номер серии
    int point;              // номер точки в серии
    double X, Y, Z;         // координаты точки
    clString text;          // информационная строка
    int selected;           // является ли точка выделенной
    int can_be_selected;    // может ли точка быть выделенной
};

int CL_ChartGetTableLine (int slide, TPointInfo* info)

Выдать очередную строку в таблице выделенных точек. Перед первым обращением следует присвоить счётчикам серий и точек исходные значения info->series=0 и info->point=-2 (можно задать info->point=-1, чтобы пропустить строку заголовка таблицы); при следующих обращениях их значения менять не нужно. Данная функция аналогична предыдущей и отличается тем, что перебирает только выделенные точки и не требует задания счётчиков серий и точек при каждом обращении.
Если точка выделена, но не имеет свойства TT, в info->text записывается информация по умолчанию.
Функция возвращает 0, если просмотр точек закончен, 1 - если ещё остались невыведенные точки.

int CL_ChartDrawPoint (int slide, TPointInfo* info, int stage)

Нарисовать этап stage для точки info->point в серии info->series. Нумерация серий и точек начинается с нуля. Для точек допустимы этапы прорисовки со следующими номерами:
2    закрашенные площади
3    боксы
4    гистограммы
5    свечи
6    линии и парные соединения
7    точки

int CL_ChartSelectPoint (int slide, TPointInfo* info, int selectmode)

Выделить точку с порядковым номером info->point в серии с номером info->series. Нумерация серий и точек начинается с нуля. Режим выделения selectmode может принимать значения: 1 - выделять точки, 2 - снимать выделение, 3 - инвертировать выделение.
Возвращает код ошибки CL_ERR_POINTSELECT, если точка не может быть выделена.

int CL_ChartSelectAll (int slide, int selectmode)

Выделить все точки графика. Режим выделения selectmode может принимать значения: 1 - выделять точки, 2 - снимать выделение, 3 - инвертировать выделение.

int CL_ChartGetActivePoint (int slide, TPointInfo* info)

Записать информацию об активной точке в структуру info. Возвращает 0 в случае успеха, CL_ERR_POINTACTIVE - если нет активной точки.

int CL_ChartSetActivePoint (int slide, TPointInfo* info, int dir)

Активизировать точку info->point в серии info->series или соседнюю с ней в зависимости от значения dir:
dir = 0 - точка info->point в серии info->series;
dir = -1 - предыдущая точка в серии info->series;
dir = +1 - следующая точка в серии info->series;
dir = +2 - ближайшая точка в следующей серии;
dir = -2 - ближайшая точка в предыдущей серии.
Если точка не может быть активной (не имеет размера, находится за пределами видимой части графика, и т.п.), активизировать ближайшую видимую в направлении dir=1.
Возвращает 0 в случае успеха,
1 - если точка активизирована, но находится за пределами отображаемой области,
CL_ERR_POINTACTIVE - если точка не существует или не может быть выбрана (тогда активной остаётся текущая точка).

API: Интерактивные функции

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

int CL_OnMouseDown (int slide, int x, int y, int buttons)
int CL_OnMouseUp (int slide, int x, int y, int buttons)
int CL_OnMouseMove (int slide, int x, int y, int buttons)

Обработка событий мыши. Точка (x,y) содержит текущие экранные координаты мыши. Состояние кнопок buttons может принимать следующие значения, а также комбинироваться из них путём суммирования:
enum TButtonsState {
 CL_BUTT_NO = 0,
 CL_BUTT_SHIFT = 1,
 CL_BUTT_ALT = 2,
 CL_BUTT_CTRL = 4,
 CL_BUTT_LEFT = 8,
 CL_BUTT_RIGHT = 16,
 CL_BUTT_MIDDLE = 32,
 CL_BUTT_DOUBLE = 64
};

int CL_OnKeyPress  (int slide, int keycode, int buttons)

Обработка нажатий на некоторые клавиши клавиатуры. Код клавиши keycode может принимать следующие значения:
enum TKeyCode {
 CL_KEY_NO = 0,
 CL_KEY_LEFT = 1,
 CL_KEY_RIGHT = 2,
 CL_KEY_UP = 3,
 CL_KEY_DOWN = 4,
 CL_KEY_PAGEUP = 5,
 CL_KEY_PAGEDOWN = 6,
 CL_KEY_HOME = 7,
 CL_KEY_END = 8,
 CL_KEY_TAB = 9,
 CL_KEY_ENTER = 10,
 CL_KEY_INSERT = 11,
 CL_KEY_DELETE = 12,
 CL_KEY_BACKSP = 13,
 CL_KEY_SPACE = 14,
 CL_KEY_ESCAPE = 15
};

int CL_SlideCallBack (int slide, FCallBack function, void* object)

Установить возвратную функцию слайда. Возвратная функция определяется в программе, использующей библиотеку ChartLib, и вызывается изнутри библиотеки при наступлении определённых событий.
Тип возвратной функции описан следующим образом:
typedef int (*FCallBack) (TCallBackInfo* cb);
Вызывая возвратную функцию, ChartLib заполняет структуру данных TCallBackInfo, специально предназначенную для передачи информации о произошедшем событии в вызвавшую программу:
struct TCallBackInfo {
 void* object;        // объект, заданный при установке возвратной функции слайда
 TCallBackType type;  // тип события
 clString text;       // статусная строка, строка данных, информация о точке
 clString area;       // имя области слайда, на которой произошло событие
 int series;          // номер серии точек
 int point;           // номер точки в серии
 int selected;        // точка выделена?
 TZoom prev;          // прежний размер области просмотра
 TZoom curr;          // текущий размер области просмотра текущего графика
};
Видимая область графика
struct TZoom {
 double x1,y1,z1;
 double x2,y2,z2;
};
Типы событий, приводящих к вызову возвратной функции
enum TCallBackType {
 CL_CBACK_NO = 0,
 CL_CBACK_DATACHANGE = 1,     // изменение данных
 CL_CBACK_ZOOM = 2,           // масштабирование графика
 CL_CBACK_POINTACTIVATE = 3,  // активизация точки
 CL_CBACK_POINTSELECT = 4,    // выделение или снятие выделения одной точки
 CL_CBACK_POINTHIGHLIGHT = 5, // подсветка точки
 CL_CBACK_SCENECHANGE = 6,    // изменение расположения 3D-сцены
 CL_CBACK_STATUSCHANGE = 7    // изменение статусной строки
};

API: Пример использования библиотеки ChartLib:
Утилита chdView для конвертирования графика

Утилита chdConv предназначена для конвертирования графиков из файлов формата CHD в файлы графических форматов GIF, EMF, WMF. Она включена в дистрибутив ChartLib вместе с исходным кодом.

Командная строка позволяет конвертировать произвольное число файлов за один раз:

chdConv <формат> <файлы> ... <формат> <файлы>
где <формат> - одна из опций -gif, -emf, -wmf, -gpt, указывающая, в какой формат конвертировать все записанные за ней <файлы>. Конвертированный файл записывается в текущую директорию под тем же именем и соответствующим формату расширением.

Ниже представлен исходный код утилиты chdConv.

#include <stdio.h>
#include <math.h>
#include "cl.h"

int slide = 0;
const int MAXBUF = 256;
char save[MAXBUF];
TDrawerDef drdata;

// генерация файла
int generate (const char* filename, const char* extension, TDrawerType type) {
    if (*filename=='-' || *filename=='?') return 0;

    // формирование имени файла
    const char *s, *point = filename, *shortname = filename;
    for (s=filename; *s; s++) {
        if (*s=='/' || *s=='\\') shortname = s+1;
       if (*s=='.') point = s;
    }
    if (point<=shortname) point = s;
    char name[MAXBUF];
    strncpy (name, shortname, point-shortname);
    name[point-shortname] = '\0';
    sprintf (drdata.filename=save, "%s.%s", name, extension);

    // отладочное сообщение
    printf ("doing %s\n", drdata.filename);

    // загрузка данных
    CL_DataLine (&slide, "#NewSlide");
    CL_DataFile (&slide, filename);
    CL_DataLine (&slide, "#StatusBar.Visible off");

    // создание рисователя
    drdata.Rect.x1=0; drdata.Rect.y1=0;
    drdata.Rect.x2=548; drdata.Rect.y2=412;
    drdata.type = type;
    CL_DrawerCreate (&drdata);

    // генерация и запись графика
    CL_SlideSetRect (slide, 2, 2, 546, 410);
    CL_SlideMaxZoom (slide);
    CL_SlideRefresh (slide);
    CL_SlideDraw (slide);
    if (type==CL_DRAWER_GIF)
       CL_DrawerSave ();

    // на всякий случай - отключение эхо-выдачи команд
    CL_DataLine (&slide, "#EchoFile");
    return 1;
}

void usage () {
    printf ("ChartLib v1.03   (c) K.Vorontsov, MICEX, 1999-2001\n");
    printf ("CHD (CHart Description format) converter to GIF, GPT and EMF.\n");
    printf ("chdConv usage:\n");
    printf ("    chdConv [-gif] f1.chd f2.chd ...  -convert files to Compuserve GIF\n");
    printf ("    chdConv -gpt f1.chd f2.chd ...  -convert files to Graphics Primitives Text\n");
    printf ("    chdConv -emf f1.chd f2.chd ...  -convert files to Enhanced Metafile\n");
    printf ("    chdConv -wmf f1.chd f2.chd ...  -convert files to Windows Metafile\n");
}

int main (int argc, char* argv[]) {
    if (argc==1) {
        usage();
        return 0;
    }
    TDrawerType otype = CL_DRAWER_GIF;
    const char* ext="gif";

    // инициализация библиотеки
    CL_WorkStart ();
    CL_WorkDebug ("chdConv.log", 0);

    // считывание командной строки и обработка файлов
    for (int a=1; a<argc; a++) {
        if (*argv[a]=='-') {
            ext = argv[a]+1;
            if (strcmp(ext,"gif")==0) otype = CL_DRAWER_GIF;
            else if (strcmp(ext,"gpt")==0) otype = CL_DRAWER_GPT;
            else if (strcmp(ext,"emf")==0) otype = CL_DRAWER_EMF;
            else if (strcmp(ext,"wmf")==0) otype = CL_DRAWER_WMF;
        }
        else if (*argv[a]=='?')
            usage ();
        else
            generate (argv[a], ext, otype);
    }

    // освобождение библиотеки
    CL_WorkFinish ();
    return 0;
}


Компонент TSliChart

Введение Команды Серии Выражения ChartLib TSliChart CDrawer Интерактивность
Компонент TSliChart предоставляет удобный интерфейс к библиотеке ChartLib для Delphi и несколько расширяет её возможности. В частности, он реализует двойную буферизацию при выводе в окно, печать на принтере и сохранение слайда в форматах GIF, BMP и EMF.

TSliChart: Инсталяция компонента

Перед началом инсталяции необходимо убедиться, что файл ChartLib.dll из дистрибутива ChartLib скопирован в системную директорию Windows. Далее компонент инсталируется стандартным для Delphi способом: После инсталяции компонент должен появиться в палитре Delphi в разделе Samples под именем SliChart.

TSliChart: Использование компонента в своём проекте

Компонент используется в среде Delphi аналогично другим наследникам класса TCustomControl. В команде USES необходимо указать модуль SliChart.
Важно помнить о следующих особенностях компонента TSliChart: Рекомендация 1: используйте заголовочные chd-файлы
Компонент TSliChart не позволяет описать слайд во время разработки. Задать внешний вид, структуру данных и структуру слайда можно только программным путём с помощью CHD-команд. Для выполнения отдельной команды у компонента имеется процедура DataLine. Однако лучший способ сформировать слайд - это собрать все команды в отдельный "заголовочный" CHD-файл и загружать его один раз процедурой DataFile. Это даёт дополнительное преимущество - заголовочный файл можно исправлять, меняя внешний вид графика без перекомпиляции приложения.

Рекомендация 2: выбирайте оптимальный момент для обновления слайда
Во время поступления данных на слайд ни библиотека, ни компонент не обновляют слайд. Это сделано для повышения эффективности, чтобы обновление производить один раз после серии операций с графиком. Обновление включает установку масштаба SlideMaxZoom и формирование изображения SlideRefresh.

Рекомендация 3: используйте команду SetFilm, чтобы организовать показ фильмов
По умолчанию, если команда SetFilm не выполнена, слайд помещается в фильм с именем default. Это специальный фильм для размещения одиночных слайдов. В нём невозможна прокрутка, перемещение и удаление слайдов.

TSliChart: Свойства компонента

Класс TSliChart наследует от своего родительского класса TCustomControl свойства:
Align, Anchors, AutoSize, ClientHeight, ClientWidth, Color, Constraints, Cursor, Height, HelpContext, Hint, Left, Name, PopupMenu, Tag, Top, Visible,Width.
Остальные свойства определены в самом классе TSliChart.

Свойство HasBuffer: boolean

Равен True, если включён режим двойной буферизации, и False в противном случае.
Если включён, слайд прорисовывается быстрее и без мелькания, но требует большего объёма памяти. Установка HasBuffer в True рекомендуется при показе фильмов.

Свойство HasStatus: boolean

Равен True, если слайд имеет встроенную статусную строку, и False в противном случае.
Если выключен, реализация статусной строки целиком перекладывается на пользователя компонента. Для этого ему достаточно определить обработчик события OnStatusChange, печатающий статусную информацию в нужном месте.
Свойство HasStatus эквивалентно CHD-команде Slide.Visible = on|off.

Свойство SelectOutside: boolean

Свойство SelectOutside эквивалентно CHD-команде SelectOutside.

Свойство SelectMode: TSelectMode

Свойство SelectMode эквивалентно CHD-команде SelectMode.
Тип TSelectMode определён как
 // Режимы выделения подмножеств точек
 TSelectMode = (smNone, smSelect, smUnselect, smInvert);

Свойство SelectShape: TSelectShape

Свойство SelectShape эквивалентно CHD-команде SelectShape.
Тип TSelectShape определён как
 // Формы выделения подмножеств точек
 TSelectShape = (shNone, shRectangle, shEllipse, shHalf, shStrip);

Свойство SelectedPointsGrid: TStringGrid

Строковая таблица для вывода сводной таблицы выделенных точек. Если данное свойство не установлено, вывод таблицы по нажатию CtrlP будет невозможен.

Свойство SlideNo: integer

Регистрационный номер слайда в библиотеке ChartLib. Именно этот номер передаётся функциям библиотеки в качестве первого аргумента.
Свойство доступно только для чтения.

Свойство Busy: boolean

Равен True, если слайд находится в состоянии перерисовки. В противном случае False.
Свойство доступно только для чтения.

Свойство ChartLibError: integer

Номер последней ошибки, произошедшей в функциях библиотеки ChartLib.
Свойство доступно только для чтения.

TSliChart: События компонента

Класс TSliChart наследует от родительского класса TCustomControl события:
OnCanResize, OnClick, OnConstrainedResize, OnDblClick, OnDockDrop, OnDockOver, OnDragDrop, OnDragOver, OnEndDock, OnGetSiteInfo, OnKeyDown, OnKeyPress, OnKeyUp, OnMouseDown, OnMouseUp, OnMouseMove, OnMouseWheel, OnMouseWheelDown, OnMouseWheelUp, OnResize, OnStartDock, OnUnDock.

Остальные события определены в самом классе TSliChart. События OnPropertyChange, OnShowTable, OnPaintStart, OnPaintFinish имеют стандартный тип TNotifyEvent. Остальные события имеют тип TChartEvent, который также описан в модуле SliChart.pas:

TChartEvent = procedure (Sender: TObject; var Info: TChartBackInfo) of object;
Обработчику события передаётся структура TChartBackInfo, которая содержит информацию о событии.
TChartBackInfo = record
  slide: TSliChart;    // указатель на объект
  event: integer;      // тип события
  text: PChar;         // статусная строка, строка данных, информация о точке
  area: PChar;         // имя области слайда, на которой произошло событие
  series: integer;     // номер серии точек
  point: integer;      // номер точки в серии
  selected: integer;   // точка выделена?
  prev: TZoom;         // предыдущая граница области просмотра
  curr: TZoom;         // текущая граница области просмотра
  prev_slide: integer; // номер текущего слайда до переключения
  curr_slide: integer; // номер текущего слайда после переключения
end;

Событие OnStatusChange: TChartEvent

Событие происходит при обновлении статусной строки. Выводимый текст содержится в переменной Info.text.
Определяйте это событие, чтобы реализовать собственную статусную строку. Пример реализации находится в исходном коде утилиты chdView.

Событие OnDataChange: TChartEvent

Событие наступает при поступлении каждой новой строки данных.

Событие OnSlideChange: TChartEvent

Событие наступает при переключении текущего слайда функциями DataLine и DataFile. Переменные Info.prev_slide и Info.curr_slide содержат номер текущего слайда до и после переключения соответственно. Переменная Info.text содержит имя файла, из которого был загружен данный слайд.

Событие OnDataFile: TChartEvent

Событие наступает непосредственно перед загрузкой файла. Имя файла содержится в переменной Info.text.
В исходном коде утилиты chdView это событие используется для обновления заголовка окна.

Событие OnZoom: TChartEvent

Событие наступает при масштабировании видимой области графика в окне. Координаты прежней области находятся в переменной Info.prec, координаты следующей - в Info.curr.

Событие OnPointActivate: TChartEvent

Событие наступает при активизации точки. Переменные Info.series и Info.point содержат номер активизированной точки.

Событие OnPointSelect: TChartEvent

Событие наступает при выделении точки. Переменные Info.series и Info.point содержат номер выделенной точки.

Событие OnPointHighlight: TChartEvent

Событие наступает при подсветке точки. Переменные Info.series и Info.point содержат номер подсвеченной точки.

Событие OnSceneChange: TChartEvent

Событие наступает при изменении положения трёхмерной сцены.

Событие OnPropertyChange: TNotifyEvent

Событие наступает при изменении одно из следующих свойств компонента: HasBuffer, SelectOutside, SelectMode, SelectShape.
В исходном коде утилиты chdView по событию OnPropertyChange обновляется текущее состояние этих свойств в статусной строке.

Событие OnShowTable: TNotifyEvent

Событие наступает при вызове сводной таблицы выделенных точек, и только в том случае, когда установлено свойство SelectedPointsGrid.

Событие OnPaintStart: TNotifyEvent

Событие наступает непосредственно перед прорисовкой слайда.

Событие OnPaintFinish: TNotifyEvent

Событие наступает сразу после окончания прорисовки слайда.

TSliChart: Процедуры и функции компонента

procedure DataFile (const FileName: PChar)

Считать строки команд и данных из файла.
Аналог функции CL_DataFile.

procedure DataLine (const Line: PChar)

Передать слайду строку формата CHD, содержащую команду или данные.
Аналог функции CL_DataLine.

procedure DataVector (var Data: TInputData)

Передать слайду вектор данных формата CHD. Тип данных TInputData определен в файле SliChart.pas следующим образом:
const
  CL_DATA_NODATA = 0; // конец строки данных
  CL_DATA_BYTE = 1;   // целое число
  CL_DATA_REAL = 2;   // вещ число
  CL_DATA_TEXT = 3;   // строка char*

type TInputData = record
  unused: integer;
  case dType: integer of
   CL_DATA_BYTE: (dByte: Smallint);  // целое число
   CL_DATA_REAL: (dReal: double);    // вещ число
   CL_DATA_TEXT: (dText: PChar);     // строка char*
 end;

Аналог функции CL_DataVector.

procedure DataMatrix (rows: integer; fields: PChar; func: FMatrixInterface; obj: TObject);

Зарегистрировать внешнюю матрицу данных. Функция доступа к внешним данным определена в файле SliChart.pas следующим образом:
FMatrixInterface = function (
    DataHolder: TObject;
    row, col: integer;
    var data: TInputData
): integer; cdecl;
Аналог функции CL_DataMatrix.

procedure DataGet (row: integer; colname: PChar; var data: TInputData)

Считать ячейку данных, стоящую в текущей матрице данных на пересечении строки с номером row и столбца с именем colname.
Аналог функции CL_DataGet.

procedure DataPut (row: integer; colname: PChar; var data: TInputData)

Записать значение в  ячейку данных, стоящую в текущей матрице данных на пересечении строки с номером row и столбца с именем colname.
Аналог функции CL_DataPut.

procedure SlideSetRect ()

Установить координаты прямоугольной область вывода слайда (в пикселах) по размеру компонента.
Аналог функции CL_SlideSetRect.

procedure SlideMaxZoom ()

Установить максимальную область просмотра для всех графиков слайда.
Аналог функции CL_SlideMaxZoom.

procedure SlideRefresh ()

Обновить слайд, оптимизировав размещение областей на слайде.
Аналог функции CL_SlideRefresh.

procedure SlideDraw ()

Нарисовать слайд от начала до конца. Функция может потребовать существенных затрат времени. Обычно в этой функции не возникает необходимости, так как компонент TSliChart берёт управление перерисовкой на себя.
Аналог функции CL_SlideDraw .

procedure ChartGetZoom (var x1: double; var y1: double; var x2: double; var y2: double)

Выдать текущую прямоугольную область графика в реальных координатах.
Аналог функции CL_ChartGetZoom

procedure ChartGetMaxZoom (var x1: double; var y1: double; var x2: double; var y2: double)

Выдать максимальную прямоугольную область графика в реальных координатах
Аналог функции CL_ChartGetMaxZoom

procedure ChartSetZoom (x1: double; y1: double; x2: double; y2: double)

Установить прямоугольную область графика в реальных координатах
Аналог функции CL_ChartSetZoom

procedure ChartScreenToReal (x, y: integer; var PX, PY, PZ: double)

Перевести экранные координаты в реальные.
Аналог функции CL_ChartScreenToReal.

procedure ChartRealToScreen (xreal, yreal: double; var x, y: integer)

Перевести реальные координаты в экранные.
Аналог функции CL_ChartRealToScreen.

procedure ChartDrawPoint (var info: TPointInfo; stage: integer)

Выполнить заданный этап прорисовки для заданной точки.
Аналог функции CL_ChartDrawPoint.

procedure ChartSelectPoint (var info: TPointInfo)

Выделить заданную точку.
Аналог функции CL_ChartSelectPoint.

procedure ChartSelectAll ()

Выделить все точки.
Аналог функции CL_ChartSelectAll.

procedure ChartSetActivePoint (var info: TPointInfo; dir: integer)

Активизировать заданную точку.
Аналог функции CL_ChartSetActivePoint.

procedure ChartGetActivePoint (var info: TPointInfo)

Получить info.series и info.point активизированной в данный момент точки.
Аналог функции CL_ChartGetActivePoint.

procedure ChartGetPointInfo (var info: TPointInfo)

Получить информацию о точке.
Аналог функции CL_ChartGetPointInfo.

procedure ChartGetTableLine (var info: TPointInfo)

Получить строку сводной таблицы выделенных точек.
Аналог функции CL_ChartGetTableLine.

procedure ChartGetXYInfo (x, y: integer; series, expr: PChar; var buffer: PChar)

Получить информацию о точке, ближайшей к точке с экранными координатами (x,y).
Аналог функции CL_ChartGetXYInfo.

procedure SaveAsEMF (const filename: string)

Сохранить слайд как растровое изображение в файле формата EMF (Enhanced Windows MetaFile) с именем filename.

procedure SaveAsBMP (const filename: string)

Сохранить слайд как растровое изображение в файле формата BMP (Windows bitmap) с именем filename.

procedure SaveAsGIF (const filename: string)

Сохранить слайд как растровое изображение в файле формата CompuServe GIF с именем filename.

procedure CopyToClipboard ()

Скопировать изображение слайда в буфер в виде метафайла.

procedure Print ()

Распечатать изображение слайда на принтере.

procedure ShowTable ()

Показать сводную таблицу выделенных точек. Если свойство SelectedPointsGrid не установлено, процедура не производит никакого действия.


Добавление устройств отображения

Введение Команды Серии Выражения ChartLib TSliChart CDrawer Интерактивность
Библиотека ChartLib использует объектно-ориентированный подход при работе с устройствами отображения графической информации. Все устройства  являются наследниками абстрактного рисователя CDrawer, в котором объявлены, но не определены, базовые функции рисования. Рисователь представляет собой интерфейс между основным кодом библиотеки ChartLib и конкретной графической библиотекой. В настоящее время поддерживаются графические библиотеки gd и Microsoft Windows GDI. Однако спектр поддерживаемых библиотек может быть легко расширен путём добавления новых рисователей.

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

Для добавление нового рисователя с именем Xyz необходимо выполнить следующие шаги:


Рисователи: Абстрактный рисователь CDrawer

Все виртуальные функции рисования имеют тип int. Если не оговорено другого, то отрицательный код возврата свидетельствует об ошибке, 0 означает успешное завершение.

Далее целиком приводится определение класса CDrawer из файла clDraw.h.

class CDrawer {
public:
    // Начало и завершение работы с графикой
    CDrawer ();
    virtual ~CDrawer ();
    virtual int Reset (TDrawerDef* ddef);
    virtual int Clear ();
    virtual int Save ();

    // Прорисовка графических примитивов
    virtual int Line (int x0, int y0, int x1, int y1) = 0;
    virtual int LineTo (int x1, int y1) = 0;
    virtual int Rect (int x0, int y0, int x1, int y1) = 0;
    virtual int Ellipse (int x0, int y0, int x1, int y1) = 0;
    virtual int EllipsePie (int x0, int y0, int x1, int y1,
        double fromangle, double toangle) = 0;
    virtual int Fill (int nPoints, int* xy) = 0;
    virtual int Text (int x0, int y0, const char* text, TFontStyle font) = 0;

    // Установка параметров рисования
    virtual int SetColor (TColor color) = 0;
    virtual int SetFillColor (TColor color) = 0;
    virtual int SetLineStyle (TLineStyle linestyle, int width) = 0;
    virtual int SetFillStyle (TFillStyle fillstyle) = 0;
    virtual int SetFont (TFontStyle font, const char* library,
        const char* family, int width, int height,
        const char* flags=0, double angle=0.0);

    // Функции, используемые в интерактивном режиме
    virtual int SetPixel (int x0, int y0, const TColor &color);
    virtual int GetPixel (int x0, int y0, TColor &color);

    // Функции для поддержки OpenGL и трёхмерной графики
    virtual int BeginOpenGL (TIntRect& Rwin, TIntRect& Rclip);
    virtual int EndOpenGL ();

    // Информационные функции
    virtual int GetTextSizes (const char* text,
        TFontStyle font, int* width, int* height) = 0;
    virtual char GetFontEncoding (TFontStyle font);

    // Возможности графического устройства
    int RightBottomShift;
    int HasPixelOperations;
    int HasInteractivity;
    int HasFontBackground;

protected:
    TDrawerDef DrawerDef; // определитель, переданный Reset
    FILE* open_file ();        // открыть файл в начале операции Save
    int close_file (FILE* f);  // закрыть файл в конце операции Save
};


Рисователи: Характеристики графического устройства

Перечисленные ниже переменные-члены класса CDrawer должны устанавливаться в конструкторе рисователя.

int RightBottomShift

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

int HasPixelOperations

Переменная должна быть равна 1, если рисователь поддерживают функции GetPixel и SetPixel, иначе 0. Устанавливаться в конструкторе рисователя и извне не изменяется.

int HasInteractivity

Переменная должна быть равна 1, если рисователь предназначен для вывода в окно, иначе 0. Устанавливаться в конструкторе рисователя и извне не изменяется.

int HasFontBackground

Переменная влияет на вывод текстовых строк  в функции Text. Если она равна 1, то символы шрифта выводятся с фоном, если 0, то без фона. Фон должен затирать предыдущую надпись, если она была выведена ранее на том же месте. Устанавливается в конструкторе равной 0, может изменяться извне.


Рисователи: Конструктор и деструктор

Конструктор CDrawXyz ( )

Конструктор класса, выводимого из CDrawer. Не должен принимать никаких параметров. Единственное место, где используется вызов этих конструкторов — функция CL_DrawerCreate в файле cl.cpp.

Деструктор ~CDrawXyz ( )

Деструктор класса.


Рисователи: Начало и конец рисования, запись в файл

int Reset (TDrawerDef* ddef)

Установить параметры рисователя и начать рисование заново.

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

Структура TDrawerDef определена в файле clTypes.h. Она объединяет в себе все данные, которые могут понадобиться для инициализации рисователей различных типов. Рисователь имеет право игнорировать те поля структуры, которые он посчитает ненужными. В будущем TDrawerDef может пополняться новыми полями.

struct TDrawerDef {
    TDrawerType type;  // тип рисователя
    char* filename;    // имя файла для GPT, GIF, WMF
    FILE* fout;  // файл, открытый вне библиотеки, используется если filename==0
    int fhandle;  // дескриптор файла, используется если filename==0 и fout==0
    TIntRect Rect;  // прямоугольная область рисования
    int hdc;   // контекст устройства для Windows-рисователей
};
Тип рисователя TDrawerType определён в clTypes.h. Он также может дополняться в будущем:
enum TDrawerType {
    CL_DRAWER_NO=0, // тип неизвестен
    CL_DRAWER_BUF=1, // буфер в памяти
    CL_DRAWER_GPT=2, // текстовый файл графических примитивов
    CL_DRAWER_GIF=3, // GIF-файл
    CL_DRAWER_WIN=4, // окно или другие рисователи Windows
    CL_DRAWER_WMF=5, // Windows матафайл
    CL_DRAWER_EMF=6 // Enhanced Windows матафайл
};
Прямоугольная область рисования определёна в clTypes.h как структура
struct TIntRect {
    int x1, y1;
    int x2, y2;
};
Параметр hdc служит для передачи контекста устройства рисователям, совместимым с Windows 95-2000.

Поля filename, fout, fhandle задают три альтернативных способа передачи файла для записи в него графического изображения. Они используются только функцией Save. Чтобы корректно открыть и закрыть файл независимо от способа его задания, используйте функции базового класса

FILE* CDrawer::open_file (); // открыть файл в начале операции Save
int CDrawer::close_file(FILE* f);  // закрыть файл в конце операции Save
Чтобы они корректно работали, необходимо вызвать перекрытую функцию CDrawer::Reset, которая копирует структуру ddef  (включая имя файла) в protected-член CDrawer::DrawerDef:
int CDrawXyz::Reset(TDrawerDef *ddef) {
    if (CDrawer::Reset(ddef))
        return (-1);
    // ... ... ...
}

int Clear ( )

Очистить рисователь, освободить все объекты, выделенные в контексте внешнего устройства отбражения. Эта функция служит для предотвращения утечек памяти. Она вызывается перед тем, как ChartLib отдаст управление основному приложению. От этого момента до следующего вызова какой-либо функции библиотеки основное приложение может удалить контекст устройства. Тогда связанные с ним объекты могут "повиснуть". Например, в системе Windows  кисти, перья и шрифты, связанные с контекстом hdc, не удаляются автоматически при разрушении контекста.

Переопределять функцию Clear не нужно в следующих случаях:

  1. если рисователь не создаёт объектов, связанных с внешним устройством,
  2. если внешнее устройство не разрушается,
  3. если при разрушении оно само удаляет все свои объекты.

int Save ( )

Сохранить изображение в файле, который был задан при установке рисователя функцией Reset. Переопределять функцию Save не нужно, если устройство отображения не предназначено для формирования графического файла.

Чтобы корректно открыть и закрыть файл, следует использовать функции базового класса

FILE* CDrawer::open_file (); // открыть файл в начале операции Save
int CDrawer::close_file(FILE* f);  // закрыть файл в конце операции Save


Рисователи: Установка параметров рисования

int SetColor (TColor color)

Задать цвет линий (Line, LineTo), текста (Text), границ фигур (Rect, Ellipse, EllipsePie) и границ заливок (Fill).
Тип TColor определён как триплет красный – зелёный – синий:
struct TColor {
    short Red, Green, Blue;
};

int SetFillColor (TColor color)

Задать фоновый цвет заливок (Fill), фигур (Rect, Ellipse, EllipsePie) и текста (Text).

int SetLineStyle (TLineStyle linestyle, int width)

Задать стиль и толщину в пикселах линий (Line, LineTo), границ фигур (Rect, Ellipse, EllipsePie) и границ заливок (Fill). Тип TLineStyle определён как целый и принимает следующие значения:
typedef int TLineStyle;
const TLineStyle CL_LINE_NO = 0;
const TLineStyle CL_LINE_SOLID = 1;
const TLineStyle CL_LINE_DASH = 2;
const TLineStyle CL_LINE_DOT = 3;
const TLineStyle CL_LINE_DASHDOT = 4;
const TLineStyle CL_LINE_DASHDOTDOT = 5;
const TLineStyle CL_LINE_STYLEMASK = 0x0F;
const TLineStyle CL_LINE_XOR = 0x10;
Тип CL_LINE_XOR можно комбинировать с другими для рисования в режиме «исключающего ИЛИ». В этом режиме повторная прорисовка линии тем же цветом стирает её. Данная возможность используется только в интерактивном режиме для изображения динамических объектов (курсоров и рамок) поверх основного изображения.

int SetFillStyle (TFillStyle fillstyle)

Задать стиль заливок (Fill), фигур (Rect, Ellipse, EllipsePie) и текста (Text). Тип TFillStyle определён следующим образом:
enum TFillStyle {
    CL_FILL_NO,
    CL_FILL_SOLID,
    CL_FILL_LEFT,
    CL_FILL_RIGHT,
    CL_FILL_CROSS
    CL_FILL_CROSSDIAG
};

int SetFont (TFontStyle font, const char* library, const char* family, 
            int width, int height, const char* flags=0, double angle=0.0)

Установить все параметры для стиля шрифта font. Функция возвращает код ошибки (-1), если данное устройство отображения не поддерживает указанную шрифтовую библиотеку; код (-2), если не удаётся инициализировать шрифт. В случае успеха возвращается 0.

Библиотека ChartLib ограничивает количество одновременно используемых шрифтов. Имеется 9 предопределённых и 9 пользовательских стилей шрифтов. Все шрифты инициализируются при создании рисователя, а функциям Text и GetTextSizes передаётся только номер стиля.

Параметр font задаёт стиль шрифта, который определён в clTypes.h как целое число от 0 до 17:

enum TFontStyle {
    CL_FONT_DEFAULT=0, // простейший шрифт, который всегда есть
    CL_FONT_TITLE=1, // заголовок графика
    CL_FONT_NAME=2, // названия осей
    CL_FONT_LABEL=3, // метки осей
    CL_FONT_INFO=4, // текст информационных полей
    CL_FONT_INSIDE=5,// текст TI внутри точек
    CL_FONT_NEAR=6, // текст TN рядом с точками
    CL_FONT_RIGHT=7, // текст TR по щелчку правой кнопкой мыши
    CL_FONT_STATUS=8,// текст TB статусная строка
    CL_FONT_USER_1=9,
    CL_FONT_USER_2=10,
    CL_FONT_USER_3=11,
    CL_FONT_USER_4=12,
    CL_FONT_USER_5=13,
    CL_FONT_USER_6=14,
    CL_FONT_USER_7=15,
    CL_FONT_USER_8=16,
    CL_FONT_USER_9=17, // девять пользовательских шрифтов
    CL_FONTS=18
};
Параметр library задаёт имя шрифтовой библиотеки. Функция SetFont должна игнорировать вызовы, относящиеся к тем шрифтовым библиотекам, которые она не поддерживает. Однако она должна пытаться обработать вызов с нулевым параметром  library.
Пример: функция CDrawWin::SetFont начинается с проверки
if (library && *library && strcmpcu (library,"Win"))
    return (-1);
Параметр family задаёт имя семейства шрифтов.

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

Параметр height задаёт высоту символов в пикселах.

Параметр flags задаёт дополнительные флаги. Это текстовая строка, которая может включать следующие символы:

B – жирный,
b – полужирный,
I – наклонный,
U – подчёркнутый,
S – перечёркнутый.
Параметр angle задаёт угол поворота текста в градусах. Значение 90 соответствует надписи, читаемой снизу вверх.


Рисователи: Функции рисования

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

int Line (int x0, int y0, int x1, int y1)

Рисует отрезок (x0,y0) – (x1,y1) и устанавливает текущую позицию в точку (x1,y1). Первый и последний пикселы должны прорисовываться обязательно. Используется текущий цвет, установленный SetColor, стиль и толщина линий, установленные SetLineStyle.

int LineTo (int x1, int y1)

Рисует отрезок из текущей точки в (x1,y1) и устанавливает текущую позицию в точку (x1,y1). Первый и последний пикселы должны прорисовываться обязательно. Используется текущий цвет, установленный SetColor, стиль и толщина линий, установленные SetLineStyle.

int Rect (int x0, int y0, int x1, int y1)

Рисует закрашенный прямоугольник. Если стиль заливки равен CL_FILL_NO, изображается только прямоугольный контур. Если стиль линии равен CL_LINE_NO, изображается только закрашиваемая область. Контур рисуется линиями текущего цвета (SetColor), стиля и толщины (SetLineStyle). Для заливки используется текущий цвет заливки (SetFillColor) и стиль заливки (SetFillStyle).

int Ellipse (int x0, int y0, int x1, int y1)

Рисует эллипс, вписанный в прямоугольник (x0,y0) – (x1,y1). Заливка и контур рисуются по тем же правилам, что и для Rect.

int EllipsePie (int x0, int y0, int x1, int y1, double fromangle, double toangle)

Рисует сектор эллипса между углами fromangle и toangle, заданными в радианах. Эллипс вписан в прямоугольник, заданный координатами (x0,y0) – (x1,y1).  Отсчёт углов ведётся от положительного направления горизонтальной оси против часовой стрелки. Заливка и контур рисуются по тем же правилам, что и для Rect.

int Fill (int nPoints, int* xy)

Рисует ломаную, состоящую из n точек, заданных массивом координат xy в следующем порядке: x1,y1, x2,y2, ..., xn,yn. Ломаная не обязана быть замкнутой, то есть не обязательно (x1,y1)=(xn, yn). Заливка и контур рисуются по тем же правилам, что и для функции Rect.

int Text (int x0, int y0, const char* text, TFontStyle font)

Рисует текстовую строку text с координатами левого верхнего угла (x0,y0) текущим цветом (SetColor). Стиль текста задаётся целым числом, см. функцию SetFont. Если параметр HasFontBackground имеет ненулевое значение, текст должен быть выведен по непрозрачному фону, цвет которого задан функцией SetFillColor.


Рисователи: Операции с пикселами

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

int SetPixel (int x0, int y0, const TColor &color)

Установить цвет пиксела с координатами (x0,y0).

int GetPixel (int x0, int y0, TColor &color)

Записать цвет пиксела с координатами (x0,y0) в структуру color.


Рисователи: Переход в режим OpenGL

Совместимость рисователя с библиотекой трёхмерной графики OpenGL обеспечивается всего двумя функциями: инициализацией и завершением  работы с OpenGL.

int BeginOpenGL (TIntRect& Rwin, TIntRect& Rclip)

Создать и инициализировать контекст воспроизведения OpenGL для рисования в прямоугольной области Rclip, заключённой в области слайда размером Rwin.
Для задания прямоугольников используется структура TIntRect:
struct TIntRect {
    int x1, y1;
    int x2, y2;
};

int EndOpenGL ( )

Закончить формирование буфера OpenGL, вывести его и удалить всё, что было создано функцией BeginOpenGL.


Рисователи: Получение информации

int GetTextSizes (const char* text, TFontStyle font, int* width, int* height)

Функция GetTextSizes обязана возвратить действительный размер текстовой строки text в пикселах для заданного стиля шрифта font. Ширина и высота прямоугольника, вмещающего текст, записывается в переменные width и height соответственно.

char GetFontEncoding (TFontStyle font)

Функция GetFontEncoding возвращает символ, обозначающий поддерживаемую данным шрифтом кодировку:
W – кодировка Windows CP-1251,
D – альтернативная кодировка DOS,
K – кодировка KOI-8,
I – кодировка ISO-8859-5.
Если выполнять перекодировку текстовых строк не предполагается, функцию можно не переопределять.


Интерактивные возможности

Введение Команды Серии Выражения ChartLib TSliChart CDrawer Интерактивность
При выводе слайда в окно библиотека поддерживает ряд интерактивных возможностей.

Функции навигации по графику и просмотра точек поддерживаются на уровне библиотеки ChartLib.
Горячие клавиши поддерживаются компонентом TSliChart.
Функции меню реализованы в утилите просмотра chdView.

Интерактивность: Навигация по двумерному графику

Навигация по двумерному графику осуществляется с помощью мыши и поддерживается интерфейсными функциями библиотеки CL_OnMouseMove, CL_OnMouseDown, CL_OnMouseUp.

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

Сдвиг графика производится движением мыши с нажатой правой кнопкой и одновременно нажатой клавишей Shift.

Масштабирование по оси производится, если потянуть за ось при нажатой правой кнопке мыши. Движение в сторону положительного направления оси увеличивает масштаб (растягивает график), в сторону отрицательного - уменьшает масштаб (сжимает график). Масштаб по второй оси не изменяется. Неподвижной на оси остаётся точка, с которой мы начали тянуть.

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

Интерактивность: Навигация по трёхмерному графику

Навигация по трёхмерному графику осуществляется только с помощью клавиатуры и поддерживается интерфейсной функцией библиотеки CL_OnKeyPress.

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

В обоих режимах просмотра действуют клавиши
 
Insert Переключение режима просмотра: активный / пассивный
Home Возврат в исходное положение сцены
AltLeftRight Растяжение-сжатие всей сцены по оси X
AltUpDown Растяжение-сжатие всей сцены по оси Y
CtrlLeftRight Растяжение-сжатие всей сцены синхронно по осям X и Y
CtrlUpDown Растяжение-сжатие всей сцены по оси Z

В пассивном режиме действуют клавиши
 
UpDownLeftRight Вращения сцены
ShiftUpDownLeftRight Сдвиг сцены относительно центра окна
PageUp Увеличение сцены
PageDown Уменьшение сцены

В активном режиме действуют клавиши
 
UpDown Перемещение вперёд-назад
LeftRight Поворот на месте влево-вправо
ShiftUpDownLeftRight Перемещение, не поворачиваясь, вверх-вниз-влево-вправо
PageUp Смотреть выше ("поднять голову")
PageDown Смотреть ниже ("опустить голову")
BackSpace Обернуться назад

Интерактивность: Просмотр точек графика

Просмотр точек графика поддерживается интерфейсными функциями библиотеки CL_OnMouseMove, CL_OnMouseDown, CL_OnMouseUp и CL_OnKeyPress.

Выбор подмножества точек графика при выделении области левой кнопкой мыши. Форму выделяемой области можно варьировать (прямоугольник, эллипс, полуплоскость, полоса). Щелчок на точке левой кнопкой мыши выбирает указанную точку или несколько сразу, если они перекрываются. Выбранные точки обводятся цветом (по умолчанию белым). Выбранными могут быть только точки, имеющие размер (S>1 и W>0).

Выдача сводной таблицы по выбранным точкам. Для каждой точки выводится текстовая строка TT. Перемещение по строкам таблицы синхронизировано с активизацией точки на графике.

Активизация любой точки нажатием правой кнопки мыши. Активизация отличается от выбора тем, что активной может быть только одна точка. Клавиши Left и Right активизируют предыдущую и следующую точку в пределах той же серии. Клавиши  и позволяют перемещаться по сериям. Активная точка подсвечивается (по умолчанию жёлтым цветом), рядом выводится текстовый комментарий TR. Нажатие правой кнопки мыши вне точек снимает активизацию.

Вывод комментария рядом с каждой из выбранных точек. Текст комментария задаётся для каждой точки свойством TN.

Подсветка точки, свечи или колонки гистограммы, на которой остановился курсор мыши (по умолчанию голубым цветом). Одновременно в статусную строку выводится текстовый комментарий, задаваемый свойством TB .

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

Интерактивность: Горячие клавиши

Компонент TSliChart поддерживает все описанные выше функции навигации и просмотра, и дополнительно определяет реакцию на горячие клавиши:
 
CtrlL Повторная загрузка из файла
CtrlR Перерисовка графика без чтения из файла
CtrlC
CtrlInsert
Копирование графика в буфер обмена
CtrlP Печать графика на принтере
CtrlT Вывод таблицы выделенных точек
CtrlPageUp Переход к следующему слайду
CtrlPageDown Переход к предыдущему слайду
CtrlM Циклическое переключение режимов выделения точек: добавление, удаление, инверсия выделения
CtrlS Циклическое переключение формы выделяемой области: прямоугольник, эллипс, полуплоскость, полоса
CtrlA Выделение всех точек (снятие, инвертирование - в зависимости от текущего режима выделения)
Tab
ShiftTab
Навигация по панелям слайда

Интерактивность: Утилита просмотра графиков chdView

Утилита chdView предназначена для просмотра графиков формата CHD в одном или нескольких окнах. Она поддерживает полный набор интерактивных возможностей, реализованных в библиотеке ChartLib и в компоненте TSliChart, и дополнительно предоставляет возможности работы с файлами, выделения подмножеств точек, работы со слайдами и фильмами. Доступ к этим возможностям осуществляется через меню, организованное в форме панели инструментов.

При вызове утилиты ей передаётся список загружаемых файлов:

chdView <опции> <файл> ... <опции> <файл> <опции>
Утилита воспринимает следующие опции (между именем опции и значением опции не должно быть пробела):
 
 -dИмяДиректории Имя директории, из которой будут считываться все последующие файлы. 
-wШиринаОкна Ширина окна программы просмотра графиков, в пикселах. 
-hВысотаОкна Высота окна программы просмотра графиков, в пикселах. 
-xЛевоОкна Позиция левого края окна программы просмотра графиков, в пикселах. 
-yВерхОкна Позиция верхнего края окна программы просмотра графиков, в пикселах.
-n Создать новый слайд. Если опция не указана перед именем файла, и этот файл не содержит собственной команды #NewSlide, то содержимое файла будет загружено на предыдущий слайд. 
-s Использовать встроенную статусную строку на каждом слайде.
-b Использовать двойную буферизацию. Ускоряет прорисовку графика и делает её более плавной, но требует дополнительного объёма памяти на хранение растрового изображения графика в каждом открытом окне.
-/ Игнорировать остаток командной строки.

При запуске без параметров утилита chdView показывает слайд с пустым графиком. В этом случае пользователь загружает CHD-файл для просмотра с помощью кнопок меню.

Интерактивность: Функции меню

Перечисленные ниже функции меню поддерживаются только утилитой chdView. Эта утилита реализована на базе компонента TSliChart и включена в дистрибутив ChartLib вместе с исходным кодом.
 
Основное меню Подменю

Меню состоит из двух частей. Слева расположены кнопки главного меню, справа - кнопки подменю. Кнопками главного меню пользователь переключается с одного подменю на другое. Каждое подменю объединяет группу близких по назначению функций.

Кнопки главного меню
 
File Загрузка, конвертация и печать CHD-файлов
View Установка параметров отображения
Select Выделение подмножества точек и выдача сводной таблицы по выделенным точкам 
Прокрутка фильмов, удаление и перемещение слайдов
Работа с сериями точек на текущем графике
Работа с окнами
Руководство, подсказки и прочая информация
Автоматически сформированное подменю из 12 наиболее популярных кнопок

Кнопки работы с файлами
 
Открыть CHD-файл и загрузить его содержимое на новый чистый слайд
Открыть CHD-файл и загрузить его содержимое вместо текущего слайда
Открыть CHD-файл и загрузить его содержимое поверх текущего слайда
Открыть CHD-файл и загрузить его содержимое в новое окно
Сохранить слайд как растровое изображение в файл формата BMP
Сохранить слайд как векторное изображение в файл формата EMF
Сохранить слайд как растровое изображение в файл формата GIF
Распечатать слайд
Закрыть все окна, выйти из программы

Кнопки параметров отображения
 
Отменить показ тектовых комментариев TR рядом с точками
Показывать тектовые комментарии TR только рядом с выделенными точками
Показывать тектовые комментарии TR рядом со всеми точками
Обновить слайд
Установить максимальный масштаб отображения для всех графиков на слайде. Максимальный масштаб позволяет увидеть все точки графика. 
Включить/отключить режим двойной буферизации. При включенной буферизации слайд прорисовывается быстрее и без мелькания на экране, но это требует большего объёма памяти. 

Кнопки выделения подмножества точек
 
Выделять точки
Снимать выделение с точек
Инвертировать выделение точек 
Выделить все точки графика
Форма выделителя области - прямоугольник
Форма выделителя области - эллипс
Форма выделителя области - полуплоскость
Форма выделителя области - полоса
Выделять/не выделять точки, находящиеся за пределами видимой в окне области графика
Вывести сводную таблицу по выделенным точкам

Кнопки операций со слайдами и фильмами
 
Перейти на первый слайд в фильме
Перейти на предыдущий слайд в фильме
Перейти на следующий слайд в фильме
Перейти на последний слайд в фильме
Запустить показ фильма. Все слайды показываются последовательно с заданной задержкой. 
Остановить показ фильма
Показывать фильм в цикле бесконечное число раз
Скопировать слайд в буфер
Очистить слайд, удалив с него все графики
Удалить слайд, изъять его из фильма
Переместить текущий слайд, поставив его первым в фильме 
Поменять местами текущий слайд и предыдущий
Поменять местами текущий слайд и следующий
Переместить текущий слайд, поставив его последним в фильме 
Выдать справочную информацию о количестве и именах слайдов

Кнопки для работы с сериями точек на графике
 
Включить/отключить отображение выбранной серии точек
Нарисовать выбранную серию точек поверх остальных элементов графика

Кнопки для работы с окнами
 
Прикрепить информационную таблицу к окну графика

Кнопки подсказок и документации
 
Руководство по формату CHD
Инструкция пользования утилитой chdView
Включить/отключить всплывающие подсказки на кнопках меню
Домашняя страница разработчика в Internet
Кратко о программе


ChartLive
---   © К. Воронцов   ---
1999-2001