Отображатель массивов (ОМ) фирмы Compaq® позволяет наблюдать как данные числовых массивов, так и их графическое представление. Отображатель содержит в качестве ядра графическую библиотеку OpenGL®, процедуры которой обеспечивают графический вывод. (Об употреблении OpenGL® в Фортране см., например, [1].) Дополнительно ОМ помогает манипулировать графическими данными, предоставляя возможности для перемещения, поворота и масштабирования изображения, а также для изменения способа его представления на экране. ОМ содержит:
Массив, переданный ОМ, отображается в двух видах:
Процедуры библиотеки Aview позволяют приложениям CVF или Visual C++ отображать (посредством OLE-автоматизации) данные массива, применяя ОМ. Также данные массива можно сохранить в виде файла, который загружается в ОМ в процессе его автономного использования. ActiveX®-процедуры (OCX) библиотек Avis2D и AvisGrid могут быть использованы любой поддерживающей автоматизацию средой, например Visual C++, Visual Basic® или CVF, для отображения массивов в разнообразных графических видах. Процедуры Avis2D обеспечивают при выполнении графического вывода более 100 свойств, методов и событий; процедуры AvisGrid применяются для создания представляющих массивы таблиц и предоставляют около 30 свойств, методов и событий. Возможны несколько вариантов употребления ОМ. Они, а также присущие им преимущества и недостатки перечислены в табл. 1.
Таблица 1. Варианты применения ОМ
Вариант | Преимущества | Недостатки |
---|---|---|
Загрузка agl-файла, созданного ранее выполненным приложением | Не требует написания специального кода для вызова ОМ | Нет возможности автоматизировать изменение отображаемых данных |
Использование отладчика CVF (порядок употребления см. в главе документации, посвященной отладчику) | Не требует написания специального кода; работает с проектом любого типа | Требует ручного задания свойств массива и настройки ОМ; не может быть использован в Visual C++ или Visual Basic, а также в Release-режиме CVF |
Использование fagl-подпрограмм или в случае СИ - agl-функций | Небольшое число процедур и, следовательно, небольшие затраты на программирование; процедуры работают с проектами любого типа и в Debug-, и Release-режиме | Требует ручного задания свойств массива и настройки ОМ |
Использование fagl- и fav-подпрограмм или в случае СИ++ - agl-функций и функций класса CAViewer | Можно программно задавать свойства массива и выполнять настройки ОМ; процедуры работают с проектами любого типа; последовательно в одном экземпляре ОМ можно отображать несколько массивов | Потребуется освоить большое число процедур (более 100); функции класса CAViewer нельзя применять в СИ (необходим СИ++) |
Использование ActiveX-процедур библиотек Avis2D и/или AvisGrid | Дает возможность выводить создаваемые ОМ графические образы и таблицы данных без вызова ОМ; обеспечивает более быстрое воспроизведение образов и больше возможностей для настройки параметров | Употребляется только в Windows-приложениях Фортрана или MFC в случае Visual C++. Заметим, что в Visual Basic большинство EXE-проектов могут использовать процедуры библиотек Avis2D и AvisGrid; потребуется освоить большое число Avis2D/AvisGrid-процедур; Avis2D и AvisGrid процедуры не могут отображать HDF и текстовые файлы |
Массивы отображаются на двумерной сетке (рис. 1, а).
Рис. 1. Отображение массива: а - двумерная сетка ОМ; б - растровая карта
При этом ОМ предоставляет следующие видовые режимы:
Перечисленные режимы могут быть заданы как в ОМ непосредственно, так и в программе, из которой ОМ запускается. В ОМ переключение режима выполняется либо из меню (рис. 2, а), либо в результате выбора соответствующей иконки (рис. 2, б).
Рис. 2. Выбор видового режима: а - подпункты меню View;б - соответствующие им иконки
Рассмотрим пример употребления ОМ для вывода 3D-фигуры.
Пусть необходимо вывести параболоид, задаваемый уравнением
z = x2 + y2.
Создадим для этого двумерный массив bo, применив код
subroutine frame(bo, m, n) ! Подпрограмма формирует массив bo,
implicit none ! содержащий точки параболоида
integer(4) :: m, n
integer(4) :: i, j
real(4) :: bo(m, n), x, y
do j = 1, n ! Формирование массива bo
do i = 1, m
! x- и y-координаты точки параболоида
x = float(i - m /2)
y = float(j - n /2)
bo(i, j) = x * x + y * y ! bo(i, j) содержит z-координату точки параболоида
end do
end do
end subroutine frame
Отображение массива обеспечит программа
program para
use avdef
use avviewer
use dflib
implicit none ! Данные о параболоиде z = x2 + y2
! Протяженности массива bo по первому и второму измерениям
integer(4) :: m = 20, n = 20
real(4), allocatable :: bo(:, :) ! Массив точек параболоида
!dec$attributes array_visualizer :: bo
integer(4) hv, status
character(1) :: key
allocate (bo(m, n))
call frame(bo, m, n) ! Формирование параболоида
call faglStartWatch(bo, status) ! Сообщаем ОМ имя отображаемого массива
print *, "Starting Array Viewer"
call favStartViewer(hv, status) ! Создаем экземпляр ОМ
call favSetArray(hv, bo, status) ! Отображаем массив bo
! Задаем имя, выводимое ОМ при отображении массива bo
call favSetArrayName(hv, "Paraboloid", status)
! Показываем ОМ на экране
call favShowWindow(hv, AV_TRUE, status)
print *, "Press any key to close down the viewer"
key = getcharqq( )
call favEndViewer(hv, status) ! Закрываем ОМ
call faglEndWatch(bo, status) ! Удаляем массив из списка наблюдения
deallocate(bo)
end program para ! Результат приведен на рис. 3
Рис. 3. Параболоид подпрограммы frame
Сформированный подпрограммой frame массив содержит фрагмент параболоида, пересекаемого вертикальными плоскостями. Чтобы получить более целостную картину, сформируем параболоид, обратившись к подпрограмме frame2, которая возвращает приведенную на рис. 4 каркасную модель параболоида.
Рис. 4. Параболоид в виде граней: а – каркасная модель; б – угол разбиения
subroutine frame2(bo, nd, ch) ! Подпрограмма формирует массив bo,
implicit none ! содержащий точки параболоида
integer(4) :: nd, ch
integer(4) :: i, j, k
real(4) :: bo(4, nd * ch)
real(4) :: al, dal, dh, hp
real(4) :: hcover = 20.0 ! Высота параболоида
! Формируем массив bo, содержащий точки параболоида
dh = hcover / real(ch - 1) ! Расстояние между сечениями
! dal – приращение угла разбиения al, используемое при переходе
! от одной точки разбиения сечения к другой (см. рис. 4, б)
dal = 4.0 * asin(1.0) / real(nd) ! dal = 2π / n
hp = 0.0 ! Низ параболоида в начале координат
k = 0
do i = 1, ch ! Формирование массива bo
al = 0.0 ! Начальный угол разбиения
do j = 1, nd
k = k + 1
! Используем параметрическое уравнение окружности
! x- и y-координаты точки параболоида
bo(1:2, k) = sqrt(hp) * (/ cos(al), -sin(al) /)
bo(3, k) = hp ! z-координата
al = al + dal
end do
hp = hp + dh
end do
bo(4, :) = 0.0 ! Цвет вывода - самый темный
end subroutine frame2
Вызов frame2 выполним в программе para, заменив им вызов подпрограммы frame:
integer(4) :: nd = 24 ! Число разбиений одного сечения параболоида
integer(4) :: ch = 7 ! Число пересекающих параболоид плоскостей
. . .
allocate(bo(4, nd * ch))
call frame2(bo, nd, ch)
Переключившись после отображения массива в режим векторного графа и погасив вывод осей, получим приведенное на рис. 5 изображение.
Рис. 5. Параболоид из frame2 в режиме векторного графа
Фигура, нарисованная в режиме векторного графа, похожа на параболоид, но представляется только в виде точек. В 3D-режиме ОМ образ массива bo представляется рис. 6, а, плоский вид - рис. 6, б.
Рис. 6. Представление массива bo: а – 3D-режим; б – плоский вид
Иными словами, на этих рисунках мы наблюдаем закономерности изменения координат принадлежащих параболоиду точек, размещенных в массиве bo подпрограммой frame2.
Чтобы получить тонированное 3D-изображение параболоида, подобное приведенному на рис. 5, воспользуемся подпрограммой frame3, в которой точки рассчитываются таким же образом, как и в подпрограмме frame2, и размещаются в массиве botemp, а затем для каждой точки параболоида отыскивается соответствующие ей индексы в массиве bo формы (m, n). Эти индексы вычисляются из предположения, что нижняя точка параболоида имеет индексы m/2 и n/2.
subroutine frame3(bo, m, n, nd, ch) ! Подпрограмма формирует массив bo,
implicit none ! содержащий точки параболоида
integer(4) :: m, n, nd, ch
integer(4) :: i, j, k, ibo, jbo
real(4) :: bo(m, n), botemp(3, nd * ch)
! Максимальные значения координат параболоида
real(4):: xma, yma
real(4):: x, y, z, bomax
real(4) :: al, dal, dh, hp
real(4) :: hcover = 20.0 ! Высота параболоида
! Формируем массив botemp, содержащий координаты точек параболоида
dh = hcover / real(ch - 1) ! Расстояние между сечениями
! dal - приращение угла разбиения al, используемое при переходе
! от одной точки разбиения сечения к другой (см. рис. 4, б)
dal = 4.0 * asin(1.0) / real(nd) ! dal = 2π/n
hp = 1.0e-7 * hcover ! Низ параболоида в начале координат
k = 0
do i = 1, ch ! Формирование массива botemp
al = 0.0 ! Начальный угол разбиения
do j = 1, nd
k = k + 1
! Используем параметрическое уравнение окружности
! x- и y-координаты точки параболоида
botemp(1:2, k) = sqrt(hp) * (/ cos(al), -sin(al) /)
botemp(3, k) = hp ! z-координата
al = al + dal
end do
hp = hp + dh
end do
bo = -1.0 ! Инициализация массива bo
xma = maxval(botemp(1, :));
yma = maxval(botemp(2, :))
do i = 1, k ! Формируем теперь массив bo
x = botemp(1, i); y = botemp(2, i)
ibo = m / 2 * (1.0 + x / xma); jbo = n / 2 * (1.0 + y / yma)
ibo = min(m, ibo); ibo = max(1, ibo)
jbo = min(n, jbo); jbo = max(1, jbo)
z = botemp(3, i)
bo(ibo, jbo) = z
end do
! Не все элементы массива bo могут быть определены в предшествующем цикле
! Заменим каждый отрицательный элементы массива bo
! его наибольшим элементом
bomax = maxval(bo)
where(bo < 0.0) bo = bomax
end subroutine frame3
Вызов frame3 выполним в программе para, заменив им вызов подпрограммы frame:
integer(4) :: nd = 100 ! Число разбиений одного сечения параболоида
integer(4) :: ch = 50 ! Число пересекающих параболоид плоскостей
integer(4) :: m = 20, n = 20 ! Протяженности массива bo
. . .
allocate(bo(m, n))
call frame3(bo, m, n, nd, ch) ! Результат приведен на рис. 7
Рис. 7. 3D-вид созданного в frame3 параболоида
Для всех видов графиков, кроме векторного, строка массива ассоциируется с осью x, столбец - с осью y. Значение соответствующего элемента массива - с осью z.
Характер воспроизведения изображения можно изменять, работая непосредственно в ОМ. Для этой цели существуют команды, доступ к которым осуществляется через меню (рис. 8).
Рис. 8. Меню ОМ
Помимо реализуемых через меню возможностей в ОМ можно, применяя мышь, вращать изображение и выделять требуемый диапазон данных в содержащей их таблице (рис. 9).
Рис. 9. Таблица данных ОМ
Для вращения изображения достаточно разместить мышь на поле графического вывода, нажать правую кнопку мыши и затем, оставаясь на поле вывода, перемещать мышь в произвольном направлении (рис. 10).
Рис. 10. Три проекции параболоида
Многие предоставляемые ОМ возможности, доступ к которым осуществляется через пункты меню File, Edit или Help (рис. 11), традиционны и не требуют специальных пояснений.
Рис. 11. Пункты меню ОМ: а – File; б – Edit; в – Help
Доступ к иным операциям ОМ обеспечивают пункты меню View, Settings, Colors, Palette и Data (рис. 12).
Рис. 12. Пункты меню ОМ: а – View; б – Settings; в – Colors; г – Palette; д – Data
Действие некоторых подпунктов, например Toolbars или Status Bar из меню Settings, традиционно. Других - таких, как Background (цвет фона) из меню Colors или Gray Scale (оттенки серого цвета) из меню Palette,- понятно интуитивно. Некоторые возможности требуют пояснений, к изложению которых мы и переходим.
Выбор подпункта Home View вернет повернутое изображение либо в заданное по умолчанию положение, либо в положение установленное в результате действия подпункта Set Home.
Те же результаты получатся при работе с иконками
Установить соответствие между точкой на поверхности и ячейкой таблицы данных позволяет маркер, который появится на изображении после выбора Show Marker. Когда маркер присутствует на рисунке, то каждый двойной удар мыши по ячейке таблицы вызовет его перемещение в соответствующую точку изображения, и наоборот, каждый двойной удар мыши по точке на фигуре вызовет, во-первых, перемещение в эту точку маркера и, во-вторых, выделение соответствующей ячейки данных (рис. 13).
Рис. 13. Маркер и таблица данных
Замечания:
Выбор Show Palette приведет к появлению столбца, отображающего используемую палитру цветов, с указанием соответствия оттенок – z-координата объекта (рис. 14).
Рис. 14. Фигура и палитра
Вывод и удаление столбика с палитрой выполняется также кнопкой
Вид палитры выбирается в меню Palette из списка:
По умолчанию используется система цветов RGB, в которой результирующий цвет определяется как смесь красного, зеленого и синего компонентов. После выбора в меню Palette пункта Edit появится окно (рис. 15), в котором можно перейти к системе цветов HSV (оттенок - насыщение - величина) и выполнить также иные операции по настройке палитры.
Рис. 15. Настройка палитры цветов
Зона вывода (ЗВ) - это отображаемый диапазон таблицы данных. По умолчанию отображается вся таблица (т. е. весь массив). Так, в рассматриваемом параболоиде протяженность каждого измерения равна 20, а нижняя граница - единице. ЗВ, однако, можно изменить, указав нижние границы и протяженности каждого измерения массива. Установим, к примеру, нижнюю границу каждого измерения, равной двум, а протяженность, равной пяти. Используем для этого приведенный на рис. 16 диалог, запускаемый в результате выполнения цепочки Settings – ROI.
Рис. 16. Задание зоны вывода
Нажатие OK приведет к изменению таблицы данных (рис. 17, ,а и изображения (рис. 17, б).
Рис. 17. Таблица данных и изображение после изменения зоны вывода
Далее, используя приведенный на рис. 18 навигатор, можно либо перемещаться по изображению, сохраняя заданный размер ЗВ, либо выполнять ее увеличение или уменьшение.
Рис. 18. Навигатор: а – просмотр изображения; б – изменение ЗВ
Кроме того, приведенное на рис. 16 окно, позволяет менять, используя радиокнопки Row и Col, порядок строк и столбцов (в массивах ранга 2 в случае Фортрана строки задаются первым измерением, а столбцы - вторым; в массивах СИ и Бейсика порядок задание строки и столбцов обратный) и задавать величину нижней границы (поле Lower Bound), устанавливая ее, например, равной значению, заданному в программе. По умолчанию нижняя граница каждого измерения равна единице.
Заметим, что в заданной ЗВ ограничить область вывода можно, выделив в таблице прямоугольник данных и нажав на левую кнопку из рис. 18, б.
Становится возможным после активизации пункта Cell Edit Enabled в приведенном на рис. 19 окне и нажатия кнопки OK.
Рис. 19. Способ вывода числовых данных
Окно появляется после выбора Settings – Data View. Собственно редактирование данных становится возможным после двойного щелчка мышью по клетке таблицы данных. Ввод новых данных и нажатие на Enter вызовет перестройку изображения.
Другие возможности окна следуют из имеющихся на нем надписей.
Задается в окне Settings - Graph (рис. 20).
Рис. 20. Способ вывода изображения
Установленная по умолчанию конфигурация (приведена на рис. 20) предусматривает в режиме 3D-вида вывод поверхности (Surface):
При этом показывается сетка (Show Grid), удаляются невидимые линии (Hidden Line) и используется цветовая палитра (Use Palette). Манипуляция имеющимися на окне кнопками приведет к изменению способа вывода изображения. Так, выбор Wireframe вызовет переход к каркасной модели, а Barchart – к диаграмме (рис. 21).
Рис. 21. Часть параболоида: а – тонированная поверхность;б – каркасная модель; в – диаграмма
Активизация Texture On вызовет наложение на объект текстуры, а – Depthcue приведет к изменению способа достижения эффекта глубины – снижается контрастность более глубоких участков фигуры (рис. 22).
Рис. 22. Эффект глубины: а – режим Depthcue отключен;б – режим Depthcue включен
Перейдем теперь к описанию поставляемых с ОМ процедур, встраивание которых в приложение позволяет запускать ОМ, передавать ему массив, управлять изображением, выполняя при необходимости пересчет отображаемых данных и обновление отвечающей им фигуры.
Вызов и некоторые функции управления ОМ обеспечивают приведенные в табл. 2 fagl-подпрограммы. Параметры подпрограмм содержатся в табл. 3.
Таблица 2. Fagl-подпрограммы ОМ
Синтаксис | Описание |
---|---|
faglClose(array, status) | Закрывает экземпляр ОМ. Если затем возникнет потребность отобразить массив array снова, то достаточно вызвать лишь faglShow; вызова faglStartWatch выполнять не нужно |
faglEndWatch(array, status) | Удаляет массив array из списка отображаемых массивов и освобождает ресурсы, связанные с array и используемые подпрограммами библиотеки. Чтобы впоследствии отобразить массив, необходимо вызвать как faglStartWatch, так и faglShow |
faglGetShareName(array, filename, status) | Строка filename, возвращаемая faglGetShareName, может быть передана процедурам Avis2D и AvisGrid как свойство FileName. Это позволяет отображать данные массива в приложении, использующем эти процедуры без сохранения массива в виде внешнего файла |
faglHide(array, status) | Делает экземпляр ОМ невидимым. Экземпляр ОМ станет видимым, если затем вызвать faglShow. Однако если экземпляр ОМ создан посредством favStartViewer, то вместо faglShow следует употреблять favShowWindow |
faglLBound(array, lbnd, status) | Устанавливает левые границы измерений отображаемого массива в видах Data или Graph Views ОМ. По умолчанию массив отображается с левыми границами, равными единице |
faglName(array, title, status) | Размещает строку title на полосе заголовка экземпляра ОМ. Если, однако, экземпляр ОМ создан посредством favStartViewer, то вместо faglName следует употреблять favSetArrayName |
faglSaveAsFile(array, filename, status) | Сохраняет текущий массив в файле с расширением AGL. Такой файл может быть загружен и отображен в ОМ |
faglShow(array, status) | Создает экземпляр ОМ и отображает данные массива array. Также faglShow делает видимым экземпляр ОМ, скрытый командой faglHide. Перед вызовом faglShow можно задать заголовок, применив faglName. Если же экземпляр ОМ создан посредством favStartViewer, то вместо faglShow следует употреблять favShowWindow |
faglStartWatch(array, status) | Добавляет массив array в список отображаемых массивов и возвращает дескриптор hv, который используется для доступа к массиву другими подпрограммами библиотеки. Фактически faglStartWatch использует системные ресурсы для приведения array к виду, необходимому для faglShow. Чтобы освободить эти ресурсы, следует вызвать faglEndWatch |
faglUpdate(array, status) | Приводит в соответствие изображение с данными, хранящимися в массиве array. Употребляется, если приложение изменило отображаемый массив array с момента последнего вызова faglUpdate или faglShow и если есть необходимость обновить изображение. Если же экземпляр ОМ ассоциируется с массивом, созданным favStartViewer, а не faglShow, то вместо faglUpdate нужно вызывать favUpdate |
Таблица 3. Параметры fagl-подпрограмм
Имя | Смысл/вид | Тип |
---|---|---|
array | Имя отображаемого массива. Должно быть прежде использовано при вызове faglStartWatch / входной | Числовой |
status | Статус вызова fagl-подпрограммы. При отсутствии ошибок вызова равен нулю / выходной | INTEGER(4) |
filename | Строка, возвращаемая faglGetShareName. Длина строки должна равняться AV_SHARENAME_LEN / выходной | CHARACTER(*) |
" | Имя файла без расширения, если файл пишется в директорию, из которой вызвано приложение, либо полное имя файла, включающее путь к файлу (случай faglSaveAsFile) / входной | " |
lbnd | Массив ранга 1, размер которого равен рангу отображаемого массива / выходной | INTEGER(4) |
title | Строка, отображаемая на полосе заголовка заданного экземпляра ОМ / входной | CHARACTER(*) |
Для вызова приведенных в табл. 2 подпрограмм в использующем их программном компоненте следует выполнить ссылку
use avdef ! Ссылка на ...ArrayVisualizer\include\avdef.f90
Модуль AVDEF содержит интерфейсы fagl-подпрограмм. Перечисленные подпрограммы обычно используются следующим образом:
Дополнительно для выполнения действий, обычно производимых интерактивно, можно применять fav-процедуры.
Пример. Выводится в режиме векторного графа график функции y = xsinx на отрезке [-6, 6], а вслед после некоторой задержки – график y = sqrt(|xsinx|). Обновление изображения выполняет подпрограмма faglUpdate.
program sinx
use avdef
use avviewer
use dflib
implicit none
integer(4) :: n = 50 ! Число разбиений отрезка
real(4), allocatable :: fun(:, :) ! Массив значений функции y = xsinx
!dec$attributes array_visualizer :: fun
real(4) :: a = -6.0, b = 6.0, x, dx
integer(4) i, hv, status, nError
character(1) :: key
allocate(fun(2, n))
dx = (b - a) / float(n) ! Шаг изменения x
x = a
do i = 1, n ! Формирование массива данных
fun(1, i) = x
fun(2, i) = x * sin(x)
x = x + dx
end do
call faglStartWatch(fun, status) ! Сообщаем ОМ имя отображаемого массива
print *, "Starting Array Viewer"
! Запуск ОМ с использованием fav-подпрограммы
call favStartViewer(hv, status)
if(status /= 0) then
call favGetErrorNo(hv, nError, status)
if(nError /= 0) then
print *, "Array Viewer reports error ", nError
stop
end if
end if
! Передаем ОМ данные подлежащего отображению массива
call favSetArray(hv, fun, status)
! Задаем заголовок
call favSetArrayName(hv, "y = x * sin(x)", status)
! Задаем отображение массива в виде векторного графа
call favSetGraphType(hv, VectorGraph, status)
! Показываем ОМ на экране
call favShowWindow(hv, av_true, status)
call sleepqq(5000) ! Задержка в 5000 миллисекунд
! Задаем новый заголовок
call favSetArrayName(hv, "y = sqrt(abs(x * sin(x)))", status)
fun(2, :) = sqrt(abs(fun(2, :))) ! Вносим изменения в массив
call favUpdate(hv, 0, status) ! и отображаем их на графике
print *, "Press any key to close down the viewer"
key = getcharqq( )
call favEndViewer(hv, status) ! Закрываем ОМ
call faglEndWatch(fun, status) ! Освобождаем ресурсы
deallocate(fun)
end program sinx ! Результаты приведены на рис. 23
Рис. 23. Два векторных графа: а - y = xsinx; б - y = sqrt(|xsinx|)
В этом и более ранних примерах употреблен DEC-атрибут ARRAY_VISUALIZER:
real(4), allocatable :: MyArray(:, :)
!dec$attributes array_visualizer :: MyArray
Его действие таково: память, занимаемая массивом Myarray, используется и ОМ, и приложением. При отсутствии атрибута будут созданы две области для данных Myarray и при каждом обновлении массива после вызова faglUpdate данные будут копироваться из области, принадлежащей приложению, в область, используемую ОМ.
Заметим, что DEC-атрибут ARRAY_VISUALIZER может быть применен только с динамическими объектами, т. е. объектами, обладающими атрибутом POINTER или ALLOCATABLE.
Fav-подпрограммы управляют ОМ и обеспечивают взаимодействие ОМ с приложением. Как правило, fav- и fagl-подпрограммы употребляются совместно. Fav-подпрограммы подразделяются на группы, имеющие названия:
Работа с fav-подпрограммами станет возможной после выполнения ссылки
use avviewer
в которой модуль AVVIEWER содержит интерфейсы и константы подпрограмм.
Вызываемые fav-подпрограммами действия приведены в табл. 4. Описание выполнено в соответствии с перечисленными выше группами.
Таблица 4. Fav-подпрограммы
Подпрограмма | Что выполняет |
---|---|
Запуск ОМ | |
favStartViewer | Запускает экземпляр ОМ |
favEndViewer | Завершает работу экземпляра ОМ |
Доступ к данным | |
favSetFileName | Загружает и отображает в ОМ заданный файл |
favSetArray | Отображает в ОМ заданный массив |
Зона вывода | |
favSetRoi | Устанавливает начало и конец ЗВ по заданному массиву |
favGetRoiLb | Возвращает начало ЗВ по заданному массиву |
favGetRoiUb | Возвращает конец ЗВ по заданному массиву |
favSetRowColDim | Устанавливает способ интерпретации измерения массива - как строку или как столбец |
favGetRowColDim | Устанавливает способ интерпретации измерений массива |
favSetRoi2D | Устанавливает ЗВ в виде 2D-сечения массива |
Фильтрация данных | |
favSetDataClamp | Устанавливает, будут ли в режиме векторного графа выводиться данные, расположенные за пределами заданного диапазона |
favGetDataClamp | Возвращает заданный favSetDataClamp режим |
favSetXClamp | Устанавливает верхнюю и нижнюю границы x-координат в режиме видового графа |
favGetXClamp | Возвращает верхнюю и нижнюю границы x-координат в режиме видового графа |
favSetYClamp | Устанавливает верхнюю и нижнюю границы y-координат в режиме видового графа |
favGetYClamp | Возвращает верхнюю и нижнюю границы y-координат в режиме видового графа |
favSetZClamp | Устанавливает верхнюю и нижнюю границы z-координат в режиме видового графа |
favGetZClamp | Возвращает верхнюю и нижнюю границы z-координат в режиме видового графа |
favSetDataRefreshEnable | Делает активным/неактивным пункт меню Data-Refresh |
favGetDataRefreshEnable | Возвращает состояние пункта меню Data-Refresh |
favUpdate | Вызывается, когда нужно обновить изображение, созданное ОМ, чтобы отобразить изменения, произошедшие с момента последнего обновления данных или начальной загрузки |
Палитра | |
favSetCustomPalette | Создает пользовательскую палитру цветов |
favSetPaletteId | Задает цветовую палитру, используя определенные в модуле AVVIEWER именованные константы:
|
favGetPaletteId | Возвращает идентификатор текущей цветовой палитры |
favSetPaletteRange | Задает диапазон данных, с которым будет ассоциироваться цветовая палитра |
favGetPaletteRange | Возвращает диапазон данных, с которым ассоциируется цветовая палитра |
favSetPaletteAutoAdjust | Включает/отключает автоматическую адаптацию диапазона палитры к диапазону отображаемых данных |
favSetUseColorPalette | Включает/отключает режим использования цветовой палитры |
favGetUseColorPalette | Возвращает заданный favSetUseColorPalette режим |
favSetShowPalette | Включает/отключает воспроизведение рядом с фигурой цветовой палитры |
favGetShowPalette | Возвращает заданный favSetShowPalette режим |
Оси координат | |
favSetAxisAutoScale | Включает/отключает автоматическую разметку осей координат |
favGetAxisAutoScale | Возвращает заданную favSetAxisAutoScale установку |
favSetDimScale | Ассоциирует ось координат с массивом, содержащим разметку оси |
favSetShowAxis | Отображает/скрывает оси координат |
favGetShowAxis | Возвращает состояние, заданное favSetShowAxis |
favSetAxisLabel | Задает имя указанной оси координат. Символьные переменные, применяемые для задания имени, должны иметь длину, равную AV_MAX_LABEL_LEN |
favGetAxisLabel | Возвращает имя указанной оси координат |
favSetUseAxisLabel | Включает/отключает вывод заданных пользователем имен осей координат |
favGetUseAxisLabel | Возвращает состояние, заданное favSetUseAxisLabel |
favSetFontAutoScale | Включает/отключает режим автоматического изменения размера шрифта, используемого для отображения имен осей координат, при изменении размеров окна вывода |
favGetFontAutoScale | Возвращает режим, заданный favSetFontAutoScale |
favSetAxisStyle | Задает стиль вывода осей координат |
favGetAxisStyle | Возвращает стиль вывода осей координат |
favSetAxisAutoDetail | Устанавливает, будут ли большие и маленькие разметки на осях координат формироваться автоматически или задаваться явно в программе |
favGetAxisAutoDetail | Возвращает заданный favSetAxisAutoDetail режим |
favSetNumMajorTickmarks | Устанавливает число больших разметок заданной оси координат (рядом с такими разметками проставляются соответствующие им значения) |
favGetNumMajorTickmarks | Возвращает число больших разметок заданной оси координат |
favSetNumMinorTickmarks | Устанавливает число маленьких разметок заданной оси координат |
favGetNumMinorTickmarks | Возвращает число маленьких разметок заданной оси координат |
Выбор | |
favSetDataSelectEnable | Включает/отключает режим выбора данных, выполняемого в результате двойного удара мыши по точке поверхности, в результате которого при включенном режиме происходит перемещение маркера |
favGetDataSelectEnable | Возвращает режим, заданный favSetDataSelectEnable |
Виды изображений | |
favSetGraphType | Задает видовой режим (3D-вид, растровая карта, векторный граф, плоский вид) |
favGetGraphType | Возвращает текущий видовой режим |
favSetGraphStyle | Задает способ вывода изображения (в виде сетки, поверхности, диаграммы, линий или точек) |
favGetGraphStyle | Возвращает способ вывода изображения |
favSetGridDensity | Задает значение, определяющее густоту сетки - число пикселей между соседними линиями сетки |
favGetGridDensity | Возвращает значение, определяющее густоту сетки |
favSetDepthcue | Включает/отключает режим Depthcue |
favGetDepthcue | Возвращает режим, заданный favSetDepthcue |
favSetShowGrid | Включает/отключает отображение сетки на рисунке |
favGetShowGrid | Возвращает режим, заданный favSetShowGrid |
favSetLineSmooth | Включает/отключает сглаживание линий |
favGetLineSmooth | Возвращает режим, установленный favSetLineSmooth |
3D-вид | |
favSetZScale | Задает высоту z-оси координат относительно размеров x- и y-осей |
favGetZScale | Возвращает значение, установленное favSetZScale |
favSetTextureMode | Включает/отключает режим наложения одномерной текстуры |
favGetTextureMode | Возвращает режим, заданный favSetTextureMode |
favSetShading | Включает/отключает интерполяцию цветов |
favGetShading | Возвращает заданный favSetShading режим |
favSetHighLight | Включает/отключает блики |
favGetHighLight | Возвращает заданный favSetHighLight режим |
favSetHiddenLine | Включает/отключает отображение невидимых линий |
favGetHiddenLine | Возвращает заданный favSetHiddenLine режим |
Растровая карта | |
favSetImageOrientation | Устанавливает ориентацию растровой карты. По умолчанию первый элемент массива располагается в нижнем левом углу карты (ориентация IDENTITY). При другой ориентации (XFLIP, YFLIP или XYFLIP) порядок отображения элементов массива на растровой карте изменяется |
favGetImageOrientation | Возвращает заданный favSetImageOrientation режим |
favSetFixedAspect | Устанавливает фиксированное соотношение размеров сторон карты |
favGetFixedAspect | Возвращает заданный favSetFixedAspect режим |
favSetImageFilter | Включает линейный фильтр, используемый при выводе карты |
favGetImageFilter | Возвращает заданный favSetImageFilter режим |
Векторный граф | |
favSetCompIndex | Задает индексы, используемые для задания x-, y-, z- и w-компонентов векторного графа (в режиме векторного графа данные выводятся как вектор x, y, z, w, в котором каждый компонент извлекается из массива в последовательности, заданной favSetCompIndex). По умолчанию в случае массива формы (4, *) для x-компонента используется первый элемент каждого столбца, для y - второй, для z - третий, а для w – четвертый |
favGetCompIndex | Возвращает заданный favSetCompIndex режим |
Отображение данных | |
favSetPrecision | Устанавливает точность, с которой числовые данные отображаются в таблице данных ОМ |
favGetPrecision | Возвращает установленную favSetPrecision точность |
favSetCellEditEnabled | Включает/отключает режим редактирования таблицы данных ОМ |
favGetCellEditEnabled | Возвращает заданный favSetCellEditEnabled режим |
favGetDefaultFormat | Возвращает заданный по умолчанию формат (длина поля и точность), используемый для представления числовых данных в таблице данных |
favSetUseDefaultFormat | Задает/отключает режим использования заданного по умолчанию формата представления числовых данных. Если режим не задан, то формат регулируется подпрограммами favSetUseHex, favSetFieldWidth и favSetUseExp |
favGetUseDefaultFormat | Возвращает заданный favSetUseDefaultFormat режим |
favSetDimName | Дает имя указанному измерению массива. Длина строки, задающей имя, должна равняться AV_MAX_LABEL_LEN |
favGetDimName | Возвращает имя, ассоциированное с заданным измерением массива |
favSetShowDimLabels | Включает/отключает режим вывода на рисунке имен строк и столбцов массива |
favGetShowDimLabels | Возвращает заданный favSetShowDimLabels режим |
favSetUseHex | Включает/отключает режим отображения числовых данных в таблице данных ОМ в шестнадцатеричном виде |
favGetUseHex | Возвращает заданный favSetUseHex режим |
favSetUseExp | Включает/отключает режим отображения числовых данных в таблице данных ОМ в научном (экспоненциальном) формате |
favGetUseExp | Возвращает заданный favSetUseExp режим |
favSetFieldWidth | Задает длину поля вывода числовых данных в таблице данных ОМ |
favGetFieldWidth | Возвращает текущую длину поля вывода числовых данных |
Камера | |
favSetCameraPosition | Задает координаты камеры |
favGetCameraPosition | Возвращает координаты камеры |
favSetCameraCoi | Задает координаты точки наблюдения, т. е. точки, на которую направляется камера. Устанавливаемые координаты должны находиться в диапазоне [0.0 - 1.0]. По умолчанию координаты этой точки равны (0.5, 0.5, 0.3) |
favGetCameraCoi | Возвращает координаты точки, на которую направлена камера |
favSetHomePosition | Устанавливает текущую позицию камеры в качестве исходной |
favToHomePosition | Устанавливает камеру в исходную позицию, т. е. заданную подпрограммой favSetHomePosition |
Маркер | |
favSetRowCol | Задает позицию ячейки таблицы данных. При использовании маркера изменение позиции ячейки приводит к перемещению маркера и выделению заданной позиции |
favGetRowCol | Возвращает позицию ячейки таблицы данных |
favSetShowMarker | Показывает/скрывает маркер |
favGetShowMarker | Возвращает заданный favSetShowMarker режим |
Разное | |
favSetArrayName | Задает текст, выводимый на заголовочной полосе ОМ |
favGetErrorNo | Возвращает номер возникшей ошибки |
favShowWindow | Отображает/скрывает окно вывода ОМ |
favSetAnnotation | Задает текст аннотации |
Замечание. Подпрограмма favGet*, если соответствующая favSet*-подпрограмма не вызывалась, вернет заданное по умолчанию значение, опрос которого favGet* выполняет. В комплекте поставки ОМ имеются примеры его употребления. Они расположены в директории ...\ArrayVisualizer\Samples\Fortran\. Описание примеров можно просмотреть в Web-браузере, загрузив ...\ArrayVisualizer\Samples\Samples.htm.
Пример. Выводится 3D-вид параболоида, создаваемый подпрограммой frame3. При этом:
program para2
use avdef
use avviewer
use dflib
implicit none ! Данные о параболоиде z = x2 + y2
! Протяженности массива bo по первому и второму измерениям
integer(4) :: m = 20, n = 20
integer(4) :: nd = 100 ! Число разбиений одного сечения параболоида
integer(4) :: ch = 50 ! Число пересекающих параболоид плоскостей
real(4), allocatable :: bo(:, :) ! Массив точек параболоида
!dec$attributes array_visualizer :: bo
integer(4) hv, status
character(1) :: key
character(av_max_label_len) :: xLabel = 'x', yLabel = 'y'
allocate (bo(m, n))
call frame3(bo, m, n, nd, ch) ! Формирование параболоида
call faglStartWatch(bo, status) ! Сообщаем ОМ имя отображаемого массива
print *, "Starting Array Viewer"
call favStartViewer(hv, status) ! Создаем экземпляр ОМ
call favSetArray(hv, bo, status) ! Отображаем массив bo
! Задаем имя, выводимое ОМ при отображении массива bo
call favSetArrayName(hv, "Paraboloid", status)
! Задаем режим вывода заданных пользователем имен осей координат
call favSetUseAxisLabel(hv, x_axis, 1, status)
call favSetUseAxisLabel(hv, y_axis, 1, status)
! Новые имена x- и y-осей координат. Длина переменных, задающих имена осей,
! равна AV_MAX_LABEL_LEN
call favSetAxisLabel(hv, x_axis, xLabel, status)
call favSetAxisLabel(hv, y_axis, yLabel, status)
! Позиция точки наблюдения
call favSetCameraCoi(hv, 0.0, 0.5, 0.0, status)
! Позиция камеры
call favSetCameraPosition(hv, -2.3, -2.3, 2.0, status)
! Устанавливаем режим явного задания разметок координатных осей
call favSetAxisAutoDetail(hv, 0, status)
! Число больших разметок на координатных осях
call favSetNumMajorTickmarks(hv, x_axis, 3, status)
call favSetNumMajorTickmarks(hv, y_axis, 3, status)
call favSetNumMajorTickmarks(hv, z_axis, 3, status)
! Число малых разметок на координатных осях
call favSetNumMinorTickmarks(hv, x_axis, 1, status)
call favSetNumMinorTickmarks(hv, y_axis, 1, status)
call favSetNumMinorTickmarks(hv, z_axis, 1, status)
! Задание палитры из оттенков серого цвета
call favSetPaletteId(hv, greyscale, status)
! Показываем ОМ на экране
call favShowWindow(hv, AV_TRUE, status)
print *, "Press any key to close down the viewer"
key = getcharqq( )
call favEndViewer(hv, status) ! Закрываем ОМ
call faglEndWatch(bo, status) ! Удаляем массив из списка наблюдения
deallocate(bo)
end program para2 ! Результат приведен на рис. 24
Рис. 24. Параболоид из программы para2
Библиотека Aviewxxx.DLL (Aview110.DLL для версии 1.1 ОМ) должна поставляться с приложением, использующим процедуры ОМ. Причем DLL должна находиться в той же директории, что и приложение, либо приложению должен быть известен путь к DLL.
Если приложение использует Avis2D- и/или AvisGrid-процедуру, перенесите Avis2D.ocx- и/или AvisGrid.ocx-файл на компьютер, где будет запускаться приложение, и зарегистрируйте процедуры, выполнив команду
regsvr32 Avis2D.ocx
и/или команду
regsvr32 AvisGrid.ocxs