Перехват событий ArcMap

0 голосов
спросил 16 Апр, 04 от Owen (540 баллов) в категории Программные продукты Esri
Такой вопрос. Как получить (и возможно ли это) доступ к events (в частности, к onMouseMove) в родном фрейме ArcMap, т.е. перехват кликов/движения мышки etc на карте ArcMap из VB.

10 Ответы

0 голосов
ответил 16 Апр, 04 от Alexander1 (32,520 баллов)


т.е. перехват кликов/движения мышки etc на карте ArcMap

По "карте ArcMap" движется не мышка. Движется курсор того или иного Tool-а.
Следовательно, речь вести следует о перехвате, например, MouseDown event этого самого Tool-а.

Для работы с built-in tools можно воспользоваться ITool Interface-ом.

Кроме этого существует много других Event Interfaces. Для Map CoClass, например, это:
- IActiveViewEvents Interface
- IMapEvents Interface

Для Editor Class это:
- IEditEvents Interface
- IEditEvents2 Interface
- IEditEvents3 Interface

Ну и так далее...

0 голосов
ответил 27 Апр, 04 от Owen (540 баллов)

Можно ли получить доступ к StatusBar-у ArcMap (скажем, писать туда не то, что хочет писать сам ArcMap).

И как перехватывать events конкретного ITool самого ArcMap, вряд ли это возможно без написания своего класса, которым придется подменять ITool ArcMap-а.

И еще вопрос... Без VB, только на VBA ArcMap-а, в рамках одного приложения, как создать работающий тот же ITool?

Извините, если задаю примитивные вопросы...

0 голосов
ответил 27 Апр, 04 от Alexander1 (32,520 баллов)

1. Смотри пример 'Show Progressbar Programmatically' в ArcObjects Help 3. В ВБА работа идёт не с ITool, а с UIToolControl. В ArcObjects Help есть много примеров того, как создавать UIToolControl.


По пункту 2 не совсем понятно - опиши общую идею того, что нужно сделать.

0 голосов
ответил 28 Апр, 04 от Owen (540 баллов)

Огромное спасибо! Просто не встречался раньше с этим, как раз то, что нужно. С sample все понятно.

Есть еще один вопрос - в отработчик OnMouseMove (OnMouseDown, etc) приходят координаты в окне (x,y) в этот мой UIToolControl. Есть ли механизм привязки этой точки к lat-long на карте, где находится мыша?

Второй вопрос снимается.

Зато есть вопрос совершенно по другой теме. Надо отрисовать слой с фичами polyline в виде стрелочек (программно). Смотрел всякие ISimpleLineSymbol, ICartogrLSymb etc, не понял ничего =(.

Как создать такой символ? Подсунуть его в Renderer layer-a я смогу, а вот создать нормальную стрелочку не получается.

0 голосов
ответил 28 Апр, 04 от Alexander1 (32,520 баллов)

"привязки этой точки к lat-long на карте" - смотри пример 'ITool Example' в ArcObjects Developer Help. Там в процедуре ITool_OnMouseDown показано такое преобразование.

"Надо отрисовать слой с фичами polyline в виде стрелочек" - есть два пути:
1. Генерировать необходимый символ в коде.
2. Заранее в редакторе символов создать необходимый символ, записать его в Style File, а затем загрузить из кода этот символ.

Мне кажется, что начинать следует со второго метода. Он будет проще в реализации, да и есть "законченный" пример 'Get a Symbol from the Style Gallery' (в ArcObjects Developer Help).

0 голосов
ответил 07 Май, 04 от Owen (540 баллов)

Спасибо...

И еще вопрос.

В Private Function MxDocument_OpenDocument() и в NewDoc можно как-нибудь добыть string с именем открываемого/создаваемого  файла?

0 голосов
ответил 07 Май, 04 от Alexander1 (32,520 баллов)
Проверь Title Property для IDocument Interface.
0 голосов
ответил 11 Май, 04 от Owen (540 баллов)

Там есть имя+расширение файла открытого. А вот path нету image

Даже у IDocumentInfo нету.

А есть ли возможность получить доступ к Save as event-у у ThisDocument?

0 голосов
ответил 11 Май, 04 от Alexander1 (32,520 баллов)

Найти путь документа можно след. образом:
http://arcobjectsonline.esri.com/ArcObjectsOnline/Samples/Application%20Framework/FindFilenames.htm

Public Sub GetPaths()
  Dim pTemplates As ITemplates
  Dim lTempCount As Long
  Dim strNormalPath As String
  Dim strBasePath As String
  Dim strDocPath As String
 
  Set pTemplates = Application.Templates
  lTempCount = pTemplates.Count
 
  ' Normal is always the first item
  strNormalPath = pTemplates.Item(0)
 
  ' The document is always the last item
  strDocPath = pTemplates.Item(lTempCount - 1)
 
  ' If present, the base template is the middle item
  If lTempCount = 3 Then
    strBasePath = pTemplates.Item(1)
  Else
    strBasePath = "NO BASE TEMPLATE LOADED"
  End If

  ' Report pathnames
  MsgBox "Normal Template:  " & strNormalPath & vbNewLine & _
          "Base Template:  " & strBasePath & vbNewLine & _
          "Document:  " & strDocPath
End Sub

Перехватить можно только события:
- BeforeCloseDocument Event
- CloseDocument Event

Если тебе нужно Save as документ из кода, это можно сделать используя SaveAsDocument Method of IApplication Interface.

0 голосов
ответил 24 Сен, 04 от Wazzzuup_ (3,260 баллов)

Приведи-те пожалуйста какой-нибудь простенький пример как с помощью ITool Interface отработать нажатие мышой в ArcMap - если можно то инструментом Identify или как вам удобно. А то я что-то не пойму сам принцип этого метода.

Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...