Сообщество программистов Autodesk в СНГ
ADN Club => Civil 3D API => Тема начата: Victor Kv от 24-10-2018, 10:04:05
-
Добрый день.
Есть трасса (AECC_ALIGNMENT) с расставленными по ней метками (AECC_STATION_OFFSET_LABEL).
Нужно получить расстояние между выбранными метками вдоль трассы используя LISP и/или VBA.
-
Вначале определяешь координаты метки, а потом используешь метод Alignment.StationOffset(double easting, double northing, ref double station, ref double offset), чтобы определить пикет.
-
А как вытащить координаты метки?
-
а потом используешь метод Alignment.StationOffset(double easting, double northing, ref double station, ref double offset), чтобы определить пикет.
А в COM он точно есть? Надо смотреть дамп объекта "трасса" (VLAX-DUMP-OBJECT).
А как вытащить координаты метки?
Надо смотреть дамп объекта "метка".
-
Я смогу посмотреть только часа через 2-3. Если ответа не будет, посмотрю.
-
Не нашел я там координат точки.
(https://i.postimg.cc/1gyp3fBb/label-dump.jpg) (https://postimg.cc/1gyp3fBb)
-
Ну из обычного автокада точно ничего не сделать. Дамп из Civil тоже не особо помогает:
_$
((-1 . <Имя объекта: 67e08490>) (0 . "AECC_STATION_OFFSET_LABEL") (330 . <Имя объекта: 5bc921f0>) (5 . "6AC1") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "C-ROAD-TEXT") (100 . "AeccDbEntity") (100 . "AeccDbLabeling") (100 . "AeccDbLabel") (100 . "AeccDbFeatureLabel") (100 . "AeccDbStaOffsetLabel"))
_$
; IAeccStationOffsetLabel: интерфейс IAeccStationOffsetLabel
; Значения свойств:
; Alignment (RO) = #<VLA-OBJECT IAeccAlignment 000000005b8efa20>
; Application (RO) = #<VLA-OBJECT IAeccApplication 0000000076519350>
; AtFixedXY = 0
; Description = Civil 3D API: Параметр задан неверно.
; DisplayName (RO) = Civil 3D API: Параметр задан неверно.
; Document (RO) = #<VLA-OBJECT IAeccDocument 00000000767c1860>
; EntityTransparency = "ПоСлою"
; Flipped = 0
; Handle (RO) = "6AC1"
; HasExtensionDictionary (RO) = 0
; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 000000007672f498>
; LabelStyle = #<VLA-OBJECT IAeccLabelStyle 000000007692ead0>
; Layer = "C-ROAD-TEXT"
; LeaderAttachmentOption = 0
; Linetype = "ByLayer"
; LinetypeScale = 1.0
; Lineweight = -1
; MarkerStyle = #<VLA-OBJECT IAeccMarkerStyle 00000000766ad450>
; Material = "ByLayer"
; Name = Civil 3D API: Параметр задан неверно.
; ObjectID (RO) = 42
; ObjectName (RO) = "AeccDbStaOffsetLabel"
; OwnerID (RO) = 43
; Pinned = 0
; PlotStyleName = "ByLayer"
; Reversed = 0
; ShowToolTip = Civil 3D API: Параметр задан неверно.
; TrueColor = #<VLA-OBJECT IAcadAcCmColor 00000000767343b0>
; Type (RO) = 4
; 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
_$
А вот у трассы есть нужный метод:
; IAeccAlignment: Интерфейс IAeccAlignment
; Значения свойств:
; Application (RO) = #<VLA-OBJECT IAeccApplication 00000000767b89e0>
; Description = ""
; DesignSpeedBased = 0
; DesignSpeeds (RO) = #<VLA-OBJECT IAeccDesignSpeeds 00000000751b2a40>
; DisplayName (RO) = "Alignment - (1)"
; Document (RO) = #<VLA-OBJECT IAeccDocument 00000000767c0510>
; EndingStation (RO) = 7484.87
; Entities (RO) = #<VLA-OBJECT IAeccAlignmentEntities 00000000754fc2b0>
; EntityTransparency = "ПоСлою"
; Handle (RO) = "6AB2"
; HasExtensionDictionary (RO) = 0
; Hyperlinks (RO) = #<VLA-OBJECT IAcadHyperlinks 00000000751bd488>
; InstantaneousRadius (RO) = ...Индексированное содержимое не выводится...
; LabelGroups (RO) = #<VLA-OBJECT IAeccAlignmentLabelGroups 0000000076970a00>
; Labels (RO) = #<VLA-OBJECT IAeccAlignmentLabels 000000007696b2d0>
; LabelSet (RO) = #<VLA-OBJECT IAeccAlignmentLabelSet 00000000767bb680>
; Layer = "C-ROAD"
; Length (RO) = 7484.87
; Linetype = "ByLayer"
; LinetypeScale = 1.0
; Lineweight = -1
; Material = "ByLayer"
; Name = "Alignment - (1)"
; ObjectID (RO) = 44
; ObjectName (RO) = "AeccDbAlignment"
; OwnerID (RO) = 43
; Parent (RO) = Civil 3D API: Параметр задан неверно.
; PlotStyleName = "ByLayer"
; Profiles (RO) = #<VLA-OBJECT IAeccProfiles 00000000751baa20>
; ProfileViews (RO) = #<VLA-OBJECT IAeccProfileViews 00000000767c2828>
; ReferencePoint = (3032.85 3757.21 0.0)
; ReferencePointStation = 0.0
; SampleLineGroups (RO) = #<VLA-OBJECT IAeccSampleLineGroups 00000000767c5648>
; ShowToolTip = -1
; StartingStation (RO) = 0.0
; StationEquations (RO) = #<VLA-OBJECT IAeccStationEquations 00000000751b5f20>
; StationIndexIncrement = 100.0
; Style = #<VLA-OBJECT IAeccAlignmentStyle 00000000766ad4e0>
; StyleName (RO) = "Proposed"
; TrueColor = #<VLA-OBJECT IAcadAcCmColor 0000000076734c50>
; UseDesignCheckSet = 0
; UseDesignCriteriaFile = 0
; Visible = -1
; Поддерживаемые методы:
; ArrayPolar (3)
; ArrayRectangular (6)
; Copy ()
; Delete ()
; DistanceToAlignment (5)
; ExportLabelSet (1)
; GetBoundingBox (2)
; GetExtensionDictionary ()
; GetLWPolyline ()
; GetStations (3)
; GetStationStringWithEquations (1)
; GetXData (3)
; Highlight (1)
; ImportLabelSet (1)
; IntersectWith (2)
; IsReferenceObject ()
; IsReferenceStale ()
; IsReferenceSubObject ()
; IsReferenceValid ()
; Mirror (2)
; Mirror3D (3)
; Move (2)
; MoveToSiteless ()
; Offset (1)
; PointLocation (4)
; PointLocationEx (6)
; Reverse ()
; Rotate (2)
; Rotate3D (3)
; ScaleEntity (2)
; SetXData (2)
; StationOffset (4)
; StationOffsetEx (5)
; TransformBy (1)
; Update ()
T
_$
Как вариант, можно взорвать метку программно и исследовать объекты, полученные после взрыва. По какому-то из них, наверное, можно будет найти точку вставки метки. Если даже такого объекта нет - то можно его создать в настройках стиля метки. Если он будет мешать - сделать непечатаемым или очень маленького размера. Я так делал когда-то очень давно, когда на .NET ещё не умел писать. Кстати, на .NET тоже иногда приходится таким способом пользоваться, например, если нужно прочитать тексты из некоторых меток.
-
По поводу взрывания - была такая идея.
С начала взорвать метку, потом взорвать блок. Точка вставки представлена отдельным блоком из которого вытаскиваем координаты. Затем отменяем взрывания. Аналогично поступаем со второй меткой.
Должно сработать, но это как-то по "варварски". Хотелось более "изящный" способ. :-)
-
Затем отменяем взрывания.
Насколько я помню, если взрывать методомфункцией vla-explode, то отменять не придётся - только удалить то что после взрыва получилось.
P.S. Хотя такого метода вроде нет у метки... Я уже не помню как я взрывал их. Вроде как, я "взрывал" весь чертёж через экспорт его в чертёж AutoCAD, а там по особым настройкам слоёв (настраивались в стилях объектов) искал нужные объекты и обрабатывал их.
В общем, возможно, что на LISP/VBA не получится такое сделать. Если хочется писать под Civil 3D - надо переходить на .NET. Там это гораздо проще делать и возможностей больше.
-
Спасибо за советы. Решил задачу "взрывным методом" на LISP. Но в дальнейшем без .NET похоже в Civil 3D делать нечего. Буду изучать.
-
Как я уже говорил, даже на .NET иногда приходится взрывать метку, чтобы прочитать данные. Пример: https://adndevblog.typepad.com/infrastructure/2013/04/get-cogopoint-label-text.html