Страница 1 из 1
AM10, .NET: Выборка выделенных слоев
Добавлено: 06 июн 2011, 17:16
Lunar Whisper
Всем привет!
Пишу под ArcGis впервые, и на элементарном в общем-то действии захожу в тупик. Как обработать (в цикле) только выделенные юзверем слои? Ничего похожего на SelectedLayers я не нашел. Свойства Selected у объекта ILayers тоже. Поиск вывел на что-то громоздкое с участием таинственного TOC, но из-за языка (VB) и использования венгерской нотации, там без пол литра не разобраться. Да и пространства имен не указаны, а я в них еще слабо ориентируюсь.
В общем, помогите, кто может. Заранее большое спасибо!
Re: AM10, .NET: Выборка выделенных слоев
Добавлено: 06 июн 2011, 17:51
Lunar Whisper
Тэкс, нашел в IMxDocument свойство SelectedLayer. Но это один слой. А где бы найти коллекцию выделенных слоев?..
Re: AM10, .NET: Выборка выделенных слоев
Добавлено: 07 июн 2011, 09:12
Дмитрий Барышников
Вы под SelectedLayer имеете в виду слои с галочками или выделенные через ctrl?
Re: AM10, .NET: Выборка выделенных слоев
Добавлено: 07 июн 2011, 15:25
Lunar Whisper
Выделенные через 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!" =\
Re: AM10, .NET: Выборка выделенных слоев
Добавлено: 07 июн 2011, 17:55
Дмитрий Барышников
Re: AM10, .NET: Выборка выделенных слоев
Добавлено: 07 июн 2011, 19:46
Lunar Whisper
Полагаю, бессмысленно спрашивать - для чего потребовалось изобретать велосипед... Впрочем, ладно. IEnumLayer, так IEnumLayer. Проблема в другом. Если выделено (с контролом) несколько слоев, то свойство SelectedLayer и у ContentView и у карты, и SelectedItem у CurrentContentView принимают значение null. А его во что не трансформируй - все одно получишь... NullReferenceException.
В том примере, по ссылке, снимается выделение со всех слоев, после чего они выделяются по новой. Тут же задача более интеллектуальная - получить только выделенные слои.
Еще какие-нибудь идеи есть?

Просто обидно - рабочий и довольно сложный код уже написал, а на такой фигне застопорился. =\
---
http://help.arcgis.com/en/sdk/10.0/arco ... 043r000000
Вот здесь тоже есть работа с выделенными слоями, только для этого они создают собственный Toc. Не интересно.
Re: AM10, .NET: Выборка выделенных слоев
Добавлено: 08 июн 2011, 08:08
Дмитрий Барышников
IContentsViewSelection
SelectedItems
http://resources.esri.com/help/9.3/arcg ... dItems.htm
Если и это не поможет - получайте HWND контрола и через средства treecontrol получайте выделение.
Re: AM10, .NET: Выборка выделенных слоев
Добавлено: 08 июн 2011, 08:42
Lunar Whisper
Ураааааааааа! Работает! Огромное спасибо! Для страждущих:
Код: Выделить всё
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 (с гарантией)
Re: AM10, .NET: Выборка выделенных слоев
Добавлено: 12 июн 2011, 21:58
Lunar Whisper
Написал метод-расширение:
Код: Выделить всё
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. Надеюсь, столкнувшиеся с такой же проблемой найдут эту тему.