Как получить составные объекты метки?

Автор Тема: Как получить составные объекты метки?  (Прочитано 5772 раз)

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 106
  • Карма: 3
Здравствуйте! Подскажите как добраться до ObjectId объектов из которых состоит сложный объект автокада или Civil3D? Например метка поверхности состоит из MText и Leader (выноска), если её расчленить. Как можно работать с выноской напрямую? Например чтобы добраться до координат её вершин и т.п.

Оффлайн Вильдар

  • ADN Club
  • ****
  • Сообщений: 405
  • Карма: 77
  • Skype: vildar82
Сложный объект - это же custom entity - как он сделан зависит от создателя.
Наверно можно только разбить сложный объект и получить кучу примитивов  ;D

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

  • ADN OPEN
  • ***
  • Сообщений: 106
  • Карма: 3
Наверно можно только разбить сложный объект и получить кучу примитивов 
Думал об этом, расчленить, получить Id нужного объекта, потом отменить транзакцию. Но это какой-то очень неправильный путь. У метки через точку можно получить BlockId, я так понимаю это BlockReference, если не ошибаюсь. Может из него можно как-то получить составные части? Но через точку, кроме атрибутов я там ничего не смог получить.

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

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

Отмечено как Решение Павел55 01-12-2019, 09:55:58

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
Например метка поверхности состоит из MText и Leader (выноска), если её расчленить. Как можно работать с выноской напрямую? Например чтобы добраться до координат её вершин и т.п.
С метками в Civil 3D сложная ситуация. Через API Civil 3D можно получить некоторые её свойства напрямую, но именно сами текстовые значения - нет. Помогает только Explode. Вот пример: https://adndevblog.typepad.com/infrastructure/2013/04/get-cogopoint-label-text.html
Про координаты вершин что-то не понял. Какие вершины у метки?

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

  • ADN OPEN
  • ***
  • Сообщений: 106
  • Карма: 3
Про координаты вершин что-то не понял. Какие вершины у метки?
У метки когда она в смещённом положении рисуется выноска (объект типа Leader), и у неё есть вершины.

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

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

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 735
У метки когда она в смещённом положении рисуется выноска (объект типа Leader), и у неё есть вершины.
Есть такое. См. следующие ссылки:
- Label.Location: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/c21cf97b-aee1-0047-3399-b376796bfbfd.htm
- Label.AnchorInfo: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/b2b734b9-715e-4e65-1e76-cf9cba33d4db.htm
- AnchorInfo.Location: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/4c68f045-50f0-62a9-92f8-168db628680a.htm

P.S.
Определить, что метка является смещённой: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/02b99712-a296-0dce-1008-a0a75c718a8d.htm
Теория по теме (на английском): https://civilizeddevelopment.typepad.com/civilized-development/2013/08/dragging-labels-in-2014.html

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

  • ADN OPEN
  • ***
  • Сообщений: 106
  • Карма: 3
https://adndevblog.typepad.com/infrastructure/2013/04/get-cogopoint-label-text.html
но используя метод Entity.Explode, ты можешь получить объекты
Этот метод возвращает коллекцию объектов без ObjectId, т.е. как бы это копии объектов из которых состоит блок, но не сами эти объекты. В официальном гиде пишут, что если вы хотите вносить в эти объекты изменения, то должны стерать оригинальный объект, а новый заносить в БД на чертёж. Но внутри метки, я подозреваю, просто взять и подменить объект не получится. А методов изменяющих положение выноски (Leader) через точку не меняя положения самой метки тоже нет.
Есть такое. См. следующие ссылки:
- Label.Location: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/c21cf97b-aee1-0047-3399-b376796bfbfd.htm
- Label.AnchorInfo: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/b2b734b9-715e-4e65-1e76-cf9cba33d4db.htm
- AnchorInfo.Location: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/4c68f045-50f0-62a9-92f8-168db628680a.htm

P.S.
Определить, что метка является смещённой: http://docs.autodesk.com/CIV3D/2019/ENU/API_Reference_Guide/html/02b99712-a296-0dce-1008-a0a75c718a8d.htm
Теория по теме (на английском): https://civilizeddevelopment.typepad.com/civilized-development/2013/08/dragging-labels-in-2014.html
Спасибо, буду углубляться в материал.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Но внутри метки, я подозреваю, просто взять и подменить объект не получится.
До сих пор ничего небыло сказано про изменение - речь шла только про получение информации. Безусловно этот метод не поможет в изменении свойств метки. Свойства метки можно менять только через её API. Если тех свойств, на которые указал Дмитрий Загорулькин будет недостаточно можно еще исследовать DXF-коды метки. Иногда изменения DXF-кодов позволяют изменить свойства объектов. Но это будет недокументированное поведение.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ***
  • Сообщений: 106
  • Карма: 3
изменения DXF-кодов позволяют изменить свойства объектов
Исследовал DXF коды, там нельзя добраться до вершин выноски, но в итоге получилось получить нужный эффект через метод .MoveStretchPointsAt, который позвозяет получить доступ к вершинам выноски через ручки объекта. Однако возникает одна дополнительная проблема, не знаю нужно ли создавать отдельную тему?
Если выполнять этот метод в событии объекта, то метод не срабатывает. Я так понимаю потому что объект блокируется, или типа того, во время срабатывания события. Не могу понять как это обойти.

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

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

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

  • ADN OPEN
  • ***
  • Сообщений: 106
  • Карма: 3
В событии объекта сохранять его ObjectId, а модификацию выполнять в другом событии (не объекта).
В событиии Modified выполняю рассчёты и сохраняю их в поле объекта. В событии Application.Idle проверяю флаг на изменение объекта и там же его модифицирую. Не знаю насколько это оптимально, но напоминает Update() в Unity3D. Спасибо за подсказку)
В итоге удалось добиться нужного поведения.