Как записать значения определенных атрибутов отфильтрованных блоков в таблицу

Автор Тема: Как записать значения определенных атрибутов отфильтрованных блоков в таблицу  (Прочитано 3719 раз)

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

Оффлайн zr74Автор темы

  • ADN OPEN
  • Сообщений: 46
  • Карма: 1
Добрый день, помогите пожалуйста новичку. Задача: найти в чертеже все блоки с одним именем "Штамп 185х55 мм", создать таблицу с количеством строк по количеству найденных блоков, записать в таблицу определенные значения атрибута блока (атрибут "Номер_листа" в столбец таблицы "Лист", атрибут "Наименование_листа" в столбец таблицы "Наименование").
В интернете нашел и разобрался как с помощью фильтра отсортировать одноименные блоки. Нашел как создать таблицу, а вот как из полученного массива с блоками (полученного по фильтру) получить значения атрибутов и вставить их в таблицу не могу разобраться.
Код - C# [Выбрать]
  1. public void find_my_Block()
  2.         {
  3.             int Kol_block;
  4.             Kol_block = 2;
  5.             // получаем БД и Editor текущего документа
  6.             Document doc = Application.DocumentManager.MdiActiveDocument;
  7.             Database db = doc.Database;
  8.             Editor ed = doc.Editor;
  9.  
  10.             // создаем переменную, в которой будут содержаться данные для фильтра
  11.             //TypedValue[] filterlist = new TypedValue[1];
  12.             TypedValue[] filterlist = new TypedValue[2];
  13.  
  14.             // первый аргумент (0) указывает, что мы задаем тип объекта
  15.             filterlist[0] = new TypedValue((int)DxfCode.Start, "INSERT");
  16.             filterlist[1] = new TypedValue((int)DxfCode.BlockName, "штамп 185х55 мм");
  17.  
  18.             // создаем фильтр
  19.             SelectionFilter filter = new SelectionFilter(filterlist);
  20.             PromptSelectionResult selRes = ed.SelectAll(filter);
  21.             // если произошла ошибка - сообщаем о ней
  22.             if (selRes.Status != PromptStatus.OK)
  23.             {
  24.                 ed.WriteMessage("\nВ чертеже нет блока Штамп!\n");
  25.                 return;
  26.             }
  27.             ObjectId[] ids = selRes.Value.GetObjectIds(); // получаем массив ID объектов
  28.            
  29.             Transaction tr = db.TransactionManager.StartTransaction();
  30.             using (tr)
  31.             {
  32.                 // "пробегаем" по всем полученным объектам
  33.                 foreach (ObjectId id in ids)
  34.                 {
  35.                     Entity entity = (Entity)tr.GetObject(id, OpenMode.ForRead); // приводим каждый из них к типу Entity
  36.                     Kol_block++;
  37.                 }
  38.  
  39.                 tr.Commit();
  40.             }
  41.             //Вызов запроса на указание места вставки таблицы
  42.             PromptPointResult pr = ed.GetPoint("\nУкажите место вставки таблицы: ");
  43.            
  44.             if (pr.Status == PromptStatus.OK)
  45.             {
  46.                 Table tb = new Table();
  47.                 tb.TableStyle = db.Tablestyle;
  48.                 tb.NumRows = Kol_block;
  49.                 tb.NumColumns = 3;
  50.                 tb.SetRowHeight(8);// устанавливаем высоту всех строк "8 мм" по ГОСТ 21.101
  51.                 tb.SetRowHeight(0,10);// устанавливаем высоту у строки "Заголовок" "10 мм"
  52.                 tb.SetRowHeight(1, 15);// устанавливаем высоту у строки "Название" "15 мм" по ГОСТ 21.101
  53.                 tb.SetColumnWidth(0,15); // устанавливаем ширину столбца "Лист" по ГОСТ 21.101 "15 мм"
  54.                 tb.SetColumnWidth(1,140); // устанавливаем ширину столбца "Наименование" по ГОСТ 21.101 "140 мм"
  55.                 tb.SetColumnWidth(2,30); // устанавливаем ширину столбца "Примечание" по ГОСТ 21.101 "30 мм"
  56.  
  57.                 tb.Position = pr.Value;
  58.                 string[,] str = new string[Kol_block, 3];
  59.                 for (int i = 0; i < Kol_block; i++)
  60.                 {
  61.                     for (int j = 0; j < 3; j++)
  62.                     {
  63.                         str[i, j] = String.Empty;
  64.                     }
  65.                 }
  66.                 str[0, 0] = "Ведомость рабочих чертежей основного комплекта "; // Присваиваем 0 строке "Заголовок" значение
  67.                 str[0, 1] = " ";                                               //"Ведомость рабочих чертежей основного комплекта"
  68.                 str[0, 2] = " ";
  69.                 str[1, 0] = "Лист ";  // Присваиваем 0-му столбцу строки "Название" значение "Лист"
  70.                 str[1, 1] = "Наименование "; // Присваиваем 1-му столбцу строки "Название" значение "Лист"
  71.                 str[1, 2] = "Примечание "; // Присваиваем 2-му столбцу строки "Название" значение "Примечание"
  72.                 // Используем вложенный цикл для добавления и форматирования каждой ячейки
  73.                 for (int i = 0; i < Kol_block; i++)
  74.                 {
  75.                     for (int j = 0; j < 3; j++)
  76.                     {
  77.                         tb.SetTextHeight(i, j, 3); // устанавливаем высоту текста "3"
  78.                         tb.SetTextString(i, j, str[i, j]);// Добавляем новую строку
  79.                         tb.SetAlignment(i, j, CellAlignment.MiddleCenter);// устанавливаем выравнивание текста по центру для шапки таблицы ("Заголовок", "Название")
  80.                         if (i > 1)
  81.                         {
  82.                             tb.SetAlignment(i, 1, CellAlignment.MiddleLeft); // устанавливаем для 2-го столбца выравнивание по центру слева
  83.                                                                              // начиная с 1-й строчки "Данные"
  84.                         }
  85.                     }
  86.                 }
  87.                 tb.GenerateLayout();
  88.                 Transaction tr =
  89.                   doc.TransactionManager.StartTransaction();
  90.                 using (tr)
  91.                 {
  92.                     BlockTable bt = (BlockTable)tr.GetObject(doc.Database.BlockTableId, OpenMode.ForRead);
  93.                     BlockTableRecord btr = (BlockTableRecord)tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
  94.                     btr.AppendEntity(tb);
  95.                     tr.AddNewlyCreatedDBObject(tb, true);
  96.                     tr.Commit();
  97.                 }
  98.  
  99.             }          
  100.         }
