AutoCAD를 사용하는 많은 사람들이 AutoCAD 프로그래밍 하면 보통 LISP를 많이 떠올립니다. 하지만 AutoCAD에는 VBA 또한 내장되어 있기 때문에, VBA를 아는 사람이라면 여러 가지 도면 작업들을 자동화할 수 있지요.
제가 이 이야기를 왜 하느냐 하면, 오늘, 아니, 이제 자정이 지났으니 어제, 회사에서 보유하고 있는 약 5만 7천여장의 AutoCAD 도면 중 특정한 것 하나를 찾아내라는 특명(?)을 받았기 때문입니다. 비교적 희미한 저화질 그림 외에는 아무런 단서가 없는 상황이라 난감한지라, 정보 검색 범위를 줄이기 위해 먼저 DWG 파일에서 텍스트 데이터만 추출할 방도가 없을까 궁리하게 되었습니다.
먼저 이런 목적으로 나온 프로그램이 있나 검색해 보았습니다. 있긴 있었습니다. 근데 죄다 유료거나, 무료인 것은 실행 중 버그로 인해 종료되거나 하는 등의 상황으로 도저히 쓸 수가 없더군요. 그래서 직접 쓸 목적으로 조잡하게나마 직접 만들어 보았습니다.
먼저 입력 파일을 만들었습니다. cmd에서 간단하게 DIR *.dwg /s /b > DWGlist.txt
명령을 내려 각 DWG 파일의 경로가 줄 단위로 구분된 파일을 만들었지요. 그 다음에는 시행착오를 거쳐 VBA 코드를 짰습니다. AutoCAD에서 VBA를 쓰는 건 처음이라 좀 힘들었지만, 의외로 생각보다 도움말이 잘 되어 있더군요.
제가 짠 코드는 다음과 같습니다.
Option Explicit Function loadFileToList(filePath) '지정된 텍스트 파일을 1줄씩 읽어 배열로 반환한다. Dim line As String Dim fileNum As Integer Dim element As Variant Dim list() As String '동적 배열 선언 Dim i As Long: i = 0 fileNum = FreeFile() Open filePath For Input Access Read As #fileNum Do While Not EOF(fileNum) Line Input #fileNum, line If line <> "" Then ReDim Preserve list(i) list(i) = line i = i + 1 End If Loop Close #fileNum loadFileToList = list End Function Function allDwgTextToList() 'DWG 파일 안의 모든 텍스트 데이터를 배열에 저장한다. Dim mSpaceObj As AcadObject Dim count As Integer: count = ThisDrawing.ModelSpace.count Dim i As Long Dim j As Long: j = 0 Dim text As String Dim textList() As String '동적 배열 선언 For i = 0 To count - 1 Set mSpaceObj = ThisDrawing.ModelSpace.Item(i) On Error Resume Next '텍스트 속성이 없으면 그냥 무시 text = mSpaceObj.TextString If text <> "" Then ReDim Preserve textList(j) textList(j) = text j = j + 1 End If Next allDwgTextToList = textList End Function Sub listToFile(textList, filePath) '배열을 받아, 그 배열의 내용을 지정된 파일에 기록한다. Dim fileNum As Integer Dim element As Variant fileNum = FreeFile() Open filePath For Append As #fileNum For Each element In textList Print #fileNum, Chr(9); element Next Write #fileNum, '빈 줄 추가 Close #fileNum End Sub Sub main() '여기서 각 필요 파일 이름을 수동으로 지정 Dim dwgFileListPath As String: dwgFileListPath = "Z:\WORK\DWGlist.txt" Dim resultFilePath As String: resultFilePath = "Z:\WORK\DWGtext.txt" Dim fileList() As String Dim element As Variant Dim fileNum As Integer Dim ReadOnly As Boolean '파일 목록 불러오기 fileList = loadFileToList(dwgFileListPath) For Each element In fileList On Error Resume Next 'DWG 파일 열다가 에러가 나도 그냥 다음 파일로 넘어가기 AutoCAD.Documents.Open element, ReadOnly = True '텍스트 내용이 있는 파일 이름 적어주기 fileNum = FreeFile() Open resultFilePath For Append As #fileNum Write #fileNum, element Close #fileNum '파일을 실제로 열어, 그 중 텍스트 부분을 추출한다 listToFile allDwgTextToList, resultFilePath AutoCAD.Documents.Close Next End Sub
이걸 짜는데 모두 5시간쯤 걸렸군요. 이제 가서 좀 쉬어야겠습니다. 으헤헤헤.
p.s.
근데, 이걸 돌려도 과연 5만 7천장의 도면 중에서 과연 원하는 것을 찾을 수 있을지는 잘 모르겠군요.