Re: Макрос на кнопку "копирование однострочного текста"
Вот теперь четко работает. Я уж мало- мало расстроился. К хорошему быстро привыкаешь:)))
Большое спасибо.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → Настройка меню и DIESEL → Макрос на кнопку "копирование однострочного текста"
Вот теперь четко работает. Я уж мало- мало расстроился. К хорошему быстро привыкаешь:)))
Большое спасибо.
> Александр Ривилис
Вообще, если есть желание "зачистить" эту программу, могу пару штрихов отметить. По ходу работы возникли. Не критических. Осветить?
> Александр Ривилис
Два момента. Исkлючительно субьективных.
1. Замена техтов производится только один раз. Программа завершает работу. Могу обосновать. Но муторно описывать спорные мелочи.
2. Реакция на ошибку. Пусть пр-ма пишет в ком. строке . Не мешает. Но, я туда не могу смотреть. Взгляд прикован к таблице с которой работаю. А, вот уши свободны.
Тем более в AutoCAD есть биппер. Очень удобно. у меня всегда включен.
Все.
Первое могу реализовать, хотя в начальной постановке шла речь о замене сразу нескольких текстов. Второе реализовывать не буду. Во-первых, не могу проверить. Первое, что сделал со своим PC - отключил динамик. Терпеть не могу лишнего шума.
> Александр Ривилис
Хорошо. Только по первому.
начальной постановке шла речь о замене сразу нескольких текстов
Это другая песня. Речь шла о замене нескольких разных текстов.
Только для Вас :) :
(defun C:T_T ( / new_text ss ss1 e flag_sel_new flag_sel_old) (while (null flag_sel_new) (setvar "ERRNO" 0) (setq ss (car (nentsel "\nВыберите новый текст (ENTER-завершение): "))) (cond ;; Нажато ENTER - выход ((and (null ss) (= (getvar "ERRNO") 52)) (setq flag_sel_new T)) ((null ss) (princ "\nНичего не выбрано! Повторите.") (vlr-beep-reaction) ) (t (cond ;; Выбран текст - выходим из цикла ((setq new_text (cdr (assoc 1 (entget ss)))) (setq flag_sel_new T)) (T (princ "\nВыбран не текст! Повторите.") (vlr-beep-reaction) ) ) ) ) ) ;; endof (while (if new_text (progn ;; А текст ли выбран? (princ (strcat "\nНовый текст: <" new_text ">")) (redraw ss 3) (while (null flag_sel_old) (setvar "ERRNO" 0) (setq ss1 (nentsel "\nВыберите старый текст (ENTER-завершение): ")) (cond ((or (null ss1) (= (getvar "ERRNO") 7)) (princ "\nНичего не выбрано! Повторите.") (vlr-beep-reaction) ) (T (setq e (entget (car ss1))) (cond ((assoc 1 e) (entmod (subst (cons 1 new_text) (assoc 1 e) e)) ;; Если это блок - нужно его обновить, ;; если не блок, то обновляем только сам примитив (cond ((cadddr ss1) (entupd (car (cadddr ss1)))) (T (entupd (car ss1))) ) (setq flag_sel_old T) ) (T (princ "\nВыбран не текст! Повторите.") (vlr-beep-reaction) ) ) ) ) ;; (cond ) (redraw ss 4) )) ;; (if (progn (princ) )
> Александр Ривилис
Огромное спасибо! Мне кажется, что Вы даже не представляете насколько эффективна в работе эта программа. :).
> Forma
Неа... Не представляю...
Чукча не читатель, чукча - писатель...
> Александр Ривилис
Да. Есть маленький "антагонизм" между юзером и программистом:)))
(в скобках и маленьким шрифтом: "Главное, что- бы этого не знал мой шеф") :))). Я про эффективность.
Тут у Вас с терминами путаница. Уважающий себя программист старается написать эффективную программу, но так как он ею по долгу службы не пользуется, то насколько она эффективна и чего в ней не хватает он может узнать только от пользователей.
Так что "антагонизма" даже маленького я не вижу... Но это уже off-topic...
> Александр Ривилис
Точно так. Неудачно пошутил.:)
Я понимаю, что достал окончательно. Но хочется уже "зачистить" эту программу. Замена текста TTF на TTF и shs на TTF- без проблем. Как часы. А, вот shx на shx и TTF на shx не хочет работать. Копируемый текст
воспринимает как команду и пишет: XXXXXXX Unknown command "XXXXXXX". Press F1 for help. Где XXXXXXX копируемый текст.
> Forma
Ничего не понял - у меня shx->shx работает как часы. Я только с ним и проверял. Но в моей программе не запускается ни одна команда, так что я вообще ничего не понимаю...
Только нужно куда-нибудь (например, после строки с (defun C:T_T ...) добавить (vl-load-com), хотя к появлению сообшения о неизвестной команде это никакого отношения не имеет, но при неправильном выборе вместо beep получите no function definition: VLR-BEEP-REACTION
у меня shx->shx работает как часы
И у меня также было. Поэтому молчал и тихо радовался.
Это все начинается через один- два часа. Перезагрузка AutoCAD или системы не помогает. А иногда и сразу не работает. Моих юзерских мозгов не хватает понять проблему.
Никаких предположений. Попробуй установить cmdecho в 1 (т.е. добавь во вторую строку (setvar "CMDECHO" 1).
И когда появится ошибка Unknown command пришли протокол.
Стоп! А не может быть, что у тебя в какой-то ситуации запускается программа > Владимир Громов (2005-07-21 19:04:42) Вот она то как раз может выдавать сообщения об ошибке Unknown command. А имена у команд одинаковые.
> Александр Ривилис
Возможно. Сейчас проверю.
> Forma
Если это так, то расстрел на месте!
> Александр Ривилис
Действительно, программа В. Громова была в автозагрузке.
Я уже обрадовался. Однако, дальше хуже стало.
Привожу полностью то что есть на машине:
Command: ; error: bad argument type: numberp: nil
Command: Unknown command "T_T". Press F1 for help.
макро на кнопке:
^C^C^P(if (not C:T_T) (load "t_t")) T_T
И собствено, программа в C:\Program Files\AutoCAD 2006\Support\t_t.lsp:
defun C:T_T ( / new_text ss ss1 e flag_sel_new flag_sel_old) (while (null flag_sel_new) (setvar "ERRNO" 0) (setq ss (car (nentsel "\nВыберите новый текст (ENTER-завершение): "))) (cond ;; Нажато ENTER - выход ((and (null ss) (= (getvar "ERRNO") 52)) (setq flag_sel_new T)) ((null ss) (princ "\nНичего не выбрано! Повторите.") (vlr-beep-reaction) ) (t (cond ;; Выбран текст - выходим из цикла ((setq new_text (cdr (assoc 1 (entget ss)))) (setq flag_sel_new T)) (T (princ "\nВыбран не текст! Повторите.") (vlr-beep-reaction) ) ) ) ) ) ;; endof (while (if new_text (progn ;; А текст ли выбран? (princ (strcat "\nНовый текст: <" new_text ">")) (redraw ss 3) (while (null flag_sel_old) (setvar "ERRNO" 0) (setq ss1 (nentsel "\nВыберите старый текст (ENTER-завершение): ")) (cond ((or (null ss1) (= (getvar "ERRNO") 7)) (princ "\nНичего не выбрано! Повторите.") (vlr-beep-reaction) ) (T (setq e (entget (car ss1))) (cond ((assoc 1 e) (entmod (subst (cons 1 new_text) (assoc 1 e) e)) ;; Если это блок - нужно его обновить, ;; если не блок, то обновляем только сам примитив (cond ((cadddr ss1) (entupd (car (cadddr ss1)))) (T (entupd (car ss1))) ) (setq flag_sel_old T) ) (T (princ "\nВыбран не текст! Повторите.") (vlr-beep-reaction) ) ) ) ) ;; (cond ) (redraw ss 4) )) ;; (if (progn (princ) )
> Александр Ривилис
Вот что мне не нравится, так то что при загрузке, AutoCAD пишет:
"AutoCAD menu utilities loaded._dwgprops ; error: bad argument type: numberp: nil""
Но остальные установленные приложения работают.
> Forma
Куда левую скобку скобку дел в первой строке перед defun? Расстрел на месте!
Это в файл T_T.lsp
(defun C:T_T (/ new_text ss ss1 e flag_sel_new flag_sel_old) (vl-load-com) (while (null flag_sel_new) (setvar "ERRNO" 0) (setq ss (car (nentsel "\nВыберите новый текст (ENTER-завершение): "))) (cond ;; Нажато ENTER - выход ((and (null ss) (= (getvar "ERRNO") 52)) (setq flag_sel_new T) ) ((null ss) (princ "\nНичего не выбрано! Повторите.") (vlr-beep-reaction) ) (t (cond ;; Выбран текст - выходим из цикла ((setq new_text (cdr (assoc 1 (entget ss)))) (setq flag_sel_new T) ) (T (princ "\nВыбран не текст! Повторите.") (vlr-beep-reaction) ) ) ;_ end of cond ) ) ;_ end of cond ) ;_ end of while (if new_text (progn ;; А текст ли выбран? (princ (strcat "\nНовый текст: <" new_text ">")) (redraw ss 3) (while (null flag_sel_old) (setvar "ERRNO" 0) (setq ss1 (nentsel "\nВыберите старый текст (ENTER-завершение): ")) (cond ((or (null ss1) (= (getvar "ERRNO") 7)) (princ "\nНичего не выбрано! Повторите.") (vlr-beep-reaction) ) (T (setq e (entget (car ss1))) (cond ((assoc 1 e) (entmod (subst (cons 1 new_text) (assoc 1 e) e)) ;; Если это блок - нужно его обновить, ;; если не блок, то обновляем только сам примитив (cond ((cadddr ss1) (entupd (car (cadddr ss1)))) (T (entupd (car ss1))) ) ;_ end of cond (setq flag_sel_old T) ) (T (princ "\nВыбран не текст! Повторите.") (vlr-beep-reaction) ) ) ;_ end of cond ) ) ;_ end of cond ) ;_ end of while (redraw ss 4) ) ;_ end of progn ) ;_ end of if (princ) ) ;_ end of defun
Это на кнопку:
^C^C^P(if (null C:T_T) (load "T_T")) T_T ^P
А что там еще не то в автозагрузке - понятия не имею.
Это не отсюда https://www.caduser.ru/forum/topic18835.html "рога ростут"?
Если да, значит и там где-то халтура.
> Александр Ривилис
Все. Super ! Спасибо. Выводы сделал:) С учетом чистосердечных
выводов подрасстрельную статью можно заменить. Ну хотя бы на
3d-граненый стакан в dxf и врукопашную в Notepad :)))
Форумы CADUser → Программирование → Настройка меню и DIESEL → Макрос на кнопку "копирование однострочного текста"
Форум работает на PunBB, при поддержке Informer Technologies, Inc