Создание инструмента геообработки под ArcGIS на примере инструмента "Моделирование зон атмосферного загрязнения": различия между версиями
Bishop (обсуждение | вклад) мНет описания правки |
Bishop (обсуждение | вклад) Нет описания правки |
||
Строка 5: | Строка 5: | ||
==Настройка проекта== | ==Настройка проекта== | ||
Создадим новый проект типа ATL Project с именем AGConcentrate.Создадим новый проект типа ATL Project с именем AGConcentrate. | |||
[[Файл:1000000000000320000001C2036C6689.png]] | |||
После нажатия "ОК" запустится мастер. Оставляем все по-умолчанию. | |||
[[Файл:100000000000027100000212CC7A2A0B.png]] | |||
[[Файл:100000000000027100000212C309B6D7.png]] | |||
После завершения мастера будет открыт созданный проект. На рисунке ниже приведена структура проекта в окне Visual Studio и как этот же проект выглядит в окне проводника Windows. | |||
[[Файл:10000000000001BC000002370E639F33.png]] | |||
Откроем файл targetver.h. | |||
<source lang=cpp> | |||
#pragma once | |||
// Including SDKDDKVer.h defines the highest available Windows platform. | |||
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and | |||
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. | |||
#include <SDKDDKVer.h> | |||
</source> | |||
Из текста понятно, что если мы хотим компилировать для предыдущих платформ, то необходимо определить _WIN32_WINNT и включить заголовочный файл WinSDKVer.h до файла SDKDDKVer.h. | |||
Изменим targetver.h следующим образом: | |||
<source lang=cpp> | |||
#pragma once | |||
#include <WinSDKVer.h> | |||
#define _WIN32_WINNT 0x0501 | |||
#include <SDKDDKVer.h> | |||
</source> | |||
На этом этапе можно откомпилировать (F7). Если регистрация не удалась, можно перезапустить студию с правами администратора и попробовать снова. Проект пустой и должен компилироваться и регистрироваться. | |||
1>Time Elapsed 00:00:00.19 | |||
2>------ Skipped Build: Project: AGConcentratePS, Configuration: Debug Win32 ------ | |||
2>Project not selected to build for this solution configuration | |||
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 1 skipped ========== | |||
==Создание классов инструмента геообработки== | |||
Далее создаем фабрику инструментов геообработки (у нас он будет один). Для этого вызываем контекстное меню на имени проекта и выбираем Add->Class... Откроется диалоговое окно, в котором выбираем ATL->ATL Simple Object и нажимаем Add. | |||
[[Файл:1000000000000320000001C214B8FA87.png]] | |||
Заполняем поле Short name открывшегося диалога. | |||
[[Файл:100000000000027100000212502B006E.png]] | |||
На следующем шаге ничего не трогаем. | |||
[[Файл:1000000000000271000002129D575D52.png]] | |||
Выставляем настройки как показано ниже и жмем "Finish". | |||
[[Файл:100000000000027100000212DE0105E8.png]] | |||
Жмем F7 и проверяем что все скомпилировалось. | |||
До этого мы работали со стандартными ATL компонентами. Настал момент подключения ArcGIS. | |||
Для этого необходимо вызвать контекстное меню на созданном классе и выбрать Add->Implement Interface... | |||
[[Файл:100000000000029E0000015AFB2ABD38.png]] | |||
И заполнить открывшийся диалог. | |||
[[Файл:10000000000002710000021282C825E1.png]] | |||
В сам класс будет добавлен новый родительский класс IGPFunctionFactory и его методы. | |||
В файл stdafx.h будет добавлена строчка: | |||
<source lang=cpp> | |||
#import "C:\Program Files (x86)\ArcGIS\Desktop10.0\com\esriGeoprocessing.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, auto_search | |||
</source> | |||
которую предлагаю заменить на | |||
<source lang=cpp> | |||
#import "libid:C031A050-82C6-4F8F-8836-5692631CFFE6" raw_interfaces_only raw_native_types no_namespace named_guids | |||
</source> | |||
что бы не зависеть от путей в системе (удобно при переносе кода с машины на машину). | |||
Опять делаем Build ( F7 ) и проверяем что все скомпилировалось. | |||
Далее заполним методы класса CAGConcGPFunctionFactory и внесем изменения в файл AGConcGPFunctionFactory.rgs для регистрации нашей фабрики в ArcToolbox | |||
<source lang=cpp> | |||
HKCR | |||
{ | |||
NoRemove CLSID | |||
{ | |||
ForceRemove {797B145E-DDAE-4194-BF30-2F3460864F40} = s 'AGConcGPFunctionFactory Class' | |||
{ | |||
InprocServer32 = s '%MODULE%' | |||
{ | |||
val ThreadingModel = s 'Apartment' | |||
} | |||
TypeLib = s '{D8888BDD-960E-477C-871B-C056D7428551}' | |||
Version = s '1.0' | |||
'Implemented Categories' | |||
{ | |||
{FD939A4A-955D-4094-B440-77083E410F41} | |||
} | |||
} | |||
} | |||
} | |||
</source> | |||
Опять делаем Build ( F7 ) и проверяем что все скомпилировалось. | |||
Добавляем класс нашего инструмента геообработки. | |||
==Инструмент геообработки== | |||
Добавление класса инструмента геообработки аналогично фабрике инструментов. | |||
[[Файл:100000000000027100000212E8818AAE.png]] | |||
Добавляем интерфейсы для геообработки. | |||
[[Файл:1000000000000271000002126DD17954.png]] | |||
Удаляем из stdafx.h дописанную туда мастером строчку. | |||
<source lang=cpp> | |||
#import "C:\Program Files (x86)\ArcGIS\Desktop10.0\com\esriGeoprocessing.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, auto_search | |||
</source> | |||
Далее заполняем сформированные методы интерфейсов IGPFunction и IGPFunction2. | |||
Для автоматической регистрации после удачной сборки допишем. | |||
[[Файл:100000000000029D000000648BE098F0.png]] | |||
Пропишем программу в которой будет исполнятся наш инструмент геообработки. | |||
[[Файл:100000000000029E0000015A03334F6C.png]] | |||
Проверяем наш инструмент запуская на исполнение (F5). | |||
[[Файл:10000000000001870000022B8DEE0453.png]] |
Текущая версия от 09:54, 22 мая 2012
Введение
TODO: написать что это за инструмент и для чего нужен Разработку инструмента геообработки в ArcToolbox (молоточек в красном ящике) будем производить при помощи VisualStudio 10 Professional для ArcGIS 10.0. Указанный код может работать и под другие версии ArcGIS, но не тестировался.
Настройка проекта
Создадим новый проект типа ATL Project с именем AGConcentrate.Создадим новый проект типа ATL Project с именем AGConcentrate.
После нажатия "ОК" запустится мастер. Оставляем все по-умолчанию.
После завершения мастера будет открыт созданный проект. На рисунке ниже приведена структура проекта в окне Visual Studio и как этот же проект выглядит в окне проводника Windows.
Откроем файл targetver.h.
#pragma once
// Including SDKDDKVer.h defines the highest available Windows platform.
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
#include <SDKDDKVer.h>
Из текста понятно, что если мы хотим компилировать для предыдущих платформ, то необходимо определить _WIN32_WINNT и включить заголовочный файл WinSDKVer.h до файла SDKDDKVer.h.
Изменим targetver.h следующим образом:
#pragma once
#include <WinSDKVer.h>
#define _WIN32_WINNT 0x0501
#include <SDKDDKVer.h>
На этом этапе можно откомпилировать (F7). Если регистрация не удалась, можно перезапустить студию с правами администратора и попробовать снова. Проект пустой и должен компилироваться и регистрироваться.
1>Time Elapsed 00:00:00.19 2>------ Skipped Build: Project: AGConcentratePS, Configuration: Debug Win32 ------ 2>Project not selected to build for this solution configuration ========== Build: 1 succeeded, 0 failed, 0 up-to-date, 1 skipped ==========
Создание классов инструмента геообработки
Далее создаем фабрику инструментов геообработки (у нас он будет один). Для этого вызываем контекстное меню на имени проекта и выбираем Add->Class... Откроется диалоговое окно, в котором выбираем ATL->ATL Simple Object и нажимаем Add.
Заполняем поле Short name открывшегося диалога.
На следующем шаге ничего не трогаем.
Выставляем настройки как показано ниже и жмем "Finish".
Жмем F7 и проверяем что все скомпилировалось. До этого мы работали со стандартными ATL компонентами. Настал момент подключения ArcGIS. Для этого необходимо вызвать контекстное меню на созданном классе и выбрать Add->Implement Interface...
И заполнить открывшийся диалог.
В сам класс будет добавлен новый родительский класс IGPFunctionFactory и его методы. В файл stdafx.h будет добавлена строчка:
#import "C:\Program Files (x86)\ArcGIS\Desktop10.0\com\esriGeoprocessing.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, auto_search
которую предлагаю заменить на
#import "libid:C031A050-82C6-4F8F-8836-5692631CFFE6" raw_interfaces_only raw_native_types no_namespace named_guids
что бы не зависеть от путей в системе (удобно при переносе кода с машины на машину). Опять делаем Build ( F7 ) и проверяем что все скомпилировалось. Далее заполним методы класса CAGConcGPFunctionFactory и внесем изменения в файл AGConcGPFunctionFactory.rgs для регистрации нашей фабрики в ArcToolbox
HKCR
{
NoRemove CLSID
{
ForceRemove {797B145E-DDAE-4194-BF30-2F3460864F40} = s 'AGConcGPFunctionFactory Class'
{
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
TypeLib = s '{D8888BDD-960E-477C-871B-C056D7428551}'
Version = s '1.0'
'Implemented Categories'
{
{FD939A4A-955D-4094-B440-77083E410F41}
}
}
}
}
Опять делаем Build ( F7 ) и проверяем что все скомпилировалось. Добавляем класс нашего инструмента геообработки.
Инструмент геообработки
Добавление класса инструмента геообработки аналогично фабрике инструментов.
Добавляем интерфейсы для геообработки.
Удаляем из stdafx.h дописанную туда мастером строчку.
#import "C:\Program Files (x86)\ArcGIS\Desktop10.0\com\esriGeoprocessing.olb" raw_interfaces_only, raw_native_types, no_namespace, named_guids, auto_search
Далее заполняем сформированные методы интерфейсов IGPFunction и IGPFunction2. Для автоматической регистрации после удачной сборки допишем.
Пропишем программу в которой будет исполнятся наш инструмент геообработки.
Проверяем наш инструмент запуская на исполнение (F5).