Как обновить поля в таблице?

Автор Тема: Как обновить поля в таблице?  (Прочитано 41188 раз)

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

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Как обновить поля в таблице?
« Ответ #15 : 15-08-2016, 17:33:48 »
Маленькое уточнение, все приведенные ссылки оперируют методом setField, однако у Cell нет такого метода.





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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #16 : 15-08-2016, 17:37:32 »
Хотя, если я правильно помню, то действовать нужно через создание объекта Db.Field  и потом назначением этого объекта.. но могу и ошибаться.
Именно:
Добавление поля, содержащего данные другого примитива
Программное добавление поля к тексту
Добавление полей к атрибутам блока, вставленными в пространство модели
Спасибо, я, как раз, пробовал добавление поля в текст (без проблем), в атрибут блока (тоже без проблем). Но вот с таблицей...
Вроде как, алгоритм понятен:
Код - C# [Выбрать]
  1. var field = new Field() as Field;
  2. field.Evaluate();
  3. string fieldCode = "%<\\AcObjProp Object(%<\\_ObjId " + markaField + ">%).TextString>%";
  4. field.SetFieldCode(fieldCode);
Далее сложно соотнести полученное field с таблицей.
Пытался сделать всякие нерабочие штуки, например:
Код - C# [Выбрать]
  1. id = field.Id;
  2. table.SetFieldId(0, 0, id);
Код - C# [Выбрать]
  1. table.Cells[0, 0].SetValue(field.Value, ParseOption.ParseOptionNone);
Здесь field.Value, вообще, null не понимаю, почему.
Остальные варианты даже выкладывать не хочу, стыдно. В общем, генерировал 2 часа случайные решения. Ничего рабочего не нагенерировал.
Маленькое уточнение, все приведенные ссылки оперируют методом setField, однако у Cell нет такого метода.
Да, я уже заметил. Выше пытался окольными путями, но ничего пока не придумал.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #17 : 15-08-2016, 17:40:09 »
Маленькое уточнение, все приведенные ссылки оперируют методом setField, однако у Cell нет такого метода.
Зато у таблицы есть метод Table.SetFieldId
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #18 : 15-08-2016, 17:46:09 »
Зато у таблицы есть метод Table.SetFieldId
Еще есть
Код - C# [Выбрать]
  1. table.Cells[row,column].FieldId
Но пока ни то, ни это у меня не заработало. Готовлю простой блок и тестовый код c#. :)

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #19 : 15-08-2016, 18:30:24 »
В общем, задача следующая: необходимо создать в таблице поле, например, на атрибут блока. Прикрепляю тестовый чертеж и тестовый код (в комментариях помечено, где ничего не получается :( ).
Извините, вам запрещён просмотр содержимого спойлеров.

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #20 : 15-08-2016, 20:17:27 »
Ты что-то совсем меня запутал. Проверь этот код:

Код - C# [Выбрать]
  1. [CommandMethod("test")]
  2. public void Test()
  3. {
  4.   var doc = Application.DocumentManager.MdiActiveDocument;
  5.   if (doc == null)
  6.     return;
  7.   var db = doc.Database;
  8.   var ed = doc.Editor;
  9.   var id = ObjectId.Null;
  10.   var markaField = String.Empty;
  11.   using (doc.LockDocument())
  12.   {
  13.     // AppServ.DocumentExtension.GetAcadDocument(AppServCore.Application.DocumentManager.MdiActiveDocument);
  14.     using (var tr = db.TransactionManager.StartTransaction())
  15.     {
  16.       // Запрос на выбор объектов
  17.       var acSelSetPrompt = ed.GetSelection() as PromptSelectionResult;
  18.       // Если статус ОК, значит выбрано
  19.       if (acSelSetPrompt.Status == PromptStatus.OK)
  20.       {
  21.         var acSSet = acSelSetPrompt.Value;
  22.         foreach (SelectedObject acSelSetObj in acSSet)
  23.         {
  24.           // Проверочка
  25.           if (acSelSetObj != null)
  26.           {
  27.             var blkRef = tr.GetObject(acSelSetObj.ObjectId, OpenMode.ForWrite) as BlockReference;
  28.             if (blkRef != null && blkRef.IsDynamicBlock == true)
  29.             {
  30.               var attrColl = blkRef.AttributeCollection;
  31.               foreach (ObjectId obId in attrColl)
  32.               {
  33.                 var attrRef = tr.GetObject(obId, OpenMode.ForRead) as AttributeReference;
  34.                 if (attrRef.Tag == "МАРКА")
  35.                 {
  36.                   markaField = obId.OldIdPtr.ToString();
  37.                   // markaField = markaField.Trim(new char[] { '(', ')' });
  38.                 }
  39.               }
  40.             }
  41.           }
  42.         }
  43.       }
  44.       var tableStylesDictionary =
  45.           tr.GetObject(db.TableStyleDictionaryId, OpenMode.ForWrite) as DBDictionary;
  46.       var tableStyleId = ObjectId.Null;
  47.  
  48.       // Принимаем табличный стиль
  49.       var tableStyle = new TableStyle() as TableStyle;
  50.       tableStyleId = tableStylesDictionary.SetAt("Standard", tableStyle);
  51.       tr.AddNewlyCreatedDBObject(tableStyle, true);
  52.  
  53.       // Создаем таблицу
  54.       var table = new Table();
  55.       table.SetDatabaseDefaults();
  56.       table.TableStyle = tableStyleId;
  57.       table.SetSize(1, 1);
  58.       table.Rows[0].Height = 15;
  59.       table.Columns[0].Width = 15;
  60.       table.Cells[0, 0].TextHeight = 5;
  61.       var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
  62.       var modelSpace = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord;
  63.       modelSpace.AppendEntity(table);
  64.  
  65.       string fieldCode = "%<\\AcObjProp Object(%<\\_ObjId " + markaField + ">%).TextString>%";
  66.       table.SetTextString(0, 0, fieldCode);
  67.       table.GenerateLayout();
  68.  
  69.       // Точка вставки таблицы
  70.       var pr = ed.GetPoint("\nУкажите точку вставки таблицы: ") as PromptPointResult;
  71.       if (pr.Status == PromptStatus.OK)
  72.       {
  73.         table.Position = pr.Value;
  74.       }
  75.       tr.AddNewlyCreatedDBObject(table, true);
  76.       id = table.ObjectId;
  77.       tr.Commit();
  78.       ed.Regen();
  79.     }
  80.   }
  81.   //acdbEvaluateFields(ref id, 16);
  82. }

Думаю, что твоя проблема в том, что ты чего-то пытаешься делать с таблицей еще не добавив её в базу (т.е. не выполнив  modelSpace.AppendEntity(table))
P.S.: Остальные глупости в твоём коде я даже не обсуждаю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #21 : 15-08-2016, 20:44:51 »
Думаю, что твоя проблема в том, что ты чего-то пытаешься делать с таблицей еще не добавив её в базу (т.е. не выполнив  modelSpace.AppendEntity(table))
Именно! Все, что я делал до этого, работало бы, стоило только добавить таблицу в базу до создания поля. Вот же я лоханулся здоровски.  :(
И я не увидел в коде создания Field. Или ты думаешь, что простое добавление <...> к строке означает добавление поля???
Хоть что-то я делал правильно. ;) Ну и, кстати, с ObjectId проблем тоже не было.
А ведь именно поэтому ячейки таблицы нужно было прокликивать!
Все дело было в непонимании сути, непонимании того, где же должна таблица добавляться в базу.
Столько потрачено времени (но я параллельно тут столько тем охватил, что точно не зря:)).
Александр Ривилис, огромное спасибо Вам! Даже запутав немного, заставили попробовать создавать поля и в тексте, и в атрибутах, а также почитать много всего интересного. В общем, ценный урок. А, может, Вы спецом прикольнулись, а я тут пол дня пытался объект field запихнуть в таблицу??  :D
Извиняйте, что флуда тут развел и голову одурил.



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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #22 : 15-08-2016, 20:48:47 »
А, может, Вы спецом прикольнулись, а я тут пол дня пытался объект field запихнуть в таблицу??
Это я просто отвечал "одной левой", параллельно занимаясь другими вопросами.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Отмечено как Решение Максим Маркевич 16-08-2016, 00:45:56

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #23 : 15-08-2016, 20:59:40 »
Это я просто отвечал "одной левой", параллельно занимаясь другими вопросами.
Главное, что отвечали. Спасибо.
Александр Ривилис, я поторопился, на эмоциях, что код начал работать. Дело не в месте добавлении таблицу в базу. Прикрепляю код, где все остается, как у меня, и все работает!
Извините, вам запрещён просмотр содержимого спойлеров.
Все дело в одной строчке (я просто в шоке, как так!!!)
Вот она в Вашем коде:
Код - C# [Выбрать]
  1. table.SetTextString(0, 0, fieldCode);
Студия ее рассматривает, как устаревший вариант.
А вот она какой была в моем коде (новый вариант):
Код - C# [Выбрать]
  1. table.Cells[0, 0].SetValue(fieldCode, ParseOption.ParseOptionNone);
Так вот, второй вариант не работает, а первый, Ваш, работает даже без всяких сторонних обновлений полей типа того "не очень тривиального" кода.
Это что? Типа старая школа лучшая школа? )
Не могли бы Вы пояснить, как такое получается?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #24 : 15-08-2016, 22:26:56 »
Так вот, второй вариант не работает, а первый, Ваш, работает даже без всяких сторонних обновлений полей типа того "не очень тривиального" кода.
Это что? Типа старая школа лучшая школа? )
Интересно. Нужно отправить вопрос в ADN DevHelp. Пусть прояснят. Похоже на баг.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #25 : 15-08-2016, 22:36:40 »
Кстати в "новом стиле" тоже работает, но так:
Код - C# [Выбрать]
  1. table.Cells[0, 0].TextString = fieldCode;
Видимо SetValue не предназначено для работы с полями.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Как обновить поля в таблице?
« Ответ #26 : 16-08-2016, 07:34:55 »
Раз уж пошел такой разговор, то можно еще пояснение, как пользоваться вот этими методами из фрагмента кода, в справке об этом не нашел и поисковики  молчат:


С "новым" методом  разобрался, работает отлично, но есть свои приключения =о)
Извините, вам запрещён просмотр содержимого спойлеров.

Извините, вам запрещён просмотр содержимого спойлеров.
« Последнее редактирование: 16-08-2016, 09:26:28 от Boxa.Shu »

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #27 : 16-08-2016, 11:35:03 »
Кстати в "новом стиле" тоже работает, но так:
О, круто. Что-то я не заметил. Мне нравится такой вариант :)
С "новым" методом  разобрался, работает отлично, но есть свои приключения =о)
А можно код? Интересно, как так получается?

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #28 : 16-08-2016, 11:44:13 »
видео приключений
Я не смог рассмотреть "видео приключений" - очень нечеткое изображение. Просьба пользоваться Screencast (у меня в подписи).
Ну и код нужен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Владимир Шу

  • ADN Club
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Как обновить поля в таблице?
« Ответ #29 : 16-08-2016, 12:00:52 »
А можно код? Интересно, как так получается?
Он в картинке и в видео, вроде ничего нового там нет...
Я не смог рассмотреть "видео приключений" - очень нечеткое изображение.
https://i.gyazo.com/9228998198313046d5c53b0bdff23769.png увы, более четкого видео у меня не получается,
а  Autodesk Screencast у меня был, но он постоянно бесил в трее и не давал записывать в других программах, а потому был снесен.