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

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

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

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Всем привет. Проблема следующая: создаю таблицу с полями, ссылающимися на атрибуты блока, вставляю таблицу в чертеж, а поля не обновляются. Для того, чтобы их обновить, необходимо зайти в ячейку таблицы, затем выполнить _regen. Может, кто-нибудь сталкивался с подобной проблемой и знает, как ее решить программно. Заранее, спасибо за помощь.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #2 : 15-08-2016, 04:04:45 »
http://adn-cis.org/kak-obnovit-vyibrannyie-polya-ne-vyipolnyaya-regeneracziyu-vsego-chertezha.html
Да, я тоже нашел этот "не очень тривиальный" :) код в теме http://adn-cis.org/forum/index.php?topic=7086.msg20446#msg20446.
Но у меня он не работает! С его вставкой не может быть проблем - копипаст.
Далее, я его запускаю в командном методе, где формирую таблицу:
Код - C# [Выбрать]
  1. ObjectId id = tableSpec.ObjectId;          
  2. acdbEvaluateFields(ref id, 16);
И ничего не обновляется. :-\
Может ли быть такое, что он не работает на таблицах?

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #3 : 15-08-2016, 09:12:28 »
Надеюсь ты вызываешь этот код после завершения транзакции, в которой создаёшь таблицу? Выложи чертеж с этой таблицей - посмотрю.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #4 : 15-08-2016, 11:20:26 »
Надеюсь ты вызываешь этот код после завершения транзакции, в которой создаёшь таблицу? Выложи чертеж с этой таблицей - посмотрю.
Да, но я пробовал по-всякому.
Если поля не обновить (зайти в ячейку, а потом нажать реген) и сохранить чертеж, потом зайти в него снова, то они уже не работают.
Также прикреплю .dll [CommandMethod("spfr")], так, наверняка, будет наглядней.
Сборка создана для AutoCAD 2016x64, также сработает и в AutoCAD 2017x64.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #5 : 15-08-2016, 11:39:12 »
Что-то я не понял на что у тебя ссылается это поле:

Понятно, что в такой ситуации оно не обновится. Похоже, ты указал неправильное значение для ObjectId в поле.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #6 : 15-08-2016, 12:03:49 »
Понятно, что в такой ситуации оно не обновится. Похоже, ты указал неправильное значение для ObjectId в поле.
C ObjectId все в порядке. Как я понял, там его получить можно миллионом способов и это легко отследить в режиме отладки.
Что-то я не понял на что у тебя ссылается это поле:
В этом и суть, оно не идентифицируется сразу.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #7 : 15-08-2016, 12:12:09 »
C ObjectId все в порядке.
Нет. Сравни значения:




Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #8 : 15-08-2016, 12:36:40 »
Нет. Сравни значения:
Так Id ведь меняются после закрытия/открытия чертежа (насколько я понимаю). Понятно дело, если поле не обновить сразу, оно потом "не свяжется" и не будет работать.

PS. На всякий случай, еще раз прикрепляю чертеж.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #9 : 15-08-2016, 13:37:20 »
Так Id ведь меняются после закрытия/открытия чертежа (насколько я понимаю). Понятно дело, если поле не обновить сразу, оно потом "не свяжется" и не будет работать.
Если поле сразу содержит правильный ObjecId, то после закрытия и открытия чертежа ObjectId будут новые (могут быть новыми), но одинаковыми!
Похоже, что ты что-то не учитываешь при добавлении поля. Во всяком случае и команда _UPDATEFIELD не понимает твои поля. Соответственно и код, который я привёл и ты пытаешься использовать поля обновлять не будет.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #10 : 15-08-2016, 14:39:15 »
Если поле сразу содержит правильный ObjecId, то после закрытия и открытия чертежа ObjectId будут новые (могут быть новыми), но одинаковыми!
Посмотрите, пожалуйста, видео из поста #8. Если бы Id были не те, то ничего, вообще, бы не работало.
Похоже, что ты что-то не учитываешь при добавлении поля.
Сейчас покажу процесс создания:

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #11 : 15-08-2016, 14:52:23 »
Видео ты не отделаешься. Если нужна помощь, то:
1) Сделай простой блок с одним атрибутом MARKA и выложи этот файл
2) Сделай тестовый C#-проект, который создаёт простейшую таблицу и заносит в неё поле с ссылкой на атрибут MARKA. И выложи этот проект.
И я не увидел в коде создания Field. Или ты думаешь, что простое добавление <...> к строке означает добавление поля???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #12 : 15-08-2016, 15:02:23 »
Или ты думаешь, что простое добавление <...> к строке означает добавление поля???
Да, до этого момента так и думал. Делал так в VBA. И еще вот тут http://through-the-interface.typepad.com/through_the_interface/2007/06/embedding_field.html увидел обычную строку и дальше копать не стал.
Еще и флуд развел тут. Извиняюсь. :-\
Пошел разбираться с созданием полей.
Если не разберусь, то сделаю заготовочку из простого блока и тестового c# проекта. Спасибо.

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Как обновить поля в таблице?
« Ответ #13 : 15-08-2016, 16:32:38 »
http://through-the-interface.typepad.com/through_the_interface/2007/06/embedding_field.html
Оно?

Хотя, если я правильно помню, то действовать нужно через создание объекта Db.Field  и потом назначением этого объекта.. но могу и ошибаться.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

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

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

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
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
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #28 : 16-08-2016, 11:44:13 »
видео приключений
Я не смог рассмотреть "видео приключений" - очень нечеткое изображение. Просьба пользоваться Screencast (у меня в подписи).
Ну и код нужен.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

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

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #30 : 16-08-2016, 12:18:10 »
Он в картинке и в видео, вроде ничего нового там нет...
Как менять режимы видео я знаю, но твоё видео у меня не переключается на разрешение > 360.





Поэтому я ничего не понял. Ни какой код выполняется, ни какие результаты ты получил. Но если тебе это не важно, то и мне тоже...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Как обновить поля в таблице?
« Ответ #31 : 16-08-2016, 12:31:37 »
Как менять режимы видео я знаю, но твоё видео у меня не переключается на разрешение > 360.
Видимо это особенность работы Youtube.
Результаты были добавления обоих полей в таблицу, двумя способами, через строку и через объект поле.
А приключение заключалось в том, что информация с этих полей была видна только в панели свойств, а на чертеже ее не было.
В любом случае это теперь действительно не важно, т.к. эту особенность удалось обойти и теперь все работает и обновляется сразу.

ЗЫ.
evthisrel спасибо, было интересно.


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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #32 : 16-08-2016, 12:39:43 »
Для того, чтобы у Field был не нулевой ObjectId его следует добавить в базу. И вот тут начинается самое интересное. Table - это наследник от BlockReference. Каждый текст в ячейке - это MText в BlockTableRecord, на который ссылается наш BlockReference и он же Table. Причем как я понял прямой связи нет, т.е. нельзя определить по номеру ячейки какой MText ей соответствует и наоборот (во всяком случае в публичном API). Так вот Field добавляется к Extension Dictionary этой MText (точнее в словарь ACAD_FIELD) и при этом получается ObjectId, который можно методом SetFieldId добавить к ячейке таблицы. Как-то так...
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Как обновить поля в таблице?
« Ответ #33 : 16-08-2016, 12:50:25 »
Для того, чтобы у Field был не нулевой ObjectId его следует добавить в базу. И вот тут начинается самое интересное. Table - это наследник от BlockReference. Каждый текст в ячейке - это MText в BlockTableRecord, на который ссылается наш BlockReference и он же Table. Причем как я понял прямой связи нет, т.е. нельзя определить по номеру ячейки какой MText ей соответствует и наоборот (во всяком случае в публичном API). Так вот Field добавляется к Extension Dictionary этой MText (точнее в словарь ACAD_FIELD) и при этом получается ObjectId, который можно методом SetFieldId добавить к ячейке таблицы. Как-то так...

