면적 구하는 리습을 사용하고 있는데요.
좀 답답하더라구요.
몇가지 기능을 좀 추가 했으면 하는데 가능할런지요?
좀 도와 주셨으면 합니다.
아래의 리습은 면적 표기 후, 해당 선의 변경에 따라 실시간으로 면적을 환산해서 나타내주는 리습입니다.
일반적인 면적 리습은 한번 표기하면 선을 변경하여도 면적표기는 바뀌지 않지만 이 리습은 실시간으로 바뀝니다.
그런데 여기에다 기능을 좀 추가하고 싶은데요…….
첫째
면적(㎡): 000.000
면적(평): 000.000
이런식으로 나오게 할 수는 없나요?
둘째
소숫점 3자리까리 나오게 할 수는 없나요?
셋째
글씨의 크기 조정이 불가능해서 좀 불편합니다. 마지막에 글씨 크기를 직접 설정할 수 있도록 할 수는 없나요?
고수분들의 멋진 능력 함 보여주세요~~~!^^
——————————————————————–
(defun C:AT ( / oldlay oldcmd elist enam etype object AreaReactor
pt hText ar aim aim2 m2 szText
)
(vl-load-com)
(setq oldlay (getvar “CLAYER”))
(setq oldcmd (getvar “CMDECHO”))
(setvar “CMDECHO” 0)
(if (tblsearch “LAYER” “AREA-TEXT”)
(command “_.LAYER” “T” “AREA-TEXT” “on” “AREA-TEXT” “s” “AREA-TEXT” “”)
(command “_.LAYER” “M” “AREA-TEXT” “C” “201” “” “plot” “no” “AREA-TEXT” “”)
)
(if (tblsearch “STYLE” “NOTES”)
(setvar “TEXTSTYLE” “NOTES”)
(command “-STYLE” “NOTES” “ISOCP” “0” “0.6” “0” “n” “n”)
)
(princ “nSelect the entity you want to calculate the area.”)
(setq enam (car (entsel)))
(setq elist (entget enam))
(setq etype (cdr (assoc 0 elist)))
(if (or (= etype “CIRCLE”) (= etype “LWPOLYLINE”))
(progn
(setq hText (Get_XData enam “AREATEXT” 1000))
(if (or (= hText nil) (and (/= hText nil) (= (handent hText) nil)))
(progn
(setq pt (getpoint “nText Insertion Point: “))
(if (= (getvar “tilemode”) 1) (setq ht (setvar “textsize” (* (getvar “ltscale”) 4.0))))
(if (= (getvar “tilemode”) 0) (setq ht (setvar “textsize” (* (* (getvar “ltscale”) 4.0) (/ 1 (getvar “ltscale”))))))
(command “_.AREA” “O” enam)
(setq ar (getvar “AREA”))
(setq aim (/ ar 1000000.0))
(setq aim2 (rtos aim 2 2))
(setq m2 “m\u+00b2”)
(setq szText (strcat aim2 m2))
(command “_.TEXT” pt ht 0 szText)
(setq hText (cdr (assoc 5 (entget (entlast)))))
(Put_XData enam “AREATEXT” hText 1000)
(setq object (vlax-ename->vla-object enam))
(setq AreaReactor (vlr-object-reactor (list object) “Entity Area Reactor” ‘((:vlr-modified . Update-Area))))
)
)
)
(alert “The selected entity is not POLYLINE nor CIRCLE.”)
)
(setvar “CLAYER” oldlay)
(setvar “CMDECHO” oldcmd)
(princ)
)
(defun Update-Area (notifier-object reactor-object parameter-list / )
(setq enam (vlax-vla-object->ename notifier-object))
(setq hText (Get_XData enam “AREATEXT” 1000))
(if (and (/= hText nil) (/= (handent hText) nil))
(progn
(setq txtEnam (handent hText))
(if (vlax-property-available-p notifier-object ‘area)
(progn
(setq ar (vla-get-area notifier-object))
(setq aim (/ ar 1000000.0))
(setq aim2 (rtos aim 2 2))
(setq m2 “m\u+00b2”)
(setq szText (strcat aim2 m2))
(setq elist (entget txtEnam))
(if (= (cdr (assoc 0 elist)) “TEXT”)
(progn
(setq oldtxt (cdr (assoc 1 elist)))
(setq pair1 (cons 1 szText))
(setq pair2 (cons 1 oldtxt))
(setq elist (subst pair1 pair2 elist))
(entmod elist)
)
)
)
(progn
(alert “It was not possible to get the area”)
)
)
)
(progn
(alert “It was not possible find the text”)
)
)
(princ)
)
(defun Get_XData ( ename app group / Pos sd_list elist app_list
app_sub_list xd_code xd_data
Value
)
(setq Value nil)
(setq elist (entget ename (list app)))
(setq xd_list (assoc -3 elist))
(setq xd_list (cdr xd_list))
(setq app_list (car xd_list))
(setq app_list (cdr app_list)) ; Strip app name
(while app_list
(setq app_sub_list (car app_list)) ; Get sub list
(setq xd_code (car app_sub_list)) ; Get group code
(setq xd_data (cdr app_sub_list)) ; Get data
(cond ((= group xd_code) (setq Value xd_data)))
(setq app_list (cdr app_list))
)
Value
)
(defun Put_XData (ename rname Value group / elist xd_list )
(regapp rname)
(setq elist (entget ename))
(setq xd_list (list ‘(1002 . “}”)))
(setq xd_list (cons (cons group Value) xd_list))
(setq xd_list (cons ‘(1002 . “{“) xd_list))
(setq xd_list (cons rname xd_list))
(setq xd_list (list -3 xd_list))
(setq elist (cons xd_list elist))
(entmod elist)
)
(princ)
—————————————————————————————–
3가지 다 만족하는 리습이 있습니다 예전에 고캐드에서 찾아서 썻었는데요..
아마도 리습 게시판에 있을겁니다.