Расстояние между метками вдоль трассы.

Автор Тема: Расстояние между метками вдоль трассы.  (Прочитано 6050 раз)

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

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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 1
Добрый день.
Есть трасса (AECC_ALIGNMENT) с расставленными по ней метками (AECC_STATION_OFFSET_LABEL).
Нужно получить расстояние между выбранными метками вдоль трассы используя LISP и/или VBA.

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Вначале определяешь координаты метки, а потом используешь метод Alignment.StationOffset(double easting, double northing, ref double station, ref double offset), чтобы определить пикет.

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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 1
А как вытащить координаты метки?

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
а потом используешь метод Alignment.StationOffset(double easting, double northing, ref double station, ref double offset), чтобы определить пикет.
А в COM он точно есть? Надо смотреть дамп объекта "трасса" (VLAX-DUMP-OBJECT).
А как вытащить координаты метки?
Надо смотреть дамп объекта "метка".

Оффлайн Алексей Терно

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Я смогу посмотреть только часа через 2-3. Если ответа не будет, посмотрю.

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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 1
Не нашел я там координат точки.


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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Ну из обычного автокада точно ничего не сделать. Дамп из 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 тоже иногда приходится таким способом пользоваться, например, если нужно прочитать тексты из некоторых меток.

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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 1
По поводу взрывания - была такая идея.
С начала взорвать метку, потом взорвать блок. Точка вставки  представлена отдельным блоком из которого вытаскиваем координаты. Затем отменяем взрывания. Аналогично поступаем со второй меткой.
Должно сработать, но это как-то по "варварски". Хотелось более "изящный" способ. :-)

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Затем отменяем взрывания.
Насколько я помню, если взрывать методомфункцией vla-explode, то отменять не придётся - только удалить то что после взрыва получилось.

P.S. Хотя такого метода вроде нет у метки... Я уже не помню как я взрывал их. Вроде как, я "взрывал" весь чертёж через экспорт его в чертёж AutoCAD, а там по особым настройкам слоёв (настраивались в стилях объектов) искал нужные объекты и обрабатывал их.

В общем, возможно, что на LISP/VBA не получится такое сделать. Если хочется писать под Civil 3D - надо переходить на .NET. Там это гораздо проще делать и возможностей больше.

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

  • ADN OPEN
  • Сообщений: 7
  • Карма: 1
Спасибо за советы. Решил задачу "взрывным методом" на LISP.  Но в дальнейшем без .NET похоже в Civil 3D делать нечего. Буду изучать.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Как я уже говорил, даже на .NET иногда приходится взрывать метку, чтобы прочитать данные. Пример: https://adndevblog.typepad.com/infrastructure/2013/04/get-cogopoint-label-text.html