Тема: Округление значения числа в TEXT

где-то видел раньше, а теперь найти не могу или плохо искал. Сам я в программировании абсолютный 0, нужно лиспик, который округляет значения числа в примитиве TEXT до нужного знака после запятой (с указанием точности). Например 5.89=5.9, 5.726=5.73,  в Text ничего кроме числа нет. AutoCAD 2006.
Заранее спасибо

Re: Округление значения числа в TEXT

(rtos val_real 2 1)

где: rtos - функция перевода вещественного в строку;
val_real - значение вещественного числа;
2 - десятичная форма представления числа;
1 - количество знаков после запятой.
Если надо преревести текстовое значение с другой точностью, то:

((rtos (atof val_text) 2 1)

где: atof - функция перевода текста в вещественное число;
val_text - значение в текстовом представлении.

Re: Округление значения числа в TEXT

> Юрий
а можно всё это дело в программку оформить, что бы потом в автокад подгрузить и вызывать по какой нибудь команде, а то для меня пока это тёмный лес.

Re: Округление значения числа в TEXT

Не до конца понял задание. sorry

(defun test ( / ent entity )
  (setq entity (entget (setq ent (car (entsel)))))
  (setq entity (subst (cons 1 (rtos (atof (cdr (assoc 1 entity))) 2 1)) (assoc 1 entity) entity))
  (entmod entity)
  (entupd ent)
) ; defun

нужную точность получишь меняя параметры для rtos (см.  предыдущий пост).

Re: Округление значения числа в TEXT

> Юрий
Только надо не забыть, что выдаваемое rtos'ом значение зависит от системных переменных UNITMODE, DIMZIN, LUNITS и LUPREC (см. подробнее http://dwg.ru/f/showthread.php?t=15429&page=2 )

Re: Округление значения числа в TEXT

> Юрий
работает только с одним объектом, а можно сделать что бы при указании объектов выбор не останавливался на одном объекте TEXT, а после ввода команды можно было выбрать много объектов типа TEXT ?

Re: Округление значения числа в TEXT

(defun C:TOKR ( / ss item entity ent okr)
  (initget 7)
  (setq okr (getint "\nКоличество знаков округления :"))
  (princ " Выберите тексты")
  (if (setq ss (ssget "_:L" '((0 . "TEXT"))))
     (repeat (setq item (sslength ss)) ;_ end setq
         (setq ent (ssname ss (setq item (1- item))))
         (setq entity (entget ent))
         (setq entity (subst (cons 1 (rtos (atof (cdr (assoc 1 entity))) 2 okr)) (assoc 1 entity) entity))
         (entmod entity)
         (entupd ent)
         )
    )
  (setq ss nil)
  (princ)
  )

Re: Округление значения числа в TEXT

> Игорь Куликов
Можно. Хотя уже опоздал.

(defun test ( / a ss ent entity )
  (setq ss (ssget))
  (setq a 0)
  (if ss
    (while (ssname ss a)
      (setq entity (entget (setq ent (ssname ss a))))
      (if (= "TEXT" (cdr (assoc 0 entity)))
    (progn
          (setq entity (subst (cons 1 (rtos (atof (cdr (assoc 1 entity))) 2 1)) (assoc 1 entity) entity))
          (entmod entity)
          (entupd ent)
    ) ; progn
      ) ; if
      (setq a (1+ a))
    ) ; while
  ) if ss
) ; defun

Re: Округление значения числа в TEXT

Можно, смотри прогу. Прога написана на ActiveX, потому как проще и понятнее.

(defun prc ();Устанавливаем точность округления
  (setq prec0 (if (null prec) 0 prec))
  (if (vl-catch-all-error-p (vl-catch-all-apply '(lambda ()
    (setq prec (vla-getInteger util (strcat "Точноcть округления: <" (itoa prec0) ">? "))))))
    (setq prec prec0));if
);defun
;
(defun c:RndTxt (/ adoc util ass kw)
  (vl-load-com)
  (setq adoc (vla-get-ActiveDocument (vlax-get-acad-object))
    util (vla-get-utility adoc); утилита выбора
        ass (vla-get-activeselectionset adoc)); набор
  (vla-clear ass); очистка набора от прежней грязи
  (print "\nВыберите текст для округления: ")
  (vla-SelectOnScreen ass; выбор текстовых объектов
    (vlax-safearray-fill (vlax-make-safearray vlax-vbinteger '(0 . 0)) '(0))
    (vlax-safearray-fill (vlax-make-safearray vlax-vbvariant '(0 . 0)) '("*TEXT")))
  (vlax-for txt ass; очистка набора от буквенно-цифровых элементов
    (if (wcmatch (vla-get-TextString txt) "*@*")
      (vla-removeItems ass (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbobject '(0 . 0)) (list txt))))));vlax-for
  (print (strcat "Можно округлить " (itoa (vla-get-count ass)) " чисел"))
  (vla-InitializeUserInput util 128 "Да Нет")
  (setq kw (vla-getKeyWord util "Округлять скопом [Да/Нет]: <Да>?"))
  (if (= kw "") (setq kw "Да"))
  (vla-StartUndoMark adoc)
  (if (= kw "Да") (progn (prc) (vlax-for txt ass (vla-put-TextString txt (rtos (atof (vla-get-TextString txt)) 2 prec))));progn
    (vlax-for txt ass
(vla-highlight txt T)(prc) (vla-put-TextString txt (rtos (atof (vla-get-TextString txt)) 2 prec))));if
  (vla-EndUndoMark adoc)
);end

Если чего непонятно, спрашивай.

Re: Округление значения числа в TEXT

> Лентяй
Ни себе хрена "проще"... Ты глянь хотя бы на длину кода :)

Re: Округление значения числа в TEXT

всем огромное спасибо, то что надо!!!!! Огромный респект всем!!!!

Re: Округление значения числа в TEXT

А для зануды, которому надо округление по правилам статистики:
см. http://geol-dh.ru/spds/func-rtos-round-stat.html

Re: Округление значения числа в TEXT

> Кулик Алексей aka kpblc
Проще не потому, что короче, а потому что коды ActiveX проще и понятнее AutoLisp'а. Впрочем, тем, кто жить не может без ssget и entsel этого не понять. А длиньше получается потому, что главное для нас - удобство пользователя.

Re: Округление значения числа в TEXT

и без использования RTOS

(defun vk_RtoS    (InReal Precision / Frac FracInt FracPow Int Minus)
  (if (minusp InReal)
    (setq InReal (abs InReal)
      Minus t)
  )
  (setq    Int    (fix InReal)
    Frac    (- InReal Int -1)
    FracPow    (* Frac (expt 10. Precision))
    FracInt    (fix FracPow)
  )
  (if (>= (- FracPow FracInt) 0.5)
    (setq FracInt (1+ FracInt))
  )
  (strcat (if Minus
        "-"
        ""
      )
      (if (zerop Precision)
        (itoa (+ Int FracInt -1))
        (strcat (itoa Int) "." (substr (itoa FracInt) 2))
      )
  )
)

Re: Округление значения числа в TEXT

> Vovka

(VK_RTOS 12345678901 8); ошибка: неверный тип аргумента: fixnump: 1.23457e+010
(rtos 12345678901 2 8) ;"12345678901"

Re: Округление значения числа в TEXT

> VVA
это изза ограничения типа инт - 2147483647.
я в работе больших чисел не используюю :)

Re: Округление значения числа в TEXT

переделал для бОльших чисел
https://www.caduser.ru/forum/topic39671.html

Re: Округление значения числа в TEXT

Скажите пожалуйста, а как быть, если выводимое число должно оставлять определенное количество знаков после целых (ну скажем до сотых), а функция rtos, если при округлении получается 0, срезает до десятых или до целых (11.293333....выводит 11.3, а надо 11.30)???

Re: Округление значения числа в TEXT

> [Re:] G_RAV

(setvar 'dimzin 0)
(rtos 11.293333 2 2) -> "11.29"
(rtos 11.296333 2 2) -> "11.30"

Re: Округление значения числа в TEXT

> [Re:] CB
Во тема!!! Все работает! А я парился! Спасибо! Для смеху напишу, что я делал:
;;;;;;  РАССТОЯНИЯ
    (setq dst (rtos (distance kt kt2) 2 2))
    (setq dlnS (strlen dst))
        (if ( = dlnS 1) (setq dst (strcat dst ".00")))
      (setq dst1(substr dst 4 1))
        (setq dst2(substr dst 3 1))
        (setq dst3(substr dst 2 1))
     
    (if ( = dst1  ".") (setq dst2_1 (substr dst 5 2)))
      (if ( = dst2  ".") (setq dst2_1 (substr dst 4 2)))
        (if ( = dst3  ".") (setq dst2_1 (substr dst 3 2)))
     
     
      (setq dln (strlen dst2_1))
        (if ( = dln 1) (setq dst (strcat dst "0")))

Re: Округление значения числа в TEXT

Подскажите пожалуйста, как использовать

(setvar 'dimzin 0)
(rtos 11.293333 2 2) -> "11.29"
(rtos 11.296333 2 2) -> "11.30"

Я использую лисп для подсчета суммы Мтекстов ( https://www.caduser.ru/forum/topic19661.html )и мне нужно, чтобы он писал результат с запятой вместо точки в указанный МТЕКСТ и еще округлял его до двух знаков после запятой, даже если это будут нули. Пожалуйста помогите советом. Я наделал каких-то телодвижений...Помню, что по совету ZZZ с другой темы этого форума я сделал вот что

Добавить код
(setq value (vl-string-subst "," "." value))
перед
(princ (strcat "\n Сумма = " value))

...потом еще что-то сделал и стало шесть цифр после запятой. Вернулся к исходному файлу лиспа, сделал только совет ZZZ опять,а шесть нолей осталось. Причем исходный файл, тот, что ставит точку, обрезает все лишние нули...((Что можно сделать?

Re: Округление значения числа в TEXT

> skkkk
Выдрал с темы
https://www.caduser.ru/forum/topic19661.html
Замену в тексте точки на запятую было пожеланием пользователей при выводе окончательного результата но никак в теле програмы перед вычислениями
там даже стоит код в самом теле программы (исходные данные) по замене запятой на точку
(vl-string-subst
            "."
            ","
            (cdr (assoc 1 (entget a)))
Надо быть внимательнее и знать что делаеш, а то слепить со всего что-то то что-то и получится.
в той теме есть округление но тоже с проблемами и вроде уже кемто исправленно.

Re: Округление значения числа в TEXT

> skkkk
Попробуй округлять ф-циями SumTE и SumTN отсюда:
Как сосчитать сумму цифр из отдельных мтекстов (и лисп для подсчета спецификаций) Последняя сборка в #366. Пока ставит точку, но в следующем релизе разделитель будет или настраиваться или браться системный.

Re: Округление значения числа в TEXT

Дело в том, что в пределах одного чертежа-файла мне бывают нужны результаты с разным количеством знаков после запятой ( или после точки - тоже все в том же чертеже).Для каждого действия я использую отдельный лисп с кнопкой. Для некоторых я беру одинаковые лиспы, что-то в них изменив, дав другое имя команде и настроив каждому отдельную кнопку. Есть ли какой-либо что ли аппендикс такой, универсальный, чтоб его можно было добавить в нужный лисп, задать нужное число знаков округления, и он бы округлял, невзирая на значение точности(формат>единицы), либо, может быть, меняя это значение? При этом важно чтобы количество знаков после запятой (или точки) было в каждом случае постоянным, даже если это будут нули