// Тест сравнения блока в текущем чертеже и в файле
[CommandMethod("Test")]
public void Test()
{
Document doc = Application.DocumentManager.MdiActiveDocument;
Editor ed = doc.Editor;
Database db = doc.Database;
bool result = false;
using (var t = db.TransactionManager.StartTransaction())
{
// Тестовый блок в текущем чертеже
ObjectId idBtrTest = GetTestBtr(db);
List<EntityInfo> entsInfo = getEntInfoBtr(idBtrTest);
// Тестовый блок во внешнем файле
using (var dbLib = new Database(false, true))
{
dbLib.ReadDwgFile(@"c:\test\Lib.dwg", FileShare.ReadWrite, false, "");
using (var tLib = dbLib.TransactionManager.StartTransaction())
{
ObjectId idBtrTestLib = GetTestBtr(dbLib);
List<EntityInfo> entsInfoLib = getEntInfoBtr(idBtrTestLib);
// Сравнение блоков
result = Enumerable.SequenceEqual(entsInfo.OrderBy(e => e), entsInfoLib.OrderBy(e => e)); //entsInfo.SequenceEqual(entsInfoLib);
tLib.Commit();
}
}
t.Commit();
}
ed.WriteMessage("Результат сравнения блоков - {0}", result);
}
private List<EntityInfo> getEntInfoBtr(ObjectId idBtrTest)
{
List<EntityInfo> entsInfo = new List<EntityInfo>();
var btr = idBtrTest.GetObject(OpenMode.ForRead) as BlockTableRecord;
foreach (ObjectId idEnt in btr)
{
var ent = idEnt.GetObject(OpenMode.ForRead) as Entity;
entsInfo.Add(new EntityInfo(ent));
if (ent is BlockReference)
{
entsInfo.AddRange(getEntInfoBtr(((BlockReference)ent).BlockTableRecord));
}
}
return entsInfo;
}
private ObjectId GetTestBtr(Database db)
{
var bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;
if (bt.Has("Test"))
{
return bt["Test"];
}
return ObjectId.Null;
}