ProfileView.GraphOverrides - не полный список частей!

Автор Тема: ProfileView.GraphOverrides - не полный список частей!  (Прочитано 6299 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Всем привет,
С вида профиля не могу получить все части.
Через интерфейс цивила (руками) выводит 50 частей на виде профиля:
Извините, вам запрещён просмотр содержимого спойлеров.

Программно получаю 43 части:
Извините, вам запрещён просмотр содержимого спойлеров.

Код - C# [Выбрать]
  1.         [CommandMethod(nameof(TestPipesParts), CommandFlags.Modal)]
  2.         public void TestPipesParts()
  3.         {
  4.             var doc = Application.DocumentManager.MdiActiveDocument;
  5.             var ed = doc.Editor;
  6.             using (var t = doc.TransactionManager.StartTransaction())
  7.             {
  8.                 var pv = ed.GetEntity("Выбери вид профиля").ObjectId.GetObject(OpenMode.ForRead) as ProfileView;
  9.                 if (pv == null) return;
  10.                 foreach (var graphOverride in pv.GraphOverrides)
  11.                 {
  12.                     Debug.WriteLine($"{graphOverride.ProfileName}");
  13.                 }
  14.                 t.Commit();
  15.             }
  16.         }

Пример файла (версия AC1027 - 2013-2017):
https://drive.google.com/open?id=1wLL6YDH2D1ly_2eB30dRmKty7g9fOCY8

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Поворчу немного...
С третьей попытки выяснил, что версия файла Civil 3D 2019

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Интересно. А как выяснил)
У меня 2017 цивил.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
А, да... Перепутал немного окошки с предупреждениями. Но всё равно, лучше сразу предупреждать о версии, я сперва пробовал в 2014 открыть.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Рассматриваю вариант геометрического попадания границ частей в границу вида профиля.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Идей пока что нет никаких. Геометрически они все на виде профиля. Все отображаются при соответствующих настройках стиля.
Посмотрел через ARXMGD и DBGMGD. Что характерно - там та же самая картина. Вид профиля в ссылках имеет 2 группы элементов трубопроводных сетей. В одной группе - 43 элемента, в другой - 50. Хотя, должно быть по 50 в обеих группах.
Я бы начал с того, что нашёл бы те элементы, которые не содержатся в списке, полученном программно. Проанализировал бы их, попробовал бы создать заново. Ну и т.д. и т.п...
P.S. вообще, чертёж довольно необычный. Я думаю, что его настраивали программно. И трубы вы довольно хитрые рисуете. И соединения между трубами у вас необычные...

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Удалил трубы-колодцы с вида профиля, добавил на вид профиля заново - проблема пропала. Как изначально они были нанесены?

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Удалил трубы-колодцы с вида профиля, добавил на вид профиля заново - проблема пропала. Как изначально они были нанесены?
По основной цепи - программно создан вид профиля и добавлены части:
Код - C# [Выбрать]
  1. part.AddToProfileView(pViewId);
Остальные трубы руками добавлены.

Да, при удалении и повторном добавлении частей труб на вид профиля, многие "появляются", но не все.

