Кастомизация ArcGIS for Desktop 10.x

Иван Мехедов, компания Esri CIS, e-mail: imehedov@esri-cis.ru, тел.: +7 (495) 988-34-81 доб. 143

 

Customization of ArcGIS for Desktop 10.x

 

Начиная с версии 10.0, новым способом кастомизации ArcGIS for Desktop являются надстройки (англ. add-inns). Надстройка представляет собой отдельный сжатый файл с расширением .esriaddin, который не требует регистрации и может одновременно использоваться несколькими приложениями. Надстройки могут быть оформлены в виде кнопок, выпадающих списков, контекстных меню и т.д.

В ArcGIS for Desktop 10.0 настройки разрабатываются на .NET или Java, а в версии 10.1 появилась возможность создания надстроек на языке Python. Кроме того, так же как и в предыдущих версиях ArcGIS for Desktop, Python может использоваться и для создания скриптов автоматизации обработки пространственных данных. Как у скриптов, так и у надстроек есть свои достоинства и недостатки в контексте кастомизации ArcGIS for Desktop. Выбор в пользу той или другой технологии зависит от поставленной задачи.

При установленном ArcObjects SDK, cреды разработки Microsoft Visual Studio, Express Edition of Visual Studio и Eclipse включают в себя мастер создания надстроек для ArcGIS for Desktop (Add-Ins Wizard) на VB.NET, C# (MS Visual Studio) и Java (Eclipse). Для разработки надстройки на Python используется бесплатно распространяемая утилита Python Add-In Wizard.

Начиная с версии ArcGIS 10.1, кастомизация ArcGIS for Desktop с помощью VBA не поддерживается, а в версии 10.0 средства разработки на VBA не включены в базовую инсталляцию ArcGIS for Desktop, для этого требуется отдельная лицензия. Вместе с переходом на версию ArcGIS 10.1 и выше (а при отсутствии отдельной VBA-лицензии – ArcGIS 10.0 и выше) должен быть осуществлен перевод кастомизации ArcGIS for Desktop с VBA на другой язык – Python, .NET-язык или Java.

В настоящей статье рассматриваются пример создания надстройки на основе конвертации существующего кода из VBA в VB.NET и пример создания надстройки на Python «с нуля».

Пример 1. Перевод проекта VBA в надстройку на VB.NET

В качестве примера создания надстройки на основе конвертации существующего кода из VBA в VB.NET рассмотрим форму, которая выдает информацию о регионе (в данном случае округе), выбранном пользователем на карте. Для того чтобы самим попробовать реализовать такую процедуру, помимо ArcGIS for Desktop 10.x вам понадобятся:

  • Microsoft Visual Studio 2008/2010 (с сайта разработчика можно загрузить бесплатную версию Visual Studio 2008 Express Edition SP1)
  • ArcObjects SDK для .NET (включен в ArcGIS for Desktop 10.x)
  • Исходные материалы с сайта Esri (www.esri.com/news/arcuser/0311/files/vba2net.zip)

В случае, если Visual Studio и ArcGIS for Desktop установлены на одной машине, в Visual Studio появляется возможность создать проект ArcGIS Desktop Add-in project (если при создании нового проекта ArcGIS Desktop Add-in project не присутствует в возможных для выбора типах проектов, то убедитесь, что выбрана версия .NET Framework 3.5).

Исходные материалы с сайта содержат:

  • файлы проекта VBA (папка VBA Form)
  • файлы проекта VB.NET (папка Code)
  • дополнительные файлы (папка Extra)

В процессе конвертации проекта из VBA в VB.NET Вам понадобится:

  • пересоздать форму вывода информации
  • заменить код VBA на VB.NET.

