Вычисление площади контура и простановка значения в экспликацию.
(defun C:AREA_EKS (/ echo osm slt pl s pp reg minp maxp
vlaobj pmin pmax pxy kod40)
(vl-load-com)
(setq echo (getvar "cmdecho"))
(setvar "cmdecho" 0)
(setq osm (getvar "OSMODE"))
(setq slt (getvar "CLAYER"))
(vl-cmdf "_AREA" 0 "")
(if (null prec)
(progn
(alert "\n Не задана точность для определения площади!")
(princ "\n Задайте точность для определения площади.")
(load "area_prec")
))
(while (null pl)
(setq pl (entsel "\n Выберите замкнутый контур: "))
(if pl
(progn
(if (= (cdr (assoc 70 (entget (car pl)))) 1)
(Progn
(command "_AREA" "_O" pl)
(setq s (getvar "area"))
(setq s (/ s 1000000))
(princ "\n Площадь контура = ")(princ s) (princ " кв.м")
(cond
((<= pre 0) (setq s (rtos s 2 0)))
((= pre 1) (setq s (rtos s 2 1)))
((>= pre 2) (setq s (rtos s 2 2)))
) ; cond
(setvar "OSMODE" 0)
(princ "\n Текущая высота текста: ")
(princ (getvar "TEXTSIZE"))
(initget 6)
(setq pp (getpoint "\n Укажите точку внутри ячейки: "))
(vl-cmdf "_BOUNDARY" "_A" "_O" "_R" "" pp "")
(setq reg (entlast))
(if reg
(progn
(setq vlaobj(vlax-ename->vla-object reg))
(vla-GetBoundingBox vlaobj 'minp 'maxp)
(setq
pmin(vlax-safearray->list minp)
pmax(vlax-safearray->list maxp)
pxy (list
(+(car pmin)(/(-(car pmax)(car pmin))2))
(+(cadr pmin)(/(-(cadr pmax)(cadr pmin))2))
)
); setq
(vl-cmdf "_ERASE" reg "")
(princ "\n Одна область удалена.")
(command "_-LAYER" "_M" "Экспликация" "")
(setq kod40 (cdr (assoc 40 (tblsearch "STYLE" (getvar "TEXTSTYLE")))))
(if (= kod40 0)
(vl-cmdf "_TEXT" "_J" "_M" pxy "" "" s)
(vl-cmdf "_TEXT" "_J" "_M" pxy "" s)
) ; if
); progn
); if
(princ "\n Площадь контура = ")(princ s) (princ " кв.м")
) ;progn
(progn
(setq pl nil)
(princ "\n Это не есть замкнутая полилиния! Попробуйте еще раз.")
) ;progn
) ;if
) ; progn
(princ "\n Контур не выбран! Попробуйте еще раз.")
) ;if
) ;while
(setvar "cmdecho" echo)
(setvar "OSMODE" osm)
(command "_-LAYER" "_S" slt "")
(princ)
)
Экспликация должна быть отрисована отрезками или полилиниями. Используется текущий стиль текста.
Для работы этой программы требуется дополнительная программа:
;*************** area_spec.lsp ******************************************
; Задание точности при определении площади.
(apply '(lambda ()
(if (null prec) (setq prec "1"))
(initget 4 "0 1 2")
(princ (strcat "\n Количество знаков после точки [0/1/2] <" prec ">: "))
(setq pre (getint))
(if (= pre nil) (setq pre (atoi prec)))
(if (> pre 2)
(progn
(setq pre 2)
(alert " Дико извиняюсь! Ограничимся 2-мя знаками.")
))
(setq prec (itoa pre))
(princ)
)
'()
)