룸 경계선과 경계영역 중심에 실명이 있을 때,
'ARA' (Auto Room Area) 명령으로 실명을 윈도로 선택하면,
command 'bo' 명령으로 폴리선 생성, 폴리선의 면적을 m2으로 실명에 연결하여 생성.
===== 추가 ===== 20250509
'csv' 모듈을 실행하여, Total Area 화면에 표시하고 "c:\temp\<>.csv" 파일 생성
'explorer'를 실행하여, 'c:\temp\'폴더를 보여준다.
===== 추가 ===== 20250509
구적선 레이어 생성
KM:LAYER_AREA_LWP () 모듈 실행
;;;;;;;;===== Get Boundaries by TEXTs =====;;;;
(defun KM:BND ( pt0 / pt)
(setq pt pt0)
(command "_.-boundary" "_a" "_i" "_n" "" "" "_non" pt "")
(princ)
)
;
(defun KM:getJtexts( rm / )
; (setq ss (ssget ":S" (list '(0 . "TEXT"))))
;
(setq tx1 rm)
;
(if (= (cdr (assoc 72 (entget tx1))) 0) (setq a11 (assoc 10 (entget tx1))) ;실명의 텍스트 정렬이 LEFT인 경우
(setq a11 (assoc 11 (entget tx1))) ; point of justification for text ; 실명의 텍스트 정렬이 LEFT 아닌 경우
); if
(setq jp (list (cadr a11) (caddr a11) 0.0)) ; list ( Px Py 0.0)
;
(print jp)
); defun
;
(defun KM:area_lwp ( / e id area m2area )
(setq e (entget (entlast)))
(setq id (cdr (assoc -1 e)))
(setq area (vlax-curve-getArea id))
(setq m2area (* 1.0e-06 area)) ; mm2 -> m2
(setq _M2 (strcat ": " (rtos m2area 2 2) "m2")) ; roundup 0.0#
(princ)
); defun
;
(defun KM:RmAreaX ( _M2 / txt_lst rmname exist_m2 rmarea)
(setq txt_lst (entget tx1))
(setq rmname (cdr (assoc 1 txt_lst)))
(if (/= nil (setq exist_m2 (vl-string-search ":" rmname))); if it exist rmarea, update rmarea.
(progn
(setq rmname
(substr rmname 1 exist_m2))); progn
); if
(setq rmarea (cons 1 (strcat rmname _M2)))
(entmod (subst rmarea (assoc 1 txt_lst) txt_lst))
(princ)
); defun
;
;
;;----- TXTs to CSV file -----
(defun KM:csv ( pts / )
(setq p1 (car pts) p2 (cadr pts))
(setq _LISTXT ( ))
(setq txts (ssget "_W" p1 p2 '((0 . "text"))))
(setq len (sslength txts))
(setq n 0)
;Write csv file
(setq d (rtos (getvar "CDATE") 2 6))
(setq csvfile (strcat "c:/temp/" d ".csv"))
(setq file_w (open csvfile "w"))
(setq header "No.\tRoomName\t=sum(c2:c30)")
(write-line header file_w)
;
(setq _AREA 0.0)
(repeat len
(setq txt_lst (entget (ssname txts n)))
(setq str (cdr (assoc 1 txt_lst)))
;; Extract AREA from str
(setq loc_split (+ 3 (vl-string-search ":" str)))
(setq _AREA (+ _AREA
(atof (substr str loc_split (- (strlen str) (+ loc_split 1))))))
;;
(setq rm_area_m2 (vl-string-subst "\t" ":" str))
(setq rm_area (vl-string-subst "" "m2" rm_area_m2))
(setq n_rm_area (strcat (itoa n) "\t" rm_area))
(write-line n_rm_area file_w)
(setq n (1+ n))
);repeat
;
(setq style_ (cdr (assoc 7 (entget (ssname txts 0)))))
(setq size_ (* 1.5 (cdr (assoc 40 (entget (ssname txts 0))))))
;
(progn ; find mid point p3
(setq x (/ (- (car p2) (car p1)) 2.0))
(setq y (/ (- (cadr p2) (cadr p1)) 2.0))
(setq p3 (list (+ (car p1) x) (+ (cadr p1) y)))
)
;
(princ (setq _TOTAL (strcat "\nTOTAL AREA: " (rtos _AREA 2 2) "m2\t(" (rtos (* _AREA 0.3025) 2 1) "PY)\n")))
(entmake (list (cons 0 "TEXT") (cons 1 _TOTAL) (cons 7 style_) (cons 10 p3) (cons 11 p3) (cons 40 size_) (cons 62 80) (cons 72 4)))
(princ _AREA)
;
(close file_w)
(princ "\n")
(princ)
);defun
;
;
;;----- Create Layer for AREA LWP -----
(defun KM:LAYER_AREA_LWP ()
;
(setq LTname "acad_iso03w100")
(setq Nme "AREA_LWP")
(setq Col 150)
(setq Ltyp "ACAD_ISO03W100")
(setq LWgt 50)
;
(if (tblsearch "ltype" LTname)()
(command "_.linetype" "_load" LTname "acad.lin" "")
)
;
(entmake (list (cons 0 "LAYER")
(cons 100 "AcDbSymbolTableRecord")
(cons 100 "AcDbLayerTableRecord")
(cons 2 Nme)
(cons 70 0)
(cons 62 Col)
(cons 6 Ltyp)
; (cons 290 Plt)
(cons 370 LWgt)))
(setvar "CLAYER" Nme)
(setvar "LWDISPLAY" 1)
(setvar "CELTSCALE" 15)
);defun
;
;
;;----- Main Multi get Boundaries by Texts -----
;
(defun c:ara( / pt1 pt2 ) ;Auto careate LWPolyline for AREA
(setq cly (getvar "CLAYER"))
(setq celts (getvar "CELTSCALE"))
(KM:LAYER_AREA_LWP)
(setq ss
(ssget "_w" (setq pt1 (getpoint "\nPick the first point")) (setq pt2 (getcorner pt1 "\nPick a corner"))
(list '(0 . "TEXT")))
)
(setq pts (list pt1 pt2))
(repeat (setq i (sslength ss))
(setq rm (ssname ss (setq i (1- i))))
;
(setq jpt (KM:getJtexts rm))
(KM:BND jpt)
(KM:area_lwp)
(KM:RmAreaX _M2)
)
(princ pts)
;
(KM:csv pts)
(setvar "CLAYER" cly)
(setvar "CELTSCALE" celts)
(startapp "explorer /e, c:\\temp\\")
)
(1) 경계 전체 보이게 줌아웃; 경계영역 중심 실명 배치
(2) ARA 명령으로 실명 선택
(3) 레이어, 선타입 생성. 폴리선과 면적 생성(전체면적 표시, csv 생성)
===== 다음은 csv 파일을 xls로 변환하는 방법입니다.
(1) scv 파일을 ㄷ엑셀에서 엽니다.
(2) 'A'열을 선택합니다.
(3) 메뉴에서 '데이터' 탭을 선택한 후, '텍스트 나누기' 명령을 실행합니다.
(4) '구분 기호로 분리됨'을 선택한 후, '다음'을 누릅니다.
(5) 구분 기호로 '탭'을 선택한 후, '마침'을 누릅니다.
(6) 엑셀에서 'C1' 셀에 총합계 값이 표시됩니다.
(주의사항. 총합계는 C2~C30까지만 더하기 범위로 정했는데 함수에서 수정하면 됩니다.)
'autocad' 카테고리의 다른 글
Create Layer by Lisp (0) | 2025.05.09 |
---|---|
(startapp "explorer /e, c:\\temp\\") (0) | 2025.05.09 |
Stamping DATE/TIME (0) | 2025.05.08 |
Create Boundary (2) | 2025.05.08 |
location acad.cui (0) | 2025.03.11 |