Может я где-нибудь здесь накосячил :
pTrans = actrTransactionManager->startTransaction(); // начинаем транзакцию
...
AcDbObjectId solId; // заполняем ее AcDb3dSolid, который подвергнется FILLET
AcDbBlockTable* pBlockTable;
AcDbBlockTableRecord* pBTR=NULL;
AcDbObjectIdArray toMove, idRefs;
if () { // solId находится в блоке
toMove.append(solId);
if (acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead) == Acad::eOk) {
if (pBlockTable->getAt(ACDB_MODEL_SPACE, pBTR, AcDb::kForWrite) == Acad::eOk) {
pBlockTable->close();
es = pBTR->assumeOwnershipOf(toMove); // вытаскиваем на поверхность
pBTR->getBlockReferenceIds(idRefs);
pBTR->close();
if ( Acad::eOk == acdbOpenObject( pEnt, solId, AcDb::kForWrite)) { // acutPrintf("\n Trans !!!!");
pEnt = doBlockTransform (Ids, pEnt, true); // трансформирует, чтоб тело стояло в том же месте, но в ModelSpace :)
// actrTransactionManager->addNewlyCreatedDBRObject(pEnt); ??? - это вроде не надо
pEnt->close();
}
if ( Acad::eOk == acdbOpenObject( pEnt, solId, AcDb::kForRead)) { // acutPrintf("\n Trans !!!!");
pEnt->draw(); pEnt->close(); // отрисуем
} // Обновим все вставки этого блока
for (int i=0; i < idRefs.length(); i++) {
AcDbObjectPointer<AcDbEntity> pEnt(idRefs[i],AcDb::kForWrite);
if (pEnt.openStatus() == Acad::eOk) {
pEnt->recordGraphicsModified();
}
}
} // if open pBTR
else
pBlockTable->close();
} // if open pBlockTable
} // for blocks
// ----------- command FILLET ---------
ads_name sset, first, nm;
AcGePoint3dArray allPts; // в нем лежат PickPoints для fillet
if (Acad::eOk == acdbGetAdsName(first, solId)) {
for (j=0; j<allPts.length(); j++){
cPt = transP(allPts[j], 0, 1, 0); // WCS -> UCS
if (j == 0)
acedCommand( RTSTR, "FILLET", RT3DPOINT, asDblArray( cPt ), RTREAL, cRadius, RTNONE);
else
acedCommand( RT3DPOINT, asDblArray( cPt ), RTNONE);
}
acedCommand( RTSTR, "", RTNONE);
}
// ------ заносим измененное тело назад в блок --------
toMove.setLogicalLength(0);
if () { // solId находился в блоке
if (acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTable, AcDb::kForRead) == Acad::eOk) {
dadId = Ids[Ids.length() - 2]; // это Id BlockReference в котором лежит наше тело
if ( Acad::eOk == acdbOpenObject( pEnt, dadId, AcDb::kForRead)) { // acutPrintf("\n isA2= %s\n", pEnt->isA()->name());
btrId = AcDbObjectId::kNull;
AcDbBlockReference* pBl = AcDbBlockReference::cast(pEnt);
if (pBl) btrId = pBl->blockTableRecord();
pEnt->close(); // закрываем
if (btrId != AcDbObjectId::kNull) {
if (acdbOpenObject( pBTR, btrId, AcDb::kForWrite) == Acad::eOk) {
toMove.append(solId);
es = pBTR->assumeOwnershipOf(toMove);
if ( Acad::eOk == acdbOpenObject( pEnt, solId, AcDb::kForWrite)) { // acutPrintf("\n Trans !!!!");
pEnt = doBlockTransformBack (Ids, pEnt, true); // обратная трансформация
// actrTransactionManager->addNewlyCreatedDBRObject(pEnt); ??
pEnt->close();
} // Обновим все вставки этого блока
idRefs.setLogicalLength(0);
pBTR->getBlockReferenceIds(idRefs);
pBTR->close();
for (int i=0; i < idRefs.length(); i++) {
AcDbObjectPointer<AcDbEntity> pEnt(idRefs[i],AcDb::kForWrite);
if (pEnt.openStatus() == Acad::eOk) {
pEnt->recordGraphicsModified();
}
}
actrTransactionManager->queueForGraphicsFlush();
actrTransactionManager->flushGraphics();
}
}
} // open dadId
}
} // in block
...
actrTransactionManager->abortTransaction(); // откат и здесь сбой.
Итого, отрывались 2 BTR (ModelSpace и Block с телом) и обе были closed().
Также открывалось само тело, но тоже каждый раз делал для него close().