Записать объектные данные

Автор Тема: Записать объектные данные  (Прочитано 416 раз)

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

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

  • Administrator
  • *****
  • Сообщений: 6827
  • Карма: 753
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Записать объектные данные
« Ответ #15 : 07-11-2017, 14:00:44 »
Мне кажется, что этот пример актуальнее и точнее: http://jprdintprev.autodesk.com/adn/servlet/devnote?siteID=4814862&id=17435757&linkID=4900588
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 60
  • Карма: 1
Re: Записать объектные данные
« Ответ #16 : 07-11-2017, 19:49:50 »
Исключил вообще строку с вызовом ObjectData.Records. Не помогло. Попробую другой пример (http://jprdintprev.autodesk.com/adn/servlet/devnote?siteID=4814862&id=17435757&linkID=4900588)

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 60
  • Карма: 1
Re: Записать объектные данные
« Ответ #17 : 07-11-2017, 20:41:34 »
Немного переработал функцию, но только в части обработки массива, все остальное взял от ADN.
Код - vb.net [Выбрать]
  1. Public Shared Function FuncAddOD2(ByVal DataArray(,) As String, ByVal tableOBJ As ObjectData.Table, ByVal objID As ObjectId) As Boolean
  2.         FuncAddOD2 = False
  3.         If IsArray(DataArray) = False Then Exit Function
  4.         Using lk As DocumentLock = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument.LockDocument()
  5.             Try
  6.                 For k As Integer = 0 To DataArray.GetUpperBound(1)
  7.                     Dim NameFl As String = DataArray(0, k) 'имя поля из массива
  8.                     Dim NewVAl As String = DataArray(1, k) 'значение которое необходимо записать
  9.                     Using odRecords As ObjectData.Records = tableOBJ.GetObjectTableRecords(0, objID, Constants.OpenMode.OpenForWrite, True)
  10.                         'Dim odRecord As ObjectData.Record = odRecords.Item(0)
  11.                         Dim odRecord As ObjectData.Record = Autodesk.Gis.Map.ObjectData.Record.Create()
  12.                         tableOBJ.InitRecord(odRecord)
  13.                         tableOBJ.AddRecord(odRecord, objID)
  14.                     End Using
  15.                     Using odRecords As ObjectData.Records = tableOBJ.GetObjectTableRecords(0, objID, Constants.OpenMode.OpenForWrite, True)
  16.                         For Each rec As Record In odRecords
  17.                             For i As Integer = 0 To rec.Count - 1
  18.                                 Dim tblDefs As FieldDefinitions = tableOBJ.FieldDefinitions
  19.                                 Dim column As FieldDefinition = Nothing
  20.                                 column = tblDefs(i)
  21.                                 If NameFl Like column.Name Then
  22.                                     rec(i).Assign(NewVAl)
  23.                                     odRecords.UpdateRecord(rec)
  24.                                 End If
  25.                             Next i
  26.                         Next
  27.                     End Using
  28.                 Next k
  29.             Catch ex As MapException
  30.             Catch ex As System.AccessViolationException
  31.             End Try
  32.         End Using
  33.         FuncAddOD2 = True
  34.     End Function
Не помогает. Все тоже самое. На объеме 1300 объектов не работает. Вводишь MsgBox со счетчиком, и все нормально. Такое ощущение что что-то не успевает обновлятся

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

  • Administrator
  • *****
  • Сообщений: 6827
  • Карма: 753
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Записать объектные данные
« Ответ #18 : 07-11-2017, 20:44:00 »
            Catch ex As MapException
            Catch ex As System.AccessViolationException
            End Try
Вставь здесь печать отладочной информации. Хочу убедиться, что нет исключений.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN
  • *
  • Сообщений: 1236
  • Карма: 236
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Re: Записать объектные данные
« Ответ #19 : 07-11-2017, 21:14:37 »
Попробуй без транзакций открывать таблицу и объекты.
Вообще, ещё раз обращаю внимание, что проблема может быть не в этом методе.

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 60
  • Карма: 1
Re: Записать объектные данные
« Ответ #20 : 07-11-2017, 21:55:05 »
А как это сделать? Информация не выводится, либо фатальная ошибка либо вот это (это в режиме отладки). Проблема все таки наверное в этой функции потому что я повторяю если ввести в код MSgBox и нажать Enter 1300 раз то программа дорабатывает до конца, как надо. Транзакция закрыта. Хотя перехват ошибок введен

Оффлайн trir

  • ADN Club
  • ***
  • Сообщений: 153
  • Карма: 12
Re: Записать объектные данные
« Ответ #21 : 08-11-2017, 06:35:48 »
почему у меня никаких проблем не возникает
Код - C# [Выбрать]
  1.         public void AddAttr(ObjectId wid, Data.MyRecord wr, Autodesk.Gis.Map.ObjectData.Table wTbl)
  2.         {
  3.             AppServ.Document acDoc = AppServ.Application.DocumentManager.MdiActiveDocument;
  4.             using (AppServ.DocumentLock acLckDoc = acDoc.LockDocument())
  5.             {
  6.                 using (Transaction acTrans = acDoc.Database.TransactionManager.StartTransaction())
  7.                 {
  8.                     using (Record odRecord = Record.Create())
  9.                     {
  10.                         wTbl.InitRecord(odRecord);
  11.                         FieldDefinition fdef;
  12.                         Data.FieldValue fval;
  13.                         for (int i = 0; i < wTbl.FieldDefinitions.Count; i++)
  14.                         {
  15.                             fdef = wTbl.FieldDefinitions[i];
  16.                             fval = wr.SearchField(fdef.Name);
  17.                             if (fval != null)
  18.                             {
  19.                                 if (!fval.IsGeom)
  20.                                 {
  21.                                     odRecord[i].Assign(fval.GetString());
  22.                                 }
  23.                             }
  24.                         }
  25.                         wTbl.AddRecord(odRecord, wid);
  26.                         acTrans.Commit();
  27.                     }                    
  28.                 }
  29.             }
  30.         }
1758 записей - полёт нормальный
« Последнее редактирование: 08-11-2017, 07:50:40 от trir »

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 60
  • Карма: 1
Re: Записать объектные данные
« Ответ #22 : 08-11-2017, 08:56:24 »
А как Data.MyRecord wr получаем? Можно по подробнее, может мне действительно не стоит массивом пользоваться?

Оффлайн trir

  • ADN Club
  • ***
  • Сообщений: 153
  • Карма: 12
Re: Записать объектные данные
« Ответ #23 : 08-11-2017, 08:58:31 »
я уже приводил ссылку на github
но дело не в массиве

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

  • ADN
  • *
  • Сообщений: 1236
  • Карма: 236
  • LISP/C#, AutoCAD/Civil 3D
  • Skype: zagor_dmtr
Re: Записать объектные данные
« Ответ #24 : 08-11-2017, 13:34:44 »
Возможно, причина в том, что у trir за одну транзакцию добавляется только одна запись, а не 1000 сразу.

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 60
  • Карма: 1
Re: Записать объектные данные
« Ответ #25 : 08-11-2017, 14:10:49 »
Спасибо. Буду пробовать. Надеюсь trir добавлял несколько записей в один примитив, а не одну запись в один примитив

Оффлайн trir

  • ADN Club
  • ***
  • Сообщений: 153
  • Карма: 12
Re: Записать объектные данные
« Ответ #26 : 08-11-2017, 14:12:17 »
Цитировать
добавлял несколько записей в один примитив
зачем?

Оффлайн Захаров МаксимАвтор темы

  • ADN OPEN
  • **
  • Сообщений: 60
  • Карма: 1
Re: Записать объектные данные
« Ответ #27 : 08-11-2017, 20:57:06 »
Всем спасибо. Вроде пока все работает. Натолкнула идея trir и Дмитрия добавлять по одной записи в примитив, а не все сразу. Правда я использовал образец от ADN который Александр Ривилис подсказал.
А может я строки
Код - vb.net [Выбрать]
  1.  Dim mapApp As MapApplication = HostMapApplicationServices.Application
  2.  Dim activeProject As Project.ProjectModel = mapApp.ActiveProject
  3.  Dim tableList As ObjectData.Tables = activeProject.ODTables 'забираем таблицы
  4.  Dim tableOBJ As ObjectData.Table = mapApp.ActiveProject.ODTables.Item("CADASTRAL_PARCEL")
за пределы цикла вывел.
Раньше у меня было так создавался по координатам примитив (полилиния) затем открывалась таблица (4 строка). В любом случае по эксперементирую. А результат такой (это к вопросу зачем в один примитив несколько записей добавлять). Значения полей будут конечно же другими.



Оффлайн trir

  • ADN Club
  • ***
  • Сообщений: 153
  • Карма: 12
Re: Записать объектные данные
« Ответ #28 : 09-11-2017, 04:37:18 »
Цитировать
А результат такой (это к вопросу зачем в один примитив несколько записей добавлять).
это одна запись
ты путаешь запись и поля