Aplikace ObjectARX je dynamicky slinkovaná knihovna (DLL), která sdílí s AutoCADem adresový prostor a umožňuje přímé volání funkcí a prostředků AutoCADu. Tvorbu aplikace ObjectARX je možné rozdělit do několika kroků:
Tvorbu aplikace ObjectARX si můžeme zjednodušit pomocí ObjectARX Wizard.
Uživatelské třídy je možné odvozovat od většiny tříd ObjectARX. Odvozování tříd se řídí stejnými pravidly jako v C++. Díky odvozování tříd se zvyšuje jejich funkčnost pro danou aplikaci.
AutoCAD posílá čtyři druhy zpráv:
Další výklad uvádí pouze zprávy zasílané všem aplikacím, o dalších zprávách se dozvíte více v referenční příručce, jež je součástí SDK ObjectARX 2000.
Message
|
Description
|
kInitAppMsg
|
Poslána, když ObjectARX aplikace je nahrána, slouží k otevření komunikace mezi AutoCADem a aplikací. |
kUnloadAppMsg
|
Poslána, když je aplikace ObjectARX odstraněna (uživatelem nebo AutoCADem). Zavře soubor a spustí čistící operace. |
kLoadDwgMsg
|
Je poslána když:
|
kPreQuitMsg
|
Poslána, když AutoCAD končí, ale před tím než začne AutoCAD odstraňovat všechny ObjectARX aplikace. |
AutoCAD volá modul ObjectARX pomocí (přes) acrxEntryPoint(). Tuto funkci musí obsahovat všechny aplikace ObjectARX. Funkce acrxEntryPoint() nahrazuje funkci main(). Funkce acrxEntryPoint() slouží jako vstupní bod pro AutoCAD nebo jiné aplikace, funkce umožňuje komunikovat mezi aplikací a ObjectARX. ObjectARX komunikuje s okolním světem pomocí tzv. status kódů. Všechny požadavky pro volané funkce definované pomocí acedDefun() jsou vytvořeny pomocí acrxEntryPoint.
extern "C" AcRx::AppRetCode acrxEntryPoint (AcRx::AppMsgCode msg, void *pkt);
V těle funkce acrxEntryPaint() se nachází příkaz switch (nebo podobná rozhodovací struktura) pro odchycení (správu) zpráv poslaných z AutoCADu. Pro každou zprávu poslanou z AutoCADu by zde měl být obslužný kód nebo volání obslužného kódu. Nakonec by funkce měla vrátit návratový kód (celé číslo) informující o průběhu funkce. Když funkce proběhne vpořádku měla by vrátit hodnotu AcRx::kRetOK.
extern "C" AcRx::AppRetCode acrxEntryPoint (AcRx::AppMsgCode msg, void *pkt) { switch (msg) { case AcRx::kInitAppMsg: break; case AcRx::kUnloadAppMsg: break; .... default: break; } return AcRx:;kRetOK }
V aplikaci ObjectARX musíme inicializovat všechny uživatelské třídy a příkazy. Inicializaci je možné provést v části, která odchytává zprávu AutoCADu AcRx::kInitAppMsg.
Acad::ErrorStatus AcEdCommandStack::addCommand ( const char* cmdGroupName, const char* cmdGlobalName, const char* cmdLocalName, Adesk::Int32 commandFlags, AcRxFunctionPtr functionAddr );
Acad::ErrorStatus | |||
Návratová hodnota funkce pro přidání (registraci) příkazu do AutoCADu. | |||
cmdGroupName | |||
jméno skupiny příkazů, do které se registrovaný příkaz přidá. Pokud tato skupina neexistuje, je vytvořena před tím než je příkaz registrován. | |||
cmdGlobalName | |||
jméno příkazu, používané ve všech jazykových verzích AutoCADu (při zadání do příkazového řádku AutoCADu se uvádí s podtržítkem např. _newCommand). | |||
cmdLocalName | |||
jméno příkazu, používané vlokální jazykové verzi AutoCADu (při zadání do příkazového řádku v lokalizovaném AutoCADu se uvádí bez podtržítka např. novyPrikaz). | |||
commandFlags | |||
příznaky asociované s příkazem:
|
|||
functionAddr | |||
adresa funkce, která se má spustit když je příkaz vyvolán v AutoCADu. |
Když je naše aplikace odstraněna z AutoCADu, musíme zajistit, aby byly odstraněny i všechny uživatelské třídy nebo příkazy, které naše aplikace vytvořila. Veškeré akce související s odstraněním aplikace musíme umístit do části funkce acrxEntryPoint, která reaguje na zprávu AcRxUnloadAppMsg poslanou AutoCADem při odstranění aplikace.
Syntaxe funkce pro odstranění příkazu removeCmd():
virtual Aced::ErrorStatus AcEdCommandStack::removeCmd ( const char* cmdGroupName, const char* cmdGlobalName) = 0;Příklad syntaxe odstranění celé skupiny příkazů:
virtual Aced::ErrorStatus AcEdCommandStack::removeGroup (const char* cmdGroupName);
Argumenty funkcí jsou buď jméno skupiny (cmdGroupName), případně i jméno příkazu (cmdglobalName).
deleteAcRxClass()
funkce odstraní třídy z hierarchie AcRx hierarchického stromu tříd. POZOR třídy se musí odstraňovat od potomků směrem k rodičům.
acrxServiceDictionary->remove()
Aplikaci ObjectARX je možné nahrát v AutoCADu několika způsoby:
Aby bylo možné aplikaci odstranit z AutoCADu musí být aplikace odemčená. Pokud tomu tak je, je možné aplikaci odstranit způsoby:
AcRxDynamicLinker::unloadmodule();
Aplikaci ObjectARX je možné zakázat odtranit. Aplikace se může vyskytovat ve dvou stavech:
Standardně je aplikace nastavena jako zamčená. Aby ji bylo možné odstranit, nastavíme její stav na odemčený (unlocked):
Adesk::Boolean AcRxDynamicLinker::unlockAppication(void* pkt) const;
Potřebujeme-li zakázat aplikaci, aby se dala odstranit, uzamčeme ji pomocí funkce:
Adesk::Boolean AcRxDynamicLinker::lockAppication(void* pkt) const;