Тема: LISP. Отрисовка числа в круге.

1 ВАРИАНТ. Если задана "DIMSCALE" (например, 100).

;******** TKRUG.LSP *******************************************
;         Программа вставки числа или букв в кружке.
;         Для шрифта romans.shx не более 2 символов.
;         Если шрифт arial.ttf, то может влезть и 3 символа.
;                     Разработал Громов В.В. 2003
;
(defun C:TKRUG ( / c hold ht r tt txt1 txt)
       (setvar "cmdecho" 0)
       (setq c (getvar "DIMSCALE"))
       (princ "\n Прежняя высота текста (мм бумаги):  ")
       (setq hold (/ (getvar "TEXTSIZE") c))
       (princ hold)
       (initget 6)
       (princ (strcat "\n РАЗМЕР (высота) текста (мм бумаги) <" (rtos hold 2 2) ">: "))
       (setq ht (getreal))
       (if (= ht nil) (setq ht hold))
       (setq ht (* ht c))
       (setq r (* 1.2 ht))
       (setq tt 0)
(while tt
       (setq tt (getpoint "\n Укажите ТОЧКУ (ENTER-Хватит): "))
     (if tt
       (progn
       (if (null txt1) (setq txt1 "1"))
       (princ (strcat "\n Число <" txt1 ">: "))
       (setq txt (getstring))
       (if (= txt "") (setq txt txt1) (setq txt1 txt))
       (command "_CIRCLE" tt r)
       (command "_TEXT" "_M" tt ht "0" txt)
     ))
)
       (princ "\n Конец. ")
       (princ)
)

2 ВАРИАНТ. Если "DIMSCALE" не задана (равна 1).

;******** TKRUG.LSP *******************************************
;         Программа вставки числа или букв в кружке.
;         Для шрифта romans.shx не более 2 символов.
;         Если шрифт arial.ttf, то может влезть и 3 символа.
;                     Разработал Громов В.В. 2003
;
(defun C:TKRUG ( / c hold ht r tt txt1 txt)
       (setvar "cmdecho" 0)
       (princ "\n Прежняя высота текста:  ")
       (setq hold (getvar "TEXTSIZE"))
       (princ hold)
       (initget 6)
       (princ (strcat "\n РАЗМЕР (высота) текста <" (rtos hold 2 2) ">: "))
       (setq ht (getreal))
       (if (= ht nil) (setq ht hold))
       (setq r (* 1.2 ht))
       (setq tt 0)
(while tt
       (setq tt (getpoint "\n Укажите ТОЧКУ (ENTER-Хватит): "))
     (if tt
       (progn
       (if (null txt1) (setq txt1 "1"))
       (princ (strcat "\n Число <" txt1 ">: "))
       (setq txt (getstring))
       (if (= txt "") (setq txt txt1) (setq txt1 txt))
       (command "_CIRCLE" tt r)
       (command "_TEXT" "_M" tt ht "0" txt)
     ))
)
       (princ "\n Конец. ")
       (princ)
)

Возможный макрос для кнопки или пункта меню:

^C^C^P(if (not C:TKRUG) (load "tkrug")) TKRUG

Re: LISP. Отрисовка числа в круге.

Замечательная программка для расстановки экспликации. Можно ли сделать так, чтоб после каждой вставки число вставляемое в следующий раз возрастало на 1, если не поступает других команд типа другого числа в кружочке?

Re: LISP. Отрисовка числа в круге.

> ВитаЛ
вас спасёт
webfile.ru/465201

Re: LISP. Отрисовка числа в круге.

> ВитаЛ
Собственно, я предполагал, что в кружке могут быть не только цифры, но и буквы.
Вот модифицированная программа, в которой к числу будет прибавляться 1 при следующем указании точки.

;******** NKRUG.LSP *******************************************
;         Программа вставки числа в кружке.
;         Для шрифта romans.shx не более 2 цифр.
;         Если шрифт arial.ttf, то может влезть и 3 цифры.
;         Можно вводить и буквы.
;         Разработал Владимир Громов 2005 г.
;
(defun C:NKRUG ( / c hold ht r tt txt1 txt)
       (setvar "cmdecho" 0)
       (princ "\n Прежняя высота текста:  ")
       (setq hold (getvar "TEXTSIZE"))
       (princ hold)
       (initget 6)
       (princ (strcat "\n РАЗМЕР (высота) текста <" (rtos hold 2 2) ">: "))
       (setq ht (getreal))
       (if (= ht nil) (setq ht hold))
       (setq r (* 1.2 ht))
       (setq tt 0)
(while tt
       (setq tt (getpoint "\n Укажите ТОЧКУ (ENTER-Хватит): "))
     (if tt
       (progn
       (if (null txt1) (setq txt1 "1"))
       (princ (strcat "\n Число <" txt1 ">: "))
       (setq txt (getstring))
       (if (= txt "") (setq txt txt1))
       (command "_CIRCLE" tt r)
       (command "_TEXT" "_M" tt ht "0" txt)
       (setq txt1 (itoa (1+ (atoi txt))))
     )); progn, if
); while
       (princ "\n Конец. ")
       (princ)
)

