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

ADN Club => Civil 3D API => Тема начата: Andant от 24-10-2017, 11:28:57

Название: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 24-10-2017, 11:28:57
Решаю задачу объединения напорных трубопроводных сетей. Для этого клонирую (DeepCloneObjects) объекты исходных сетей и добавляю клоны в результирующую сеть - AddPipe(oId) (аналогично фитинги и УРП). После этого исходные сети удаляю.
Столкнулся с тем, что объединенная сеть содержит новые объекты, но сами объекты сохраняют информацию о родительской сети.
После сохранения и перезагрузки базы информация о сети обнуляется. Напрямую задать свойства NetworkId и NetworkName нельзя - ReadOnly.
MgdDbg показывает, что связь с PressurePipeNetwork осуществляется через References.
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Александр Ривилис от 24-10-2017, 12:07:41
Интересно это обычные объекты сетей или те, для которых ты искусственно менял тип (типоразмер и т.д.)?
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 24-10-2017, 12:33:57
Самые что ни на есть обычные... :)
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Александр Ривилис от 24-10-2017, 12:37:36
Попробуй вместо DeepCloneObjects использовать Clone, а затем добавлять их в базу. Ну и дальше по твоему сценарию. Если так не сработает, то увы...
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 24-10-2017, 12:44:08
Если использовать просто Clone, то не сохраняются стили и типоразмеры.
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Александр Ривилис от 24-10-2017, 12:45:52
Если использовать просто Clone, то не сохраняются стили и типоразмеры.
Ну ты же научился их менять. :)
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 24-10-2017, 12:56:02
Ну ты же научился их менять.

Пока только для труб. До задвижек и фитингов еще не добрался...
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Дмитрий Загорулькин от 24-10-2017, 13:36:10
Столкнулся с тем, что объединенная сеть содержит новые объекты, но сами объекты сохраняют информацию о родительской сети.
Какую информацию? Скриншоты-видео не помешали бы. Или примеры кода. С нуля воспроизводить ситуацию слишком затратно по времени.
После сохранения и перезагрузки базы информация о сети обнуляется.
Как это выглядит? Элементы становятся без сети, что ли?
Навскидку. Тут можно попробовать не клонировать элемент а сразу переместить в нужную сеть. Не уверен, что Clone корректно работает с сивильными объектами.
Возможно ещё, что тут баг в API.
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 24-10-2017, 14:53:29
Какую информацию?
NetworkId и NetworkName.
Как это выглядит? Элементы становятся без сети, что ли?

Исходная труба и ее клон сразу после клонирования:
(https://s1.postimg.org/6sedyjjapn/net1.jpg) (https://postimg.org/image/6sedyjjapn/)

Клон после добавления в новую сеть. Имя обнулилось, а Id остается прежним:
(https://s1.postimg.org/3npoprpit7/net2.jpg) (https://postimg.org/image/3npoprpit7/)

При попытке открыть сеть трубопровода:
(https://s1.postimg.org/2asoe28eln/net3.jpg) (https://postimages.org/)

Клонированная труба после сохранения и перезагрузки:
(https://s1.postimg.org/14m4jmu2vv/net4.jpg) (https://postimg.org/image/14m4jmu2vv/)
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 24-10-2017, 14:58:09
Тут можно попробовать не клонировать элемент а сразу переместить в нужную сеть.
С этого начинал. Не удалось "обрезать пуповину", соединяющую со старой сетью. Объекты добавляются в новую сеть, но при удалении старой удаляются вместе с ней.
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Дмитрий Загорулькин от 24-10-2017, 15:05:24
С этого начинал. Не удалось "обрезать пуповину", соединяющую со старой сетью. Объекты добавляются в новую сеть, но при удалении старой удаляются вместе с ней.
А вот это уже похоже на баг.
К сожалению, нет никакого текстового описания API по напорке. Но чисто интуитивно, метод PressurePipeNetwork.AddPipe(ObjectId) должен перемещать трубу из какой-то другой сети в ту, для которой запускается метод. Как вариант, конечно, возможно, что у напорки есть такая возможность: труба может принадлежать нескольким сетям. Тогда более-менее понятно, почему такое поведение у трубы и старой сети. Тут, пожалуй, только в техподдержке ADN могут подсказать что-то. Но для них крайне желательно предоставить какой-то минимальный код, подробный порядок действий и чертёж для воспроизведения проблемы.
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 24-10-2017, 15:13:56
Скриншоты-видео не помешали бы. Или примеры кода. С нуля воспроизводить ситуацию слишком затратно по времени.
Фрагмент кода:
Код - 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.  
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Александр Ривилис от 24-10-2017, 15:22:38
Andant
Такими огрызками кода ты с ADN DevHelp не отделаешься. Я всегда, когда передаю им запрос делаю полноценный тестовый проект и записываю видео при помощи Autodesk Screencast (как у меня в подписи).
Кстати, есть  еще одна непроверенная идея. У  Autodesk.Civil.DatabaseServices.PressurePipeNetwork есть метод GetPipeIds возвращающий ObjectIdCollection. Так вот что будет если удалить из этой коллекции ObjectId нашей Pipe?
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 24-10-2017, 15:23:52
Но для них крайне желательно предоставить какой-то минимальный код
Для этого случая можно упростить предыдущий фрагмент:
Код - 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.  
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Дмитрий Загорулькин от 24-10-2017, 15:30:36
Кстати, есть  еще одна непроверенная идея. У  Autodesk.Civil.DatabaseServices.PressurePipeNetwork есть метод GetPipeIds возвращающий ObjectIdCollection. Так вот что будет если удалить из этой коллекции ObjectId нашей Pipe?
Я думаю, что ничего не будет. Как я понимаю, эта коллекция создаётся в момент запроса и уже потом никак не связана с сетью.
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 24-10-2017, 15:51:37
Так вот что будет если удалить из этой коллекции ObjectId нашей Pipe?
Произвел очистку исходного списка - pipes.Clear() .
При закомментированной процедуре удаления исходной сети. Две трубы входят одновременно в обе сети:

(https://s1.postimg.org/4neu91c1tn/net5.jpg) (https://postimg.org/image/4neu91c1tn/)

(https://s1.postimg.org/1aw4enw4mj/net6.jpg) (https://postimg.org/image/1aw4enw4mj/)

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

(https://s1.postimg.org/4duame6wzf/net7.jpg) (https://postimg.org/image/4duame6wzf/)
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Александр Ривилис от 24-10-2017, 16:01:01
Я смотрю, что для Autodesk.Civil.DatabaseServices.Network есть специальный метод для переноса в другую сеть:
Код - C# [Выбрать]
  1. public unsafe void MoveParts(ObjectIdCollection partIds, ObjectId dstNetworkId);
А для PressurePipeNetwork ничего подобного нет...
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 24-10-2017, 16:06:18
А для PressurePipeNetwork ничего подобного нет...
Для безнапорных сетей ни одна из моих, вынесенных на обсуждение, проблем не является проблемой... :)
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Дмитрий Загорулькин от 24-10-2017, 16:17:14
А для PressurePipeNetwork ничего подобного нет...
Как я понимаю, ввиду отсутствия официальной документации по API напорной сети, и самого API для неё ещё нет. Работать с ней сейчас - это большой энтузиазм и постоянное "спотыкивание" на элементарных операциях. Я в каждой новой версии смотрю - не добавили ли чего-нибудь? Со стороны пользователей есть какие-то косметические изменения и исправления багов. По крайней мере, в 2018 версии напорка ведёт себя более-менее адекватно и предсказуемо. Но с момента релиза в 2013 версии, в её API нет никакого развития.
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Александр Ривилис от 24-10-2017, 16:19:50
Andant
Итог. Если хочешь, чтобы я отправил запрос в ADN DevHelp, то оформи запрос нормально:
1. Полный тестовый проект в архиве с одной командой, которая переносит (точнее пытается перенести) Pipe  из одной PressurePipeNetwork в другую.
2. dwg-файл с двумя PressurePipeNetwork (из которой переносят и в которую переносят) с указанием версии Civil 3D (само собой что ответы можно ожидать только на последние три версии)
3. Видео (Autodesk Screencast), на котором четко видно что при удалении исходной PressurePipeNetwork портятся Pipe'ы из второй PressurePipeNetwork
Как-то так.
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 24-10-2017, 16:31:37
Работать с ней сейчас - это большой энтузиазм и постоянное "спотыкивание" на элементарных операциях.
Это моя работа. Проектировщики вовсю используют напорные сети и хотят хоть какую-то программную поддержку здесь и сейчас.
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 24-10-2017, 16:36:48
Если хочешь, чтобы я отправил запрос в ADN DevHelp, то оформи запрос нормально:
Мне надо как-то решать поставленные задачи в реальном времени. Буду добавлять не клоны, а вновь созданные объекты на базе старых.
А по поводу запроса  - на пенсию уйду раньше, чем будет результат. :)
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Александр Ривилис от 24-10-2017, 16:40:37
А по поводу запроса  - на пенсию уйду раньше, чем будет результат. :)
Возможно. А возможно мы что-то не видим и задача решается элементарно. Но если тебя такой вариант не интересует, то я настаивать не буду.
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 26-10-2017, 14:51:45
Ну ты же научился их менять.
Возвращаясь к варианту с созданием новых объектов. Трубы можно создавать при добавлении в сеть. Фитинги и устройства регулирования потока добавляются уже готовыми. Я боюсь спросить, а можно ли их создавать программным путем?
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Александр Ривилис от 26-10-2017, 14:56:11
Я боюсь спросить, а можно ли их создавать программным путем?
Что под этим имеется в виду?
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 26-10-2017, 15:07:45
Что под этим имеется в виду?
Вставки объектов выбранного типа из каталога.   
Я правильно понимаю, что это аналогично вставке BlockReference?
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Александр Ривилис от 26-10-2017, 15:24:31
Вставки объектов выбранного типа из каталога.   
Увы, но и этого похоже нет. Во всяком случае мне не удалось найти.
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Александр Ривилис от 26-10-2017, 15:48:32
Я правильно понимаю, что это аналогично вставке BlockReference?
Я не вижу здесь никакой аналогии.
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 27-10-2017, 12:06:31
Можно ли заставить ReferenceFiler работать в обе стороны. Не только DwgOut, но и DwgIn.
Пробовал вызывать оба метода без редактирования филера - Civil падает...
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Александр Ривилис от 27-10-2017, 12:17:07
Можно ли заставить ReferenceFiler работать в обе стороны. Не только DwgOut, но и DwgIn.
Нет. Теоретически можно попробовать написать свои филёры, которые обрабатывают не только references, но и все остальные типы возможных данных. Но мне кажется, что это тупиковый путь.
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 27-10-2017, 12:29:26
Но мне кажется, что это тупиковый путь.
Жаль. Идея была заменить ссылку на исходную водопроводную сеть ссылкой на новую для перемещаемых элементов.
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Александр Ривилис от 27-10-2017, 12:58:19
Жаль. Идея была заменить ссылку на исходную водопроводную сеть ссылкой на новую для перемещаемых элементов.
Я эту идею понял сразу. И она у меня витала в голове еще тогда, когда ты первый раз написал про ReferenceFiler.
Ну попробуй на всякий случай, так как никакого другого способа я не вижу. Но нужно будет переопределить абсолютно все методы и четко отследить порядок вывода и ввода данных. Чем черт не шутит...
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 27-10-2017, 13:47:46
Удалось сделать проще - нашел метод SwapReferences, подготовил для него карту и успешно заменил ссылку на сеть.
Таким образом можно менять и стиль и типоразмер без создания новых объектов!!!
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Дмитрий Загорулькин от 27-10-2017, 14:03:02
Если это действительно работает, то это просто гениальное решение!  :)
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 27-10-2017, 14:47:14
Если это действительно работает
Работает! Только карту надо заполнять на все ссылки, иначе значения обнуляются.
Код - 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);
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Дмитрий Загорулькин от 27-10-2017, 15:28:46
Это действительно красивое решение проблемы, мои поздравления!
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 27-10-2017, 15:36:41
мои поздравления!
Спасибо!  :) Вы с Александром подсказали нужное направление.
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Александр Ривилис от 27-10-2017, 16:30:32
мои поздравления!
Спасибо!  :) Вы с Александром подсказали нужное направление.
Прими и мои поздравления! Про этот метод я совершенно забыл. Про SwapIdWith и HandOverTo помнил, а про SwapReferences забыл. Склероз...
Название: Re: При добавлении в сеть напорные трубы не получают информацию об этой сети.
Отправлено: Andant от 27-10-2017, 16:33:36
Прими и мои поздравления!
Спасибо! :)