Fatal error при пакетной обработке файлов

Автор Тема: Fatal error при пакетной обработке файлов  (Прочитано 10377 раз)

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!

Столкнулся с ошибкой при попытке написания команды для обработки нескольких файлов, добавляющей в уже существующие описания блока новые объекты. Запускаю команду, она отрабатывает как надо - изменения внесены в обработанные файлы, но после окончания команды Автокад падает с фаталом.
Как это исправить?
Код - C# [Выбрать]
  1.  [CommandMethod("2Starttest")]
  2.     public static void CommandStarter()
  3.     {
  4.         try
  5.         {          
  6.             List < string > files =SelectDrawings();
  7.             foreach ( string file in files )
  8.             {
  9.                 using ( Database db = new(false, true) )
  10.                 {
  11.                     db.ReadDwgFile(file, FileOpenMode.OpenForReadAndAllShare, false, null);
  12.                    
  13.                     List < string > blocks = GetAllBlockDefNames(db);
  14.                     if ( blocks.Count > 0 )
  15.                     {
  16.                         foreach ( string name in blocks )
  17.                         {
  18.                             if ( name.Contains("Main") )
  19.                             {
  20.                                 HostApplicationServices.WorkingDatabase = db;
  21.                                 ObjectId x = GetBlockDefByName(name, db);
  22.                                 ObjectIdCollection collection = new();
  23.                                 Transaction tr = db.TransactionManager.StartTransaction();
  24.                                 using ( tr )
  25.                                 {
  26.                                     BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  27.                                     BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  28.                                     for ( int i = 0; i < 5; i++ )
  29.                                     {
  30.                                         Polyline reviewedByRMRS = new();
  31.                                         Point2d basePoint = new(-325, 83 + (17*i));
  32.                                         reviewedByRMRS.SetDatabaseDefaults(db);
  33.                                         reviewedByRMRS.CreateRectangleByDimensions(basePoint, 80, 12);
  34.                                         reviewedByRMRS.LineWeight = LineWeight.LineWeight000;
  35.                                         reviewedByRMRS.Linetype = "-ITAT_Dashed";
  36.                                         reviewedByRMRS.LinetypeScale = 0.005;
  37.                                         reviewedByRMRS.Layer = "0";
  38.                                         btr.AppendEntity(reviewedByRMRS);
  39.                                         tr.AddNewlyCreatedDBObject(reviewedByRMRS, true);
  40.                                         collection.Add(reviewedByRMRS.ObjectId);
  41.                                         using ( MText mtext = new() )
  42.                                         {
  43.                                             mtext.Location = mtext.Location = reviewedByRMRS.GetPoint3dAt(1);
  44.                                             mtext.TextHeight = 2;
  45.                                             mtext.Attachment = AttachmentPoint.MiddleLeft;
  46.                                             mtext.Contents = "Новый текст";
  47.                                             mtext.Layer = "0";
  48.                                             mtext.Width = 50;
  49.                                             mtext.LineSpaceDistance = 2;
  50.                                             btr.AppendEntity(mtext);
  51.                                             tr.AddNewlyCreatedDBObject(mtext, true);
  52.                                             collection.Add(mtext.ObjectId);
  53.                                         }
  54.                                     }
  55.  
  56.                                     AddObjectsToBlockDef(x, collection, db);
  57.                                     tr.Commit();
  58.                                 }
  59.                             }
  60.                         }
  61.  
  62.                         db.SaveAs(file, DwgVersion.Newest);
  63.                        
  64.                     }
  65.                 }
  66.             }
  67.  
  68.          
  69.             Application.ShowAlertDialog("All files processed");
  70.         }
  71.         catch ( System.Exception ex )
  72.         {
  73.             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
  74.         }
  75.     }
  76.   public static ObjectId GetBlockDefByName(string name, Database db)
  77.     {
  78.         try
  79.         {
  80.             using ( Transaction tr = db.TransactionManager.StartTransaction() )
  81.             {
  82.                 BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  83.                 foreach ( ObjectId idBtr in bt )
  84.                 {
  85.                     BlockTableRecord btr = tr.GetObject(idBtr, OpenMode.ForRead) as BlockTableRecord;
  86.                     if ( btr.Name == name )
  87.                     {
  88.                         return btr.ObjectId;
  89.                     }
  90.                 }
  91.  
  92.                 tr.Commit();
  93.             }
  94.         }
  95.         catch ( System.Exception ex )
  96.         {
  97.             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage($"Cannot get block definition with name {name}");
  98.         }
  99.  
  100.         return default;
  101.     }
  102.  
  103.  public static List<string> SelectDrawings()
  104.         {
  105.             List<string> fileNames = new List<string>();
  106.             try
  107.             {
  108.                 Autodesk.AutoCAD.Windows.OpenFileDialog ofd = new Autodesk.AutoCAD.Windows.OpenFileDialog("Выбрать чертеж", "", "dwg", "did", Autodesk.AutoCAD.Windows.OpenFileDialog.OpenFileDialogFlags.AllowMultiple);
  109.                 DialogResult yy = ofd.ShowDialog();
  110.                 if ( yy == DialogResult.OK )
  111.                 {
  112.                     foreach ( string file in ofd.GetFilenames() )
  113.                     {
  114.                         fileNames.Add(file);
  115.                     }
  116.                 }
  117.             }
  118.             catch ( Exception ex )
  119.             {
  120.                 Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
  121.             }
  122.  
  123.             return fileNames;
  124.         }
  125.  public static List<string> GetAllBlockDefNames(Database db)
  126.     {
  127.         List<string> newObjects = new List<string>();
  128.         try
  129.         {
  130.             using ( Transaction tr = db.TransactionManager.StartTransaction() )
  131.             {
  132.                 BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  133.                 foreach ( ObjectId idBtr in bt )
  134.                 {
  135.                     BlockTableRecord btr = tr.GetObject(idBtr, OpenMode.ForRead) as BlockTableRecord;
  136.                     newObjects.Add(btr.Name);
  137.                 }
  138.  
  139.                 tr.Commit();
  140.             }
  141.         }
  142.         catch ( System.Exception ex )
  143.         {
  144.             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage($"Cannot get block list");
  145.         }
  146.  
  147.         return newObjects;
  148.     }
  149.  
  150.  
  151.  


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Ну как минимум ты не возвращаешь HostApplicationServices.WorkingDatabase в исходное состояние. И непонятно зачем переключать его так часто - достаточно один раз для каждого из чертежей.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Я думал на этот счет, пробовал такую версию кода
Код - C# [Выбрать]
  1. [CommandMethod("2Starttest")]
  2.     public static void CommandStarter()
  3.     {
  4.         try
  5.         {
  6.             Database curDb = HostApplicationServices.WorkingDatabase;
  7.             List < string > files = SelectionUtilities.SelectDrawings();
  8.             foreach ( string file in files )
  9.             {
  10.                 using ( Database db = new(false, true) )
  11.                 {
  12.                     db.ReadDwgFile(file, FileOpenMode.OpenForReadAndAllShare, false, null);
  13.                     HostApplicationServices.WorkingDatabase = db;
  14.                     List < string > blocks = GetAllBlockDefNames(db);
  15.                     if ( blocks.Count > 0 )
  16.                     {
  17.                         foreach ( string name in blocks )
  18.                         {
  19.                             if ( name.Contains("Main") )
  20.                             {
  21.                              
  22.                                 ObjectId x = GetBlockDefByName(name, db);
  23.                                 ObjectIdCollection collection = new();
  24.                                 Transaction tr = db.TransactionManager.StartTransaction();
  25.                                 using ( tr )
  26.                                 {
  27.                                     BlockTable bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  28.                                     BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite);
  29.                                     for ( int i = 0; i < 5; i++ )
  30.                                     {
  31.                                         Polyline reviewedByRMRS = new();
  32.                                         Point2d basePoint = new(-325, 83 + (17*i));
  33.                                         reviewedByRMRS.SetDatabaseDefaults(db);
  34.                                         reviewedByRMRS.CreateRectangleByDimensions(basePoint, 80, 12);
  35.                                         reviewedByRMRS.LineWeight = LineWeight.LineWeight000;
  36.                                         reviewedByRMRS.Linetype = "-ITAT_Dashed";
  37.                                         reviewedByRMRS.LinetypeScale = 0.005;
  38.                                         reviewedByRMRS.Layer = "0";
  39.                                         btr.AppendEntity(reviewedByRMRS);
  40.                                         tr.AddNewlyCreatedDBObject(reviewedByRMRS, true);
  41.                                         collection.Add(reviewedByRMRS.ObjectId);
  42.                                         using ( MText mtext = new() )
  43.                                         {
  44.                                             mtext.Location = mtext.Location = reviewedByRMRS.GetPoint3dAt(1);
  45.                                             mtext.TextHeight = 2;
  46.                                             mtext.Attachment = AttachmentPoint.MiddleLeft;
  47.                                             mtext.Contents = "Новый текст";
  48.                                             mtext.Layer = "0";
  49.                                             mtext.Width = 50;
  50.                                             mtext.LineSpaceDistance = 2;
  51.                                             btr.AppendEntity(mtext);
  52.                                             tr.AddNewlyCreatedDBObject(mtext, true);
  53.                                             collection.Add(mtext.ObjectId);
  54.                                         }
  55.                                     }
  56.  
  57.                                
  58.                                     tr.Commit();
  59.                                 }
  60.                             }
  61.                         }
  62.  
  63.                         db.SaveAs(file, DwgVersion.Newest);
  64.                        
  65.                     }
  66.                 }
  67.  
  68.                 HostApplicationServices.WorkingDatabase = curDb;
  69.             }
  70.  
  71.          
  72.             Application.ShowAlertDialog("All files processed");
  73.         }
  74.         catch ( System.Exception ex )
  75.         {
  76.             Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
  77.         }
  78.     }

