Здравствуйте!
Пишу утилиту для пакетной обработки чертежей - установки всех свойств объектов по дефолту и замены линий на полилинии.
При попытке записи полилинии в файле получаю ошибку "Autodesk.AutoCAD.Runtime.Exception: eWrongDatabase
at Autodesk.AutoCAD.DatabaseServices.BlockTableRecord.AppendEntity(Entity entity)
at ITAT_Autocad.LineNormalizer.SetLinesByDefault(Database db) in K:\DevProjects\Education\C#\FileProcessor\FileProcessor\LineNormalizer.cs:line 45
at ITAT_Autocad.FileProcessor.Norm() in K:\DevProjects\Education\C#\FileProcessor\FileProcessor\FileProcessor.cs:line 33; error: no function definition: COMPLETE-ACTION"
Как я понимаю, ругается на то что база чертежа не верная. Но почему - непонятно я передаю одну и ту же. Как это исправить?
public class FileProcessor
{
[CommandMethod("Norm")]
public static void Norm()
{
try
{
var path = @"M:\TestBack\";
DirectoryInfo d = new DirectoryInfo(path);
FileInfo[] Files = d.GetFiles("*.dwg");
foreach ( FileInfo file in Files )
{
var fileName = Path.GetFileName(file.FullName);
string dwgFlpath = path + fileName;
using ( Database db = new Database(false, true) )
{
db.ReadDwgFile(dwgFlpath, FileOpenMode.OpenForReadAndAllShare, false, null);
LineNormalizer.SetLinesByDefault(db);
db.PurgeLayers();
db.SaveAs(dwgFlpath, DwgVersion.Current);
}
}
Application.ShowAlertDialog("All files processed");
}
catch ( System.Exception ex )
{
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
}
}
}
Код метода в котором выскакивает ошибка
public class LineNormalizer
{
public static void SetLinesByDefault(Database db)
{
using ( Transaction tr = db.TransactionManager.StartTransaction() )
{
BlockTable bt = (BlockTable) tr.GetObject(db.BlockTableId, OpenMode.ForWrite);
foreach ( ObjectId btrId in bt )
{
BlockTableRecord btr = (BlockTableRecord) tr.GetObject(btrId, OpenMode.ForWrite);
if ( btr.IsFromExternalReference )
{
continue;
}
foreach ( ObjectId id in btr )
{
Entity ent = (Entity) tr.GetObject(id, OpenMode.ForWrite, false, true);
ent.Linetype = "ByLayer";
ent.LineWeight = LineWeight.ByLayer;
ent.Color = Color.FromColorIndex(ColorMethod.ByLayer, 256);
ent.LinetypeScale = 1;
ent.Layer = "0";
if ( ent is Line )
{
Line line = (Line) tr.GetObject(id, OpenMode.ForWrite, false, true);
Polyline polyline = new Polyline();
polyline.SetDatabaseDefaults();
polyline.AddVertexAt(0, new Point2d(line.StartPoint.X, line.StartPoint.Y), 0, 0, 0);
polyline.AddVertexAt(1, new Point2d(line.EndPoint.X, line.EndPoint.Y), 0, 0, 0);
polyline.LineWeight = line.LineWeight;
polyline.Layer = line.Layer;
btr.AppendEntity(polyline);
tr.AddNewlyCreatedDBObject(polyline, true);
Line line1 = tr.GetObject(line.ObjectId, OpenMode.ForWrite) as Line;
line1.Erase(true);
}
}
}
tr.Commit();
}
}
}