Вот изобразил, как понял из описания.
После копирования в командную строку или загрузки из файла (предпочтительней) вызывается на исполнение командами: Number1 или Number2
1-й вариант: из первого элемента вычитает второй и просит указать точку на экране для вывода результата.
2-й вариант: после выбора набора элементов, отделяется последний, остальные складываются и сумма делится на их количество, результат умножается на последний элемент, запрашивается точка на экране для вывода результата.
Выбор элементов производится в цикле стандартно: по одному, рамкой или секрамкой (поэтому во 2-м случае рекомендуется последний элемент выбирать отдельно). Во время вставки результата работают динамические пан и зум. Ограничения: при выводе результата не работают привязки, это решаемо, но на простенький лисп уже не тянет.
Жду вопросы...
Цитата |
---|
(if (car (atoms-family 1 '("vl-load-com")))(vl-load-com)) (defun number_error (s)(if txt (vla-delete txt))(setq *error* old_error)) (defun mSpace (/ doc mSp) (setq doc (vla-get-ActiveDocument (vlax-get-Acad-Object))) (if (= 1 (getvar "TILEMODE"))(setq mSp (vla-get-ModelSpace doc))(setq mSp (vla-get-PaperSpace doc)))) (defun addText (nTxt / ht pick lt pt) (setq ht 3) (princ "\nУкажите точку вставки")(setq txt (vla-addtext (mSpace) nTxt (vlax-3d-point '(0 0 0)) ht)) (while (/= pick t)(setq pt (cadr (setq lt (grread t))))(if(and pt (listp pt)) (progn (if (= (car lt) 5)(vla-put-insertionPoint txt (vlax-3d-point pt))) (setq pick (= 3 (car lt))))(progn (vla-delete txt) (setq txt nil))))) (defun c:number1 (/ ss len sum) (setq old_error *error* *error* number_error) (setq ss (ssget '((0 . "TEXT,MTEXT"))) len (sslength ss)) (if (> len 1)(progn (setq sum (- (atof (vla-get-textstring(vlax-ename->vla-object (ssname ss 0)))) (atof (vla-get-textstring(vlax-ename->vla-object (ssname ss 1))))))(addText (rtos sum))) (princ "\nВыбрано меньше 2-х объектов!"))(setq *error* old_error)(princ)) (defun c:number2 (/ ss len sum k) (setq old_error *error* *error* number_error) (setq ss (ssget '((0 . "TEXT,MTEXT"))) len (1- (sslength ss))) (if (> len 1)(progn (setq k 0 sum 0) (repeat len (setq sum (+ sum (atof(vla-get-textstring(vlax-ename->vla-object (ssname ss k))))) k (1+ k))) (addText (rtos (* (/ sum len)(atof (vla-get-textstring(vlax-ename->vla-object (ssname ss k)))))))) (princ "\nВыбрано меньше 3-х объектов!"))(setq *error* old_error)(princ)) |
PS Если код копируется в командную строку, обязательно нажмите Enter!
Высота текста задается в строке (setq ht 3). Можете Именить 3 на любое число...