И я так думал, только оно не захотело работать, совсем. =о(

Я код не публикую не потому, что мне жалко, а потому что задачка действительно была интересна, в инете примеров нет и решение у нее простое до очевидности. Не хочу портить удовольствие от решения. Тем более что это факультатив и решение в этой теме уже отмечено.


Извините, вам запрещён просмотр содержимого спойлеров.

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #34 : 16-08-2016, 12:53:11 »
Он в картинке и в видео, вроде ничего нового там нет...
Я не смог создать так поле, чтобы получить его Id (entFieldId в твоем коде). Поэтому и хочу посмотреть, а в видео этого не видно.
Как менять режимы видео я знаю, но твоё видео у меня не переключается на разрешение > 360.
У меня все ок:

ЗЫ.
evthisrel спасибо, было интересно.
Да на здоровье.))
Для того, чтобы у Field был не нулевой ObjectId его следует добавить в базу.
Это я понимаю, но как его добавить в базу?
Код - C# [Выбрать]
  1. string fieldCode = "%<\\AcObjProp Object(%<\\_ObjId " + markaField + ">%).TextString>%";
  2. var field = new Field(fieldCode);
  3. field.Evaluate();
  4. //tr.AddNewlyCreatedDBObject(field, true); здесь срабатывает исключение
  5. // соответственно ID получить не получается оно {0}
  6. ObjectId fieldId = field.ObjectId;
  7. // ну а здесь понятно, что с ID {0} никакого поля не будет создано
  8. table.SetFieldId(0, 0, fieldId);
И вот тут начинается самое интересное. Table - это наследник от BlockReference. Каждый текст в ячейке - это MText в BlockTableRecord, на который ссылается наш BlockReference и он же Table. Причем как я понял прямой связи нет, т.е. нельзя определить по номеру ячейки какой MText ей соответствует и наоборот (во всяком случае в публичном API). Так вот Field добавляется к Extension Dictionary этой MText (точнее в словарь ACAD_FIELD) и при этом получается ObjectId, который можно методом SetFieldId добавить к ячейке таблицы. Как-то так...
Кажется, иерархия понятна, но..
все равно, не ясно, как добавить поле в словарь ACAD_FIELD, чтобы оно обрело ObjectId.
Я код не публикую не потому, что мне жалко, а потому что задачка действительно была интересна, в инете примеров нет и решение у нее простое до очевидности. Не хочу портить удовольствие от решения. Тем более что это факультатив и решение в этой теме уже отмечено.
Понял тебя. Хорошо, покапаюсь сам, когда будет время.
Насчет отмеченного решения, у меня так выходит, что созданные темы достаточно динамично себя ведут, поэтому отмечаю первое, что решило проблему самой темы. Хотя, как видно выше, может вытекать еще несколько веток задач и решений. Надо создателям форума подумать о концепции ответвленных решений  ;)

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #35 : 16-08-2016, 13:05:22 »
адо создателям форума подумать о концепции ответвленных решений  ;)
К сожалению в плагине Решение для этого движка форума не предусмотрено несколько решений в одной теме. Так что имеем то, что имеем. Заниматься переделками плагина и движка мы не будем - у нас другая цель.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #36 : 16-08-2016, 13:11:06 »
все равно, не ясно, как добавить поле в словарь ACAD_FIELD, чтобы оно обрело ObjectId.
Ну это то как раз просто. Тут важно знать только к какому примитиву следует добавлять поле. Обрати внимание, что метод DBObject.SetField возвращает ObjectId. Этот метод как раз и создает в Extension Dictionary этого объекта/примитива словарь ACAD_FIELD и добавляет к нему переданное поле.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #37 : 16-08-2016, 13:49:17 »
Вот он, второй метод добавления поля в таблицу через объект поле:
Код - C# [Выбрать]
  1. string fieldCode = "%<\\AcObjProp Object(%<\\_ObjId " + markaField + ">%).TextString>%";
  2. var field = new Field(fieldCode);
  3. field.Evaluate();
  4. id = table.SetField(field); // Спасибо Александру Ривилису за подсказку, а Вохе.Shu за вызов :D
  5. tr.AddNewlyCreatedDBObject(field, true);
  6. table.Cells[0, 0].FieldId = id;

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #38 : 16-08-2016, 13:50:59 »
Вот он, второй метод добавления поля в таблицу через объект поле:
И что нормально работает?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #39 : 16-08-2016, 13:56:09 »
И что нормально работает?
Абсолютли :)


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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Как обновить поля в таблице?
« Ответ #40 : 16-08-2016, 14:32:09 »
Абсолютли :)
Подтверждаю! И даже приключений из моего видео не наблюдается. Супер. =о)

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #41 : 16-08-2016, 14:51:36 »
Подтверждаю! И даже приключений из моего видео не наблюдается. Супер. =о)
:)
Также хотелось бы подвести итог, что данный метод крайне неудобен и что был найден только как решение задачки. То есть при его помощи будет очень неудобно/невозможно (не пробовал - возможно, нужно будет создавать поле состоящее из супер комбинированного fieldCode - надо пробовать) "суммировать" поля и поля или поля и строки в ячейке таблицы. То есть, надо использовать "строчный" метод (имхо). Но, возможно, при каких-то обстоятельствах и "объектный" метод будет иметь место.

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Как обновить поля в таблице?
« Ответ #42 : 16-08-2016, 15:19:10 »
evthisrel, не знаю, по моему нарисовать составную строку с ссылками на множество полей стало проще и понятнее...


