Тема: Помогите переделать программу автоматической нумерации

Собственно вопрос уже задан в теме. Вот текст программы:

;;;---------------------------------------------------------
;;;   Программа автоматической нумерации текста
;;; Позволяет быстро сформировать последовательность чисел
;;; начиная с начального, например 24,25,26,27 ... 56, что
;;; может быть особенно полезно при ручном редактировании
;;; спецификаций.
;;;   Программа работает предельно просто: введите целое
;;; число - начало последовательности, например 24, затем
;;; указывайте на текстовые примитивы, и последовательно
;;; получите 25,26,27... Если требуется пропустить какое-то
;;; число, то просто щелкайте на примитиве нужное число раз.
;;;  v.1.1. По просьбе пользователей добавлена возможность
;;; указания префикса - наверно будет удобно тем, кто часто
;;; рисует схемы. Если не требуется префикс можно не
;;; задавать.
;;;               03  ноября 2002 г.
;;;              26 декабря 2002 г.
;;;           Copyright by Sash (Александр Косенко)
;;;                 СКБ ТО "Автоагрегат"
;;;                 E-Mail: здесь было мыло автора, но
;;;                         светить я не стал
;;;---------------------------------------------------------
(defun c:sashrenpr(/ nach prim imprim spis subspis tpara pref)
  (initget 6)
  (setq nach (getint "Введите начальный номер:"))
  (setq pref (getstring "Введите префикс:"))
  (if (/= nach nil)
    (progn
     (setq prim (entsel "Укажите заменяемое число:"))
     (while prim
       (setq spis (entget (setq imprim (car prim))))
       (setq subspis (assoc 1 spis))
       (setq tpara (vl-list* 1 (strcat pref (rtos nach))))
       (setq spis (subst tpara subspis spis))
       (entmod spis)
       (setq nach (1+ nach))
       (setq prim (entsel "Укажите заменяемое число:"))
     )
    )
  )
)

Теперь суть проблемы:
Программа работает, но есть несколько нюансов:
а) Внутренний счетчик переходит на следующее число при указании любого примитива, а не только текста (что, в принципе, правильно, судя по описанию комманды "entmod")
б) Атрибуты в блоке не меняются, только отдельный текст.
Кто-нибудь из знающих сможет помочь в решении этого небольшого вопроса?
Или хотя бы подсказать направление "думания".
Я думаю, что Sash (Александр Косенко) не будет против изменения программы (IMHO).

Re: Помогите переделать программу автоматической нумерации

Loner Wanderer пишет:

в решении этого небольшого вопроса

Не такой уж он и небольшой. Чтоб он сработал только на текст, надо фильтр мутить + обработка пустого ввода, с entsel это не просто, иначе разве Sash этого сам бы не сделал?
Хотя конечно есть готовые решения, например функция _MIP_GET_ENTT, автор MIP.

(defun _MIP_GET_ENTT ( prmpt myfilter sps / Bl e1 prname str aa e2 pt)
 (setq BL t)  ;_Признак выхода
 (while BL
  (setvar "ERRNO" 0)
  (setq e1 (entsel (strcat "\n" prmpt " <выход>:")))  ;_Выбор примитива
  (setq pt (cadr e1) e1 (car e1))  ;_pt - точка выбора e1 - имя примитива
  (if pt (setvar "LASTPOINT" pt))  ;_pt в LASTPOINT
  (if (member e1 sps)              ;_Есть e1 в списке?
  (progn
    (princ "Примитив уже выбран")  ;_Да Повторный выбор
  )
  (progn                           ;_Нет Анализируем дальше
   (if e1                          ;_А вообще что-то выбрано?
    (progn                                     ;_Да
      (setq prname (cdr(assoc 0 (entget e1)))) ;_Берем тип примитива (LINE ARC и т.д.)
      (if myfilter
   (progn
     (if (member prname myfilter)     ;_Есть ли тип в фильтре?
       (setq BL nil)                  ;_Да Bl-nil while прекращается
       (progn                         ;_Нет
         (setq str "\nПримитив должен быть типа\n") ;_Сообщение
         (foreach aa myfilter
      (setq str (strcat str aa " "))
         )
         (princ str)
       )
     )
   )
   (setq BL nil)     ;_Фильтра нет. while прекращаем
      )
    )
    (progn     ;_А вообще что-то выбрано? НЕТ
               ;_Анализируем почему
      (setq e2 (getvar "ERRNO"))  ;_Берем код ошибки
      (cond
           ((= e2 7) ;;;Пустой выбор
             (princ "Ничего не выбрано")
             (setq BL t)    ;_while продолжаем
            )
           ((= e2 52) ;;;Клавиша Ввод(выход)
             (setq BL nil e1 nil);_while прекращаем
            )
          (t (princ "Необходимо выбрать примитив")
             (setq BL t);_что-то другое while продолжаем
          )
      )
    )
   )
 )
)
  );_while
  e1              ;_Возвращаем имя примива
)
(defun c:sashrenpr(/ nach prim imprim spis subspis tpara pref)
  (initget 6)
  (setq nach (getint "Введите начальный номер:"))
  (setq pref (getstring "Введите префикс:"))
  (if (/= nach nil)
    (progn
      (setq prim (_MIP_GET_ENTT "\nУкажите заменяемое число:" '("TEXT" "MTEXT") nil))
     (while prim
       (setq     spis (entget prim)
         subspis (assoc 1 spis)
        tpara (vl-list* 1 (strcat pref (rtos nach)))
         spis (subst tpara subspis spis))
       (entmod spis)
       (setq nach (1+ nach))
       (setq prim (_MIP_GET_ENTT "\nУкажите заменяемое число:" '("TEXT" "MTEXT") nil))
     );end while
    )
  )
)

Насчет атрибутов в блоке..., а что делать если их там несколько?

Re: Помогите переделать программу автоматической нумерации

> Loner Wanderer
Попробуй так:

(defun c:sashrenpr(/ nach prim imprim spis subspis tpara pref)
  (initget 6)
  (setq nach (getint "Введите начальный номер:"))
  (setq pref (getstring "Введите префикс:"))
  (if (/= nach nil)
    (progn
     (setq prim (nentsel "Укажите заменяемое число:"))
     (while prim
       (setq spis (entget (setq imprim (car prim))))
   (if (or (= (cdr (assoc '0 spis)) "ATTRIB")
       (= (cdr (assoc '0 spis)) "TEXT")
       )
     (progn
       (setq subspis (assoc 1 spis))
       (setq tpara (vl-list* 1 (strcat pref (rtos nach))))
       (setq spis (subst tpara subspis spis))
       (entmod spis)
       (entupd (cdr (assoc '-1 spis)))
       (setq nach (1+ nach))
     )
   )
       (setq prim (nentsel "Укажите заменяемое число:"))
     )
    )
  )
)

Re: Помогите переделать программу автоматической нумерации

> Loner Wanderer
Есть решения на мой вгляд лучше и универмсальнее См renum
https://www.caduser.ru/forum/topic30467.html

(princ "\n\t Renum - Renumbering text in DIMENSION, TEXT, MTEXT, ATTRIB, ATTDEF, ACAD_TABLE")

Там же найдешь ссылки на нумераторы

Re: Помогите переделать программу автоматической нумерации

Спасибо, взял программы num / renum отсюда:
https://www.caduser.ru/forum/topic29902.html
Судя по первому впечатлению - то, что мне и надо было.
Только странно - по поиску "нумерация перенумерация" мне эта ссылка не выдавалась.

Re: Помогите переделать программу автоматической нумерации

Кстати - чуть-чуть переделал текст программы по ссылке. Вместо

(strcat "\nType prefix: <"num:Pref">: ")))

и

(strcat "\nType suffix: <"num:Suf">: ")))

я прописал так:

(strcat "\nType prefix:(If you whant to delete prefix type ' ' (press SPACE key on keyboard) <"num:Pref"> :")))

и

(strcat "\nType suffix:(If you whant to delete prefix type ' ' (press SPACE key on keyboard) <"num:Pref"> :")))

А то непонятно что делать, если нужно убрать префикс/суффикс.

Re: Помогите переделать программу автоматической нумерации

> Loner Wanderer
Поправил и у себя, а то все на пальцах объяснял
Кстати проверь: у тебя и в префиксе и в суффиксе фигурирует num:Pref. Возможно, опечатка в посте, возможно - в коде

(strcat "\nType prefix:(If you whant to delete prefix type ' ' (press SPACE key on keyboard) <"[b]num:Pref[/b]"> :")))
(strcat "\nType suffix:(If you whant to delete prefix type ' ' (press SPACE key on keyboard) <"[b]num:Pref[/b]"> :")))

Re: Помогите переделать программу автоматической нумерации

Возможно, опечатка в посте, возможно — в коде

Опечатался, когда постил. Изменил свой пост, но модераторы еще не поправили.
Да, где суффикс - там не Pref, а Suf.
И вместо WHANT надо WANT (грамотей, блин)

Re: Помогите переделать программу автоматической нумерации

> VVA
Не могу отследить Ваши скобки! - в исправлении не соответствует количество открытых и закрытых :(  В результате моих вольных замен говорит - бад аргумент :( Дайте пожалуйста окончательный вариант!

Re: Помогите переделать программу автоматической нумерации

> iv
То, чем пользуюсь я
Команды NUM, RENUM - понятно
TTC - копирование содержимого из одного текста в другой (множественная и попарная)
Для Renum и TTC допустимые источники и приемники текста DIMENSION, TEXT, MTEXT, ATTRIB, ATTDEF, ACAD_TABLE
Apnum - тоже, что и NUM, но вставляет блок с одним атрибутом, увеличивая его значение

;;;https://www.caduser.ru/forum/topic29902.html
(defun c:num (/ oldPref oldSuf oldStart curStr newNum
           actDoc actSp oldEcho oldSize *error*)
  (defun *error* (msg)
    (setvar "CMDECHO" oldEcho)
    (princ)
    ); end *error*
  (vl-load-com)
  (if(not num:Size)(setq num:Size(getvar "DIMTXT")))
  (if(not num:Pref)(setq num:Pref ""))
  (if(not num:Suf)(setq num:Suf ""))
  (if(not num:Num)(setq num:Num 1))
  (setq oldPref num:Pref
        oldSuf num:Suf
        oldStart num:Num
   oldSize num:Size
   actDoc(vla-get-ActiveDocument
      (vlax-get-acad-object))
   oldEcho(getvar "CMDECHO")
   ); end setq
  (setvar "CMDECHO" 0)
  (if(= (vla-get-ActiveSpace actDoc) 1)
    (setq actSp(vla-get-ModelSpace actDoc))
    (setq actSp(vla-get-PaperSpace actDoc))
    ); end setq
  (setq num:Size
    (getreal
      (strcat "\nSpecify text size <"(rtos num:Size)">: ")))
  (if(null num:Size)(setq num:Size oldSize))
  (setq num:Pref
    (getstring T
      (strcat "\nType prefix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"num:Pref"> :")))
  (if(= "" num:Pref)(setq num:Pref oldPref))
  (if(= " " num:Pref)(setq num:Pref ""))
  (setq num:Suf
    (getstring T
      (strcat "\nType suffix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"num:Suf"> :")))
  (if(= "" num:Suf)(setq num:Suf oldSuf))
  (if(= " " num:Suf)(setq num:Suf ""))
  (setq num:Num
    (getint
      (strcat "\nEnter start number <"(itoa num:Num)">: ")))
  (if(null num:Num)(setq num:Num oldStart))
(while T
  (setq curStr(strcat num:Pref(itoa num:Num)num:Suf)
        newNum(vla-AddText actSp
        curStr (vlax-3d-point
       '(0.0 0.0 0.0)) num:Size))
  (vla-put-Alignment newNum acAlignmentMiddleCenter)
  (command "_.copybase"(trans '(0.0 0.0 0.0)0 1)(entlast)"")
  (command "_.erase" (entlast) "")
  (command "_.pasteclip" pause)
    (setq num:Num(1+ num:Num))
  ); end while
  (princ)
  ); end of c:num
;To keep contents of the text
;;;Routine for Renumbering
;;;Realization {Smirnoff}
;;;https://www.caduser.ru/forum/topic29902.html
;;;https://www.caduser.ru/forum/topic21894.html
;;;Edition 23.10.2006 Vladimir Azarko (VVA)
;;;https://www.caduser.ru/forum/topic30467.html
(defun c:renum (/ oldPref oldSuf oldStart curText curStr vlaObj keepText)
(vl-load-com)
(defun TTC_Paste(pasteStr keepText / nslLst vlaObj)
(if (setq nslLst(nentsel "\nPaste text <exit> >>"))
(progn (cond
((and (= 4(length nslLst))
 (= "DIMENSION"(cdr(assoc 0(entget(car(last nslLst))))))); end and
(setq vlaObj (vlax-ename->vla-object (cdr(assoc -1(entget(car(last nslLst)))))))
(setq oldStat (vla-get-Measurement vlaObj))
(if keepText
 (if (= (vla-get-TextOverride vlaObj) "")
 (setq pasteStr (strcat pasteStr (rtos oldStat (vla-get-UnitsFormat vlaObj) (vla-get-PrimaryUnitsPrecision vlaObj))))
 (setq pasteStr (strcat pasteStr (vla-get-TextOverride vlaObj)))))
(if (vl-catch-all-error-p(vl-catch-all-apply 'vla-put-TextOverride(list vlaObj pasteStr)))
 (princ "\n Can't paste. Object may be on locked layer. "))); end condition #1
((and (= 4(length nslLst))
(= "ACAD_TABLE"(cdr(assoc 0(entget(car(last nslLst))))))); end and
(setq vlaObj (vlax-ename->vla-object(car nslLst)))
(if keepText (setq pasteStr (strcat pasteStr (vla-get-TextString vlaobj))))
(if (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-TextString(list vlaObj pasteStr)))
(princ "\nError. Can't pase text. ")(entupd (car(last nslLst))))); end condition # 2
((and (= 4(length nslLst))
 (= "INSERT"(cdr(assoc 0(entget(car(last nslLst))))))); end and
(princ "\nCan't paste to block's DText or MText. ")); end condition #3
((and (= 2(length nslLst))
(member(cdr(assoc 0(entget(car nslLst)))) '("TEXT" "MTEXT" "ATTRIB" "ATTDEF"))); end and
(setq vlaObj (vlax-ename->vla-object(car nslLst)))
(if keepText (setq pasteStr (strcat pasteStr (vla-get-TextString vlaobj))))
(if (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-TextString(list vlaObj pasteStr)))
(princ "\nError. Can't pase text. "))); end condition #4
(T (princ "\nCan't paste. Invalid object. ")); end condition #5
); end cond
T); end progn
nil); end if
);_TTC_PASTE
(setq aDoc(vla-get-ActiveDocument(vlax-get-acad-object)))
(vla-StartUndoMark aDoc)
(if(not rnm:Pref)(setq rnm:Pref ""))(if(not rnm:Suf)(setq rnm:Suf ""))
(if(not rnm:Start)(setq rnm:Start 1))
(setq oldPref rnm:Pref oldSuf rnm:Suf oldStart rnm:Start); end setq
(setq rnm:Pref (getstring T
         (strcat "\nType prefix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"num:Pref"> :")))
(if(= "" rnm:Pref)(setq rnm:Pref oldPref))(if(= " " rnm:Pref)(setq rnm:Pref ""))
(setq rnm:Suf (getstring T
                (strcat "\nType suffix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"num:Suf"> :")))
(if(= "" rnm:Suf)(setq rnm:Suf oldSuf))(if(= " " rnm:Suf)(setq rnm:Suf ""))
(setq rnm:Start (getint (strcat "\nEnter start number <"
(itoa rnm:Start)">: ")))
(if(null rnm:Start)(setq rnm:Start oldStart))
(initget "Yes No ?? ??? _Yes No Yes No")
(setq keepText (not (= "No" (getkword "\nkeep contents of the text [Yes/No] <Yes>:"))))
(setq rnm:Start (1- rnm:Start))
(while (TTC_Paste (setq curStr(strcat rnm:Pref(itoa (setq rnm:Start(1+ rnm:Start)))rnm:Suf)) keepText))
(vla-EndUndoMark aDoc)(princ)); end of c:renum
(defun c:ttc (/ actDoc vlaObj sObj sText curObj oldForm
        oType oldMode conFlag errFlag *error*)
  (vl-load-com)
      (setq actDoc(vla-get-ActiveDocument
        (vlax-get-acad-object)))
      (vla-StartUndoMark actDoc)
  (defun TTC_Paste(pasteStr / nslLst vlaObj hitPt
                   hitRes Row Column)
    (setq errFlag nil)
    (if
     (setq nslLst(nentsel "\nPaste text >"))
      (progn
  (cond
    (
     (and
       (= 4(length nslLst))
       (= "DIMENSION"(cdr(assoc 0(entget(car(last nslLst))))))
       ); end and
     (setq vlaObj
      (vlax-ename->vla-object
        (cdr(assoc -1(entget(car(last nslLst)))))))
     (if
       (vl-catch-all-error-p
         (vl-catch-all-apply
     'vla-put-TextOverride(list vlaObj pasteStr)))
         (progn
         (princ "\n Can't paste. Object may be on locked layer. ")
         (setq errFlag T)
         ); end progn
       ); end if
     ); end condition #1
    (
     (and
       (= 4(length nslLst))
       (= "ACAD_TABLE"(cdr(assoc 0(entget(car(last nslLst))))))
       ); end and
     (setq vlaObj
      (vlax-ename->vla-object
        (cdr(assoc -1(entget(car(last nslLst))))))
     hitPt(vlax-3D-Point(trans(cadr nslLst)1 0))
     hitRes(vla-HitTest vlaObj hitPt
        (vlax-3D-Point '(0.0 0.0 1.0)) 'Row 'Column)
           ); end setq
     (if(= :vlax-true hitRes)
     (progn
         (if
     (vl-catch-all-error-p
       (vl-catch-all-apply
         'vla-SetText(list vlaObj Row Column pasteStr)))
     (progn
       (princ "\n Can't paste. Object may be on locked layer. ")
       (setq errFlag T)
       ); end progn
     ); end if
         ); end progn
       ); end if
     ); end condition # 2
    (
     (and
       (= 4(length nslLst))
       (= "INSERT"(cdr(assoc 0(entget(car(last nslLst))))))
       ); end and
     (princ "\nCan't paste to block's DText or MText. Select Attribute ")
     (setq errFlag T)
     ); end condition #3
    (
     (and
       (= 2(length nslLst))
         (member(cdr(assoc 0(entget(car nslLst))))
           '("TEXT" "MTEXT" "ATTRIB" "ATTDEF"))
       ); end and
     (setq vlaObj
      (vlax-ename->vla-object(car nslLst)))
        (if
     (vl-catch-all-error-p
       (vl-catch-all-apply
         'vla-put-TextString(list vlaObj pasteStr)))
    (progn
       (princ "\nError. Can't pase text. ")
      (setq errFlag T)
      ); end progn
     ); end if
     ); end condition #4
    (T
     (princ "\nCan't paste. Invalid object. ")
     (setq errFlag T)
     ); end condition #5
    ); end cond
             T
      ); end progn
            nil
           ); end if
    ); end of TTC_Paste
    (defun TTC_MText_Clear(Mtext / Text Str)
    (setq Text "")
    (while(/= Mtext "")
      (cond
  ((wcmatch
     (strcase
       (setq Str
        (substr Mtext 1 2)))
                     "\\[\\{}`~]")
   (setq Mtext(substr Mtext 3)
         Text(strcat Text Str)
   ); end setq
  ); end condition #1
  ((wcmatch(substr Mtext 1 1) "[{}]")
    (setq Mtext
     (substr Mtext 2))
  ); end condition #2
  (
   (and
   (wcmatch
     (strcase
       (substr Mtext 1 2)) "\\P")
   (/=(substr Mtext 3 1) " ")
    ); end and
         (setq Mtext (substr Mtext 3)
               Text (strcat Text " ")
         ); end setq
   ); end condition #3
  ((wcmatch
     (strcase
       (substr Mtext 1 2)) "\\[LOP]")
    (setq Mtext(substr Mtext 3))
  ); end condition #4
  ((wcmatch
     (strcase
       (substr Mtext 1 2)) "\\[ACFHQTW]")
    (setq Mtext
     (substr Mtext
       (+ 2
          (vl-string-search ";" Mtext))))
  ); end condition #5
  ((wcmatch
     (strcase (substr Mtext 1 2)) "\\S")
    (setq Str(substr Mtext 3 (- (vl-string-search ";" Mtext) 2))
          Text(strcat Text (vl-string-translate "#^\\" " " Str))
          Mtext(substr Mtext (+ 4 (strlen Str)))
   ); end setq
   (print Str)
  ); end condition #6
  (T
   (setq Text(strcat Text(substr Mtext 1 1))
         Mtext (substr Mtext 2)
   )
  ); end condition #7
      ); end cond
    ); end while
  Text
); end of TTC_MText_Clear
  (defun TTC_Copy (/ sObj sText tType actDoc)
   (if
    (and
     (setq sObj(car(nentsel "\nCopy text... ")))
     (member(setq tType(cdr(assoc 0(entget sObj))))
      '("TEXT" "MTEXT" "ATTRIB" "ATTDEF"))
     ); end and
    (progn
      (setq actDoc(vla-get-ActiveDocument
        (vlax-get-Acad-object))
      sText(vla-get-TextString
       (vlax-ename->vla-object sObj))
      ); end setq
      (if(= tType "MTEXT")
  (setq sText(TTC_MText_Clear sText))
  ); end if
      ); end progn
    ); end if
    sText
    ); end of TTC_Copy
  (defun CCT_Str_Echo(paseStr / comStr)
    (if(< 20(strlen paseStr))
      (setq comStr
       (strcat
         (substr paseStr 1 17)"..."))
      (setq comStr paseStr)
      ); end if
    (princ
      (strcat "\nText = \"" comStr "\""))
    (princ)
    ); end of CCT_Str_Echo
    (defun *error*(msg)
    (vla-EndUndoMark
      (vla-get-ActiveDocument
        (vlax-get-acad-object)))
    (princ "\nQuit TTC")
    (princ)
    ); end of *error*
    (if(not ttc:Mode)(setq ttc:Mode "Multiple"))
    (initget "Multiple Pair-wise")
    (setq oldMode ttc:Mode
    ttc:Mode
     (getkword
       (strcat "\nSpecify mode [Multiple/Pair-wise] <" ttc:Mode ">: "))
    conFlag T
    paseStr ""
     ); end setq
    (if(null ttc:Mode)(setq ttc:Mode oldMode))
    (if(= ttc:Mode "Multiple")
      (progn
  (if(and(setq paseStr(TTC_Copy))conFlag)
    (progn
    (CCT_Str_Echo paseStr)
    (while(setq conFlag(TTC_Paste paseStr))T
      ); end while
    ); end progn
    ); end if
  ); end progn
      (progn
  (while
    (and conFlag paseStr)
    (setq paseStr(TTC_Copy))
    (if(and paseStr conFlag)
      (progn
    (CCT_Str_Echo paseStr)
    (setq errFlag T)
    (while errFlag
    (setq conFlag(TTC_Paste paseStr))
         );end while
       ); end progn
      ); end if
    ); end while
  ); end progn
      ); end if
   (vla-EndUndoMark actDoc)
   (princ "\nQuit TTC")
  (princ)
  ); end c:ttc
;;Originally Posted by ASMI
;;http://www.cadtutor.net/forum/showthread.php?t=11114&page=2
(defun c:apnum (/ oldStart oldPref oldSuf oldEcho
        oldSize oldBlock temBl *error* att)
  (defun *error* (msg)
    (setvar "CMDECHO" oldEcho)
    (setvar "ATTDIA" att)
    (princ)
    ); end *error*
  (if(not apnum:Size)(setq apnum:Size 1.0))
  (if(not apnum:Num)(setq apnum:Num 1))
  (if(not apnum:Pref)(setq apnum:Pref ""))
  (if(not apnum:Suf)(setq apnum:Suf ""))
  (setq  oldStart apnum:Num
   oldSize apnum:Size
   oldPref apnum:Pref
   oldSuf apnum:Suf
   oldEcho(getvar "CMDECHO")
   att (getvar "ATTDIA")
   ); end setq
  (setvar "ATTDIA" 0)(setvar "ATTREQ" 1)
  (setvar "CMDECHO" 0)
    (setq apnum:Pref
    (getstring T
      (strcat "\nType prefix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"apnum:Pref"> :")))
  (if(= "" apnum:Pref)(setq apnum:Pref oldPref))
  (if(= " " apnum:Pref)(setq apnum:Pref ""))
  (setq apnum:Suf
    (getstring T
       (strcat "\nType suffix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"apnum:Suf"> :")))
  (if(= "" apnum:Suf)(setq apnum:Suf oldSuf))
  (if(= " " apnum:Suf)(setq apnum:Suf ""))
  (setq apnum:Num
    (getint
      (strcat "\nSpecify start number <"(itoa apnum:Num)">: ")))
  (if(null apnum:Num)(setq apnum:Num oldStart))
  (setq apnum:Size
    (getreal
      (strcat "\nSpecify block scale <"(rtos apnum:Size)">: ")))
  (if(null apnum:Size)(setq apnum:Size oldSize))
  (if apnum:Block(setq oldBlock apnum:Block))
  (setq temBl
     (entsel(strcat "\nSelect block <"
         (if apnum:Block apnum:Block "not difined") "> > "))); end setq
  (cond
    ((and apnum:Block(not temBl)(tblsearch "BLOCK" apnum:Block))
    (setq apnum:Block oldBlock)
     ); end condition #1
    ((= 1 (cdr(assoc 66(entget(car temBl)))))
    (setq apnum:Block(cdr(assoc 2(entget(car temBl)))))
    ); end condition #2
    (t
     (princ "\nBlock not contains attribute! ")
     (setq apnum:Block nil)
     ); end condition #3
    ); end cond
  (if apnum:Block
    (progn
      (princ "\n>>> Pick insertion point or press Esc to quit <<<\n ")
(while T
  (command "_-insert" apnum:Block "_s" apnum:Size pause "0"
       (strcat apnum:Pref(itoa apnum:Num)apnum:Suf)); end command
    (setq apnum:Num (1+ apnum:Num))
  ); end while
); end progn
    ); end if
  (setvar "ATTDIA" att)
  (princ)
  ); end of c:apnum
  (princ "\nType in command line:")
(princ "\n\t Num - Insert text with increment value")
(princ "\n\t Renum - Renumbering text in DIMENSION, TEXT, MTEXT, ATTRIB, ATTDEF, ACAD_TABLE")
(princ "\n\t TTC - Text to Text copy. Copy text from DIMENSION, TEXT, MTEXT, ATTRIB, ATTDEF, ACAD_TABLE to one")
(princ "\n\t Apnum - for numbering by blocks with single attribute")

Re: Помогите переделать программу автоматической нумерации

> VVA
Ф-и - супер! В т.ч. впечатлила ttc. Только неясно зачем num при каждой установке лихорадочно кидается к диску? В реестр оперу что ли пишет? :)
Мог бы кидаться по завершении... Но это так, придирка :).
Кроме этого частный вопрос - в какой строке можно поменять центрирование текста при num?

Re: Помогите переделать программу автоматической нумерации

iv пишет:

Только неясно зачем num при каждой установке лихорадочно кидается к диску

Идет копирование в буфер для последующей вставке

(command "_.copybase"(trans '(0.0 0.0 0.0)0 1)(entlast)"")

Оно наверное и и кидается
По поводу центрирования. Найди

  (vla-put-Alignment newNum acAlignmentMiddleCenter)

Возможные варианты

Alignment
acAlignment enum; read-write
acAlignmentLeft
acAlignmentCenter
acAlignmentRight
acAlignmentAligned
acAlignmentMiddle
acAlignmentFit
acAlignmentTopLeft
acAlignmentTopCenter
acAlignmentTopRight
acAlignmentMiddleLeft
acAlignmentMiddleCenter
acAlignmentMiddleRight
acAlignmentBottomLeft
acAlignmentBottomCenter
acAlignmentBottomRight

Если нужно влево, просто закоментарь строку

Re: Помогите переделать программу автоматической нумерации

В предыдущем посте в renum допущена опечатка

;;;Routine for Renumbering
;;;Realization {Smirnoff}
;;;https://www.caduser.ru/forum/topic33485.html
;;;https://www.caduser.ru/forum/topic29902.html
;;;https://www.caduser.ru/forum/topic21894.html
;;;Edition 23.10.2006 Vladimir Azarko (VVA)
;;;https://www.caduser.ru/forum/topic30467.html
(defun c:renum (/ oldPref oldSuf oldStart curText curStr vlaObj keepText)
(vl-load-com)
(defun TTC_Paste(pasteStr keepText / nslLst vlaObj)
(if (setq nslLst(nentsel "\nPaste text <exit> >>"))
(progn (cond
((and (= 4(length nslLst))
 (= "DIMENSION"(cdr(assoc 0(entget(car(last nslLst))))))); end and
(setq vlaObj (vlax-ename->vla-object (cdr(assoc -1(entget(car(last nslLst)))))))
(setq oldStat (vla-get-Measurement vlaObj))
(if keepText
 (if (= (vla-get-TextOverride vlaObj) "")
 (setq pasteStr (strcat pasteStr (rtos oldStat (vla-get-UnitsFormat vlaObj) (vla-get-PrimaryUnitsPrecision vlaObj))))
 (setq pasteStr (strcat pasteStr (vla-get-TextOverride vlaObj)))))
(if (vl-catch-all-error-p(vl-catch-all-apply 'vla-put-TextOverride(list vlaObj pasteStr)))
 (princ "\n Can't paste. Object may be on locked layer. "))); end condition #1
((and (= 4(length nslLst))
(= "ACAD_TABLE"(cdr(assoc 0(entget(car(last nslLst))))))); end and
(setq vlaObj (vlax-ename->vla-object(car nslLst)))
(if keepText (setq pasteStr (strcat pasteStr (vla-get-TextString vlaobj))))
(if (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-TextString(list vlaObj pasteStr)))
(princ "\nError. Can't pase text. ")(entupd (car(last nslLst))))); end condition # 2
((and (= 4(length nslLst))
 (= "INSERT"(cdr(assoc 0(entget(car(last nslLst))))))); end and
(princ "\nCan't paste to block's DText or MText. ")); end condition #3
((and (= 2(length nslLst))
(member(cdr(assoc 0(entget(car nslLst)))) '("TEXT" "MTEXT" "ATTRIB" "ATTDEF"))); end and
(setq vlaObj (vlax-ename->vla-object(car nslLst)))
(if keepText (setq pasteStr (strcat pasteStr (vla-get-TextString vlaobj))))
(if (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-TextString(list vlaObj pasteStr)))
(princ "\nError. Can't pase text. "))); end condition #4
(T (princ "\nCan't paste. Invalid object. ")); end condition #5
); end cond
T); end progn
nil); end if
);_TTC_PASTE
(setq aDoc(vla-get-ActiveDocument(vlax-get-acad-object)))
(vla-StartUndoMark aDoc)
(if(not rnm:Pref)(setq rnm:Pref ""))(if(not rnm:Suf)(setq rnm:Suf ""))
(if(not rnm:Start)(setq rnm:Start 1))
(setq oldPref rnm:Pref oldSuf rnm:Suf oldStart rnm:Start); end setq
(setq rnm:Pref (getstring T
         (strcat "\nType prefix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <" rnm:Pref "> :")))
(if(= "" rnm:Pref)(setq rnm:Pref oldPref))(if(= " " rnm:Pref)(setq rnm:Pref ""))
(setq rnm:Suf (getstring T
                (strcat "\nType suffix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"rnm:Suf"> :")))
(if(= "" rnm:Suf)(setq rnm:Suf oldSuf))(if(= " " rnm:Suf)(setq rnm:Suf ""))
(setq rnm:Start (getint (strcat "\nEnter start number <"
(itoa rnm:Start)">: ")))
(if(null rnm:Start)(setq rnm:Start oldStart))
(initget "Yes No ?? ??? _Yes No Yes No")
(setq keepText (not (= "No" (getkword "\nkeep contents of the text [Yes/No] <Yes>:"))))
(setq rnm:Start (1- rnm:Start))
(while (TTC_Paste (setq curStr(strcat rnm:Pref(itoa (setq rnm:Start(1+ rnm:Start)))rnm:Suf)) keepText))
(vla-EndUndoMark aDoc)(princ)); end of c:renum

Re: Помогите переделать программу автоматической нумерации

> VVA
apnum: логичнее сделать для 1-го атрибута (независимо от количества атрибутов в блоке) или предупредить пользователя, что в выбранном блоке более 1-го атрибута.
А вообще, интересная и полезная программа.

Re: Помогите переделать программу автоматической нумерации

> VVA
И добавление. Не всегда increment=1. Может его где-нибудь надо корректировать?
а как это понять?

(initget "Yes No ?? ??? _Yes No Yes No")
(setq keepText (not (= "No" (getkword "\nkeep contents of the text [Yes/No] <Yes>:"))))

Re: Помогите переделать программу автоматической нумерации

> KAI
(initget "Yes No ?? ??? _Yes No Yes No") - это скопированный в буфер русский текст на английской раскладке. Должно выглядеть так
(initget "Yes No Да Нет _Yes No Yes No")
[code]
По поводу apnum для 1-го атрибута и инкремента, у меня есть модифицированный вариант BINC
Правда имя блока и имя тага атрибута пока надо прописывать в программе, но можно прикрутить диалог настройки на блок и имя атрибута
Прока прописывать имена нужно здесь
[code]
  (setq apnum:Block "BlockName") ;_Впиши имя блока здесь (Enter a name of the block here )
  (setq apnum:tag "Nomer")       ;_Впиши имя тага атрибута (Enter a tag name of attribute)
[/code]
Текст команды
[code]
(defun c:binc (/ oldStart oldPref oldSuf oldEcho oldInc
        oldSize oldBlock temBl *error* att attr apnum:tag pt)
  ;====================================================================
  (setq apnum:Block "BlockName") ;_Впиши имя блока здесь (Enter a name of the block here )
  (setq apnum:tag "Nomer")       ;_Впиши имя тага атрибута (Enter a tag name of attribute)
  ;===================================================================
;==== Local functions ============
  (defun *error* (msg)(setvar "CMDECHO" oldEcho)(setvar "ATTDIA" att)(setvar "ATTREQ" attr)(princ)); end *error*
  (defun mip-conv-to-str (dat)
  (cond ((= (type dat) 'INT)(setq dat (itoa dat)))
         ((= (type dat) 'REAL)(setq dat (rtos dat 2 12)))
        ((null dat)(setq dat ""))
        (t (setq dat (vl-princ-to-string dat)))))
;; obj - Ename or Vla object of block
;; att_list - list ((Tag_Name1 . Value1)(Tag_Name2 . Value2) ...)
;;                 Tag_Name - string
;;                    Value - string
(defun mip-block-setattr-bylist (obj att_list / txt lst)
(if (= (type obj) 'ENAME)(setq obj (vlax-ename->vla-object obj)))
(setq att_list (mapcar '(lambda(x)(cons (strcase (mip-conv-to-str(car x)))(mip-conv-to-str(cdr x)))) att_list))
  (if (and obj
           (not(vlax-erased-p obj))
           (= (vla-get-ObjectName obj) "AcDbBlockReference")
       (eq :vlax-true (vla-get-HasAttributes obj))
       (vlax-property-available-p obj 'Hasattributes)
       (vlax-write-enabled-p obj)
      )
    (vl-catch-all-apply
      (function
    (lambda    ()
          (foreach at (vlax-invoke obj 'Getattributes)
            (if (setq lst (assoc(strcase(vla-get-TagString at)) att_list))
              (vla-put-TextString at (cdr lst))
            )
            )
          )
        )
      )
    )
  )
;==== Local functions END ============
  (if(not apnum:Size)(setq apnum:Size 1.0))
  (if(not apnum:Num)(setq apnum:Num 1))
  (if(not apnum:Inc)(setq apnum:Inc 1))
  (if(not apnum:Pref)(setq apnum:Pref ""))
  (if(not apnum:Suf)(setq apnum:Suf ""))
  (setq  oldStart apnum:Num oldSize apnum:Size oldInc apnum:Inc
         oldPref apnum:Pref oldSuf apnum:Suf
         apnum:Block (mip-conv-to-str apnum:Block)
         apnum:tag (mip-conv-to-str apnum:tag)
         oldEcho (getvar "CMDECHO")
         att (getvar "ATTDIA") attr (getvar "ATTREQ")); end setq
  (setvar "ATTDIA" 0)(setvar "ATTREQ" 0)
  (setvar "CMDECHO" 0)
    (setq apnum:Pref
    (getstring T
      (strcat "\nType prefix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"apnum:Pref"> :")))
  (if(= "" apnum:Pref)(setq apnum:Pref oldPref))
  (if(= " " apnum:Pref)(setq apnum:Pref ""))
  (setq apnum:Suf
    (getstring T
       (strcat "\nType suffix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"apnum:Suf"> :")))
  (if(= "" apnum:Suf)(setq apnum:Suf oldSuf))
  (if(= " " apnum:Suf)(setq apnum:Suf ""))
  (setq apnum:Num
    (getint
      (strcat "\nSpecify start number <"(itoa apnum:Num)">: ")))
  (if(null apnum:Num)(setq apnum:Num oldStart))
  (setq apnum:Inc
    (getint
      (strcat "\nSpecify increment <"(itoa apnum:Inc)">: ")))
  (if(null apnum:Inc)(setq apnum:Inc oldInc))
  (setq apnum:Size
    (getreal
      (strcat "\nSpecify block scale <"(rtos apnum:Size)">: ")))
  (if(null apnum:Size)(setq apnum:Size oldSize))
  (if apnum:Block(setq oldBlock apnum:Block))
;;;  (setq temBl
;;;     (entsel(strcat "\nSelect block <"
;;;         (if apnum:Block apnum:Block "not difined") "> > "))); end setq
  (cond
    ((null (tblsearch "BLOCK" apnum:Block))
     (alert (strcat "Block " apnum:Block " not found"))
     (setq apnum:Block nil)
     ); end condition #0
    ((and apnum:Block(not temBl)(tblsearch "BLOCK" apnum:Block))
    (setq apnum:Block oldBlock)
     ); end condition #1
    ((and tembl (= 1 (cdr(assoc 66(entget(car temBl))))))
    (setq apnum:Block(cdr(assoc 2(entget(car temBl)))))
    ); end condition #2
    (t
     (princ "\nBlock not contains attribute! ")
     (setq apnum:Block nil)
     ); end condition #3
    ); end cond
  (if apnum:Block
    (progn
(while T
  (princ "\n>>> Pick insertion point or press Esc to quit <<<\n")
  (command "_-insert" apnum:Block "_s" apnum:Size pause "0")
   (mip-block-setattr-bylist (entlast)
     (list(cons (strcase (mip-conv-to-str apnum:tag))
                (strcat apnum:Pref(itoa apnum:Num)apnum:Suf))))
    (setq apnum:Num (+ apnum:Num apnum:Inc))
  ); end while
); end progn
    ); end if
  (setvar "ATTDIA" att)(setvar "ATTREQ" attr)
  (princ)
  )
[/code]

Re: Помогите переделать программу автоматической нумерации

С форматированием я что-то намудрил, но, думаю, читаемо

Re: Помогите переделать программу автоматической нумерации

А подскажите пожалуйста, как в суффикс добавить знак степени..Искал много, но нашел код, который добавляет степень посреди строки а не вверху. Подходит для обозначения кв. м., но для цифр - нет("м" же меньше цифры)

квадрат (и вообще степень) для варианта внешнего текстового редактора
{\SЧИСЛИТЕЛЬ;}
Для варианта верхнего символа высотой как текст
{\H0.65x;\SЧИСЛИТЕЛЬ/ЗНАМЕНАТЕЛЬ;}

Re: Помогите переделать программу автоматической нумерации

\A1;12{\H0.7x;\S23^;}

Re: Помогите переделать программу автоматической нумерации

Как всегда СПАСИБО, VVA! Подскажите еще пожалуйста, куда это вставить в лиспе "NUM-RENUM", чтобы на запрос суффикса я вводил цифру, и она уходила в степень?

Re: Помогите переделать программу автоматической нумерации

> skkkk
В NUM не получится, там вставляется текст
Для Renum вариант ниже. Любой суффикс будет идти в качестве степени. Ну и, конечно же, перенумеровываться должен мтекст

;;;Routine for Renumbering
(defun c:renum1 (/ oldPref oldSuf oldStart curText curStr vlaObj keepText)
(vl-load-com)
(defun TTC_Paste(pasteStr keepText / nslLst vlaObj)
(if (setq nslLst(nentsel "\nPaste text <exit> >>"))
(progn (cond
((and (= 4(length nslLst))
 (= "DIMENSION"(cdr(assoc 0(entget(car(last nslLst))))))); end and
(setq vlaObj (vlax-ename->vla-object (cdr(assoc -1(entget(car(last nslLst)))))))
(setq oldStat (vla-get-Measurement vlaObj))
(if keepText
 (if (= (vla-get-TextOverride vlaObj) "")
 (setq pasteStr (strcat pasteStr (rtos oldStat (vla-get-UnitsFormat vlaObj) (vla-get-PrimaryUnitsPrecision vlaObj))))
 (setq pasteStr (strcat pasteStr (vla-get-TextOverride vlaObj)))))
(if (vl-catch-all-error-p(vl-catch-all-apply 'vla-put-TextOverride(list vlaObj pasteStr)))
 (princ "\n Can't paste. Object may be on locked layer. "))); end condition #1
((and (= 4(length nslLst))
(= "ACAD_TABLE"(cdr(assoc 0(entget(car(last nslLst))))))); end and
(setq vlaObj (vlax-ename->vla-object(car nslLst)))
(if keepText (setq pasteStr (strcat pasteStr (vla-get-TextString vlaobj))))
(if (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-TextString(list vlaObj pasteStr)))
(princ "\nError. Can't pase text. ")(entupd (car(last nslLst))))); end condition # 2
((and (= 4(length nslLst))
 (= "INSERT"(cdr(assoc 0(entget(car(last nslLst))))))); end and
(princ "\nCan't paste to block's DText or MText. ")); end condition #3
((and (= 2(length nslLst))
(member(cdr(assoc 0(entget(car nslLst)))) '("TEXT" "MTEXT" "ATTRIB" "ATTDEF"))); end and
(setq vlaObj (vlax-ename->vla-object(car nslLst)))
(if keepText (setq pasteStr (strcat pasteStr (vla-get-TextString vlaobj))))
(if (vl-catch-all-error-p (vl-catch-all-apply 'vla-put-TextString(list vlaObj pasteStr)))
(princ "\nError. Can't pase text. "))); end condition #4
(T (princ "\nCan't paste. Invalid object. ")); end condition #5
); end cond
T); end progn
nil); end if
);_TTC_PASTE
(setq aDoc(vla-get-ActiveDocument(vlax-get-acad-object)))
(vla-StartUndoMark aDoc)
(if(not rnm:Pref)(setq rnm:Pref ""))(if(not rnm:Suf)(setq rnm:Suf ""))
(if(not rnm:Start)(setq rnm:Start 1))
(setq oldPref rnm:Pref oldSuf rnm:Suf oldStart rnm:Start); end setq
(setq rnm:Pref (getstring T
     (strcat "\nType prefix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <" rnm:Pref "> :")))
(if(= "" rnm:Pref)(setq rnm:Pref oldPref))(if(= " " rnm:Pref)(setq rnm:Pref ""))
(setq rnm:Suf (getstring T
                (strcat "\nType suffix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"rnm:Suf"> :")))
(if(= "" rnm:Suf)(setq rnm:Suf oldSuf))(if(= " " rnm:Suf)(setq rnm:Suf ""))
;;;===============================================================================
;;; Степень;12{\A1;\H0.7x;\S23^;}                                              ;_=
(if (/= rnm:Suf "")(setq rnm:Suf (strcat  "{\\A1;\\H0.7x;\\S" rnm:Suf ";}")))  ;_=
;;;===============================================================================
(setq rnm:Start (getint (strcat "\nEnter start number <"
(itoa rnm:Start)">: ")))
(if(null rnm:Start)(setq rnm:Start oldStart))
(initget "Yes No ?? ??? _Yes No Yes No")
(setq keepText (not (= "No" (getkword "\nkeep contents of the text [Yes/No] <Yes>:"))))
(setq rnm:Start (1- rnm:Start))
(while (TTC_Paste (setq curStr(strcat rnm:Pref(itoa (setq rnm:Start(1+ rnm:Start)))rnm:Suf)) keepText))
(vla-EndUndoMark aDoc)(princ)); end of c:renum
 

Re: Помогите переделать программу автоматической нумерации

Дай Бог Вам здоровья, VVA:). Удивляет оперативность! Жаль в нум нельзя, но предварительно расставить тексты по своим местам не составляет особых забот.
Как же Вас благодарить......? Жить хочется сильней во сто крат с осознанием наличия в мире таких людей

Re: Помогите переделать программу автоматической нумерации

> skkkk
Спасибо за добрые слова.

Жаль в нум нельзя

Так это если текстом оставить, если нумеровать сразу мтекстом, то разницы никакой нет.
Вариант NUM с нумерацией мтекстом - NUMM

;;; NUMeric with Mtext
(defun c:numm (/ oldPref oldSuf oldStart curStr newNum
           actDoc actSp oldEcho oldSize *error*)
  (defun *error* (msg)
    (setvar "CMDECHO" oldEcho)
    (princ)
    ); end *error*
  (vl-load-com)
  (if(not num:Size)(setq num:Size(getvar "DIMTXT")))
  (if(not num:Pref)(setq num:Pref ""))
  (if(not num:Suf)(setq num:Suf ""))
  (if(not num:Num)(setq num:Num 1))
  (setq oldPref num:Pref
        oldSuf num:Suf
        oldStart num:Num
   oldSize num:Size
   actDoc(vla-get-ActiveDocument
      (vlax-get-acad-object))
   oldEcho(getvar "CMDECHO")
   ); end setq
  (setvar "CMDECHO" 0)
  (if(= (vla-get-ActiveSpace actDoc) 1)
    (setq actSp(vla-get-ModelSpace actDoc))
    (setq actSp(vla-get-PaperSpace actDoc))
    ); end setq
  (setq num:Size
    (getreal
      (strcat "\nSpecify text size <"(rtos num:Size)">: ")))
  (if(null num:Size)(setq num:Size oldSize))
  (setq num:Pref
    (getstring T
      (strcat "\nType prefix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"num:Pref"> :")))
  (if(= "" num:Pref)(setq num:Pref oldPref))
  (if(= " " num:Pref)(setq num:Pref ""))
  (setq num:Suf
    (getstring T
      (strcat "\nType suffix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"num:Suf"> :")))
  (if(= "" num:Suf)(setq num:Suf oldSuf))
  (if(= " " num:Suf)(setq num:Suf ""))
  (setq num:Num
    (getint
      (strcat "\nEnter start number <"(itoa num:Num)">: ")))
  (if(null num:Num)(setq num:Num oldStart))
(while T
  (setq curStr(strcat num:Pref(itoa num:Num)num:Suf)
        newNum(vla-AddMText actSp
         (vlax-3d-point '(0.0 0.0 0.0)) 0 curStr))
  (vla-put-height newNum num:Size)
  (vla-put-AttachmentPoint newNum acAttachmentPointMiddleCenter)
  (vla-put-InsertionPoint newNum (vlax-3d-point '(0.0 0.0 0.0)))
  (command "_.copybase"(trans '(0.0 0.0 0.0)0 1)(entlast)"")
  (command "_.erase" (entlast) "")
  (command "_.pasteclip" pause)
    (setq num:Num(1+ num:Num))
  ); end while
  (princ)
  )

Re: Помогите переделать программу автоматической нумерации

Ну и соответственно любой суффикс летит в степень

(defun c:numm1 (/ oldPref oldSuf oldStart curStr newNum
           actDoc actSp oldEcho oldSize *error*)
  (defun *error* (msg)
    (setvar "CMDECHO" oldEcho)
    (princ)
    ); end *error*
  (vl-load-com)
  (if(not num:Size)(setq num:Size(getvar "DIMTXT")))
  (if(not num:Pref)(setq num:Pref ""))
  (if(not num:Suf)(setq num:Suf ""))
  (if(not num:Num)(setq num:Num 1))
  (setq oldPref num:Pref
        oldSuf num:Suf
        oldStart num:Num
   oldSize num:Size
   actDoc(vla-get-ActiveDocument
      (vlax-get-acad-object))
   oldEcho(getvar "CMDECHO")
   ); end setq
  (setvar "CMDECHO" 0)
  (if(= (vla-get-ActiveSpace actDoc) 1)
    (setq actSp(vla-get-ModelSpace actDoc))
    (setq actSp(vla-get-PaperSpace actDoc))
    ); end setq
  (setq num:Size
    (getreal
      (strcat "\nSpecify text size <"(rtos num:Size)">: ")))
  (if(null num:Size)(setq num:Size oldSize))
  (setq num:Pref
    (getstring T
      (strcat "\nType prefix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"num:Pref"> :")))
  (if(= "" num:Pref)(setq num:Pref oldPref))
  (if(= " " num:Pref)(setq num:Pref ""))
  (setq num:Suf
    (getstring T
      (strcat "\nType suffix:(If you want to delete prefix type ' ' (press SPACE key on keyboard) <"num:Suf"> :")))
  (if(= "" num:Suf)(setq num:Suf oldSuf))
  (if(= " " num:Suf)(setq num:Suf ""))
;;;=============================================================================
;;; Степень \A1;12{\H0.7x;\S23^;}                                            ;_=
(if (/= num:Suf "")(setq num:Suf (strcat  "{\\A1;\\H0.7x;\\S" num:Suf ";}")));_=
;;;=============================================================================
  (setq num:Num
    (getint
      (strcat "\nEnter start number <"(itoa num:Num)">: ")))
  (if(null num:Num)(setq num:Num oldStart))
(while T
  (setq curStr(strcat num:Pref(itoa num:Num)num:Suf)
        newNum(vla-AddMText actSp
         (vlax-3d-point '(0.0 0.0 0.0)) 0 curStr))
  (vla-put-height newNum num:Size)
  (vla-put-AttachmentPoint newNum acAttachmentPointMiddleCenter)
  (vla-put-InsertionPoint newNum (vlax-3d-point '(0.0 0.0 0.0)))
  (command "_.copybase"(trans '(0.0 0.0 0.0)0 1)(entlast)"")
  (command "_.erase" (entlast) "")
  (command "_.pasteclip" pause)
    (setq num:Num(1+ num:Num))
  ); end while
  (princ)
  )

Re: Помогите переделать программу автоматической нумерации

> VVA
Столкнулся с проблемкой в этом лиспе. Я работаю в 2008-м КАДе, и там все отлично...Но в 2007-м в степень летит подчеркнутое число. И обработанные этим лиспом мтексты в 2008-м при открытии файла в 2007-м тоже с подчеркнутой степенью, начальство ругается. При редактировании мтекста выделяю степень (например 2), жму a/b, - возвращается в 2008-м 2^, а в 2007-м - 2/. Что ж