Ну накодить что-нибудь извращённое - это всегда пожалуйста, это проблем нет, опыт большой :) Но только одной командой не получится, надо несколько.
И не хочу на C/C++, могу подсказать, как подобное выглядит на C#.
1. Ставите Visual Studio 2008, причём сгодится и бесплатная
Express Edition, либо можно поставить
триал версии покруче (90 дней будет работать).
2. Ставите .NET SDK (поищите на диске с ArcGIS Desktop),
3. В VS создаёте новый exe-проект, например Console Application
4. Подключаете сборки ESRI.ArcGIS.ArcMapUI, ESRI.ArcGIS.Carto, ESRI.ArcGIS.Display, ESRI.ArcGIS.Framework
5. В файле Program.cs дописываете пространства имён:
using ESRI.ArcGIS.Framework;
using ESRI.ArcGIS.ArcMapUI;
using ESRI.ArcGIS.Carto;
5. В методе main пишете нечто вроде:
AppROT pAppRot = new AppROTClass();
for (int i = 0; i < pAppRot.Count; i++)
{
IApplication pApp = pAppRot.get_Item(i);
IMxDocument pMxDoc = pApp.Document as IMxDocument;
if (pMxDoc == null)
continue;
IActiveView pActiveView = pMxDoc.ActiveView;
pActiveView.Refresh();
// pMxDoc.FocusMap.Name = "Hello world! ;-) ";
}
Пара комментариев. Чтобы обновить экран надо:
1. Получить ссылку на приложение (IApplication),
2. Из приложения получить ссылку на текущий документ (IMxDocument),
3. Из документа получить ссылку на активный вид (IActiveView).
4. Для вида вызвать метод
Refresh (меньше писать :) ), либо
PartialRefresh (хитрее работает).
Цикл нужен, поскольку приложений (экземпляров аркмапа) может быть запущено несколько, обновим ещё не тот. Либо надо проверять по названию или ещё как, либо не заморачиваясь обновлять все, как я и сделал.
Проверка на null с переходом на следующую итерацию нужны, поскольку item (экземпляр программы) может оказаться вовсе не аркмэпом, а, к примеру, арккаталогом. Поэтому надо проверить, иначе следующая строка выкинет NullReferenceException.
Когда окошко консоли начнёт нервировать, можно будет вместо Console Application сделать похожее WinForms приложение, оно умеет делать окно невидимым. Ну или WPF.
------------------------------
Но похоже, всё-таки имеется способ поинтереснее. Кажись, я вас подло обманул на предыдущей странице, сказав что ничего не получится. На девсаммите был интересный
доклад под названием
Using ArcObjects in Python
Там камрад (не из ESRI, что интересно) показывал, как работать с ArcObjects на питоне и даже как сделать собственный инструмент для ArcMap на "змеюке".
Видео нету (пока?), зато есть
презентация и
исходники!
Если в двух словах, то надо скачать и установить
вот этот пакет, после чего можно будет писать такое:
def CType(obj, interface):
try:
newobj = obj.QueryInterface(interface)
return newobj
except:
return None
from comtypes.client import GetModule, CreateObject
esriFramework = GetModule("c:/ArcGIS/com/esriFramework.olb")
esriArcMapUI = GetModule("c:/ArcGIS/com/esriArcMapUI.olb")
pAppRot = CreateObject(esriFramework.AppROT, interface=esriFramework.IAppROT)
for i in range(pAppRot.Count):
pApplication = pAppRot.Item(i)
pDoc = pApplication.Document
pMxDoc = CType(pDoc, esriArcMapUI.IMxDocument)
if pMxDoc == None:
continue
pView = pMxDoc.ActiveView
pView.Refresh()
Используя файлы из исходников, можно написать покрасивше.
Не забудьте подставить свой путь при вызове GetModule.
P.S. Обалдеть, ShapeCopy на VB.NET отрабатывает в 30 раз (!!!) быстрее, чем на C#