Список работ

Отображатель массивов

Содержание

Назначение отображателя массивов

Отображатель массивов (ОМ) фирмы Compaq® позволяет наблюдать как данные числовых массивов, так и их графическое представление. Отображатель содержит в качестве ядра графическую библиотеку OpenGL®, процедуры которой обеспечивают графический вывод. (Об употреблении OpenGL® в Фортране см., например, [1].) Дополнительно ОМ помогает манипулировать графическими данными, предоставляя возможности для перемещения, поворота и масштабирования изображения, а также для изменения способа его представления на экране. ОМ содержит:

Массив, переданный ОМ, отображается в двух видах:

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

Процедуры библиотеки 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,- понятно интуитивно. Некоторые возможности требуют пояснений, к изложению которых мы и переходим.

Команды меню View и Palette

Выбор подпункта Home View вернет повернутое изображение либо в заданное по умолчанию положение, либо в положение установленное в результате действия подпункта Set Home.
Те же результаты получатся при работе с иконками
Иконки

Установить соответствие между точкой на поверхности и ячейкой таблицы данных позволяет маркер, который появится на изображении после выбора Show Marker. Когда маркер присутствует на рисунке, то каждый двойной удар мыши по ячейке таблицы вызовет его перемещение в соответствующую точку изображения, и наоборот, каждый двойной удар мыши по точке на фигуре вызовет, во-первых, перемещение в эту точку маркера и, во-вторых, выделение соответствующей ячейки данных (рис. 13).

Маркер

Рис. 13. Маркер и таблица данных

Замечания:

  1. Позиционирование мыши на точке поверхности приводит к появлению на рисунке следующей информации: координаты соответствующей ячейки в таблице данных и z-координаты точки поверхности (рис. 13). Появившиеся данные не связаны с отображаемым маркером.
  2. Для работы с маркером в ОМ предусмотрена иконка
    Иконка

Выбор 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 включен

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

fagl-подпрограммы

Вызов и некоторые функции управления ОМ обеспечивают приведенные в табл. 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-подпрограммы управляют ОМ и обеспечивают взаимодействие ОМ с приложением. Как правило, fav- и fagl-подпрограммы употребляются совместно. Fav-подпрограммы подразделяются на группы, имеющие названия:

Работа с fav-подпрограммами станет возможной после выполнения ссылки

use avviewer

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

Действие fav-подпрограмм

Вызываемые 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 именованные константы:
  • GREYSCALE = 1;
  • GREYSCALE_BANDED = 2;
  • GREYSCALE_INVERTED = 3;
  • RAINBOW = 4;
  • RAINBOW_BANDED = 5;
  • RAINBOW_INVERTED = 6
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

Список работ

Рейтинг@Mail.ru