Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Константин Соков от 10-01-2014, 23:38:40

Название: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Константин Соков от 10-01-2014, 23:38:40
Спасибо за информацию. Еще хотелось бы узнать как обращаться к контенту ячеек в таблице. в смысле обратиться к ячейке по ее индексу (строка, столбец) и извлечь/занести в нее данные. Есть ли для этого конкретные методы?

/* По правилам форума "Один вопрос - одна тема". Тему разделил. */
Название: Re: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Александр Ривилис от 11-01-2014, 03:01:16
Тут есть множество методов, описанных в документации (ObjectARX SDK Docs->Managed Class Reference->Autodesk.AutoCAD.DatabaseServices Namespace->Table Class) :
Table.GetValue - получение значения ячейки
Table.SetValue - установка значения ячейки
Еще можешь почитать: Как создать Таблицу и заполнить её ячейки средствами .NET (http://adn-cis.org/kak-sozdat-tabliczu-i-zapolnit-eyo-yachejki-sredstvami-.net.html)
А вообще примеров на эту тему много.
Название: Re: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Андрей Бушман от 11-01-2014, 11:32:28
ИМХО лучше создавать таблицы на основании табличных стилей которые, в свою очередь, построены на основании шаблонов. Такие стили уже содержат в себе готовую болванку таблицы, в которой уже оформлены заголовки, столбцы, формулы, выравнивания, толщины\цвет линий, общие данные и т.п.

Стили, в т. ч. и основанные на шаблонах, могут быть созданы программно средствами .net. Здесь (https://sites.google.com/site/acadhowtodo/net/styles/table-styles) подробно рассмотрено, как изменять каждую опцию диалогового окна стилей таблиц, т.е. как программно создавать детально настроенные стили таблиц. Там же показано программное создание шаблонов, применяемых к таблицам, затем, собственно их применение. В конце показано, как создавать таблицы на основе сознанного табличного стиля.
Название: Re: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Константин Соков от 12-01-2014, 15:32:03
Спасибо за объяснение, буду впитывать. Без вас бы никак
Название: Re: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Константин Соков от 15-01-2014, 23:45:53
Здравствуйте. Есть небольшая программа которая должна находить в чертеже определенные блоки (по имени и атрибуту), и заносить некоторые данные (теги и значения атрибутов) в ячейки заранее созданной в чертеже таблицы. Индексы ячеек и их содержимое определяются адекватно (проверялось выводом в командную строку). Не могу понять почему данные не заносятся в ячейки таблицы. Мои подозрения во взаимодействии методов программы или в работе с таблицей. Подскажите в чем дело. Чертеж в котором все это должно делаться во вложении. Прошу строго не судить за код, у кого от него дергается глаз.

Код - 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.  
Название: Re: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Александр Ривилис от 15-01-2014, 23:55:52
Прошу строго не судить за код, у кого от него дергается глаз.
Дергается. В первую очередь обрати внимание, что у тебя внутри using (Transaction trans = ...) практически нигде нет trans.Commit() что означает, что все твои изменения в чертеже игнорируются. Особенно важно то, что trans.Commit() у тебя нет в самой внешней транзакции.
Название: Re: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Константин Соков от 15-01-2014, 23:59:24
Вы не поверите, но все заработало :-[ :-[ :-[
Название: Re: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Андрей Бушман от 16-01-2014, 00:00:31
Не могу понять почему данные не заносятся в ячейки таблицы.
Вместо этого:
Код - C# [Выбрать]
  1. tb.Cells[i, j].TextString = slot;
Посмотри строку кода 427 здесь (https://sites.google.com/site/acadhowtodo/net/styles/table-styles).

P.S. Ну если trans.Commit() отсутствовал, то понятно... :)
Название: Re: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Александр Ривилис от 16-01-2014, 00:01:34
Вы не поверите, но все заработало :-[ :-[ :-[
Как раз очень даже верю - это одна и основных ошибок, которую допускают те, кто начинает работать с AutoCAD .NET API
Название: Re: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Андрей Бушман от 16-01-2014, 00:04:08
Возможно будет интересно почитать это (http://bushman-andrey.blogspot.ru/2013/01/database-autocad.html).
Название: Re: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Константин Соков от 16-01-2014, 00:05:06
обязательно посмотрю!
Название: Re: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Константин Соков от 16-01-2014, 07:55:34
Посмотри строку кода 427 здесь.
Эта строка каким-то иным способом присваивает значение ячейке?
Название: Re: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Андрей Бушман от 16-01-2014, 10:30:56
Посмотри строку кода 427 здесь.
Эта строка каким-то иным способом присваивает значение ячейке?
А что мешает посмотреть и сравнить обе строки кода? :)
Код - C# [Выбрать]
  1. table.Cells[i, j].SetValue(str[i, j], AcDb.ParseOption.ParseOptionNone);
На мой взгляд, разница в сигнатурах очевидна ;)
Название: Re: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Алексей (IdeaSoft) от 29-01-2016, 18:14:35
А как получить значение из ячейки таблицы
вот фрагмент кода :
Код - 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 либо пустую строку ""

Название: Re: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Александр Ривилис от 29-01-2016, 22:28:25
А сколько у тебя строк в таблице? И зачем тебе метод GetValue() с четырьмя аргументами, когда есть с тремя (третий аргумент 0)?
Название: Re: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Андрей Бушман от 29-01-2016, 22:33:03
А как получить значение из ячейки таблицы
Google (https://www.google.ru/search?q=AutoCAD+.net+create+table&ie=utf-8&oe=utf-8&gws_rd=cr&ei=Ar6rVp7BI8T4ygPc0Y-QAw) забанили?
Название: Re: Еще хотелось бы узнать как обращаться к контенту ячеек в таблице
Отправлено: Алексей (IdeaSoft) от 29-01-2016, 23:41:37
Ну в принципе у меня получилось третий аргумент передал 0.
есть еще другой метод GetTextString, но про него вроде написано что он устарел.