You are on page 1of 38

ObjectARX

July 22, 2015

Tng Quan v AutoCad

Phn mm Cad u tin l Sketchpad xut hin vo nm 1962 c vit bi


Ivan Sutherland thuc trng k thut Massachsetts.
Thit k cc bn v hai chiu

Chc nng:
Thit k cc bn v 3D
Chnh xc

c im ni bt:

Nng sut cao


Trao i d liu vi phn mm khc

V Vn Thin

C in t 1_K50

ObjectARX

July 22, 2015

Cc ngn ng pht trin


trn AutoCad

AutoLISP : (LISt Processing :ngn ng x l danh sch) Lp trnh vin c th m rng tnh nng ca
AutoCAD bng cch vit cc lnh ca chnh h
ADS (AutoCAD Development System) : t AutoCAD R 10, do AutoLISP khng p ng c tc cao.
Mt chng trnh ADS thc cht l mt file kh thi (executable) cha cc hm nh ngha theo mt
quy tc nht nh c th gi t trong AutoCAD.
ADSRX (RX : Runtime Extension) : t AutoCAD R13, nhm tng kh nng giao tip vi AutoCad
Mt chng trnh ADSRX l mt th vin lin kt ng (DLL) cha cc hm c th thc hin t trong
AutoCAD

V Vn Thin

C in t 1_K50

ObjectARX

July 22, 2015

Cc ngn ng pht trin


trn AutoCad

ObjectARX : (M rng hng i tng ca th vin ARX) xut hin cng AutoCAD R14.
Thay v cung cp mt th vin cc hm nh trong ARX, gi y mt th vin cc lp i tng tng ng
vi cc i tng (object) trong bn v AutoCAD cho php thao tc d dng hn rt nhiu.
Do cc chng ng dng c th d qun l v chy n nh hn
VBA :T phin bn R14, cho php pht trin ng dng AutoCAD bng Visual Basic for Application.
Nh mt i ng rt ln cc lp trnh vin Basic cng vi hiu bit v mi trng AutoCAD
c th pht trin cc ng dng phc v thit k k thut

VisualLISP : t AutoCAD R14. Ngoi nhng ci tin v ngn ng so vi AutoLISP, VisualLISP cn cung
cp mt mi trng pht trin (IDE : Intergrated Development Environment) hon chnh,
cho php son tho , chy th , g ri v dch chng trnh LISP d dng hn

V Vn Thin

C in t 1_K50

ObjectARX

July 22, 2015

Phn loi cc ngn ng lp


trnh
API pht trin AutoCAD
thng dch (interpreted)
AutoLISP, VBA v VisualLISP

V Vn Thin

bin dch (compiled)


ADS, ADS/ARX v ObjectARX

C in t 1_K50

ObjectARX

July 22, 2015

ObjectARX l g ?
ObjectARX l mt th vin lp trnh ng dng hng i tng cho
mi trng AutoCAD
Phc v cc hu ht cc nhu cu cn thit pht trin AutoCAD :
Truy cp ti c s d liu bn v
Tng tc vi AutoCad Editor
To giao din ngi dng s dng
MFC
nh ngha i tng mi (Custom
Objects)
Tng tc mi trng lp trnh
khc .....

V Vn Thin

C in t 1_K50

ObjectARX

July 22, 2015

Yu cu khi lp trnh
ObjectARX
Chng trnh AutoCad: Thao tc to ra bn v,hiu cu trc d liu bn v...
K thut lp trnh hng i tng v mi trng Visual C++
Lp trnh vin phi nm vng cc khi nim quan trng ca lp trnh hng
i tng nh k tha (inheritance) , ng gi d liu (data encapsulation) ,
a hnh (polymorphism), hm o(virtual function) ...
ng thi phi nm c cc thc to v thay i thit lp cc project trong
mi trng Visual C++ , cc thao tc son tho , bin dch, g ri cc chng
trnh ...
K thut lp trnh ng dng trn Microsoft Windows vi
MFC(Microsoft Foundation Class) bi chng trnh ARX thc cht l
mt th vin lin kt ng (DLL) trong cc h iu hnh Windows 32-bit.

V Vn Thin

C in t 1_K50

ObjectARX

July 22, 2015

Ci t ObjectARX
1.AutoCAD
2.ObjectARX SDK
http://www.autodesk.com/objectarx
http://www.objectarx.com
3.Microsoft Visual C++ .NET
AutoCAD 2000,2000i and 2002 (plus verticals): ObjectARX 2000 and
Microsoft Visual C++ 6.0
AutoCAD 2004, 2005 and 2006 (plus verticals): ObjectARX 2004 and
Microsoft Visual C.NET 2002 (7.0)
AutoCAD 2007, 2008 and 2009 (plus verticals): ObjectARX 2007 and
Microsoft Visual C.NET 2005 (8.0)
4.ObjectARX Wizard
S dng ArxWizards.msi "<ObjectARX SDK folder>\utils\ObjARXWiz\"

V Vn Thin

C in t 1_K50

ObjectARX

July 22, 2015

Cu trc th vin ObjectARX


Th vin ObjectARX gm nhiu th vin con khc nhau tu theo yu cu lp trnh :
AcDb Cc lp cung cp cc thao tc truy cp c s d liu bn v AutoCAD
AcGi Th vin cc lp i tng dng th hin i tng do ngi s dng nh
ngha (custom object)
AcGe Cc lp tin ch hnh hc v i s : im, vc t , ma trn , biu din ng
cong, mt cong ...
AcRx Phc v ng k cc lp i tng mi, nh kiu khi chy chng trnh ...
AcEd Dng khi ng k cc lnh, x l cc message ca AutoCAD , x l transaction
ADS Thu vin cc hm C dng trong cc thao tc lin quan n select i tng, nhp
s liu ...

V Vn Thin

C in t 1_K50

ObjectARX

July 22, 2015

Cu trc mt chng trnh


ObjectARX
Mt chng trnh ObjectARX thc cht l mt th vin lin k ng trong c
cha mt im nhp (entry point) tun theo nhng quy tc nht nh cho php
AutoCAD tng tc vi chng trnh
Entry point ny ng vai tr nh hm main() trong mt chng trnh C/C++ hay
mt Message Loop trong mt chng trnh ng dng Windows
Tng tc gia AutoCAD v ng dng ARX c thc hin thng qua cc
message v entry point l ni x l cc message ny.

V Vn Thin

C in t 1_K50

ObjectARX

V Vn Thin

July 22, 2015

10

C in t 1_K50

ObjectARX

July 22, 2015

To mt Project ObjectARX mi
Bc 1:Khi ng VS 2005 v to mt project mi nh hnh v

Bc 2: Chn ng dng cn to l W32 Project

V Vn Thin

11

C in t 1_K50

ObjectARX

July 22, 2015

Bc 3: Do ObjectArx thc cht l mt DLL nn y ta chn DLL

V Vn Thin

12

C in t 1_K50

ObjectARX

July 22, 2015

Bc 4: Ci t bin dch
+ Click vo tn Project chn Properties

+ Chn General >Addtional Include Directoris thay i nh hnh

V Vn Thin

13

C in t 1_K50

ObjectARX

July 22, 2015

+ Chn Code General >Runtime Library thay i nh hnh

+ Chn Linker > input>Addtional Dependencies


"rxapi.lib acdb17.lib acge17.lib acad.lib acedapi.lib"

V Vn Thin

14

C in t 1_K50

ObjectARX

July 22, 2015

+ Chuyn dch t *.dll sang *.arx sau load vo Autocad

Bc 5: Thm m vo chng trnh

V Vn Thin

15

C in t 1_K50

ObjectARX

July 22, 2015

//Thm cc file Header


#include "stdafx.h"
#include <aced.h>
#include <rxregsvc.h>
//ng k 2 hm
void initApp();
//S c gi khi AutoCad load ng
dng
void unloadApp(); //S c gi khi g b ng dng khi
AutoCad
void helloWorld(); //Hm ny thc hin xut hin dng ch
void initApp()
{
// ng k dng lnh trong AutoCad
acedRegCmds->addCommand(_T("HELLOWORLD_COMMANDS"),
_T("Hello"),
_T("Bonjour"),
ACRX_CMD_TRANSPARENT,
helloWorld);
}
// G b dng lnh khi thot khi ng dng
void unloadApp()
{
acedRegCmds->removeGroup(_T("HELLOWORLD_COMMANDS"));
}
void helloWorld()
{
acutPrintf(_T("\nHello World!"));
}

V Vn Thin

16

C in t 1_K50

ObjectARX

July 22, 2015

Nh rng ObjectARX l mt ng dng DLL nn n khng c hm main() l im vo


