Тема: LISP. Копирование однострочного текста из одного примитива в другие

;-------------------------------------------------------------
; Файл: CPY_TXT1.LSP
; Команда: CPY_TXT1
;
; Используется для копирования текста из одного примитива
; в другой (уже существующий).
; Примитивы могут содержаться в блоках. Это могут быть как
; обычные тексты (TEXT), так и мультитексты (MTEXT) или
; атрибуты (ATTRIB)
;
; Макрос для вставки в меню:
; ^C^C(if (null C:CPY_TXT1) (load "CPY_TXT1.LSP")) CPY_TXT1;
;
; Автор: Ривилис А.Н. (в соавторстве с Forma)
;-------------------------------------------------------------
(defun C:CPY_TXT1 (/ 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 (vl-catch-all-apply
            'nentsel (list "\nВыберите старый текст (ENTER-завершение): ")))
         (cond
           ((and (null ss1) (= (getvar "ERRNO") 7))
            (princ "\nНичего не выбрано! Повторите.")
            (vlr-beep-reaction)
           )
           ((/= (type ss1) 'LIST)
            (setq flag_sel_old T)
           )
           (T
            (setq e (entget (car ss1)))
            (cond
              ((assoc 1 e)
               (vla-StartUndoMark (vla-get-activedocument (vlax-get-acad-object)))
               (entmod (subst (cons 1 new_text) (assoc 1 e) e))
               ;; Если это блок - нужно его обновить,
               ;; если не блок, то обновляем только сам примитив
               (cond
                 ((cadddr ss1) (entupd (car (cadddr ss1))))
                 (T            (entupd (car ss1)))
               ) ;_ end of cond
               (vla-EndUndoMark (vla-get-activedocument (vlax-get-acad-object)))
              )
              (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

Re: LISP. Копирование однострочного текста из одного примитива в другие

Прога - что надо!
Гюк замечен только один: не работает с MTEXT большого объема. Но такие монстры попадаются редко, да и редактировать их надо не впопыхах.
В общем, СПАСИБО!

Re: LISP. Копирование однострочного текста из одного примитива в другие

> kp
В названии программы заложена область ее применения: "Копирование однострочного текста...
Так что с длинными MTEXT она и не должна работать.

Re: LISP. Копирование однострочного текста из одного примитива в другие

Время прошло достаточно... Программа показала себя в интенсивной работе с наилучшей стороны. Наступила "историческая" необходимость дополнить эту программу.
А именно: ...исходный текст копировать на несколько текстов кликами и (или) секущей рамкой. Окончание процедуры по правому щелчку мыши.

Re: LISP. Копирование однострочного текста из одного примитива в другие

прога чудит с форматированным Мтекстом довольно забавным образом - записывает новый текст вместо последней строки.
пример-
новый текст
456
456
123
старый  текст
{\fArial Narrow|b0|i0|c204|p34;Воздухозаборная
\fArial Narrow|b0|i0|c0|p34;\{\fArial Narrow|b0|i0|c204|p34;решетка\fArial Narrow|b0|i0|c0|p34;\}
\fArial Narrow|b0|i0|c204|p34;900х600 (\fArial Narrow|b0|i0|c0|p34;h\fArial Narrow|b0|i0|c204|p34;)
на отм.2,600}
результат
{\fArial Narrow|b0|i0|c204|p34;Воздухозаборная
\fArial Narrow|b0|i0|c0|p34;\{\fArial Narrow|b0|i0|c204|p34;решетка\fArial Narrow|b0|i0|c0|p34;\}
\fArial Narrow|b0|i0|c204|p34;900х600 (\fArial Narrow|b0|i0|c0|p34;h\fArial Narrow|b0|i0|c204|p34;)
на456
456
123
Фактически добавляет - я уж было обрадовался что нашёл желанный сумматор мультитекста =)

Re: LISP. Копирование однострочного текста из одного примитива в другие

> 1D
Эта программа предназначенр для работы с односторочныт текстом, а не с Мтекстом. Кстати, работает замечательно. Искренняя благодарность Александру Ривилису.

Re: LISP. Копирование однострочного текста из одного примитива в другие

https://www.caduser.ru/forum/topic21894.html

Re: LISP. Копирование однострочного текста из одного примитива в другие

Шесть лет как использую эту программу постоянно. Незаменима. Выше всяких похвал. Но возникла потребность еще в другой похожей программе замены части одного однострочного текста на другой однострочный текст. Возможно это?