еще бы разобраться как записывать формулы из полей с помощью метода 
tb.Cells[2, 2].Contents[0].Formula = ""; и вообще было бы сказочно.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #43 : 16-08-2016, 15:22:43 »
То есть при его помощи будет очень неудобно/невозможно (не пробовал - возможно, нужно будет создавать поле состоящее из супер комбинированного fieldCode - надо пробовать) "суммировать" поля и поля или поля и строки в ячейке таблицы.
Точно также, как ты вписал бы поле в строку, точно также ты можешь создать поле состоящее из других полей, добавить его к Table и вставить в ячейку. Так что это ненамного сложнее.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #44 : 16-08-2016, 15:28:14 »
еще бы разобраться как записывать формулы из полей с помощью метода
tb.Cells[2, 2].Contents[0].Formula = ""; и вообще было бы сказочно.
Я не понял, что ты имеешь в виду. Но в любом случае проще всего это проделать вручную (если это возможно), а затем поизучать при помощи ARXDBG/MGDDBG результаты и повторить их в коде.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #45 : 16-08-2016, 15:35:25 »
Boxa.Shu, Александр Ривилис, ну ладно-ладно :), пусть будет дело вкуса. Лично мне проще вот так:
Код - C# [Выбрать]
  1. "Спецификация к арматурному каркасу " + "%<\\AcObjProp Object(%<\\_ObjId " + markaField + ">%).TextString>%";
еще бы разобраться как записывать формулы из полей с помощью метода 
tb.Cells[2, 2].Contents[0].Formula = ""; и вообще было бы сказочно.
Я вот взялся, да угомонился, пока что решил, что по усилиям будет несоизмеримо - создавать поля-формулы.
Я не понял, что ты имеешь в виду.
Думаю Boxa.Shu имеет в виду нечто типа(только в таблице):

Но в любом случае проще всего это проделать вручную (если это возможно), а затем поизучать при помощи ARXDBG/MGDDBG результаты и повторить их в коде.
А я вот так не умею (подозреваю, что скрины в некоторых темах от Вас делались именно из этого метода). Может, можно где-то почитать про такого рода изучение результатов?

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Как обновить поля в таблице?
« Ответ #46 : 16-08-2016, 15:42:57 »
Лично мне проще вот так:
Так то проще, но так создавая в ячейках каждый раз новое поле - захламлем базу чертежа, а при вставке через объект нет,
одно и тоже поле можно сунуть в десяток ячеек.

Но в любом случае проще всего это проделать вручную (если это возможно), а затем поизучать при помощи ARXDBG/MGDDBG результаты и повторить их в коде.
Попробую, хотя и не совсем понимаю как это руками сделать. Буду думать.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #47 : 16-08-2016, 15:45:44 »
А я вот так не умею (подозреваю, что скрины в некоторых темах от Вас делались именно из этого метода). Может, можно где-то почитать про такого рода изучение результатов?
А ты уже установил ARXDBG и MGDDBG? Если нет, то качай их и разархивируй в "С:\Program Files\Autodesk\ApplicationPlugins"
Ну а потом смотри в контекстном меню AutoCAD меню ARXDBG и MGDDBG.
http://adn-cis.org/assets/gallery/AutoCAD/ArxDbg.bundle.zip
http://adn-cis.org/assets/gallery/AutoCAD/MgdDbg.zip
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #48 : 16-08-2016, 15:48:15 »
Так то проще, но так создавая в ячейках каждый раз новое поле - захламлем базу чертежа, а при вставке через объект нет,
одно и тоже поле можно сунуть в десяток ячеек.
Заставил задуматься.  :-\
Попробую, хотя и не совсем понимаю как это руками сделать. Буду думать.
Я думал ты программно хочешь сделать нечто типа: создать в ячейке поле-формулу на сумму значений, например, атрибутов блока.. Нет?
А ты уже установил ARXDBG и MGDDBG? Если нет, то качай их и разархивируй в "С:\Program Files\Autodesk\ApplicationPlugins"
Ну а потом смотри в контекстном меню AutoCAD меню ARXDBG и MGDDBG.
http://adn-cis.org/assets/gallery/AutoCAD/ArxDbg.bundle.zip
http://adn-cis.org/assets/gallery/AutoCAD/MgdDbg.zip
Спасибо. Сейчас поставлю. Буду экспериментировать.

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Как обновить поля в таблице?
« Ответ #49 : 16-08-2016, 15:49:49 »
Я думал ты программно хочешь сделать
Хочу программно, но следуя совета, сначала попробую руками

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

  • ADN Club
  • ****
  • Сообщений: 254
  • Карма: 29
  • Skype: evthisrel
Re: Как обновить поля в таблице?
« Ответ #50 : 16-08-2016, 15:51:20 »
Хочу программно, но следуя совета, сначала попробую руками
Видимо, я чего-то не понимаю, просто руками это делается элементарно. Наверное, все-таки, ты имеешь в виду сделать и разобрать при помощи ARXDBG и MGDDBG..

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Как обновить поля в таблице?
« Ответ #51 : 16-08-2016, 16:02:31 »
Off-Topic: показать
Видимо, я чего-то не понимаю, просто руками это делается элементарно.

Я вот вставить контент руками не могу, не дает. Настраивать внешний вид и порядок, удалять - это пожалуйста, а вот вставить...
Ну да это мои проблемы и это оффтопик.

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

  • Administrator
  • *****
  • Сообщений: 13829
  • Карма: 1784
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Как обновить поля в таблице?
« Ответ #52 : 16-08-2016, 16:50:34 »
Boxa.Shu,
Ты добавляешь не формулу, а поле. Но это поле может содержать формулу. Например, сумма трёх ячеек из другой таблицы помещаем в данную:
Код - C# [Выбрать]
  1. %<\AcExpr (Table(%<\_ObjId 2129221416>%).A2+Table(%<\_ObjId 2129221416>%).A3+Table(%<\_ObjId 2129221416>%).A4)>%
Хотя можно было скомбинировать поля и из разных таблиц, и другие значения (например, длина отрезка).
Вот сумма длин трёх отрезков:
Код - C# [Выбрать]
  1. %<\AcExpr (%<\_FldPtr 2129583800>%+%<\_FldPtr 2129584052>%+%<\_FldPtr 2129582804>%)>%
%<\_FldPtr XXXXXXXX>% - это ссылка на другое поле, XXXXXXXX - это его ObjectId.
Или так напрямую:
Код - C# [Выбрать]
  1. %<\AcExpr (%<\AcObjProp Object(%<\_ObjId 2129222240>%).Length>%+%<\AcObjProp Object(%<\_ObjId 2129222248>%).Length>%+%<\AcObjProp Object(%<\_ObjId 2129222256>%).Length>%) \f "%lu2>%"
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • *****
  • Сообщений: 611
  • Карма: 155
    • ПГСу Бложик
Re: Как обновить поля в таблице?
« Ответ #53 : 17-08-2016, 08:35:39 »
Спасибо. разобрался. =о)