You are on page 1of 135

ObjectARX 2010

and

AutoCAD .NET
Autodesk Developer Technical Services

Getting Acquainted
Instructor: Marat Mirgaleev ( )
Developer Consultant ADN Mechanics Engineering + Computer Science 20 years in software development (CAD, 3D, Databases) C++, C#, Delphi, Assembler; Object-Oriented Analysis and Design

Who Are You?

Your work, your software AutoCAD customization experience Your company What are you expecting from this training?

2008 Autodesk

Autodesk Developer Network (ADN)

Access to almost all Autodesk software and SDKs

Including early access to Beta software

Members-only website with 1000s of technical articles Unlimited technical support Product direction through conferences Marketing benefits

Exposure on autodesk.com Promotional opportunities Based on user level

1 to 3 free API training classes

www.autodesk.com/joinadn
2008 Autodesk

Developer Technical Services


Worldwide Workgroup

Over 25 Specialists World Wide Virtually 24 hour support, 5 days a week

Americas Team

CA, WA, So Paulo

European Team

Switzerland, United Kingdom, France, Czech Republic, Russia

APac Team

China, Japan, India

2008 Autodesk

Getting Support
http://www.autodesk.com/adn-devhelp

Provides access to

On-line knowledgebase Request submission Newsgroups 1-3 day turnaround Callbacks as needed

Requests are logged automatically


Answers to frequently asked questions are posted in our online knowledge base

2008 Autodesk

Course Objective
It is to understand:

The fundamentals of ObjectARX and AutoCAD .NET How to teach yourself AutoCAD APIs Where to get help with afterwards

What it is not:

Teach you C++, C#, VB, .NET Give you complete of coverage of all API functions

2008 Autodesk

Class Agenda
Lectures with Labs Slides give an abstract overview Labs and my comments give the practical experience Lectures: Overview of APIs AutoCAD: Hello.arx Step 1 + 2 ObjectDBX: Structure Step 3 + 4 ObjectDBX: Extend it! Step 5 + 6 AutoCAD: Multi-Document Environment Notification System Step 7

AutoCAD .NET

2008 Autodesk

Class Schedule
Time 10:00 - 5:00 Lunch 12:00 - 1:00 Day 1 Overview of APIs AutoCAD: Hello.arx Day 2 ObjectDBX: Structure ObjectDBX: Extend it! Day 3 AutoCAD: MDE Environment Notification System Day 3, Day 4 AutoCAD .NET
2008 Autodesk

Training Material
C:\AutoCAD API Training

ObjectARX*.pptx AutoCAD.NET*.pptx

- this presentation - .NET API presentation

objectarx_2010_win_64_and_32bit.exe - ObjectARX installation file

objectarx_2010_training.zip

- ObjectARX labs

AutoCAD 2010.Net Training.zip


Inspector.zip

- .NET labs
- ObjectARX snoop tool

2008 Autodesk

Agenda
Overview of APIs AutoCAD: Hello.arx ObjectDBX: Structure ObjectDBX: Extend it! AutoCAD: Multi-Document Environment Notification System

2008 Autodesk

API Overview
A general look at APIs

Types of API Client/Server interaction Client code

AutoCADs APIs and IDEs

Implementation Comparison

2008 Autodesk

What is an API?
A contract, it is about responsibilities Both sides are (or may be) required to

Implement service entry points Call services properly

Code implementing API can be packaged as Source code modules (.h/.cpp in C++) Binary

Static library DLL EXE

2008 Autodesk

API Packaging
Client EXE, DLL, script, etc.
4

ATL templates

API

API

SomeApp.exe
3

API

Static MFC Library

Win 32 API DLLs

API

1. Source code 3. DLL


2008 Autodesk

2. Static library 4. EXE

Client/Server Interaction
In process

Client/server is in the same process

Local

Client/server is on the same machine

Remote

Client/server is on the same network

2008 Autodesk

The Plug-In Architecture


API is implemented by an exe Client is implemented as a dll

.DLL .ARX
API ObjectARX APIs

.DLL .ARX

.EXE AutoCAD

2008 Autodesk

Forms of Client Code


SLOW
Interpreted code

Source script AutoLISP in the past

Packaged code (p-code)

Pre-processed, semi interpreted code Compiled Visual LISP


Compiled into IL Processor instructions ObjectARX

AutoCAD.NET

Compiled code

FAST

2008 Autodesk

AutoCAD APIs and IDEs


Application Programming Interfaces

ObjectARX .NET Managed API COM Automation (VB, Java, Delphi, etc.) AutoLISP

Integrated Development Environments in AutoCAD


Visual LISP Visual Basic, Applications Edition (VBA)

(Visual Studio outside AutoCAD)

2008 Autodesk

