Форум НПФ  

Вернуться   Форум НПФ "ТОПОМАТИК" > Программные продукты "Топоматик Robur" на платформе "Robur AP3" > Средства разработки Топоматик Robur > Вопросы и ответы
Ник
Пароль
Регистрация FAQ Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04-01-2019, 15:52
Prosterian Prosterian вне форума
Новичок
 
Регистрация: Sep 2017
Сообщения: 24
По умолчанию Как обращаться с коллекциями Инженерных сетей и Картограмм?

Здравствуйте!
При попытке получить коллекции инженерных сетей или картограмм, я получаю обфусцированные экземпляры коллекций.
С ЦММ, ЖД, АД и трассами проблем нет. Получил коллекцию, а дальше получаешь из её элементов необходимые данные.
В случае с Инж. сетями и картограммами я попадаю в тупик. Максимум на что меня хватило - это:
Код:
// Получаю коллекцию инженерных сетей var obj = Project.FindItem(new Guid("66494a46-732a-47d1-a536-a62065f24731")); // Прохожусь по коллекции и пальцем в небо пытаюсь выдернуть их них хоть что-то foreach (var item in obj as IEnumerable) { var wrapped = ((IWrapped) item).WrappedObject; Surface surface = ((ISurfaceContainer)wrapped).Surface; }


Часть нужных данных я выдернуть смогу, но хочется работать более полноценно и не наугад, как, например, с TerrainModelsCollectionItem или же AlignmentModel.
Ответить с цитированием
  #2  
Старый 04-02-2019, 10:45
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

Для получения коллекции инженерных сетей, нужно использовать Id 66494A46-732A-47D1-A536-A62065F24731 и приводить объект к интерфейсу IPipeNetworkContainer, а для картограмм A5D3E59D-AF17-4394-883D-4CE053310DC1 и использовать интерфейс ICartogramContainer
Код:
var pipes = Project.FindItem(new Guid("66494A46-732A-47D1-A536-A62065F24731")) as ICoreCollection; foreach (var wrapped in pipes) { var pipe_container = wrapped.WrappedObject as IPipeNetworkContainer; var pipe_network = pipe_continer.PipeNetwork; } var cartograms = Project.FindItem(new Guid("A5D3E59D-AF17-4394-883D-4CE053310DC1")) as ICoreCollection; foreach (var wrapped in cartograms ) { var cartogram_container = wrapped.WrappedObject as ICartogramContainer; var cartogram = cartogram_container.Cartogram; }
Ответить с цитированием
  #3  
Старый 04-02-2019, 12:05
Prosterian Prosterian вне форума
Новичок
 
Регистрация: Sep 2017
Сообщения: 24
По умолчанию

Благодарю за ответ.
Препроцессор выдает ошибку, что ICoreCollection не Enumerable. При попытке привести его к IEnumerable у элементов коллекции пропадает свойство WrappedObject. Но если привести их к IWrapped, то всё срабатывает. С картограммами схожая ситуация.
Получилось вот так:
Код:
var pipes = Project.FindItem(new Guid("66494a46-732a-47d1-a536-a62065f24731")) as ICoreCollection; foreach (var wrapped in pipes as IEnumerable) { var pipe_container = ((IWrapped)wrapped).WrappedObject as IPipeNetworkContainer; var pipe_network = pipe_container.PipeNetwork; }


Вообще очень странно что поведения всех элементов проекта так сильно отличаются друг от друга и нет даже какого-нибудь обобщающего базового класса. С ЦММ, ЖД и АД всё намного проще. Есть FileSystemItem и с любой коллекцией объектов я могу работать используя один метод и не беспокоиться. Здесь же приходится для каждого элемента искать свой подход.
Например Drawing у инженерных сетей лежит в самом PipeNetwork, в то время как у Cartogram этого свойства нет, но оно есть у контейнера.
На поиск, казалось бы очевидных вещей, приходится тратить кучу времени, чтобы для каждого случая разработать методику получения тех или иных данных.
Ответить с цитированием
  #4  
Старый 04-02-2019, 12:23
Василий Гончаров Василий Гончаров вне форума
Разработчик Robur
 
Регистрация: Oct 2016
Сообщения: 154
По умолчанию

Давайте я отвечу более развернуто. Все коллекции поддерживают базовый интерфейс ICoreCollection. У этого интерфейса есть метод GetItems который позволяет получить список элементов ICoreCollectionItem, используя заданный предикат (допустимо передавать null в качестве предиката, тогда метод вернёт все элементы коллекции):
Код:
var pipes = Project.FindItem(new Guid("66494a46-732a-47d1-a536-a62065f24731")) foreach (var item in pipes.GetItems(delegate(ICoreCollectionItem){ //Здесь Вы можете выбрать только те элементы, которые Вам необходимы return true; }))

Каждый элемент ICoreCollectionItem имеет свойство WrappedObject - это модель, которая лежит в Вашем элементе. Дальше, Вы приводите модель к требуемому интерфейсу, это может быть IDrawingContainer, IAlignmentContainer, ISurfaceContainer и т.п. и работаете с необходимой Вам моделью напрямую.

Более того, на данный момент, все эти элементы наследники от FileSystemItem и мне не совсем понятно, в чем Вы видите разницу между например элементом ядра ЦММ и элементом ядра картограммы?
Ответить с цитированием
  #5  
Старый 04-02-2019, 13:28
Prosterian Prosterian вне форума
Новичок
 
Регистрация: Sep 2017
Сообщения: 24
Хорошо

Спасибо!
Из-за обфускации для меня не были очевидными многие вещи, но теперь всё раскладывается по полкам и становится более понятным.
Ответить с цитированием
Ответ


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 8:49.

Навигация по основному сайту
Главная Каталог продуктов и услуг Где купить Сопровождение
Вакансии О компании Обзоры Канал на YouTube

vBulletin v3.0.7 , Copyright ©2000-2023, Jelsoft Enterprises Ltd.
Copyright © 2003-2023, НПФ "ТОПОМАТИК".