Эти простые показы примера, как проверять объекты от другой базы данных, измените их в текущей базе данных, и затем проверьте{*отметьте*} их назад в к первоначальной базе данных. Запросы, которые являются частью длинного операционного процесса, обозначены в полужирной печати.
void
refEditApiExample()
{
AcDbObjectId transId;
AcDbDatabase* pDb;
char *fname;
struct resbuf *rb;
// Get a dwg file from the user.
//
rb = acutNewRb(RTSTR);
acedGetFileD("Pick a drawing", NULL, "dwg", 0, rb);
fname = (char*)acad_malloc(strlen(rb->resval. rstring) + 1);
strcpy(fname, rb->resval. rstring);
acutRelRb(rb);
// Open the dwg file.
//
pDb = new AcDbDatabase(Adesk::kFalse);
pDb->readDwgFile(fname);
// Get the block table and then the model space record.
//
AcDbBlockTable *pBlockTable;
pDb->getSymbolTable(pBlockTable, AcDb::kForRead);
AcDbBlockTableRecord *pOtherMsBtr;
pBlockTable->getAt(ACDB_MODEL_SPACE, pOtherMsBtr,
AcDb::kForRead);
pBlockTable->close();
// Create an iterator
//
AcDbBlockTableRecordIterator *pIter;
pOtherMsBtr->newIterator(pIter);
// Set up an object ID array.
//
AcDbObjectIdArray objIdArray;
// Iterate over the model space BTR. Look specifically
// for Lines and append their object ID to the array.
//
for (pIter->start(); !pIter->done(); pIter->step()) {
AcDbEntity *pEntity;
pIter->getEntity(pEntity, AcDb::kForRead);
// Look for only AcDbLine objects and add them to the
// objectId array.
//
if (pEntity->isKindOf(AcDbLine::desc())) {
objIdArray. append(pEntity->objectId());
}
pEntity->close();
}
delete pIter;
pOtherMsBtr->close();
// Now get the current database and the object ID for the
// current database’s model space BTR.
//
AcDbBlockTable *pThisBlockTable;
acdbHostApplicationServices()->workingDatabase()
->getSymbolTable(pThisBlockTable, AcDb::kForRead);
AcDbBlockTableRecord *pThisMsBtr;
pThisBlockTable->getAt(ACDB_MODEL_SPACE, pThisMsBtr,
AcDb::kForWrite);
pThisBlockTable->close();
AcDbObjectId id = pThisMsBtr->objectId();
pThisMsBtr->close();
// Create the long transaction. This will check all the entities
// out of the external database.
acapLongTransactionManagerPtr()->checkOut(transId,
objIdArray, id);
// Now modify the color of these entities.
//
int colorIndex;
acedGetInt("\nEnter color number to change entities to: ",
&colorIndex);
AcDbObject* pObj;
if (acdbOpenObject(pObj, transId, AcDb::kForRead) == Acad::eOk)
{
// Get a pointer to the transaction
//
AcDbLongTransaction* pLongTrans =
AcDbLongTransaction::cast(pObj);
if (pLongTrans!= NULL) {
// Get a work set iterator
//
AcDbLongTransWorkSetIterator* pWorkSetIter =
pLongTrans->newWorkSetIterator();
// Iterate over the entities in the work set
// and change the color.
for (pWorkSetIter->start(); !pWorkSetIter->done(); pWorkSetIter->step()) {
AcDbEntity *pEntity;
acdbOpenAcDbEntity(pEntity, pWorkSetIter->objectId(),
AcDb::kForWrite);
pEntity->setColorIndex(colorIndex);
pEntity->close();
}
delete pWorkSetIter;
}
pObj->close();
}
// Pause just to see the change.
//
char str[132];
acedGetString(0, "\nNote the new colors. Press return to \
check the objects back in to the original database", str);
// Check the entities back in to the orginal database.
//
acapLongTransactionManagerPtr()->checkIn(transId);
// Save the original database, since we made changes
//
pDb->saveAs(fname);
// Close and Delete the database.
//
delete pDb;
pDb = NULL;
acad_free(fname);
}
Внешние ссылки
Внешние ссылки (таблицы перекрестных ссылок) могут быть созданы и управляться через несколько глобальных функций. Эти глобальные функции подражают возможностям команды XREF AutoCAD. Функции, обеспеченные
- acedXrefAttach () acedXrefOverlay () acedXrefUnload () acedXrefDetach () acedXrefReload () acedXrefBind () acedXrefXBind () acedXrefCreateBlockname () acedXrefReload ()
Для информации относительно команды XREF AutoCAD, см. Руководство программиста AutoCAD.
Главное, программирующее соображение{*рассмотрение*} относительно таблиц перекрестных ссылок - то, что, для каждой таблицы перекрестных ссылок, который приложен к рисунку, отдельная база данных создана, чтобы представить рисунок, содержащий таблицу перекрестных ссылок. Блочный отчет{*запись*} таблицы в основном рисунок содержит название{*имя*} внешнего рисунка и указывать на объекты образцового пространства{*пробела*} внешне упомянутого рисунка. База данных таблицы перекрестных ссылок также содержит другие блочные отчеты{*записи*} таблицы и входы таблицы идентификаторов, требуемые, чтобы решить все ссылки{*справочники*} от основного блочного отчета{*записи*} таблицы (уровни, linetypes, и так далее).
Вы можете создавать редактора реактор, как описано в главе 15, “Уведомлении”, контролировать события таблицы перекрестных ссылок. AcEditorReactor класс обеспечивает следующие реакторные функции повторного вызова:
- beginAttach () otherAttach () abortAttach () endAttach () redirected () comandeered ()
При использовании этих функций, будьте внимательным, чтобы обратить внимание, которая база данных возвращается. Также, знайте, что рисунок таблицы перекрестных ссылок может самостоятельно содержать таблицы перекрестных ссылок к дополнительным рисункам. Для получения дополнительной информации на AcEditorReactor классе, см. ObjectARX Ссылку{*справочники*}.
Объекты Таблицы перекрестных ссылок в рисунке могут изменяться, но они не могут быть сохранены к первоначальному рисунку таблицы перекрестных ссылок (рисунок оригинала только для чтения).
Внешняя ссылка Пред - и Последующая обработка
Внешняя ссылка (таблица перекрестных ссылок) пред - и последующая обработка делает возможным восстановить приложенную таблицу перекрестных ссылок в оперативной памяти AcDbDatabase так, чтобы это могло быть сохранено назад к файлу. В течение решения таблицы перекрестных ссылок, много отчетов{*записей*} таблицы идентификаторов искарежены, и некоторые стерты. Исторически, это было сделано, чтобы упростить процесс решения, и было приемлемо, потому что базы данных были только для чтения. Эта обработка делает возможным временно полностью изменить изменения{*замены*} решения так, чтобы база данных таблицы перекрестных ссылок могла изменяться и написан назад к ее файлу.
Функции, которые помогают в пред - и последующая обработка, добавлены к AcDbDatabase. Они включают сервисную функцию, чтобы найти связанный блочный отчет{*запись*} таблицы от базы данных таблицы перекрестных ссылок, также как способности восстановить решенную таблицу перекрестных ссылок, и сбрасывать это назад к надлежащему решенному условию{*состоянию*} после восстановления.
Общепринятое использование для этих функций было бы должно делать восстановление к первоначальным символам, делать модификации к базе данных, сохранять{*экономить*} базу данных, и затем восстанавливать отправленные{*ускоренные*} символы. Эти шаги должны быть написаны в одиночный блок кода, предотвращать попытки восстановить рисунок главного компьютера, выполнять любые команды таблицы перекрестных ссылок, или обеспечивать подсказки пользователя, в то время как база данных таблицы перекрестных ссылок находится в ее восстановленном условии{*состоянии*}.
Функции
- AcDbDatabase:: xrefBlockId () AcDbDatabase::restoreOriginalXrefSymbols() AcDbDatabase::restoreForwardingXrefSymbols()
AcDbDatabase:: xrefBlockId () Функция
XrefBlockId () функция получит AcDbObjectId блочного отчета{*записи*} таблицы, который обращается{*относится*} к этой базе данных как таблица перекрестных ссылок. Когда таблица перекрестных ссылок перезагружена по любой причине (например, Перезагрузке ТАБЛИЦЫ ПЕРЕКРЕСТНЫХ ССЫЛОК или командам Пути ТАБЛИЦЫ ПЕРЕКРЕСТНЫХ ССЫЛОК), прежняя база данных сохраняется в памяти для Отмены. Это означает, что больше чем одна база данных могут указывать на тот же самый отчет{*запись*} таблицы блока таблицы перекрестных ссылок. Однако только каждый будет в настоящее время активная база данных таблицы перекрестных ссылок для того отчета{*записи*}. Указатель базы данных, возвращенный AcDbBlockTableRecord:: xrefDatabase () функция на найденном отчете{*записи*} будет активная база данных для той таблицы перекрестных ссылок.
AcDbDatabase:: restoreOriginalXrefSymbols () Функция
RestoreOriginalXrefSymbols () функция восстанавливает решенную базу данных таблицы перекрестных ссылок к ее первоначальной форме, поскольку это было бы если только что загружено от ее файла. Таблица перекрестных ссылок - тогда в условии{*состоянии*}, где это может изменяться и сохранен назад к файлу. После запроса этой функции, рисунок главного компьютера - больше не в правильном{*допустимом*} государстве{*состоянии*} для перегенерального или для любых модификаций команды таблицы перекрестных ссылок или перезагрузок. Модификации базы данных, сохраните{*экономьте*} назад, и restoreForwardingXrefSymbols () функция должна назваться прежде, чем что - нибудь, что могло бы позволять перегенеральный.
AcDbDatabase::restoreForwardingXrefSymbols () Функция
RestoreForwardingXrefSymbols () функция восстанавливает таблицу перекрестных ссылок назад к правильному{*допустимому*}, приложенное государство{*состояние*}. Мало того, что это восстанавливает оригинал решенные символы, но и это также разыскивает недавно добавленные символы и решает их также. RestoreForwardingXrefSymbols () функция не может обрабатывать недавно добавленный, вложенные отчеты{*записи*} таблицы блока таблицы перекрестных ссылок, если они уже не существуют и решены в ведущем рисунке.
|
Из за большого объема этот материал размещен на нескольких страницах:
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 |


