Как обновить положение выноски, в след за перемещением связанного с неё текстом?

Автор Тема: Как обновить положение выноски, в след за перемещением связанного с неё текстом?  (Прочитано 10512 раз)

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

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

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
Здравствуйте, стоит задача создать выноску с заранее определенным текстом.
Раньше строил выноску, и сначала предлагал пользователю указать положение полки, а потом вставлял текст.
Код - Auto/Visual Lisp [Выбрать]
  1.  (VL-cmdf "_leader"
  2.               "none"
  3.               koord
  4.               pause
  5.               ""
  6.               "Пример"
  7.               ""
  8.      )
Но гораздо удобнее размещать полку с уже написанным текстом, когда видно габариты текста.
Код - Auto/Visual Lisp [Выбрать]
  1. (defun c:new_leader (/ koord ent_last leader text ent_text gr code)
  2.   (while
  3.     (setq koord (getpoint "\nТочка <Выход>"))
  4.      (setq ent_last (entlast))
  5.      (VL-cmdf "_leader"
  6.               "none"
  7.               koord
  8.               (polar koord (/ pi 4.0) 10)
  9.               ""
  10.               "Пример"
  11.               ""
  12.      )
  13.      (if ent_last
  14.        (setq leader   (entnext ent_last)
  15.              text     (entnext leader)
  16.              ent_text (entget text)
  17.        )
  18.        (setq leader   (entnext)
  19.              text     (entnext leader)
  20.              ent_text (entget text)
  21.        )
  22.      )
  23.      (while
  24.        (progn
  25.          (setq gr    (grread 't 13 0)
  26.                code  (car gr)
  27.                koord (trans (cadr gr) 1 0)
  28.          )
  29.          (cond
  30.            ((= code 5)
  31.             (entmod
  32.               (subst (cons 10 koord) (assoc 10 ent_text) ent_text)
  33.             )
  34.             (entupd leader)
  35.             t
  36.            )
  37.            ((or (= code 3) (= code 25))
  38.             (entmod
  39.               (subst (cons 10 koord) (assoc 10 ent_text) ent_text)
  40.             )
  41.             (vla-update (vlax-ename->vla-object leader))
  42.             nil
  43.            )
  44.          )
  45.        )
  46.      )    
  47.      (entupd leader)
  48.   )
  49. )
В итоге, за курсором бегает текст, а выноска стоит на месте, до тех пор, пока не начнём строить новую выноску, или не завершим функцию. Пробовал и entupd и vla-update ни чего не выходит. Но ведь как-то сам AutoCAD её обновляет?
Под рукой только AutoCAD2017.

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Но ведь как-то сам AutoCAD её обновляет?
Конечно. Потому что он не использует для этой цели Lisp, а мощь JIG, доступную в ObjectARX и .NET. Ты в своём коде обновляешь только MTEXT, а обновление самого LEADER возникает только когда срабатывают реакторы (конец команды или запуск другой команды). Можешь самостоятельно обновлять не только MTEXT, но и LEADER. Там куча групп 10, так что будет не так просто через DXF и ненамного проще через vla-object. Интересный пример кода для построения LEADER (и не только) можешь подсмотреть здесь: https://www.theswamp.org/index.php?topic=29245.0
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1116
  • Карма: 173
Попробуй не через entmode, а через ActiveX с последующим vla-update изменять выноску.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
Попробуй не через entmode, а через ActiveX с последующим vla-update изменять выноску.
Я выноску вообще не трогал, я изменял, текст и ждал когда выноска с реактит вслед за текстом.
Попробовал изменять и координаты выноски, через ActiveX всё получилось, но там только 2 координаты, т.е. полка двигается за текстом, но направление право\лева не меняется, только после обновления, в свойствах выноски не нашёл параметра отвечающего за направление полки.
Глянул код по ссылки Александра, там меняют координаты выноски через entmode, там их как раз уже 3, т.е. меняя местами 2-ю и 3-ю, можно менять направление полки, позже так и попробую.

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Глянул код по ссылки Александра, там меняют координаты выноски через entmode, там их как раз уже 3, т.е. меняя местами 2-ю и 3-ю, можно менять направление полки, позже так и попробую.
Насколько я понимаю, после изменения LEADER разрывается связь между ним и MTEXT. Поэтому предлагаю после указания положения MTEXT удалять его и LEADER и добавлять LEADER (командой) по новой, но уже в нужном месте.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1116
  • Карма: 173
По-моему, не разрывается. Annotation по прежнему указывает на аннотацию. Просто полка может оказаться "отнесенной" неизвестно куда.
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Просто полка может оказаться "отнесенной" неизвестно куда.
Я именно это и имел в виду. И полка больше не двигается за текстом. Т.е. связь LEADER -> MTEXT работает, а MTEXT -> LEADER - нет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Алексей Кулик

  • Administrator
  • *****
  • Сообщений: 1116
  • Карма: 173
В качестве первого приближения (к сожалению, не помню, какие системные переменные отвечают за отступы аннотации от полки выноски, а сейчас искать уже не могу. Потребуется для корректного вычисления положения аннотации при grread)
Все, что сказано - личное мнение.

Правила форума существуют не просто так!

Приводя в сообщении код, не забывайте про его форматирование!

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

  • ADN Club
  • ****
  • Сообщений: 270
  • Карма: 24
  • Геодезист
Насколько я понимаю, после изменения LEADER разрывается связь между ним и MTEXT. Поэтому предлагаю после указания положения MTEXT удалять его и LEADER и добавлять LEADER (командой) по новой, но уже в нужном месте.
Вроде не разрывается.
В общем построил, как Алексей предложил, а дальше код Andrea помог, до полки можно добраться только через entmode, там есть координаты 2-х точек полки, её длинна, и направление. анализирую положение курсора, меняю эти значения и всё работает красиво.
Всем спасибо, код не привожу, там ещё куча всего лишнего, и не очень красивого  :-\
Получилось вот так: если кликнуть gif'ка покажет.