Разработка прикладных задач для ГИС "Панорама"

Урок 1. Создание интерактивных прикладных задач

Автор: Дарья Лунченко

ГИС "Панорама" имеет множество самых различных инструментов обработки геопространственных данных, однако конкретному пользователю иногда бывает нужно решать какие-то свои специальные задачи, для решения которых готовых инструментов среди штатных средств системы нет. Что делать в такой ситуации? Конечно, можно обратиться к разработчику с просьбой дополнить систему новыми инструментами. Но, если вы хоть немного знакомы с языками программирования C++ или Pascal, то вы и сами легко можете расширить функционал системы. В этом цикле уроков я расскажу, как создавать свои собственные инструменты обработки данных для продуктов "Панорама" в среде Microsoft Visual Studio.

Примечание. Для разработки прикладных задач для ГИС "Панорама" версии 12 не нужно приобретать каких-то дополнительных лицензий на средства разработки GIS ToolKit: созданные вами на основе интерфейса "PANAPI" прикладные задачи встраиваются в эту ГИС и работают с ее лицензией.

Для создания собственных прикладных задач по обработке данных программист может использовать интерфейсы "PANAPI" и "MAPAPI", которые позволяют создавать и встраивать свои решения в виде dll-библиотек в ГИС "Панорама" и другие прикладные системы КБ "Панорама".

Интерфейс "PANAPI" обеспечивает пользователя средствами взаимодействия с управляющей оболочкой ГИС, интерактивного выбора данных и указания способов обработки, а "MAPAPI" предоставляет средства для непосредственной обработки данных карты.

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

В уроке №4 более подробно описано создание потоковой задачи и её внедрение в ГИС.

В п.1.2 показаны основные шаги, которые должен сделать C++ разработчик, чтобы начать создания прикладной задачи ГИС "Панорама" любого типа в среде Microsoft Visual Studio. Если вы создаёте прикладную задачу в учебных целях, то можно воспользоваться также бесплатным учебным пакетом Microsoft Visual Studio Community.

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

Для упрощения работы с интерфейсом "PANAPI" существует библиотека классов PANTASK, с помощью которой выполняется переопределение виртуальных функций (методов), определяющих реакцию на генерируемые события (работа с мышкой, выбор объекта, перерисовка карты и т. п.).

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

1) создание нового проекта DLL;

2) создание библиотеки статической линковки LIB;

3) настройка внешних зависимостей проекта;

4) основные события и методы интерактивной прикладной задачи;

5) настройка панели инструментов интерактивной прикладной задачи;

1. Создание нового проекта DLL

Для создания проекта библиотеки DLL в среде разработки Microsoft Visual Studio необходимо:

1. запустить Visual Studio, и перейти в меню к пункту "Создать проект";

2. в открывшемся окне, выбрать проект по созданию библиотеки DLL на основе библиотеки MFC;

3. далее оставить все настройки по умолчанию, и нажать кнопку "Готово";

4. проект библиотеки DLL успешно создан.

2. Создание библиотеки статической линковки LIB

Для формирования библиотеки статической линковки LIB mapacces64.lib и включения ее в проект Visual C++ необходимо:

1. открыть командную строку Visual Studio Native Tools с правами администратора;

2. сформировать .def файл по DLL mapacces64.dll, которая расположена в папке размещения ГИС "Панорама", выполнив в командной строке команду dumbin, .def файл содержит имена экспортируемых функций из библиотеки.

В результате выполнения команды dumpbin получен файл d:\mapacces64.def:

3. отредактировать содержимое файла d:\mapacces64.def, оставив в нем только имена экспортируемых функций:

4. выполнить в командной строке команду lib, для формирования библиотеки статической линковки.

3 Настройка внешних зависимостей проекта DLL

Для добавления внешних зависимостей в проект библиотеки DLL в ГИС "Панорама" необходимо:

1. скачать примеры разработки приложений в ГИС "Панорама" 12 по ссылке: sdk12.zip;

2. скопировать папку include в папку проекта библиотеки DLL;

