AcDbDatabase:: wblockCloneObjects () Функция
WblockCloneObjects () функция - элемент AcDbDatase. Это будет глубоко имитировать объекты от одной базы данных до другой и следовать за жесткими ссылками{*справочниками*} так, чтобы все зависимые объекты также имитировались. Поведение отчетов{*записей*} таблицы идентификаторов, когда дубликаты найдены, определено параметром типа. Следующая диаграмма показывает отношениям между типом таблицы идентификаторов (перечисление DuplicateRecordCloning) и глубокий тип аналога (перечисление DeepCloneType).
Отношения между DeepCloneTypes и DuplicateRecordCloning для Различные команды и функции
Command or API Function | DeepCloneType | DuplicateRecordCloning | |||
COPY | kDcCopy | kDrcNotApplicable | |||
EXPLODE | kDcExplode | kDrcNotApplicable | |||
BLOCK | kDcBlock | kDrcNotApplicable | |||
INSERT/BIND | kDcXrefInsert | kDrcIgnore | |||
XRESOLVE | kDcSymTableMerge | kDrcXrefMangleName | |||
INSERT | kDcInsert | kDrcIgnore | |||
insert() | kDcInsertCopy | kDrcIgnore | |||
WBLOCK | kDcWblock | kDrcNotApplicable | |||
deepCloneObjects() | kDcObjects | kDrcNotApplicable | |||
wblockObjects() | kDcObjects | kDrcIgnore | |||
wblockObjects() | kDcObjects | kDrcReplace | |||
wblockObjects() | kDcObjects | kDrcMangleName | |||
wblockObjects() | kDcObjects | kDrcUnmangleName |
Пример
длинной транзакции
Эти простые показы примера, как проверять объекты от другой базы данных, измените их в текущей базе данных, и затем проверьте{*отметьте*} их назад в к первоначальной базе данных. Запросы, которые являются частью длинного операционного процесса, обозначены в полужирной печати.
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);
}