AcDbRegAppTable(9) Invalid Entry

Автор Тема: AcDbRegAppTable(9) Invalid Entry  (Прочитано 14057 раз)

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

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
AcDbRegAppTable(9) Invalid Entry
« : 19-03-2021, 14:47:14 »
Здравствуйте, при проверке файла командой Аудит получаю сообщение AcDbRegAppTable(9) Invalid Entry.  Что в методе добавления свойств у меня не так? xData добавляю при помощи метода:
Код - C# [Выбрать]
  1. public static void AttachXDataToSelectionSetObjects(ref ObjectIdCollection idsCollection, Database acCurDb)
  2.         {
  3.             // Get the current database and start a transaction
  4.  
  5.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  6.  
  7.             string appName = "GreenSnake";
  8.             string xdataStr = acCurDb.GetBuildingAreaNumber();
  9.  
  10.             using ( Transaction acTrans = acCurDb.TransactionManager.StartTransaction() )
  11.             {
  12.                 // Request objects to be selected in the drawing area
  13.                 // PromptSelectionResult acSSPrompt = acDoc.Editor.GetSelection();
  14.  
  15.                 // If the prompt status is OK, objects were selected
  16.                 if ( idsCollection.Count > 0 )
  17.                 {
  18.                     // Open the Registered Applications table for read
  19.                     RegAppTable acRegAppTbl = acTrans.GetObject(acCurDb.RegAppTableId, OpenMode.ForRead) as RegAppTable;
  20.  
  21.                     // Check to see if the Registered Applications table record for the custom app exists
  22.                     if ( acRegAppTbl.Has(appName) == false )
  23.                     {
  24.                         using ( RegAppTableRecord acRegAppTblRec = new RegAppTableRecord() )
  25.                         {
  26.                             acRegAppTblRec.Name = appName;
  27.  
  28.                             acRegAppTbl.UpgradeOpen();
  29.                             acRegAppTbl.Add(acRegAppTblRec);
  30.                             acTrans.AddNewlyCreatedDBObject(acRegAppTblRec, true);
  31.                         }
  32.                     }
  33.  
  34.                     // Define the Xdata to add to each selected object
  35.                     using ( ResultBuffer rb = new ResultBuffer() )
  36.                     {
  37.                         rb.Add(new TypedValue((int) DxfCode.ExtendedDataRegAppName, appName));
  38.                         rb.Add(new TypedValue((int) DxfCode.ExtendedDataAsciiString, xdataStr));
  39.  
  40.                         // Step through the objects in the selection set
  41.                         foreach ( object acSSObj in idsCollection )
  42.                         {
  43.                             // Open the selected object for write
  44.                             Entity acEnt = acTrans.GetObject((ObjectId) acSSObj, OpenMode.ForWrite, false, true) as Entity;
  45.  
  46.                             // Append the extended data to each object
  47.                             acEnt.XData = rb;
  48.                         }
  49.                     }
  50.                 }
  51.  
  52.                 // Save the new object to the database
  53.                 acTrans.Commit();
  54.  
  55.                 // Dispose of the transaction
  56.             }
  57.         }


Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: AcDbRegAppTable(9) Invalid Entry
« Ответ #1 : 19-03-2021, 14:50:50 »
Может слишком длинные строки записываете в xData? Хотя вроде бы Audit их обрезает без сообщений об ошибках..

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDbRegAppTable(9) Invalid Entry
« Ответ #2 : 19-03-2021, 14:54:03 »
Atomohod,
Вместо:
Код - C# [Выбрать]
  1. using ( RegAppTableRecord acRegAppTblRec = new RegAppTableRecord() )
оставь:
Код - C# [Выбрать]
  1. RegAppTableRecord acRegAppTblRec = new RegAppTableRecord();
И не увлекайся using если не понимаешь как это работает.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: AcDbRegAppTable(9) Invalid Entry
« Ответ #3 : 19-03-2021, 14:58:39 »
И не увлекайся using если не понимаешь как это работает.
Насколько я понимаю эту конструкцию, using позволяет освободить ресурсы сразу после выхода из него и указывает сборщику мусора что объекты могут быть удалены. Я правильно понимаю?

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: AcDbRegAppTable(9) Invalid Entry
« Ответ #4 : 19-03-2021, 14:59:23 »
Может слишком длинные строки записываете в xData? Хотя вроде бы Audit их обрезает без сообщений об ошибках..
Не длинные, 18 символов.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDbRegAppTable(9) Invalid Entry
« Ответ #5 : 19-03-2021, 15:00:59 »
И не увлекайся using если не понимаешь как это работает.
Насколько я понимаю эту конструкцию, using позволяет освободить ресурсы сразу после выхода из него и указывает сборщику мусора что объекты могут быть удалены. Я правильно понимаю?
Не всегда, но более-менее правильно. И ты удаляешь только что созданную acRegAppTblRec.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: AcDbRegAppTable(9) Invalid Entry
« Ответ #6 : 19-03-2021, 15:05:54 »
без using я хватаю ошибку eHadMultipleReaders

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDbRegAppTable(9) Invalid Entry
« Ответ #7 : 19-03-2021, 15:06:49 »
без using я хватаю ошибку eHadMultipleReaders
Значит ищи ошибку в другом месте. Я так и не понял исправил ли ты всё, что было в предыдущей теме.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 822
  • Карма: 166
    • Мои плагины к Автокаду