API Implementation I
Input driver Input acquisition AutoCAD PlotHDI

2D graphics cache (WHIP!)

Display driver

Plotter driver

HEIDI

3D graphics cache

ObjectDBX

ObjectARX SDK (free, http://www.autodesk.com/objectarx) RealDWG (licensed, http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=770257) Plot DDK (licensed, http://www.autodesk.com/adn-devhelp) HEIDI DDK (licensed, http://www.autodesk.com/heidi) Wintab API (free)
2008 Autodesk

dwg

API Implementation II
.NET Lisp script VBA script
(VB, Java, Delphi)

COM Client

Acdbmgd.dll Acmgd.dll

vl.arx

acvba.arx

axdb.dll
ObjectARX APIs COM

AutoCAD

2008 Autodesk

S.0.58 API Performance Old API Performance Comparison

100.00 90.00 80.00 70.00

Seconds

60.00 50.00 40.00 30.00 20.00 10.00 0.00

Total Create 1000 2dPolylines Add XData to 1000 Entities Update 1000 Circles Create 1000 lines

COM (VB)

COM (VBA)

LISP

Create 1000 Circles

ObjectARX

Cre

Cre

Upd

AutoCAD's APIs
2008 Autodesk

Add

Cre

Tota

How to Store Your Data in AutoCAD


Different Programming Techniques
Data Container Performance Chart
400 350 300 250 200 150 100 50 0 Xrecord Custom Object Xdata

Time in seconds

ObjectARX .NET LISP

2008 Autodesk

How to Store Your Data in AutoCAD


Different Programming Techniques
Data Container Performance Chart
140000
Time in seconds

120000 100000 80000 60000 40000 20000 0 Xrecord Xdata ObjectARX .NET LISP VBA VB

2008 Autodesk

How to Store Your Data in AutoCAD


Different Programming Techniques
Data Container Performance Chart
5000
Time in seconds

4000 3000 2000 1000 0 Xrecord Custom Object ObjectARX .NET VBA LISP

2008 Autodesk

API Comparison Summary


Speed ObjectARX, .NET is close second, VBA also though obsolete Coverage ObjectARX, .NET everything except custom objects Ease of use .NET, VBA Learning curve .NET, VBA

2008 Autodesk

Agenda
Overview of APIs AutoCAD: Hello.arx ObjectDBX: Structure ObjectDBX: Extend it! AutoCAD: Multi-Document Environment Notification System

2008 Autodesk

AutoCAD: Hello.arx
ObjectARX

What it is

Where to get it
Structure Loading Memory management Command mechanism

ObjectARX applications

Creating commands

Prompting for user input

ObjectARX Wizards

2008 Autodesk

What is ObjectARX?
AutoCAD Runtime eXtension

A DLL plug-in model A set of Object Oriented C++ libraries A framework

A framework?

More than just a toolkit Specialized objects can be plugged back into the system

Custom entities Reactors ...

2008 Autodesk

What can I do with ObjectARX?


Modify and extend the drawing database

Create/modify/erase objects Create new types of objects

Modify AutoCADs user interface

Commands Toolbars/dialogs Properties Window Design Center Display system

Monitor/Modify AutoCADs standard behavior

Event notifications Input point acquisition

2008 Autodesk

Getting the ObjectARX SDK


Download - Free
On Autodesk public web site

Developer Center - ObjectARX


(http://usa.autodesk.com/adsk/servlet/index?id=773204&siteID=123112)

Or Search for ObjectARX on http://www.autodesk.com/

2008 Autodesk

Binary compatibility
ObjectARX 2010

AutoCAD 2010 Binary incompatible with earlier releases

ObjectARX 2009

AutoCAD 2009

ObjectARX 2008

AutoCAD 2008 and 2009

ObjectARX 2007

AutoCAD 2007, 2008 and 2009 Binary incompatible with earlier releases

ObjectARX 2006, 2005, 2004

Not supported, as well as AutoCAD versions older than 2007

2008 Autodesk

Development Environment
For ObjectARX development

Microsoft Visual Studio 2008 SP1 only for AutoCAD 2010 VS 2005 SP1 only for AutoCAD 2009 VS 2005 RTM for AutoCAD 2007, 2008, 2009 VS 2008 VS 2005 RTM or SP1

For .NET development:

ObjectARX 2007, 2008, 2009 or 2010 Microsoft Windows 2000 SP2 or better

2008 Autodesk

ObjectARX SDK Contents


What comes with the SDK

Libraries and Header Files Documentation Samples Utilities

2008 Autodesk

Main Libraries - I
AcRx Object and Class Management (rxapi.lib) AcEd AutoCAD Editor Facilities (acedapi.lib) AcDb AutoCAD Database (acdb18.lib) AcGi AutoCAD Graphics Interface (acgiapi.lib) AcGe AutoCAD Geometry Library (acge18.lib) 32- and 64-bit versions:
\ObjectARX 2010\lib-win32 and \ObjectARX 2010\lib-x64

2008 Autodesk

Main Libraries - II
AcUi/AdUi MFC Extension Library (adui18.lib acui18.lib) Automation (axdb.lib oleaprot.lib) ads_ Function Set (acad.lib) Static Linking Memory Management (rxheap.lib)

2008 Autodesk

Utilities
AutoCAD Facet Modeler (aecmodeler60.lib)

AutoCAD Boundary Representation (acbr18.lib, acgex19.lib)


ObjectARX Wizard
(<your path>\ObjectARX 2010\utils\ObjARXWiz\ArxWizards.msi)

ATIL - Raster graphics Teefy - Converting existing applications to Unicode string handling

2008 Autodesk

On-line Documentation
Found in ObjectARX\docs

ObjectARX Documentation (arxdoc.chm) ObjectARX Developers Guide (arxdev.chm) Reference Manual (arxref.chm) Managed Class Reference Guide (arxmgd.chm) ObjectARX 2010 Migration Guide (arxxmg.chm) 64-bit Migration Guide (arxmgr.chm) Interoperability Guide (arxiop.chm) ObjectARX Readme (readarx.chm)

ObjectARX Training Material and Labs


(can be found on the Autodesk site)

2008 Autodesk

Samples
The ObjectARX SDK comes with a number of code samples organized into sub-categories:

ObjectARX\Samples

COM Database DotNet Editor Entity Graphics Misc Reactors PolySamp and ArxDbg

Also see Knowledgebase on the ADN website.

2008 Autodesk

.ARX = .DLL + 2 exported functions

acrxEntryPoint acrxGetApiVersion

.DLL .ARX
API ObjectARX APIs

.ARX .DLL

.EXE AutoCAD

2008 Autodesk

Loading ObjectARX Applications I


Loaded by the user

ARX & APPLOAD commands Drag & Drop

Demand loaded

Startup

acad.rx file Registry (arxload) in acad.lsp


On command invocation

Registry From another application Registry

On request

On proxy detection

Live Enablers (see PolySamp)


2008 Autodesk

Loading ObjectARX Applications II


3. AutoCAD 1. 1. LoadLibrary
2. _DllMainCRTStartup (see MSDN for info) 3. CRT_INIT (constructs global class vars) 4. DllMain (see MSDN for info) 5. acrxGetApiVersion 6. acrxEntryPoint
2008 Autodesk

5. 6.

Rxapi.lib

.ARX

4.

2.

Operating System

Wrong ARX Memory Management


AutoCAD/ObjectDBX
2.

3.

MSVCRT.DLL

CRASH!

Piece of Memory
1.

.ARX

MSVCRTD.DLL

1. .ARX allocates memory from debug heap 2. .ARX passes allocated memory to AutoCAD 3. AutoCAD de-allocates it with release delete CRASH

2008 Autodesk

Correct ARX Memory Management I


AutoCAD/ObjectDBX
2. 3.

MSVCRT.DLL

Piece of Memory

1.

.ARX
1. .ARX allocates memory from release heap 2. .ARX passes allocated memory to AutoCAD 3. AutoCAD de-allocates it with release delete OK

2008 Autodesk

Correct ARX Memory Management II


2.

AutoCAD/ObjectDBX
1.
Rxheap.lib

4.
Piece of Memory

MSVCRT.DLL

3.
Libcmt.lib

.ARX

1. .ARX allocates memory via rxheap.lib 2. AutoCAD allocates memory on release heap 3. .ARX passes memory to AutoCAD 4. AutoCAD de-allocates it with release delete OK

2008 Autodesk

Getting Started
Visual C++ 9.0 (.NET) AutoCAD 2010 ObjectARX 2010

ArxDbg

\ObjectARX 2010\samples\database\ARXDBG

Dependency Walker
Process Monitor

www.dependencywalker.com or

C:\Program Files\Microsoft Visual Studio 9\Common7\Tools\bin\depends.exe

www.sysinternals.com

2008 Autodesk

Command Mechanism I
AcEdCommandStack 2, 3.

1.
Callback function

.ARX

4.

5.
AcEdCommand

6.

AutoCAD

1. Add command
2. Create command object 3. Parameterize it

4. User types command name


5. Lookup command object 6. Call callback function
2008 Autodesk

Command Mechanism II
Removing commands is as important as adding them

Command names can clash

Commands belong to groups

Command groups must be unique


Registered Developer Symbol (RDS) Search for Registered Developer Symbol takes you to
http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=1075006

2008 Autodesk

Lab - Step 1
Setup your first .ARX

2008 Autodesk

Prompting for User Input


AcEd functions

String, number acquisition Point, angle acquisition Entity selection

acedGetString(), acedGetInt()

acedGetPoint(), acedGetAngle()
acedEntSel()

Full range of Win32 controls

2008 Autodesk

ObjectARX Wizards
Application Wizard
ObjectARX\utils\ObjARXWiz\ArxWizards.msi COM Wrapper Wizard Custom Object Wizard Reactors Class Wizard etc.

Visual Studio Add-In


ObjectARX Commands Autodesk Class Explorer etc.

2008 Autodesk

Lab - Step 2
Play around with user input functions

2008 Autodesk

Agenda
Overview of APIs AutoCAD: Hello.arx ObjectDBX: Structure ObjectDBX: Extend it! AutoCAD: Multi-Document Environment Notification System

2008 Autodesk

Terminology
AutoCAD Session Document

Current Document

ObjectARX works with this in background User sees this in UI

Active Document

Drawing Database

Working Database

Current Drawing
acdbHostApplicationServices()->workingDatabase()

2008 Autodesk

ObjectDBX: Introduction
What is ObjectDBX and RealDWG? AutoCAD drawing database

Object identity Transactions Inter-object references Important classes Important objects Storing data

2008 Autodesk

What is ObjectDBX and RealDWG?


ObjectDBX is an AutoCAD-independent subset of ObjectARX RealDWG is the license to use ObjectDBX in an own application outside of AutoCAD. RealDWG allows to read/write DWG files from your own application Set of DLLs Custom object data services Extensible application development framework

2008 Autodesk

DWG Viewers
No viewing available in RealDWG! AutoCAD OEM DWF

www.dwfit.com

Autodesk Design Review DWG TrueView conversion of dwgs from old formats

2008 Autodesk

Database Framework
DWG Client Apps AutoCAD
Partners:
App 1 App 2 Corp. Dev. Other

ObjectARX Application
User Interface

Autodesk:
Inventor Revit Max

ObjectDBX
acdb18.dll acismobj18.lib axdb.lib Acgiapi.lib achapi18.lib acge18.lib
ObjEnabler1.dbx

Object Enablers

acis.dll(s) others...
ObjEnabler2.dbx ObjEnabler3.dbx ObjEnablerN.dbx

Design Object Data


DWG DXF

2008 Autodesk

Enabling Custom Objects w/o ACAD


DWG Client Apps.
Partners:
App 1 App 2 Corp. Dev. Other
ObjEnablerN.dbx

Autodesk:
Inventor Revit
acISMobj.lib acge18.lib acis.dll(s) others...

ObjectDBX
Object Enablers
acdb18.lib achapi18.lib
ObjEnabler1.dbx ObjEnabler2.dbx ObjEnabler3.dbx

Max

axdb.lib acgiapi.lib

Design Object Data


DWG DXF

2008 Autodesk

Plug-In Model & ObjectDBX AutoCAD process


.ARX .DBX

Acad.exe & other AutoCAD specific DLLs

ObjectDBX DLLs

2008 Autodesk

ObjectARX & ObjectDBX


ObjectDBX
ObjectARX SDK
acdb18.lib acge18lib acgiapi.lib axdb.lib achapi18.lib rxapi.lib acismobj18.lib rxheap.lib acad.lib acedapi.lib acui18.lib adui18.lib oleaprot.lib AcTc.lib AcTcUI.lib

rcexelib.obj

RealDWG
2008 Autodesk

Shared

What can I do with ObjectARX?

Create/Modify DWG/DXF files (.ARX) Create object enabler DLLs (.DBX)

Cannot create standalone applications this requires RealDWG

2008 Autodesk

AutoCAD Drawing Database


An AutoCAD drawing file is the persistent state of an object database

Objects have identity (primary key) Objects are only accessed in a transaction Objects can have references to other objects Objects can encapsulate data

Relational model Tables Records Fields

Object model Objects Objects Data members (encapsulated)

2008 Autodesk

Object Identity
Handle (AcDbHandle)

Unique identifier of an object for the life of the drawing

Object ID (AcDbObjectId)

Unique identifier of an object for a session of ObjectDBX Multiple drawings allowed per session IDs unique across ALL files would require too much storage space (GUIDs)

Pointer

Unique identifier of an object for the duration of a transaction

2008 Autodesk

Handles, Object IDs, Pointers


ObjectDBX session
1. 2.

.dwg

Object Closed
5.

4.

Open AcDbObject
3.

New AcDbObject

1. Object read from file


Handle Object ID

2. Object opened
Object ID Pointer

3. New object added to database


New Object ID & Handle assigned

4. Object closed
Pointer becomes invalid

5. Object saved to file


Handles are written to disk
2008 Autodesk

Object ID and Entity Name


ads_name is a relic from days of ADS Virtually the same An ads_name

Array of two longs First element of ads_name

An AcDbObjectId

Exchange one for another acdbGetAdsName( adsName, objId ); acdbGetObjectId( objId, adsName );

2008 Autodesk

Open Modes
Read

255 simultaneous readers

Write

Open/Close model

1 writer at a time read/write are mutually exclusive multiple writers are allowed read/write are NOT exclusive

Transaction model

Notify

2008 Autodesk

Used internally

Transactions
Two models

Open/Close

acdbOpenObject AcDbObject::close, AcDbObject::cancel

Transaction

AcDbTransactionManager::startTransaction AcTransaction::getObject AcDbTransactionManager::end/abortTransaction

Do not mix transaction models

e.g. getObject, then close

2008 Autodesk

Nesting AcTransactions
1
Transaction 2 Transaction 1
obj1 obj2

2
obj2 obj3

obj1 AcDbDatabase

obj3

obj2

1. Client starts Trans1 and gets Obj1 & Obj2 2. Client starts Trans2 and gets Obj2 & Obj3 3. Client commits Trans2

Trans2 changes are committed Trans1 changes are committed Trans1 (and Trans2) changes are rolled back

4a. Client commits Trans1

4b. Client aborts Trans1 instead

2008 Autodesk

Getting an AcDbDatabase Object


Construct one

In memory

Get the one currently active in AutoCAD


acdbHostApplicationServices()->workingDatabase();

More on this in the AutoCAD: MDE section

Access some other open document Open a new dwg file

2008 Autodesk

AcDbDatabase Ownership Hierarchy

2008 Autodesk

Object Model Overview


classmap.dwg

in ObjectARX distribution

2008 Autodesk

Important Classes
AcRxObject AcGiDrawable

AcDbObject
AcDbEntity AcDbCurve

AcDbDictionary
AcDbSymbolTable

AcDbLine

AcDbBlockTable AcDbSymbolTableRecord Database resident objects Drawable objects

2008 Autodesk

Snoop Tools for the AutoCAD Database


Tool Language Where to find

ArxDbg

C++

ObjectARX Samples

MgdDbg
Inspector

C#
C++

ADN site
ADN site

2008 Autodesk

Important Objects
Block Table Three default records

*MODEL_SPACE *PAPER_SPACE, *PAPER_SPACE0

Only entities added to one of these is visible in AutoCAD editor Block table records only own entities

Named Objects Dictionary AutoCADs symbol tables Dictionaries own any objects (but not entities)

2008 Autodesk

Iterating Through Containers


Objects that use iterators

Symbol Tables

Block Table Records


Dictionaries Polylines PolyFaceMesh & PolygonMesh ACIS Solids

Called traversers

BlockReferences (Inserts)

Only useful when attributes are present

2008 Autodesk

Iterator Pattern
Abstract form of i in the following construct: for( int i=0; i<numElems; i++ ) a = array[i]; Needs initialization, done condition and next operation
Client1

Client2

iterator1

iterator1

Aggregate
See Design Patterns by Erich Gamma et al. (ISBN 0-201-63361-2)

2008 Autodesk

RTTI Runtime Type Identification


Object containers provide generic pointers to

AcDbObjects AcDbEntities
RTTI allows us to do this down-cast pointer safely get class descriptor is object derived from?

We might prefer a pointer to an AcDbPolyline

AcRxObject defines (in rxobject.h)

cast isA isKindOf

AcDbEntity * ent; if( ent->isKindOf( AcDbLine::desc() ) ) { AcDbLine * line = AcDbLine::cast( ent ); // do something with line->startPoint() ... }
2008 Autodesk

AcRxClass I (Overview)
Three roles:

Runtime type identification Class factory Protocol extension

samples\database\dataxtsn\peinvent samples\entity\tempapp_dg

AcRxClass is usually set up for a custom object via macros in rxboiler.h


ACRX_DECLARE_MEMBERS(CLASS_NAME) ACRX_DXF_DEFINE_MEMBERS

2008 Autodesk

AcRxClass II (Cont.)
AcRxObject-derived objects hold a pointer to an AcRxClass object (class descriptor object)

static class variable

AcRxClass objects hold a pointer to the parent AcRxClass object

forms a run time class hierarchy

2008 Autodesk

AcRxClass III (Object Diagram)


An AcDbLine Runtime class hierarchy

An AcRxClass for AcDbCurve

Another AcDbLine

An AcRxClass for AcDbLine An AcRxClass for AcDbCircle

An AsdkCircle

A protocol extension object .DBX/.ARX App Pseudo constructor

An AcRxClass for AsdkCircle

2008 Autodesk

AcRxClass IV (Roles)
Class Factory

During filing we look up the class identifier in the runtime class hierarchy AcRxClass provides a constructor function

Run time type identification

Each AcRxObject provides a virtual member to look up the static member pointing to its AcRxClass object

Protocol Extension

AcRxClasses hold a list of extension objects

2008 Autodesk

Storing Data in the Database


Create custom objects (more on this later)

Without using custom objects


Extended entity data (Xdata) Xrecords

Extension dictionaries on individual objects Dictionaries e.g. under the Named Objects

Data stored with these methods can be also accessed by LISP and COM

2008 Autodesk

Lab - Step 3
Accessing object containers

Symbol tables

2008 Autodesk

AcDbDatabase Ownership Hierarchy

2008 Autodesk

Inter-Object References
Ownership

Dictates objects written to disk (DWG/DXF)


A database object has exactly one owner Database is the ultimate owner Bi-directional

Pointer reference

Arbitrary references between object Multiple objects can point to the same object Uni-directional

Use ArxDbg to discover them

2008 Autodesk

Inter-Object References
AcDbDatabase

AcDbBlockTable

AcDbLayerTable

AcDbDictionary Named Object Dict.

AcDbBlockTableRecord

AcDbLayerTableRecord

AcDbDictionary Company Dictionary *

AcDbLine

AcDbObject'

AcDbHardOwnershipId AcDbSoftOwnershipId

AcDbHardPointerId AcDbSoftPointerId

2008 Autodesk

Inter-Object References
Hard ownership examples

Database Object Extension Dictionary Block Table Model Space BTR Extension Dictionaries Entries

Hard pointer examples


Entity Linetype Text Style

2008 Autodesk

Inter-Object References
Soft owner examples

Dictionary Entries
(can be made hard owner)

Symbol Tables Entities


(except model and paper space which are hard)

Soft pointer example


Entity Xdata Entity Handle Object Persistent Reactor

2008 Autodesk

Soft/Hard References
Save

Follows both types of ownership links

Wblock

Follows hard references

DeepClone

COPY, MIRROR, EXPLODE commands


Follows only ownership links

Purge

Soft references do not protect the object from purge

2008 Autodesk

Changing an Objects Identity I


AcDbObject::handOverTo

Replaces an objects in the db with a new one Objects cannot be removed from the db

You can only flag them as erased


removed

Open AcDbObject

New AcDbObject

ObjectDBX Session

added

2008 Autodesk

Changing an Objects Identity II


AcDbObject::swapIdWith

Changes the object denoted by the object ID

id

id

AcDbObject
ObjectDBX Session
2008 Autodesk

AcDbObject

Lab - Step 4
Accessing object containers

Dictionaries

2008 Autodesk

Agenda
Overview of APIs AutoCAD: Hello.arx ObjectDBX: Structure ObjectDBX: Extend it! AutoCAD: Multi-Document Environment Notification System

2008 Autodesk

ObjectDBX: Extend It!


First step: create a new class Then: participate in desired mechanisms Filing ObjectDBX Undo ObjectDBX Graphics Display host application Whatever else the host application may define

e.g. TRIM and BREAK in AutoCAD

2008 Autodesk

Create a New Class


Derive from AcRxObject AcGiDrawable AcDbObject AcDbEntity AcDbCurve

RTTI protocol + Graphics protocol + Filing protocol Persistent graphics Curve entities

ObjectDBX and host applications interact with your object through these interfaces

2008 Autodesk

Filing
Read/write object state to another object (filer)

Visitor Pattern

Filers implement AcDbDwgFiler or AcDbDxfFiler interface Used for DWG/DXF save/load, and also:

Copy Undo entmake/entget/entmod Copy/Wblock/Insert/Xref/Refedit Paging Wblock Purge

kCopyFiler kUndoFiler kBagFiler kIdXlateFiler kPageFiler kWBlockCloneFiler kPurgeFiler

2008 Autodesk

Filing Out
An AcDbDwgFiler
3.

An AcDbObject

1. 2.

3.

ObjectDBX

Another AcDbObject
2.

1. Object implementing filer protocol created 2. Filer is passed to the database object 3. Database object calls back into the filer

2008 Autodesk

Filing In
An AcDbDwgFiler
4.

An AcDbObject

2. 1.
2. 3. 4.

ObjectDBX

Another AcDbObject

3.

1. Class identifier is read from filer 2. Class is instantiated by AcRxClass class factory 3. Filer is passed to the newly created object 4. Database object calls back into the filer
2008 Autodesk

Filing Member Functions - I


AutoCAD calls the dwgIn which calls your dwgInFields function on:

Open
Undo Insert, Copy, Xref

kFileFiler
kUndoFiler kDeepCloneFiler + kIdXlateFiler

Wblock
Object paging

kWblockCloneFiler + kIdXlateFiler
kPageFiler

2008 Autodesk

Filing Member Functions - II


AutoCAD calls the dwgOut which in turn calls your dwgOutFields function on:

Save/SaveAs
Wblock Insert, Xref

kFileFiler
kWblockCloneFiler + kIdXlateFiler kDeepCloneFiler + kIdXlateFiler

Copy same as Insert (files out objects state and files it into another object) Purge Object paging Any Object modification for undo recording kPurgeFiler kPageFiler kUndoFiler

2008 Autodesk

Filing Member Functions - III


AutoCAD calls dxfOut which calls your dxfOutFields function on:

WBLOCK

kFileFiler

SAVE
SAVEAS acdbEntGet

kFileFiler
kFileFiler kBagFiler

AutoCAD calls dxfIn which calls your dxfInFields function on:


OPEN INSERT acdbEntMod, acdbEntMake, acdbEntMakeX

kFileFiler kFileFiler

kBagFiler

2008 Autodesk

AcDbDxfFiler
Data sent to a DXF filer is tagged with DXF group codes

Group code ranges for each data type AcDb enum has first in each range use +1, +2, etc to get others AcDb::DxfCode

Groups may come in any sequence

2008 Autodesk

Check You Have Access Rights


Member functions should first call one of these:

assertReadEnabled Every member function that reads data assertWriteEnabled Every member function that modifies data assertNotifyEnabled Used internally

2008 Autodesk

Proxy
A proxy object is created in memory when a defining application is not available

Surrogate data holder for custom object

Class ID

Graphics data Object data

Only inter-object references are interpreted Used to draw proxy graphics

2008 Autodesk

Class ID

Lab - Step 5
Creating a Custom Object

2008 Autodesk

Graphics Display
ObjectDBX does not display any graphics

ObjectDBX defines a callback API that host applications may implement

AcGi: interface between database objects and a display system

Host applications must implement AcGi to display graphics

AcGi Library defines the interface between database objects and a display system

2008 Autodesk

AcGi Class Diagram


AcGiCommonDraw
AcGiContext
AcGiSubentityTraits

AcGiGeometry
AcGiWorldDraw
AcGiViewportDraw

AcGiWorldGeometry
AcGiViewportGeometry

AcGiViewport
Legend: Inheritance Containment

2008 Autodesk

Graphics Acquisition
An AcGiWorldDraw
1.

4.

An AcGiDrawable
6.

3.

5. 2.

Host Application

An AcGiViewportDraw

1. Host creates object implementing AcGiWorldDraw 2. Host creates object implementing AcGiViewportDraw 3. Host passes world-draw object to your drawable 4. Drawable draws viewport independent graphics 5. Host passes viewport-draw object to your drawable 6. Drawable draws viewport dependent graphics
2008 Autodesk

AcGiGeometry
Responsible for inserting geometry into the graphics cache for later display Primitive geometry used:

circle, circularArc, polyline, mesh, pline, polygon, shell, text, xline and ray

Viewport-dependent and viewport-independent graphics

2008 Autodesk

AcGiSubEntityTraits
Traits control current attributes for primitives:

color, layer, linetype, filltype graphics system (GS) marker

Allows identification of sub-entities

Once set, a trait stays active until changed or out of scope

Default attribute values:


color, layer, linetype - Current for editor filltype - kAcGiFillNever if standard mode kAcGiFillAlways if hide, shade, render gsmarker - invalid, must be set by app

2008 Autodesk

Special Uses of AcGi


Can derive from AcGiWorldGeometry, implementing own versions of geometry functions

2008 Autodesk

Host-Defined Mechanisms
ObjectDBX defines protocols for

Grips Osnaps Intersection Transformations etc.

Host applications use as appropriate

e.g. Volo View does not use grips

2008 Autodesk

AcDbEntity Protocol
subGetOsnapPoints subGetGripPoints subMoveGripPointsAt subGetStretchPoints - define osnap points - define grip points - default is to call AcDbEntity::subTransformBy - provide stretch points other than the grippoints, default is to call subGetGripPoints

subMoveStretchPointsAt - used by stretch, default is subTransformBy subTransformBy - needed for moving entity

2008 Autodesk

AcDbEntity Protocol
subIntersectWith - no default

subGetGeomExtents - no default subList subExplode


- print specified data, DXF name, layer, space, and handle by default - no default, must be implemented for hatch to work

If exploding to non-native objects, return eExplodeAgain Hatch calls explode recursively until down to native entities (until eOk returned)

2008 Autodesk

Lab - Step 6
Creating a Custom Entity

2008 Autodesk

Agenda
Overview of APIs AutoCAD: Hello.arx ObjectDBX: Structure ObjectDBX: Extend it! AutoCAD: Multi-Document Environment Notification System

2008 Autodesk

AutoCAD: Multi-Document Environment (MDE)

Documents, per-document data Execution context Document locking

2008 Autodesk

Documents
State of the edit session

AcApDocument class encapsulates


AcDbDatabase viewed XRefed databases Selection sets Most system variables

AcApDocManager holds the list of documents

2008 Autodesk

Per-Document Data
Applications may have per-doc data

this is their concept of a document

Data must be kept in sync with the active document (fiber)

this is their concept of a document manager

2008 Autodesk

Execution Contexts
AutoCAD has a fiber-based architecture

see MSDN for more info on fibers fibers are scheduled by AutoCAD they have their own call stack

Application fiber (context):

runs windows message loop kicks off a fiber for each document created

Document fibers (context):

run commands for the given document

2008 Autodesk

Fiber scheduling in AutoCAD


App Fiber Doc1 Fiber Doc2 Fiber

Msg loop
Cmd started in Doc1

Time
Msg loop

Doc1 prompts for user input User switches to Doc2, starts cmd Cmd completes in Doc2 Msg loop

2008 Autodesk

Document Locking
Document-level transaction

Non-database resident data cannot rely on the ObjectDBX transaction model e.g. system variables

Provides synchronization, avoids data corruption Provides rollback (undo)

2008 Autodesk

Lock Types
New Lock Request
(from another context)

XWrite Write Read AWrite

Current Lock

None Read Write XWrite AutoWrite

2008 Autodesk

Document vs. Application


Document context

Automatic locking (simpler) e.g. for exclusive write

addCommand( , ACRX_CMD_DOCEXCLUSIVELOCK, );

Application context

Manual locking (more control)


acDocManager->lockDocument( pDoc, kXWrite ); Required for multiple docs

2008 Autodesk

Current vs. Active Documents


Current

for the user = Active for the API = Current

Activating a document sets the current doc

current document = active document

Current doc can change (programmatically)

current document may not be active

2008 Autodesk

Agenda
Overview of APIs AutoCAD: Hello.arx ObjectDBX: Structure ObjectDBX: Extend it! AutoCAD: Multi-Document Environment Notification System

2008 Autodesk

Notification System
Observer Pattern Implementation Subjects & Observers

ObjectDBX AutoCAD

Acting as an Observer Acting as a Subject

2008 Autodesk

Notification
Observer pattern class diagram
1. Knows its observers 2. Provides interface to attach/detach observers Defines updating interface

Subject
Attach(Observer) Detach(Observer) SendNotification()

observers

Observer Update()

For all o in observers { o->Update() }

ConcreteSubject subjectState

ConcreteObserver Update() observerState

2008 Autodesk

Notification
Observer pattern interaction diagram
3.

A ConcreteSubject

4.

A ConcreteObserver

2. Client

1.

1. Client creates observer 2. Client attaches observer to subject 3. Subject changes state and fires notification to observer 4. Observer learns details of state change
2008 Autodesk

Notification Example
Interaction diagram
3.

An AcDbLine

4.

Your custom object

2. Client

1.

1. Client creates your custom object 2. Client calls addPersistentReactor on the AcDbLine 3. Changing AcDbLine sends objectModified notification 4. Your custom object looks at the line to find out what changed
2008 Autodesk

ObjectDBX
Another AcDbObject An AcDbDatabase

Observers (reactors)
An AcDbDatabaseReactor

Subjects

An AcDbObject

An AcDbObjectReactor

The AcDbLayoutManager The AcDbTransactionManager

An AcDbLayoutManagerReactor An AcTransactionReactor

The AcRxEvent
The AcRxDynamicLinker ObjectDBX
2008 Autodesk

An AcRxEventReactor
An AcRxDLinkerReactor

AutoCAD
The AcDbSummaryInfoManager

Observers (reactors)
An AcDbSummaryInfoReactor

The AcGsManager
The AcApProfileManager

An AcGsReactor
An AcApProfileManagerReactor An AcEdInputPointFilter

Subjects

The AcEdInputPointManager

An AcEdInputPointMonitor
An AcEdInputContextReactor

The AcApLongTransactionManager The AcApDocumentManager The AcEditor AutoCAD

An AcApLongTransactionReactor An AcApDocManagerReactor An AcEditorReactor

2008 Autodesk

Acting as an Observer
Derive a concrete observer class

Override notification functions

Instantiate it Attach it to subject Remove it when done

At least when application is unloaded

2008 Autodesk

Acting as a Subject
Define your own observer (notification) interface Provide methods to attach/detach observers Send notifications when state changes

If your observer (reactor) is database resident then open it for kForNotify

2008 Autodesk

Lab - Step 7
Observing various subjects

2008 Autodesk

Thank you!

2008 Autodesk

You might also like