엑셀 데이터로의 변환만이면 csv 추출로도 데이터 활용이 가능해보여서 csv내보내기 방식으로 작성하였습니다.
일단은 데이터 정렬 기준이 명확하지 않아서 ssget으로 불러와지는 순서의 역순으로 작성했습니다.
데이터 확인해보니 끝점의 X좌표를 기준으로 정렬된 것으로 보여서 변경하였습니다.
;; 쉼표로 분리된 CSV 파일 만들기
;; (#MakeCSVFile <좌표 정밀도> <초기 폴더 경로>)
(defun #MakeCSVFile ($prec $fn / *error* acDoc ss fn fo str)
(vl-load-com)
(defun *error* (msg)
(vla-endundomark (vla-get-ActiveDocument (vlax-get-acad-object)))
(or (wcmatch (strcase msg) "*취소*,*CANCEL*,*QUIT*,*EXIT*") (prompt (strcat "\nError: " msg "\n")))
(princ)
)
(setq acDoc (vla-get-ActiveDocument (vlax-get-acad-object)))
(vla-startundomark acDoc)
(prompt "CSVOUT\n레이어와 좌표 정보를 CSV 파일로 내보낼 선 객체 선택...")
(or (setq ss (ssget '((0 . "LINE")))) (princ "\n객체가 선택되지 않았습니다.") (quit))
(or (setq fn (getfiled "CSV 파일 내보내기" $fn "csv" 1)) (princ "\n파일명이 지정되지 않았습니다.") (quit))
(setq fo (open fn "w"))
(write-line "도면층,시작 X,시작 Y,시작 Z,끝 X,끝 Y,끝 Z" fo)
(foreach lst (#SortEndPoint ss)
(setq str (car lst))
(foreach num (cdr lst) (setq str (strcat str "," (rtos num 2 $prec))))
(write-line str fo)
)
(close fo)
(prompt (strcat "\n" (rtos (sslength ss) 2 0) "개의 선 객체 정보가 CSV 파일로 내보내기 완료되었습니다."))
(vla-endundomark acDoc)
(princ)
)
(defun #SortEndPoint (ss / i ob inf_lst)
(repeat (setq i (sslength ss))
(setq i (1- i) ob (vlax-ename->vla-object (ssname ss i)))
(setq inf_lst
(cons
(cons (vlax-get ob 'Layer) (append (vlax-get ob 'StartPoint) (vlax-get ob 'EndPoint)))
inf_lst
)
)
)
(vl-sort inf_lst
(function
(lambda (a b / c)
(setq c (- (nth 4 a) (nth 4 b)))
(if (equal c 0 1e-4) (> (nth 1 b) (nth 1 a)) (minusp c))
)
)
)
)
;; 명령 연결 함수
(defun c:CSVOUT nil (#MakeCSVFile 4 ""))
첫댓글 감사합니다. 너무 잘 들어가네요
올려주신 샘플데이터 확인해보니 끝점 X좌표 오름차순 기준으로 정렬된것 같아서 수정해뒀습니다