Как заставить обновлять Экстент

0 голосов
спросил 31 Март, 10 от drauka (1,060 баллов) в категории Программные продукты Esri
Вопрос в принципе не сложный, для тех кто знает.
У меня после выполнения скрипта раскрашивается полигон необходимым цветом. Но чтобы увидеть эти изменения необходимо приблизить-отдалить. И это очень сильно раздражает. Кто знает какой командой я могу сделать обновление рабочей среды или хотя бы экстента, что бы сразу видеть изменения?
Спасибо image

31 Ответы

0 голосов
ответил 03 Апр, 10 от TDenis (42,620 баллов)
Ну накодить что-нибудь извращённое - это всегда пожалуйста, это проблем нет, опыт большой :) Но только одной командой не получится, надо несколько.
И не хочу на 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# image
0 голосов
ответил 04 Апр, 10 от drauka (1,060 баллов)
Спасибо Денис!
Еще пока не понял ничего из того что вы сказали, но разберусь, как разберусь отпишусь что из этого получилось!
Я просто не особо программист..так слегка азы знаю и пока хватало!Smile
А как вы нашли такую полезную ссылку?
Я обыскался!
0 голосов
ответил 05 Апр, 10 от TDenis (42,620 баллов)
А как вы нашли такую полезную ссылку?Я обыскался!

Ссылка, похоже, буквально на днях и появилась. ESRI Developer Summit 2010 прошёл не так давно, до сих пор видео выкладывают по-тихоньку. Возможно, что когда вы искали, поисковики ещё не проиндексировали нужные странички.
Если что не будет получаться - спрашивайте.
0 голосов
ответил 05 Апр, 10 от TDenis (42,620 баллов)
P.S. Обалдеть, ShapeCopy на VB.NET отрабатывает в 30 раз (!!!) быстрее, чем на C# image

Разобрался.
As an ArcObjects developer, this means that if your application is not initialized as a single threaded application, the .NET framework will create a special single threaded apartment (STA) thread for all ArcObjects since they are marked as STA. This will cause a thread switch to this thread on each call from the application to ArcObjects. In turn, this forces the ArcObjects components to marshall each call, and eventually it may be about 50 times slower for a call to the COM component. Fortunately, this can be avoided by simply marking the main function as [STAThread].

http://resources.esri.com/help/9.3/ArcGISDesktop/dotnet/2c2d2655-a208-4902-bf4d-b37a1de120de.htm
Добавил [STAThread], совсем другое дело.
0 голосов
ответил 06 Апр, 10 от PEKAHT (2,780 баллов)
я тут на днях опытным путем получил ускорение работы как раз в 50 раз когда исправил работу с объектами в потоке, а тут нате, подтверждение Approve
0 голосов
ответил 07 Апр, 10 от drauka (1,060 баллов)
Сегодня с самого утра решил наконец посмотреть что за замечательный метод вы предложили.
Очень хитро и действенно. Он расширяет функциональность в разы, и главное действительно скорость. Думаю уже переписать часть диплома используя comtypes

Опробовал описанный выше TDenis способ по обновлению экстента. Выдал ошибку об отсутствии  ImxDocument в модуле EsriArcMapUI
pMxDoc = CType(pDoc, esriArcMapUI.IMxDocument)
Я не поверил, и проверил. Хорошо Pyscriptrer хорошо в этом мне помог - нашел модуль EsriArcMapUI и проверил. Его действительно там нет! Проверил коды человека не из ESRI, который так хитро это все придумал. Он тоже использует IMxDocument/
Значит по каким-то причинам у меня его не нашлось. Странно. Я не думаю что наличие этого интерфейса зависит от лицензии! Ищу в чем проблема...
У кого нибудь есть мысли на этот счет?
0 голосов
ответил 07 Апр, 10 от TDenis (42,620 баллов)
Проверьте лишний раз, сам файл на месте? Путь правильно написали?
Не знаю, вряд ли это важно, но у меня ArcGIS .NET SDK установлен.
Проверил с помощью ESRI Library Locator:
image

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

А тема какая, если не секрет? Скорость настолько принципиальна, что надо переписывать часть диплома?
Ведь это всё же некоторый хак, официальной поддержки таких выкрутасов пока нет. Хотя может быть из-за этого дипломная будет вдвойне ценнее))
0 голосов
ответил 07 Апр, 10 от drauka (1,060 баллов)
Сам файл esriArcMapUI на месте. А где я могу скачать esriLibraryLocator? Я так понимаю она поставляется с какимто Developers пакетом?

Пытаюсь на всякий случай SDK установить.

Нет не секрет. Тема "Комплексная оценка окружающей среды с использованием ГИС". Скрипты нужны для того раскрашивать полученные результаты на карте и собирать информацию о выбранных постах наблюдения.
https://forum.esri-cis.ru/index.php?qa=35300 - вот здесь я выкладывал скрипт мой) Если интересно. Ничего сложного, но скорость работы с использованием ARCGISSCRIPTING убивает.
0 голосов
ответил 07 Апр, 10 от TDenis (42,620 баллов)
А где я могу скачать esriLibraryLocator? Я так понимаю она поставляется с какимто Developers пакетом?

Устанавливается с тем же ArcGIS .NET SDK. В пуске в папке ArcGIS появится папка Developer Tools. Там оно и лежит.
0 голосов
ответил 07 Апр, 10 от TDenis (42,620 баллов)
Ничего сложного, но скорость работы с использованием ARCGISSCRIPTING убивает.

Да ладно вам, нормально для диплома. Чем дольше работает, тем комплекснее выглядит оценка окружающей среды)) Сейчас главнее исследовательская и научная составляющая, а не оптимизации всякие.
Если б для продакшна система была...
Ну, в общем дело ваше, с другой стороны если время есть, то почему бы и не сделать...
    
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...