« Последнее редактирование: 10-07-2022, 16:44:08 от Александр Ривилис »

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Вот хелпер для извлечения атрибутов в словарь:
Код - C# [Выбрать]
  1.     /// <summary>
  2.     /// Получить список атрибутов  блока и его BlockTableRecord
  3.     /// </summary>
  4.     internal static Dictionary<string, string> AttributeValues(this BlockReference blockRef, Transaction tr)
  5.     {
  6.       if (blockRef is null || blockRef.IsErased || tr is null) return null;
  7.       Dictionary<string, string> ret = new();
  8.  
  9.       // Атрибуты включенные в BlockReference (изменяемые)
  10.       foreach (ObjectId ar in blockRef.AttributeCollection)
  11.       {
  12.         if (ar.IsNull || ar.IsErased) continue;
  13.         if (tr.GetObject(ar, OpenMode.ForRead) is AttributeReference aref && !ret.ContainsKey(aref.Tag))
  14.           ret.Add(aref.Tag, aref.TextString);
  15.       }
  16.  
  17.       // Атрибуты из BlockTableRecord (константные)
  18.       ObjectId btrId = blockRef.IsDynamicBlock || !blockRef.AnonymousBlockTableRecord.IsNull ? blockRef.DynamicBlockTableRecord : blockRef.BlockTableRecord;
  19.       if (!btrId.IsNull && !btrId.IsErased)
  20.         {
  21.           BlockTableRecord btr = tr.GetObject(btrId, OpenMode.ForRead) as BlockTableRecord;
  22.           foreach (ObjectId subId in btr)
  23.           {
  24.             if (subId.IsNull || subId.IsErased || subId.ObjectClass != dbAttrDef) continue;
  25.             if (tr.GetObject(subId, OpenMode.ForRead) is AttributeDefinition attr
  26.               && attr.Constant && !ret.ContainsKey(attr.Tag))
  27.               ret.Add(attr.Tag, attr.TextString);
  28.           }
  29.        }
  30.       return ret;
  31.     }
  32. static readonly RXClass dbAttrDef = RXObject.GetClass(typeof(AttributeDefinition));
  33.  

Оффлайн zr74Автор темы

  • ADN OPEN
  • Сообщений: 46
  • Карма: 1
Ваш код предполагает чтение всех атрибутов блока и дальнейшую работу с ними, правильно? А конкретный атрибут как получить?

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Точно так же - перебор всех атрибутов в поисках нужного

Оффлайн zr74Автор темы

  • ADN OPEN
  • Сообщений: 46
  • Карма: 1
Как применить предложенный код с Dictionary непосредственно в моем коде так и не смог разобраться. По прежнему нужна помощь.

Оффлайн avc

  • ADN Club
  • *****
  • Сообщений: 809
  • Карма: 166
    • Мои плагины к Автокаду
Пробуйте искать нужный атрибут в этом словаре и, если найдется, то записывайте в нужную ячейку таблицы. Что именно тут вызывает проблему?
Если вам нужна готовая программа, то я уже дал ссылку.

Оффлайн zr74Автор темы

  • ADN OPEN
  • Сообщений: 46
  • Карма: 1
Ссылку на платную программу? Спасибо, конечно, но задача самому разобраться и понять как делать, а не купить готовую программу. Помощь нужна так сказать конкретная, а не в общем плане. То есть в какое место своей программы вставь такую-то функцию, сделай цикл  и так далее. Писать за меня конечно не надо. Но подтолкнуть с конкретикой в нужном направлении надо. Общие советы это хорошо, но не понятно. Я понимаю, что вы уже это все давным давно прошли и знаете, что и как делать, и вам поэтому кажется, что все настолько просто, что не может быть каких-то дополнительных вопросов.

Оффлайн trir

  • ADN Club
  • ****
  • Сообщений: 470
  • Карма: 63