ObjectARX API
ObjectARX API
Worldwide Workgroup
Over 25 Specialists World Wide
Virtually 24 hour support, 5 days a week
Americas Team
CA, WA, São Paulo
European Team
Switzerland, United Kingdom, France, Czech Republic, Russia
APac Team
China, Japan, India
© 2012 Autodesk
Getting Support
http://www.autodesk.com/adn-devhelp
Provides access to
On-line knowledgebase
Request submission
Newsgroups
Requests are logged automatically
1-3 day turnaround
Callbacks as needed
Answers to frequently asked questions are posted in our on-
line knowledge base
© 2012 Autodesk
Course Objective
It is to understand:
The fundamentals of ObjectARX
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
© 2012 Autodesk
Class Agenda
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
© 2012 Autodesk
Class Schedule
© 2012 Autodesk
Training Material
© 2012 Autodesk
Agenda
Overview of APIs
AutoCAD: Hello.arx
ObjectDBX: Structure
ObjectDBX: Extend it!
AutoCAD: Multi-Document Environment
Notification System
© 2012 Autodesk
API Overview
© 2012 Autodesk
What is an API?
© 2012 Autodesk
API Packaging
© 2012 Autodesk
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
© 2012 Autodesk
The Plug-In Architecture
.DLL
.AR .DLL
.AR
X X
API
ObjectARX
APIs
.EXE
AutoCAD
© 2012 Autodesk
Forms of Client Code
© 2012 Autodesk
AutoCAD APIs and IDEs
© 2012 Autodesk
API Implementation II
axdb.dll
AutoCAD
© 2012 Autodesk
Old API Performance Comparison
S.0.58 production
100.00
90.00
80.00
70.00
Seconds
60.00
Machine prof ile:
50.00 CPU: Pentium 150 MHz
RAM: 64 MB
40.00
Total
30.00
Create 1000 2dPolylines
20.00
Add XData to 1000 Entities
10.00 Update 1000 Circles
0.00
COM (VB)
© 2012 Autodesk
How to Store Your Data in AutoCAD
Different Programming Techniques
400
350
Time in seconds
300
250
ObjectARX
200
.NET
150
LISP
100
50
0
Xrecord Custom Object Xdata
© 2012 Autodesk
How to Store Your Data in AutoCAD
Different Programming Techniques
140000
120000
Time in seconds
100000 ObjectARX
80000 .NET
60000 LISP
40000 VBA
VB
20000
0
Xrecord Xdata
© 2012 Autodesk
How to Store Your Data in AutoCAD
Different Programming Techniques
4000
3000 ObjectARX
2000 .NET
VBA
1000 LISP
0
Xrecord Custom
Object
© 2012 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
© 2012 Autodesk
Agenda
Overview of APIs
AutoCAD: Hello.arx
ObjectDBX: Structure
ObjectDBX: Extend it!
AutoCAD: Multi-Document Environment
Notification System
© 2012 Autodesk
AutoCAD: Hello.arx
ObjectARX
What it is
Where to get it
ObjectARX applications
Structure
Loading
Memory management
Creating commands
Command mechanism
Prompting for user input
ObjectARX Wizards
© 2012 Autodesk
What is ObjectARX?
A framework?
More than just a toolkit
Specialized objects can be plugged back into the system
Custom entities
Reactors
...
© 2012 Autodesk
What can I do with ObjectARX?
© 2012 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=1
23112
)
© 2012 Autodesk
Binary compatibility
ObjectARX 2013
AutoCAD 2013
Binary incompatible with earlier releases
ObjectARX 2012
AutoCAD 2012
ObjectARX 2011
AutoCAD 2011 and 2012
ObjectARX 2010
AutoCAD 2010, 2011 and 2012
Binary incompatible with earlier releases
© 2012 Autodesk
Development Environment
© 2012 Autodesk
ObjectARX SDK Contents
© 2012 Autodesk
Main Libraries - I
© 2012 Autodesk
Main Libraries - II
© 2012 Autodesk
Utilities
ObjectARX Wizard
ArxWizards.msi downloadable from Developer Center
http://usa.autodesk.com/adsk/servlet/index?siteID=123112&id=1911627
© 2012 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)
Migration Guide (arxmgr.chm)
Interoperability Guide (arxiop.chm)
ObjectARX Readme (readarx.chm)
© 2012 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
© 2012 Autodesk
.ARX = .DLL + 2 exported functions
acrxEntryPoint
acrxGetApiVersion
.DLL
.AR .AR
.DLL
X X
API
ObjectARX
APIs
.EXE
AutoCAD
© 2012 Autodesk
Loading ObjectARX Applications I
Demand loaded
Startup
Registry
(arxload) in acad2011.lsp
On command invocation
Registry
On request
From another application
On proxy detection
Registry
© 2012 Autodesk
Loading ObjectARX Applications II
3.
Rxapi.lib
5. 4.
CRT
AutoCAD .ARX
1. 6.
2.
Operating System
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
© 2012 Autodesk
Wrong ARX Memory Management
AutoCAD/ObjectDBX 3.
MSVCRT.DLL
2. Piece of
CRASH Memory
! .ARX 1. MSVCRTD.DLL
© 2012 Autodesk
Correct ARX Memory Management
3.
AutoCAD/ObjectDBX MSVCRT.DLL
Piece of
Memor
2. y
1.
.ARX
© 2012 Autodesk
Getting Started
© 2012 Autodesk
Command Mechanism I
.ARX
1.
AcEdCommandStack
3.
4. Callback
2 5. function
AcEdCommand
AutoCAD
1. Add command
2. Create command object
3. User types command name
4. Lookup command object
© 2012 Autodesk
Command Mechanism II
© 2012 Autodesk
Lab - Step 1
© 2012 Autodesk
Prompting for User Input
AcEd functions
String, number acquisition acedGetString(), acedGetInt()
Point, angle acquisition acedGetPoint(), acedGetAngle()
Entity selection acedEntSel()
© 2012 Autodesk
ObjectARX 2011 Wizards
Application Wizard
ObjectARX\utils\ObjARXWiz\ArxWizards.msi
COM Wrapper Wizard
Custom Object Wizard
Reactors Class Wizard
etc.
© 2012 Autodesk
Lab - Step 2
© 2012 Autodesk
Agenda
Overview of APIs
AutoCAD: Hello.arx
ObjectDBX: Structure
ObjectDBX: Extend it!
AutoCAD: Multi-Document Environment
Notification System
© 2012 Autodesk
Terminology
AutoCAD Session
Document
Current Document
ObjectARX works with this in background
Active Document
User sees this in UI
Drawing
Database
Working Database
acdbHostApplicationServices()->workingDatabase()
© 2012 Autodesk
ObjectDBX: Introduction
© 2012 Autodesk
What is ObjectDBX and RealDWG?
Set of DLLs
© 2012 Autodesk
DWG Viewers
© 2012 Autodesk
Database Framework
© 2012 Autodesk
Enabling Custom Objects w/o ACAD
© 2012 Autodesk
Plug-In Model & ObjectDBX
AutoCAD process
.ARX .DBX
Acad.exe &
other AutoCAD ObjectDBX DLLs
specific DLLs
© 2012 Autodesk
ObjectARX & ObjectDBX
ObjectDBX ObjectARX
SDK
acdb19.lib acad.lib
Acge19.lib acedapi.li
rcexelib.obj acgiapi.lib b
acui19.lib
axdb.lib adui19.lib
achapi19.lib oleaprot.li
rxapi.lib b
acismobj19.li AcTc.lib
b AcTcUI.lib
rxheap.lib …
…
RealDWG
Share
© 2012 Autodesk
d
What can I do with ObjectARX?
© 2012 Autodesk
AutoCAD Drawing Database
© 2012 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
© 2012 Autodesk
Handles, Object IDs, Pointers
ObjectDBX session
1.
2.
Object Open New
.dwg Closed AcDbObject AcDbObject
4. 3.
5.
© 2012 Autodesk
Open Modes
Read
255 simultaneous readers
Write
Open/Close model
1 writer at a time
read/write are mutually exclusive
Transaction model
multiple writers are allowed
read/write are NOT exclusive
Notify
Used internally
© 2012 Autodesk
Transactions
Two models
Open/Close
acdbOpenObject
AcDbObject::close, AcDbObject::cancel
Transaction
AcDbTransactionManager::startTransaction
AcTransaction::getObject
AcDbTransactionManager::end/abortTransaction
© 2012 Autodesk
Nesting AcTransactions
1 2 3 4
Transaction 2 obj2 obj3
obj1 obj3
obj2
AcDbDatabas
e
1. Client starts Trans1 and gets Obj1 & Obj2
2. Client starts Trans2 and gets Obj2 & Obj3
3. Client commits Trans2
Trans2 changes are committed
4a. Client commits Trans1
Trans1 changes are committed
4b. Client aborts Trans1 instead
Trans1 (and Trans2) changes are rolled back
© 2012 Autodesk
Getting an AcDbDatabase Object
Construct one
In memory
© 2012 Autodesk
AcDbDatabase Ownership Hierarchy
© 2012 Autodesk
Object Model Overview
classmap.dwg
in ObjectARX distribution
© 2012 Autodesk
Important Classes
AcRxObject
AcGiDrawable
AcDbObject
AcDbEntity
AcDbCurve
AcDbDictionary AcDbLine
AcDbSymbolTable
AcDbBlockTable
AcDbSymbolTableRecord
© 2012 Autodesk
Snoop Tools for the AutoCAD Database
© 2012 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
© 2012 Autodesk
Iterating Through Containers
© 2012 Autodesk
Iterator Pattern
Stores ‘where
Client1 Client2 we are’
iterator1 iterator1
Aggregate
© 2012 Autodesk
RTTI – Runtime Type Identification
AcDbEntity * ent;
if( ent->isKindOf( AcDbLine::desc() ) )
{
AcDbLine * line = AcDbLine::cast( ent );
// do something with line->startPoint() ...
}
© 2012 Autodesk
AcRxClass I (Overview)
Three roles:
Runtime type identification
Class factory
Protocol extension
Look for Protocol extension in developer’s guide.
© 2012 Autodesk
AcRxClass II (Cont.)
© 2012 Autodesk
AcRxClass III (Object Diagram)
Runtime class
An AcDbLine hierarchy An AcRxClass
for
AcDbCurve
Another AcDbLine
An AcRxClass
for
AcDbLine
An AsdkCircle An AcRxClass
for
AcDbCircle
A protocol
extension An AcRxClass
object for
Pseudo
.DBX/.ARX construct AsdkCircle
App or
© 2012 Autodesk
AcRxClass IV (Roles)
Class Factory
During filing we look up the class identifier in the runtime class
hierarchy
AcRxClass provides a ‘constructor’ function
Protocol Extension
AcRxClasses hold a list of ‘extension objects’
© 2012 Autodesk
Storing Data in the Database
© 2012 Autodesk
Lab - Step 3
© 2012 Autodesk
AcDbDatabase Ownership Hierarchy
© 2012 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
© 2012 Autodesk
Inter-Object References
AcDbDatabase
AcDbDictionary
AcDbBlockTable AcDbLayerTable
Named Object Dict.
AcDbDictionary
AcDbBlockTableRecord AcDbLayerTableRecord
Company Dictionary *
AcDbLine AcDbObject'
AcDbHardOwnershipId AcDbHardPointerId
AcDbSoftOwnershipId AcDbSoftPointerId
© 2012 Autodesk
Inter-Object References
© 2012 Autodesk
Inter-Object References
© 2012 Autodesk
Soft/Hard References
Save
Follows both types of ownership links
Wblock
Follows hard owner and hard pointer references.
DeepClone
COPY, MIRROR, EXPLODE commands
Follows only ownership links
Purge
Soft references do not protect the object from purge
© 2012 Autodesk
Changing an Object’s 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 New
AcDbObject AcDbObject
© 2012 Autodesk
Changing an Object’s Identity II
AcDbObject::swapIdWith
Changes the object denoted by the object ID
id id
AcDbObject AcDbObject
ObjectDBX
Session
© 2012 Autodesk
Lab - Step 4
© 2012 Autodesk
Agenda
Overview of APIs
AutoCAD: Hello.arx
ObjectDBX: Structure
ObjectDBX: Extend it!
AutoCAD: Multi-Document Environment
Notification System
© 2012 Autodesk
ObjectDBX: Extend It!
© 2012 Autodesk
Create a New Class
Derive from
AcRxObject RTTI protocol
AcGiDrawable + Graphics protocol
AcDbObject + Filing protocol
AcDbEntity Persistent graphics
AcDbCurve Curve entities
…
© 2012 Autodesk
Filing
Read/write object state to another object (filer)
Visitor Pattern
© 2012 Autodesk
Filing Out
An AcDbDwgFiler 3.
An AcDbObject
1.
2. 3.
Another
AcDbObject
ObjectDBX
2.
© 2012 Autodesk
Filing In
An AcDbDwgFiler 4.
An AcDbObject
2.
1.
4.
2.
Another
3.
AcDbObject
ObjectDBX
3.
© 2012 Autodesk
Filing Member Functions - I
© 2012 Autodesk
Filing Member Functions - II
© 2012 Autodesk
Filing Member Functions - III
© 2012 Autodesk
AcDbDxfFiler
© 2012 Autodesk
Check You Have Access Rights
assertWriteEnabled
Every member function that modifies data
assertNotifyEnabled
Used internally
© 2012 Autodesk
Proxy
Class ID
Class ID
© 2012 Autodesk
Lab - Step 5
© 2012 Autodesk
Graphics Display
© 2012 Autodesk
AcGi Class Diagram
AcGiContext
AcGiCommonDraw
AcGiSubentityTraits
AcGiGeometry
AcGiWorldDraw AcGiWorldGeometry
AcGiViewportDraw AcGiViewportGeometry
AcGiViewport
Legend:
Inheritance
Containment
© 2012 Autodesk
Graphics Acquisition
4.
An AcGiWorldDraw An AcGiDrawable
6.
1.
3.
5.
Host Application An AcGiViewportDraw
2.
co g
r re on
ct wr
© 2012 Autodesk
AcGiSubEntityTraits
© 2012 Autodesk
Host-Defined Mechanisms
© 2012 Autodesk
AcDbEntity Protocol
© 2012 Autodesk
AcDbEntity Protocol
subIntersectWith - no default
subGetGeomExtents - no default
subList - print specified data, DXF name,
layer, space, and handle by
default
subExplode - 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)
© 2012 Autodesk
Lab - Step 6
© 2012 Autodesk
Agenda
Overview of APIs
AutoCAD: Hello.arx
ObjectDBX: Structure
ObjectDBX: Extend it!
AutoCAD: Multi-Document Environment
Notification System
© 2012 Autodesk
AutoCAD: Multi-Document Environment (MDE)
Execution context
Document locking
© 2012 Autodesk
Documents
© 2012 Autodesk
Per-Document Data
© 2012 Autodesk
Execution Contexts
© 2012 Autodesk
Fiber scheduling in AutoCAD
Doc2
App Fiber Doc1 Fiber
Fiber
Msg loop
Cmd started
in Doc1
Time
Doc1 prompts for
user input
Msg loop
User switches
to Doc2, starts
cmd
Cmd completes
in Doc2
Msg loop
© 2012 Autodesk
Document Locking
Document-level transaction
Non-database resident data cannot rely on the ObjectDBX
transaction model
e.g. system variables
© 2012 Autodesk
Lock Types
Write
XWrite
AutoWrite
© 2012 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
© 2012 Autodesk
Current vs. Active Documents
Current…
for the user = ‘Active’
for the API = ‘Current’
© 2012 Autodesk
Agenda
Overview of APIs
AutoCAD: Hello.arx
ObjectDBX: Structure
ObjectDBX: Extend it!
AutoCAD: Multi-Document Environment
Notification System
© 2012 Autodesk
Notification System
© 2012 Autodesk
Notification
Observer pattern class diagram
Observer
Subject observers
Attach(Observer)
Detach(Observer Update()
)
For all o in observers { SendNotification(
o->Update() )
}
ConcreteSubje ConcreteObserver
ct Update
()
subjectState observerState
© 2012 Autodesk
Notification
3.
A ConcreteSubject 4. A ConcreteObserver
2. 1.
Client
3.
An AcDbLine 4.
Your custom object
2. 1.
Client
© 2012 Autodesk
ObjectDBX
Observers (reactors)
An AcDbDatabase
An AcDbObject An AcDbObjectReactor
Subjects
© 2012 Autodesk
AutoCAD
Observers (reactors)
An AcEdInputPointFilter
The AcEdInputPointManager An AcEdInputPointMonitor
An AcEdInputContextReactor
© 2012 Autodesk
Acting as an Observer
© 2012 Autodesk
Acting as a Subject
© 2012 Autodesk
Lab - Step 7
© 2012 Autodesk
AutoCAD.NET Resources
© 2012 Autodesk
Thank you!
© 2012 Autodesk