Re: AcDbRegAppTable(9) Invalid Entry
« Ответ #8 : 19-03-2021, 15:09:44 »
Транзакция для того и создается, чтоб корректно удалить все свои объекты. ну то есть не только для этого, конечно. 
В данном коде объект приписан к транзакции, но тут же удален до вызова commit().
Я бы убрал UpgradeOpen() - он к работе с транзакциями не имеет отношения, а таблицу можно сразу открыть на запись.

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: AcDbRegAppTable(9) Invalid Entry
« Ответ #9 : 19-03-2021, 15:13:19 »
Я так и не понял исправил ли ты всё, что было в предыдущей теме.
Если речь об открытии объектов за пределами транзакции то да, я внес выполнение части методов внутрь транзакции чтобы объекты оставались валидными. Между методами передаю ObjectIdCollection вместо самих объектов. После этого eHadMultipleReaders до теперешнего удаления using я не получал.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDbRegAppTable(9) Invalid Entry
« Ответ #10 : 19-03-2021, 15:14:22 »
Я бы убрал UpgradeOpen() - он к работе с транзакциями не имеет отношения, а таблицу можно сразу открыть на запись.
Полностью согласен. Или заменить транзакцию на эмуляцию транзакции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDbRegAppTable(9) Invalid Entry
« Ответ #11 : 19-03-2021, 15:17:12 »
После этого eHadMultipleReaders до теперешнего удаления using я не получал.
Значит еще что-то осталось. Лучше раздели транзакцию на две - в одной транзакции создай RegAppTableRecord и добавь в базу (к RegAppTable). А в другой добавь расширенные данные к объектам.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: AcDbRegAppTable(9) Invalid Entry
« Ответ #12 : 19-03-2021, 16:59:15 »
Если речь об открытии объектов за пределами транзакции то да, я внес выполнение части методов внутрь транзакции чтобы объекты оставались валидными.
Вообще-то у нас принято ставить точку в созданной теме, а та тема так и осталась незаконченной без отметки о решении....
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: AcDbRegAppTable(9) Invalid Entry
« Ответ #13 : 19-03-2021, 21:49:26 »
, а та тема так и осталась незаконченной без отметки о решении....
Исправился

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

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: AcDbRegAppTable(9) Invalid Entry
« Ответ #14 : 08-04-2021, 23:10:51 »
Значит еще что-то осталось. Лучше раздели транзакцию на две - в одной транзакции создай RegAppTableRecord и добавь в базу (к RegAppTable). А в другой добавь расширенные данные к объектам.

Я внес правки, но это не сработало, по-прежнему

AcDbRegAppTable(9)                Invalid Entry
AcDbRegAppTable(9)                was not repaired.

Код - C# [Выбрать]
  1.  public static void AttachXDataToSelectionSetObjects(ref ObjectIdCollection idsCollection, Database acCurDb)
  2.         {        
  3.  
  4.             string appName = "GreenSnake";
  5.             string xdataStr = acCurDb.GetBuildingAreaNumber();
  6.  
  7.             Transaction acTrans;
  8.             using ( acTrans = acCurDb.TransactionManager.StartTransaction() )
  9.             {
  10.                            
  11.                 if (idsCollection.Count > 0)
  12.                 {
  13.                     // Open the Registered Applications table for read
  14.                     RegAppTable acRegAppTbl = acTrans.GetObject(acCurDb.RegAppTableId, OpenMode.ForWrite) as RegAppTable;
  15.  
  16.                     // Check to see if the Registered Applications table record for the custom app exists
  17.                     if (acRegAppTbl.Has(appName) == false)
  18.                     {
  19.                         RegAppTableRecord acRegAppTblRec = new RegAppTableRecord();
  20.                         acRegAppTblRec.Name = appName;                      
  21.                         acRegAppTbl.Add(acRegAppTblRec);
  22.                         acTrans.AddNewlyCreatedDBObject(acRegAppTblRec, true);
  23.  
  24.                     }
  25.                 }
  26.                 acTrans.Commit();
  27.             }
  28.  
  29.             Transaction acTrans2;
  30.             using ( acTrans2 = acCurDb.TransactionManager.StartTransaction() )
  31.             {
  32.                 // Define the Xdata to add to each selected object
  33.                 using (ResultBuffer rb = new ResultBuffer())
  34.                 {
  35.                     rb.Add(new TypedValue((int)DxfCode.ExtendedDataRegAppName, appName));
  36.                     rb.Add(new TypedValue((int)DxfCode.ExtendedDataAsciiString, xdataStr));
  37.  
  38.                  
  39.                     foreach (object acSSObj in idsCollection)
  40.                     {
  41.                        
  42.                         Entity acEnt = acTrans2.GetObject((ObjectId)acSSObj, OpenMode.ForWrite, false, true) as Entity;
  43.  
  44.                         // Append the extended data to each object
  45.                         acEnt.XData = rb;
  46.                     }
  47.                 }
  48.                 acTrans2.Commit();
  49.             }
  50.  
  51.  
  52.         }


Что можно еще попробовать для устранения ошибки?