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

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

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

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

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

  • ADN Club
  • **
  • Сообщений: 54
  • Карма: 13
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
  • *****
  • Сообщений: 6816
  • Карма: 752
  • Рыцарь ObjectARX
  • Skype: rivilis
Приветствую на форуме!
А задам как я этот вопрос в ADN DevHelp. Только выложи пожалуйста кусочек кода в, котором ты присваиваешь StyleId и картинку с исключением.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

Исключение:


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

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

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

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

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

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

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

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

  • ADN
  • *
  • Сообщений: 1235
  • Карма: 235
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Подозреваю, что и для фитингов тоже самое. Я бы посоветовал Вам оставить пока что идею использования напорного трубопровода до лучших времен, по крайней мере, пока не появится достаточный для использования функционал хотя бы со стороны пользователей.

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

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

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

  • ADN
  • *
  • Сообщений: 1235
  • Карма: 235
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Ну смотря с какой целью использовать. Построить красивую 3D картинку уже спроектированного трубопровода - можно. Проектировать трубопроводы с использованием этого инструментария - крайне тяжело. Особенно, когда потребуется вносить изменения на поздних стадиях.

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

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

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

  • ADN
  • *
  • Сообщений: 1235
  • Карма: 235
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
А этот класс является 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
  • **
  • Сообщений: 54
  • Карма: 13
Цитировать
Странно, учитывая, что он тоже 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
  • *
  • Сообщений: 1235
  • Карма: 235
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Однако! Andant, отличная работа! Ну раз уж сам Jeff_M предложил такой способ и даже дал пример кода, то вынужден признать, что он имеет право на жизнь :)

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

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

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

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

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

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

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

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

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

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

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

Отмечено как Решение rivilis 18-10-2017, 08:36:23

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

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

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

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

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

  • ADN Club
  • **
  • Сообщений: 54
  • Карма: 13
Такие "танцы с бубном" теоретически возможны через 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
  • *****
  • Сообщений: 6816
  • Карма: 752
  • Рыцарь ObjectARX
  • Skype: rivilis
Значит и этот вариант не подходит. Увы.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

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

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

  • ADN
  • *
  • Сообщений: 1235
  • Карма: 235
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Ну это как бы не совсем замена стиля. В общем случае, с заменой трубы возникает ряд других проблем:
- Точное определение геометрии исходной трубы: в напорной сети труба может быть очень сложной формы в вертикальной плоскости.
- Отображение на виде профиля: после замены трубы нужно восстановить отображение трубы на всех видах профилей с учётом возможного переопределения стиля трубы на отдельном виде профиля. Кстати, то же самое, возможно, касается и видов сечений.
- Восстановление меток трубы как на плане, так и на видах профиля (видах сечения).
- Восстановление ссылочной поверхности.
- Восстановление ссылочной трассы.
- Восстановление присоединений к другим элементам.
В частном случае, возможно, этих проблем не будет.

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

  • ADN
  • *
  • Сообщений: 1235
  • Карма: 235
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Кстати, возможно, что от некоторых проблем (например, с метками) можно избавиться, если использовать при замене трубы метод подмены 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
  • **
  • Сообщений: 54
  • Карма: 13
Кстати, возможно, что от некоторых проблем (например, с метками) можно избавиться, если использовать при замене трубы метод подмены Id:
Спасибо, Дмитрий!

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

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

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

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

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

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

  • ADN Club
  • **
  • Сообщений: 54
  • Карма: 13
Проверь пожалуйста эту возможность.
Проверил. Работает!
Ну и кусочек кода, который это делает.
Кусочек:
Код - 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
  • **
  • Сообщений: 54
  • Карма: 13
Не удалось применить SwapReferences для замены типоразмера.
Надо задавать новый PartDef Id, а словарь AECC_NETWORK_PART_DEFS содержит PartDef только для уже вставленных объектов.
« Последнее редактирование: 01-11-2017, 11:58:38 от Andant »

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

  • ADN
  • *
  • Сообщений: 1235
  • Карма: 235
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Off-Topic: показать
Неужели "pipe" настолько длинное слово, что его нужно сокращать до "pip"?  :)

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

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

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

  • ADN
  • *
  • Сообщений: 1235
  • Карма: 235
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
По крайней мере, мне - привычнее и понятнее. Код лучше читается.

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

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

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

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

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

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

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

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