지식은 공유되었을 때 그 힘을 발휘한다.



Excel VBA, AutoCAD ActiveX 맛보기 강좌(22)

Model space에 Entity추가하기(3)

어제는 circle을 추가했습니다. 사실 도면에 필요한 것은 circle,arc,line,text정도면 모든 것들 표현할 수 있지 않을까요? 오늘은 그럼 line을 추가하는 방법을 알아보도록 하겠습니다. circle을 추가하는 방법과 동일하겠죠? model space를 잡아서 addline이란 메서드를 사용해서 추가해주면 되겠습니다. 물론 line은 첫점과 끝점 정보가 있겠죠? circle에서 center점을 array로 잡아준 것 처럼 첫점과 끝점을 array로 잡아주면 될 것입니다.

어제의 코드에서 array선언하는 부분과 addline메서드 부분만 고쳐주면 line을 추가하는 루틴은 아주 간단하게 말들어질 것입니다. 도움말을 참조하시구요. 도움말의 example을 이용하는 것도 좋은 방법입니다. 사실 설명 몇줄을 읽는 것보다 예제 소스한번 보는게 이해가 훨씬 빠를 수 있으니까요.

Sub Macro1()
  Dim acad As Object      'AutoCAD개체를 넣어둘 변수
  Dim l As Object         'line object를 넣어둘 변수
  Dim pnt1(2) As Double '시작점을 넣어둘 배열
  Dim pnt2(2) As Double '끝점을 넣어둘 배열
  
  pnt1(0) = 0  'x좌표
  pnt1(1) = 0  'y좌표
  pnt1(2) = 0  'z좌표
  
  pnt2(0) = 1  'x좌표
  pnt2(1) = 1  'y좌표
  pnt2(2) = 0  'z좌표

  Set acad = GetObject(, "AutoCAD.application")
  Set l = acad.activedocument.modelspace.AddLine(pnt1, pnt2)

End Sub

이번에는 text를 추가하는 방법을 알아보도록 하겟습니다. text를 추가하기 위해서는 삽입점과 text string 그리고 text높이가 필요합니다. 역시 삽입점은 array로 되어있어야 하구요. 아래의 코드는 도움말의 addtext에 대한 예제 코드입니다. 교과서적인 코드이니 한번 눈여겨보시는 것도 좋을 것 같습니다. 특이한 것은 dim textObj As AcadText라고 선언했습니다. 그냥 As Object해도 될텐데 AcadText라고 했을까요?

Sub Example_AddText()
    ' This example creates a text object in model space.

    Dim textObj As AcadText
    Dim textString As String
    Dim insertionPoint(0 To 2) As Double
    Dim height As Double
    
    ' Define the text object
    textString = "Hello, World."
    insertionPoint(0) = 2: insertionPoint(1) = 2: insertionPoint(2) = 0

    height = 0.5
    
    ' Create the text object in model space
    Set textObj = ThisDrawing.ModelSpace.AddText(textString, insertionPoint, height)
    ZoomAll
    
End Sub

그리고 이 코드를 실행시키면 아래와 같은 에러메세지가 나옵니다. 도움말 파일에 실행도 안되는 예제를 넣어놓다니.. 하면서 욕하실 분들도 많으리라 생각됩니다.



제가 설명드린 기존코드에서는 항상 개체를 object로 선언하였습니다. 어떤형태의 object인지는 모르지만 암튼 object로 선언했던 것입니다. 하지만 위의 코드에서는 textObj라는 변수에 text object가 들어갈 것이 확실하기 때문에 object가 아닌 AcadText라는 형을 사용한 것입니다. object는 object인데 AcadText object라는 이야기 입니다.
그렇다면 왜 실행이 안되고 에러가 났을까요? 에러메시지를 보면 "사용자정의 형식이 정의되지 않았습니다"라고 되어있습니다. 어느부분에서 에러가 났을까? 하고 찾아가보도록 할까요? 확인버튼을 누르면 아래그림처럼 에러가 난부분을 보여줍니다.


프로그램 실행이 에러가 난부분에서 멈추어있습니다. 이런 상태를 디버깅 상태라고 하고 에러가 난 부분을 수정을 가한다음에 계속 실행시킬 수 있습니다. 디버깅에 대해서는 나중에 설명드리기로 하고 암튼 에러가 난부분은 바로 Dim textObj As AcadText <-- 이부분입니다. 우리가 dim 문으로 선언해줄 수 있는 데이터의 형은 몇가지 있습니다. integer도 있고 double도 있습니다. 하지만 이 코드의 AcadText는 VBA가 인식하지 못하는 형입니다. 현재 코드가 실행중인 Excel에는 이런 형이 정의 되어있지 않기 때문입니다.
그렇다면 AutoCAD 예제에는 왜 이런 코드를 넣어두었을까요? 물론 AutoCAD기반의 VBA에서는 이 코드가 문제없이 돌아갑니다. AutoCAD2000부터는 tools메뉴에 macro라는 VBA메뉴가 있지요. 거기에서 위와같은 코드를 실행시키면 잘 돌아갑니다.

그렇다면 Excel VBA에서는 AcadText같은 형을 사용하지 못하는 것일까요? .. 아닙니다. AutoCAD가 지원하는 형을 정의하면 사용하면 되는 것입니다. 우리가 직접 정의하는 것이 아니고 정의를 모아둔 파일을 참조함으로서 가능합니다. VBA Editor창의 도구메뉴를 보면 아래와 같이 참조항목이 있습니다.



이 항목을 클릭하면 아래 그림과 같은 참조항목을 선택할 수 창이 뜹니다.


여기서 AutoCAD type library를 선택합니다. 아래 그림에서는 위쪽에 올라와 있지만 여러분들의 컴퓨터에는 아래쪽에 있을지도 모릅니다. 아패쪽으로 가면서 찾아보면 될 것입니다. type library에는 AcadText같은 형도 정의 되어있고 또한 상수도 정의되어 있습니다. 이 파일을 참조함으로서 비로소 AutoCAD와 Excel이 완전히 연결되었다고할 수 있습니다.


그럼 내일 계속하도록 하겠습니다.



dolljong@dreamwiz.com