Тема: Макрос на кнопку "копирование однострочного текста"
У кого есть готовый макрос на кнопку копирование однострочного текста. AutoCAD 2006. Спасибо.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → Настройка меню и DIESEL → Макрос на кнопку "копирование однострочного текста"
Чтобы отправить ответ, вы должны войти или зарегистрироваться
У кого есть готовый макрос на кнопку копирование однострочного текста. AutoCAD 2006. Спасибо.
Подожди, что там копировать-то, текст? Тогда какие особые требования к макросу по сравнению с командой "_Copy" ("Копировать")?
Да. Мало- мало автоматизировать процесс:
Клик по кнопке
Клик по первому тексту
Клик по второму тексту
Результат: первый текст заменяет второй.
Макрос не завершается.
Или, для простоты, макрос завершается.
Вот совершенно скороспелая заготовка без цикла, без учета изменения высоты текста:
(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) )
Замечательно. То, что нужно. Большое спасибо!
Добавить бы маленький штрих. "Чисто" для эргономики. Что- бы копируемый текст как- то подсвечивался. Может быть с задержой по времени. Секунды две. Что ли. Т.е. когда копируешь данные из таблицы, не потерятся в ней. Еще раз спасибо. Большая помощь.
> 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) )
Возможный макрос для кнопки или пункта меню:
^C^C^P(if (not C:T_T) (load "t_t")) T_T
> Владимир Громов
Ну вот и хорошо. Все замечательно работает. Я раньше работал в другом CAD е. Автоматизацию там сделал неплохую. А, в AutoCAD что- то трудновато мне. Другая концепция, другой язык. А может старею...:))) Большое спасибо за помощь.
> Владимир Громов
Я понимаю, что этот лисп всего-лишь набросок. Чтобы программа стала полноценной, надо сделать, чтобы перенос содержания был многократным, на н-ое кол-во текстов, до нажатия Enter. И, по желанию пользователя, парным. Надо, чтобы был взаимообмен между текстами и атрибутами. Такой программой я давно пользуюсь, но не могу ее выложить без разрешения автора. Но, думаю, для Владимира Громова не составит труда усилить программу в этом направлении.
Проблема! Перестала работать эта чудесная программа. То есть она работает в одном открытом файле, но в другом не хочет. Один и тот же сеанс работы. AutoCAD 2006.
Пожалуйста, помогите. Работы завал.
Я частично разобрался. Это приложение работает только с TTF фонтами, а с shx не хочет. Как бы его (приложение) поправить.
Разве LISP не работает с shx фонтами?
Да вообще-то работает... Ему по идее фиолетово - какой фонт. Он не обращается к фонту как таковому, он работает со значением текста. Может быть, на shx-фонтах используется невнятный какой-нибудь стиль? т.е. вместо "Стиль" стоит что-то вида "/U+001/U002" (ошибка может и там крыться)? попробуй, проверь...
---
Можешь прислать файлик, тоже не обижусь ;)
kpblc2000<<#>>yandex.ru
Я думаю, что так будет работать вне зависимости от стиля, высоты текста, типа шрифта и т.д.:
(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) )
А так наверное лучше и больше защита от ошибок:
(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) )
Кстати, в этом случае текст может быть вложенным в блок.
> kpblc
Штатный стиль RomanS.shx. Идет есств. с любым релизом AutoCAD.
Очень распространен в Западной Европе.
> Александр Ривилис
Спасибо. Сейчас буду пробовать.
стоп, стиль или фонт? У меня тут притащили файл с фонтами simplex.shx и txt.shx, а имена текстовых стилей (можно проверить по _style): "\U0128+\U3216" - в общем, файл сохраняли в dxf 12-го релиза, работали там, сохранили как dwg, а потом открыли в 2005. Весело было...
> Александр Ривилис
Теперь нормально работает. С TTF и shx. И с их комбинацией.
Единственое, что когда я выбираю не "Новый текст" ,а скажем сущность "Line", приложение не отрабатывает ошибку. Просто завершается его работа. В случае "Старый текст" - отрабатывает нормально. И соответственно выдает "Выбран не текст! Повторите". Для работы с таблицами- это существенно. Где тексты и линии расположены плотно.
> kpblc
Хм. Упустил этот момент. Сейчас проверю.
> kpblc
Вроде, все нормально. Я , вообще, исхожу из принципа необходимого минимума. Экзотическими фонтами не балуюсь. Названия стилей: по схеме "AM-1"; "AM-2" и т.д.
Тогда странно. Может, дело в поведении "_change"? Вообще-то вариант (entmod), который предложил Александр Ривилис? является более универсальным...
Правда, у меня не хватает мозгов на нормальное использование этого метода.
> 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
А отладочную печать:
(princ (cons 1 new_text))
убрать забыл :(
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → Настройка меню и DIESEL → Макрос на кнопку "копирование однострочного текста"
Форум работает на PunBB, при поддержке Informer Technologies, Inc