Но фатал это не устраняет. Что может еще помочь?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
А если совсем убрать присвоение HostApplicationServices.WorkingDatabase?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
А если совсем убрать присвоение
С этого все и началось - ранее смены базы я не делал и получал Autodesk.AutoCAD.Runtime.Exception: eWrongDatabase. Через смену базы я избавился от этой ошибки но появился фатал.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
ранее смены базы я не делал и получал Autodesk.AutoCAD.Runtime.Exception: eWrongDatabase.
1. На какой строке кода?
2. В последнем приведенном коде тоже возникает ошибка eWrongDatabase если убрать изменение HostApplicationServices.WorkingDatabase?
Эта ошибка теоретически может возникать на следующих строках:
Код - C# [Выбрать]
  1. mtext.Layer = "0";
  2. reviewedByRMRS.Linetype = "-ITAT_Dashed";
Причем, чтобы вторая строка работала необходимо, чтобы в этом чертеже был тип линии "-ITAT_Dashed". В противном случае его нужно загрузить.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
1. На какой строке кода?
reviewedByRMRS.Linetype = "-ITAT_Dashed";
Линия в редактируемом блоке уже есть, это проверял.

В последнем приведенном коде тоже возникает ошибка eWrongDatabase если убрать изменение HostApplicationServices.WorkingDatabase?
Да

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Цитата: Александр Ривилис от 02-05-2022, 22:36:48
1. На какой строке кода?
reviewedByRMRS.Linetype = "-ITAT_Dashed";
Линия в редактируемом блоке уже есть, это проверял.
Вот с этого и надо было начинать. Найди ObjectId этого типа линии в этой базе и присвой его:
Код - C# [Выбрать]
  1. reviewedByRMRS.LinetypeId = idLineType;
Переключение рабочей базы не потребуется.
Еще можешь попробовать сделать так:
Код - C# [Выбрать]
  1. Polyline reviewedByRMRS = new();
  2. Point2d basePoint = new(-325, 83 + (17*i));
  3. reviewedByRMRS.SetDatabaseDefaults(db);
  4. reviewedByRMRS.CreateRectangleByDimensions(basePoint, 80, 12);
  5.  // Сначала добавляем, а затем меняем свойства
  6. btr.AppendEntity(reviewedByRMRS);
  7.  
  8. reviewedByRMRS.LineWeight = LineWeight.LineWeight000;
  9. reviewedByRMRS.Linetype = "-ITAT_Dashed";
  10. reviewedByRMRS.LinetypeScale = 0.005;
  11. reviewedByRMRS.Layer = "0";
  12. tr.AddNewlyCreatedDBObject(reviewedByRMRS, true);
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Линия в редактируемом блоке уже есть, это проверял.
Линия будет, а какой у нее будет тип линии?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Линия будет, а какой у нее будет тип линии?
Я некорректно выразился - имел в виду, что уже есть другая линия с присвоенным ей типом линии "-ITAT_Dashed". То есть тип линии в чертеж загружен.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Atomohod,
Попробуй рекомендации отсюда: https://adn-cis.org/forum/index.php?topic=10741.msg51004#msg51004
Кстати, обратил внимание вот на какую вещь:
Код - C# [Выбрать]
  1. HostApplicationServices.WorkingDatabase = curDb;
Эта строка должна быть внутри блока (например, последней строкой перед закрывающейся фигурной скобкой:
Код - C# [Выбрать]
  1. using ( Database db = new Database(false, true) )
  2. {
  3.  //....
  4. }
Это потому, что после завершения этого блока db уже не существует и переключится нужно тогда, когда она еще есть.
« Последнее редактирование: 03-05-2022, 13:00:54 от Александр Ривилис »
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Переключение рабочей базы не потребуется.
Не выходит - базу все-таки нужно менять. Получаю ошибку при добавлении btr.AppendEntity(mtext);. А со сменой базы происходит фатал. Замкнутый круг.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Получаю ошибку при добавлении btr.AppendEntity(mtext);
Какая ошибка?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13898
  • Карма: 1790
  • Рыцарь ObjectARX
  • Skype: rivilis
Atomohod,
1. Сначала выполняй btr.AppendEntity(mtext), а затем уже меняй свойства mtext
2. mtext.SetDatabaseDefaults(db) не забывай
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение