개요
ObjectARX를 이용하여 오토캐드 응용 프로그램을 개발하기 위해서는 우선적으로 알아야 할 기본 사항이 몇가지 있다.
첫째, C++에 대한 기본적인 지식이 있어야 한다. ObjectARX 라이브러리 자체가 C++로 개발되었기 때문에 C++를 모르고서는 아무 작업도 할 수가 없는 것이다. (2026년 현재는 .NET과 Object Model을 이용하여 개발 할 수도 있다.)
둘째, Visual C++의 MFC(Microsoft Foundation Classes)에 대해서는 어느 정도 알고 있어야 한다. 응용 프로그램의 화면 디자인(UI), 메시지 처리 등 많은 부분에서 MFC 라이브러리를 사용하고 있기 때문이다.
세째, 오토캐드의 내부 구조에 대해 어느 정도 알고 있어야 한다. 물론 ObjectARX를 이용하여 응용 프로그램을 개발하다 보면 어느 정도 오토캐드의 구조가 눈에 보이겠지만 초보자들에겐 너무나 방대하기 때문에 쉽지 않을 수 있다.
AutoCAD ObjectARX SDK downloads
ObjectARX for AutoCAD SDK downloads
aps.autodesk.com
ObjectARX 2023 SDK 다운로드
ObjectARX 응용 프로그램이란
ObjectARX 응용 프로그램은 오토캐드의 주소 공간을 공유하고 오토캐드에 직접적인 함수 호출을 할 수 있는 DLL(Dynamic Link Library)이다. 확장성을 염두에 두고 디자인 되었기 때문에 ARX 라이브러리는 새로운 클래스를 수월하게 정의 할 수 있는 매크로를 포함하고 런타임시에 라이브러리에 존재하는 함수에 새로운 기능을 추가 할 수 있는 기능을 제공한다. ARX 개발 환경은 객체지향 C++ 응용 프로그램 개발 환경이며, 오토캐드의 개방 구조, 오토캐드 데이터베이스, 그래픽 시스템으로의 직접적인 접근, 사용자 명령어 정의 등 응용 프로그램 개발자를 위해 여러 가지 툴을 제공하고 있다. 추가로 AutoLISP과 ADS(AutoCAD Development System)과도 연결하여 사용 할 수 있도록 설계 되었다.
ObjectARX 라이브러리
ObjectARX에서 사용하는 라이브러리 파일의 종류는 크게 다음과 같이 5가지 종류로 분류 된다.
1. AcRx : 응용프로그램을 바인딩하고 런타임 클래스 등록과 확인을 위한 클래스
AcRx 라이브러리는 DLL 초기화 및 링크, 그리고 런타임 클래스 등록 및 식별을 위한 시스템 레벨 클래스를 제공한다. 이 라이브러리의 기본 클래스는 아래와 같은 편의를 제공하는 AcRxObject 이다.
- 객체 런타임 클래스 식별과 상속 해석
- 기존 클래스에 새로운 프로토콜의 런타임 추가
- 객체 복사
또한 AcRx 라이브러리는 AcRxObject로부터 파생된 새로운 ObjectARX 클래스들을 생성하는데 도움을 주는 C++ 매크로들을 제공한다.
AcRxDictionary는 이 라이브러리에서 또 다른 중요한 클래스이다. Named of Dictionary를 통해 사용자 정의 Dictionary를 만들어 데이터베이스에 여러가지 정보를 저장 할 수 있는 인터페이스를 제공한다.

2. AcEd : 사용자 명령어 등록과 시스템 이벤트 통보를 위한 클래스
AcEd 라이브러리는 AutoCAD 고유의 명령과 같은 방식으로 동작하는 새로운 AutoCAD 명령을 정의하고 등록하는 클래스를 제공한다. 정의된 새로운 명령은 고유의 명령과 같은 내부적인 구조(AcEdCommandStack)로 되어 있기 때문에 "고유" 명령으로 참조된다. 또한 AcEd 라이브러리는 편집기 리액터(Command Contexts)와 AutoCAD와 상호작용하기 위한 전역 함수의 세트를 제공한다. 이 라이브러리에서 중요한 클래스는 AcEditorReactor이고, 이것은 AutoCAD 편집기 상태를 모니터하고 명령의 시작, 종료, 취소 등의 지정된 이벤트가 발생할 때 응용프로그램에 통지한다.

3. AcDb : 오토캐드 데이터베이스 클래스
AcDb 라이브러리는 AutoCAD 데이터베이스를 구성하는 클래스를 제공한다. 이 데이터베이스에는 AutoCAD 도면을 구성하는 엔티티(도면요소)라 불리우는 그래픽 객체 뿐만 아니라 도면의 일부분으로서 비그래픽 객체(예를 들면, 도면층, 선종류, 문자유형, 그룹, MLine 등)의 모든 정보가 저장된다. AcDb 라이브러리를 사용하여 AutoCAD 엔티티 및 객체의 존재하는 인스턴스를 질의 및 조작할 수 있고, 데이터베이스의 새로운 인스턴스를 생성할 수 있다.
- 9개의 심볼 테이블 세트는 유일하게 명명된 기호 테이블 엔트리 객체를 소유한다. 이 객체는 여러가지 공통적으로 사용되는 AcDbDatabase 객체와 데이터 멤버를 표시한다.
- AutoCAD에 의해 값이 설정되는 약 200 개의 고정된 시스템 변수.

4. AcGi : 오토캐드 엔티티를 렌더링하기 위해 그래픽 인터페이스
AcGi 라이브러리는 AutoCAD 엔티티를 그리기 위해 사용되는 그래픽 인터페이스를 제공한다. 이 라이브러리는 표준 엔티티 프로토콜의 전체 부분인 AcDbEntity 멤버 함수들 worldDraw(), viewportDraw() 및 saveAs() 등에 의해 사용된다. worldDraw() 함수는 모든 사용자화 엔티티 클래스들에 의해 정의 되어야만 한다. AcGiWorldDraw 객체는 AcDbEntity::worldDraw()가 모든 뷰포트를 동시에 그래픽으로 표시하는 API를 제공한다. 이와 유사하게 AcGiViewportDraw 객체는 AcDbEntity::viewportDraw() 함수가 각 뷰포트마다 그래픽을 다르게 표시하는 API를 제공한다.

5. AcGe : 일반적인 선형 대수와 기하학 객체들을 위한 유틸 리티 라이브러리
AcGe 라이브러리는 AcDb 라이브러리에 의해 사용되고 일반적인 2D 및 3D 도형을 연산하기 위해 사용되는 벡터와 행렬 같은 클래스를 제공한다. 또한 점, 곡선, 곡면과 같은 기본 도형 객체를 제공한다.
AcGe 라이브러리는 두 개의 서브세트 2D 도형 클래스 및 3D 도형 클래스로 구성되어 있다. 주요 기본 클래스는 AcGeEntity2d와 AcGeEntity3d 이다. 다른 클래스로부터 파생되지 않은 기본 클래스로는 AcGePoint2d, AcGeVector2d 및 AcGeMatrix2d 등이 있다. 이러한 기본 클래스들은 점이나 벡터를 추가하거나, 두 벡터의 합이나 차를 계산하거나 또는 두 행렬의 합을 계산하는 등의 일반적인 조작의 많은 유형을 수행하기 위해 사용될 수 있다.

acrxEntryPoint() 함수
acrxEntryPoint() 함수는 오토캐드와 ObjectARX 응용 프로그램이 서로 통신하기 위한 연결 통로로 사용된다. ADS 응용 프로그램에서 메인 함수의 역할을 하는 부분으로 ObjectARX 응용 프로그램을 위해 메시지를 전달해 줄 뿐 아니라 오토캐드에 상태 코드를 되돌려 주는 역할을 한다. Visual Stduio ObjectARX Wizard가 자동으로 생성해 준 함수는 다음과 같다.
//-----------------------------------------------------------------------------
//----- ObjectARX EntryPoint
class CMateDesignApp : public AcRxArxApp {
public:
CMateDesignApp () : AcRxArxApp () {}
virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
// TODO: Load dependencies here
// You *must* call On_kInitAppMsg here
AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
// TODO: Add your initialization code here
return (retCode) ;
}
virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
// TODO: Add your code here
// You *must* call On_kUnloadAppMsg here
AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
// TODO: Unload dependencies here
return (retCode) ;
}
virtual void RegisterServerComponents () {
}
// The ACED_ARXCOMMAND_ENTRY_AUTO macro can be applied to any static member
// function of the CMateDesignApp class.
// The function should take no arguments and return nothing.
//
// NOTE: ACED_ARXCOMMAND_ENTRY_AUTO has overloads where you can provide resourceid and
// have arguments to define context and command mechanism.
// ACED_ARXCOMMAND_ENTRY_AUTO(classname, group, globCmd, locCmd, cmdFlags, UIContext)
// ACED_ARXCOMMAND_ENTRYBYID_AUTO(classname, group, globCmd, locCmdId, cmdFlags, UIContext)
// only differs that it creates a localized name using a string in the resource file
// locCmdId - resource ID for localized command
// Modal Command with localized name
// ACED_ARXCOMMAND_ENTRY_AUTO(CMateDesignApp, MATEMyGroup, MyCommand, MyCommandLocal, ACRX_CMD_MODAL)
static void MATEMyGroupMyCommand () {
// Put your command code here
}
} ;
//-----------------------------------------------------------------------------
IMPLEMENT_ARX_ENTRYPOINT(CMateDesignApp)
ACED_ARXCOMMAND_ENTRY_AUTO(CMateDesignApp, MATEMyGroup, MyCommand, MyCommandLocal, ACRX_CMD_MODAL, NULL)
다음은 오토캐드가 ObjectARX 응용 프로그램에 보내주는 여러 개의 메시지를 정리한 것이다.
| 메시지 | 설명 |
| kInitAppMsg | ObjectARX 응용 프로그램이 적재 될 때 발생한다. |
| kUnloadAppMsg | ObjectARX 응용 프로그램이 Unload 될 때 발생한다. |
| kOleUnloadAppMsg | ActiveX(OLE) Automation을 가진 응용 프로그램에만 보내진다. |
| kLoadDwgMsg | 사용자가 도면을 Open할 때 발생한다. |
| kUnloadDwgMsg | 사용자가 Drawing Session을 빠져 나갈 때 발생한다. |
| kDependencyMsg | 서비스가 0에서 1로 바뀔 때 발생한다. |
| KNoDependencyMsg | 서비스가 1에서 0으로 바뀔 때 발생한다. |
| kInvkSubrMsg | ads_defun( ) 함수에 의해 정의된 함수를 호출 할 때 발생한다. |
| kEndMsg | END 명령어가 입력 되었을 때 발생한다. |
| kPreQuitMsg | 오토캐드를 빠져 나갔을 때 발생한다. |
| kQuitMsg | QUIT 명령어가 입력 되었을 때 발생한다. |
| kSaveMsg | SAVE, SAVE AS 명령어가 입력 되었을 때 발생한다. |
| KCfgMsg | 오토캐드가 환경 설정 프로그램에서 리턴 할 때 발생한다. |
| KNullMsg | Empty 혹은 Zero 메시지. |
'ObjectARX 강좌' 카테고리의 다른 글
| [ObjectARX] 6. Dictionary (0) | 2026.03.27 |
|---|---|
| [ObjectARX] 5. GS Marker (0) | 2026.03.23 |
| [ObjectARX] 4. Symbol Table (0) | 2026.03.22 |
| [ObjectARX] 3. Entity (0) | 2026.03.21 |
| [ObjectARX] 2. Database (0) | 2026.03.19 |