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

ADN Club => Civil 3D API => Тема начата: Andant от 05-10-2017, 17:03:41

Название: Задать стиль напорного трубопровода.
Отправлено: Andant от 05-10-2017, 17:03:41
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.
Существуют ли какие-либо альтернативные пути решения задачи?
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Александр Ривилис от 05-10-2017, 17:27:29
Приветствую на форуме!
А задам как я этот вопрос в ADN DevHelp. Только выложи пожалуйста кусочек кода в, котором ты присваиваешь StyleId и картинку с исключением.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 05-10-2017, 18:09:37
Код примерно такой:
Код - C# [Выбрать]
  1.     foreach (PressurePipe prPipe in PrPipes)
  2.         prPipe.StyleId = prPipeStyleId;
  3.  
Трубопроводы в коллекции PrPipes предварительно открыты на запись.

Исключение:

(https://s1.postimg.org/9310tqlel7/image.jpg) (https://postimg.org/image/9310tqlel7/)
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Александр Ривилис от 05-10-2017, 22:18:22
Я отправил вопрос в ADN DevHelp. Подождём ответа. Как только будет информация или понадобится уточнение - я сообщу.
Пока же обрати внимание на правило форматирования кода у нас на форуме (смотри у меня в подписи).
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 06-10-2017, 09:08:42
Спасибо, Александр!
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 06-10-2017, 12:50:42
Для PressureAppurtenance такая же картина...
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Дмитрий Загорулькин от 06-10-2017, 13:58:39
Подозреваю, что и для фитингов тоже самое. Я бы посоветовал Вам оставить пока что идею использования напорного трубопровода до лучших времен, по крайней мере, пока не появится достаточный для использования функционал хотя бы со стороны пользователей.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 06-10-2017, 14:51:06
У нас продвинутые пользователи. Хотят сегодня и сейчас. :)
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Дмитрий Загорулькин от 06-10-2017, 15:16:55
Ну смотря с какой целью использовать. Построить красивую 3D картинку уже спроектированного трубопровода - можно. Проектировать трубопроводы с использованием этого инструментария - крайне тяжело. Особенно, когда потребуется вносить изменения на поздних стадиях.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 10-10-2017, 17:56:07
Пытаюсь решить задачу с другой стороны. Создать напорный трубопровод с новым типоразмером и заменить им старый.
PressurePipeNetwork имеет методы AddCurvePipe и AddLinePipe, но они требуют в качестве параметра PressurePartSize.
Вопрос к знатокам - можно ли получить список доступных PressurePartSize документа? Мне удалось добраться только до PressurePartLists...
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Дмитрий Загорулькин от 10-10-2017, 18:16:18
А этот класс является 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.  
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 10-10-2017, 22:19:19
Цитировать
Странно, учитывая, что он тоже internal:
Удалось получить только имена PressurePartList.  Нашел такое решение - https://forums.autodesk.com/t5/autocad-civil-3d-customization/how-to-access-pressure-network-parts-lists-using-vb-net/td-p/6205962
Через рефлексию :)
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Дмитрий Загорулькин от 11-10-2017, 00:16:49
Однако! Andant, отличная работа! Ну раз уж сам Jeff_M предложил такой способ и даже дал пример кода, то вынужден признать, что он имеет право на жизнь :)
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 12-10-2017, 11:38:18
Продолжил погружение в рефлексию и создал новый PressurePipe на основе выбранного типоразмера.
Но, новая засада... Информация о типоразмере трубы хранится в свойстве PartDescription (readonly) от базового класса PressurePart.
У прародителя, Entity, есть свойство Description, доступное для редактирования. И если изменить Description, то автоматом меняется и PartDescription.
Как можно сделать, чтобы и информацию о типоразмере не терять, и дополнительный комментарий добавлять?
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Дмитрий Загорулькин от 12-10-2017, 13:29:41
Информация о типоразмере трубы хранится в свойстве PartDescription (readonly) от базового класса PressurePart.
У прародителя, Entity, есть свойство Description, доступное для редактирования. И если изменить Description, то автоматом меняется и PartDescription.
А если вручную на чертеже поменять описание, что будет возвращать PartDescription?
Вообще, лучше придерживаться правила: один вопрос - одна тема. А в этой теме это уже 3-й вопрос.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 12-10-2017, 14:40:19
Цитировать
А если вручную на чертеже поменять описание, что будет возвращать PartDescription?
В том то и дело, что Description заменяет значение PartDescription даже при ручном редактировании.