AutoCAD gi hm acrxEntryPoint() ,module ObjectArx truyn thng ip n cc ng dng
extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
{
switch (msg)
{
case AcRx::kInitAppMsg:
acrxDynamicLinker->unlockApplication(pkt);
acrxRegisterAppMDIAware(pkt);
initApp();
//Ham khoi tao duoc goi
break;
case AcRx::kUnloadAppMsg:
unloadApp();
//Go bo ung dung
break;
default:
break;
}
return AcRx::kRetOK;
}

V Vn Thin

17

C in t 1_K50

ObjectARX

July 22, 2015

a Module vo trong AutoCad


Khi ng AutoCad
Trong Command Line g lnh ap hoc arx

Ta tm n th mc cha file module Objectarx(arx hoc dbx)


ri click vo load

V Vn Thin

18

C in t 1_K50

ObjectARX

July 22, 2015

ObjectARX Wizard
Installing ObjectARX Wizard
<ObjectARX SDK folder>\utils\ObjARXWiz\ArxWizards.msi

Creating an ObjectARX Project using Application Wizard


Trong hp thoi thm Project mi caVC++ .NET IDE ti nt "Visual C++" v
chn "ObjectARX". Click vo the template "ObjectARX/DBX/OMF Project"

V Vn Thin

19

C in t 1_K50

ObjectARX

July 22, 2015

ng k mt lnh d dng hn rt nhiu.Click vo a> ngay gc trn tri

V Vn Thin

20

C in t 1_K50

ObjectARX

July 22, 2015

Click OK.ObjectARX s thm nhng m cn thit trong file


acrxEntryPoint.cpp thc thi.V ta vo y thm m .
V d y ta thm 2 lnh l myInput v mySelect th n t
sinh on m sau:
// ----- AsdkStep02._myInput command (do not rename)
static void AsdkStep02_myInput(void){
// Add your code for command AsdkStep02._myInput here
acutPrinf(_T(Bat dau bng ObjectArx Wizard)) ;
}
// ----- AsdkStep02._mySelect command (do not rename)
static void AsdkStep02_mySelect(void){
// Add your code for command AsdkStep02._mySelect here
}
};
//----------------------------------------------------------------------------IMPLEMENT_ARX_ENTRYPOINT(CStep02App)
ACED_ARXCOMMAND_ENTRY_AUTO(CStep02App, AsdkStep02, _mySelect, mySelect,
ACRX_CMD_TRANSPARENT, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CStep02App, AsdkStep02, _myInput, myInput,
ACRX_CMD_TRANSPARENT, NULL)

V Vn Thin

21

C in t 1_K50

ObjectARX

July 22, 2015

C s d liu ca bn v
AutoCad

Bn v AutoCAD l mt c s d liu (CSDL) cha cc i tng to nn bn


v. Cc i tng trong bn v thuc mt trong hai loi sau :
Nonentity (phi thc th) : i tng
kiu ng (linetype), kiu ch (text
style) hay lp (layer) ...

Entity (thc th) : cc i tng c th


hin hnh hc, nh cc i tng LINE,
CIRCLE, POLYLINE
Cu trc c s d liu

V Vn Thin

22

C in t 1_K50

ObjectARX

July 22, 2015

Database

ModelSpace
Table

Entities

PaperSpace
Table

Dictionary

Entities

Objects

Dictionary

Dictionary
Layer

Textstyle

Block

View

Table

Table

Table

Table

Layer
Records

V Vn Thin

Textstyle
Records

Block

View
Records

Records

23

9 Bng k hiu

C in t 1_K50

ObjectARX

July 22, 2015

Bng cc bin trng thi (header variables) : Cc bin biu din trng thi
hin thi ca bn v nh ELEVATION, FILLMODE, LIMMIN
+ Cc bng k hiu (symbol tables): trong mt bn v lun c 9 bng k hiu
+ Cc dictionary (t in) : Trong t in gc (named object dictionary),
AutoCAD cho php cc chng trnh ng dng nh ngha cc bng k hiu
khc ngoi cc bng do AutoCAD nh ngha trc.
+Hai bng cha entity (MODEL _SPACE v PAPER _SPACE):
Bng MODEL_SPACE cha cc entity nm trong khng gian
m hnh (model space) ca bn v
Cc entity ca khng gian giy v (paper space) c cha
trong bng PAPER_SPACE

V Vn Thin

24

C in t 1_K50

ObjectARX

July 22, 2015

Tc c th dng tin ch dbview.arx xem database ca bn v AutoCad

Trc khi v Line

V Vn Thin

Sau khi v Line

25

C in t 1_K50

