Интерактивное перемещение текста атрибута блока

Автор Тема: Интерактивное перемещение текста атрибута блока  (Прочитано 21868 раз)

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

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

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
В том виде, в котором ты выложил код, происходит совсем другое
Не обратил внимание: разместил здесь код с ошибкой, а у себя проверял с нормальной последовательностью.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Не обратил внимание: разместил здесь код с ошибкой, а у себя проверял с нормальной последовательностью.
Исправь тогда, пожалуйста, и здесь тоже свой код на рабочий.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Создаётся текст, затем он же заносится в переменную temp_text, а потом он удаляется через (entdel temp_text).
Я вижу другое: сначала (setq temp_text (entlast)), потом создается текст.
Атрибут будет задаваться в окне и не сможет быть многострочным или с другим выравниванием.
Что и как показывается в окне - дело десятое. Сам атрибут может иметь признак многострочности. Соответственно обработка для него будет немного другой.
Кстати, как считаешь, можно ли в функцию-обработчик завершения программы, где идёт восстановление системных переменных, дописать PURGE all? Если идёт вставка блоков, когда каждый блок находится в отдельном файле (command "_insert" (strcat block_name ".dwg") nil), то потом во "Вставке" остаётся мусор с названиями файлов.
Я делал не так: через ObjectDBX открывается "библиотечный файл", и оттуда берется описание блока. Копирование через CoyObjects. В результате мусора - минимум.
Анонимные блоки, не имеющие вхождений, автоматически уничтожаются при закрытии файла (по-моему, сохранение их не убивает). Так что при нормальном подходе код, скорее всего, будет значительно больше и сложнее, но зато в файле dwg не будет ничего лишнего.
P.S. Я совсем упустил из виду вариант работы не в мировой системе координат... У тебя нигде не выполняется преобразование (ни координат, ни нормалей) - так и должно быть? Или возможны варианты?
Все, что сказано - личное мнение.

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

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

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

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

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Я совсем упустил из виду вариант работы не в мировой системе координат... У тебя нигде не выполняется преобразование (ни координат, ни нормалей) - так и должно быть? Или возможны варианты?
Я про различные системы даже не подумал. Как делать правильно?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Я про различные системы даже не подумал. Как делать правильно?
Изучай функцию (trans). В большинстве случаев тебе понадобится преобразование ПСК->МСК и МСК->ПСК, т.е.
Код - Auto/Visual Lisp [Выбрать]
  1. (trans p 1 0) ; ПСК->МСК (UCS->WCS)
  2. (trans p 0 1) ; МСК->ПСК (WCS->UCS)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Нну, по идее надо помнить, что при вставке некоторых примитивов (блоки, атрибуты, тексты, полилинии...) координаты для них могут (в зависимости от метода обработки и получения) показываться как в мировой системе координат, так и в системе координат объекта. При этом vla-функции, как правило, работают именно с мировой системой, а ename (насколько я помню) - с системой координат объекта. Поэтому постоянно приходится использовать функцию trans для преобразования одних координат в другие. При этом запросы точек getpoint вообще возвращает координаты в экранной системе (если не ошибаюсь). (getvar "laspoint") в какой системе вернет значения - не знаю, надо тестировать.
Сейчас точно не помню, но, по-моему, vla-get-insertionpoint для блока, текста и атрибута возвращают координаты в WSC. Надо проверять, а сейчас времени, к сожалению, нет.
Все, что сказано - личное мнение.

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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
При этом запросы точек getpoint вообще возвращает координаты в экранной системе (если не ошибаюсь).
В ПСК (UCS)
(getvar "laspoint") в какой системе вернет значения - не знаю, надо тестировать.
В ПСК (UCS)
Сейчас точно не помню, но, по-моему, vla-get-insertionpoint для блока, текста и атрибута возвращают координаты в WSC.
В МСК (WCS)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
Появилась неожиданная проблема в версиях 2015-2016:
Код - Auto/Visual Lisp [Выбрать]
  1. (while
  2.    (vl-catch-all-apply 'vl-cmdf (list "_-insert" block_name "_PX" 1"_PY" 1 pause 1 1 pause))
  3. ...
  4. )
Этот код в более ранних версиях AutoCAD выдавал при прерывании на Esc nil, что препятствовало дальнейшему выполнению кода ниже. А в 2015-2016 почему-то возвращается T.

Как с этим бороться?  :-\

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
А если попробовать заменить vl-cmdf на command или command-s (с проверкой entlast)?
P.S. К сожалению, сейчас не могу предложить ничего иного. Если найду время - попробую что-нибудь придумать.
Все, что сказано - личное мнение.

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

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

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

  • ADN OPEN
  • **
  • Сообщений: 57
  • Карма: 1
А если попробовать заменить vl-cmdf на command или command-s
Они в любом случае (при выполнении и прерывании) выдадут nil, а vl-catch-all-apply при прерывании ошибку не почувствует.
с проверкой entlast
Спасибо за совет! Вроде, помогла такая форма:
Код - Auto/Visual Lisp [Выбрать]
  1. (setq entl_entity (entlast)); Последний вставленный примитив
  2. (if entl_entity
  3.   (progn
  4.     (vl-catch-all-apply 'vl-cmdf (list "_-insert" block_name pause 1 1 pause))
  5.     (if (eq entl_entity (entlast)) nil T); Если после insert последний примитив изменился (вставка удалась), возвращаем Т
  6.   );progn
  7.   (progn
  8.     (vl-catch-all-apply 'vl-cmdf (list "_-insert" block_name pause 1 1 pause))
  9.     (if (entlast) T nil); Если это был первый вставленный на чертеже блок, и вставка удалась (появился entlast), возвращаем Т
  10.   );progn
  11. );if

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

  • Administrator
  • *****
  • Сообщений: 1115
  • Карма: 173
Сугубо ИМХО: а зачем лишние if? Может быть (код не проверял!) сработает и такая конструкция:
Код - Auto/Visual Lisp [Выбрать]
  1. (setq entl_entity (entlast)) ; Последний вставленный примитив
  2. (if entl_entity
  3.   (progn (vl-catch-all-apply 'vl-cmdf (list "_-insert" block_name pause 1 1 pause))
  4.          (eq entl_entity (entlast))
  5.          ) ;_ end of progn
  6.   (progn (vl-catch-all-apply 'vl-cmdf (list "_-insert" block_name pause 1 1 pause)) (entlast))
  7.   ) ;_ end of if
« Последнее редактирование: 12-03-2016, 22:04:59 от Александр Ривилис »
Все, что сказано - личное мнение.

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

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