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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


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


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


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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
С этого начинал. Не удалось "обрезать пуповину", соединяющую со старой сетью. Объекты добавляются в новую сеть, но при удалении старой удаляются вместе с ней.
А вот это уже похоже на баг.
К сожалению, нет никакого текстового описания 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
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь 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
  • Карма: 735
Кстати, есть  еще одна непроверенная идея. У  Autodesk.Civil.DatabaseServices.PressurePipeNetwork есть метод GetPipeIds возвращающий ObjectIdCollection. Так вот что будет если удалить из этой коллекции ObjectId нашей Pipe?
Я думаю, что ничего не будет. Как я понимаю, эта коллекция создаётся в момент запроса и уже потом никак не связана с сетью.

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Так вот что будет если удалить из этой коллекции ObjectId нашей Pipe?
Произвел очистку исходного списка - pipes.Clear() .
При закомментированной процедуре удаления исходной сети. Две трубы входят одновременно в обе сети:





При удалении исходной сети. В результирующей две удаленные трубы:



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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я смотрю, что для Autodesk.Civil.DatabaseServices.Network есть специальный метод для переноса в другую сеть:
Код - C# [Выбрать]
  1. public unsafe void MoveParts(ObjectIdCollection partIds, ObjectId dstNetworkId);
А для PressurePipeNetwork ничего подобного нет...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
А для PressurePipeNetwork ничего подобного нет...
Для безнапорных сетей ни одна из моих, вынесенных на обсуждение, проблем не является проблемой... :)

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
А для PressurePipeNetwork ничего подобного нет...
Как я понимаю, ввиду отсутствия официальной документации по API напорной сети, и самого API для неё ещё нет. Работать с ней сейчас - это большой энтузиазм и постоянное "спотыкивание" на элементарных операциях. Я в каждой новой версии смотрю - не добавили ли чего-нибудь? Со стороны пользователей есть какие-то косметические изменения и исправления багов. По крайней мере, в 2018 версии напорка ведёт себя более-менее адекватно и предсказуемо. Но с момента релиза в 2013 версии, в её API нет никакого развития.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Andant
Итог. Если хочешь, чтобы я отправил запрос в ADN DevHelp, то оформи запрос нормально:
1. Полный тестовый проект в архиве с одной командой, которая переносит (точнее пытается перенести) Pipe  из одной PressurePipeNetwork в другую.
2. dwg-файл с двумя PressurePipeNetwork (из которой переносят и в которую переносят) с указанием версии Civil 3D (само собой что ответы можно ожидать только на последние три версии)
3. Видео (Autodesk Screencast), на котором четко видно что при удалении исходной PressurePipeNetwork портятся Pipe'ы из второй PressurePipeNetwork
Как-то так.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Работать с ней сейчас - это большой энтузиазм и постоянное "спотыкивание" на элементарных операциях.
Это моя работа. Проектировщики вовсю используют напорные сети и хотят хоть какую-то программную поддержку здесь и сейчас.

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Если хочешь, чтобы я отправил запрос в ADN DevHelp, то оформи запрос нормально:
Мне надо как-то решать поставленные задачи в реальном времени. Буду добавлять не клоны, а вновь созданные объекты на базе старых.
А по поводу запроса  - на пенсию уйду раньше, чем будет результат. :)

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

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

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я боюсь спросить, а можно ли их создавать программным путем?
Что под этим имеется в виду?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Что под этим имеется в виду?
Вставки объектов выбранного типа из каталога.   
Я правильно понимаю, что это аналогично вставке BlockReference?

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я правильно понимаю, что это аналогично вставке BlockReference?
Я не вижу здесь никакой аналогии.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Можно ли заставить ReferenceFiler работать в обе стороны. Не только DwgOut, но и DwgIn.
Пробовал вызывать оба метода без редактирования филера - Civil падает...

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Можно ли заставить ReferenceFiler работать в обе стороны. Не только DwgOut, но и DwgIn.
Нет. Теоретически можно попробовать написать свои филёры, которые обрабатывают не только references, но и все остальные типы возможных данных. Но мне кажется, что это тупиковый путь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Жаль. Идея была заменить ссылку на исходную водопроводную сеть ссылкой на новую для перемещаемых элементов.
Я эту идею понял сразу. И она у меня витала в голове еще тогда, когда ты первый раз написал про ReferenceFiler.
Ну попробуй на всякий случай, так как никакого другого способа я не вижу. Но нужно будет переопределить абсолютно все методы и четко отследить порядок вывода и ввода данных. Чем черт не шутит...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Andant 27-10-2017, 15:22:06

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Удалось сделать проще - нашел метод SwapReferences, подготовил для него карту и успешно заменил ссылку на сеть.
Таким образом можно менять и стиль и типоразмер без создания новых объектов!!!

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Если это действительно работает, то это просто гениальное решение!  :)

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Если это действительно работает
Работает! Только карту надо заполнять на все ссылки, иначе значения обнуляются.
Код - C# [Выбрать]
  1. IdMapping mp = new IdMapping();
  2. mp.Add(new IdPair(pip.LayerId, pip.LayerId, true, false, true));
  3. mp.Add(new IdPair(pip.LinetypeId, pip.LinetypeId, true, false, true));
  4. mp.Add(new IdPair(pip.MaterialId, pip.MaterialId, true, false, true));
  5. mp.Add(new IdPair(partListId, partListId, true, false, true));             // Получаем с помощью ReferenceFiler
  6. mp.Add(new IdPair(partDefId, partDefId, true, false, true));               // Получаем с помощью ReferenceFiler
  7. mp.Add(new IdPair(oldNetId, newNetId, true, false, true));                 // Реально меняются значения только здесь
  8. mp.Add(new IdPair(pip.StyleId, pip.StyleId, true, false, true));
  9.  
  10. pip.SwapReferences(mp);

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Это действительно красивое решение проблемы, мои поздравления!

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
мои поздравления!
Спасибо!  :) Вы с Александром подсказали нужное направление.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
мои поздравления!
Спасибо!  :) Вы с Александром подсказали нужное направление.
Прими и мои поздравления! Про этот метод я совершенно забыл. Про SwapIdWith и HandOverTo помнил, а про SwapReferences забыл. Склероз...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26