Tvorba aplikace ObjectARX

Přehled informací

Postup tvorby aplikace v kostce

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ů:

  1. Vytvoření uživatelských tříd implementující nové příkazy.
  2. Určení, které zprávy AutoCADu bude aplikace ObjectARX zpracovávat (využívat).
  3. Implementace "vstupního bodu" do AutoCADu.
  4. Inicializace všech uživatelských tříd, které jsme vytvořili.
  5. Připravení aplikace na odstranění.

Tvorbu aplikace ObjectARX si můžeme zjednodušit pomocí ObjectARX Wizard.

Vytvoření uživatelské třídy

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.

Význam zpráv AutoCADu

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.

Zprávy zasílané všem aplikacím

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ž:

  • je otevřen výkres,
  • aplikace registruje funkci v AutoLISPu,
  • pokaždé je-li nahrán výkres v editoru.
AutoCAD je v tuto chvíli plně inicializován, všechny funkce ADSRX jsou k dispozici, přesto nelze použít funkci acedCommand()
kPreQuitMsg
Poslána, když AutoCAD končí, ale před tím než začne AutoCAD odstraňovat všechny ObjectARX aplikace.

Implementace vstupního bodu pro AutoCAD

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.

Syntaxe funkce acrxEntryPoint

  extern "C" AcRx::AppRetCode acrxEntryPoint 
     (AcRx::AppMsgCode msg, void *pkt);

Vysvětlení části kódu

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.

Příklad kostry funkce s obsluhou zpráv

  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
  }

Inicializace ObjectARX aplikace

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.

Způsob inicializace

  1. Definujeme uživatelské třídy (pomocí funkce rxInit()).
  2. Zavoláme funkci acrxBuildClassHierarchy(), aby se přestavěl strom tříd ObjectARX.
  3. Inicializujeme všechny ostatní třídy.
  4. Registrujeme jméno služby.
  5. Nakonec registrujeme příkazy ve formátu příkazů AutoCADu. AutoCADu musíme sdělit jména nových příkazů definovaných naší aplikací, aby je mohl AutoCAD používat.

Registrace nových příkazů

Syntaxe funkce pro registraci nových příkazů

  Acad::ErrorStatus AcEdCommandStack::addCommand
  (
    const char* cmdGroupName,
    const char* cmdGlobalName,
    const char* cmdLocalName,
    Adesk::Int32 commandFlags,
    AcRxFunctionPtr functionAddr
  );

Argumenty příkazu funkce pro registraci nových příkazů

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:

  • ACRX_CMD_TRANSPARENT - příkaz, který lze vyvolat při činnosti jiného příkazu,
  • ACRX_CMD_MODAL - příkaz, který nelze vyvolat při činnosti jiného příkazu,
  • ACRX_CMD_USEPICKSET
  • ACRX_CMD_REDRAW
functionAddr
adresa funkce, která se má spustit když je příkaz vyvolán v AutoCADu.

Příprava na odstranění aplikace

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.

Nutné akce při ukončení aplikace

  1. Musíme odstranit všechny příkazy vytvořené pomocí funkcí acedRegCmds() a acedDefun(). Příkazy, které byly vytvořeny pomocí funkce acedRegCmds() lze odstranit i jako celou skupinu:

    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).

  2. Odstraníme všechny uživatelské třídy. K odstranění tříd použijeme funkci:
  3. 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.

  4. Vymažte všechny reaktory přiřazené objektům:
  5. Pokud jsme v aplikaci registrovali nějakou službu, musíme ji také odstranit. K odstranění služeb, které registrovala naše aplikace, použijeme funkci:
     acrxServiceDictionary->remove()
    

Nahrání aplikace

Aplikaci ObjectARX je možné nahrát v AutoCADu několika způsoby:

Odstranění aplikace

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:

Poznámka - zakázání odstranění aplikace

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;