Ошибка записи в чертеж

Автор Тема: Ошибка записи в чертеж  (Прочитано 6395 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Ошибка записи в чертеж
« : 25-10-2020, 23:34:14 »
Здравствуйте!

Пишу утилиту для пакетной обработки чертежей - установки всех свойств объектов по дефолту и замены линий на полилинии.
При попытке записи полилинии в файле получаю ошибку "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"

Как я понимаю, ругается на то что база чертежа не верная. Но почему - непонятно я передаю одну и ту же. Как это исправить?

Код - C# [Выбрать]
  1.  public class FileProcessor
  2.     {
  3.         [CommandMethod("Norm")]
  4.         public static void Norm()
  5.         {
  6.             try
  7.             {
  8.                 var path = @"M:\TestBack\";
  9.                 DirectoryInfo d = new DirectoryInfo(path);
  10.                 FileInfo[] Files = d.GetFiles("*.dwg");
  11.                 foreach ( FileInfo file in Files )
  12.                 {
  13.                     var fileName = Path.GetFileName(file.FullName);
  14.                     string dwgFlpath = path + fileName;
  15.                     using ( Database db = new Database(false, true) )
  16.                     {
  17.                         db.ReadDwgFile(dwgFlpath, FileOpenMode.OpenForReadAndAllShare, false, null);
  18.                         LineNormalizer.SetLinesByDefault(db);
  19.                         db.PurgeLayers();
  20.                         db.SaveAs(dwgFlpath, DwgVersion.Current);
  21.                     }
  22.                 }
  23.                 Application.ShowAlertDialog("All files processed");
  24.             }
  25.             catch ( System.Exception ex )
  26.             {
  27.                 Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
  28.             }
  29.         }
  30.     }

Код метода в котором выскакивает ошибка
Код - C# [Выбрать]
  1.  public class LineNormalizer
  2.     {
  3.         public static void SetLinesByDefault(Database db)
  4.         {
  5.             using ( Transaction tr = db.TransactionManager.StartTransaction() )
  6.             {
  7.                 BlockTable bt = (BlockTable) tr.GetObject(db.BlockTableId, OpenMode.ForWrite);
  8.                 foreach ( ObjectId btrId in bt )
  9.                 {
  10.                     BlockTableRecord btr = (BlockTableRecord) tr.GetObject(btrId, OpenMode.ForWrite);
  11.                     if ( btr.IsFromExternalReference )
  12.                     {
  13.                         continue;
  14.                     }
  15.  
  16.                     foreach ( ObjectId id in btr )
  17.                     {
  18.                         Entity ent = (Entity) tr.GetObject(id, OpenMode.ForWrite, false, true);
  19.                         ent.Linetype = "ByLayer";
  20.                         ent.LineWeight = LineWeight.ByLayer;
  21.                         ent.Color = Color.FromColorIndex(ColorMethod.ByLayer, 256);
  22.                         ent.LinetypeScale = 1;
  23.                         ent.Layer = "0";
  24.                         if ( ent is Line )
  25.                         {
  26.                             Line line = (Line) tr.GetObject(id, OpenMode.ForWrite, false, true);
  27.                             Polyline polyline = new Polyline();
  28.                             polyline.SetDatabaseDefaults();
  29.                             polyline.AddVertexAt(0, new Point2d(line.StartPoint.X, line.StartPoint.Y), 0, 0, 0);
  30.                             polyline.AddVertexAt(1, new Point2d(line.EndPoint.X, line.EndPoint.Y), 0, 0, 0);
  31.                             polyline.LineWeight = line.LineWeight;
  32.                             polyline.Layer = line.Layer;
  33.                             btr.AppendEntity(polyline);
  34.                             tr.AddNewlyCreatedDBObject(polyline, true);
  35.                             Line line1 = tr.GetObject(line.ObjectId, OpenMode.ForWrite) as Line;
  36.                             line1.Erase(true);
  37.                         }
  38.                     }
  39.                 }
  40.  
  41.                 tr.Commit();
  42.             }
  43.        
  44.         }
  45.     }

Оффлайн Александр Пекшев aka Modis

  • ADN Club
  • *****
  • Сообщений: 1658
  • Карма: 366
  • Отец modplus.org
    • ModPlus
Re: Ошибка записи в чертеж
« Ответ #1 : 25-10-2020, 23:40:34 »
Попробуйте удалить строчку
Код - C# [Выбрать]
  1. polyline.SetDatabaseDefaults();
или вызвать её так
Код - C# [Выбрать]
  1. polyline.SetDatabaseDefaults(db);

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Ошибка записи в чертеж
« Ответ #2 : 26-10-2020, 00:05:58 »
Попробовал, не помогает.
"Autodesk.AutoCAD.Runtime.Exception: eWrongDatabase
   at Autodesk.AutoCAD.DatabaseServices.Entity.set_Layer(String newValue)
   at ITAT_Autocad.LineNormalizer.SetLinesByDefault(Database db) in K:\DevProjects\Education\C#\FileProcessor\FileProcessor\LineNormalizer.cs:line 41
   at ITAT_Autocad.FileProcessor.Norm() in K:\DevProjects\Education\C#\FileProcessor\FileProcessor\FileProcessor.cs:line 33; error: no function definition: COMPLETE-ACTION"

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: Ошибка записи в чертеж
« Ответ #3 : 26-10-2020, 10:25:38 »
Можно еще слой присваивать по id, а не по имени. И вообще можно все свойства копировать с линии на полилинию.
На крайний случай переключить Work Database https://adn-cis.org/forum/index.php?topic=10049.msg45348#msg45348

Отмечено как Решение Atomohod 26-10-2020, 19:08:16

Оффлайн Дмитрий Загорулькин

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: Ошибка записи в чертеж
« Ответ #4 : 26-10-2020, 14:12:07 »
Autodesk.AutoCAD.DatabaseServices.Entity.set_Layer(String newValue)
Вот же, вроде понятно пишет - не может задать слой объекту, т.к. полилиния ещё не в базе в этот момент. Надо или btr.AppendEntity(polyline); повыше поднять, или вместо свойства Layer использовать LayerId.

Оффлайн Привалов Дмитрий

  • ADN Club
  • *****
  • Сообщений: 546
  • Карма: 119
Re: Ошибка записи в чертеж
« Ответ #5 : 26-10-2020, 15:13:08 »
Line line1 = tr.GetObject(line.ObjectId, OpenMode.ForWrite) as Line;
line1.Erase(true);
Еще странно удаляешь отрезки. Зачем то второй раз открываешь, достаточно line.Erase(true);