Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Atomohod от 26-04-2021, 11:46:10

Название: Audit vs recover
Отправлено: Atomohod от 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)" около сотни штук.

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


Название: Re: Audit vs recover
Отправлено: Александр Ривилис от 26-04-2021, 14:37:23
Как выходит так что аудит и восстановление противоречат друг другу?
Они работают по-разному. Кроме того у тебя чертеж может портится при сохранении. Особенно если есть какое-то приложение, которое обрабатывает событие сохранения файла. Ошибки у тебя в чертеже какие-то уж очень плохие. Если перепутаны классы объектов, то это совсем плохо...
Название: Re: Audit vs recover
Отправлено: Atomohod от 26-04-2021, 15:31:26
Если перепутаны классы объектов, то это совсем плохо...
Что может их перепутать? Событие сохранения у меня нигде не используется.
Название: Re: Audit vs recover
Отправлено: Atomohod от 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.         }
Название: Re: Audit vs recover
Отправлено: Atomohod от 26-04-2021, 15:41:48
Они работают по-разному
То есть верить аудиту нельзя, его отсутствие ошибок ничего не значит и все нужно прогонять через восстановление?
Название: Re: Audit vs recover
Отправлено: Александр Ривилис от 26-04-2021, 20:35:17
Atomohod,
Даже Recover не всегда находит ошибки в чертеже. Если ты помнишь, то ты уже выкладывал чертеж, в котором ни AUDIT, ни RECOVER ошибок не находил, но при сохранении этого чертежа были сообщения об ошибке про Multiply Owned Object (множественные владельцы объекта), что является грубейшей ошибкой - у объекта может быть только один владелец.
Название: Re: Audit vs recover
Отправлено: Александр Ривилис от 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
Название: Re: Audit vs recover
Отправлено: Atomohod от 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.         }