ObjectARX

July 22, 2015

// create two points and the line


AcGePoint3d startPt (1.0, 1.0, 0.0);
AcGePoint3d endPt (10.0, 10.0, 0.0);
AcDbLine* pLine = new AcDbLine (startPt, endPt);
// open the proper entity container
AcDbBlockTable* pBlock = NULL;
AcDbDatabase* pDB = acdbHostApplicationServices()->workingDatabase();
pDB->getSymbolTable(pBlock,AcDb::kForRead);
AcDbBlockTableRecord* pBTR = NULL;
pBlock->getAt(ACDB_MODEL_SPACE, pBTR, AcDb::kForWrite);
pBlock->close();
// now, add the entity to container
AcDbObjectId Id;
pBTR->appendAcDbEntity(Id, pLine);
pBTR->close();
pLine->close();

V Vn Thin

26

C in t 1_K50

ObjectARX

July 22, 2015

Truy cp c s d liu
1.Truy cp vo cc bin trng thi
Khi ly c con tr ti i tng c s d liu mt bn v, c th
truy cp cc bin trng thi ca bn v bng cch s dng cc
phng thc ca lp AcDbDatabase
Adesk::Boolean fillmode() const;
double elevation() const;
AcGePoint2d limmin() const;

Hay thay i gi tr
Acad::ErrorStatus setFillmode(Adesk::Boolean mode) ;
Acad::ErrorStatus setElevation(double elev) ;
Acad::ErrorStatus setLimmin(const AcGePoint2d& limmin) ;

V Vn Thin

27

C in t 1_K50

ObjectARX

July 22, 2015

2. Truy cp vo bng k hiu(Symbol Table)


Bng k hiu trong c s d liu c biu din tng ng bng cc
lp v cc b lp dng truy cp sau
Bng

Tn lp container

Tn lp Iterator

Block
Layer
Text style
Linetype
View
UCS
Viewport
Registered applications
Dimension styles

AcDbBlockTable
AcDbLayerTable
AcDbTextStyleTable
AcDbLinetypeTable
AcDbViewTable
AcDbUCSTable
AcDbViewportTable
AcDbRegAppTable
AcDbDimStyleTable

AcDbBlockTableIterator
AcDbLayerTableIterator
AcDbTextStyleTableIterator
AcDbLinetypeTableIterator
AcDbViewTableIterator
AcDbUCSTableIterator
AcDbViewportTableIterator
AcDbRegAppTableIterator
AcDbDimStyleTableIterator

3. Truy cp Dictionary
Dictionary (lp AcDbDictionary) c truy cp thng qua cc iterator (lp
AcDbDictionaryIterator)

V Vn Thin

28

C in t 1_K50

ObjectARX

July 22, 2015

void iterateLinetypes()
{
AcDbLinetypeTable *pLinetypeTbl;
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pLinetypeTbl, AcDb::kForRead);
// Create a new iterator that starts at table
// beginning and skips deleted.
//
AcDbLinetypeTableIterator *pLtIterator;
pLinetypeTbl->newIterator(pLtIterator);
// Walk the table, getting every table record and
// printing the linetype name.
//
AcDbLinetypeTableRecord *pLtTableRcd;
const TCHAR *pLtName;
for (; !pLtIterator->done(); pLtIterator->step()) {
pLtIterator->getRecord(pLtTableRcd, AcDb::kForRead);
pLtTableRcd->getName(pLtName);
pLtTableRcd->close();
acutPrintf(_T("\nLinetype name is: %s"), pLtName);
}
delete pLtIterator;
pLinetypeTbl->close();
}

V Vn Thin

29

C in t 1_K50

ObjectARX

July 22, 2015

Cc i tng c s d liu (database objects)


1.i tng v ID

Tng tc vi cc i tng th ta phi thng qua OBjectID ca chng.

V Vn Thin

30

C in t 1_K50

ObjectARX

July 22, 2015

2.M v ng i tng
2.1.M
Acad::ErrorStatus
AcDbDatabase::acdbOpenObject(AcDbObject*& pObj,
AcDbObjectId objId,
AcDb::OpenMode mode,
Adesk::Boolean
openErasedObject = Adesk::kFalse)
Mt i tng c th m mt trong cc ch
AcDb::kForRead : c, khng thay i
thuc tnh
AcDb::kForWrite : ghi, thay i thuc tnh
AcDb::kForNotify : gi message

Mt i tng m ti a l 256 ln c, ti a l mt ln ghi

