|
Библиотека деловой
и научной графики
Версия 1.03, май 2001, © К. В. Воронцов, ММВБ
|
Библиотека ChartLib предназначена для построения графиков в пользовательских
прикладных программах. Функции библиотеки принимают входной поток данных
в формате CHD (CHart Description) и выводят
графическое изображение в окно прикладной программы или файл одного из
распространённых графических форматов.
Библиотека позволяет строить графики следующих типов
-
Двумерные графики, содержащие точки, линии и закрашенные площади.
-
Двумерные графики с разрывной горизонтальной осью, в частности многодневные
графики.
-
Несколько двумерных графиков на одном слайде с возможностью синхронизации
по одной или нескольким осям.
-
Биржевые графики с автоматической группировкой точек в интервальные гистограммы
или японские свечи.
-
Вертикальные и горизонтальные гистограммы.
-
Круговые диаграммы.
-
Сетевые и древовидные схемы.
-
Трёхмерные графики, содержащие точки, траектории, ленты и фигуры.
-
Трёхмерные поверхности.
Поддерживаются четыре механизма передачи входных данных
Поддерживаются три типа устройств вывода
-
Окно или любое другое устройство Windows, имеющее контекст.
-
Файл графического формата WMF или EMF.
-
Файл графического формата GIF.
Предлагаются на выбор три уровня использования библиотеки
-
Библиотека ChartLib.
Содержит базовый набор функций для преобразования потока данных в графическое
изображение. Наиболее удобна для он-лайновой генерации GIF-изображений
в Internet. Предназначена для программистов.
-
Компонент TSliChart.
Расширяет базовые возможности ChartLib под Delphi, упрощает построение
графиков в пользовательских приложениях. Предназначен для программистов.
-
Утилита chdView.
Приложение для просмотра CHD-файлов, предназначенное для конечных пользователей.
Для создания CHD-файлов требуется знание формата CHD, описанного в данном
руководстве.
Состав дистрибутива ChartLib для Windows
-
Динамическая библиотека ChartLib.dll.
-
Утилита chdView для интерактивного просмотра
графиков.
-
Утилита chdConv для конвертирования
CHD-файлов в WMF, EMF и GIF.
-
Примеры CHD-файлов.
-
Документация.
-
Исходный код компонента TSliChart для Delphi.
-
Исходный код утилит chdView и chdConv.
-
Демонстрационные примеры приложений на Visual C++ и Delphi с исходными
кодами.
Введение: входной формат
CHD
Синтаксис формата 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 года.
График был построен по входному потоку, содержавшему по 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
...
Введение: Пример 3
Несколько графиков на одном слайде
Продолжим пример с графиком хода торгов. Биржевые графики часто рисуют
друг под другом: сверху цены, снизу объёмы. Ход цены изображают с помощью
интервальных гистограмм или японских подсвечников:
Данные для этого графика те же самые, что и в примерах 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
Биржевые торги - необычный ракурс
Можно пойти дальше и задаться целью построить третий график по тем же колонкам
данных. Например, это могла бы быть гистограмма распределения объёмов торгов
по ценам. Кажется, под таким углом зрения ещё никто не смотрел на биржевые
торги:
Создадим ещё одну панель и разместим на ней гистограммную серию. Для
построения гистограммы распределения необходимы две дополнительных команды.
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, то есть число точек на графике.
Вот что в итоге получается:
Управляющие команды
Условные обозначения в описаниях команд:
-
Допустимые значения параметров выделяются полужирным. Как и команды,
они чувствительны к регистру. Поэтому команда Visible=on верна,
а команда Visible=On - нет.
-
Необязательные параметры команд заключаются в квадратные скобки [...]
-
Свойства со значением b являются булевскими (логическими) и принимают значения
on, yes, true или 1, обозначающие "да", и off, no, false или 0, обозначающие
"нет".
-
Свойства со значением color являются номером цвета в палитре
цветов.
Команды:
Общие свойства, применимые ко всем объектам
В этом разделе описаны свойства, которыми обладают все объекты без исключения:
слайды, панели, графики, оси, тексты.
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:
Если слайд имеет несколько панелей, а команда 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.
Команды:
Средства отладки
Отладочные команды предназначены для сброса служебной информации в файлы.
В процессе работы библиотека может генерировать файлы трёх типов:
-
Лог-файл. Содержит протокол всех сообщений об ошибках в порядке
их поступления. Имя лог-файла устанавливается интерфейсной функцией CL_WorkDebug.
Лог-файл отключается вызовом CL_WorkDebug(0). По умолчанию лог-файл отключён.
-
Дамп-файл. Используется для получения служебной и отладочной информации
командами Dump***. Включается/отключается командой DumpFile,
по умолчанию отключён.
-
Эхо-файл. Содержит точную копию входного потока строк, включая данные,
передаваемые через интерфейсную функцию CL_DataVector,
но не включая данные, передаваемые через CL_DataMatrix.
Включается/отключается командой EchoFile, по умолчанию
отключён.
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, но со следующими отличиями:
-
можно задать сразу несколько серий в одной команде, отделив их символами
/ или \;
-
в качестве значений свойств разрешается задавать не только числовые константы,
имена столбцов данных и переменных, но и произвольные выражения, заключённые
в круглые скобки, а также строковые константы со вставками;
-
у свойства может быть не указано вообще никакого значения (знак равенства
в этом случае также опускается);
-
команда определяет новую матрицу данных, столбцы которой соответствуют
всем свойствам всех серий, для которых не указано никакого значения;
-
если свойство X у серии опущено, оно будет взято у предыдущей серии.
Команда 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 позволяет добавлять
новые цвета и переопределять уже имеющиеся. Изменения, сделанные в палитре
цветов, глобальны, и влияют на все слайды и фильмы.
Свойства серий
Внешний вид серии точек на графике определяется набором её свойств. Каждое
свойство может быть либо общим для всей серии, либо индивидуальным для
каждой точки. Если свойство не задано, оно принимается равным стандартному
значению по умолчанию. Названия, смысл и стандартные значения всех свойств
перечисляются ниже.
Серия создаётся командой 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 оснащена встроенным калькулятором выражений. Выражения
используются главным образом в командах Let и Format
для определения вычислимых столбцов в матрицах данных. Кроме того, выражения
задаются в командах Status, DumpData,
DumpPcode
и в интерфейсной функции CL_ChartGetXYInfo.
Выражения строятся из переменных, констант, знаков операций, функций,
и скобок любого уровня вложенности.
В роли переменных выступают имена столбцов данных, введённых командами
NewData
и Let. Имена переменных могут состоять из любых символов,
однако если имя содержит спецсимволы (знаки операций, скобки) или пробелы,
его следует заключать в апострофы.
Область действия имён ограничивается текущим слайдом. Чтобы обратиться
к столбцу данных, определённому на другом слайде, следует использовать
"имя с точкой":
ИмяСлайда . ИмяСтолбцаДанных
Имена переменных и предопределённых констант чувствительны к регистру,
например PI - это константа, а pi - переменная; переменные XYZ и xyz различны.
В то же время имена функций не чувствительны к регистру, например sin,
SIN и Sin - три корректных имени функции синуса.
Выражения:
Типы данных и константы
Допустимые типы данных:
-
логический bool (0 или 1);
-
целый int (4-байта);
-
вещественный с двойной точностью real;
-
строковой string (строки произвольной длины);
-
дата-время datetime (число секунд, прошедших с 1 января 1970);
-
ошибка error.
Приведение типов в выражениях осуществляется автоматически, но можно использовать
также функции преобразования типа (см. ниже). Типы 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 |
число точек, которыми образована свеча |
Характеристики точки слайда
Группа переменных используется в двух контекстах:
-
в команде Status для формирования текста статусной
строки, выводимого при перемещении курсора мыши;
-
в выражениях, передаваемых интерфейсной функции CL_ChartGetXYInfo
для получения информации о точке серии, ближайшей к указанной точке слайда.
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 языка С. Числовой формат
содержит знак %, за которым следуют необязательные параметры:
-
[flag] - комбинация флагов -, +, 0, пробел, #;
-
[width] - минимальная длина выводимой строки в символах;
-
[.prec] - число знаков после запятой при выводе вещественных чисел.
и завершается одной из ключевых букв 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 группы:
-
Функции с фиксированным числом аргументов (sqrt, sin, exp, mod).
-
Функции с необязательными аргументами (log, rand, setbit).
-
Функции с произвольным числом аргументов (min, if, steps, xor).
-
Функции без аргументов (now(), rand()).
Для функций без аргументов пустые скобки обязательны.
Ниже приводится полный перечень допустимых функций с их спецификациями
и описаниями. Спецификации указывают типы всех аргументов и возвращаемого
значения.
Спецификации приводятся в виде
имя_функции (типы_входных_аргументов): тип_значения
Необязательные аргументы заключаются в квадратные скобки [ ]. Аргументы,
которые могут повторяться более одного раза, заключаются в фигурные скобки
{ }. Слово 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 в программе на С или С++,
надо включить в свой проект заголовочный файл cl.h:
#include "cl.h"
Работа с библиотекой ChartLib включает следующие обязательные шаги:
-
Инициализация библиотеки функцией CL_WorkStart.
-
Формирование слайда функциями CL_DataLine, CL_DataVector,
CL_DataFile.
-
Создание нового рисователя CL_DrawerCreate,
либо активизация старого CL_DrawerUse.
-
Установка размеров слайда CL_SlideSetRect
на поверхности рисователя, в пикселах.
-
Установка области просмотра для всех графиков на слайде CL_SlideMaxZoom
или CL_ChartSetZoom.
-
Оптимальное размещение областей на слайде CL_SlideRefresh.
-
Рисование слайда целиком CL_SlideDraw, либо
порциями CL_SlideBeginDraw и CL_SlideContinueDraw.
-
Окончание работы CL_WorkFinish.
Передача строк в библиотеку и из библиотеки осуществляется через тип clString:
typedef const char* clString;
При передаче строк следует соблюдать два правила:
-
Если строка служит для передачи данных в интерфейсную функцию, то она передаётся
как clString и библиотека не может её модифицировать.
-
Если строка служит для возвращения данных из интерфейсной функции, то она
передаётся как 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
Компонент TSliChart предоставляет удобный интерфейс к библиотеке ChartLib
для Delphi и несколько расширяет её возможности. В частности, он реализует
двойную буферизацию при выводе в окно, печать на принтере и сохранение
слайда в форматах GIF, BMP и EMF.
TSliChart:
Инсталяция компонента
Перед началом инсталяции необходимо убедиться, что файл ChartLib.dll из
дистрибутива ChartLib скопирован в системную директорию Windows. Далее
компонент инсталируется стандартным для Delphi способом:
-
Выбрать в меню Component пункт Install Component.
-
Выбрать с помощью Unit file name/Browse файл src\WinDelphi\SliChart.pas
из дистрибутива ChartLib.
-
В окне Package выполнить компиляцию (кнопка Compile) и установку (кнопка
Install) пакета.
-
Закрыть текущий проект с помощью File/Close All, сохранив проект.
После инсталяции компонент должен появиться в палитре Delphi в разделе
Samples под именем SliChart.
TSliChart:
Использование компонента в своём проекте
Компонент используется в среде Delphi аналогично другим наследникам класса
TCustomControl. В команде USES необходимо указать модуль SliChart.
Важно помнить о следующих особенностях компонента TSliChart:
-
Компонент всегда отображает в точности один слайд. Однако можно переключиться
с одного слайда на другой с помощью CHD-команды Slide.
-
Чтобы объект типа TSliChart, размещённый на форме, обрабатывал события
мыши и клавиатуры, свойство формы ActiveControl должно указывать на этот
объект. Установить это свойство можно как во время разработки, так и во
время выполнения.
-
Чтобы на графике можно было выделять точки, надо установить для свойства
SelectMode
любое значение кроме smNone.
-
Чтобы на графике можно было выделять области, надо установить для свойства
SelectShape
любое значение кроме shNone.
-
Чтобы работала функция построения сводной таблицы по выделенным точкам,
необходимо установить свойство SelectedPointsGrid.
Рекомендация 1: используйте заголовочные chd-файлы
Компонент TSliChart не позволяет описать слайд во время разработки.
Задать внешний вид, структуру данных и структуру слайда можно только программным
путём с помощью CHD-команд. Для выполнения отдельной команды у компонента
имеется процедура DataLine. Однако лучший способ
сформировать слайд - это собрать все команды в отдельный "заголовочный"
CHD-файл и загружать его один раз процедурой DataFile.
Это даёт дополнительное преимущество - заголовочный файл можно исправлять,
меняя внешний вид графика без перекомпиляции приложения.
Рекомендация 2: выбирайте оптимальный момент для обновления слайда
Во время поступления данных на слайд ни библиотека, ни компонент не
обновляют слайд. Это сделано для повышения эффективности, чтобы обновление
производить один раз после серии операций с графиком. Обновление включает
установку масштаба SlideMaxZoom и формирование
изображения
SlideRefresh.
Рекомендация 3: используйте команду SetFilm,
чтобы организовать показ фильмов
По умолчанию, если команда SetFilm не выполнена, слайд помещается в
фильм с именем default. Это специальный фильм для размещения одиночных
слайдов. В нём невозможна прокрутка, перемещение и удаление слайдов.
Класс 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
Строковая таблица для вывода сводной таблицы выделенных точек. Если данное
свойство не установлено, вывод таблицы по нажатию
будет невозможен.
Свойство SlideNo: integer
Регистрационный номер слайда в библиотеке ChartLib. Именно этот номер передаётся
функциям библиотеки в качестве первого аргумента.
Свойство доступно только для чтения.
Свойство Busy: boolean
Равен True, если слайд находится в состоянии перерисовки. В противном случае
False.
Свойство доступно только для чтения.
Свойство ChartLibError: integer
Номер последней ошибки, произошедшей в функциях библиотеки ChartLib.
Свойство доступно только для чтения.
Класс 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 использует объектно-ориентированный подход при работе
с устройствами отображения графической информации. Все устройства
являются наследниками абстрактного рисователя CDrawer,
в котором объявлены, но не определены, базовые функции рисования. Рисователь
представляет собой интерфейс между основным кодом библиотеки ChartLib и
конкретной графической библиотекой. В настоящее время поддерживаются графические
библиотеки gd и Microsoft
Windows GDI. Однако спектр поддерживаемых библиотек может быть легко
расширен путём добавления новых рисователей.
Чтобы изображение выглядело одинаково на различных устройствах, разработчики
классов-наследников CDrawer должны придерживаться единых соглашений о том,
что делает каждая функция рисования, и как различные функции взаимодействуют
друг с другом. Эти соглашения описаны в данном разделе.
Для добавление нового рисователя с именем Xyz необходимо выполнить следующие
шаги:
-
Определить новый класс CDrawXyz путём наследования класса CDrawer. Реализовать
в нём все виртуальные функции рисования. Поместить описание нового класса
в файлы clDrwXyz.cpp и clDrwXyz.h. В начале заголовочного файла clDrwXyz.h
определить макрос __CL_XYZ_H__.
-
В файле clTypes.h добавить код нового устройства CL_DRAW_XYZ в перечисление
enum TDrawerType.
-
В начало файла cl.cpp добавить строку
-
В функции CL_DrawerCreate файла cl.cpp добавить вызов конструктора нового
класса:
#ifdef __CL_XYZ_H__
case CL_DRAW_XYZ:
newdraw = new CDrawXyz (ddef); break;
#endif
-
Перекомпилировать библиотеку ChartLib.
Рисователи:
Абстрактный рисователь 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 не нужно в следующих случаях:
-
если рисователь не создаёт объектов, связанных с внешним устройством,
-
если внешнее устройство не разрушается,
-
если при разрушении оно само удаляет все свои объекты.
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.
Функции меню реализованы в утилите просмотра
chdView.
Навигация по двумерному графику осуществляется с помощью мыши и поддерживается
интерфейсными функциями библиотеки CL_OnMouseMove,
CL_OnMouseDown, CL_OnMouseUp.
Масштабирование производится при выделении прямоугольной области
правой кнопкой мыши. Выделение слева направо увеличивает масштаб, выделение
справа налево возвращает график к автоматическому масштабу, при котором
видны все точки графика.
Сдвиг графика производится движением мыши с нажатой правой кнопкой
и одновременно нажатой клавишей Shift.
Масштабирование по оси производится, если потянуть за ось при
нажатой правой кнопке мыши. Движение в сторону положительного направления
оси увеличивает масштаб (растягивает график), в сторону отрицательного
- уменьшает масштаб (сжимает график). Масштаб по второй оси не изменяется.
Неподвижной на оси остаётся точка, с которой мы начали тянуть.
Сдвиг по оси производится, если потянуть за ось при нажатой левой
кнопке мыши. Направление сдвига совпадает с направлением движения вдоль
оси. При этом масштаб по второй оси не изменяется.
Интерактивность:
Навигация по трёхмерному графику
Навигация по трёхмерному графику осуществляется только с помощью клавиатуры
и поддерживается интерфейсной функцией библиотеки CL_OnKeyPress.
Просмотр трёхмерной сцены может производиться в пассивном или активном
режиме. В первом случае наблюдатель, находясь в неподвижной точке, вращает,
сдвигает и масштабирует сцену. Этот режим предназначен для общего обзора
сцены. Во втором случае наблюдатель перемещается по сцене в произвольных
направлениях, что позволяет детально изучить сцену. По умолчанию установлен
пассивный режим.
В обоих режимах просмотра действуют клавиши
|
Переключение режима просмотра: активный / пассивный |
|
Возврат в исходное положение сцены |
|
Растяжение-сжатие всей сцены по оси X |
|
Растяжение-сжатие всей сцены по оси Y |
|
Растяжение-сжатие всей сцены синхронно по осям X и Y |
|
Растяжение-сжатие всей сцены по оси Z |
В пассивном режиме действуют клавиши
|
Вращения сцены |
|
Сдвиг сцены относительно центра окна |
|
Увеличение сцены |
|
Уменьшение сцены |
В активном режиме действуют клавиши
|
Перемещение вперёд-назад |
|
Поворот на месте влево-вправо |
|
Перемещение, не поворачиваясь, вверх-вниз-влево-вправо |
|
Смотреть выше ("поднять голову") |
|
Смотреть ниже ("опустить голову") |
|
Обернуться назад |
Просмотр точек графика поддерживается интерфейсными функциями библиотеки
CL_OnMouseMove,
CL_OnMouseDown, CL_OnMouseUp и CL_OnKeyPress.
Выбор подмножества точек графика при выделении области левой
кнопкой мыши. Форму выделяемой области можно варьировать (прямоугольник,
эллипс, полуплоскость, полоса). Щелчок на точке левой кнопкой мыши выбирает
указанную точку или несколько сразу, если они перекрываются. Выбранные
точки обводятся цветом (по умолчанию белым). Выбранными могут быть только
точки, имеющие размер (S>1 и W>0).
Выдача сводной таблицы по выбранным точкам. Для каждой точки
выводится текстовая строка TT. Перемещение
по строкам таблицы синхронизировано с активизацией точки на графике.
Активизация любой точки нажатием правой кнопки мыши. Активизация
отличается от выбора тем, что активной может быть только одна точка. Клавиши
и
активизируют предыдущую и следующую точку в пределах той же серии. Клавиши
и позволяют перемещаться
по сериям. Активная точка подсвечивается (по умолчанию жёлтым цветом),
рядом выводится текстовый комментарий TR.
Нажатие правой кнопки мыши вне точек снимает активизацию.
Вывод комментария рядом с каждой из выбранных точек. Текст комментария
задаётся для каждой точки свойством TN.
Подсветка точки, свечи или колонки гистограммы, на которой остановился
курсор мыши (по умолчанию голубым цветом). Одновременно в статусную строку
выводится текстовый комментарий, задаваемый свойством TB
.
Вывод текущих координат курсора мыши в статусную строку. Если
мышь работает в режиме выделения, сдвига или масштабирования, в статусной
строке сообщается размер выделяемой области.
Компонент TSliChart поддерживает все
описанные выше функции навигации и просмотра, и дополнительно определяет
реакцию на горячие клавиши:
|
Повторная загрузка из файла |
|
Перерисовка графика без чтения из файла |
|
Копирование графика в буфер обмена |
|
Печать графика на принтере |
|
Вывод таблицы выделенных точек |
|
Переход к следующему слайду |
|
Переход к предыдущему слайду |
|
Циклическое переключение режимов выделения точек: добавление, удаление,
инверсия выделения |
|
Циклическое переключение формы выделяемой области: прямоугольник, эллипс,
полуплоскость, полоса |
|
Выделение всех точек (снятие, инвертирование - в зависимости от текущего
режима выделения) |
|
Навигация по панелям слайда |
Интерактивность:
Утилита просмотра графиков chdView
Утилита chdView предназначена для просмотра графиков формата CHD в одном
или нескольких окнах. Она поддерживает полный набор интерактивных возможностей,
реализованных в библиотеке ChartLib и в компоненте TSliChart,
и дополнительно предоставляет возможности работы с файлами, выделения подмножеств
точек, работы со слайдами и фильмами. Доступ к этим возможностям осуществляется
через меню, организованное в форме панели инструментов.
При вызове утилиты ей передаётся список загружаемых файлов:
chdView <опции> <файл> ...
<опции> <файл> <опции>
Утилита воспринимает следующие опции (между именем опции и значением опции
не
должно быть пробела):
-dИмяДиректории |
Имя директории, из которой будут считываться все последующие файлы. |
-wШиринаОкна |
Ширина окна программы просмотра графиков, в пикселах. |
-hВысотаОкна |
Высота окна программы просмотра графиков, в пикселах. |
-xЛевоОкна |
Позиция левого края окна программы просмотра графиков, в пикселах. |
-yВерхОкна |
Позиция верхнего края окна программы просмотра графиков, в пикселах. |
-n |
Создать новый слайд. Если опция не указана перед именем файла, и этот
файл не содержит собственной команды #NewSlide,
то содержимое файла будет загружено на предыдущий слайд. |
-s |
Использовать встроенную статусную строку на каждом слайде. |
-b |
Использовать двойную буферизацию. Ускоряет прорисовку графика и делает
её более плавной, но требует дополнительного объёма памяти на хранение
растрового изображения графика в каждом открытом окне. |
-/ |
Игнорировать остаток командной строки. |
При запуске без параметров утилита chdView показывает слайд с пустым
графиком. В этом случае пользователь загружает CHD-файл для просмотра с
помощью кнопок меню.
Перечисленные ниже функции меню поддерживаются только утилитой chdView.
Эта утилита реализована на базе компонента TSliChart и включена в дистрибутив
ChartLib вместе с исходным кодом.
|
Основное меню |
Подменю |
Меню состоит из двух частей. Слева расположены кнопки главного меню,
справа - кнопки подменю. Кнопками главного меню пользователь переключается
с одного подменю на другое. Каждое подменю объединяет группу близких по
назначению функций.
Кнопки главного меню
|
Загрузка, конвертация и печать CHD-файлов |
|
Установка параметров отображения |
|
Выделение подмножества точек и выдача сводной таблицы по выделенным
точкам |
|
Прокрутка фильмов, удаление и перемещение слайдов |
|
Работа с сериями точек на текущем графике |
|
Работа с окнами |
|
Руководство, подсказки и прочая информация |
|
Автоматически сформированное подменю из 12 наиболее популярных кнопок |
Кнопки работы с файлами
|
Открыть CHD-файл и загрузить его содержимое на новый чистый слайд |
|
Открыть CHD-файл и загрузить его содержимое вместо текущего слайда |
|
Открыть CHD-файл и загрузить его содержимое поверх текущего слайда |
|
Открыть CHD-файл и загрузить его содержимое в новое окно |
|
Сохранить слайд как растровое изображение в файл формата BMP |
|
Сохранить слайд как векторное изображение в файл формата EMF |
|
Сохранить слайд как растровое изображение в файл формата GIF |
|
Распечатать слайд |
|
Закрыть все окна, выйти из программы |
Кнопки параметров отображения
|
Отменить показ тектовых комментариев TR
рядом с точками |
|
Показывать тектовые комментарии TR только
рядом с выделенными точками |
|
Показывать тектовые комментарии TR рядом
со всеми точками |
|
Обновить слайд |
|
Установить максимальный масштаб отображения для всех графиков на слайде.
Максимальный масштаб позволяет увидеть все точки графика. |
|
Включить/отключить режим двойной буферизации. При включенной буферизации
слайд прорисовывается быстрее и без мелькания на экране, но это требует
большего объёма памяти. |
Кнопки выделения подмножества точек
|
Выделять точки |
|
Снимать выделение с точек |
|
Инвертировать выделение точек |
|
Выделить все точки графика |
|
Форма выделителя области - прямоугольник |
|
Форма выделителя области - эллипс |
|
Форма выделителя области - полуплоскость |
|
Форма выделителя области - полоса |
|
Выделять/не выделять точки, находящиеся за пределами видимой в окне
области графика |
|
Вывести сводную таблицу по выделенным точкам |
Кнопки операций со слайдами и фильмами
|
Перейти на первый слайд в фильме |
|
Перейти на предыдущий слайд в фильме |
|
Перейти на следующий слайд в фильме |
|
Перейти на последний слайд в фильме |
|
Запустить показ фильма. Все слайды показываются последовательно с заданной
задержкой. |
|
Остановить показ фильма |
|
Показывать фильм в цикле бесконечное число раз |
|
Скопировать слайд в буфер |
|
Очистить слайд, удалив с него все графики |
|
Удалить слайд, изъять его из фильма |
|
Переместить текущий слайд, поставив его первым в фильме |
|
Поменять местами текущий слайд и предыдущий |
|
Поменять местами текущий слайд и следующий |
|
Переместить текущий слайд, поставив его последним в фильме |
|
Выдать справочную информацию о количестве и именах слайдов |
Кнопки для работы с сериями точек на графике
|
Включить/отключить отображение выбранной серии точек |
|
Нарисовать выбранную серию точек поверх остальных элементов графика |
Кнопки для работы с окнами
|
Прикрепить информационную таблицу к окну графика |
Кнопки подсказок и документации
|
Руководство по формату CHD |
|
Инструкция пользования утилитой chdView |
|
Включить/отключить всплывающие подсказки на кнопках меню |
|
Домашняя страница разработчика в Internet |
|
Кратко о программе |
ChartLive
--- © К. Воронцов ---
1999-2001