При добавлении в сеть напорные трубы не получают информацию об этой сети.

Автор Тема: При добавлении в сеть напорные трубы не получают информацию об этой сети.  (Прочитано 18191 раз)

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн AndantАвтор темы

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Решаю задачу объединения напорных трубопроводных сетей. Для этого клонирую (DeepCloneObjects) объекты исходных сетей и добавляю клоны в результирующую сеть - AddPipe(oId) (аналогично фитинги и УРП). После этого исходные сети удаляю.
Столкнулся с тем, что объединенная сеть содержит новые объекты, но сами объекты сохраняют информацию о родительской сети.
После сохранения и перезагрузки базы информация о сети обнуляется. Напрямую задать свойства NetworkId и NetworkName нельзя - ReadOnly.
MgdDbg показывает, что связь с PressurePipeNetwork осуществляется через References.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Интересно это обычные объекты сетей или те, для которых ты искусственно менял тип (типоразмер и т.д.)?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AndantАвтор темы

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Самые что ни на есть обычные... :)

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробуй вместо DeepCloneObjects использовать Clone, а затем добавлять их в базу. Ну и дальше по твоему сценарию. Если так не сработает, то увы...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AndantАвтор темы

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Если использовать просто Clone, то не сохраняются стили и типоразмеры.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Если использовать просто Clone, то не сохраняются стили и типоразмеры.
Ну ты же научился их менять. :)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AndantАвтор темы

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Ну ты же научился их менять.

Пока только для труб. До задвижек и фитингов еще не добрался...

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Столкнулся с тем, что объединенная сеть содержит новые объекты, но сами объекты сохраняют информацию о родительской сети.
Какую информацию? Скриншоты-видео не помешали бы. Или примеры кода. С нуля воспроизводить ситуацию слишком затратно по времени.
После сохранения и перезагрузки базы информация о сети обнуляется.
Как это выглядит? Элементы становятся без сети, что ли?
Навскидку. Тут можно попробовать не клонировать элемент а сразу переместить в нужную сеть. Не уверен, что Clone корректно работает с сивильными объектами.
Возможно ещё, что тут баг в API.

Оффлайн AndantАвтор темы

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Какую информацию?
NetworkId и NetworkName.
Как это выглядит? Элементы становятся без сети, что ли?

Исходная труба и ее клон сразу после клонирования:


Клон после добавления в новую сеть. Имя обнулилось, а Id остается прежним:


При попытке открыть сеть трубопровода:


Клонированная труба после сохранения и перезагрузки:


Оффлайн AndantАвтор темы

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Тут можно попробовать не клонировать элемент а сразу переместить в нужную сеть.
С этого начинал. Не удалось "обрезать пуповину", соединяющую со старой сетью. Объекты добавляются в новую сеть, но при удалении старой удаляются вместе с ней.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
С этого начинал. Не удалось "обрезать пуповину", соединяющую со старой сетью. Объекты добавляются в новую сеть, но при удалении старой удаляются вместе с ней.
А вот это уже похоже на баг.
К сожалению, нет никакого текстового описания API по напорке. Но чисто интуитивно, метод PressurePipeNetwork.AddPipe(ObjectId) должен перемещать трубу из какой-то другой сети в ту, для которой запускается метод. Как вариант, конечно, возможно, что у напорки есть такая возможность: труба может принадлежать нескольким сетям. Тогда более-менее понятно, почему такое поведение у трубы и старой сети. Тут, пожалуй, только в техподдержке ADN могут подсказать что-то. Но для них крайне желательно предоставить какой-то минимальный код, подробный порядок действий и чертёж для воспроизведения проблемы.

Оффлайн AndantАвтор темы

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Скриншоты-видео не помешали бы. Или примеры кода. С нуля воспроизводить ситуацию слишком затратно по времени.
Фрагмент кода:
Код - C# [Выбрать]
  1. PressurePipeNetwork ppNet = tr.GetObject(nId, OpenMode.ForWrite) as PressurePipeNetwork;        //Исходная сеть
  2. PressurePipeNetwork ppBaseNet = tr.GetObject(bId, OpenMode.ForWrite) as PressurePipeNetwork;    //Результирующая сеть
  3.                            
  4. ObjectIdCollection pipes = ppNet.GetPipeIds();
  5. IdMapping map = new IdMapping();
  6. db.DeepCloneObjects(pipes, ms.ObjectId, map, false);
  7. foreach (ObjectId oId in pipes)
  8. {
  9.     if (map[oId].IsCloned)
  10.     {
  11.         PressurePipe newPip = tr.GetObject(map[oId].Value, OpenMode.ForWrite) as PressurePipe;
  12.         ppBaseNet.AddPipe(newPip.ObjectId);
  13.     }
  14. }
  15.  
  16. ppNet.Erase();
  17.  

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Andant
Такими огрызками кода ты с ADN DevHelp не отделаешься. Я всегда, когда передаю им запрос делаю полноценный тестовый проект и записываю видео при помощи Autodesk Screencast (как у меня в подписи).
Кстати, есть  еще одна непроверенная идея. У  Autodesk.Civil.DatabaseServices.PressurePipeNetwork есть метод GetPipeIds возвращающий ObjectIdCollection. Так вот что будет если удалить из этой коллекции ObjectId нашей Pipe?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AndantАвтор темы

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Но для них крайне желательно предоставить какой-то минимальный код
Для этого случая можно упростить предыдущий фрагмент:
Код - C# [Выбрать]
  1. PressurePipeNetwork ppNet = tr.GetObject(nId, OpenMode.ForWrite) as PressurePipeNetwork;        //Исходная сеть
  2. PressurePipeNetwork ppBaseNet = tr.GetObject(bId, OpenMode.ForWrite) as PressurePipeNetwork;    //Результирующая сеть
  3.                            
  4. ObjectIdCollection pipes = ppNet.GetPipeIds();
  5. foreach (ObjectId oId in pipes)
  6.     ppBaseNet.AddPipe(oId);
  7.  
  8. ppNet.Erase();
  9.  

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Кстати, есть  еще одна непроверенная идея. У  Autodesk.Civil.DatabaseServices.PressurePipeNetwork есть метод GetPipeIds возвращающий ObjectIdCollection. Так вот что будет если удалить из этой коллекции ObjectId нашей Pipe?
Я думаю, что ничего не будет. Как я понимаю, эта коллекция создаётся в момент запроса и уже потом никак не связана с сетью.