(DEFUN C:mycalc	(/)

  (initget 128 "d t _d _t ")
  (setq	choise
	 (strcase
	   (getstring "\nЧто суммировать [Dimension/Text]: <Text> "
	   )
	 )
  )
  (Setq *error*func "Неверное значение!")
  (if (eq T
	  (cond
	    ((= choise "T") T)
	    ((= choise "D") T)
	    ((= choise "") T)
;;;	    (nil)
	  )				;cond
      )
    (if	(eq T
	    (cond
	      ((= choise "T") T)
	      ((= choise "") T)
;;;	      (nil)
	    )				;cond
	)
      (textcalc)
      (dimcalc)
    )					; if
    (princ *error*func)			;if -else
  )					; if
  (princ)

)					;defun C:mycalc


;;;Суммирует значение чисел в тексте---------------------------------------------------------------------------
(DEFUN textcalc	(/)


  (SSSETFIRST nil nil)
  (setq ss (SSADD))			;очищаем набор
  (princ "\nВыберите числа: ")
  (setq	ss (ssget
	     '(
	       (-4 . "<OR")
	       (-4 . "<AND")
	       (0 . "TEXT")
	       (-4 . "AND>")
	       (-4 . "<AND")
	       (0 . "MTEXT")
	       (-4 . "AND>")
	       (-4 . "OR>")
	      )
	   )
  )					;получаем набор, при выделении исключая все кроме Текта и МТекста
  (setq SelectionLenght (SSLENGTH ss))	;длина набора

  (setq List-text (list))		;обнуляем список
  (setq sum 0)

  (setq i 1)
  (while (<= i SelectionLenght)
    (progn
      (setq ent (entget (ssname ss (- i 1))))
					;(setq ent-text-value (atof (cdr (ASSOC 1 ent))))
      (setq ent-text-value (atof (comma->point ent)))
      (setq z (cdr (ASSOC 1 ent)))


      (setq List-text-i
	     (list
	       (cons i ent-text-value)
	     )
      )
      (setq List-text (append List-text List-text-i))
      (setq sum (+ sum ent-text-value))
      (setq i (1+ i))

    )					;progn

  )					;wile


  (setq make_text-Point (getpoint "\nВведите точку вставки числа: "))
  (if (= make_text-Point nil)
    (PRINC (strcat "\nСумма равна: " (rtos sum 2 3)))
    (make_text sum)
  )					; if

  (princ)

)					;   textcalc


;;;Суммирование значений размеров--------------------------------------------------------------------------------------
(DEFUN dimcalc (/)


  (SSSETFIRST nil nil)
  (setq ss (SSADD))			;очищаем набор
  (princ "\nВыберите размеры: ")
  (setq	ss (ssget
	     '(
	       (0 . "DIMENSION")
	      )
	   )
  )					;получаем набор, при выделении исключая все кроме Текта и МТекста
  (setq SelectionLenght (SSLENGTH ss))	;длина набора

  (setq List-text (list))		;обнуляем список
  (setq sum 0)

  (setq i 1)
  (while (<= i SelectionLenght)
    (progn
      (setq ent (entget (ssname ss (- i 1))))
      (setq ent-text-value (atof (dim-text-value ent)))
      (setq z (cdr (ASSOC 1 ent)))


      (setq List-text-i
	     (list
	       (cons i ent-text-value)
	     )
      )
      (setq List-text (append List-text List-text-i))
      (setq sum (+ sum ent-text-value))
      (setq i (1+ i))

    )					;progn

  )					;wile


  (setq make_text-Point (getpoint "\nВведите точку вставки числа: "))
  (if (= make_text-Point nil)
    (PRINC (strcat "\nСумма равна: " (rtos sum 2 3)))
    (make_text sum)
  )					; if

  (princ)

)					;   dimycalc


