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

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);

}


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