Пересоздание формы

  1. Создайте новый проект в Visual Studio (Visual Basic -> ArcGIS -> Desktop Add ins -> ArcMap Add-in). Назовите его CountyInfoAddIn и нажмите OK;
  2. Появится окно Add-in Wizard (рис. 2). Заполните в нем все необходимые поля и выберите тип надстройки (в нашем примере надстройка имеет тип «Button» (кнопка)) (рис. 3). После нажатия кнопки «Finish» будет создан новый проект;
  3. Добавьте в проект новую форму (Add -> New Item -> Windows Form) и назовите ее Form1. Задайте размеры формы 319 на 223 точки. Присвойте значения следующим свойствам формы: Text = County Info; TopMost = true. Последнее свойство должно иметь значение true для того, чтобы форма всегда показывалась поверх основного окна ArcMap;
  4. Добавьте на форму контролы (элементы управления) – надписи (Label), которые будут отображать информацию о выбранном округе, назвав их следующим образом: lblCountyName (название региона), lblStateName (название штата), lblArea (площадь), lblPopulation (население). В каждом контроле оставьте значение свойства Text пустым, а свойству Autosize присвойте значение true. Перед каждым контролом разместите контрол-надпись (Label), в каждой из них присвойте соответствующее значение свойству Text: County Name (название региона), State Name (название штата), Area (площадь), Population (население);
  5. Добавьте на форму 2 кнопки – btnRead и btnClose – со значением свойства Text — ReadData и Close, соответственно.

На рис. 4 слева изображена форма на VBA, а справа – переделенная форма на VB.NET.

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

Перевод кода из VBA в VB.NET

Помимо графических элементов интерфейса, надстройка содержит основную логическую часть, в которой необходимые данные о выбранном объекта считываются, чтобы затем быть отображенными на форме. Эта часть кода содержится в процедуре ReadData. Найдите файл Form1.frm в папке VBA Form, скопируйте из него целиком процедуру ReadData. Затем в новом проекте откройте файл Form1.vb, при необходимости выберите режим просмотра кода (View Code) и вставьте скопированную процедуру ReadData внутрь класса Form1. При этом появится несколько ошибок (всего 10), которые требуется исправить. Во-первых, добавьте в проект ссылки на библиотеки ArcGIS: AcrMapUI, Carto и Geodatabase. Для этого в окне Solution Explorer выберите проект CountyInfoAddIn, щелкните правой кнопкой мыши и выберите меню Add Reference, в открывшемся окне перейдите на вкладку .NET и из списка установленных компонентов добавьте ESRI.ArcGIS.ArcMapUI, ESRI.ArcGIS.Carto, ESRI.ArcGIS.Geodatabase). Этим действием будут устранены первые 5 ошибок (рис. 5).

Следующие 4 ошибки связаны с тем, что в VBA свойство контрола label, хранящее надпись, называется Caption, а в VB.NET оно называется Text. Для устранения ошибок необходимо заменить все вхождения .Caption на .Text (эти вхождения встречаются в строках lblCountyName.Caption = …, lblStateName.Caption = …, lblPopulation.Text = …, lblArea.Text = …).

Наконец, последняя ошибка вызвана тем, что определение ThisDocument, доступное из проекта VBA, недоступно в проекте VB.NET. Его необходимо заменить на определение My.ArcMap.Document.

После того, как все ошибки будут исправлены, компилятор выдаст предупреждение (warning): «’pFCursor’ is passed before it is assigned». Найдите строку «Dim pFCursor as IfeatureCursor» и добавьте в конце нее « = Nothing».

В открытом окне Form1.vb переключитесь из режима просмотра кода в режим просмотра формы (правой кнопкой мыши вызовите меню и выберите View Designer). Добавьте обработчики кнопок «Read Data» и «Close», для этого дважды щелкните по каждой из кнопок на форме. В появившемся обработчике btnReadData_Click вставьте строку кода «Call ReadData(“Button”)» (ее можно скопировать из Form1.frm), а в обработчике btnClose_Click – строку «Me.Close()».

Осталось сделать последнюю вещь – связать вызов формы с нажатием кнопки на панели инструментов ArcMap: как вы помните, при создании проекта был выбран тип надстройки «Button». В Solution Explorer выберите FormButton.vb в режиме просмотра кода (View Code) и в обработчик OnClick() вставьте следующие строки кода:
Dim frm As New Form1
frm.Show()

На этом процесс перевода проекта из VBA в VB.NET завершен, после сборки проекта (меню Build) в директории CountyInfoAddInbinDebug появится файл надстройки CountyInfoAddIn.esriAddIn.

Работа с надстройкой

Запустите ArcMap 10.0 и откройте проект USA.mxd, который можно найти в исходных материалах. В меню Customize (Настройка) вызовите Add-In Manager (Менеджер надстроек). В открывшемся менеджере настроек нажмите кнопку Customize (Настроить) и в появившемся диалоговом окне нажмите кнопку Add from file (Добавить из файла). Выберите созданную Вами надстройку CountyInfoAddIn.esriAddIn и установите ее. На вкладке Command (Команды) в списке Categories (Категории) выберите Add-In controls, после этого в списке Commands (Команды) выберите графический элемент My Form Button (рис. 6), соответствующий надстройке CountyInfoAddIn, и перетащите ее на панель инструментов ArcMap.

В главном окне ArcMap выберите какой-нибудь регион и нажмите кнопку вызова только что добавленной надстройки. При этом будет показана форма с кнопками Read Data и Cancel. Нажмите кнопку Read Data, при этом на форме отобразится информация о выбранном округе. Закройте форму нажатием кнопки Cancel.

Таким образом, в данном разделе мы рассмотрели создание простейшей надстройки для приложения ArcGIS for Desktop 10.x. Кончено, ее функционал может быть значительно расширен и ограничен лишь возможностями VB.NET. Больше информации о создании надстроек можно найти на сайте Ресурсного цента Esri на странице Esri ArcObjects for .NET. Кстати, на этом сайте можно найти много другой полезной информации по системе ArcGIS и ее компонентам.

Несмотря на то, что VBA более не используется для создания надстроек над ArcMap, с минимальными трудозатратами существующий код на VBA может быть преобразован в код на VB.NET для создания надстроек.

Пример 2. Создание надстройки с помощью Python в ArcGIS for Desktop 10.1

Упакованный файл надстройки с расширением .esriaddin, созданной с помощью языка Python, включает:

  • config.xml – файл, содержащий описание свойств надстройки (автор, версия, заголовок и т.д.);
  • скрипт на языке Python (файл с расширением .py), содержащий функционал кастомизации;
  • файлы ресурсов – изображения и другие данные, используемые в надстройке.

С помощью Python можно создать надстройки следующих типов: кнопка; инструмент; выпадающий список; меню; панель инструментов; палитра инструментов; расширения.

Для упрощения разработки надстроек с помощью Python можно использовать бесплатно распространяемую утилиту Python Add-In Wizard.

После запуска приложения addinn_assistant.exe появляется окно выбора пути к директории, где будет храниться проект (рис. 7). Далее необходимо заполнить свойства проекта на вкладке Project Properties (рис. 8). Значения свойств проекта будут видны при выборе надстройки через менеджер настроек в ArcGIS for Desktop 10.1 (рис. 9). После нажатия клавиши Save будет создана директория проекта по указанному пути.

Директория проекта содержит:

  • Файл config.xml;
  • Файл makeaddinn.py – скрипт для упаковки файлов проекта в файл надстройки .esriaddin;
  • Файл readme.txt, описывающий структуру директории проекта;
  • Папку Install, содержащую главный исполняемый скрипт Python и, возможно, дополнительный файлы;
  • Папку Images, содержащую все графические ресурсы надстройки.

Создание кнопки

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

    1. Создание панели инструментов или меню. На вкладке Add-In Contents создайте объявление новой панели инструментов или нового меню для размещения кнопки (рис. 10).
    2. Создание кнопки. После введение значения свойства панели инструментов Toolbar создайте объявление кнопки, щелкнув правой кнопкой мыши по заголовку Toolbar и выбрав New Button. Назовите кнопку Zoom to Selected Features (рис. 11). Кнопка, как и любой другой элемент управления (контрол), имеет свойства, значения которых необходимо заполнить (см. таблицу 1).
Табл. 1. Описание свойства элемента управления «Кнопка».

Свойство

Описание

Caption* Название кнопки.

В готовой надстройке доступно в менеджере надстроек:

и на панели инструментов:

Illustration of button caption on a toolbar

Class* Класс Python (пользовательский тип) для описания обработчика нажатия кнопки.
ID* Идентификатор контрола. Имеет уникальное значение внутри проекта.
ToolTip Краткая подсказка, всплывающая при зависании курсора мыши над кнопкой в ArcGIS for Desktop.
Message Подробное описание контрола, появляющееся под краткой подсказкой при зависании курсора мыши над кнопкой.
Help Heading Заголовок справки о кнопке.
Help Content Справка о кнопке.
Image Изображение кнопки (16 x 16 точек).

*Обязательное для заполнения значение свойства

    1. Редактирование скрипта Python. Откройте файл с расширением .py, находящийся в папке Install. Найдите класс ZoomToSelectedFeatures и отредактируйте обработчик события нажатия кнопки onClick(self)
      # Implementation of OnClick method of Button’s class
      def onClick(self):
      #Get the current map document and the first data frame.
      mxd= arcpy.mapping.MapDocument(‘current’)
      df = arcpy.mapping.ListDataFrames(mxd)[0] # Call the zoomToSelectedFeatures() method of the data frame class
      df.zoomToSelectedFeatures()

 

  1. Добавление кнопки в ArcGIS for Desktop. Запустите скрипт makeaddinn.py из директории проекта, который в этой же директории создаст файл надстройки с расширением .esriaddin. Двойным щелчком по созданному файлу вызовите утилиту установки надстройки (рис. 12). После нажатия клавиши Install Add-In файл надстройки будет скопирован в директорию, содержащую надстройки ArcGIS for Desktop 10.1 по умолчанию (в Windows Vista и Windows 7: c:users<username>DocumentsArcGISAddInsDesktop10.1). После этого можно разместить кнопку на панели инструментов ArcGIS for Desktop 10.1, вызвав Менеджер настроек (Add-In Manager) из меню Настройка (Customize).

 

Таким образом, начиная с версии 10.1, язык Python может использоваться не только для написания скриптов обработки данных в ArcGIS for Desktop, но и для создания надстроек. При разработке надстройки выбор в пользу того или иного языка (.NET, Java или Python) зависит от разработчика. Стоит отметить, что Python проще в изучении и применении и в большинстве случаев позволяет заложить в надстройку тот же функционал, что и Java / .Net. Исключение составляют два случая: надстройка, созданная с помощью Python, не позволяет создавать прикрепляемые окна или настраивать пользовательский интерфейс ArcGIS for Desktop.

Дополнительную информацию об использовании языка Python в приложении к системе ArcGIS можно посмотреть в соответствующем разделе сайта ресурсного центра Esri (resources.arcgis.com).


Рис. 1. Приложение ArcMap с надстройкой.

Рис. 2. Мастер создания проекта надстройки ArcGIS в MS Visual Studio.

Рис. 3. Мастер создания проекта надстройки ArcGIS в MS Visual Studio, выбор типа надстройки «Button».

Рис. 4. Форма на VBA (слева) и новая пересозданная форма на VB.NET (справа).

Рис. 5. Код на VB.NET со вставленными ссылками на библиотеки ArcGIS и все еще содержащий ошибки.

Рис. 6. Вкладка Commands (Команды) диалога Customize (Настройка) c установленной надстройкой.

Рис. 7. Выбор папки для сохранения проекта.

Рис. 8. Вкладка Project Properties утилиты Python Add-In Wizard.

Рис. 9. Отображение свойств надстройки в менеджере надстроек ArcGIS for Desktop.

Рис. 10. Создание панели инструментов в утилите Python Add-In Wizard (вкладка Add-In Contents).

Рис. 11. Создание кнопки с помощью утилиты Python Add-In Wizard.

Рис. 12. Установка надстройки.