Список слоев из АrcMap в ComboBox

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Ответить
mumumba3432
Новоприбывший
Сообщения: 5
Зарегистрирован: 02 апр 2012, 11:48
Репутация: 0

Список слоев из АrcMap в ComboBox

Сообщение mumumba3432 » 02 апр 2012, 12:43

Подскажите, как вывести из таблицы содержания ArcMap все слои (их названия) с точечными объектами в выпадающий список ComboBox на созданной форме. Форма открывается в ArcMap при нажатии на пользовательскую кнопку на ToolBox'e.

Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Список слоев из АrcMap в ComboBox

Сообщение Дмитрий Барышников » 02 апр 2012, 14:18

Получаете интерфейс IMap с помощью IMxDocument::FocusMap
Получаем список слоев get_LayerCount
обходим все слои от 0 до LayerCount
и получаем интерфейс ILayer при помощи get_Layer
Приводим ILayer к IFeatureLayer.
Если не NULL, то вызываем get_FeatureClass
Получаем IFeatureClass
У него вызываем get_ShapeType и получаем тип геометерии.
Если esriGeometryPoint или esriGeometryMultipoint то получаем имя слоя get_Name у интерфейса ILayer и имя пихаем в комбо.
Вкратце, как-то так.

mumumba3432
Новоприбывший
Сообщения: 5
Зарегистрирован: 02 апр 2012, 11:48
Репутация: 0

Re: Список слоев из АrcMap в ComboBox

Сообщение mumumba3432 » 02 апр 2012, 14:30

спасибо, буду пробовать.

Mitrich
Активный участник
Сообщения: 184
Зарегистрирован: 15 сен 2006, 16:15
Репутация: 10
Откуда: Москва

Re: Список слоев из АrcMap в ComboBox

Сообщение Mitrich » 02 апр 2012, 21:01

мои 5 копеек
тут рекурсивный вызов для групповых слоев, иначе только слои верхнего уровня попадут в сети

Код: Выделить всё

Function GetMapLayers(Optional OnlyPointLayers As Boolean = False) As Collection

On Error GoTo errHandle

Dim pLayer As esriCarto.ILayer

2277: Set GetMapLayers = New Collection

Dim i As Integer
2280:   For i = 0 To pMap.LayerCount - 1
2281:   Set pLayer = pMap.Layer(i)
2282:   AddLayerToCollection pLayer, GetMapLayers, OnlyPointLayers
2283:   Next i

Exit Function
errHandle:
HandleError True, "GetMapLayers " & c_sModuleFileName & " " & GetErrorLineNumberString(Erl), Err.Number, Err.Source, Err.Description, 4
End Function


Private Sub AddLayerToCollection(pLayer As esriCarto.ILayer, ByRef Coll As Collection, Optional OnlyPointLayers As Boolean = False)

  Dim i As Long
  Dim pGroup As esriCarto.IGroupLayer
  Dim pComp As esriCarto.ICompositeLayer
  Dim addLayer As Boolean
  
2298:   If (TypeOf pLayer Is IGroupLayer) Then
2299:     Set pGroup = pLayer
2300:     Set pComp = pLayer
2301:     For i = 0 To pComp.Count - 1
2302:       AddLayerToCollection pComp.Layer(i), Coll, OnlyPointLayers
2303:     Next i
2304:   Else
2305:     addLayer = True
2306:     If (TypeOf pLayer Is IGeoFeatureLayer) Then
2307:         If OnlyPointLayers Then
            
            Dim pGFL As esriCarto.IGeoFeatureLayer
2310:             Set pGFL = pLayer
2311:             addLayer = False
2312:             If pGFL.FeatureClass.ShapeType = esriGeometryPoint Then
2313:                 addLayer = True
2314:             End If
2315:         End If
2316:         If addLayer Then
2317:             Coll.Add pLayer
2318:         End If
2319:     End If
2320:   End If

Exit Sub
errHandle:
HandleError True, "AddLayerToCollection " & c_sModuleFileName & " " & GetErrorLineNumberString(Erl), Err.Number, Err.Source, Err.Description, 4

End Sub

Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Список слоев из АrcMap в ComboBox

Сообщение Дмитрий Барышников » 02 апр 2012, 22:16

Спасибо. Я про это как-то забыл.

mumumba3432
Новоприбывший
Сообщения: 5
Зарегистрирован: 02 апр 2012, 11:48
Репутация: 0

Re: Список слоев из АrcMap в ComboBox

Сообщение mumumba3432 » 04 апр 2012, 14:09

Правильно я понимаю, что в свой проект надо добавить интерфейсы IMap, ImxDocument, ILayer, IFeatureCLass? Просто добавив ImxDocument и добавив все его методы в файл.cpp, все собиралось нормально, но при добавлении интерфейса IMap и добавлении его методов при сборке появляется критическая ошибка

Код: Выделить всё

fatal error C1001: An internal error has occurred in the compiler.(compiler file 'msc1.cpp', line 1393)
Подскажите пожалуйста, а то впервые разрабатываю для ArcGIS.

Аватара пользователя
Дмитрий Барышников
Гуру
Сообщения: 2572
Зарегистрирован: 17 ноя 2009, 19:17
Репутация: 261
Откуда: Москва

Re: Список слоев из АrcMap в ComboBox

Сообщение Дмитрий Барышников » 04 апр 2012, 16:08

Вы на чем пишете и в какой среде и под какую версию ArcGIS?

Возьмите исходники http://gis-lab.info/qa/agetools.html и посмотрите как там сделано подключение интерфейсов.

mumumba3432
Новоприбывший
Сообщения: 5
Зарегистрирован: 02 апр 2012, 11:48
Репутация: 0

Re: Список слоев из АrcMap в ComboBox

Сообщение mumumba3432 » 04 апр 2012, 16:55

в Visual studio 2005 на Visual C++. Версия ArcGIS 9.3
Спасибо за ссылку

Ответить

Вернуться в «ArcGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: Semrush [Bot] и 3 гостя