|
성심 성의껏 질문을 작성하여 주세요, 대충하시면 답변도 대충작성합니다.^^
① CAD 종류 : AUTOCAD
② VERSION : 2016
③ 운영 체제 : WINDOWS 7
본카페에 올라온 LISP중 폴더내 캐드파일의 텍스트를 엑셀로 추출하는 LISP관련해서,
엑셀로 추출했을때, 캐드에서 문자가 없는 공백도 엑셀 쉬트에서 공백으로 한 셀을 차지하게
변경할수 있을까요? 아래 LISP 코드는 좌표영역에 문자가 없으면, 엑셀로 변경시, 다음문자를
바로 이어서 붙이네요. 아래는 LISP 코드입니다. 상기와 같이 LISP 수정방법 부탁드리겠습니다.
아래 첫번째 그림은 첨부 테스트 파일 실행결과인데요. 캐드에서 읽어올 문자좌표에 아무것도 없을경우에는
아래 두번째 그림과 같이 엑셀에서 공백으로 표시되게 lisp변경 부탁드리겠습니다. 첨부테스트 파일은 문자
가 없을경우 그다음 문자를 바로 이어 붙여서 일정하게 정렬이 되지 않네요.
;;;----------------------------------------------------------------------------;
;; 폴더 내의 파일안에 있는 일정 영역 속의 글자를 읽어서 엑셀로 보내기
;; 원작자 : 모름
;; 수정 : 2016-03-20, 이자더, 도면명이 앞으로 오도록 문자 정렬방식 수정
;;;----------------------------------------------------------------------------;
(defun c:xx ( / cdwgfilelist cdwglist cfolder col ctr ds dwgfile filter_code
filter_value horp index lst newsset obj odocument odocuments
olst opendwglist row ssets str tlst txlst
;;;지역함수
browseforfolder
init-excel
write-row-column
)
;;;----------------------------------------------------------------------------;
(defun BrowseforFolder (msg flag folder / oShell oFolder cFolder)
(setq oShell
(vla-getinterfaceobject
(vlax-get-acad-object)
"Shell.Application"
)
)
(if (setq oFolder
(vlax-invoke-method
oShell
'browseforfolder
0
msg
flag
folder
)
)
(setq cFolder (vlax-get (vlax-get oFolder "self") "path"))
)
(vlax-release-object oShell)
cFolder
)
;;;----------------------------------------------------------------------------;
(defun init-excel (/ excel-app wb-collection workbook sheets sheet1)
(setq excel-app (vlax-get-or-create-object "excel.application")
wb-collection (vlax-get excel-app "workbooks")
workbook (vlax-invoke-method wb-collection "add")
sheets (vlax-get workbook "sheets")
sheet1 (vlax-get-property sheets "item" 1)
*excel-cells* (vlax-get sheet1 "cells")
)
(vlax-put excel-app "visible" 1)
)
;;;----------------------------------------------------------------------------;
(defun write-row-column (row col x)
(vlax-put-property
*excel-cells*
"item"
row
col
(vl-princ-to-string x)
)
)
;;;----------------------------------------------------------------------------;
(vl-load-com)
(if (setq cFolder
(BrowseforFolder "도면이 들어있는 폴더를 선택하세요..."
(+ 256 512)
oldfolder
)
)
(progn
(setq cDwgList (vl-directory-files cFolder "*.dwg"))
(if (/= (substr cFolder (strlen cFolder)) "\\")
(setq cDwgFileList
(mapcar '(lambda (x) (strcat cFolder "\\" x))
cDwgList
)
)
(setq cDwgFileList
(mapcar '(lambda (x) (strcat cFolder x))
cDwgList
)
)
)
(setq oDocuments (vla-get-documents (vlax-get-acad-object))
openDwgList nil
)
(vlax-for TmpDwg oDocuments
(setq openDwgList (cons (vla-get-name TmpDwg) openDwgList))
)
(setq Index 0)
(repeat (length cDwgFileList)
(setq DwgFile (nth Index cDwgFileList)
oDocument (vla-open oDocuments DwgFile)
ds (vlax-variant-value (vla-getvariable oDocument "DimScale"))
ssets nil
ssets (vla-get-selectionsets oDocument)
newsset (vla-add ssets "ss1")
filter_code (vlax-make-safearray vlax-vbinteger '(0 . 0))
filter_value (vlax-make-safearray vlax-vbvariant '(0 . 0))
)
(vlax-safearray-fill filter_code '(0))
(vlax-safearray-fill filter_value '("TEXT"))
(vla-select
newsset
acSelectionSetAll
nil
nil
filter_code
filter_value
)
(setq ctr 0
olst '()
)
(repeat (vla-get-count newsset)
(setq obj (vla-item newsset ctr)
olst (append olst (list obj))
ctr (1+ ctr)
)
)
(setq olst
(vl-remove-if-not
'(lambda (x / str pnt)
(setq str (vlax-get x 'textString)
pnt (vlax-get x 'InsertionPoint)
)
(if
(or
(and
(/= str "")
(< (* ds 270)(car pnt)(* ds 410))
(< (* ds 277.4)(cadr pnt)(* ds 282.2))
)
(and
(/= str "")
(< (* ds 354)(car pnt)(* ds 410))
(< (* ds 10)(cadr pnt)(* ds 19.6))
)
)
(setq lst (append lst (list str)))
)
)
olst
)
)
(setq tlst
(vl-sort olst
'(lambda (a b)
(if
(equal
(cadr (vlax-get a 'InsertionPoint))
(cadr (vlax-get b 'InsertionPoint))
(* ds 1.)
)
(< (car (vlax-get a 'InsertionPoint))
(car (vlax-get b 'InsertionPoint))
)
(< (cadr (vlax-get a 'InsertionPoint))
(cadr (vlax-get b 'InsertionPoint))
)
)
)
)
)
(setq lst '())
(foreach x tlst
(setq str (vlax-get x 'textString)
lst (append lst (list str))
)
)
(setq txlst (append txlst lst))
(vla-close oDocument)
(setq Index (1+ Index)
horp nil
)
)
(init-excel)
(setq row 1
col 1
)
(foreach txt txlst
(write-row-column row col txt)
(if (= 7 col);;; 몇개 입력 후 아랫줄로 변경할 것인가
(progn
(setq row (1+ row)
col 1
)
)
(setq col (1+ col))
)
)
)
)
(princ)
)
※ 유의사항
- ①말머리 : 말머리를 달아야 구분이 쉽겠죠^^(필수 선택)
- ②Screenshot : 이해를 돕기위해 삽입요망.
- ③파일 첨부 : 상위버전에서 테스트할 파일이 아니면 가급적 하위버전으로 저장후 첨부.
해당리습/해당파일(DWG) 도 같이 첨부하여 주세요.
- ④제 목 : 질문 내용 반영(개략적인 내용), 예) 해치를 만들고 싶어요, pline을 연결할려면?
금지어(만들어주세요? 해주세요? 안되는데 이렇게 변경해주세요? 등등)
- ⑤질문글 삭제금지 : 질문후 댓글이 달린글은 삭제금지.
여러 리플러들이 소중한 시간을 내어서 고민한후 댓글을 작성한 이상 "강력조치" 토록 하겠음.
※ 정답만이 댓글은 아닙니다. 그 답이 맞던 틀리던 그건 그 댓글로서 존중되어야 합니다.
회원님들이 글을 읽었다는것과 댓글을 달았다는건 그만큼 관심을 가지고 있고 또 그 답을 해주기 위해
검색도 해보고 도움말도 보고 고민도 하는 일련의 과정을 거치면서 나오기 때문이죠.
이에 대한 고마움과 감사함을 모르는 테러행위(?)는 없었으면 합니다.
|
첫댓글 이런 글은 5번 (보라색) 부분에 첨부 파일로 올려주시는게 좋습니다 (이유는 1. 드래그 복사중 정상파일이 오류파일로 변하기도 합니다 2. 드래그 복사 하면 글 간격이 벌어져 가독성이 떨어집니다 )
혹시 MrLISP 가입 되어 계시면
http://cafe.daum.net/notcolor/5TOt/25
위 게시글에 소개 된 리습이랑 궁합이 좋습니다.
답변 감사드립니다. 테스트 파일을 올렸으며, 좀더 자세하게 설명도 붙였습니다.
이제 막 시작한 초보라 삽집중인데, 아직 해결을 못했네요. 아시는 선배님분들 lisp 수정 부탁드리겠습니다.
혹시 해결하셨나요?? 저도 지금 몇일째;; 머리 싸매고 있습니다.