Посмотрел через ARXMGD и DBGMGD. Что характерно - там та же самая картина. Вид профиля в ссылках имеет 2 группы элементов трубопроводных сетей. В одной группе - 43 элемента, в другой - 50. Хотя, должно быть по 50 в обеих группах.
Подскажи плиз, куда смотреть? Вид профиля выбирать. А дальше?

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
А, похоже на Hard/soft references

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Да, верно. В Soft как раз есть ссылки на элементы на виде профиля.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Тестировал немного изменённым кодом:
Код - C# [Выбрать]
  1. [CommandMethod(nameof(TestPipesParts), CommandFlags.Modal)]
  2. public void TestPipesParts()
  3. {
  4.     var doc = Application.DocumentManager.MdiActiveDocument;
  5.     var ed = doc.Editor;
  6.  
  7.     PromptEntityResult entRes = ed.GetEntity("Выбери вид профиля");
  8.  
  9.     if (entRes.Status != PromptStatus.OK) return;
  10.  
  11.     int count = 0;
  12.  
  13.     using (var t = doc.TransactionManager.StartTransaction())
  14.     {
  15.         var pv = entRes.ObjectId.GetObject(OpenMode.ForRead) as ProfileView;
  16.         if (pv == null) return;
  17.         foreach (var graphOverride in pv.GraphOverrides)
  18.         {
  19.             ObjectId id = graphOverride.ProfileId;
  20.             if (id.IsValid
  21.                 && !id.IsErased
  22.                 && !id.IsEffectivelyErased
  23.                 && id.ObjectClass.Equals(RXClass.GetClass(typeof(ProfileViewPart))))
  24.             {
  25.                 ed.WriteMessage($"\n{graphOverride.ProfileName}");
  26.                 count++;
  27.             }
  28.         }
  29.         t.Commit();
  30.     }
  31.  
  32.     ed.WriteMessage($"\nВсего: {count}");
  33. }
  34.  
Результат:

Так что, подозреваю, что проблемы где-то в методе добавления элементов на вид профиля.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Изначально есть элементы сети (труби и колодцы) и ЧЗ КЗ поверхности.
Трасса, профили, вид профиля и части вида профиля создаются примерно так:
Извините, вам запрещён просмотр содержимого спойлеров.

Каналы и фуляры добавляются пока ручками.
Если по новой создаю вид профиля, в этом тестовом файле, то все норм.
Попробую геометрически определять части на виде профиля.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
На уровне догадки: сколько элементов попадает в коллекцию ids в методе SelectPath? И мне как-то давно Александр Наумович подсказал, что надо называть не "часть", а элемент. "Часть" - слишком дословный перевод

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Ухты, да, возвращает все элементы сети на пути - 40. + конечный колодец приходится добавлять.
Но, когда эти элементы добавляются на вид профиля, то у некоторых видимость отключается почему-то.
Попробую включать видимость у всех элементов.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Обсчитался. FindShortestNetworkPath возвращает 40 из 48 элементов сети.
Буду добавлять остальные элементы сети на вид профиля дополнительно.
Как сложилась ситуация, что элементы сети добавлены на вид профиля, но программно не читаются, так и не понял пока.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
В той сети, которая в чертеже - 50 элементов. Где-то ещё 2 потерялись.
Также, в этой сети есть вертикальные "петли". Такое я только у вас видел. То есть, 2 трубы подключены к одному и тому же колодцу с одной и с другой стороны. FindShortestNetworkPath будет находить только одну из этих труб, что вполне логично.
Как сложилась ситуация, что элементы сети добавлены на вид профиля, но программно не читаются, так и не понял пока.
Сам не понимаю. Возможно, что как-то играют роль вот такие "петли". Надо экспериментальным путём искать ответ.

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Кстати, я уже давно сам не пользуюсь таким "традиционным" способом нахождения элементов сети на виде профиля. Подсмотрел в MGDDBG способ нахождения ссылок объекта и пользуюсь им. (Вот, кстати, обсуждение, из которого появилась такая идея)
Примерно так:
Код - C# [Выбрать]
  1. pView.FindReferences
  2.     (out ObjectId[] hardOwnIds,
  3.     out ObjectId[] softOwnIds,
  4.     out ObjectId[] hardPtIds,
  5.     out ObjectId[] softPtIds);
  6.  
  7. IEnumerable<ObjectId> pViewPartsIds = softPtIds
  8.     .Where(item => item.CheckObjectIdFor<ProfileViewPart>())
  9.     .Distinct();
  10.  
Работает быстрее и использовать проще.
Если воспользоваться таким способом, то найдёт все элементы.

Оффлайн ВильдарАвтор темы

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Ок.
Как бы, что может быть в этих soft/hard references мне пока мало понятно.
Но уже, сигнал небольшой есть, что стоит их юзать.
Спасибо.