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



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

Entity수정하기

지난번 강좌에서 도구/참조에서 AutoCAD type library를 추가해줌으로서 비로소 AutoCAD와 ExcelVBA가 완전히 연결되었다고 설명드렸는데요. 그렇다면 이렇게 참조를 하는 것과 안하는 것의 차이는 어떤 것이 있을까요? 일단 AutoCAD의 개체를 사용하더라고 명시적으로 사용하기 때문에 여러잇점이 있습니다. 참조에서 AutoCAD type library를 추가한 다음에 아래와 같이 코딩을 해보도록 하겠습니다. mspace라고 입력한 다음에 as 하고 빈칸일 입력할 때 자동으로 팝업창 하나가 뜹니다.
  
현재 입력하고 있는 부분에 들어갈 수 있는 것들을 알려주는 창입니다. 현재는 변수를 선언하고 있고, as라고 입력한 다음이기 때문에 변수형태들이 나옵니다. 이창은 VB를 코딩하는 데 많은 도움이 되는데, 그 많은 속성과 메서드들을 다 외울 수 없기 때문에 현재 입력중인 구문에 가능한 변수형태, 메서드, 속성등을 나열해주고 골라 쓸 수 있게 해주는 창입니다.
왼쪽 그림이 AutoCAD type library를 참조했을 경우이고 오른쪽 그림이 참조하지 않았을 때입니다. 어떤가요? 참조한 경우에는 AutoCAD와 관련된 변수형태들이 나열됩니다. 하지만 오른쪽 그림은 일반적인 VB에 사용할 수 있는 변수형태들이 뜹니다.
우리는 지금 mspace란 이름을 가진 변수는 model space개체이라고 명시적으로 선언하고 싶습니다. 물론 앞선 강좌에서와 같이 objec로 해도 되지만 확실히 하면 이점이 많기 때문에 이렇게 명시적으로 model space개체라는 것을 선언하는 것입니다. 목록중에서 아래 그림과 같이 Acadmodelspace를 찾아서 선택해줍니다.


어떤가요? 아주 간단하지요? 이렇게 참조를 해놓고 사용하면 실수를 할 확률도 줄일 수 있습니다. 물론 acadmodelspace라고 직접입력해도 됩니다. 같은 요령으로 cobj라는 일므으로 Acadcircle object도 하나 선언하도록 합니다. 그러면 아래와 같이 될 것입니다.

Sub text()
  acad As Object
  mspace As AcadModelSpace
  cobj As AcadCircle
End Sub

눈여겨 보시면 아시겠지만 type library에 정의된 변수형태들은 대문자와 소문자를 섞어가면서 표시되기 때문에 읽기가 쉽고 사용자가 타이핑한것과 쉽게 구분이 됩니다. 계속해서 AutoCAD와 연결하고 circle하나를 그리는 코딩을 합니다. 앞강좌들을 보신분은 무난히 해나시리라 생각됩니다.

Sub test()

  acad As Object
  mspace As AcadModelSpace
  Dim cobj As AcadCircle
  
  Dim c(2) As Double
  Dim r As Double
  
  c(0) = 0: c(1) = 0: c(2) = 0
  r = 10

  Set acad = GetObject(, "Autocad.application")
  Set mspace = acad.ActiveDocument.ModelSpace
  Set cobj = mspace.AddCircle(c, r)  
End Sub

여기 까지가 modelspace의 0,0,0좌표에 반지름 10인 원을 추가하는 코드입니다. 위코드를 입력할 때도 상황에 따라 popup창이 떠서 길을 잃지 않도록 길을 인도해줍니다. Set cobj = mspace.라고 치면 mspace에 사용가능한 메서드,속성들이 나열됩니다. 아래 그림처럼요.



addcircle을 선택하고 (를 입력하면 addcircle에 필요한 인자들의 설명이 나옵니다. 아래그림처럼 친절하게 center와 radius가 필요하다고 알려줍니다.



그리고 한개더 circle을 추가하도록 합니다, 두번재 circle은 위치를 30,0,0을 원점으로 하는 r=10인 빨간색 원을 그려보도록 하겠습니다.

Sub test()

  acad As Object
  mspace As AcadModelSpace
  Dim cobj As AcadCircle
  
  Dim c(2) As Double
  Dim r As Double
  
  c(0) = 0: c(1) = 0: c(2) = 0
  r = 10

  Set acad = GetObject(, "Autocad.application")
  Set mspace = acad.ActiveDocument.ModelSpace
  Set cobj = mspace.AddCircle(c, r)  
  c(0) = 30: c(1) = 0: c(2) = 0
  r = 10
  Set cobj = mspace.AddCircle(c, r)    
  
End Sub

여기까지 가 원점 0,0,0과 30,0,0에 r=10인 원을 그리는 코드입니다. 두번째 그린 원은 색을 빨간색으로 하고 싶다면 어떻게 할까요? 물론 현재컬러를 빨간색으로 바꾸고 난다음에 addcircle을 실행하면 빨간색 원이 만들어지지만 여기서는 addcircle이 돌려준 object를 선택하여 color속성을 바꿔서 색을 바꾸어보도록 하겠습니다.
일단 cobj는 AcadCircle object로 선언되어있기 때문에 새줄의 처음에 cobj.을 입력하면 AcadCircle object에 적용할 수 있는 메서드와 속성 목록들이 나타납니다. 이중에서 색을 바꾸는 속성을 선택하면 되겠지요? cobj.을 입력했을 때 아래그림과 같이 메서드와 속성들이 나타납니다. 이중에서 color를 선택하고 =을 입력하면 색을 선택할 수 있는 목록이 나타납니다.

  

그래서 선택된 개체의 색속성을 빨간색으로 바꾸는 코드인 cobj.Color = acRed를 추가하면 빨간색 원그리기가 완성된 것입니다. VB editor가 프로그램을 만드는 사람들이 길을 잃기 않게 잘 인도하고 있는 것을 볼 수 있습니다. 예전의 도스프로그램시절하고는 너무나 다른 환경이지요?
이런 일이 가능한 이유는? 물론 ?AutoCAD type library를 참조했기 때문에 가능합니다. 사실 acRed라는 것은 AutoCAD type library에 선언되어있는 상수입니다. 아마도 const acRed = 1이라고 선언되어있을 것입니다. 사실 acRed의 값은 1입니다. 하지만 1이라고 쓰는 것보다는 acRed라고 쓰는 것이 훨씬 더 이해하기 쉽습니다. 정말 acRed가 1이라는 숫가일까요? 테스트를 해보시면 됩니다. 직접실행창에서 ?acRed라고 입력해보세요..아래그림과 같은 결과를 보여줄 것입니다. 만일 오른쪽 그림같이 아무 변화가 없다면 AutoCAD type library를 참조하지 않았기 때문일 것입니다.
이제 왜 제가 "AutoCAD type library를 참조했을 때 비로소 Excel과 AutoCAD가 완전히 연결된 것이라"라고 이야기 한 이유를 잘 아시겠죠?

  

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



dolljong@dreamwiz.com