2.1.ng i tng
ng i tng , s dng phng thc close()
pObj->close();

V Vn Thin

EXLine
31

C in t 1_K50

ObjectARX

July 22, 2015

3.Xa i tng
Mun xo i tng, cn phi m chng ch kForWrite v gi phng
thc erase(). Ch l sau vn phi ng i tng
pObj->erase();
pObj->close();

4. nh kiu thi gian chy (Run-Time Type Identification - RTTI)


Xc nh kiu ca mt i tng hay mt biu thc
4.1.Xc nh kiu ca mt i tng
desc() : Tr v thng tin kiu (descriptor object ) ca i tng
cast() : Ep mt con tr i tng v mt kiu con tr nht nh. Nu khng ng kiu, tr v NULL
isKindOf() : Kim tra mt i tng c thuc kiu nht nh (hay cc lp k tha t ) hay khng
AcDbEntity* pEntity;
acdbOpenAcDbEntity (pEntity, objId, AcDb::kForRead);
//M i tng kiu AcDbEntity tng qut
if (pEntity ->isKindOf(AcDbEllipse::desc()))
//Nu con tr ng l thuc kiu AcDbEllipse *
Acutprintf(_T(Day la hinh Ellipse));

V Vn Thin

32

C in t 1_K50

ObjectARX

July 22, 2015

4.2.Xc nh kiu C++ chun


Th vin C++ chun (Standard C++ Library) cung cp ton t typeid xc nh
kiu ca mt i tng hau mt biu thc (expression)
#include "typeinfo.h"
class BigWorld
{
double Area;
int Population;
};
void CmdT4()
{
double d;
char c;
int i;
BigWorld world;
ads_printf("\nType
ads_printf("\nType
ads_printf("\nType
ads_printf("\nType

//

:
:
:
:

%s",
%s",
%s",
%s",

Kiu t nh ngha

typeid(i).name());
typeid(d*10/i).name());
typeid(c).name());
typeid(world).name());

Type : int
Type : double
Type : char
Type : class
BigWorld

V Vn Thin

33

C in t 1_K50

ObjectARX

July 22, 2015

5.D liu b sung


Cc ng dng ObjectARX c th gn cc d liu ca chng vo cc i
tng ca c s d liu bn v AutoCAD bng nhiu cch khc nhau
5.1.Extended Data(Xdata)
Xdata l mt danh sch mc ni thuc kiu resbuf do cc ng dng
AutoCAD gn vo cc i tng ca bn v
union ads_u_val {
ads_real rreal;
ads_real rpoint[3];
short rint; // Must be declared short, not int.
char *rstring;
long rlname[2];
long rlong;
struct ads_binary rbinary; };
struct resbuf {
struct resbuf *rbnext; // Linked list pointer
short restype;
union ads_u_val resval;
};

V Vn Thin

34

C in t 1_K50

ObjectARX

July 22, 2015

5.1.Extension Dictionary
Mi i tng trong c s d liu c th c mt extension Dictionary
trong c th cha bt k i tng k tha t AcDbObject

V Vn Thin

35

C in t 1_K50

ObjectARX

July 22, 2015

Thc th (Entity)
1.nh ngha
L cc i tng CSDL c th hin hnh hc (graphical Object)
2.Phn loi
Cc Entity n gin l bn thn n cha y thuc tnh ca mnh
Cc Entity phc tp cn cha thm cc tham chiu n i tng khc
nh ngha dy i tng.
V d: i tng POLYLINE l mt i tng phc hp v n tham
chiu n cc i tng VERTEX nh ngha cc ta nh.
3.Cc thuc tnh chung
Color :Biu din mu sc i tng
Linetype :Kiu ng cai tng
Layer :Lp cai tng

V Vn Thin

36

C in t 1_K50

ObjectARX

July 22, 2015

3.Cc im bt dnh trn i tng


kOsModeEnd : im cui
kOsModeMid : im gia
kOsModeCen : im tm
kOsModeNode : im nt
kOsModeQuad : im gc 1/4
kOsModeIns : im chn
kOsModePerp : im ko di vung gc
kOsModeTan : im ko di tip tuyn
kOsModeNear : im gn nht
4.Ma trn chuyn (Transformation Matrix)
AutoCad s dng php bin i affine trong php bin i hnh hc i tng

V Vn Thin

37

C in t 1_K50

ObjectARX

July 22, 2015

Thanks for
attention
V Vn Thin

38

C in t 1_K50

You might also like