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

Вот теперь четко работает. Я уж мало- мало расстроился. К хорошему быстро привыкаешь:)))
Большое спасибо.

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

> Александр Ривилис
Вообще, если есть желание "зачистить" эту программу, могу пару штрихов отметить. По ходу работы возникли. Не критических. Осветить?

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

Давай.

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

> Александр Ривилис
Два момента. Исkлючительно субьективных.
1. Замена техтов производится только один раз. Программа завершает работу. Могу обосновать. Но муторно описывать спорные мелочи.
2. Реакция на ошибку. Пусть пр-ма пишет в ком. строке . Не мешает. Но, я туда не могу смотреть. Взгляд прикован к таблице с которой работаю. А, вот уши свободны.
Тем более в AutoCAD есть биппер. Очень удобно. у меня всегда включен.
Все.

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

Первое могу реализовать, хотя в начальной постановке шла речь о замене сразу нескольких текстов. Второе реализовывать не буду. Во-первых, не могу проверить. Первое, что сделал со своим PC - отключил динамик. Терпеть не могу лишнего шума.

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

> Александр Ривилис
Хорошо. Только по первому.

начальной постановке шла речь о замене сразу нескольких текстов

Это другая песня.  Речь шла о замене нескольких разных текстов.

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

Только для Вас :) :

(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)
)

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

> Александр Ривилис
Огромное спасибо! Мне кажется, что Вы даже не представляете насколько эффективна в работе эта программа. :).

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

> Forma
Неа... Не представляю... biggrin
Чукча не читатель, чукча - писатель...

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

> Александр Ривилис
Да. Есть маленький "антагонизм" между юзером  и программистом:)))
(в скобках и маленьким шрифтом: "Главное, что- бы этого не знал мой шеф") :))). Я про эффективность.

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

Тут у Вас с терминами путаница. smileУважающий себя программист старается написать эффективную программу, но так как он ею по долгу службы не пользуется, то насколько она эффективна и чего в ней не хватает он может узнать только от пользователей.
Так что "антагонизма" даже маленького я не вижу... Но это уже off-topic...

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

> Александр Ривилис
Точно так. Неудачно пошутил.:)

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

Я понимаю, что достал окончательно. Но хочется уже "зачистить" эту программу. Замена текста TTF на TTF и shs на TTF- без проблем. Как часы. А, вот shx на shx и TTF на shx не хочет работать. Копируемый текст
воспринимает как команду и пишет: XXXXXXX Unknown command "XXXXXXX".  Press F1 for help. Где XXXXXXX копируемый текст.

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

> Forma
Ничего не понял - у меня shx->shx работает как часы. Я только с ним и проверял. Но в моей программе не запускается ни одна команда, так что я вообще ничего не понимаю... sad

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

Только нужно куда-нибудь (например, после строки с (defun C:T_T ...) добавить (vl-load-com), хотя к появлению сообшения о неизвестной команде это никакого отношения не имеет, но при неправильном выборе вместо beep получите no function definition: VLR-BEEP-REACTION

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

Александр Ривилис пишет:

у меня shx->shx работает как часы

И у меня также было. Поэтому молчал и тихо радовался.
Это все начинается через один- два часа. Перезагрузка AutoCAD или системы не помогает. А иногда и сразу не работает. Моих юзерских мозгов не хватает понять проблему.

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

Никаких предположений. Попробуй установить cmdecho в 1 (т.е. добавь во вторую строку (setvar "CMDECHO" 1).
И когда появится ошибка Unknown command пришли протокол.

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

Стоп! А не может быть, что у тебя в какой-то ситуации запускается программа > Владимир Громов (2005-07-21 19:04:42) Вот она то как раз может выдавать сообщения об ошибке Unknown command. А имена у команд одинаковые.

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

> Александр Ривилис
Возможно. Сейчас проверю.

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

> Forma
Если это так, то расстрел на месте! biggrin

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

> Александр Ривилис
Действительно, программа В. Громова была в автозагрузке.
Я уже обрадовался. Однако, дальше хуже стало.
Привожу полностью то что есть на машине:
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)
)

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

> Александр Ривилис
Вот что мне не нравится, так то что при загрузке, AutoCAD пишет:
"AutoCAD menu utilities loaded._dwgprops ; error: bad argument type: numberp: nil""
Но остальные установленные приложения работают.

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

> 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

А что там еще не то в автозагрузке - понятия не имею.

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

Это не отсюда https://www.caduser.ru/forum/topic18835.html "рога ростут"?
Если да, значит и там где-то халтура.

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

> Александр Ривилис
Все. Super ! Спасибо. Выводы сделал:)  С учетом чистосердечных
выводов подрасстрельную статью можно заменить. Ну хотя бы на
3d-граненый стакан в dxf и врукопашную в Notepad :)))