Еще хотелось бы узнать как обращаться к контенту ячеек в таблице

Автор Тема: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице  (Прочитано 12912 раз)

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

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Спасибо за информацию. Еще хотелось бы узнать как обращаться к контенту ячеек в таблице. в смысле обратиться к ячейке по ее индексу (строка, столбец) и извлечь/занести в нее данные. Есть ли для этого конкретные методы?

/* По правилам форума "Один вопрос - одна тема". Тему разделил. */
« Последнее редактирование: 11-01-2014, 02:41:42 от Александр Ривилис »

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Тут есть множество методов, описанных в документации (ObjectARX SDK Docs->Managed Class Reference->Autodesk.AutoCAD.DatabaseServices Namespace->Table Class) :
Table.GetValue - получение значения ячейки
Table.SetValue - установка значения ячейки
Еще можешь почитать: Как создать Таблицу и заполнить её ячейки средствами .NET
А вообще примеров на эту тему много.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
ИМХО лучше создавать таблицы на основании табличных стилей которые, в свою очередь, построены на основании шаблонов. Такие стили уже содержат в себе готовую болванку таблицы, в которой уже оформлены заголовки, столбцы, формулы, выравнивания, толщины\цвет линий, общие данные и т.п.

Стили, в т. ч. и основанные на шаблонах, могут быть созданы программно средствами .net. Здесь подробно рассмотрено, как изменять каждую опцию диалогового окна стилей таблиц, т.е. как программно создавать детально настроенные стили таблиц. Там же показано программное создание шаблонов, применяемых к таблицам, затем, собственно их применение. В конце показано, как создавать таблицы на основе сознанного табличного стиля.

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Спасибо за объяснение, буду впитывать. Без вас бы никак

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Здравствуйте. Есть небольшая программа которая должна находить в чертеже определенные блоки (по имени и атрибуту), и заносить некоторые данные (теги и значения атрибутов) в ячейки заранее созданной в чертеже таблицы. Индексы ячеек и их содержимое определяются адекватно (проверялось выводом в командную строку). Не могу понять почему данные не заносятся в ячейки таблицы. Мои подозрения во взаимодействии методов программы или в работе с таблицей. Подскажите в чем дело. Чертеж в котором все это должно делаться во вложении. Прошу строго не судить за код, у кого от него дергается глаз.