Цитировать
Вообще, лучше придерживаться правила: один вопрос - одна тема. А в этой теме это уже 3-й вопрос.
Эту задачу можно закрывать. Исследования показали, что присваивание стиля напрямую не актуально. Стилю присваивается значение стиля PressurePartSize. Проверено. Единственное - зачем генерировать исключение, если можно просто сделать ReadOnly.
Типоразмер можно задать при добавлении новой трубы к сети. При помощи рефлексии, но возможно...
Вопрос о PartDescription выношу в отдельную тему.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 17-10-2017, 18:00:32
Отменил статус решенной задачи. Пользователи хотят иметь возможность задавать стиль элементов напорных сетей независимо от типоразмера.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Александр Ривилис от 17-10-2017, 18:05:52
Получил первый ответ от ADN DevHelp. Они передали этот вопрос команде разработчиков, так как сами не смогли найти на него ответ.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Александр Ривилис от 18-10-2017, 08:35:39
Получил второй ответ (от разработчиков) - такого функционала в текущих версиях Civil 3D API нет. Создана заявка на добавление такого функционала, но без серьезного  ‘business case’ до него руки дойдут не скоро. По поводу ‘business case’: http://adn-cis.org/forum/index.php?topic=2640.0
В любом случае если это изменение и будет, то только в новых версиях.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 19-10-2017, 10:01:51
Получил второй ответ (от разработчиков) - такого функционала в текущих версиях Civil 3D API нет. Создана заявка на добавление такого функционала, но без серьезного  ‘business case’ до него руки дойдут не скоро. По поводу ‘business case’: http://adn-cis.org/forum/index.php?topic=2640.0
В любом случае если это изменение и будет, то только в новых версиях.
Спасибо! Примерно это я и предполагал после изучения вопроса.
Попробовал DwgOut,  заменить ссылку на StyleId в ReferenceFiler и вызвать DwgIn, но попытка не удалась... Может, возможны подобные "танцы с бубном"?
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Александр Ривилис от 19-10-2017, 12:40:44
Попробовал DwgOut,  заменить ссылку на StyleId в ReferenceFiler и вызвать DwgIn, но попытка не удалась... Может, возможны подобные "танцы с бубном"?
Такие "танцы с бубном" теоретически возможны через P/Invoke для функций acdbEntGet/acdbEntMod из ObjectARX.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 19-10-2017, 17:42:31
Такие "танцы с бубном" теоретически возможны через P/Invoke для функций acdbEntGet/acdbEntMod из ObjectARX.

Результат acdbEntGet:
(https://s1.postimg.org/5vyt9zodt7/watch.jpg) (https://postimg.org/image/5vyt9zodt7/)

Аналогично:
(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 только в ссылках:
(https://s1.postimg.org/4p06rkrsnv/Style.jpg) (https://postimg.org/image/4p06rkrsnv/)
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Александр Ривилис от 19-10-2017, 18:04:37
Значит и этот вариант не подходит. Увы.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 20-10-2017, 11:19:53
Удалось поменять стиль трубы через стиль типоразмера.
1. Меняем у типоразмера трубы стиль на новый.
2. Создаем новую трубу с геометрией старой, но отредактированным типоразмером.
3. Удаляем старую трубу.
4. Возвращаем типоразмеру родное значение стиля.

Вот такой "финт ушами", но сработало!
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Дмитрий Загорулькин от 20-10-2017, 12:18:08
Ну это как бы не совсем замена стиля. В общем случае, с заменой трубы возникает ряд других проблем:
- Точное определение геометрии исходной трубы: в напорной сети труба может быть очень сложной формы в вертикальной плоскости.
- Отображение на виде профиля: после замены трубы нужно восстановить отображение трубы на всех видах профилей с учётом возможного переопределения стиля трубы на отдельном виде профиля. Кстати, то же самое, возможно, касается и видов сечений.
- Восстановление меток трубы как на плане, так и на видах профиля (видах сечения).
- Восстановление ссылочной поверхности.
- Восстановление ссылочной трассы.
- Восстановление присоединений к другим элементам.
В частном случае, возможно, этих проблем не будет.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Дмитрий Загорулькин от 20-10-2017, 15:46:45
Кстати, возможно, что от некоторых проблем (например, с метками) можно избавиться, если использовать при замене трубы метод подмены 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
Я использовал его при аналогичной замене в безнапорной сети.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 23-10-2017, 11:50:19
Кстати, возможно, что от некоторых проблем (например, с метками) можно избавиться, если использовать при замене трубы метод подмены Id:
Спасибо, Дмитрий!
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 27-10-2017, 16:59:51
Пока не проверил, но скорее всего проблема решается заменой ссылок аналогично http://adn-cis.org/forum/index.php?topic=8112.0 (http://adn-cis.org/forum/index.php?topic=8112.0)
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Александр Ривилис от 27-10-2017, 20:12:51
Пока не проверил, но скорее всего проблема решается заменой ссылок аналогично http://adn-cis.org/forum/index.php?topic=8112.0 (http://adn-cis.org/forum/index.php?topic=8112.0)
Проверь пожалуйста эту возможность. Если это так, то можно будет утереть нос и ADN DevHelp, и команде разработчиков. Хотя я просил у них посмотреть нет ли workaround, но они этот вариант не нашли.

Ну и кусочек кода, который это делает.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 30-10-2017, 11:40:23
Проверь пожалуйста эту возможность.
Проверил. Работает!
Ну и кусочек кода, который это делает.
Кусочек:
Код - 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.  
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 30-10-2017, 12:30:44
Не удалось применить SwapReferences для замены типоразмера.
Надо задавать новый PartDef Id, а словарь AECC_NETWORK_PART_DEFS содержит PartDef только для уже вставленных объектов.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Дмитрий Загорулькин от 30-10-2017, 12:31:35
Off-Topic: показать
Неужели "pipe" настолько длинное слово, что его нужно сокращать до "pip"?  :)
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 30-10-2017, 12:35:33
Неужели "pipe" настолько длинное слово, что его нужно сокращать до "pip"? 
Отредактировал. Так лучше? :)
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Дмитрий Загорулькин от 30-10-2017, 12:40:09
По крайней мере, мне - привычнее и понятнее. Код лучше читается.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Александр Ривилис от 30-10-2017, 12:40:51
Не удалось применить SwapReferences для замены типоразмера.
Надо задавать новый PartDef Id, а библиотека AECC_NETWORK_PART_DEFS содержит PartDef только для уже вставленных объектов.
Тут я не совсем понял. Если типоразмер уже в чертеже использовался, то для него уже есть PartDef Id. В этом случае SwapReferences применим. Я так понимаю, что ты не можешь программно создать новый типоразмер, для того чтобы поменять на него.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 30-10-2017, 12:45:25
Я так понимаю, что ты не можешь программно создать новый типоразмер, для того чтобы поменять на него.
Напорные объекты содержат ссылки не на типоразмер, а на PartDef. Не понятно, как его создавать...
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Александр Ривилис от 30-10-2017, 12:47:19
Напорные объекты содержат ссылки не на типоразмер, а на PartDef. Не понятно как его создавать...
Но если он уже использовался (PartDef), то ты можешь на него переключится? Создать ты его действительно не можешь.
Название: Re: Задать стиль напорного трубопровода.
Отправлено: Andant от 30-10-2017, 12:51:58
Но если он уже использовался (PartDef), то ты можешь на него переключится?
Если использовался, то можно. Если новый - остается способ с заменой объекта.