Тема: Макрос на кнопку "копирование однострочного текста"

У кого есть готовый макрос на кнопку  копирование однострочного текста. AutoCAD 2006. Спасибо.

Re: Макрос на кнопку "копирование однострочного текста"

Подожди, что там копировать-то, текст? Тогда какие особые требования к макросу по сравнению с командой "_Copy" ("Копировать")?

Re: Макрос на кнопку "копирование однострочного текста"

Да. Мало- мало автоматизировать процесс:
Клик по кнопке
Клик по первому тексту
Клик по второму тексту
Результат: первый текст заменяет второй.
Макрос не завершается.

Re: Макрос на кнопку "копирование однострочного текста"

Или, для простоты, макрос завершается.

Re: Макрос на кнопку "копирование однострочного текста"

Вот совершенно скороспелая заготовка без цикла, без учета изменения высоты текста:

(defun C:T_T ( / new_text)
(princ "\n Выберите новый текст: ")
(setq new_text (cdr (assoc 1 (entget (car (entsel))))))
(princ "\n Выберите старый текст: ")
(command "_CHANGE" pause "" "" "" "" "" "" new_text)
(princ)
)

Re: Макрос на кнопку "копирование однострочного текста"

Замечательно. То, что нужно. Большое спасибо!
Добавить бы маленький штрих. "Чисто" для эргономики. Что- бы копируемый текст как- то подсвечивался. Может быть с задержой по времени. Секунды две.  Что ли. Т.е. когда копируешь данные из таблицы, не потерятся в ней.  Еще раз спасибо. Большая помощь.

Re: Макрос на кнопку "копирование однострочного текста"

> Forma
Вот подправленная программа:

;********* t_t.lsp Замена одного текста другим *******
;                  с подсветкой нового текста
(defun C:T_T ( / new_text ss)
(setq ss (car (entsel "\n Выберите новый текст: ")))
(setq new_text (cdr (assoc 1 (entget ss))))
(redraw ss 3)
(princ "\n Выберите старый текст: ")
(command "_CHANGE" pause "" "" "" "" "" "" new_text)
(redraw ss 4)
(princ)
)

Re: Макрос на кнопку "копирование однострочного текста"

Возможный макрос для кнопки или пункта меню:

^C^C^P(if (not C:T_T) (load "t_t")) T_T

Re: Макрос на кнопку "копирование однострочного текста"

> Владимир Громов
Ну вот и хорошо. Все замечательно работает. Я раньше работал в другом CAD е. Автоматизацию там сделал неплохую. А, в AutoCAD что- то трудновато мне. Другая концепция, другой язык. А может старею...:))) Большое спасибо за помощь.

Re: Макрос на кнопку "копирование однострочного текста"

> Владимир Громов
Я понимаю, что этот лисп всего-лишь набросок. Чтобы программа стала полноценной, надо сделать, чтобы перенос содержания был многократным, на н-ое кол-во текстов, до нажатия Enter. И, по желанию пользователя, парным. Надо, чтобы был взаимообмен между текстами и атрибутами. Такой программой я давно пользуюсь, но не могу ее выложить без разрешения автора. Но, думаю, для Владимира Громова не составит труда усилить программу в этом направлении.

Re: Макрос на кнопку "копирование однострочного текста"

Проблема! Перестала работать эта чудесная программа. То есть она работает в одном открытом файле, но в другом не хочет. Один и тот же сеанс работы. AutoCAD 2006.
Пожалуйста, помогите. Работы завал.

Re: Макрос на кнопку "копирование однострочного текста"

Я частично разобрался. Это приложение работает только с TTF фонтами, а с shx не хочет. Как бы его (приложение) поправить.

Re: Макрос на кнопку "копирование однострочного текста"

Разве LISP не работает с shx фонтами?

Re: Макрос на кнопку "копирование однострочного текста"

Да вообще-то работает... Ему по идее фиолетово - какой фонт. Он не обращается к фонту как таковому, он работает со значением текста. Может быть, на shx-фонтах используется невнятный какой-нибудь стиль? т.е. вместо "Стиль" стоит что-то вида "/U+001/U002" (ошибка может и там крыться)? попробуй, проверь...
---
Можешь прислать файлик, тоже не обижусь ;)
kpblc2000<<#>>yandex.ru

Re: Макрос на кнопку "копирование однострочного текста"

Я думаю, что так будет работать вне зависимости от стиля, высоты текста, типа шрифта и т.д.:

(defun C:T_T ( / new_text ss ss1 e)
  (setq ss (car (entsel "\nВыберите новый текст: ")))
  (setq new_text (cdr (assoc 1 (entget ss))))
  (redraw ss 3)
  (setq ss1 (car (entsel "\nВыберите старый текст: ")))
  (setq e (entget ss1))
  (entmod (subst (cons 1 new_text) (assoc 1 e) e))
  (entupd ss1)
  (redraw ss 4)
  (princ)
)

Re: Макрос на кнопку "копирование однострочного текста"

А так наверное лучше и больше защита от ошибок:

(defun C:T_T ( / new_text ss ss1 e)
  (setq ss (car (nentsel "\nВыберите новый текст: ")))
  (setq new_text (cdr (assoc 1 (entget ss))))
  (if new_text (progn ;; А текст ли выбран?
    (princ (strcat "\nНовый текст: <" new_text ">"))
    (redraw ss 3)
    (while (setq ss1 (car (nentsel "\nВыберите старый текст (ENTER-завершение): ")))
      (setq e (entget ss1))
      (cond
       ((assoc 1 e)
         (princ (cons 1 new_text))
         (entmod (subst (cons 1 new_text) (assoc 1 e) e))
         (entupd ss1)
       )
       (T
         (princ "\nВыбран не текст! Повторите.")
       )
      )
    )
    (redraw ss 4)
  )) ;; (if (progn
  (princ)
)

Кстати, в этом случае текст может быть вложенным в блок.

Re: Макрос на кнопку "копирование однострочного текста"

> kpblc
Штатный стиль RomanS.shx. Идет есств. с любым релизом AutoCAD.
Очень распространен в Западной Европе.

Re: Макрос на кнопку "копирование однострочного текста"

> Александр Ривилис
Спасибо. Сейчас буду пробовать.

Re: Макрос на кнопку "копирование однострочного текста"

стоп, стиль или фонт? У меня тут притащили файл с фонтами simplex.shx и txt.shx, а имена текстовых стилей (можно проверить по _style): "\U0128+\U3216" - в общем, файл сохраняли в dxf 12-го релиза, работали там, сохранили как dwg, а потом открыли в 2005. Весело было...

Re: Макрос на кнопку "копирование однострочного текста"

> Александр Ривилис
Теперь нормально работает. С TTF и shx. И с их комбинацией.
Единственое, что когда я выбираю не "Новый текст" ,а скажем сущность "Line", приложение не отрабатывает ошибку. Просто завершается его работа. В случае "Старый текст" - отрабатывает нормально. И соответственно выдает "Выбран не текст! Повторите". Для работы с таблицами- это существенно. Где тексты и линии расположены плотно.

Re: Макрос на кнопку "копирование однострочного текста"

> kpblc
Хм. Упустил этот момент. Сейчас проверю.

Re: Макрос на кнопку "копирование однострочного текста"

> kpblc
Вроде, все нормально. Я , вообще, исхожу из принципа необходимого минимума. Экзотическими фонтами не балуюсь. Названия стилей: по схеме "AM-1"; "AM-2" и т.д.

Re: Макрос на кнопку "копирование однострочного текста"

Тогда странно. Может, дело в поведении "_change"? Вообще-то вариант (entmod), который предложил Александр Ривилис? является более универсальным...
Правда, у меня не хватает мозгов на нормальное использование этого метода.

Re: Макрос на кнопку "копирование однострочного текста"

> Forma
Добавил еще проверки:

(defun C:T_T ( / new_text ss ss1 e flag_sel_new)
  (while (null flag_sel_new)
    (setq ss (car (nentsel "\nВыберите новый текст (ENTER-завершение): ")))
    (cond
      ((and (null ss) (= (getvar "ERRNO") 52))
        (setq flag_sel_new T) ;; Нажато ENTER - выход
      )
      ((null ss)
        (princ "\nНичего не выбрано! Повторите.")
      )
      (t
        (cond
         ((setq new_text (cdr (assoc 1 (entget ss))))
           (setq flag_sel_new T) ;; Выбран текст - выходим из цикла
         )
         (T
          (princ "\nВыбран не текст! Повторите.")
         )
        )
      )
    )
  ) ;; endof (while
  (if new_text (progn ;; А текст ли выбран?
    (princ (strcat "\nНовый текст: <" new_text ">"))
    (redraw ss 3)
    (while (or (setq ss1 (car (nentsel "\nВыберите старый текст (ENTER-завершение): "))) (/= (getvar "ERRNO") 52))
      (cond
        (ss1
          (setq e (entget ss1))
          (cond
           ((assoc 1 e)
             (princ (cons 1 new_text))
             (entmod (subst (cons 1 new_text) (assoc 1 e) e))
             (entupd ss1)
           )
           (T
             (princ "\nВыбран не текст! Повторите.")
           )
          )
        )
        (T
          (princ "\nНичего не выбрано! Повторите.")
        )
      ) ;; (cond
    )
    (redraw ss 4)
  )) ;; (if (progn
  (princ)
)

А change может не работать по другим причинам - нужно исследовать последовательность запросов в конкретном случае в конкретном AutoCAD

Re: Макрос на кнопку "копирование однострочного текста"

А отладочную печать:

          (princ (cons 1 new_text))

убрать забыл :(