Координаты текстового компонента метки области вида профиля

Автор Тема: Координаты текстового компонента метки области вида профиля  (Прочитано 4952 раз)

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

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Всем привет!
Можно ли как-то получить координаты меток горизонтальной геометрии из областей данных вида профиля?
Сами метки и их текстовые компоненты я получаю вот так:
Код - C# [Выбрать]
  1. [CommandMethod("_test2")]
  2. public static void test2()
  3. {
  4.     Document doc = Application.DocumentManager.MdiActiveDocument;
  5.     Database db = doc.Database;
  6.     Editor ed = doc.Editor;
  7.     AeccApp.CivilDocument civilDoc = AeccApp.CivilApplication.ActiveDocument;
  8.  
  9.     using (Transaction trans = db.TransactionManager.StartTransaction())
  10.     {
  11.         AeccDb.ProfileView pv = (AeccDb.ProfileView)trans.GetObject(ed.GetEntity("\npv:").ObjectId, OpenMode.ForRead);
  12.  
  13.         RXClass rx = (RXClass)SystemObjects.ClassDictionary["AeccDbHorizontalGeometryBandLabeling"];
  14.         ObjectIdCollection labelGroupIDs = AeccDb.ProfileBandLabelGroup.GetAvailableLabelGroupIds(rx, pv.Id, false);
  15.  
  16.         foreach (ObjectId labelGroupID in labelGroupIDs)
  17.         {
  18.             AeccDb.ProfileBandLabelGroup labelGroup = (AeccDb.ProfileBandLabelGroup)trans.GetObject(labelGroupID, OpenMode.ForWrite);
  19.             IList<AeccDb.LabelGroupSubEntity> labels = labelGroup.SubEntities;
  20.  
  21.             foreach (AeccDb.LabelGroupSubEntity label in labels)
  22.             {
  23.                 Point3d segmentLabelPosition = label.LabelLocation - label.DraggedOffset;
  24.  
  25.                 ObjectIdCollection componentIDs = label.GetTextComponentIds();
  26.  
  27.                 foreach (ObjectId componentID in componentIDs)
  28.                 {
  29.                     AeccDb.Styles.LabelStyleTextComponent component = (AeccDb.Styles.LabelStyleTextComponent)trans.GetObject(componentID, OpenMode.ForRead);
  30.  
  31.                 }
  32.             }
  33.         }
  34.  
  35.         trans.Commit();
  36.     }
  37. }
  38.  

Точка segmentLabelPosition - это точка центра всей метки. Фактически, это середина сегмента трассы в области данных, для которого показывается метка. Так же я могу получить все текстовые компоненты метки, но не могу определить координаты положения этих компонентов. Есть ли какие-нибудь идеи, как получить координаты положения текстового компонента?
« Последнее редактирование: 09-05-2021, 21:35:02 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
А если воспользоваться MGDDBG для исследования этого объекта, и всех связанных с ним объектов? В документации Civil 3D API я не нашел ничего подходящего.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
К сожалению, с помощью этих утилит ничего полезного я не нашел. Пока у меня есть единственный способ - отслеживать, к какому компоненту прикреплен текст, определять границы этих компонентов, их точки привязки, и так пошагово вычислять координаты.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Есть ли какие-нибудь идеи, как получить координаты положения текстового компонента?
Насколько я помню, ни координаты, ни содержимое извлечь нельзя напрямую с помощью Civil 3D API. Я, помнится, взрывал метку, чтобы получить тексты из неё.

Оффлайн Алексей ТерноАвтор темы

  • ADN Club
  • ****
  • Сообщений: 381
  • Карма: 33
    • C3D Extensions
  • Skype: alexeyterno
Содержимое метки можно получить с помощью LabelStyleTextComponent.Text.Contents.Value, правда в том же виде, что и в редакторе меток:


Но я понял, как решается моя задача! :)
Координаты метки мне нужны были для определения пикета вдоль трассы.
Метки области данных горизонтальной геометрии привязываются к положению элементов трассы - кривая, прямая, переходная кривая. И для корневого компонента можно выбрать привязку к началу элемента трассы, к его концу или к середине. С помощью свойства LabelStyleTextComponent.General.AnchorComponent.Value я смогу определить корневой компонент, а с помощью свойства LabelStyleTextComponent.General.AnchorLocation.Value могу определить точку привязки - начала, конец или середина элемента трассы. Вот по сути и искомый пикет :) Единственный момент - это поиск "родительского" компонента через стиль метки, но это легко делается с помощью функции LabelStyle.GetComponents(LabelStyleComponentType type).

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Содержимое метки можно получить с помощью LabelStyleTextComponent.Text.Contents.Value, правда в том же виде, что и в редакторе меток
Да, но толку с этого никакого. Ни текущее значение не получить, ни изменить эту формулу (изменить можно, но изменения корректно не подхватятся). В общем, совершенно бесполезная возможность.
Но я понял, как решается моя задача!
Это хорошо  :)

Оффлайн alsh

  • ADN OPEN
  • Сообщений: 40
  • Карма: 1
Так же я могу получить все текстовые компоненты метки, но не могу определить координаты положения этих компонентов.
А можно узнать как получить текстовые компоненты метки? Спасибо.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
А можно узнать как получить текстовые компоненты метки? Спасибо.
25 строчка в коде из первого сообщения

Оффлайн alsh

  • ADN OPEN
  • Сообщений: 40
  • Карма: 1
Дмитрий, это понятно, но как из этого получить конкретные цифры, отметки, непонятно. То есть, единственный способ, EXPLODE в блок а затем в текст ?
Как вы правильно выразились,
Да, но толку с этого никакого. Ни текущее значение не получить, ни изменить эту формулу (изменить можно, но изменения корректно не подхватятся). В общем, совершенно бесполезная возможность.

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
То есть, единственный способ, EXPLODE в блок а затем в текст ?
Я другого не нашёл. И ADN когда-то давно только этот способ показывали: https://adndevblog.typepad.com/infrastructure/2013/04/get-cogopoint-label-text.html
Есть слабая надежда, что, может быть, в самых последних версиях что-то в этом плане поменялось. Но мне такое не попадалось.