AM10, .NET: Выборка выделенных слоев

ArcGIS 8.x,9.x,10.x (Arcview, ArcEditor, Arcinfo).
Ответить
Lunar Whisper
Интересующийся
Сообщения: 23
Зарегистрирован: 06 июн 2011, 17:10
Репутация: 0

AM10, .NET: Выборка выделенных слоев

Сообщение Lunar Whisper » 06 июн 2011, 17:16

Всем привет!

Пишу под ArcGis впервые, и на элементарном в общем-то действии захожу в тупик. Как обработать (в цикле) только выделенные юзверем слои? Ничего похожего на SelectedLayers я не нашел. Свойства Selected у объекта ILayers тоже. Поиск вывел на что-то громоздкое с участием таинственного TOC, но из-за языка (VB) и использования венгерской нотации, там без пол литра не разобраться. Да и пространства имен не указаны, а я в них еще слабо ориентируюсь. :cry:

В общем, помогите, кто может. Заранее большое спасибо!

Lunar Whisper
Интересующийся
Сообщения: 23
Зарегистрирован: 06 июн 2011, 17:10
Репутация: 0

Re: AM10, .NET: Выборка выделенных слоев

Сообщение Lunar Whisper » 06 июн 2011, 17:51

Тэкс, нашел в IMxDocument свойство SelectedLayer. Но это один слой. А где бы найти коллекцию выделенных слоев?..

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

Re: AM10, .NET: Выборка выделенных слоев

Сообщение Дмитрий Барышников » 07 июн 2011, 09:12

Вы под SelectedLayer имеете в виду слои с галочками или выделенные через ctrl?

Lunar Whisper
Интересующийся
Сообщения: 23
Зарегистрирован: 06 июн 2011, 17:10
Репутация: 0

Re: AM10, .NET: Выборка выделенных слоев

Сообщение Lunar Whisper » 07 июн 2011, 15:25

Выделенные через Ctrl. (Надеюсь, что это вообще возможно). Если нет - пусть с галочкой. В противном случае, я так понимаю, придется рисовать формочку с древом слоев для выбора - какие обрабатывать. А это уже не так удобно. И в MxDocument.SelectedLayer, если выделен один слой, он пишется. А вот если несколько - там висит значение null.

---

Ага, понял о чем вы. Да, действительно, можно выбирать только видимые слои по свойству ILayer.Visible. Но это все-таки не совсем айс. Хочется именно выделенные "по ctrl".

---

Нашел такой вот пример: http://edndoc.esri.com/arcobjects/9.2/C ... xample.htm
Увы, там показано, как добавлять слои к выделению (если я правильно понял и выделяются слои, а не объекты в них). У самого IContentsView также есть свойство SelectedLayer, и в примечании указано - could be enumerator... АГА, ЩАЗ!

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

var doc = ArcMap.Document as IMxDocument;
var map = doc.FocusMap;
var toc = doc.ContentsView[0];

var layers = toc.SelectedItem as IEnumerator<ILayer>; // пробуем...
//var layers = doc.SelectedLayer as IEnumerator<ILayer>; // ...оба варианта

while (layers.MoveNext()) // и здесь нам говорят: "А не пошли бы вы, layers == null!" =\

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

Re: AM10, .NET: Выборка выделенных слоев

Сообщение Дмитрий Барышников » 07 июн 2011, 17:55

не IEnumerator<ILayer>, а IEnumLayer

http://edndoc.esri.com/arcobjects/9.1/c ... xample.htm

Lunar Whisper
Интересующийся
Сообщения: 23
Зарегистрирован: 06 июн 2011, 17:10
Репутация: 0

Re: AM10, .NET: Выборка выделенных слоев

Сообщение Lunar Whisper » 07 июн 2011, 19:46

Полагаю, бессмысленно спрашивать - для чего потребовалось изобретать велосипед... Впрочем, ладно. IEnumLayer, так IEnumLayer. Проблема в другом. Если выделено (с контролом) несколько слоев, то свойство SelectedLayer и у ContentView и у карты, и SelectedItem у CurrentContentView принимают значение null. А его во что не трансформируй - все одно получишь... NullReferenceException.

В том примере, по ссылке, снимается выделение со всех слоев, после чего они выделяются по новой. Тут же задача более интеллектуальная - получить только выделенные слои.

Еще какие-нибудь идеи есть? :) Просто обидно - рабочий и довольно сложный код уже написал, а на такой фигне застопорился. =\

---

http://help.arcgis.com/en/sdk/10.0/arco ... 043r000000

Вот здесь тоже есть работа с выделенными слоями, только для этого они создают собственный Toc. Не интересно.

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

Re: AM10, .NET: Выборка выделенных слоев

Сообщение Дмитрий Барышников » 08 июн 2011, 08:08

IContentsViewSelection
SelectedItems
http://resources.esri.com/help/9.3/arcg ... dItems.htm

Если и это не поможет - получайте HWND контрола и через средства treecontrol получайте выделение.

Lunar Whisper
Интересующийся
Сообщения: 23
Зарегистрирован: 06 июн 2011, 17:10
Репутация: 0

Re: AM10, .NET: Выборка выделенных слоев

Сообщение Lunar Whisper » 08 июн 2011, 08:42

Ураааааааааа! Работает! Огромное спасибо! Для страждущих:

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

var doc = arcMap.Document as IMxDocument;
var selection = (doc.CurrentContentsView as IContentsViewSelection).SelectedItems;
for (int i = 0; i < selection.Count; i++)
{
    var item = selection.Next();
    if (item is ILayer)
    {
        System.Windows.Forms.MessageBox.Show((item as ILayer).Name);
    }
}
---
При этом, если selection.Count == 1, то selection.Next() вернет null => если выделен 1 слой, его нужно получать из CurrentContentsView.SelectedItem (возможно) или doc.FocusMap.SelectedLayer (с гарантией)

Lunar Whisper
Интересующийся
Сообщения: 23
Зарегистрирован: 06 июн 2011, 17:10
Репутация: 0

Re: AM10, .NET: Выборка выделенных слоев

Сообщение Lunar Whisper » 12 июн 2011, 21:58

Написал метод-расширение:

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

public static class MapHelper
{
    public static List<ILayer> GetSelectedLayers(this IMxDocument doc)
    {
        var result = new List<ILayer>(); 
        var items = (doc.CurrentContentsView as IContentsViewSelection).SelectedItems;
        if (items != null)
        {
            var count = items.Count;
            if (count == 1 && doc.SelectedLayer != null)
                result.Add(doc.SelectedLayer);
            else if (count > 1)
            {
                for (int i = 0; i < count; i++)
                {
                    var item = items.Next();
                    if (item is ILayer)
                        result.Add(item as ILayer);
                }
            }
        }
        return result;
    }
}
На этом считаю свой гражданский долг исполненным. Еще раз спасибо Bishop. Надеюсь, столкнувшиеся с такой же проблемой найдут эту тему.

Ответить

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей