Благодаря возможности выполнения инструментов в фоновом режиме вы можете продолжать работать с приложением (например, ArcMap) и выполнять другие задачи во время запуска и выполнения инструмента.
По умолчанию инструменты моделей и инструменты–скрипты запускаются в приоритетном режиме. Если вы хотите запустить свой инструмент в фоновом режиме, то вам нужно решить две проблемы, описанные ниже. После того, как вы убедитесь, что ваши модели и скрипты справились с этими проблемами, вы можете запускать ваш инструмент в фоновом режиме в следующем порядке:
- В окне Каталога или в ArcToolbox щелкните правой кнопкой мыши на вашем инструменте и выберите пункт Свойства (Properties). На закладке Общие (General) отмените опцию Всегда выполнять не в фоновом режиме (Always run in foreground) и нажмите OK.
- В меню ArcMap щелкните Геообработка (Geoprocessing) > Опции геообработки (Geoprocessing Options) На панели Обработка в фоновом режиме (Background Processing), поставьте отметку Включить (Enable).
Проблемы, которые вам необходимо решить, это
- Использование слоев документа карты – это проблема и модели, и инструмента-скрипта.
- Использование документа текущей карты (current map) в инструментах-скриптах – это проблема, относящаяся к инструменту-скрипту.
Проблема 1 – Использование слоев документа карты
Пример модели
Когда инструмент модели выполняется в фоновом режиме, процессу фоновой обработки будут доступны только те слои, которые участвуют как параметры модели. Например, следующая модель позволяет пользователю ввести область интереса, базовая изолиния и интервал изолиний, чтобы создать класс объектов изолиний. Эта модель имеет четыре параметра (3 входных и 1 выходной). Обратите внимание на то, что переменная Растр высоты (Elevation Raster) является слоем в таблице содержания ArcMap, хотя и не установлена как параметр модели. Когда эта модель запускается из диалогового окна ее инструмента, в качестве параметра Область интереса (Area of Interest) пользователь вводит слой Potential Landfill Site, но ему не требуется указывать слой Elevation Raster (растр высоты), так как последний не является параметром.
Рассмотренная выше модель будет работать, как и ожидалось, в приоритетном режиме. Однако, если эту модель попробовать запустить в фоновом режиме, то это не удастся, и появится предупреждение "Ни один из процессов не готов к запуску (None of the processes are ready to run"), как показано на изображении ниже. Это произойдет потому, что процесс запуска в фоновом режиме не может использовать слои, не являющиеся параметрами инструмента. В данном случае переменная модели Растр высоты (Elevation Raster) не является параметром, поэтому процесс фоновой обработки не может ее найти и не срабатывает, выдавая упомянутое выше предупреждение.
Решения
Есть несколько способов, при помощи которых вы можете изменить модель так, чтобы она работала в фоновом режиме.
- Сделайте переменную слоя параметром модели. Когда вы это сделаете, слой станет доступным для процесса фоновой обработки, и инструмент будет выполнен в фоновом режиме. Это – самое простое решение проблемы.
- Вместо того, чтобы использовать слой, используйте набор данных на диске. В приведенном выше примере, вам следует дважды щелкнуть на инструменте Извлечь по маске (Extract by Mask) и изменить параметр Входной растр (Input Raster) (который представлен переменной Растр высоты (Elevation Raster)) так, чтобы он использовал набор растровых данных, а не слой из таблицы содержания. Единственная проблема, которую содержит этот вариант решения, заключается в том, что слои могут иметь выборки, а наборы данных на диске – нет. Если вы используете переменную слоя потому, что вам надо использовать выборки слоя, то вы не можете использовать набор данных на диске. В этом случае у вас есть два варианта возможных действий (помимо того, чтобы сделать переменную параметром модели):
- В модели добавьте инструмент Создать векторный слой (Make Feature Layer), чтобы создать переменную слоя из переменной набора данных, и используйте переменную слоя как входные данные для следующего процесса модели. (Инструмент Make Feature Layer (Создать векторный слой) позволяет ввести выражение выборки).
- Создайте файл слоя (.lyr) и используйте файл .lyr в модели. То есть в приведенной выше модели переменная Растр высоты (Elevation Raster) указывала бы на файл .lyr. Файл .lyr может быть создан при помощи инструмента Сохранить в файл слоя (Save To Layer File).
Пример инструмента-скрипта
У инструментов-скриптов та же проблема, что и у инструментов моделей, когда слои используются как входные данные. Каждый слой должен проходить и как параметр, и он должен быть соответствующим типом данных геообработки. Инструменты-скрипты более гибкие, предлагая больше выбора; например, в отличие от слоев они могут использовать строковый тип данных, который соответствует имени слоя в таблице содержания. Несмотря на то, что этот метод работает в приоритетном режиме, в фоновом режиме он работать не будет по причине отсутствия связи между слоем карты и процессом фоновой обработки. На следующем изображении демонстрируется параметр слоя, который передается как строка, и свойства измененного скрипта, позволяющие использовать слой в качестве входного.
Решения
Убедитесь в том, что параметры вашего инструмента-скрипта используют соответствующие типы данных, такие как Слой пространственных объектов (Feature Layer), Растровый слой (Raster Layer) и Представление таблицы (Table View).
Если ваш инструмент-скрипт использует слой, который не является параметром, вы должны будете
- Сделать слой параметром.
- Вместо того, чтобы использовать слой, используйте набор данных на диске или файл .lyr на диске.
Проблема 2 – Использование документа текущей карты (current map) в инструментах-скриптах
Инструменты-скрипты, который работают по текущему документу карты, должны запускаться в приоритетном режиме. Класс MapDocument является отличным способом для использования вашего текущего документа карты посредством инструментов-скриптов. К примеру, у вас есть скрипт, который автоматически увеличивает (приближает) выделенные вами пространственные объекты. Запуск следующего ниже скрипта приведет к возникновению ошибки "Объект: CreateObject не может открыть документ карты (Object: CreateObject cannot open map document)".
Пример скрипта, который выделяет объекты и увеличивает (приближает) их при помощи ArcPy Mapping.
import arcpy
idvalue = arcpy.GetParameterAsText(0)
mxd = arcpy.mapping.MapDocument("CURRENT")
arcpy.SelectLayerByAttribute_management(
"Parcels", "NEW_SELECTION", '"ID" = ' + idvalue)
df = arcpy.mapping.ListDataFrames(mxd)[0]
df.zoomToSelectedFeatures()
Решение
Инструменты-скрипты, которые используют текущий документ карты, должны всегда запускаться и работать в приоритетном режиме. В окне Каталог (Catalog) щелкните правой кнопкой мыши на вашем инструменте-скрипте и выберите пункт Свойства (Properties). На закладке Общие (General) включите опцию Всегда выполнять не в фоновом режиме (Always run in foreground).
Инструменты, запускающие инструменты
Предположим, что у вас есть инструмент-скрипт, который использует текущий документ карты, как описано выше, и этот инструмент всегда должен запускаться и работать в приоритетном режиме. Что случится, если вы используете этот инструмент-скрипт в инструменте модели, а инструмент модели работает в фоновом режиме? Ответом будет то, что модели знают, какие инструменты в модели должны выполняться в приоритетном режиме. Если какие-то инструменты должны работать в приоритетном режиме, то модель автоматически запустит его в приоритетном режиме.