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

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

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

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

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





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

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

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

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


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

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

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь 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
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь 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
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
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
  • *****
  • Сообщений: 624
  • Карма: 158
    • ПГСу Бложик
Re: Как обновить поля в таблице?
« Ответ #42 : 16-08-2016, 15:19:10 »
evthisrel, не знаю, по моему нарисовать составную строку с ссылками на множество полей стало проще и понятнее...


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

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

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

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

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