FatalError при попытке копирования объектов в другой чертеж

Автор Тема: FatalError при попытке копирования объектов в другой чертеж  (Прочитано 3018 раз)

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!
Решаю задачу по копированию объектов на определенном слое из одного чертежа в другой. Хватаю Fatal error при попытке входа в транзакцию в методе public ObjectIdCollection GetObjects(Database db). Что не так? Транзакция верхнего уровня вроде открывается нормально.
Код - C# [Выбрать]
  1. namespace DrawingSynchronizer
  2. {
  3.     class Drawing
  4.     {
  5.         public List<Database> GetDrawingDatabases(string path)
  6.         {
  7.             List<Database> originDrawings = new List<Database>();
  8.             try
  9.             {
  10.                 DirectoryInfo d = new DirectoryInfo(path);
  11.                 FileInfo[] Files = d.GetFiles("*.dwg");
  12.  
  13.                 foreach (FileInfo file in Files)
  14.                 {
  15.                     var fileName = Path.GetFileName(file.FullName);
  16.                     string dwgFlpath = path + fileName;
  17.                     using (Database db = new Database(false, true))
  18.                     {
  19.                         db.ReadDwgFile(dwgFlpath, FileOpenMode.OpenForReadAndAllShare, false, null);
  20.                         db.CloseInput(true);
  21.                         originDrawings.Add(db);
  22.                     }
  23.                 }
  24.             }
  25.             catch (Exception ex)
  26.             {
  27.                 Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
  28.             }
  29.  
  30.             return originDrawings;
  31.         }
  32.  
  33.         public ObjectIdCollection GetObjects(Database db)
  34.         {
  35.             ObjectIdCollection objectIdCollection = new ObjectIdCollection();
  36.             Transaction tr = db.TransactionManager.StartTransaction();
  37.             using ( tr )
  38.             {
  39.                 BlockTable bt = (BlockTable) tr.GetObject(db.BlockTableId, OpenMode.ForRead, false, false);
  40.                 BlockTableRecord btr = (BlockTableRecord) tr.GetObject(bt[ BlockTableRecord.ModelSpace ], OpenMode.ForRead);
  41.  
  42.                 foreach ( var item in btr )
  43.                 {
  44.                     Entity ent = (Entity) tr.GetObject(item, OpenMode.ForRead);
  45.  
  46.                     if ( ent.Layer.Contains("0") )
  47.                     {
  48.                         objectIdCollection.Add(ent.ObjectId);
  49.                     }
  50.                 }
  51.  
  52.                 tr.Commit();
  53.             }
  54.  
  55.             return objectIdCollection;
  56.         }
  57.     }
  58. }
Код - C# [Выбрать]
  1. namespace DrawingSynchronizer
  2. {
  3.     public class Synchronizer
  4.     {
  5.         [CommandMethod("syncdrawings", CommandFlags.Session)]
  6.         public static void SynchronizeDrawings()
  7.         {
  8.             Drawing originDrawing = new Drawing();
  9.             var originDrawings = originDrawing.GetDrawingDatabases(@"K:\sync\");
  10.  
  11.             // Get the current document and database
  12.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  13.             Database acCurDb = acDoc.Database;
  14.  
  15.             // Lock the current document
  16.             using (DocumentLock acLckDocCur = acDoc.LockDocument())
  17.             {
  18.                 // Start a transaction
  19.                 using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction())
  20.                 {
  21.                     // Open the Block table record for read
  22.                     BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;
  23.  
  24.                     // Open the Block table record Model space for write
  25.                     BlockTableRecord acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  26.  
  27.  
  28.                     IdMapping idMap = new IdMapping();
  29.                     foreach (var db in originDrawings)
  30.                     {
  31.                         db.WblockCloneObjects(originDrawing.GetObjects(db), acBlkTblRec.ObjectId, idMap, DuplicateRecordCloning.Replace, false);
  32.                         acCurDb.Save();
  33.                     }
  34.  
  35.                     acTrans.Commit();
  36.                 }
  37.             }
  38.         }
  39.  
  40.     }
  41.  
  42. }


Отмечено как Решение Atomohod 22-09-2019, 13:52:28

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Глупость вот тут:
Код - C# [Выбрать]
  1. using (Database db = new Database(false, true))
  2. {
  3.     db.ReadDwgFile(dwgFlpath, FileOpenMode.OpenForReadAndAllShare, false, null);
  4.     db.CloseInput(true);
  5.     originDrawings.Add(db);
  6. }
По выходе из блока using db уничтожается и в originDrawings она становится недействительной.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Fatal error вылечил, теперь словил eWasErased. Что это означает?


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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Fatal error вылечил, теперь словил eWasErased. Что это означает?


Это означает, что ты пытаешься открыть объект/примитив, который был удалён (стёрт)
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
объект/примитив, который был удалён (стёрт)
А как так получается? Я вывел db из using чтобы не вызывать dispose и все равно ее стер? Я запутался, поясните пожалуйста.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Я вывел db из using чтобы не вызывать dispose и все равно ее стер?
Не внимательно читаешь. Стерта не база, а объект/примитив в ней. Запусти под отладчиком и найди при каких данных это происходит - какой именно объект стерт.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение