Solid3d source = tr.GetObject(id, OpenMode.ForRead) as Solid3d; // id получен заранее из BTR внешней ссылки. Как ни странно транзакция не ругается на объект из чужой database
if (source is null || source.IsNull || source.IsErased) return;
Solid3d laid;
if (source.Database == db) // db- это database основного чертежа
laid = source.Clone() as Solid3d;
else // солид получен из блока-внешней ссылки - простой клон не уберет связи с внешней БД
{
IdMapping map = new IdMapping();
source.Database.WblockCloneObjects(
new ObjectIdCollection { id },
SymbolUtilityServices.GetBlockModelSpaceId(db), // в модель основной database
map, DuplicateRecordCloning.Ignore, false); // получаю eWasErased
laid = tr.GetObject(map[source.Id].Value, OpenMode.ForWrite, false, true) as Solid3d;
}