Возможный макрос для кнопки или пункта меню:

^C^C^P(if (not C:NKRUG) (load "nkrug")) NKRUG

Re: LISP. Отрисовка числа в круге.

Замечательная прога!!!

Re: LISP. Отрисовка числа в круге.

Громову.
А не можешь чуть подправить прогу, чтоб указанная точка была не центром окружности, а левой или правой её точкой ? По-моему для спецификации так удобнее
Заранее благодарен.

Re: LISP. Отрисовка числа в круге.

> vvp
Надо подумать.

Re: LISP. Отрисовка числа в круге.

Нумеровщик для экспликаций V1.0 для AutoCAD
(автор Fantomas, он же Smirnoff)
http://project-ss.ucoz.ru/load/12-1-0-61

Re: LISP. Отрисовка числа в круге.

чтоб указанная точка была не центром окружности, а левой или правой её точкой ?

Если при указании точки будет видно круг, то можно зряче поставить в нужное место. Вот модификация программы Владимира Громова

;******** NKRUG.LSP *******************************************
;         Программа вставки числа в кружке.
;         Для шрифта romans.shx не более 2 цифр.
;         Если шрифт arial.ttf, то может влезть и 3 цифры.
;         Можно вводить и буквы.
;         Разработал Владимир Громов 2005 г.
;
(defun C:NKRUG ( / c hold ht r tt txt1 txt pt blk *error*)
    (defun *error* (message)
      (princ message)(if blk (entdel blk))(princ))
       (setvar "cmdecho" 0)(setvar "expert" 5)
       (princ "\n Прежняя высота текста:  ")
       (setq hold (getvar "TEXTSIZE"))
       (princ hold)
       (initget 6)
       (princ (strcat "\n РАЗМЕР (высота) текста <" (rtos hold 2 2) ">: "))
       (setq ht (getreal))
       (if (= ht nil) (setq ht hold))
       (setq r (* 1.2 ht))
       (setq tt 0)
       (command "_CIRCLE" "0,0" r)
       (command "_.-block" "TMPBLK" "0,0" "_L" "")
       (command "_-INSERT" "TMPBLK" "0,0" "" "" "")
       (setq blk (entlast) pt (getvar "LASTPOINT"))
(while  tt
  (princ "\n Укажите ТОЧКУ (ENTER-Хватит): ")
  (command "_.CHANGE" blk "" "" pause "")
  (setq tt (getvar "LASTPOINT"))
  (if (equal tt pt 0.000001)
    (progn
      (entdel blk)
      (setq tt nil))
    (progn
       (if (null txt1) (setq txt1 "1"))
       (princ (strcat "\n Число <" txt1 ">: "))
       (setq txt (getstring))
       (if (= txt "") (setq txt txt1))
       (command "_CIRCLE" tt r)
       (command "_TEXT" "_M" tt ht "0" txt)
       (setq txt1 (itoa (1+ (atoi txt))) pt (getvar "LASTPOINT"))))); while
       (princ "\n Конец. ")
       (princ))

Re: LISP. Отрисовка числа в круге.

А если еще дополнить код:
На первый запрос пишешь наименование материала (пишется вверху выноски), затем длину (внизу), далее номер в круге. Далее действия как в _leader: указываешь точку на чертеже и рисуется выноска со всеми обозначениями. Круто? Или это уже где-то было?

Re: LISP. Отрисовка числа в круге.