;;;функция проверяет число на наличие запятой, и если таковая есть меняет ее на десятичную точку
;;;и возвращает затем число с точкой
(DEFUN comma->point (ent /)
  (setq comma->point:ent-text-value (cdr (ASSOC 1 ent)))
  (setq comma->point:list (vl-string->list comma->point:ent-text-value))
  (setq lenght-comma->point:list (LENGTH comma->point:list))
  (setq comma 44)
  (setq point 46)
  (setq j 1)
  (setq comma->point:list-NEW (list))
  (WHILE (<= j lenght-comma->point:list)
    (setq value (nth (- j 1) comma->point:list))
    (if	(= value comma)
      (setq value point)
      (setq value value)
    )					;if
    (setq comma->point:list-j
	   (list
	     value
	   )
    )
    (setq comma->point:list-NEW
	   (append comma->point:list-NEW
		   comma->point:list-j
	   )
    )
    (setq j (1+ j))
  )					;while


  (vl-list->string comma->point:list-NEW)



)					; comma->poin

;;;вставка текста суммы------------------------------------------------------------------
(defun make_text (sum /)
  (setq textstyle (getvar "textstyle"))
  (setq clayer (getvar "clayer"))
;;;  (setq make_text-Point (getpoint "\nВведите точку вставки числа: "))
  (setq	ListText
	 (list
	   (cons 0 "MTEXT")
	   (cons 100 "AcDbEntity")	; Required for all post-R12 entities.
	   (cons 8 clayer)
	   (cons 100 "AcDbMText")	; Identifies the entity as MTEXT.
;;;	   (cons 40 mytitle:HeightText)
	   (cons 7 textstyle)
	   (cons 71 5)			; привязка текста к точке midleCentr
	   (cons 10 make_text-Point)
	   (cons 1 (rtos sum 2 3))
	 )
  )
  (ENTMAKE ListText)
  (princ)
)



;;; Функция возвращает значение 'забитого вручную' размера (все цифры после знака ; )
(DEFUN dim-text-value (ent /)
  (setq Var-DIMDEC (getvar "DIMDEC"))
  (setq dim-text-value:ent-text-value (cdr (ASSOC 1 ent)))
  (setq	dim-text-value:list
	 (vl-string->list dim-text-value:ent-text-value)
  )
  (setq lenght-dim-text-value:list (LENGTH dim-text-value:list))

  (setq	comma+point
	 59
	comma 44
	point 46
  )

  (setq j 0)				;это если функция никаких знаков ; не найдет
  (setq j2 1)

  (WHILE (<= j2 lenght-dim-text-value:list)
    (setq value (nth (- j2 1) dim-text-value:list))

    (if	(/= value comma+point)
      (setq j2 (1+ j2))			; if-then
      (progn
	(setq j j2)
	(setq j2 (1+ j2))
      )					; if-else -- progn
    )					;if
  )					;while

  (setq dim-text-value:list-NEW (list))
  (WHILE (<= j (- lenght-dim-text-value:list 1))
    (setq value (nth j dim-text-value:list))

    (if	(= value comma)
      (setq value point)
      (setq value value)
    )					;if
    (setq dim-text-value:list-j
	   (list
	     value
	   )
    )
    (setq dim-text-value:list-NEW
	   (append dim-text-value:list-NEW
		   dim-text-value:list-j
	   )
    )
    (setq j (1+ j))
  )					;while


  (setq x (rtos (cdr (ASSOC 42 ent)) 2 3)) ; просто проверка для себя

  (if (= (cdr (ASSOC 1 ent)) "")
    (rtos (cdr (ASSOC 42 ent)) 2 Var-DIMDEC)
    (if	(= (nth 0 dim-text-value:list-NEW) 60)

					; проверка - натуральный размер <>, или 'забитый вручную'
      (rtos (cdr (ASSOC 42 ent)) 2 Var-DIMDEC) ;if - then
      (vl-list->string dim-text-value:list-NEW) ; if - else
    )
  )



)					;defun -- dim-text-value
