38
June 10, 2022 ObjectARX 1 Vũ Văn Thiên Cơ điện tử 1_K50 Tổng Quan về AutoCad Phần mềm Cad đầu tiên là Sketchpad xuất hiện vào năm 1962 được viết bởi Ivan Sutherland thuộc trường kĩ thuật Massachsetts. Chức năng: Thiết kế các bản vẽ hai chiều Thiết kế các bản vẽ 3D Đặc điểm nổi bật: Chính xác Năng suất cao Trao đổi dữ liệu với phần mềm khác

Summary about Object ARX

Embed Size (px)

DESCRIPTION

This document introduce s summary about creating plug-in to AutoCAD

Citation preview

  • *

    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 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!"));

    }

    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 stylesAcDbDimStyleTableAcDbDimStyleTableIterator

    ObjectARX

    *

  • *

    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

    *