> VVA
Если при указании точки будет видно круг, то можно зряче поставить в нужное место. Вот модификация программы Владимира Громова.
Круг не виден. :(

Re: LISP. Отрисовка числа в круге.

> Алексиус
А так

;******** NKRUG.LSP *******************************************
;         Программа вставки числа в кружке.
;         Для шрифта romans.shx не более 2 цифр.
;         Если шрифт arial.ttf, то может влезть и 3 цифры.
;         Можно вводить и буквы.
;         Разработал Владимир Громов 2005 г.
;
(defun C:NKRUG ( / c hold ht r tt txt1 txt pt blk *error*)
    (defun *error* (message)
      (princ message)(if blk (entdel blk))(princ))
       (setvar "cmdecho" 0)(setvar "expert" 5)
       (command "_.POINT" "0,0")
       (command "_.regenall")
       (entdel (entlast))
       (princ "\n Прежняя высота текста:  ")
       (setq hold (getvar "TEXTSIZE"))
       (princ hold)
       (initget 6)
       (princ (strcat "\n РАЗМЕР (высота) текста <" (rtos hold 2 2) ">: "))
       (setq ht (getreal))
       (if (= ht nil) (setq ht hold))
       (setq r (* 1.2 ht))
       (setq tt 0)
       (command "_CIRCLE" "0,0" r)
       (command "_.-block" "TMPBLK" "0,0" (entlast) "")
       (command "_-INSERT" "TMPBLK" "0,0" "" "" "")
       (setq blk (entlast) pt (getvar "LASTPOINT"))
(while  tt
  (princ "\n Укажите ТОЧКУ (ENTER-Хватит): ")
  (command "_.CHANGE" blk "" "" pause "")
  (setq tt (getvar "LASTPOINT"))
  (if (equal tt pt 0.000001)
    (progn
      (entdel blk)
      (setq tt nil))
    (progn
       (if (null txt1) (setq txt1 "1"))
       (princ (strcat "\n Число <" txt1 ">: "))
       (setq txt (getstring))
       (if (= txt "") (setq txt txt1))
       (command "_CIRCLE" tt r)
       (command "_TEXT" "_M" tt ht "0" txt)
       (setq txt1 (itoa (1+ (atoi txt))) pt (getvar "LASTPOINT"))))); while
       (princ "\n Конец. ")
       (princ))

Re: LISP. Отрисовка числа в круге.

Скажите пожалуйста Владимир!  Как написать текст горизонтально?И ноль здесь, что обозначает?
Спасибо!
(command "_TEXT" "_M" tt ht "0" txt)

Re: LISP. Отрисовка числа в круге.

> Виктор Бабченко
Вы шутите? Посмотрите в Справке AutoCAD'а описание команды "TEXT" ("ТЕКСТ").

Re: LISP. Отрисовка числа в круге.

> Виктор Бабченко
После изучения справки для лиспа можно воспользоваться уже готовыми функциями, например отсюда
https://www.caduser.ru/forum/topic30276.html
Прочти ответ ShaggyDoc. Там все сказано

Re: LISP. Отрисовка числа в круге.

> Владимир Громов
Как в вашей программе повернуть текст?Под 90 градусов.

Re: LISP. Отрисовка числа в круге.

> VVA
Спасибо! Но мне кажется я прошу повернуть текст програмно (с помощью LISP).А не получать списки углов.

Re: LISP. Отрисовка числа в круге.

> Виктор Бабченко
В моей программе "0" как раз обозначает, что текст пишется горизонтально. Если надо повернуть текст на 90 градусов, то вместо "0" надо записать "90". Только учтите, что это значение запомнится и если вы захотите вводить горизонтальный текст на экране, то придется поменять угол поворота опять на 0.

Re: LISP. Отрисовка числа в круге.

Ээээ... В качестве предложения: программно создать блок с атрибутом и вставлять его. Повернули блок - и текст следом.

Re: LISP. Отрисовка числа в круге.

Как вариант "на коленке", минимум удобства:

(defun test (/ *error* adoc blk blk_name attr)
  (defun *error* (msg)
    (vla-purgeall adoc)
    (vla-endundomark adoc)
    (princ msg)
    (princ)
    ) ;_ end of defun
  (vl-load-com)
  (vla-startundomark
    (setq adoc (vla-get-activedocument (vlax-get-acad-object)))
    ) ;_ end of vla-startundomark
  (if (not (tblobjname "block" (setq blk_name "CircleMark")))
    (progn
      (setq blk
             (vla-add (vla-get-blocks adoc) (vlax-3d-point '(0. 0. 0.)) blk_name)
            ) ;_ end of setq
      (vla-addcircle blk (vlax-3d-point '(0. 0. 0.)) 3.)
      (setq attr (vla-addattribute
                   blk
                   2.5
                   acattributemodenormal
                   "Значение"
                   (vlax-3d-point '(0. 0. 0.))
                   "value"
                   ""
                   ) ;_ end of vla-AddAttribute
            ) ;_ end of setq
      (vla-put-alignment attr acalignmentmiddlecenter)
      (vla-put-insertionpoint attr (vlax-3d-point '(0. 0. 0.)))
      (vlax-for sub blk
        (vla-put-layer sub "0")
        (vla-put-lineweight sub aclnwtbyblock)
        (vla-put-color sub 0)
        (vla-put-linetype sub "byblock")
        (vla-put-normal sub (vlax-3d-point '(0. 0. 1.)))
        ) ;_ end of vlax-for
      ) ;_ end of progn
    ) ;_ end of if
  (vl-catch-all-apply
    '(lambda ()
       (command "_.-insert" blk_name)
       (while (/= (logand (getvar "cmdactive") 31) 0)
         (command pause)
         ) ;_ end of while
       ) ;_ end of lambda
    ) ;_ end of vl-catch-all-apply
  (vla-endundomark adoc)
  (princ)
  ) ;_ end of defun

Re: LISP. Отрисовка числа в круге.

> Виктор Бабченко
Вы не дочитали пост. В своем ответе ShaggyDoc привел 3 готовые функции для написания текста
ru-text-draw - с помощью command
ru-text-add  - объектным методом
ru-text-entmake - через entmake.
Причем там учтены все нюансы, как то задана или нет высота в текстовом стиле. Осталось только из использовать как библиотечные, а еще лучше сначала понять почему там так написано.

Re: LISP. Отрисовка числа в круге.

У меня прочему то не работает. В круге вместо номера рисуется цифра ноль