
Вы можете открывать объект, используя 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.
Удаление объекта
Когда Вы создаете образец объекта AcDbObject с намерением добавления в конец этого к базе данных, используете AcDbObject:: новый () функция. Когда объект сначала создан и еще не был добавлен к базе данных, Вы можете удалять это. Однако, как только объект был добавлен к базе данных, Вы не можете удалять это; AutoCAD управляет стиранием всех объектов резидента базы.
Монопольное использование Базы данных Объектов
Объект, который неявно принадлежит базе данных скорее чем другой объект базы данных, называется корневым объектом. База данных содержит десять корневых объектов: эти девять таблиц идентификаторов и названный объектный словарь. Все файловые операции начинаются, регистрируя из корневых объектов базы данных. См. “ Запись в файл Объекта ” на странице 95.
За исключением корневых объектов, каждый объект в базе данных должен иметь владельца, и данный объект может иметь только одного владельца. База данных - дерево, созданное этой иерархией находящихся в собственности объектов. Следующий запрос прибавляет объект к базе данных и назначает ИДЕНТИФИКАТОР на это, но объект еще не имеет владельца: db - > addAcDbObject (...); Обычно, Вы прибавите объект к его владельцу, использующему функцию элемента, которая одновременно прибавляет это к базе данных, типа AcDbBlockTableRecord:: appendAcDbEntity () функция, которая исполняет обеих задачи сразу.
Подключения{*связи*} монопольного использования AutoCAD следующие:
- блочная таблица делает запись собственных объектов. Каждая таблица идентификаторов имеет специфический тип отчета{*записи*} таблицы идентификаторов. объект AcDbDictionary может иметь любой объект AcDbObject. объект Any AcDbObject может иметь словарь расширения{*продления*}; объект имеет его словарь расширения{*продления*}.
Кроме того, приложения могут устанавливать их собственные подключения{*связи*} монопольного использования.
Добавление Объектно - определенных Данных
Вы можете использовать любой из четырех механизмов для добавления образец-определенных данных в вашем приложении:
- Расширенные{*продленные*} данные (xdata) Xrecords (см. главу 7, “ Контейнерные Объекты ”) словари Расширений{*продления*} любого объекта Объекты пользователя, которые могут держаться, данные (видят главу 12, “ Происходящий от AcDbObject ”)
Расширенные Данные
Расширенные{*продленные*} данные (xdata) созданы приложениями, написанными с ObjectARX или AutoLISP и могут быть добавлены к любому объекту. Xdata состоит из списка связей resbufs, используемого приложением. (AutoCAD обслуживает{*поддерживает*} информацию, но не использует это.) данные связаны с кодом группы DXF в диапазоне от 1000 до 1071.
Этот механизм пространствено - эффективен и может быть полезен для добавления легких данных к объекту. Однако, xdata ограничен 16КБ и существующим набором кодов группы DXF и напечатает.
Для более детального описания xdata, см. Руководство Настройки AutoCAD.
Используйте AcDbObject:: xData () функция, чтобы получить resbuf цепочку, содержащую копию xdata для объекта:
virtual resbuf*
AcDbObject::xData(const char* regappName = NULL) const;
Используйте AcDbObject:: setXData () функция, чтобы определить xdata для объекта:
virtual Acad::ErrorStatus
AcDbObject::setXData(const resbuf* xdata);
Следующий пример использует xData () функция, чтобы получить xdata для выбранного объекта и затем печатает xdata на экран. Это тогда прибавляет строку (testrun) к xdata и называет setXdata () функцией, чтобы изменить xdata объекта. Этот пример также иллюстрирует использование upgradeOpen () и downgradeOpen () функции.
// Эта функция называет selectObject () функцией, чтобы позволить
// пользователю выбирать объект; тогда это обращается к xdata объекта
// и посылает список printList () функцию, которая перечисляет значения resval и restype.
//
void
printXdata()
{
// Select and open an object.
//
AcDbObject *pObj;
if ((pObj = selectObject(AcDb::kForRead)) == NULL) {
return;
}
// Get the application name for the xdata.
//
char appname[133];
if (acedGetString(NULL,
"\nEnter the desired Xdata application name: ",
appname) != RTNORM)
{
return;
}
// Get the xdata for the application name.
//
struct resbuf *pRb;
pRb = pObj->xData(appname);
if (pRb != NULL) {
// Print the existing xdata if any is present.
// Notice that there is no -3 group, as there is in
// LISP. This is ONLY the xdata, so
// the -3 xdata-start marker isn’t needed.
//
printList(pRb);
acutRelRb(pRb);
} else {
acutPrintf("\nNo xdata for this appname");
}
pObj->close();
}
void
addXdata()
{
AcDbObject* pObj = selectObject(AcDb::kForRead);
if (!pObj) {
acutPrintf("Error selecting object\n");
return;
}
// Get the application name and string to be added to
// xdata.
//
char appName[132], resString[200];
appName[0] = resString[0] = ’\0’;
acedGetString(NULL, "Enter application name: ",
appName);
acedGetString(NULL, "Enter string to be added: ",
resString);
struct resbuf *pRb, *pTemp;
pRb = pObj->xData(appName);
if (pRb != NULL) {
// If xdata is present, then walk to the
// end of the list.
//
for (pTemp = pRb; pTemp->rbnext!= NULL; pTemp = pTemp->rbnext)
{ ; }
} else {
// If xdata is not present, register the application
// and add appName to the first resbuf in the list.
// Notice that there is no -3 group as there is in
// AutoLISP. This is ONLY the xdata so
// the -3 xdata-start marker isn’t needed.
//
acdbRegApp(appName);
pRb = acutNewRb(AcDb::kDxfRegAppName);
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |


