summary about object arx
DESCRIPTION
This document introduce s summary about creating plug-in to AutoCADTRANSCRIPT
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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.
Chc nng:
Thit k cc bn v hai chiu
Thit k cc bn v 3D
c im ni bt:
Chnh xc
Nng sut cao
Trao i d liu vi phn mm khc
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
Phn loi cc ngn ng lp trnh
API pht trin AutoCAD
thng dch (interpreted)
bin dch (compiled)
AutoLISP, VBA v VisualLISP
ADS, ADS/ARX v ObjectARX
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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 .....
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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++
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.
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 ...
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
Ci t ObjectARX
1.AutoCAD
2.ObjectARX SDK
http://www.autodesk.com/objectarx
http://www.objectarx.com
3.Microsoft Visual C++ .NET
4.ObjectARX Wizard
S dng ArxWizards.msi "\utils\ObjARXWiz\"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)
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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 ...
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
Cu trc mt chng trnh ObjectARX
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.
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
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
Bc 3: Do ObjectArx thc cht l mt DLL nn y ta chn DLL
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
Bc 4: Ci t bin dch
+ Click vo tn Project chn Properties
+ Chn General >Addtional Include Directoris thay i nh hnh
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
+ Chn Code General >Runtime Library thay i nh hnh
+ Chn Linker > input>Addtional Dependencies
"rxapi.lib acdb17.lib acge17.lib acad.lib acedapi.lib"
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
+ Chuyn dch t *.dll sang *.arx sau load vo Autocad
Bc 5: Thm m vo chng trnh
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
//Thm cc file Header
#include "stdafx.h"
#include
#include//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 AutoCadvoid 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!"));
}
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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;
}
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
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
ObjectARX Wizard
Installing ObjectARX Wizard
\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"
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
ng k mt lnh d dng hn rt nhiu.Click vo a> ngay gc trn tri
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
Click OK.ObjectARX s thm nhng m cn thit trong file acrxEntryPoint.cpp thc thi.V ta vo y thm m .
// ----- 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 d y ta thm 2 lnh l myInput v mySelect th n t sinh on m sau:
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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 :
Entity (thc th) : cc i tng c th hin hnh hc, nh cc i tng LINE, CIRCLE, POLYLINE
Nonentity (phi thc th) : i tng kiu ng (linetype), kiu ch (text style) hay lp (layer) ...
Cu trc c s d liu
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
Database
ModelSpace Table
PaperSpace Table
Entities
Entities
Dictionary
Objects
Dictionary
Dictionary
Layer
Table
Layer Records
Textstyle
Table
Textstyle Records
Block
Table
Block
Records
View
Table
View Records
9 Bng k hiu
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
Tc c th dng tin ch dbview.arx xem database ca bn v AutoCad
Trc khi v Line
Sau khi v Line
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
// 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();
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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) ;
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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
3. Truy cp Dictionary
Dictionary (lp AcDbDictionary) c truy cp thng qua cc iterator (lp AcDbDictionaryIterator)
BngTn lp containerTn lp IteratorBlock AcDbBlockTableAcDbBlockTableIteratorLayer AcDbLayerTableAcDbLayerTableIteratorText style AcDbTextStyleTableAcDbTextStyleTableIteratorLinetype AcDbLinetypeTableAcDbLinetypeTableIteratorView AcDbViewTableAcDbViewTableIteratorUCS AcDbUCSTableAcDbUCSTableIteratorViewport AcDbViewportTableAcDbViewportTableIteratorRegistered applications AcDbRegAppTableAcDbRegAppTableIteratorDimension stylesAcDbDimStyleTableAcDbDimStyleTableIteratorObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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();
}
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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.
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
2.M v ng i tng
Acad::ErrorStatus
AcDbDatabase::acdbOpenObject(AcDbObject*& pObj,
AcDbObjectId objId,
AcDb::OpenMode mode,
Adesk::Boolean
openErasedObject = Adesk::kFalse)
2.1.M
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
2.1.ng i tng
ng i tng , s dng phng thc close()
pObj->close();
Mt i tng m ti a l 256 ln c, ti a l mt ln ghi
EXLine
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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));
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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//Kiu t nh ngha
{
double Area;
int Population;
};
void CmdT4()
{
double d;
char c;
int i;
BigWorld world;
ads_printf("\nType : %s", typeid(i).name());
ads_printf("\nType : %s", typeid(d*10/i).name());
ads_printf("\nType : %s", typeid(c).name());
ads_printf("\nType : %s", typeid(world).name());
}
Type : int
Type : double
Type : char
Type : class BigWorld
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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;
};
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
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
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
3.Cc im bt dnh trn i tng
4.Ma trn chuyn (Transformation Matrix)
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
AutoCad s dng php bin i affine trong php bin i hnh hc i tng
ObjectARX
*
-
*
ObjectARX
*
V Vn Thin
C in t 1_K50
Thanks for attention
ObjectARX
*