Для первого случая ситуация следующая.
Добавил в код Ваши рекомендации.
public void Action()
{
var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
var db = doc.Database;
using (var trans = db.TransactionManager.StartTransaction())
{
var bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
var btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead);
foreach (var objId in btr)
{
using (var ent = (Entity)trans.GetObject(objId, OpenMode.ForRead))
{
try
{
var bref = ent as BlockReference;
if (bref != null)
{
// Получаем BlockTableRecord внешней ссылки
var btrBref = (BlockTableRecord)trans.GetObject(bref.BlockTableRecord, OpenMode.ForRead);
if (!btrBref.IsFromExternalReference)
{
return;
}
var xDB = btrBref.GetXrefDatabase(false);
xDB.RestoreOriginalXrefSymbols();
// открываем транзакцию внешней базы для получения объектов
using (var transRef = xDB.TransactionManager.StartTransaction())
{
// Внешняя база блока
var xBT = transRef.GetObject(xDB.BlockTableId, OpenMode.ForRead) as BlockTable;
var xBTR = transRef.GetObject(xBT[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
// Создаем и заполняем коллекцию id'шников
var idColl = new ObjectIdCollection();
foreach (var objid in xBTR)
{
idColl.Add(objid);
}
var iMap = new IdMapping();
xDB.WblockCloneObjects(idColl, db.CurrentSpaceId, iMap, DuplicateRecordCloning.Ignore, false);
}
xDB.RestoreForwardingXrefSymbols();
bref.Visible = false;
}
}
catch (Exception e)
{
}
}
}
trans.Commit();
}
}
При запуске код работает без ошибок. Но объекты вообще не копируются.
Во втором случае код выглядит следующим образом.
public void Action()
{
var doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
var db = doc.Database;
using (var trans = db.TransactionManager.StartTransaction())
{
var bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForWrite);
var btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
foreach (var objId in btr)
{
using (var ent = (Entity)trans.GetObject(objId, OpenMode.ForWrite))
{
try
{
var bref = ent as BlockReference;
if (bref != null)
{
// Получаем BlockTableRecord внешней ссылки
var btrBref = (BlockTableRecord)trans.GetObject(bref.BlockTableRecord, OpenMode.ForWrite);
if (!btrBref.IsFromExternalReference)
{
return;
}
using (var xDB = new Database(false, true))
{
xDB.ReadDwgFile(btrBref.PathName, FileShare.ReadWrite, false, null);
// открываем транзакцию внешней базы для получения объектов
using (var transRef = xDB.TransactionManager.StartTransaction())
{
// Внешняя база блока
var xBT = transRef.GetObject(xDB.BlockTableId, OpenMode.ForRead) as BlockTable;
var xBTR = transRef.GetObject(xBT[BlockTableRecord.ModelSpace], OpenMode.ForRead) as BlockTableRecord;
// Создаем и заполняем коллекцию id'шников
var idColl = new ObjectIdCollection();
foreach (var objid in xBTR)
{
idColl.Add(objid);
}
var iMap = new IdMapping();
xDB.WblockCloneObjects(idColl, db.CurrentSpaceId, iMap, DuplicateRecordCloning.Ignore, false);
}
}
bref.Visible = false;
}
}
catch (Exception e)
{
}
}
}
trans.Commit();
}
}
Пришлось открыть объекты на запись, так как вылетал эксепшн прир сокрытии блока.
Копирование объектов происходит, но без COGOPOINT'ов. Думаю, что может создание нового COGOPOINT на основе старого.