Код - C# [Выбрать]
  1. namespace wirings
  2. {
  3.     public class MyCommands
  4.     {
  5.         int counter = 0;
  6.         int i = 0;
  7.         int j = 0;
  8.  
  9.         // Заполнение таблицы
  10.         [CommandMethod("wirings", CommandFlags.Modal)]
  11.         public void Wirings()
  12.         {
  13.             string name = "", label = "", chain = "";
  14.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  15.             Database acDb = acDoc.Database;
  16.             Editor ed = acDoc.Editor;
  17.  
  18.             using (Transaction trans = acDb.TransactionManager.StartTransaction())
  19.             {
  20.                 BlockTable bt = (BlockTable)acDb.BlockTableId.GetObject(OpenMode.ForRead);
  21.                 foreach (ObjectId btrId in bt)
  22.                 {
  23.                     BlockTableRecord btr = (BlockTableRecord)trans.GetObject(btrId, OpenMode.ForRead);
  24.                     BlockTableRecord block = null;
  25.                     if (btr.HasAttributeDefinitions)
  26.                     {
  27.                         foreach (ObjectId brId in btr.GetBlockReferenceIds(true, false))
  28.                         {
  29.                             BlockReference br = (BlockReference)trans.GetObject(brId, OpenMode.ForRead);
  30.  
  31.                             if (br.IsDynamicBlock)
  32.                                 block = trans.GetObject(br.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
  33.                             else
  34.                                 block = trans.GetObject(br.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
  35.  
  36.                             if (block.Name == "розетка")
  37.                             {
  38.                                 foreach (ObjectId attrRefObjId in br.AttributeCollection)
  39.                                 {
  40.                                     AttributeReference attrRef = (AttributeReference)trans.GetObject(attrRefObjId, OpenMode.ForRead);
  41.  
  42.                                     if (attrRef.Tag == "ОБОЗНАЧЕНИЕ")
  43.                                         label = attrRef.TextString;
  44.                                     if (attrRef.TextString != "" && attrRef.Tag != "ОБОЗНАЧЕНИЕ")
  45.                                     {
  46.                                         chain = attrRef.TextString;
  47.                                         name = label + ":" + attrRef.Tag;
  48.                                         WorkTable(chain);
  49.                                         WorkTable(name);
  50.                                         WorkTable(FindChain(chain));
  51.                                         ed.WriteMessage("\n");
  52.                                     }
  53.                                 }
  54.                             }
  55.                         }
  56.                     }
  57.                 }
  58.             }
  59.             counter = 0;
  60.             i = 0;
  61.             j = 0;
  62.         }
  63.  
  64.         // Поиск второй части записи
  65.         public string FindChain(string chain)
  66.         {
  67.             string name = "", label = "", nameTag = "";
  68.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  69.             Database acDb = acDoc.Database;
  70.             Editor ed = acDoc.Editor;
  71.  
  72.             using (Transaction trans = acDb.TransactionManager.StartTransaction())
  73.             {
  74.                 BlockTable bt = (BlockTable)acDb.BlockTableId.GetObject(OpenMode.ForRead);
  75.  
  76.                 foreach (ObjectId btrId in bt)
  77.                 {
  78.                     BlockTableRecord btr = (BlockTableRecord)trans.GetObject(btrId, OpenMode.ForRead);
  79.                     BlockTableRecord block = null;
  80.                     if (btr.HasAttributeDefinitions)
  81.                     {
  82.                         foreach (ObjectId brId in btr.GetBlockReferenceIds(true, false))
  83.                         {
  84.                             BlockReference br = (BlockReference)trans.GetObject(brId, OpenMode.ForRead);
  85.  
  86.                             //определение настоящего имени вставки блока
  87.                             if (br.IsDynamicBlock)
  88.                                 block = trans.GetObject(br.DynamicBlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
  89.                             else
  90.                                 block = trans.GetObject(br.BlockTableRecord, OpenMode.ForRead) as BlockTableRecord;
  91.  
  92.                             //*************************************************
  93.  
  94.                             foreach (ObjectId attrRefObjId in br.AttributeCollection)
  95.                             {
  96.                                 AttributeReference attrRef = (AttributeReference)trans.GetObject(attrRefObjId, OpenMode.ForRead);
  97.                                 if (attrRef.Tag == "ОБОЗНАЧЕНИЕ")
  98.                                     label = attrRef.TextString;
  99.  
  100.                                 if (attrRef.TextString == chain)
  101.                                 {
  102.  
  103.                                     if (block.Name == "клеммник")
  104.                                     {
  105.                                         foreach (ObjectId attrRefObjIdKlem in br.AttributeCollection)
  106.                                         {
  107.                                             AttributeReference attrRefKlem = (AttributeReference)trans.GetObject(attrRefObjIdKlem, OpenMode.ForRead);
  108.  
  109.                                             if (attrRef.Tag == "ЦЕПЬ-А" && attrRefKlem.Tag == "№-А")
  110.                                             {
  111.                                                 nameTag = attrRefKlem.TextString;
  112.                                                 name = label + ":" + nameTag;
  113.                                                 return name;
  114.                                             }
  115.                                             else if (attrRef.Tag == "ЦЕПЬ-Б" && attrRefKlem.Tag == "№-Б")
  116.                                             {
  117.                                                 nameTag = attrRefKlem.TextString;
  118.                                                 name = label + ":" + nameTag;
  119.                                                 return name;
  120.                                             }
  121.                                         }
  122.                                     }
  123.                                     else
  124.                                     {
  125.                                         nameTag = attrRef.Tag;
  126.                                         name = label + ":" + nameTag;
  127.                                         return name;
  128.                                     }
  129.                                 }
  130.                             }
  131.                         }
  132.                     }
  133.                 }
  134.                 return "";
  135.             }
  136.         }
  137.  
  138.         // Занесение данных в таблицу
  139.         public void WorkTable(string slot)
  140.         {
  141.             Document acDoc = Application.DocumentManager.MdiActiveDocument;
  142.             Database acDb = acDoc.Database;
  143.             Editor ed = acDoc.Editor;
  144.  
  145.             using (Transaction trans = acDb.TransactionManager.StartTransaction())
  146.             {
  147.                 BlockTable bt = (BlockTable)acDb.BlockTableId.GetObject(OpenMode.ForWrite);
  148.  
  149.                 foreach (ObjectId btrId in bt)
  150.                 {
  151.  
  152.                     BlockTableRecord btr = (BlockTableRecord)trans.GetObject(btrId, OpenMode.ForWrite);
  153.                     foreach (ObjectId brId in btr.GetBlockReferenceIds(true, false))
  154.                     {
  155.                         BlockReference br = (BlockReference)trans.GetObject(brId, OpenMode.ForWrite);
  156.                         if (br.ObjectId.ObjectClass.Name == "AcDbTable")
  157.                         {
  158.                             Table tb = (Table)trans.GetObject(br.ObjectId, OpenMode.ForWrite);
  159.                             if (counter == 0)
  160.                             {
  161.                                 i = 2; j = 1;
  162.                             }
  163.  
  164.                             if (j == 4)
  165.                             {
  166.                                 i = i + 1;
  167.                                 j = 1;
  168.                             }
  169.  
  170.                             tb.Cells[i, j].TextString = slot;
  171.                             ed.WriteMessage(i.ToString() + ", " + j.ToString() + ": " + tb.Cells[i, j].TextString + "\t");
  172.                             tb.GenerateLayout();
  173.                             j++;
  174.                             counter++;
  175.                         }
  176.                     }
  177.                 }
  178.                 trans.Commit();
  179.             }
  180.         }
  181.     }
  182. }
  183.  
  184.  

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Прошу строго не судить за код, у кого от него дергается глаз.
Дергается. В первую очередь обрати внимание, что у тебя внутри using (Transaction trans = ...) практически нигде нет trans.Commit() что означает, что все твои изменения в чертеже игнорируются. Особенно важно то, что trans.Commit() у тебя нет в самой внешней транзакции.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Вы не поверите, но все заработало :-[ :-[ :-[

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Не могу понять почему данные не заносятся в ячейки таблицы.
Вместо этого:
Код - C# [Выбрать]
  1. tb.Cells[i, j].TextString = slot;
Посмотри строку кода 427 здесь.

P.S. Ну если trans.Commit() отсутствовал, то понятно... :)

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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
Вы не поверите, но все заработало :-[ :-[ :-[
Как раз очень даже верю - это одна и основных ошибок, которую допускают те, кто начинает работать с AutoCAD .NET API
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Возможно будет интересно почитать это.

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
обязательно посмотрю!

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

  • ADN Club
  • **
  • Сообщений: 56
  • Карма: 0
Посмотри строку кода 427 здесь.
Эта строка каким-то иным способом присваивает значение ячейке?

Оффлайн Андрей Бушман

  • ADN Club
  • *****
  • Сообщений: 2000
  • Карма: 163
  • Пишу программки...
    • Блог
  • Skype: Compositum78
Посмотри строку кода 427 здесь.
Эта строка каким-то иным способом присваивает значение ячейке?
А что мешает посмотреть и сравнить обе строки кода? :)
Код - C# [Выбрать]
  1. table.Cells[i, j].SetValue(str[i, j], AcDb.ParseOption.ParseOptionNone);
На мой взгляд, разница в сигнатурах очевидна ;)

Оффлайн Алексей (IdeaSoft)

  • ADN
  • *
  • Сообщений: 1189
  • Карма: 9
    • idea-soft.ru
  • Skype: makar_govorun
А как получить значение из ячейки таблицы
вот фрагмент кода :
Код - vb.net [Выбрать]
  1.     Dim t As Autodesk.AutoCAD.DatabaseServices.Table
  2.     ...    
  3.    dim s as Object =  t.GetValue(1,1,?,?) ' Не пойму, что передать для 3 и 4 аргументов функции?
  4.  

У меня такая проблема в s возвращается  либо Nothing либо пустую строку ""


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

  • Administrator
  • *****
  • Сообщений: 13882
  • Карма: 1787
  • Рыцарь ObjectARX
  • Skype: rivilis
А сколько у тебя строк в таблице? И зачем тебе метод GetValue() с четырьмя аргументами, когда есть с тремя (третий аргумент 0)?
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение