Задать стиль напорного трубопровода.

Автор Тема: Задать стиль напорного трубопровода.  (Прочитано 10870 раз)

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

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

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
C3D 2016. При попытке присвоить значение свойству StyleId объекта класса PressurePipe возникает исключение - "need to override property StyleId()".
Аналогичная проблема обсуждалась на форуме Autodesk - https://forums.autodesk.com/t5/autocad-civil-3d-customization/set-corridor-stylename-is-giving-exception/td-p/6470113  (только для объекта Corridor).
Причина понятна - метод Set реализован только для базового класса Entity.
Существуют ли какие-либо альтернативные пути решения задачи?
« Последнее редактирование: 06-10-2017, 14:44:38 от Andant »

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

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

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Код примерно такой:
Код - C# [Выбрать]
  1.     foreach (PressurePipe prPipe in PrPipes)
  2.         prPipe.StyleId = prPipeStyleId;
  3.  
Трубопроводы в коллекции PrPipes предварительно открыты на запись.

Исключение:


« Последнее редактирование: 05-10-2017, 20:10:03 от Александр Ривилис »

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

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

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Спасибо, Александр!

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Для PressureAppurtenance такая же картина...

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Подозреваю, что и для фитингов тоже самое. Я бы посоветовал Вам оставить пока что идею использования напорного трубопровода до лучших времен, по крайней мере, пока не появится достаточный для использования функционал хотя бы со стороны пользователей.

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
У нас продвинутые пользователи. Хотят сегодня и сейчас. :)

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Ну смотря с какой целью использовать. Построить красивую 3D картинку уже спроектированного трубопровода - можно. Проектировать трубопроводы с использованием этого инструментария - крайне тяжело. Особенно, когда потребуется вносить изменения на поздних стадиях.

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Пытаюсь решить задачу с другой стороны. Создать напорный трубопровод с новым типоразмером и заменить им старый.
PressurePipeNetwork имеет методы AddCurvePipe и AddLinePipe, но они требуют в качестве параметра PressurePartSize.
Вопрос к знатокам - можно ли получить список доступных PressurePartSize документа? Мне удалось добраться только до PressurePartLists...

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
А этот класс является internal:
Код - C# [Выбрать]
  1. namespace Autodesk.Civil.DatabaseServices.Styles
  2. {
  3.         internal sealed class PressurePartSize : DisposableWrapper, IEquatable<PressurePartSize>
  4.         {
  5.         // ...
  6.  
Чисто теоретически, можно изучить внутренности AeccPressurePipesMgd.dll и попробовать через рефлексию добраться до нужных объектов...
Но я уже говорил, что этот инструментарий ещё в зачаточном состоянии и использовать его настоятельно не рекомендую.
Мне удалось добраться только до PressurePartLists...
Странно, учитывая, что он тоже internal:
Код - C# [Выбрать]
  1. namespace Autodesk.Civil.DatabaseServices.Styles
  2. {
  3.         [Wrapper("AeccDbPressurePartList")]
  4.         internal sealed class PressurePartList : StyleBase
  5.         {
  6.         // ...
  7.  

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Цитировать
Странно, учитывая, что он тоже internal:
Удалось получить только имена PressurePartList.  Нашел такое решение - https://forums.autodesk.com/t5/autocad-civil-3d-customization/how-to-access-pressure-network-parts-lists-using-vb-net/td-p/6205962
Через рефлексию :)

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Однако! Andant, отличная работа! Ну раз уж сам Jeff_M предложил такой способ и даже дал пример кода, то вынужден признать, что он имеет право на жизнь :)

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Продолжил погружение в рефлексию и создал новый PressurePipe на основе выбранного типоразмера.
Но, новая засада... Информация о типоразмере трубы хранится в свойстве PartDescription (readonly) от базового класса PressurePart.
У прародителя, Entity, есть свойство Description, доступное для редактирования. И если изменить Description, то автоматом меняется и PartDescription.
Как можно сделать, чтобы и информацию о типоразмере не терять, и дополнительный комментарий добавлять?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Информация о типоразмере трубы хранится в свойстве PartDescription (readonly) от базового класса PressurePart.
У прародителя, Entity, есть свойство Description, доступное для редактирования. И если изменить Description, то автоматом меняется и PartDescription.
А если вручную на чертеже поменять описание, что будет возвращать PartDescription?
Вообще, лучше придерживаться правила: один вопрос - одна тема. А в этой теме это уже 3-й вопрос.

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Цитировать
А если вручную на чертеже поменять описание, что будет возвращать PartDescription?
В том то и дело, что Description заменяет значение PartDescription даже при ручном редактировании.

Цитировать
Вообще, лучше придерживаться правила: один вопрос - одна тема. А в этой теме это уже 3-й вопрос.
Эту задачу можно закрывать. Исследования показали, что присваивание стиля напрямую не актуально. Стилю присваивается значение стиля PressurePartSize. Проверено. Единственное - зачем генерировать исключение, если можно просто сделать ReadOnly.
Типоразмер можно задать при добавлении новой трубы к сети. При помощи рефлексии, но возможно...
Вопрос о PartDescription выношу в отдельную тему.

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

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

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

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

Отмечено как Решение Александр Ривилис 18-10-2017, 08:36:23

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Получил второй ответ (от разработчиков) - такого функционала в текущих версиях Civil 3D API нет. Создана заявка на добавление такого функционала, но без серьезного  ‘business case’ до него руки дойдут не скоро. По поводу ‘business case’: http://adn-cis.org/forum/index.php?topic=2640.0
В любом случае если это изменение и будет, то только в новых версиях.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Получил второй ответ (от разработчиков) - такого функционала в текущих версиях Civil 3D API нет. Создана заявка на добавление такого функционала, но без серьезного  ‘business case’ до него руки дойдут не скоро. По поводу ‘business case’: http://adn-cis.org/forum/index.php?topic=2640.0
В любом случае если это изменение и будет, то только в новых версиях.
Спасибо! Примерно это я и предполагал после изучения вопроса.
Попробовал DwgOut,  заменить ссылку на StyleId в ReferenceFiler и вызвать DwgIn, но попытка не удалась... Может, возможны подобные "танцы с бубном"?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Попробовал DwgOut,  заменить ссылку на StyleId в ReferenceFiler и вызвать DwgIn, но попытка не удалась... Может, возможны подобные "танцы с бубном"?
Такие "танцы с бубном" теоретически возможны через P/Invoke для функций acdbEntGet/acdbEntMod из ObjectARX.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Такие "танцы с бубном" теоретически возможны через P/Invoke для функций acdbEntGet/acdbEntMod из ObjectARX.

Результат acdbEntGet:


Аналогично:
(entget (car (entsel)))
Выберите объект: ((-1 . <Имя объекта: 7ffffb6d580>) (0 . "AECC_PRESSUREPIPE") (330 . <Имя объекта: 7ffffb361f0>) (5 . "77C8") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "_ГКС ОСВЕЩЕНИЕ СЕТЬ") (100 . "AeccDbEntity") (100 . "AeccDbGeo_aec") (100 . "AeccDbGeo") (100 . "AeccDbNetworkPartBase") (100 . "AeccDbPressurePart") (100 . "AeccDbPressurePipe"))

Да и MgdDbg показывает PressyrePipeStyle только в ссылках:


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

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

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Удалось поменять стиль трубы через стиль типоразмера.
1. Меняем у типоразмера трубы стиль на новый.
2. Создаем новую трубу с геометрией старой, но отредактированным типоразмером.
3. Удаляем старую трубу.
4. Возвращаем типоразмеру родное значение стиля.

Вот такой "финт ушами", но сработало!

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Кстати, возможно, что от некоторых проблем (например, с метками) можно избавиться, если использовать при замене трубы метод подмены Id: http://help.autodesk.com/view/OARX/2018/ENU/?guid=OREFNET-Autodesk_AutoCAD_DatabaseServices_DBObject_SwapIdWith_Autodesk_AutoCAD_DatabaseServices_ObjectId__MarshalAsUnmanagedType_U1__bool__MarshalAsUnmanagedType_U1__bool
Я использовал его при аналогичной замене в безнапорной сети.

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Кстати, возможно, что от некоторых проблем (например, с метками) можно избавиться, если использовать при замене трубы метод подмены Id:
Спасибо, Дмитрий!

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Пока не проверил, но скорее всего проблема решается заменой ссылок аналогично http://adn-cis.org/forum/index.php?topic=8112.0

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Пока не проверил, но скорее всего проблема решается заменой ссылок аналогично http://adn-cis.org/forum/index.php?topic=8112.0
Проверь пожалуйста эту возможность. Если это так, то можно будет утереть нос и ADN DevHelp, и команде разработчиков. Хотя я просил у них посмотреть нет ли workaround, но они этот вариант не нашли.

Ну и кусочек кода, который это делает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Проверь пожалуйста эту возможность.
Проверил. Работает!
Ну и кусочек кода, который это делает.
Кусочек:
Код - C# [Выбрать]
  1. IdMapping map = new IdMapping();
  2. map.Add(new IdPair(pipe.LayerId, pipe.LayerId, true, false, true));
  3. map.Add(new IdPair(pipe.LinetypeId, pipe.LinetypeId, true, false, true));
  4. map.Add(new IdPair(pipe.MaterialId, pipe.MaterialId, true, false, true));
  5. map.Add(new IdPair(partListId, partListId, true, false, true));
  6. map.Add(new IdPair(partDefId, partDefId, true, false, true));
  7. map.Add(new IdPair(pipe.NetworkId, pipe.NetworkId, true, false, true));
  8. map.Add(new IdPair(pipe.StyleId, newStyleId, true, false, true));
  9.  
  10. pipe.SwapReferences(map);
  11.  
« Последнее редактирование: 30-10-2017, 12:34:20 от Andant »

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Не удалось применить SwapReferences для замены типоразмера.
Надо задавать новый PartDef Id, а словарь AECC_NETWORK_PART_DEFS содержит PartDef только для уже вставленных объектов.
« Последнее редактирование: 01-11-2017, 11:58:38 от Andant »

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Off-Topic: показать
Неужели "pipe" настолько длинное слово, что его нужно сокращать до "pip"?  :)

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Неужели "pipe" настолько длинное слово, что его нужно сокращать до "pip"? 
Отредактировал. Так лучше? :)

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

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

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

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

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

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

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

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

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Но если он уже использовался (PartDef), то ты можешь на него переключится?
Если использовался, то можно. Если новый - остается способ с заменой объекта.