Сообщество программистов Autodesk в СНГ

ADN Club => Civil 3D API => Тема начата: Вильдар от 20-08-2018, 16:47:02

Название: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Вильдар от 20-08-2018, 16:47:02
Всем привет,
С вида профиля не могу получить все части.
Через интерфейс цивила (руками) выводит 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
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Дмитрий Загорулькин от 20-08-2018, 16:56:54
Поворчу немного...
С третьей попытки выяснил, что версия файла Civil 3D 2019
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Вильдар от 20-08-2018, 16:58:34
Интересно. А как выяснил)
У меня 2017 цивил.
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Дмитрий Загорулькин от 20-08-2018, 17:01:03
А, да... Перепутал немного окошки с предупреждениями. Но всё равно, лучше сразу предупреждать о версии, я сперва пробовал в 2014 открыть.
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Вильдар от 20-08-2018, 17:43:44
Рассматриваю вариант геометрического попадания границ частей в границу вида профиля.
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Дмитрий Загорулькин от 20-08-2018, 17:50:42
Идей пока что нет никаких. Геометрически они все на виде профиля. Все отображаются при соответствующих настройках стиля.
Посмотрел через ARXMGD и DBGMGD. Что характерно - там та же самая картина. Вид профиля в ссылках имеет 2 группы элементов трубопроводных сетей. В одной группе - 43 элемента, в другой - 50. Хотя, должно быть по 50 в обеих группах.
Я бы начал с того, что нашёл бы те элементы, которые не содержатся в списке, полученном программно. Проанализировал бы их, попробовал бы создать заново. Ну и т.д. и т.п...
P.S. вообще, чертёж довольно необычный. Я думаю, что его настраивали программно. И трубы вы довольно хитрые рисуете. И соединения между трубами у вас необычные...
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Дмитрий Загорулькин от 20-08-2018, 18:04:11
Удалил трубы-колодцы с вида профиля, добавил на вид профиля заново - проблема пропала. Как изначально они были нанесены?
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Вильдар от 20-08-2018, 18:22:08
Удалил трубы-колодцы с вида профиля, добавил на вид профиля заново - проблема пропала. Как изначально они были нанесены?
По основной цепи - программно создан вид профиля и добавлены части:
Код - C# [Выбрать]
  1. part.AddToProfileView(pViewId);
Остальные трубы руками добавлены.

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

Посмотрел через ARXMGD и DBGMGD. Что характерно - там та же самая картина. Вид профиля в ссылках имеет 2 группы элементов трубопроводных сетей. В одной группе - 43 элемента, в другой - 50. Хотя, должно быть по 50 в обеих группах.
Подскажи плиз, куда смотреть? Вид профиля выбирать. А дальше?
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Вильдар от 20-08-2018, 18:36:59
А, похоже на Hard/soft references
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Дмитрий Загорулькин от 20-08-2018, 18:41:34
Да, верно. В Soft как раз есть ссылки на элементы на виде профиля.
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Дмитрий Загорулькин от 20-08-2018, 19:09:57
Тестировал немного изменённым кодом:
Код - 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.  
Результат:

Так что, подозреваю, что проблемы где-то в методе добавления элементов на вид профиля.
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Вильдар от 21-08-2018, 09:33:23
Изначально есть элементы сети (труби и колодцы) и ЧЗ КЗ поверхности.
Трасса, профили, вид профиля и части вида профиля создаются примерно так:
Извините, вам запрещён просмотр содержимого спойлеров.

Каналы и фуляры добавляются пока ручками.
Если по новой создаю вид профиля, в этом тестовом файле, то все норм.
Попробую геометрически определять части на виде профиля.
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Дмитрий Загорулькин от 21-08-2018, 09:43:12
На уровне догадки: сколько элементов попадает в коллекцию ids в методе SelectPath? И мне как-то давно Александр Наумович подсказал, что надо называть не "часть", а элемент. "Часть" - слишком дословный перевод
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Вильдар от 21-08-2018, 09:58:12
Ухты, да, возвращает все элементы сети на пути - 40. + конечный колодец приходится добавлять.
Но, когда эти элементы добавляются на вид профиля, то у некоторых видимость отключается почему-то.
Попробую включать видимость у всех элементов.
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Вильдар от 21-08-2018, 10:41:50
Обсчитался. FindShortestNetworkPath возвращает 40 из 48 элементов сети.
Буду добавлять остальные элементы сети на вид профиля дополнительно.
Как сложилась ситуация, что элементы сети добавлены на вид профиля, но программно не читаются, так и не понял пока.
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Дмитрий Загорулькин от 21-08-2018, 12:42:13
В той сети, которая в чертеже - 50 элементов. Где-то ещё 2 потерялись.
Также, в этой сети есть вертикальные "петли". Такое я только у вас видел. То есть, 2 трубы подключены к одному и тому же колодцу с одной и с другой стороны. FindShortestNetworkPath будет находить только одну из этих труб, что вполне логично.
Как сложилась ситуация, что элементы сети добавлены на вид профиля, но программно не читаются, так и не понял пока.
Сам не понимаю. Возможно, что как-то играют роль вот такие "петли". Надо экспериментальным путём искать ответ.
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Дмитрий Загорулькин от 21-08-2018, 15:50:10
Кстати, я уже давно сам не пользуюсь таким "традиционным" способом нахождения элементов сети на виде профиля. Подсмотрел в MGDDBG способ нахождения ссылок объекта и пользуюсь им. (Вот, кстати, обсуждение (http://adn-cis.org/forum/index.php?topic=7342.msg22528#msg22528), из которого появилась такая идея)
Примерно так:
Код - 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.  
Работает быстрее и использовать проще.
Если воспользоваться таким способом, то найдёт все элементы.
Название: Re: ProfileView.GraphOverrides - не полный список частей!
Отправлено: Вильдар от 21-08-2018, 16:04:44
Ок.
Как бы, что может быть в этих soft/hard references мне пока мало понятно.
Но уже, сигнал небольшой есть, что стоит их юзать.
Спасибо.