// © Andrey Bushman, 2014
// LayerTableRecordTesting.cs
// Testing of case: http://www.theswamp.org/index.php?topic=46980.0
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using Mb = MbUnit.Framework;
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using Ap = Autodesk.AutoCAD.ApplicationServices;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Rt = Autodesk.AutoCAD.Runtime;
using Hs = Autodesk.AutoCAD.DatabaseServices.HostApplicationServices;
using Us = Autodesk.AutoCAD.DatabaseServices.SymbolUtilityServices;
namespace Bushman.CAD.Testing {
sealed class DatabaseSwitcher : IDisposable {
Db.Database prewDb = null;
public DatabaseSwitcher(Db.Database db) {
prewDb = Hs.WorkingDatabase;
Hs.WorkingDatabase = db;
}
public void Dispose() {
Hs.WorkingDatabase = prewDb;
}
}
sealed class DocumentSwitcher : IDisposable {
Ap.Document prewDoc = null;
Db.Database prewDb = null;
public DocumentSwitcher(Ap.Document doc) {
prewDoc = cad.DocumentManager.MdiActiveDocument;
prewDb = Hs.WorkingDatabase;
cad.DocumentManager.MdiActiveDocument = doc;
Hs.WorkingDatabase = doc.Database;
}
public void Dispose() {
cad.DocumentManager.MdiActiveDocument = prewDoc;
Hs.WorkingDatabase = prewDb;
}
}
[Mb.TestFixture]
[Mb.Description("The LayerTableRecord count testing.")]
sealed class LayerTableRecordTesting {
const String fileName = @"C:\public\acad_test\test.dwg";
Int32 count = 0;
[Mb.FixtureSetUp]
[Mb.Description("Create DWG file if it not exist still.")]
private void SetUp() {
if (!File.Exists(fileName)) {
using (Db
.Database db
= new Db
.Database(true,
true)) { db.CloseInput(true);
using (DatabaseSwitcher dbsw
= new DatabaseSwitcher
(db
)) { using (Db.Transaction tr = db.TransactionManager.StartTransaction()
) {
Db.LayerTable lt = tr.GetObject(db.LayerTableId,
Db.OpenMode.ForWrite) as Db.LayerTable;
Db
.LayerTableRecord record
= new Db
.LayerTableRecord(); record.Name = "Test-Layer";
record.Description = "This layer was created for testing";
lt.Add(record);
tr.AddNewlyCreatedDBObject(record, true);
Db
.LayerTableRecord record2
= new Db
.LayerTableRecord(); record2.Name = "Test-Layer-2";
record2.Description = "This layer was created for testing too";
lt.Add(record2);
tr.AddNewlyCreatedDBObject(record2, true);
Db
.Circle circle
= new Db
.Circle(); circle.SetDatabaseDefaults();
circle.Radius = 100;
circle
.Center = new Autodesk
.AutoCAD.Geometry.Point3d(0,
0,
0); circle.LayerId = record.ObjectId;
cad.SetSystemVariable("CLAYER", record.Name);
Db.BlockTableRecord model = tr.GetObject(Us.GetBlockModelSpaceId(
db),
Db.OpenMode.ForWrite) as Db.BlockTableRecord;
model.AppendEntity(circle);
tr.AddNewlyCreatedDBObject(circle, true);
IEnumerable<Db.ObjectId> layerIds = lt.Cast<Db.ObjectId>()
.Where(n => n.IsValid && !n.IsErased && !n.IsEffectivelyErased
);
count = layerIds.Count();
tr.Commit();
}
}
db.SaveAs(fileName, Db.DwgVersion.Newest);
}
}
}
[Mb.Test]
[Mb.Description("LayerTableRecord iteration for a Database.")]
private void DatabaseTesting() {
Int32 countDb = 0;
using (Db
.Database db
= new Db
.Database(true,
true)) { db.CloseInput(true);
using (DatabaseSwitcher dbsw
= new DatabaseSwitcher
(db
)) { db.ReadDwgFile(fileName, Db.FileOpenMode.OpenForReadAndReadShare,
false, String.Empty);
CheckLayerItems(db, ref countDb);
}
}
Mb.Assert.AreEqual<Int32>(count, countDb, "count != countDb.");
}
[Mb.Test]
[Mb.Description("LayerTableRecord iteration for a Document.")]
private void DocumentTesting() {
Ap.Document doc = Ap.DocumentCollectionExtension.Add(cad.DocumentManager,
fileName);
Int32 countDwg = 0;
using (DocumentSwitcher docsw
= new DocumentSwitcher
(doc
)) { using (doc.LockDocument()) {
CheckLayerItems(doc.Database, ref countDwg);
}
}
Ap.DocumentExtension.CloseAndDiscard(doc); // I get an exception here.
Mb.Assert.AreEqual<Int32>(count, countDwg, "count != countDwg.");
}
[Mb.FixtureTearDown]
void RemoveTestDwg() {
if (File.Exists(fileName))
File.Delete(fileName);
}
private static void CheckLayerItems(Db.Database db, ref Int32 count) {
using (Db.Transaction tr = db.TransactionManager.StartTransaction()) {
Db.LayerTable lt = tr.GetObject(db.LayerTableId, Db.OpenMode.ForRead)
as Db.LayerTable;
Console.WriteLine("Layer names:");
IEnumerable<Db.ObjectId> layerIds = lt.Cast<Db.ObjectId>().Where(n =>
n.IsValid && !n.IsErased && !n.IsEffectivelyErased);
foreach (Db.ObjectId id in layerIds) {
Db.LayerTableRecord ltr = tr.GetObject(id, Db.OpenMode.ForRead)
as Db.LayerTableRecord;
Console.WriteLine(ltr.Name);
}
Console.WriteLine("Layers count: {0}.", count = layerIds.Count());
tr.Commit();
}
}
}
}