naiad:Plugins

From

Revision as of 12:35, 11 January 2013 by Denis.spiridonov (Talk | contribs)
Jump to: navigation, search

Все исходные файлы плагинов продуктов находятся в директории [qdione_install_dir]/src/plugins/collections .

Каждый плагин представляет собой дерево директорий. Корневая директория имеет название, аналогичное названию плагина. В ней располагаются следующие директории: main (обязательно), filtering, aggregation и virtual.

Плагины написаны на языке С++ с использованием библиотек Qt4. (Для удобства используйте среду разработки QtCreator.)

В папке main находится сам плагин продукта, состоящий из проектного файла plugin_name.pro и файла исходных текстов plugin_name.cpp. В файле plugin_name.cpp реализуются две основные функции buildConstraintExpression и buildGranule (которые вызываются из QDione при загрузке гранулы), а так же несколько вспомогательных функций.

Функция buildConstraintExpression создаёт строку (ограничений для каждой переменной) для отправления на OPeNDAP сервер. Строка имеет вид:

variable_name1[min:stride:max],variable_name2[min:stride:max],...,

где [min:stride:max] - формат записи ограничений (для каждой переменной ограничения могут быть разными), variable_name[1,2] - имена переменных. Например, "wvc_row_time[0:1:1623],wvc_lon[0:1:1623][0:1:75],wvc_lat[0:1:1623]"

Общий вид функции extern "C" QString buildConstraintExpression(QStringList & nativeVariableStringList, QString xOffset, QString yOffset, QString zOffset, DioneDapDataFile* dapfile);

Переменная nativeVariableStringList хранит список имён переменных, для которых необходимо создать ограничения ([min:stride:max]); Переменные xOffset, yOffset, zOffset содержать ограничения (строки), которые передаются в запросе (из XML или web-запроса); Переменная dapfile - указатель на файл, используемый OPeNDAP.

Функция buildGranule строит структуру гранул в QDione из OPeNDAP файла. Возвращает true, если гранула построена правильно, иначе false.

Общий вид функции extern "C" bool buildGranule(DioneDapDataFile* dapfile, DioneGranule * granule);

Переменная dapfile - указатель на OPeNDAP файл; Переменная granule - указатель на гранулу, которую необходимо построить.

В этой функции необходимо обработать глобальные атрибуты и переменные. Для этого применяются функции buildGlobalAttributeList и buildVariableList. В случае ошибка хотя бы при одной переменной функция вернёт false.

Переменные latitude и longitude должны называться lat и lon. Иначе, перед добавлением в гранулы их необходимо переименовать, например:

[code]

       if (name == "longitude" || name == "latitude")
       {
           name = (baseTypeVariable->name() == "longitude") ? "lon" : "lat";
       }
       var = granule->addVariable(name, dioneTypeFromDapType(arrayVariable->var()->type()), list,
                                  granule->getVariable(granule->indexOfVariable("time")));

[/code]

Для правильной обработки переменной time, к ней необходимо необходимо прибывить значение 347155200.

Если среди переменных продукта отсутствуют longitude, latitude или time, то необходимо создать виртуальную переменную (виртуальные переменные). Для этого в директории с плагином [qdione_install_dir]/src/plugins/collections/[plugin_name] необходимо создать директорию virtual, а в ней директории с именами необходимых переменных, например "lat", "lon", "time".

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

Разберём пример создания виртуальной переменной на переменной "time" продукта aquarius_l3_sss_smi_7day. Создадим директорию [qdione_install_dir]/src/plugins/collections/aquarius_l3_sss_smi_7day/virtual/time. В ней создадим файл проекта time.pro (в случае использования Qt Creator файл проекта создаётся автоматически при создании нового проекта) со следующим содержимым:

[code]

   include(../../../../../../qdione_config.pri)
   PRODUCT = aquarius_l3_sss_smi_7day
   PLUGIN_NAME = time
   TEMPLATE = lib
   TARGET = $${PLUGIN_NAME}_plugin
   DEPENDPATH += . ../../../../../libqdione
   INCLUDEPATH += . ../../../../../libqdione
   INCLUDEPATH += $${NETCDF_INCLUDEPATH} $${GDAL_INCLUDEPATH} $${DAP_INCLUDEPATH} $${HDF4_INCLUDEPATH} 
   DESTDIR = ../../../../../../lib/plugins/collections/$${PRODUCT}/virtual/
   CONFIG += plugin 
   LIBS += $${NETCDF_LIBS} $${GDAL_LIBS} $${DAP_LIBS} $${HDF4_LIBS} -ldapclient -L../../../../../../lib -lqdione -Wl,-rpath
   # Input
   SOURCES += $${PLUGIN_NAME}.cpp

[/code]

И файл исходных текстов time.cpp, описывающий структуру PluginConfig и содержащий реализации двух функции: init и compute.

Список PluginConfigList содержит конфигурации, связанные с каждым из экземпляров плагина (плагин может быть запущен несколько раз).

Функции инициализации init заполняет структуру PluginConfig входными данными сохраняет её в списке PluginConfigList.

unsigned int init(DioneGranule* granule, DioneVariableInfo * variableInfo, DioneType * type);

Функция compute производит все необходимые вычисления и возвращает значение виртуальной переменной (типа QVariant).

QVariant compute(unsigned int pluginConfigIndex, const Iterator& i);

Для вычислений используются значения, сохранённые в текущем pluginConfig, например:

[code]

   int Date = pluginConfigList.at(pluginConfigIndex)->Date->valueAsInt(i);

[/code]

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

===

Плагины, которые могут быть использованы любой коллекцией, находятся в директории [qdione_install_dir]/src/plugins/generic

Для разработки плагина продукта необходимо..

--Denis.spiridonov 12:29, 11 January 2013 (UTC)

Personal tools
MediaWiki Appliance - Powered by TurnKey Linux