Открытие и Закрытие Объектов Базы данных
Каждый объект AcDbObject может быть упомянут тремя различными способами:
Когда 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;
}
Вы можете открывать объект в одном из трех режимов:
Следующая таблица показывает возвращенным кодам ошибки, когда Вы пытаетесь открывать объект в различных режимах, и объект уже открытый.
Открытие объектов в различных режимах
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) |
Для получения дополнительной информации относительно того, как управлять комплексными последовательностями открытия и закрытия объектов, см. “ Менеджер Транзакции ” на странице 451.