Vytváření objektů (entit) v AutoCADu

Přehled informací

Výkresová databáze

Výkres AutoCADu se skládá ze souboru objektů, které jsou uloženy v databázi. Databáze obsahuje:

Všechny objekty vytvořené v AutoCADu jsou automaticky přidány i do správného kantejnerového objektu. Entity jsou přidány do záznamu tabulky symbolů, záznam je poté vložen do tabulky symbolů. Ostatní objekty jsou přidány do slovníků nebo objektů, které vlastní jiné objekty.

Aby byla výkresová databáze použitelná musí obsahovat minimálně:

Podobnost při vytváření entit v AutoCADu a pomocí funkcí ObjectARX

Každý objekt vytvořený v AutoCADu (libovolným způsobem) má vlastní manipulátor (handle) a identifikátor ID. Manipulátor jednoznačně určuje objekt z pohledu jednotlivé databáze, zatím co ID jednoznačně určuje objekt ve všech databázích nahraných v jednom okamžiku v AutoCADu. ID objektu je platné pouze pro aktuální editovací seanci. Manipulátor je platný po celou dobu existence objektu ve výkresu (je uložen s výkresem). Pomocí ID objektu můžeme s objektem manipulovat. Získání ID objektu je možné několika způsoby:

V AutoCADu se entity vložené do výkresu výkresu ukládají zároveň do tzv. výkresové databáze. Grafické objekty ve výkresu leží v tzv. modelovém prostoru. Modelový prostor je ve výkresové databázi umístěn v tzv. tabulce bloků v záznamu *MODEL_SPACE.

Příklad přidání dvou čar do modelového prostoru výkresu "ručně" v AutoCADu

Čáry do modelového prostoru v AutoCADu vložíme například příkazy:

    _line 2,2 10,7
    _line 3,3 5,5

Zadání čár se projeví ve výkresové databázy přidáním dalších položek. Po zadání obou čar bude tabulka bloků obsahovat následující položky:

Standardní nastavení AutoCADu je takové, že vkládané entity jsou automaticky umístěny do modelového prostoru.

Příklad přidání dvou čar do modelového prostoru výkresu pomocí ObjectARX

  AcDbObjectId vytvorCaru()
  {
    AcGePoint3d startBod(2.0, 2.0, 0.0);
        // zadání souřadnic počátečního a koncového bodu
    AcGePoint3d endBod(10.0, 7.0, 0.0);
    AcDbLine *pCara = new AcDbLine(startBod, endbod);
        // vytvoření pointru na nový objekt typu AcDbLine

    AcDbBlockTable *pBlockTable;
        // vytvoření ukazatele na objekt AcDbBlockTable
    acdbCurDwg()->getBlockTable(pBlockTable, AcDb::kForRead);
        // otevření tabulky bloků výkresu pro čtení 
        // a předání ukazatele na ní

    AcDbBlockTableRecord *pZaznamBlockTable;
        // vytvoření ukazatele na objekt AcDbBlockTableRecord
    acdbCurDwg()->getAt(ACDB_MODEL_SPACE, 
                           pZaznamBlockTable, AcDb::kForWrite);
        // otevření záznamu tabulky bloků výkresu pro zápis
        // a předání ukazatele na ní
    pBlockTable->close(); // zavření tabulky bloků

    AcDbObjectId IDCary;
        // vytvoření proměnné pro uchování ID čáry
    pZaznamBlockTable->appendAcDbEntity(IDCary, pCara);
        // přidání entity čára do modelového prostoru

    pZaznamBlockTable->close(); // uzavření modelového prostoru
    pCara->close();    // uzavření objektu čára
    return IDCary;             // vrácení hodnoty ID čáry
  }

Druhá čára by se vytvářela analogicky.

Práce s vytvořeným objektem (entitou)

V aplikacích budeme často potřebovat editovat (pracovat s) již jednou vytvořenou entitou. Práce s objekty v AutoCADu předpokládá, že objekty jsou uloženy někde na disku. Pouze při práci s objekty jsou přesunuty do operační paměti a po skončení manipulace s nimi jsou opět uloženy na disk. Tomuto schématu odpovídá i práce s objekty pomocí funkcí ObjectARX. Schéma práce s objekty v prostředí ObjectARX:

Otevření objektu

K otevření objektu potřebujeme znát ID objektu, jinak se k němu nedostaneme. Objekt se dá otevřít pro:

Příkaz otevření má syntaxi:

  acdbOpenObject(pObject, object, způsob_otevření)

Uzavření objektu

Po skončení práce s objektem nesmíme zapomenout uzavřít objekt příkazem:

  pObject->close();

Příklad změny barvy čáry

Příklad ilustruje změnu již jednou vytvořeného objektu. Vytvářená funkce změní barvu entity na novou hodnotu.

  Acad::ErrorStatus zmenBarvu
       (AcDbOjectId idObjektu, Adesk::UInt16 novaBarva)
  {
    AcDbEntity *pEntita;
      // vytvoření ukazatele typu AcDbEntity
    acdbOpenObject(pEntita, idObjektu, AcDb::kForWrite);
      // otevření objektu idObjektu pro zápis, nastavení ukazatele
    pEntita->setColorIndex(novaBarva);
      // změna barvy na novou
    pEntita->close();     // uzavření objektu
    return Acad::eOK;     // vrácení návratové hodnoty
  }