3. скопировать из папки PanTask\VisualС\ статическую библиотеку реализации интерфейса "MAPAPI" mapacces64.lib, вы также можете создать эту библиотеку самостоятельно (см. п. 2);

4. добавить библиотеку mapacces64.lib в проект, нажав в обозревателе решений : Решение -> Добавить -> Существующий элемент -> mapacces64.lib;

5. перейти в свойства проекта: "Имя проекта" -> "Свойства" и во вкладке "Каталоги VC++", выбрать "Каталоги включения", в выпадающем меню нажать "Изменить". В открывшемся окне, нажать кнопку "Создать строку" и выбрать путь к папке include.

4. Добавление основных методов прикладной задачи

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

Чтобы начать работу с данными функциями необходимо:

1. скопировать содержимое файла cmptask.def из папки примера PanTask\VisualС\ в файл экспортируемых функций .def вашего проекта.

2. добавить в проект файлы класса прикладной задачи TPanTask: panact.h, panselfr.h, panselfr.cpp , panwin.h, pantask.h, pantask.cpp из папки PanTask\VisualС;

3. создать новый класс для прикладной задачи, как наследник класса TPanTask, выбрав правой кнопкой проект -> "Добавить" -> "Класс";

4. подключить файлы panact.h, pantask.h с помощью дерективы #include;

5. добавить следующие основные функции интерактивной прикладной задачи:

5.1 функция создания экземпляра класса прикладной задачи CMultiPoligonTask, производного от TPanTask:

Конструктор класса создаёт объект "окно электронной карты" и устанавливает связь с библиотекой MAPTASK64.DLL, которая отвечает за поддержку интерфейса "PANAPI". Описание класса TPanTask содержится в файле PANTASK.H, реализация – в файле PANTASK.CPP.

5.2 функции SetFocusData - выбор пользователем окна документа или открытие нового документа, ChangeData - изменение состава данных документа, ChangeLanguage - изменение языка программы:

5.3 для того, чтобы закрепить за кнопками панели инструментов свои методы и обработчики команд добавим событие GetAction. Макрос CheckCommand позволяет выполнить команду без обработчика, а CheckAction использует обработчик команд, что позволяет работать в последствии в интерактивном режиме:

5.4 метод EnableAction, позволяет проверить поддерживается ли запрошенная команда в нашей задаче, и установить дополнительные параметры для управления доступностью элементов панели задач (например, проверить наличие открытой пользовательской карты, с возможностью ее редактирования или же наличие выделенных объектов).

5. Настройка панели инструментов прикладной задачи

Встраивание прикладной задачи в ГИС "Панорама", происходит за счёт создания и настройки пользовательских панелей инструментов.

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

Рисунок. Панель инструментов задачи

Перейдём непосредственно к функциям, которые необходимо добавить в основной класс задачи, наследник TPanTask:

1. функция userGetTaskNameUn - для установки названия задачи в зависимости от языка системы:

2. для установки в заголовке панели инструментов названия панели - функция userGetPanelNameUn:

3. задание количества доступных кнопок осуществляется функцией userGetPanelButtonCount, запрос идентификатора кнопки - userGetPanelButtonResID, запрос названия кнопки - userGetPanelButtonNameUn:

4. создание панели инструментов и добавление на неё кнопок происходит в функции CreateTaskPanel. Для того, чтобы кнопки панели задач масштабировались в зависимости от установки пункта меню ГИС "Панорама" -> "Размер кнопок", необходимо создать иконки в формате .png размером 64х64 пикселя и добавить их в ресурс проекта как RCDATA, с именами и идентификаторами, соответствующими идентификаторам кнопок панели задач;

5. использовать функцию InsertButton с параметром bmpFace = -1;

6. для обработки уведомления о закрытии панели используем функцию PanelClosed:

На данном этапе мы имеем готовую основу библиотеки прикладной задачи для ГИС "Панорама". Ниже на рисунке представлен алгоритм добавления интерактивной прикладной задачи в ГИС "Панорама".

Рисунок. Добавление новой задачи в ГИС "Панорама"

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