ADN Club > Civil 3D API

Как получить имя сети для трубы или колодца через COM?

(1/3) > >>

Дмитрий Загорулькин:
Здравствуйте!
То ли действительно есть такой недочёт в Civil 3D COM API, то ли я куда-то не туда смотрю... Но мне не удалось найти никакого относительно простого способа узнать имя сети, к которой принадлежит труба или колодец на чертеже. В .NET вообще нет с этим проблем, есть специальное свойство: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/755b6e1e-e16a-ac8f-6086-f1db4a32bc74.htm. А вот в COM - ничего! Ни ссылку на сеть не получить, ни имя её, ни каких-то ещё данных, по которым её можно быстро вычислить... Единственный способ, которым мне удалось получить имя сети - это перебор всех сетей чертежа и перебор объектов этих сетей, пока не найдётся элемент с именем, которое соответствует элементу, для которого ищется сеть (lisp для Civil 3d 2020):

--- Код - Auto/Visual Lisp [Выбрать] ---(defun c:GetPartNetName (/              part      isPipe    partName  pipeApp                      pipeDoc   nets      i         j         net                      parts     curPartName         netName                     )   (setq    part     (vlax-ename->vla-object (car (entsel)))    isPipe   (= (vla-get-ObjectName part) "AeccDbPipe")    partName (vla-get-Name part)  )   (setq pipeApp (vlax-get-or-create-object                  "AeccXUiPipe.AeccPipeApplication.13.2"                )  )  (setq pipeDoc (vlax-get-property pipeApp 'ActiveDocument))  (setq nets (vlax-get-property pipeDoc 'PipeNetworks))  (setq i (vla-get-Count nets))  (while (and (> i 0) (not netName))    (setq      i   (- i 1)      net (vla-item nets i)    )     (setq      parts (if isPipe              (vlax-get-property net 'Pipes)              (vlax-get-property net 'Structures)            )    )     (setq j (vla-get-count parts))    (while (and (> j 0) (not netName))      (setq j (- j 1)            curPartName             (vla-get-Name (vla-item parts j))      )      (if (= curPartName partName)        (setq netName (vla-get-Name net))      )    )  )   (alert netName)   (princ))Может быть, я что-то упускаю?
Пример дампа для трубы:

--- Код: ---; IAeccPipe: Интерфейс "Труба"
; Значения свойств:
;   Alignment = nil
;   Application (RO) = #<VLA-OBJECT IAeccApplication 00000276ae9237f0>
;   ClosestPointTo (RO) = ...Индексированное содержимое не выводится...
;   Connectors (RO) = #<VLA-OBJECT IAeccConnectors 00000276ae924480>
;   Description = "300 ПЭ КОРСИС ID SN8"
;   DisplayName (RO) = "Труба-(283)"
;   Document (RO) = #<VLA-OBJECT IAeccDocument 00000276ae9240c0>
;   EGLDown = 0.0
;   EGLUp = 0.0
;   EndPoint (RO) = #<VLA-OBJECT 00000276ae9251d0>
;   EndStructure (RO) = #<VLA-OBJECT IAeccStructure 00000276a46e6870>
;   EntityTransparency = "ПоСлою"
;   FlowDirection (RO) = 1
;   FlowDirectionMethod = 1
;   Handle (RO) = "20555"
;   HasExtensionDictionary (RO) = 0
;   HGLDown = 0.0
;   HGLUp = 0.0
;   HoldOnResize = 0
;   Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 00000276aea11478>
;   InnerDiameterOrWidth (RO) = 0.3
;   InnerHeight (RO) = 0.3
;   IsMaxCoverViolated (RO) = ...Индексированное содержимое не выводится...
;   IsMinCoverViolated (RO) = ...Индексированное содержимое не выводится...
;   Labels (RO) = #<VLA-OBJECT IAeccPipeLabels 00000276ae9d49d0>
;   Layer = "К2П_План"
;   Length2D (RO) = 39.7856
;   Length3D (RO) = 39.7856
;   Linetype = "ByLayer"
;   LinetypeScale = 1.0
;   Lineweight = -1
;   Material = "Global"
;   MaximumCover (RO) = 0.0
;   MinimumCover (RO) = 0.0
;   Name = "Труба-(283)"
;   ObjectID (RO) = 42
;   ObjectName (RO) = "AeccDbPipe"
;   OuterDiameterOrWidth (RO) = 0.364
;   OuterHeight (RO) = 0.364
;   OwnerID (RO) = 43
;   ParamsBool (RO) = #<VLA-OBJECT 00000276ae926970>
;   ParamsDouble (RO) = #<VLA-OBJECT 00000276ae926610>
;   ParamsLong (RO) = #<VLA-OBJECT 00000276ae926340>
;   ParamsString (RO) = #<VLA-OBJECT 00000276ae9262e0>
;   PartDataRecord = #<VLA-OBJECT IAeccPartDataRecord 00000276ae926370>
;   PartFamily (RO) = #<VLA-OBJECT IAeccPartFamily 0000027695e4e750>
;   PartSizeName (RO) = "300 ПЭ КОРСИС ID SN8"
;   PartType (RO) = 10
;   PlotStyleName = "ByLayer"
;   PointAtParam (RO) = ...Индексированное содержимое не выводится...
;   Position (RO) = #<VLA-OBJECT IAeccPoint3d 00000276ae926a00>
;   ProfileNetworkParts (RO) = #<VLA-OBJECT IAeccGraphProfileNetworkParts 00000276ae9d4fc0>
;   Radius (RO) = 0.0
;   ShowToolTip = -1
;   Slope (RO) = 0.0
;   StartPoint (RO) = #<VLA-OBJECT 00000276ae927210>
;   StartStructure (RO) = #<VLA-OBJECT IAeccStructure 00000276a46e4470>
;   STMPipeMetadata = неподдерживаемый тип результата: 65
;   Style = #<VLA-OBJECT IAeccPipeStyle 0000027695e4d310>
;   SubEntityType (RO) = 0
;   Surface = nil
;   SweptShape (RO) = 2
;   TrueColor = #<VLA-OBJECT IAcadAcCmColor 00000276aea11890>
;   Visible = -1
;   WallThickness (RO) = 0.032
; Поддерживаемые методы:
;   ArrayPolar (3)
;   ArrayRectangular (6)
;   ConnectToPipe (3)
;   ConnectToStructure (2)
;   Copy ()
;   Delete ()
;   Disconnect (1)
;   GetBoundingBox (2)
;   GetExtensionDictionary ()
;   GetXData (3)
;   Highlight (1)
;   IntersectWith (2)
;   IsReferenceObject ()
;   IsReferenceStale ()
;   IsReferenceSubObject ()
;   IsReferenceValid ()
;   Mirror (2)
;   Mirror3D (3)
;   Move (2)
;   Project2dPointVertically (1)
;   ResizeByInnerDiaOrWidth (3)
;   Rotate (2)
;   Rotate3D (3)
;   ScaleEntity (2)
;   SetStartAndEndPoints (2)
;   SetXData (2)
;   SwapPartFamilyAndSize (2)
;   TransformBy (1)
;   Update ()
--- Конец кода ---
Пример дампа для колодца:

--- Код: ---; IAeccStructure: Интерфейс "Колодец"
; Значения свойств:
;   Alignment = nil
;   Application (RO) = #<VLA-OBJECT IAeccApplication 00000276af19a680>
;   AutomaticRimSurfaceAdjustment = 1
;   BoundingShape (RO) = 1
;   ConnectedPipe (RO) = ...Индексированное содержимое не выводится...
;   ConnectedPipeNames (RO) = "Труба-(295)"
;   ConnectedPipesCount (RO) = 1
;   Connectors (RO) = #<VLA-OBJECT IAeccConnectors 00000276af19a740>
;   ControlSumpBy = 0
;   Description = "Колодец 1 000 мм"
;   DisplayName (RO) = "Л-(132)"
;   Document (RO) = #<VLA-OBJECT IAeccDocument 00000276af19a920>
;   EntityTransparency = "ПоСлою"
;   Handle (RO) = "205E1"
;   HasExtensionDictionary (RO) = 0
;   Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 00000276af0a2db8>
;   InnerDiameter (RO) = ...Индексированное содержимое не выводится...
;   InnerLength (RO) = ...Индексированное содержимое не выводится...
;   InnerWidth (RO) = ...Индексированное содержимое не выводится...
;   Labels (RO) = #<VLA-OBJECT IAeccStructureLabels 00000276af27c880>
;   Layer = "К2П_План"
;   Linetype = "ByLayer"
;   LinetypeScale = 1.0
;   Lineweight = -1
;   Material = "ByLayer"
;   Name = "Л-(132)"
;   ObjectID (RO) = 44
;   ObjectName (RO) = "AeccDbStructure"
;   OwnerID (RO) = 43
;   ParamsBool (RO) = #<VLA-OBJECT 00000276af19a290>
;   ParamsDouble (RO) = #<VLA-OBJECT 00000276af19a650>
;   ParamsLong (RO) = #<VLA-OBJECT 00000276af199db0>
;   ParamsString (RO) = #<VLA-OBJECT 00000276af19a5c0>
;   PartDataRecord = #<VLA-OBJECT IAeccPartDataRecord 00000276af19a950>
;   PartFamily (RO) = #<VLA-OBJECT IAeccPartFamily 00000276af22dd60>
;   PartSizeName (RO) = "Колодец 1 000 мм"
;   PartType (RO) = 102
;   PipeCenterDepth (RO) = ...Индексированное содержимое не выводится...
;   PipeInnerDiaOrWidth (RO) = ...Индексированное содержимое не выводится...
;   PipeInvertDepth (RO) = ...Индексированное содержимое не выводится...
;   PipeLowestBottomDepth (RO) = 0.425
;   PipeOuterBottomDepth (RO) = ...Индексированное содержимое не выводится...
;   PipeOuterTopDepth (RO) = ...Индексированное содержимое не выводится...
;   PipeUpperTopDepth (RO) = 0.2
;   PipeWallThickness (RO) = ...Индексированное содержимое не выводится...
;   PlotStyleName = "ByLayer"
;   Position (RO) = #<VLA-OBJECT IAeccPoint3d 00000276af19a860>
;   ProfileNetworkParts (RO) = #<VLA-OBJECT IAeccGraphProfileNetworkParts 00000276af27c6a0>
;   RimElevation = 0.3125
;   Rotation = 5.84866
;   ShowToolTip = -1
;   StructureDiameterOrWidth (RO) = 1.004
;   StructureHeight (RO) = 0.4375
;   StructureInnerDiameterOrWidth (RO) = 1.0
;   StructureInnerLength (RO) = 0.0
;   StructureLength (RO) = 0.0
;   Style = #<VLA-OBJECT IAeccStructureStyle 00000276af22e6f0>
;   SumpDepth = 0.0
;   SumpElevation = -0.1
;   Surface = nil
;   SurfaceAdjustmentValue = 0.0
;   TrueColor = #<VLA-OBJECT IAcadAcCmColor 00000276af0a32f0>
;   Visible = -1
; Поддерживаемые методы:
;   ArrayPolar (3)
;   ArrayRectangular (6)
;   ConnectToPipe (2)
;   Copy ()
;   Delete ()
;   Disconnect (1)
;   GetBoundingBox (2)
;   GetExtensionDictionary ()
;   GetNextPipeElevation ()
;   GetXData (3)
;   Highlight (1)
;   IntersectWith (2)
;   IsConnectedPipeFlowingIn (1)
;   IsConnectedPipeFlowingOut (1)
;   IsPointInsideStructureRegion (1)
;   IsReferenceObject ()
;   IsReferenceStale ()
;   IsReferenceSubObject ()
;   IsReferenceValid ()
;   Mirror (2)
;   Mirror3D (3)
;   Move (2)
;   ResizeByPipeDepths ()
;   ResizeJunctionStructureByRimAndSumpElevations (3)
;   Rotate (2)
;   Rotate3D (3)
;   ScaleEntity (2)
;   SetLocation (1)
;   SetXData (2)
;   SwapPartFamilyAndSize (2)
;   TransformBy (1)
;   Update ()
--- Конец кода ---
В Object Browser та же картина (ниже - скрины имён свойств для труб)

Алексей Кулик:
Тебе именно лисп нужен??
Я когда игрался с объектами ADT (ныне AA), приходилось считывать словарные записи - и с документа, и с объектов. Может, так сработает?
P.S. Civil'a нет, работать в нем не умею, и вообще компьютеров боюсь ;)

Александр Ривилис:
Дмитрий Загорулькин,
OwnerID ссылается на ModelSpace?

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

--- Цитата: Алексей Кулик от 24-12-2019, 21:38:36 ---Тебе именно лисп нужен??
--- Конец цитаты ---
Нет, нужен VBA для создания дополнительных свойств. Продолжение этой темы, по сути: https://adn-cis.org/forum/index.php?topic=8952.0
Но т.к. LISP и VBA используют COM практически одинаково, то не особо принципиально на чём тестировать. А на LISP мне удобнее :)

--- Цитата: Алексей Кулик от 24-12-2019, 21:38:36 ---Я когда игрался с объектами ADT (ныне AA), приходилось считывать словарные записи - и с документа, и с объектов. Может, так сработает?
--- Конец цитаты ---
А у них нет словарей, и XData пустая :(

--- Цитата: Александр Ривилис от 24-12-2019, 22:27:41 ---OwnerID ссылается на ModelSpace?
--- Конец цитаты ---
Да :(

Александр Ривилис:
Дмитрий Загорулькин,
Похоже связь в COM односторонняя. Т.е. из Pipe получить Network напрямую нельзя. Интересно, а в .NET Pipe хранит ObjectId Network? Ты это можешь проверить сделав DxfOut в ReferenceFiler. Если там не окажется ObjectId Network, то это будет значить, что и в .NET свойство NetworkName работает аналогично тому, как ты это сделал на lisp'е.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии