ObjectARX, AutoCAD. Среда программирования библиотеки C++

         

Открытие и Закрытие Объектов Базы данных


Каждый объект AcDbObject может быть упомянут тремя различными способами:

  • его маркером{*дескриптором*}
  • его объектом ID
  • указателем образца C++
  • Когда AutoCAD не выполняется, рисунок сохранен в файловой системе.

    Объекты, содержащиеся в DWG файле идентифицированы их маркерами{*дескрипторами*}.

    После того, как рисунок открыт, информация рисунка доступна через объект AcDbDatabase. Каждый объект в базе данных имеет объект ID, который сохраняется в течение текущего сеанса редактирования, от создания до стирания AcDbDatabase, в котором объект постоянно находится. Открытые функции берут объект ID как параметр и возвращают указатель на объект AcDbObject. Этот указатель правилен, пока объект не закрыт, как показано в следующем рисунке.

    Вы можете открывать объект, используя acdbOpenObject ():

    Acad::ErrorStatus

    AcDbDatabase::acdbOpenObject(AcDbObject*& obj,

    AcDbObjectId id,

    AcDb::OpenMode mode,

    Adesk::Boolean

    openErasedObject =

    Adesk::kFalse);



    Вы можете отображать маркер(дескриптор) к объекту ID, используя эту функцию:

    Acad::ErrorStatus

    getAcDbObjectId(AcDbObjectId& retId,

    Adesk::Boolean createIfNotFound,

    const AcDbHandle& objHandle,

    Adesk::UInt32 xRefId=0);

    Вы можете также открывать объект и затем запрашивать его маркер(дескриптор):

    AcDbObject* pObject;

    AcDbHandle handle;

    pObject->getAcDbHandle(handle);

    ОБРАТИТЕ ВНИМАНИЕ Всякий раз, когда объект базы данных открыт, это должно быть закрыто в самой ранней возможной возможности. Вы можете использовать AcDbObject:: близко () функция, чтобы закрыть объект базы данных.

    Ads_name эквивалентен

    AcDbObjectId. AcDb библиотека обеспечивает две автономных функции, которые позволяют Вам транслировать между AcDbObjectId и ads_name:

    // Returns an ads_name for a given object ID.

    //

    acdbGetAdsName(ads_name& objName,

    AcDbObjectId objId);

    // Returns an object ID for a given ads_name.

    //

    acdbGetObjectId(AcDbObjectId& objId,


    ads_name objName);

    Вообще, Вы получаете объект через выбор, и это возвращено в форме ads_name. Вы тогда должны обменять ads_name на AcDbObjectId и открывать это. Следующая функция демонстрирует этот процесс:

    AcDbEntity*

    selectEntity(AcDbObjectId& eId, AcDb::OpenMode openMode)

    {

    ads_name en;

    ads_point pt;

    acedEntSel("\nSelect an entity: ", en, pt);

    // Exchange the ads_name for an object ID.

    //

    acdbGetObjectId(eId, en);

    AcDbEntity * pEnt;

    acdbOpenObject(pEnt, eId, openMode);

    return pEnt;

    }

    Вы можете открывать объект в одном из трех режимов:

  • kForRead. Объект может быть открыт для читаемого до 256 устройств считывания, пока объект не уже открытый для записи, или для уведомляют.


  • kForWrite. Объект может быть открыт для записи, если это не уже открыто. Иначе, открытые сбои.


  • kForNotify. Объект может быть открыт для уведомления, когда объект закрыт, открытым для чтения, или открытый для записи, но не, когда это уже открыто для, уведомляют. См. главу 15, “Уведомление”. Приложения будут редко должны открыться,  объект для уведомляет и посылает этому уведомление.


  • Следующая таблица показывает возвращенным кодам ошибки, когда Вы пытаетесь открывать объект в различных режимах, и объект уже открытый.

     

    Открытие объектов в различных режимах

    Object already opened for:

    kForRead

    kForWrite

    kForNotify

    openedForRead

    eAtMaxReaders

    (if readCount = 256;

    otherwise succeeds)

    eWasOpenForRead

    (Succeeds)

    openedForWrite

    eWasOpenForWrite

    eWasOpenForWrite

    (Succeeds)

    openedForNotify

    eWasOpenForNotify

    eWasOpenForNotify

    eWasOpenForNotify

    wasNotifying

    (Succeeds)

    eWasNotifying

    eWasNotifying

    Undo

    eWasOpenForUndo

    eWasOpenForUndo

    (Succeeds)

    Если Вы пробуете открывать объект для записи, и Вы получаете ошибку eWasOpenForRead, Вы можете использовать upgradeOpen () чтобы модернизировать открытого состояния, чтобы записать, если имеется только одно устройство считывания объекта. Тогда Вы использовали бы downgradeOpen () чтобы понизить его состояние, чтобы читать. Точно так же, если ваш объект открытый для, уведомляют — например, когда Вы получаете уведомление —, и Вы хотите открыть это для записи, Вы можете использовать upgradeFromNotify () чтобы модернизировать его открытого состояния, чтобы записать. Тогда Вы использовали бы downgradeToNotify () чтобы понизить его состояние, чтобы уведомить.

    Для получения дополнительной информации относительно того, как управлять комплексными последовательностями открытия и закрытия объектов, см. “ Менеджер Транзакции ” на странице 451.


    Содержание раздела