eHadMultipleReaders. Причина?

Автор Тема: eHadMultipleReaders. Причина?  (Прочитано 12855 раз)

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

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
eHadMultipleReaders. Причина?
« : 03-03-2021, 19:08:16 »
Здравствуйте!

Есть плагин который формирует один чертеж из нескольких составляющих. Вызывается в чистом новом открытом файле чертежа через командную строку, далее выбираем несколько интересующих нас dwg файлов на диске и жмем ОК. Плагин читает в памяти базы данных чертежей и копирует в текущий чертеж часть их содержимого, основываясь на заложенный в алгоритм фильтр выбора объектов.
При работе столкнулся с ошибкой eHadMultipleReaders. Затем выдает фатал и акад вылетает. Кто-нибудь знает как это исправить?
Autocad 2015.




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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: eHadMultipleReaders. Причина?
« Ответ #1 : 03-03-2021, 19:11:32 »
Кто-нибудь знает как это исправить?
Да. Исправить программу.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: eHadMultipleReaders. Причина?
« Ответ #2 : 03-03-2021, 19:30:09 »
Из-за чего возникает эта ошибка?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: eHadMultipleReaders. Причина?
« Ответ #3 : 03-03-2021, 19:33:31 »
Из-за чего возникает эта ошибка?
Причин может быть множество. Нет смысла гадать на кофейной гуще.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: eHadMultipleReaders. Причина?
« Ответ #4 : 03-03-2021, 21:08:36 »
Что может помочь? Код плагина слишком объемный, чтобы выкладывать полностью. Если предположить какое действие может вызывать подобную ошибку, то я смогу вытащить предполагаемый кусок кода. Где наиболее вероятна ошибка?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: eHadMultipleReaders. Причина?
« Ответ #5 : 03-03-2021, 21:14:20 »
Что может помочь? Код плагина слишком объемный, чтобы выкладывать полностью. Если предположить какое действие может вызывать подобную ошибку, то я смогу вытащить предполагаемый кусок кода. Где наиболее вероятна ошибка?
Еще раз. Причин может быть огромное количество. Это и отсутствие Transaction.Commit() и отсутствие блокировки документа и т.д. и т.п.
Могу лишь посоветовать выбросить из плагина всю логику фильтрования и просто всё из выбранных чертежей копировать в текущий. Если ошибки не будет, то проблема в логике фильтрования. Если ошибка будет, то тогда код будет небольшой и его можно будет анализировать. Кстати, а какой метод ты используешь для копирования из чертежа в чертеж?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: eHadMultipleReaders. Причина?
« Ответ #6 : 03-03-2021, 21:22:20 »
Вот этот
Код - C# [Выбрать]
  1. public static void SynchronizeDrawings()
  2.         {
  3.             List < string > fileNames = Drawing.SelectDrawings();
  4.             if ( fileNames.Count == 0 )
  5.             {
  6.                 return;
  7.             }
  8.  
  9.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  10.             Database acCurDb = acDoc.Database;
  11.             ObjectId idMSpace = ObjectId.Null;
  12.             using ( Transaction acTrans = acCurDb.TransactionManager.StartTransaction() )
  13.             {
  14.                 BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;
  15.                 idMSpace = acBlkTbl[ BlockTableRecord.ModelSpace ];
  16.                 acTrans.Commit();
  17.             }
  18.  
  19.             foreach ( string fileName in fileNames )
  20.             {
  21.                 using ( Database db = new Database(false, true) )
  22.                 {
  23.                     db.ReadDwgFile(fileName, FileOpenMode.OpenForReadAndAllShare, false, null);
  24.                     // string areaNumber = db.GetBuildingAreaNumber();
  25.  
  26.                     string areaNumber = null;
  27.                     try
  28.                     {
  29.                         areaNumber = db.GetBuildingAreaNumber();
  30.                     }
  31.                     catch ( NullReferenceException )
  32.                     {
  33.                        // Application.ShowAlertDialog("Set construction area number in source drawing by Drawing properties => subject");
  34.                     }
  35.  
  36.                     DeletePreviousEntities(areaNumber, acCurDb);
  37.  
  38.                     using ( IdMapping idMap = new IdMapping() )
  39.                     {
  40.                         db.WblockCloneObjects(Drawing.GetObjects(db), idMSpace, idMap, DuplicateRecordCloning.Ignore, false); // !!!!
  41.                     }
  42.  
  43.                     EntityProcessor.SetDynamicBlockProperty(acCurDb);
  44.  
  45.                     Logger logger = new Logger();
  46.                     logger.CreateSynchronizationLog(fileName);
  47.                 }
  48.             }
  49.         }

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: eHadMultipleReaders. Причина?
« Ответ #7 : 03-03-2021, 21:37:38 »
В это коде половина неизвестных функций. Выкинь их и просто оставь копирование. Посмотри результат. Если ошибки не будет - значит ошибка в этих функциях.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: eHadMultipleReaders. Причина?
« Ответ #8 : 03-03-2021, 22:39:18 »
Ошибка непостоянная - запускаю один раз работает, второй тоже, далее дохожу до какого-то 7,11,8 раза, всегда по-разному, и хватаю ошибку. Файлы указываю плагину поштучно, (хотя предусмотрена последовательная обработка из списка) это от ошибки не спасает.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: eHadMultipleReaders. Причина?
« Ответ #9 : 03-03-2021, 22:50:22 »
Atomohod,
Это никак не поможет найти ошибку. Впрочем это может и быть и баг в AutoCAD или в одном из приложений, загруженных в AutoCAD.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: eHadMultipleReaders. Причина?
« Ответ #10 : 03-03-2021, 23:04:21 »
Эта ошибка возникает, если забыли закрыть открытый объект/примитив. Часто это происходит в методе UpgradeOpen. Посмотри свой метод Drawing.GetObjects(db). Не оставляет ли он откытые объекты?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: eHadMultipleReaders. Причина?
« Ответ #11 : 04-03-2021, 08:19:27 »
Вроде бы не оставляет. Я открываю только на чтение и делаю коммит транзакции в завершение.
Код - C# [Выбрать]
  1.  public static ObjectIdCollection GetObjects(Database db)
  2.         {
  3.             ObjectIdCollection filteredEntities = new ObjectIdCollection();
  4.             List < Entity > entities = new List < Entity >();
  5.             try
  6.             {
  7.                 Transaction tr = db.TransactionManager.StartTransaction();
  8.                 using ( tr )
  9.                 {
  10.                     BlockTable bt = (BlockTable) tr.GetObject(db.BlockTableId, OpenMode.ForRead, false, false);
  11.                     BlockTableRecord btr = (BlockTableRecord) tr.GetObject(bt[ BlockTableRecord.ModelSpace ], OpenMode.ForRead);
  12.  
  13.                     foreach ( ObjectId item in btr )
  14.                     {
  15.                         Entity ent = (Entity) tr.GetObject(item, OpenMode.ForRead);
  16.  
  17.                         entities.Add(ent);
  18.                     }
  19.  
  20.                     tr.Commit();
  21.                 }
  22.  
  23.                 var boundaries = Selector.GetBoundariesObjectId(db);
  24.  
  25.                 var entitiesOnLayers = Selector.SelectEntityOnDesiredLayers(entities);
  26.                 foreach ( var ent in entitiesOnLayers )
  27.                 {
  28.                     if ( Selector.IsEntityValidForSync(ent, boundaries) )
  29.                     {
  30.                         filteredEntities.Add(ent.ObjectId);
  31.                     }
  32.                 }
  33.             }
  34.             catch ( Exception ex )
  35.             {
  36.                 Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage(ex.ToString());
  37.             }
  38.  
  39.             Marker.AttachXDataToSelectionSetObjects(ref filteredEntities, db);
  40.  
  41.             return filteredEntities;
  42.         }

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

  • ADN
  • *
  • Сообщений: 2531
  • Карма: 737
Re: eHadMultipleReaders. Причина?
« Ответ #12 : 04-03-2021, 09:46:52 »
Вроде бы не оставляет. Я открываю только на чтение и делаю коммит транзакции в завершение.
См. строки 4, 15, 20 и 25, 28, 30.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: eHadMultipleReaders. Причина?
« Ответ #13 : 04-03-2021, 10:36:04 »
Atomohod,
Ты делаешь еще хуже - пользуешься объектами, открытыми в транзакции после завершения транзакции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: eHadMultipleReaders. Причина?
« Ответ #14 : 04-03-2021, 15:04:15 »
То есть я не могу в одной транзакции получить нужные мне объекты, а обработать в другой? Вроде бы вложенные транзакции не запрещены. Почему тогда они не пригодны для обработки в рамках одной сессии? Я не понял.