А решение было так близко. Нужно заменить
Database destDb = new Database(false, true);
на
Database destDb = new Database(false, false);
Во всяком случае в AutoCAD 2015 это работает.
Наткнулся я на это решение, когда мне сообщили, что в чистом ObjectARX это вроде работает.
Когда я сделал отладочный код на C++:
static void TransDb(LPCTSTR pathDwgInput, LPCTSTR pathDwgOutput, AcGeVector3d v)
{
AcDbDatabase *destDb = new AcDbDatabase(false, true);
destDb->readDwgFile(pathDwgInput, AcDbDatabase::OpenMode::kForReadAndAllShare);
destDb->closeInput(false);
{
AcDbObjectId modelId = acdbSymUtil()->blockModelSpaceId(destDb);
AcDbBlockTableRecordPointer destModel(modelId, AcDb::kForRead);
AcGeMatrix3d mat; mat.setToTranslation(v);
if (destModel.openStatus() == Acad::eOk) {
AcDbBlockTableRecordIterator *pIter = NULL;
destModel->newIterator(pIter);
if (pIter) {
for (; !pIter->done(); pIter->step()) {
AcDbObjectId eId;
if (pIter->getEntityId(eId) == Acad::eOk) {
AcDbObjectPointer<AcDbEntity> pEnt(eId, AcDb::kForWrite);
if (pEnt.openStatus() == Acad::eOk) {
pEnt->transformBy(mat);
}
}
}
delete pIter;
}
}
destDb->saveAs(pathDwgOutput, true);
}
delete destDb;
}
static void MyGroupMoveDb () {
TransDb(L"C:\\testOle2Frame.dwg", // Input file
L"C:\\testOle2Frame-new.dwg", // Output file
AcGeVector3d(100, 100, 0) // Displacement
);
}
Но код работал точно так же, как и на C#. И только замена
AcDbDatabase *destDb = new AcDbDatabase(false, true);
на
AcDbDatabase *destDb = new AcDbDatabase(false, false);
принесла положительный результат.
Теперь напишу в ADN DevHelp об этом. Халтурщики.