Иван Мехедов, компания 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.
Пересоздание формы
- Создайте новый проект в Visual Studio (Visual Basic -> ArcGIS -> Desktop Add ins -> ArcMap Add-in). Назовите его CountyInfoAddIn и нажмите OK;
- Появится окно Add-in Wizard (рис. 2). Заполните в нем все необходимые поля и выберите тип надстройки (в нашем примере надстройка имеет тип «Button» (кнопка)) (рис. 3). После нажатия кнопки «Finish» будет создан новый проект;
- Добавьте в проект новую форму (Add -> New Item -> Windows Form) и назовите ее Form1. Задайте размеры формы 319 на 223 точки. Присвойте значения следующим свойствам формы: Text = County Info; TopMost = true. Последнее свойство должно иметь значение true для того, чтобы форма всегда показывалась поверх основного окна ArcMap;
- Добавьте на форму контролы (элементы управления) – надписи (Label), которые будут отображать информацию о выбранном округе, назвав их следующим образом: lblCountyName (название региона), lblStateName (название штата), lblArea (площадь), lblPopulation (население). В каждом контроле оставьте значение свойства Text пустым, а свойству Autosize присвойте значение true. Перед каждым контролом разместите контрол-надпись (Label), в каждой из них присвойте соответствующее значение свойству Text: County Name (название региона), State Name (название штата), Area (площадь), Population (население);
- Добавьте на форму 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, содержащую все графические ресурсы надстройки.
Создание кнопки
Для иллюстрации типичного порядка действий рассмотрим последовательность шагов, которые следует выполнить для реализации этой процедуры.
-
- Создание панели инструментов или меню. На вкладке Add-In Contents создайте объявление новой панели инструментов или нового меню для размещения кнопки (рис. 10).
- Создание кнопки. После введение значения свойства панели инструментов Toolbar создайте объявление кнопки, щелкнув правой кнопкой мыши по заголовку Toolbar и выбрав New Button. Назовите кнопку Zoom to Selected Features (рис. 11). Кнопка, как и любой другой элемент управления (контрол), имеет свойства, значения которых необходимо заполнить (см. таблицу 1).
Свойство |
Описание |
Caption* | Название кнопки.
В готовой надстройке доступно в менеджере надстроек: и на панели инструментов: |
Class* | Класс Python (пользовательский тип) для описания обработчика нажатия кнопки. |
ID* | Идентификатор контрола. Имеет уникальное значение внутри проекта. |
ToolTip | Краткая подсказка, всплывающая при зависании курсора мыши над кнопкой в ArcGIS for Desktop. |
Message | Подробное описание контрола, появляющееся под краткой подсказкой при зависании курсора мыши над кнопкой. |
Help Heading | Заголовок справки о кнопке. |
Help Content | Справка о кнопке. |
Image | Изображение кнопки (16 x 16 точек). |
*Обязательное для заполнения значение свойства
-
- Редактирование скрипта 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()
- Редактирование скрипта Python. Откройте файл с расширением .py, находящийся в папке Install. Найдите класс ZoomToSelectedFeatures и отредактируйте обработчик события нажатия кнопки onClick(self)
- Добавление кнопки в 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. Установка надстройки. |