Audit vs recover

Автор Тема: Audit vs recover  (Прочитано 7912 раз)

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Audit vs recover
« : 26-04-2021, 11:46:10 »
Здравствуйте.
Столкнулся со странным поведением четрежа:
Провожу AUDIT - ошибок нет.
Сохраняю чертеж. Закрываю его.
При открытии получаю предупреждение что у меня в чертеже больше сотни ошибок, нужно восстановление. Но чертеж все-таки открывается.
При запуске восстановления получаю следующие сообщения:
"Reading handle 44FB1 object type AcDbPolyline      Error 34 (eWrongObjectType)                       Object discarded" несколько десятков штук,
"Pass 1 273700  objects audited
AcDbSortentsTable(44DDD)          Error for Entry (44E26) eInvalidInput         was Removed. AcDbSortentsTable(44DDD)" около сотни штук.

Как выходит так что аудит и восстановление противоречат друг другу? Что может привести к повреждению обычной полилинии в чертеже?



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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Audit vs recover
« Ответ #1 : 26-04-2021, 14:37:23 »
Как выходит так что аудит и восстановление противоречат друг другу?
Они работают по-разному. Кроме того у тебя чертеж может портится при сохранении. Особенно если есть какое-то приложение, которое обрабатывает событие сохранения файла. Ошибки у тебя в чертеже какие-то уж очень плохие. Если перепутаны классы объектов, то это совсем плохо...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Audit vs recover
« Ответ #2 : 26-04-2021, 15:31:26 »
Если перепутаны классы объектов, то это совсем плохо...
Что может их перепутать? Событие сохранения у меня нигде не используется.

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Audit vs recover
« Ответ #3 : 26-04-2021, 15:36:18 »
Есть метод, меняющий порядок следования маскировки. Как я понимаю ошибка AcDbSortentsTable(44DDD)          Error for Entry (44E26) eInvalidInput связана с порядком следования объектов. Но как он может испортить /переназначить классы объектов я ума не приложу.
Код - C# [Выбрать]
  1.  private static ObjectIdCollection MoveWipeoutsToBottom(Transaction tr, ObjectIdCollection ids)
  2.         {                  
  3.             ObjectIdCollection brIds = new ObjectIdCollection();
  4.            
  5.             RXClass wc = RXObject.GetClass(typeof(Wipeout));
  6.  
  7.             // Take a copy of the IDs passed in, as we'll modify the
  8.  
  9.             // original list for the caller to use
  10.             ObjectId[] btrIds = new ObjectId[ids.Count];
  11.             ids.CopyTo(btrIds, 0);
  12.  
  13.             // Loop through the blocks passed in, opening each one
  14.             foreach (ObjectId btrId in btrIds)
  15.             {
  16.                 BlockTableRecord btr = (BlockTableRecord)tr.GetObject(btrId, OpenMode.ForWrite);
  17.  
  18.                 // Collect the wipeouts in the block
  19.                 ObjectIdCollection wipeouts = new ObjectIdCollection();
  20.                 foreach (ObjectId id in btr)
  21.                 {
  22.                     Entity ent = (Entity)tr.GetObject(id, OpenMode.ForRead);
  23.                     if (ent.GetRXClass().IsDerivedFrom(wc))
  24.                     {
  25.                         wipeouts.Add(id);
  26.                     }
  27.                 }
  28.  
  29.                 // Move the collected wipeouts to the bottom
  30.                 if (wipeouts.Count > 0)
  31.                 {
  32.                     // Modify the draw order table, if we have wipepouts
  33.                     DrawOrderTable dot = (DrawOrderTable)tr.GetObject(btr.DrawOrderTableId, OpenMode.ForWrite);
  34.                     dot.MoveToBottom(wipeouts);
  35.  
  36.                     // Collect the block references to this block, to pass
  37.  
  38.                     // back to the calling function for updating
  39.                     ObjectIdCollection btrBrIds = btr.GetBlockReferenceIds(false, false);
  40.                     foreach (ObjectId btrBrId in btrBrIds)
  41.                     {
  42.                         brIds.Add(btrBrId);
  43.                     }
  44.                 }
  45.                 else
  46.                 {
  47.                     ids.Remove(btrId);
  48.                 }
  49.             }
  50.  
  51.             return brIds;
  52.         }

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Audit vs recover
« Ответ #4 : 26-04-2021, 15:41:48 »
Они работают по-разному
То есть верить аудиту нельзя, его отсутствие ошибок ничего не значит и все нужно прогонять через восстановление?

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Audit vs recover
« Ответ #5 : 26-04-2021, 20:35:17 »
Atomohod,
Даже Recover не всегда находит ошибки в чертеже. Если ты помнишь, то ты уже выкладывал чертеж, в котором ни AUDIT, ни RECOVER ошибок не находил, но при сохранении этого чертежа были сообщения об ошибке про Multiply Owned Object (множественные владельцы объекта), что является грубейшей ошибкой - у объекта может быть только один владелец.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13886
  • Карма: 1788
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Audit vs recover
« Ответ #6 : 26-04-2021, 20:45:26 »
Вот тут была ошибка с тем же результатом: https://adn-cis.org/forum/index.php?topic=9083.0
Здесь сообщения об ошибке: https://adn-cis.org/forum/index.php?topic=9083.msg37102#msg37102
Причина была в незакрытой транзакции: https://adn-cis.org/forum/index.php?topic=9083.msg37118#msg37118
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Audit vs recover
« Ответ #7 : 27-04-2021, 08:40:51 »
Причина была в незакрытой транзакции:
Значит у меня в чем-то другом. Проверил обе транзакции, обе закрыты.
Код - C# [Выбрать]
  1. public static void AttachXDataToSelectionSetObjects(ObjectIdCollection ids, Database db, string region)
  2.         {
  3.             string appName = "GreenSnake";
  4.             // string xdataStr = db.SummaryInfo.Subject;
  5.             if (ids.Count > 0)
  6.             {
  7.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  8.                 {
  9.                     RegAppTable regTab = tr.GetObject(db.RegAppTableId, OpenMode.ForWrite) as RegAppTable;
  10.                     if (!regTab.Has(appName))
  11.                     {
  12.                         RegAppTableRecord regTabRec = new RegAppTableRecord();
  13.                         regTabRec.Name = appName;
  14.                         regTab.Add(regTabRec);
  15.                         tr.AddNewlyCreatedDBObject(regTabRec, true);
  16.                     }
  17.                     tr.Commit();
  18.                 }
  19.                 using (Transaction tr = db.TransactionManager.StartTransaction())
  20.                 {
  21.                     using (ResultBuffer rb = new ResultBuffer())
  22.                     {
  23.                         rb.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));
  24.                         rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, region));
  25.  
  26.                         foreach (ObjectId id in ids)
  27.                         {
  28.                             Entity ent = tr.GetObject(id, OpenMode.ForWrite) as Entity;
  29.                             if (ent != null) ent.XData = rb;
  30.                         }
  31.                     }
  32.                     tr.Commit();
  33.                 }
  34.             }
  35.         }