Получить информацию о типоразмере объекта напорного трубопровода.

Автор Тема: Получить информацию о типоразмере объекта напорного трубопровода.  (Прочитано 4995 раз)

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

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

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Информация о типоразмере хранится в свойстве PressurePart.PartDescription (ReadOnly)
Немного не так. При создании элемента в качестве значения по умолчанию для описания берётся типоразмер элемента. В безнапорной сети даже специальная настройка есть по управлению этим поведением:

Ну и раз оно легко изменяется вручную, то пользоваться этим свойством для получения типоразмера - крайне ненадёжно.
Тут, наверное, снова можно попробовать добраться к типоразмеру через Reflection. Дополнительно, можно попробовать поизучать связанные с трубой объекты с помощью MgdDbg. Вот интересное обсуждение на эту тему: http://adn-cis.org/forum/index.php?topic=7342.0

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Цитировать
В безнапорной сети даже специальная настройка есть по управлению этим поведением
В безнапорной сети у объектов есть PartSizeName...

Цитировать
Тут, наверное, снова можно попробовать добраться к типоразмеру через Reflection
dotPeek-ом долго изучал AeccPressurePipesMgd.dll. Пока не нашел.

Цитировать
Дополнительно, можно попробовать поизучать связанные с трубой объекты с помощью MgdDbg.
Выявил ссылки на PressurePartList и PressurePipeStyle. На типоразмер - нет...

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

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

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
К сожалению, entget - не вариант:
Команда: (entget (car (entsel)))
Выберите объект: ((-1 . <Имя объекта: 7291dd00>) (0 . "AECC_PRESSUREPIPE") (330 . <Имя объекта: 72c251f0>) (5 . "46B0") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (100 . "AeccDbEntity") (100 . "AeccDbGeo_aec") (100 . "AeccDbGeo") (100 . "AeccDbNetworkPartBase") (100 . "AeccDbPressurePart") (100 . "AeccDbPressurePipe"))
И COM тоже:
Команда: (setq pipe (car (entsel)))(setq pipe-vla (vlax-ename->vla-object pipe))(vlax-dump-Object pipe-vla T)
Выберите объект: ; IAeccEntity: интерфейс IAeccEntity
; Значения свойств:
;   Application (RO) = #<VLA-OBJECT IAeccApplication 000000007129bbe0>
;   Description = "Трубы бесшовные холоднодеформ. из сплавов на основе титана 102x6.0"
;   DisplayName (RO) = "Напорная труба - (32)"
;   Document (RO) = #<VLA-OBJECT IAeccDocument 00000000712a1d60>
;   EntityTransparency = "ПоСлою"
;   Handle (RO) = "46B0"
;   HasExtensionDictionary (RO) = 0
;   Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 0000000074ede898>
;   Layer = "0"
;   Linetype = "ByLayer"
;   LinetypeScale = 1.0
;   Lineweight = -1
;   Material = "ByLayer"
;   Name = "Напорная труба - (32)"
;   ObjectID (RO) = 42
;   ObjectName (RO) = "AeccDbPressurePipe"
;   OwnerID (RO) = 43
;   PlotStyleName = "ByLayer"
;   ShowToolTip = -1
;   TrueColor = #<VLA-OBJECT IAcadAcCmColor 0000000074edc8b0>
;   Visible = -1
; Поддерживаемые методы:
;   ArrayPolar (3)
;   ArrayRectangular (6)
;   Copy ()
;   Delete ()
;   GetBoundingBox (2)
;   GetExtensionDictionary ()
;   GetXData (3)
;   Highlight (1)
;   IntersectWith (2)
;   IsReferenceObject ()
;   IsReferenceStale ()
;   IsReferenceSubObject ()
;   IsReferenceValid ()
;   Mirror (2)
;   Mirror3D (3)
;   Move (2)
;   Rotate (2)
;   Rotate3D (3)
;   ScaleEntity (2)
;   SetXData (2)
;   TransformBy (1)
;   Update ()
T

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
А что кроется за этим: (330 . <Имя объекта: 72c251f0>) ?
Блок-владелец:
Команда: (setq pipe (car (entsel)))(entget (cdr (assoc 330 (entget pipe))))
Выберите объект: ((-1 . <Имя объекта: 72c251f0>) (0 . "BLOCK_RECORD") (5 . "1F") (102 . "{ACAD_XDICTIONARY") (360 . <Имя объекта: 72c24560>) (102 . "}") (330 . <Имя объекта: 72c25010>) (100 . "AcDbSymbolTableRecord") (100 . "AcDbBlockTableRecord") (2 . "*Model_Space") (360 . <Имя объекта: 72c25200>) (340 . <Имя объекта: 72c25220>) (70 . 0) (280 . 1) (281 . 0))
Ну и расширенные данные неплохо бы посмотреть.
РД и словаря тоже нет:


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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Так что ARXDBG будет полезен.
Вообще, кое-что, вроде как, нащупал через ArxDbg:

Команда: (entget (handent "14D0"))
((-1 . <Имя объекта: 72c05080>) (0 . "DICTIONARY") (5 . "14D0") (102 . "{ACAD_REACTORS") (330 . <Имя объекта: 72c250c0>) (102 . "}") (330 . <Имя объекта: 72c250c0>) (100 . "AcDbDictionary") (280 . 0) (281 . 1) (3 . "100112standard26100_mm_x_100_mm43ГОСТ_22897_862Трубы_бесшовные_холоднодеформ._из_сплавов_на_основе_титана_102x6.035b5b980_d37b_49e7_85d0_1143f0b55498Трубы_бесшовные_холоднодеформ._из_сплавов_на_основе_титана_ГОСТ_22897_86__толщина_стенки_6_ммbcabf25b_5c6a_5c3c_bee9_1c29225b4569F3224858_E199_4219_8644_12DD136AA9DFPipe_DomainPressurePipe") (350 . <Имя объекта: 7291db00>) (3 . "15elbow2100_mm_x_100_mm43ГОСТ_22793_832Отвод_гнутый_1_15_100_100_127x14ef211a75_b592_45c6_a07a_3a7f189946a4Отвод_гнутый_15_ГОСТ_22793_83__исполнение_116b31ce3_5a12_5d1f_9650_e4589bb4fb33F3224858_E199_4219_8644_12DD136AA9DFFitting_DomainElbow") (350 . <Имя объекта: 7291dc10>) (3 . "30elbow2100_mm_x_100_mm43ГОСТ_22793_832Отвод_гнутый_3_30_100_100_159x2892c7a313_5ee5_4907_be69_c96a3d63ac8cОтвод_гнутый_30_ГОСТ_22793_83__исполнение_322b3b9ec_daaf_56a0_8f3f_6b82bba51ff2F3224858_E199_4219_8644_12DD136AA9DFFitting_DomainElbow") (350 . <Имя объекта: 7291dce0>) (3 . "45elbow2100_mm_x_100_mm43ГОСТ_17375_20012Отвод_крутоизогнутый_стальной_бесшовный_приварной_45_114x10b8c6e7dc_3fb9_418a_879e_fa9949c9f028Отвод_крутоизогнутый_стальной_бесшовный_приварной_45_ГОСТ_17375_2001__толщина_стенки_10_мм00478ebe_dfa8_5e96_8fad_97c31418c20cF3224858_E199_4219_8644_12DD136AA9DFFitting_DomainElbow") (350 . <Имя объекта: 7291dd90>) (3 . "90elbow2100_mm_x_100_mm43ГОСТ_22793_832Отвод_гнутый_2_90_100_100_140x2011fe5f3c_1ea0_4eed_9339_f10da5c46e44Отвод_гнутый_90_ГОСТ_22793_83__исполнение_20320c558_93d8_5668_b106_295b6e65c531F3224858_E199_4219_8644_12DD136AA9DFFitting_DomainElbow") (350 . <Имя объекта: 7291df00>))
Думаю, что если дальше поковырять и выяснить что там за объекты под 350 кодом, то можно что-то найти интересное. Я пас - спать хочу :)

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Нашел в AeccPressurePipesMgd.dll :
Код - C# [Выбрать]
  1. internal class <Module>
  2. {
  3. .....................
  4. [SuppressUnmanagedCodeSecurity]
  5.   [DllImport("", EntryPoint = "", CallingConvention = CallingConvention.Cdecl, SetLastError = true)]
  6.   [MethodImpl(MethodImplOptions.Unmanaged, MethodCodeType = MethodCodeType.Native)]
  7.   internal static extern unsafe AecRmCString* AeccPressurePart.getPartSizeGuid([In] AeccPressurePart* obj0, [In] AecRmCString* obj1);
  8.  

Можно как-нибудь через рефлексию зацепить?

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

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

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Цитировать
Нет. Тут есть типы объектов, доступ к которым через .NET не получишь.

Спасибо, Александр. Значит я зря потратил время... :)
Буду по совету Дмитрия копать в сторону PartDef.

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

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

Отмечено как Решение Andant 18-10-2017, 12:44:34

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

  • ADN Club
  • **
  • Сообщений: 79
  • Карма: 26
Александр, Дмитрий! Спасибо за помощь!
Удалось добраться до типоразмера PressurePipe.
Словарь AECC_NETWORK_PART_DEFS содержит в качестве значений идентификаторы объектов PartDef. Ключ - длинная строка с описанием, из которой удалось выделить GUID типоразмера.
Ссылку на PartDef получил через dwgOut с ReferenceFiler.
« Последнее редактирование: 01-11-2017, 12:00:02 от Andant »

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Ну хоть что-то удалось сделать с этой напоркой! Мои поздравления :)