Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > LISP.Сумматор

LISP.Сумматор

Ответ
Поиск в этой теме
Непрочитано 30.03.2011, 12:06 2 | #1
LISP.Сумматор
Do$
 
AutoCAD/Civil3D LISP/C#
 
Санкт-Петербург
Регистрация: 15.08.2008
Сообщений: 1,702

По мотивам этой программы (в версиях выше 2006 не работает): http://dwg.ru/dnl/284
Суммирует значения текстов, длины линий, значения размеров. Поддерживается предварительный выбор. Настройки программы сохраняются в реестре в ветке "HKEY_CURRENT_USER\Software\Do$\Lsp_for_acad\summator"
Результат вычисления можно вставить в текст.
Настройки:
Разделитель.Разделитель целой и дробной части числа. Используется для подсчетов чисел в текстах, для вывода результата суммирования и для вставки результата в текст. Например, если установить в качестве разделителя запятую, то записи в текстах вида: "12.5" не будут восприниматься как числа.
Коэффициент.Коэффициент, на который умножается результат сложения.
Точность.Точность отображения складываемых чисел и результата (количество знаков дробной части). Именно отображения - потому что вычисления производятся с точностью до 6 значащих цифр.
Код:
[Выделить все]
 (defun c:summator (/
		   get-tmp-file
		   assoc-value
		   select-objects
		   list-to-string
		   ent-sel-no-empty
		   _rusp
		   get-number-for-summator
		   dialog-summator-fun
		   pre-dialog-fun
		   adoc
		   sum_obj
		   sum_del
		   sum_scl
		   sum_prc
		   sum_dia_pos
		   sum_dia_pos1
		   din
		   ddn
		   dfn
		   obj_lst
		   del
		   err_msg
		   rez
		  )

  ;;Для очистки реестра от данных этой программы: (VL-REGISTRY-DELETE "HKEY_CURRENT_USER\\Software\\Do$\\Lsp_for_acad\\summator\\")
  ;;Для очистки реестра от данных всех моих программ: (VL-REGISTRY-DELETE "HKEY_CURRENT_USER\\Software\\Do$")


  (vl-load-com)

  (defun get-tmp-file (lst / fo fn)
		      ;|
Функция создания временного файла и записи в него строк из списка.
Аргументы:
	lst - список из строк, которые будут записаны в файл
	      (каждая строка будет записана в файл "с новой строки")
Возвращаемое значение:
	Строка, содержащая полный путь к созданному временному файлу с именем файла на конце.
Пример вызова:
((lambda (/ file-name)
   (startapp "Notepad.exe"
	     (setq
	       file-name
		(get-tmp-file
		  (list	"Пример записи строк во временный файл:"
			"- Это будет второй строкой"
			"- Это станет третьей строкой"
			"- Ну! И так и далее..."
		  ) ;_ end of list
		) ;_ end of get-tmp-file
	     ) ;_ end of setq
   ) ;_ end of startapp
   (vl-file-delete (findfile file-name))
 ) ;_ end of lambda
)
  |;
    (setq fn (vl-filename-mktemp nil nil ".tmp")
	  fo (open fn "w")
    ) ;_ end of setq
    (foreach
	      str
		 lst
      (write-line
	(vl-princ-to-string str)
	fo
      ) ;_ end of write-line
    ) ;_ end of foreach
    (close fo)
    fn
  ) ;_ end of defun

  (defun assoc-value (cd ent)
    (cdr (assoc cd (entget ent)))
  ) ;_ end of defun

  (defun select-objects	(msg
			 types_lst
			 /
			 check-first-set
			 ss-get-to-lst
			 ss-to-lst
			 ss-get
			 ent_lst
			)
    ;;(select-objects "Выберите тексты:" '("TEXT"))
    ;;(apply (function select-objects)  '("Выберите линии:" ("*LINE" "ARC" "ELLIPSE")))

    (defun check-first-set (types_lst / ssf ent_lst)
      ;;(check-first-set '("LINE"))
      (if
	(and (setq ssf (ssget "_I"))
	     (vl-every
	       (function (lambda (ent / typ)
			   (setq typ (assoc-value 0 ent))
			   (vl-member-if
			     (function (lambda (a) (wcmatch typ a)))
			     types_lst
			   ) ;_ end of vl-member-if
			 ) ;_ end of lambda
	       ) ;_ end of function
	       (setq ent_lst (ss-to-lst ssf))
	     ) ;_ end of vl-every
	) ;_ end of and
	 ent_lst
      ) ;_ end of if 
    ) ;_ end of defun

    (defun ss-get-to-lst (rep lst / ss)
      ;; Пример вызова: (ss-get-to-lst "Выберите объекты:" (list '((0 . "TEXT"))))
      ;; Используется ф-ция: ss-get, ss-to-lst
      ;; Возвращает список ename выбранных объектов nil или T
      (setq ss (ss-get rep lst))
      (if (= (type ss) (quote pickset))
	(ss-to-lst ss)
	ss
      ) ;_ end of if
    ) ;_ end of defun

    (defun ss-to-lst (ss / i ent lst)
      ;;Преобразует набор в ename-список объектов
      ;;(ss-to-lst (ssget))
      (setq i 0)
      (while (setq ent (ssname ss i))
	(setq lst (cons ent lst)
	      i	  (1+ i)
	) ;_ end of setq
      ) ;_ end of while
      (reverse lst)
    ) ;_ end of defun

    (defun ss-get (rep lst / ss)
      ;;(ss-get "Выберите отрезки:" (list '((0 . "LINE"))))
      (prompt rep)
      (setq
	ss (vl-catch-all-apply
	     (function ssget)
	     lst
	   ) ;_ end of vl-catch-all-apply
      ) ;_ end of setq
      (cond
	((vl-catch-all-error-p ss) nil)
	((not ss) T)
	(T ss)
      ) ;_ end of cond
    ) ;_ end of defun

    (cond
      ((check-first-set types_lst))
      ((progn
	 (sssetfirst nil nil)
	 (ss-get-to-lst
	   msg
	   (list
	     (append
	       (quote ((-4 . "<OR")))
	       (mapcar (function (lambda (typ) (cons 0 typ))) types_lst)
	       (quote ((-4 . "OR>")))
	     ) ;_ end of append
	   ) ;_ end of list
	 ) ;_ end of ss-get-to-lst
       ) ;_ end of progn
      )
    ) ;_ end of cond
  ) ;_ end of defun

  (defun list-to-string	(lst del)
    ;;(list-to-string '("test1a" "test2a" "test3a") "_ab_")
    (apply
      (function strcat)
      (cons
	(car lst)
	(mapcar	(function (lambda (a) (strcat del a)))
		(cdr lst)
	) ;_ end of mapcar
      ) ;_ end of cons
    ) ;_ end of apply
  ) ;_ end of defun

  (defun ent-sel-no-empty (msg / ent-sel sel)
    ;;(ent-sel-no-empty "\nВыберите объект:")
    ;;Возврат:
    ;;  nil - если была нажата клавиша Esc
    ;;  T - если была нажата клавиша Enter
    ;;  (<ename> <point>) - был указан объект

    (defun ent-sel (msg / sel)

      ;;Функция выбора объекта.
      ;;Аргументы: msg - сообщение, которое будет показываться при выборе объекта.
      ;;Возвращаемые значения:
      ;; - список вида (nil <точка>), если при щелчке мыши ни один объект не попал в прицел
      ;; - T, если вместо выбора объекта нажата клавиша Enter
      ;; - NIL, если вместо выбора объекта нажата клавиша Esc
      ;; - список вида (<ename> <точка>) или строка-ключевое слово (ключевые слова задаются предварительным initget)
      ;;Пример вызова:
      ;;(progn (initget "Тест _Test")(ent-sel "\nУкажите объект:[Тест]"))

      (cond
	((not
	   (setq sel (vl-catch-all-apply
		       (function (lambda () (entsel msg)))
		     ) ;_ end of vl-catch-all-apply
	   ) ;_ end of setq
	 ) ;_ end of not
	 (cond
	   ((= (getvar "errno") 7)
	    (list nil (cadr (grread T 9)))
	   )
	   ((= (getvar "errno") 52) T)
	 ) ;_ end of cond
	)
	((vl-catch-all-error-p sel) nil)
	(T sel)
      ) ;_ end of cond
    ) ;_ end of defun

    (while (and	(setq sel (ent-sel msg))
		(listp sel)
		(not (car sel))
	   ) ;_ end of and
      (prompt (if (_rusp)
		" Ничего не указано!"
		" Nothing selected!"
	      ) ;_ end of if
      ) ;_ end of prompt
    ) ;_ end of while
    sel
  ) ;_ end of defun

  (defun _rusp () (= (getvar "syscodepage") "ANSI_1251"))

;;;Setttings

  (setq	dfn	    (get-tmp-file
		      (if (_rusp)
			(list
			  "summator"
			  ":dialog{label=\"Сложение данных\";\t"
			  "\t:popup_list {label=\"Суммируем:\"; key=\"obj\"; list=\"Текстовые значения\\nРазмеры\\nДлины линий\";}"
			  "\t:row{"
			  "\t\t:button {label=\"Выбрать объекты\"; key=\"sel\"; width=5; height=1; fixed_width=true; is_default=true; initial_focus=true;}"
			  "\t\t:button {label=\"Настройки\"; key=\"set\"; height=1; fixed_width=true;}"
			  "\t}"
			  "\t:column{label=\"Результат\";"
			  "\t\t:edit_box {key=\"rez\"; height=1;}"
			  "\t\t:errtile {}"
			  "\t\t:button {label=\"Вставить результат в текст\"; key=\"ins\"; height=1; fixed_width=true; is_enabled=false;}\t\t"
			  "\t}"
			  "\t:row{"
			  "\t\t:button {label=\"История\"; key=\"hst\"; height=1; fixed_width=true;}"
			  "\t\t:cancel_button {label=\"Выход\";}\t\t"
			  "\t\t:info_button {label=\"Инфо\"; is_enabled=false;}}\t"
			  "}//end of dialog"
			  ""
			  "histori"
			  ":dialog{label=\"История вычислений                                                                         \";"
			  ":list_box {key=\"exp\"; height=15;}"
			  "ok_button;"
			  "}//end of dialog"
			  ""
			  "settings"
			  ":dialog{label=\"Настройки\";"
			  ":radio_column {key=\"del\"; label=\"Разделитель\";"
			  "\t:radio_button {label=\". (Точка)\"; key=\".\";}"
			  "\t:radio_button {label=\", (Запятая)\"; key=\",\";}}\t"
			  ":edit_box {label=\"Коэффициент:\"; key=\"scl\"; width=6; height=1; fixed_width=true;}"
			  ":popup_list {label=\"Точность:\"; key=\"prc\"; list=\"0\\n0.0\\n0.00\\n0.000\\n0.0000\\n0.00000\\n0.000000\\n0.0000000\\n0.00000000\";}"
			  ":row{"
			  "\t:ok_button {label=\"Сохранить\";}"
			  "\t:cancel_button {label=\"Отмена\";}}"
			  "}//end of dialog"
			) ;_ end of list
			(list
			  "summator"
			  ":dialog{label=\"Summator for acad\";\t"
			  "\t:popup_list {label=\"Objects:\"; key=\"obj\"; list=\"Texts\\nDimensions\\nLines length\";}"
			  "\t:row{"
			  "\t\t:button {label=\"Select objects\"; key=\"sel\"; width=5; height=1; fixed_width=true; is_default=true; initial_focus=true;}"
			  "\t\t:button {label=\"Settings\"; key=\"set\"; height=1; fixed_width=true;}"
			  "\t}"
			  "\t:column{label=\"Result\";"
			  "\t\t:edit_box {key=\"rez\"; height=1;}"
			  "\t\t:errtile {}"
			  "\t\t:button {label=\"Insert rezult in text\"; key=\"ins\"; height=1; fixed_width=true; is_enabled=false;}\t\t"
			  "\t}"
			  "\t:row{"
			  "\t\t:button {label=\"History\"; key=\"hst\"; height=1; fixed_width=true;}"
			  "\t\t:cancel_button {label=\"Exit\";}\t\t"
			  "\t\t:info_button {label=\"Info\"; is_enabled=false;}}\t"
			  "}//end of dialog"
			  ""
			  "histori"
			  ":dialog{label=\"History                                                                               \";"
			  ":list_box {key=\"exp\"; height=15;}"
			  "ok_button;"
			  "}//end of dialog"
			  ""
			  "settings"
			  ":dialog{label=\"Settings\";"
			  ":radio_column {key=\"del\"; label=\"Delimeter\";"
			  "\t:radio_button {label=\". (Point)\"; key=\".\";}"
			  "\t:radio_button {label=\", (Comma)\"; key=\",\";}}\t"
			  ":edit_box {label=\"Multiplier:\"; key=\"scl\"; width=6; height=1; fixed_width=true;}"
			  ":popup_list {label=\"Precision:\"; key=\"prc\"; list=\"0\\n0.0\\n0.00\\n0.000\\n0.0000\\n0.00000\\n0.000000\\n0.0000000\\n0.00000000\";}"
			  ":row{"
			  "\t:ok_button {label=\"  Save  \";}"
			  "\t:cancel_button {label=\"Cancel\";}}"
			  "}//end of dialog"
			) ;_ end of list
		      ) ;_ end of if
		    ) ;_ end of get-tmp-file
	obj_lst	    (if	(_rusp)
		      (quote (("Тексты" "Выберите тексты:" ("TEXT" "MTEXT"))
			       ("Длины линий"
				 "Выберите линии:"
				 ("*LINE" "ARC" "ELLIPSE")
			       )
			       ("Размеры" "Выберите размеры:" ("DIMENSION"))
			     )
		      ) ;_ end of quote
		      (quote (("Text contents" "Select texts:" ("TEXT" "MTEXT"))
			       ("Lines length"
				 "Select lines:"
				 ("*LINE" "ARC" "ELLIPSE")
			       )
			       ("Dimensions" ":" ("DIMENSION"))
			     )
		      ) ;_ end of quote
		    ) ;_ end of if
	sum_obj	    (cond
		      ((vl-registry-read
			 "HKEY_CURRENT_USER\\Software\\Do$\\Lsp_for_acad\\summator\\"
			 "sum_obj"
		       ) ;_ end of vl-registry-read
		      )
		      (T
		       (vl-registry-write
			 "HKEY_CURRENT_USER\\Software\\Do$\\Lsp_for_acad\\summator\\"
			 "sum_obj"
			 "0"
		       ) ;_ end of vl-registry-write
		      )
		    ) ;_ end of cond
	sum_del	    (cond
		      ((vl-registry-read
			 "HKEY_CURRENT_USER\\Software\\Do$\\Lsp_for_acad\\summator\\"
			 "sum_del"
		       ) ;_ end of vl-registry-read
		      )
		      (T
		       (vl-registry-write
			 "HKEY_CURRENT_USER\\Software\\Do$\\Lsp_for_acad\\summator\\"
			 "sum_del"
			 "."
		       ) ;_ end of vl-registry-write
		      )
		    ) ;_ end of cond
	sum_scl	    (read
		      (cond
			((vl-registry-read
			   "HKEY_CURRENT_USER\\Software\\Do$\\Lsp_for_acad\\summator\\"
			   "sum_scl"
			 ) ;_ end of vl-registry-read
			)
			(T
			 (vl-registry-write
			   "HKEY_CURRENT_USER\\Software\\Do$\\Lsp_for_acad\\summator\\"
			   "sum_scl"
			   "1.0"
			 ) ;_ end of vl-registry-write
			)
		      ) ;_ end of cond
		    ) ;_ end of read
	sum_prc	    (atoi
		      (cond
			((vl-registry-read
			   "HKEY_CURRENT_USER\\Software\\Do$\\Lsp_for_acad\\summator\\"
			   "sum_prc"
			 ) ;_ end of vl-registry-read
			)
			(T
			 (vl-registry-write
			   "HKEY_CURRENT_USER\\Software\\Do$\\Lsp_for_acad\\summator\\"
			   "sum_prc"
			   (itoa (getvar "luprec"))
			 ) ;_ end of vl-registry-write
			)
		      ) ;_ end of cond
		    ) ;_ end of atoi
	sum_dia_pos (read
		      (cond
			((vl-registry-read
			   "HKEY_CURRENT_USER\\Software\\Do$\\Lsp_for_acad\\summator\\"
			   "sum_dia_pos"
			 ) ;_ end of vl-registry-read
			)
			(T
			 (vl-registry-write
			   "HKEY_CURRENT_USER\\Software\\Do$\\Lsp_for_acad\\summator\\"
			   "sum_dia_pos"
			   (vl-princ-to-string '(-1 -1))
			 ) ;_ end of vl-registry-write
			)
		      ) ;_ end of cond
		    ) ;_ end of read
  ) ;_ end of setq


;;;Support functions


  (defun get-number-for-summator (ent / typ str val)
    ;;(get-number-for-summator (car (entsel)))
    (cond
      ((and
	 (wcmatch (setq typ (assoc-value 0 ent)) "TEXT,MTEXT")
	 (not
	   (and	(wcmatch (setq str (assoc-value 1 ent)) "*`.*")
		(/= sum_del ".")
	   ) ;_ end of and
	 ) ;_ end of not
	 (numberp
	   (setq
	     val (distof
		   (vl-string-subst "." sum_del str)
		 ) ;_ end of atof
	   ) ;_ end of setq
	 ) ;_ end of numberp
       ) ;_ end of and
       val
      )
      ((= typ "DIMENSION") (assoc-value 42 ent))
      ((= typ "LINE")
       (distance (assoc-value 10 ent)
		 (assoc-value 11 ent)
       ) ;_ end of distance
      )
      ((wcmatch typ "*LINE,ARC,ELLIPSE")
       (vlax-curve-getDistAtPoint ent (vlax-curve-getEndPoint ent))
      )
    ) ;_ end of cond
  ) ;_ end of defun

  (defun dialog-summator-fun (key value reason data x y)
    (setq
      sum_dia_pos
       (cond
	 ((= key "sel")
	  (setq rez nil)
	  (done_dialog 1)
	 )
	 ((= key "cancel") (done_dialog 0))
	 ((= key "ins") (setq rez (get_tile "rez")) (done_dialog 3))
	 ((= key "obj")
	  (setq	val_lst	nil
		rez nil
		sum_obj	value
	  ) ;_ end of setq
	  (done_dialog 2)
	 )
	 ((= key "set") (done_dialog 4))
	 ((= key "hst")
	  (new_dialog
	    "histori"
	    din ;|"(if (= $key \"accept\") (done_dialog 1))"|;
	  ) ;_ end of new_dialog
	  (start_list "exp")
	  (mapcar (function add_list) *sum-hist-lst*)
	  (end_list)
	  (start_dialog)
	 )
       ) ;_ end of cond
    ) ;_ end of setq
  ) ;_ end of defun

  (defun pre-dialog-fun	()
    (start_list "obj")
    (mapcar (function add_list) (mapcar (function car) obj_lst))
    (end_list)
    (set_tile "error"
	      (cond (err_msg)
		    (T "")
	      ) ;_ end of cond
    ) ;_ end of set_tile
    (set_tile "obj" sum_obj)
    (if	rez
      (progn
	;;(setq *sum-hist-lst* nil)
	(set_tile "rez" rez)
	(if (equal ddn T)
	  (mode_tile "sel" 2)
	  (progn (mode_tile "ins" 0)
		 (mode_tile "ins" 2)
	  ) ;_ end of progn
	) ;_ end of if
      ) ;_ end of progn
      (progn
	(mode_tile "ins" 1)
	(set_tile "rez" "")
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun


;;;Body

  (if (> (setq din (load_dialog dfn)) 0)
    (progn
      (while (not (member ddn (list 0)))
	(if (new_dialog
	      "summator"
	      din
	      "(dialog-summator-fun $key $value $reason $data $X $Y)"
	      sum_dia_pos
	    ) ;_ end of new_dialog
	  (progn
	    (pre-dialog-fun)
	    (setq ddn (start_dialog))
	  ) ;_ end of progn
	) ;_ end of if
	(cond
	  ((= ddn 1)
	   ((lambda (/ ent_lst val_lst)
	      (setq ddn	    nil
		    ent_lst (apply (function select-objects)
				   (cdr (nth (atoi sum_obj) obj_lst))
			    ) ;_ end of apply
	      ) ;_ end of setq
	      (setq err_msg
		     (cond
		       ((not (and ent_lst (listp ent_lst)))
			(if (_rusp)
			  "Ничего не выбрано!"
			  "Nothing select!"
			) ;_ end of if
		       )
		       ((member	nil
				(setq val_lst
				       (mapcar (function get-number-for-summator)
					       ent_lst
				       ) ;_ end of mapcar
				) ;_ end of setq
			) ;_ end of member
			(if (_rusp)
			  "Недопустимые символы в тексте!"
			  "Invalid characters in text!"
			) ;_ end of if
		       )
		       (T
			(setq
			  rez		 (vl-string-subst
					   sum_del
					   "."
					   (rtos
					     (*	sum_scl
						(apply (function +) val_lst)
					     ) ;_ end of *
					     2
					     sum_prc
					   ) ;_ end of rtos
					 ) ;_ end of vl-string-subst
			  *sum-hist-lst* (cons
					   (strcat
					     "("
					     (list-to-string
					       (mapcar
						 (function
						   (lambda (val)
						     (vl-string-subst
						       sum_del
						       "."
						       (rtos val
							     2
							     sum_prc
						       ) ;_ end of rtos
						     ) ;_ end of vl-string-subst
						   ) ;_ end of lambda
						 ) ;_ end of function
						 val_lst
					       ) ;_ end of mapcar
					       "+"
					     ) ;_ end of list-to-string
					     ")*"
					     (vl-string-subst
					       sum_del
					       "."
					       (vl-princ-to-string
						 sum_scl
					       ) ;_ end of vl-princ-to-string
					     ) ;_ end of vl-string-subst
					     "="
					     rez
					   ) ;_ end of strcat
					   *sum-hist-lst*
					 ) ;_ end of cons
			) ;_ end of setq
			nil
		       )
		     ) ;_ end of cond
	      ) ;_ end of setq
	    ) ;_ end of lambda
	   )
	  )
	  ((= ddn 3)
	   (setq ddn T)
	   ((lambda (/ txt)
	      (while
		(and (setq
		       txt (ent-sel-no-empty
			     (if (_rusp)
			       "\nУкажите текст для вставки результата:"
			       "\nSelect text:"
			     ) ;_ end of if
			   ) ;_ end of ent-sel-no-empty
		     ) ;_ end of setq
		     (listp txt)
		) ;_ end of and
		 (if
		   (wcmatch (assoc-value 0 (car txt)) "TEXT,MTEXT")
		    (progn
		      (vla-StartUndoMark
			(setq adoc (vla-get-ActiveDocument
				     (vlax-get-acad-object)
				   ) ;_ end of vla-get-ActiveDocument
			) ;_ end of setq
		      ) ;_ end of vla-StartUndoMark
		      (entmod (list (cons -1 (car txt)) (cons 1 rez)))
		      (vla-EndUndoMark adoc)
		    ) ;_ end of progn
		    (prompt (if	(_rusp)
			      " Указанное не является текстом!"
			      " Not text! Select text or mtext!"
			    ) ;_ end of if
		    ) ;_ end of prompt
		 ) ;_ end of if
	      ) ;_ end of while
	    ) ;_ end of lambda
	   )
	  )

	  ((= ddn 4)
	   (setq ddn nil
		 rez nil
	   ) ;_ end of setq
	   ((lambda (/ dialog-summator-fun1 ddn)

	      (defun dialog-summator-fun1 (key value reason data x y)
		(setq sum_dia_pos1
		       (cond
			 ((= key "accept")
			  (setq sum_del (get_tile "del"))
			  (setq sum_scl (atof (get_tile "scl")))
			  (setq sum_prc (atoi (get_tile "prc")))
			  (done_dialog 1)
			 )
		       ) ;_ end of cond
		) ;_ end of setq
	      ) ;_ end of defun
	      (while (not (member ddn (list 0 1)))
		(if
		  (new_dialog
		    "settings"
		    din
		    "(dialog-summator-fun1 $key $value $reason $data $X $Y)"
		    (cond
		      (sum_dia_pos1)
		      (sum_dia_pos)
		    ) ;_ end of cond
		  ) ;_ end of new_dialog
		   (progn
		     (set_tile "del" sum_del)
		     (set_tile "scl" (rtos sum_scl 2 sum_prc))
		     (set_tile "prc" (itoa sum_prc))
		     (setq ddn (start_dialog))
		   ) ;_ end of progn
		) ;_ end of if
	      ) ;_ end of while
	    ) ;_ end of lambda
	   )
	  )
	) ;_ end of cond
      ) ;_ end of while
      (unload_dialog din)
    ) ;_ end of progn
  ) ;_ end of if
  (vl-file-delete dfn)
  (vl-registry-write
    "HKEY_CURRENT_USER\\Software\\Do$\\Lsp_for_acad\\summator\\"
    "sum_obj"
    sum_obj
  ) ;_ end of vl-registry-write
  (vl-registry-write
    "HKEY_CURRENT_USER\\Software\\Do$\\Lsp_for_acad\\summator\\"
    "sum_del"
    sum_del
  ) ;_ end of vl-registry-write
  (vl-registry-write
    "HKEY_CURRENT_USER\\Software\\Do$\\Lsp_for_acad\\summator\\"
    "sum_scl"
    (vl-princ-to-string sum_scl)
  ) ;_ end of vl-registry-write
  (vl-registry-write
    "HKEY_CURRENT_USER\\Software\\Do$\\Lsp_for_acad\\summator\\"
    "sum_prc"
    (itoa sum_prc)
  ) ;_ end of vl-registry-write
  (vl-registry-write
    "HKEY_CURRENT_USER\\Software\\Do$\\Lsp_for_acad\\summator\\"
    "sum_dia_pos"
    (vl-princ-to-string sum_dia_pos)
  ) ;_ end of vl-registry-write
  (princ)
) ;_ end of defun

Миниатюры
Нажмите на изображение для увеличения
Название: Summator1.JPG
Просмотров: 1016
Размер:	14.3 Кб
ID:	56566  Нажмите на изображение для увеличения
Название: Summator2.JPG
Просмотров: 783
Размер:	9.7 Кб
ID:	56567  

Вложения
Тип файла: lsp summator.lsp (19.4 Кб, 1175 просмотров)

__________________
Толковый выбор приходит с опытом, а к нему приводит выбор бестолковый. (The Mechanic)
Просмотров: 16967
 
Непрочитано 13.05.2011, 13:49
#2
Mak


 
Регистрация: 18.06.2009
Сообщений: 117


Если значение размера вбито вручную, то считается не правильно...
Mak вне форума  
 
Автор темы   Непрочитано 25.05.2011, 11:55
#3
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Беда в том, что там может быть вбито все что угодно, а не только значение размера... Но замечание дельное, надо будет поправить, спасибо!
Do$ вне форума  
 
Непрочитано 25.05.2011, 16:48
1 | #4
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Do$ Посмотреть сообщение
Беда в том, что там может быть вбито все что угодно
Можно воспользоваться ф-цией str->list и выбрать числа
Размер в Атокаде представляет собой анонимный блок *D Так вот в мтексте этого блока содержится "видимая" строка. Подсчитанная или вбитая ручками. Я этот способ использовал в dimtools. Можешь посмотреть здесь ф-цию dim-get-text-string
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 30.05.2012 в 12:14.
VVA вне форума  
 
Автор темы   Непрочитано 06.06.2011, 15:28
#5
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Mak Посмотреть сообщение
Если значение размера вбито вручную, то считается не правильно...
Добавил настройку, теперь можно выбрать что будет считаться: реальное значение размера или вбитое ручную (Настройки-Дополнительно). Спасибо VVA за помощь!
Вложения
Тип файла: lsp summator.lsp (25.5 Кб, 455 просмотров)

Последний раз редактировалось Do$, 20.06.2011 в 16:57.
Do$ вне форума  
 
Непрочитано 06.06.2011, 16:01
#6
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,990
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Еще один Text Calculator
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 12.08.2012, 17:30
#7
Alexey_02


 
Регистрация: 23.05.2007
Москва
Сообщений: 97


Вчера установил, попробовал - все работало. Сегодня запустил. Выдает ошибку. Сообщение AutoCAD:

Цитата:
"Base.dd"
Не удается найти файл
Жму "ОК"
Дальше сообщение:

Цитата:
Ошибка в файле диалога
"C\users\XXX\Appdata\local\temp\$VL~~004.tmp", строка 2:
внимание: неопределенный объект.
Символ: "summator"
Жму "ОК"
Дальше сообщение:

Цитата:
Ошибка в файле диалога
"C\users\XXX\Appdata\local\temp\$VL~~004.tmp", строка 2:
синтаксическая ошибка.
Символ: "summator"
В чем может быть проблема?


Windows 7 SP1 64bit
AutoCAD 2012ru 64bit
__________________
Вот так вот, ...
Alexey_02 вне форума  
 
Непрочитано 14.08.2012, 14:41
#8
_mikka


 
Регистрация: 29.12.2010
Сообщений: 111


А можно ли добавить полилинии, дуги и окружности и в идеале сплайн?
_mikka вне форума  
 
Автор темы   Непрочитано 16.08.2012, 10:06
#9
Do$

AutoCAD/Civil3D LISP/C#
 
Регистрация: 15.08.2008
Санкт-Петербург
Сообщений: 1,702
Отправить сообщение для Do$ с помощью Skype™


Цитата:
Сообщение от Alexey_02 Посмотреть сообщение
В чем может быть проблема?
Похоже на какую-то беду с автокадом.

Цитата:
Сообщение от _mikka Посмотреть сообщение
А можно ли добавить полилинии, дуги и окружности и в идеале сплайн?
Куда добавить? Длины полилиний точно суммируются. По поводу длин дуг, окружностей и сплайнов посмотрю на досуге.
Do$ вне форума  
 
Непрочитано 21.08.2012, 10:54
#10
Вовочка

пищевая технология
 
Регистрация: 02.06.2009
Киев
Сообщений: 283
<phrase 1=


А можно сделать следующее. Помимо "вставить результат в текст", которое требует выбрать аннотацию с последующей заменой на результат суммирования, добавить "вставить аннотацию" стиль которой будет задан предварительно выбранными слагающими. Эта функция будет создавать новую аннотацию с суммой выбранного.
Вовочка вне форума  
 
Непрочитано 29.09.2015, 09:48
#11
SilvioManuel


 
Регистрация: 11.08.2010
Сообщений: 121


вот два кода которые я накопал на форуме (спасибо их создателям и долгих лет жизни им) годнота
Вложения
Тип файла: rar LSV.rar (136.4 Кб, 215 просмотров)
Тип файла: lsp summator.lsp (1.3 Кб, 200 просмотров)
SilvioManuel вне форума  
 
Непрочитано 27.02.2018, 16:45
#12
veb86

Проектировщик электрических сетей
 
Регистрация: 17.01.2014
Пенза
Сообщений: 176


Здравствуйте!

Цитата:
Сообщение от Do$ Посмотреть сообщение
Добавил настройку, теперь можно выбрать что будет считаться: реальное значение размера или вбитое ручную (Настройки-Дополнительно). Спасибо VVA за помощь!
Хороший сумматор!
Можно добавить еще одну настройку когда суммируются цифры в которых использовалась точка и цифры в которых использовалась запятая. Думаю это не сложно.

Цитата:
Сообщение от SilvioManuel Посмотреть сообщение
вот два кода которые я накопал на форуме (спасибо их создателям и долгих лет жизни им) годнота
Сумматор из данного примера (summator.lsp) не правильно складывает между собой текст многострочный и однострочный. у меня 15 (однострочный) + 55 (многострочный) получилось 7
Скорее всего ошибка жутко примитивная...
veb86 вне форума  
 
Непрочитано 27.02.2018, 17:29
#13
ProjectMaster


 
Регистрация: 21.08.2017
Сообщений: 1,054


Сумматор желательно должен уметь:
1. Объединять строки с разделителем
2. Добавлять сумму к тексту
3. Считать сумму в точку
4. Считать сумму и заменять в сущесвтующем тексте
5. Добавлять объединенные строки к существущей строке в начало
6. Добавлять объединенные строки к существущей строке в конец
7. Помещать объединенные строки в существующий текст с заменой текста
8. Находить максимальное значение
9. Округлять текст
10. Умножать выбранный текст (в т.ч. на дробь)

Еще есть простор для творчества

Последний раз редактировалось ProjectMaster, 27.02.2018 в 17:41.
ProjectMaster вне форума  
 
Непрочитано 27.02.2018, 17:41
| 2 #14
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,787


Цитата:
Сообщение от ProjectMaster Посмотреть сообщение
Сумматор желательно должен уметь:
...пить, петь, дарить цветы, бегать за пивом и выбивать деньги.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 27.02.2018, 17:58
#15
veb86

Проектировщик электрических сетей
 
Регистрация: 17.01.2014
Пенза
Сообщений: 176


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

Цитата:
Сообщение от ProjectMaster Посмотреть сообщение
Сумматор желательно должен уметь:
1. Объединять строки с разделителем
2. Добавлять сумму к тексту
3. Считать сумму в точку
4. Считать сумму и заменять в сущесвтующем тексте
5. Добавлять объединенные строки к существущей строке в начало
6. Добавлять объединенные строки к существущей строке в конец
7. Помещать объединенные строки в существующий текст с заменой текста
8. Находить максимальное значение
9. Округлять текст

Еще есть простор для творчества
3. да можно было кнопочку добавить вставить результат в чертеж
Остальное мне кажется не про сумматор, я как бы сам пишу скрипты, но не представляю как Вы видите решение всех пунктов кроме 3,8.

Не в обиду, просто сам пишу скрипты не выдержал. Если Вы что то рекомендуете автору, то сами продумайте как программа это логически решать будет.
1 - с каким разъединителем? как вообще появляются строки с разъединителем? Если взорвать многострочный текст, где там разъединитель будет?
2 - к какому тексту, после получения результата выбрать текст и к выбранному тексту он добавится? так? в какое место, в начало или в конец
4 - в каком существующем тексте, как программа узнает про этот текст. Вам то самим удобно будет так работать, или достаточно нажать кнопку "результат в буфер" и вставить куда надо самим
5,6,7 - то же больше мыслей о механике работы программы. Как Вы ее видите. текст выделил, нажал кнопку ...
9 - округлять текст, как его округлить.

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
...пить, петь, дарить цветы, бегать за пивом и выбивать деньги.
прям в точку написали!
veb86 вне форума  
 
Непрочитано 27.02.2018, 18:07
#16
ProjectMaster


 
Регистрация: 21.08.2017
Сообщений: 1,054


Цитата:
Сообщение от veb86 Посмотреть сообщение
Еще было бы здорово добавить функцию, нажать кнопку что бы результат поместить в буфер обмена.



3. да можно было кнопочку добавить вставить результат в чертеж
Остальное мне кажется не про сумматор, я как бы сам пишу скрипты, но не представляю как Вы видите решение всех пунктов кроме 3,8.

Не в обиду, просто сам пишу скрипты не выдержал. Если Вы что то рекомендуете автору, то сами продумайте как программа это логически решать будет.
1 - с каким разъединителем? как вообще появляются строки с разъединителем? Если взорвать многострочный текст, где там разъединитель будет?
2 - к какому тексту, после получения результата выбрать текст и к выбранному тексту он добавится? так? в какое место, в начало или в конец
4 - в каком существующем тексте, как программа узнает про этот текст. Вам то самим удобно будет так работать, или достаточно нажать кнопку "результат в буфер" и вставить куда надо самим
5,6,7 - то же больше мыслей о механике работы программы. Как Вы ее видите. текст выделил, нажал кнопку ...
9 - округлять текст, как его округлить.

прям в точку написали!
Просто я выложил свои соображения по функциям работы с текстом, которыми сам пользуюсь. Если не скучно, можете посмотреть на реализацию (12 мин):
https://youtu.be/i4lLiGbnSi0

Саму прогу скачивать и устанавливать пытаться не надо. У меня траур, так как сервер умер. Воскресить его руки не доходят.

Последний раз редактировалось ProjectMaster, 27.02.2018 в 18:19.
ProjectMaster вне форума  
 
Непрочитано 28.02.2018, 10:57
#17
veb86

Проектировщик электрических сетей
 
Регистрация: 17.01.2014
Пенза
Сообщений: 176


Цитата:
Сообщение от ProjectMaster Посмотреть сообщение
Просто я выложил свои соображения по функциям работы с текстом, которыми сам пользуюсь. Если не скучно, можете посмотреть на реализацию (12 мин):
https://youtu.be/i4lLiGbnSi0
Посмотрел, совсем не скучно.
Вот теперь все понятно!
Сумматор с расширенными возможностями по работе с текстом. Смотрится клево и просто. Я бы конечно скачал, но регистрация всегда отпугивает. Да и не факт что на bricscad v14 и v9 заработает.
В целом меня устраивает авторский сумматор (конечно хотелось бы ему пару функций добавить), особенно тем что он лисповый.
Блин, я терпеть не могу лисп, внести правку в него не могу вообще ни какой, это что то ужасное, смотрю на код и вижу АвадруКедавру, ничего общего с синтаксисом языков программирования С++, Pascal, C#, VBA. Не представляю как он мог вообще родится в голове автора, и главное зачем в такой форме. Но блин, он самый оптимальный язык для написание простых скриптов для автокада. Просто добавить, просто запустить, редактируется в блокноте. Ну почему, почему он такой, есть же python
veb86 вне форума  
 
Непрочитано 09.03.2018, 23:30
#18
Barmaley Bubusikin


 
Регистрация: 05.06.2014
Сообщений: 77


Offtop:
Цитата:
Сообщение от veb86 Посмотреть сообщение
но регистрация всегда отпугивает
А почему? Расскажите, может я тоже буду пугаться?
Barmaley Bubusikin вне форума  
 
Непрочитано 10.03.2018, 10:27
#19
ProjectMaster


 
Регистрация: 21.08.2017
Сообщений: 1,054


Цитата:
Сообщение от Barmaley Bubusikin Посмотреть сообщение
Offtop:
А почему? Расскажите, может я тоже буду пугаться?
Кстати сервер вроде воскрес.
Можно ставить.
ProjectMaster вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Готовые программы > LISP.Сумматор

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск