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

24/07/2015

Связывание атрибутов блоков с использованием DataExtraction API

Команда ДАННЫЕИЗВЛ (_EATTEXT) в AutoCAD позволяет извлекать данные, такие как тексты и атрибуты блока и показывать их в таблице. Вот пример кода, который использует DataExtraction API и создаёт таблицу, связывая её с данными.

Чтобы попробовать как он работает:

1) Скопируйте файл "MyBlock.dwg" в каталог "C:\Temp".

2) Запустите AutoCAD и откройте чертеж

3) Запустите команду и укажите точку, когда появится запрос о точке вставки таблицы.

4) Измените значение атрибута

5) Сделайте клик правой кнопкой мыши и выберите пункт меню "Обновление связей с данными таблицы" для обновления значений.

Код - C#: [Выделить]
  1. // Добавьте ссылку на AcDx.dll из подкаталога inc
  2. using Autodesk.AutoCAD.DataExtraction;
  3.  
  4. Document doc = Application.DocumentManager.MdiActiveDocument;
  5. Editor ed = doc.Editor;
  6. Database db = doc.Database;
  7.  
  8. // Скопируйте "MyBlock.dwg" в каталог C:\Temp для тестирования
  9. // DXE-файл создаётся на лету во время выполнения в
  10. // каталоге C:\Temp, если его там еще нет
  11. const string dxePath = @"C:\Temp\MyData.dxe";
  12. const string dwgFolder = @"C:\Temp\";
  13. const string dwgName = "MyBlock.dwg";
  14.  
  15. if (System.IO.File.Exists(dxePath) == false)
  16. {
  17.     // Создаём DXE-файл с информацией, которую мы хотим извлечь
  18.     DxExtractionSettings setting = new DxExtractionSettings();
  19.  
  20.     IDxFileReference dxFileReference
  21.         = new DxFileReference(dwgFolder, dwgFolder + dwgName);
  22.  
  23.     setting.DrawingDataExtractor.Settings.DrawingList.AddFile
  24.                                             (dxFileReference);
  25.  
  26.     setting.DrawingDataExtractor.DiscoverTypesAndProperties
  27.                                         (dwgFolder + dwgName);
  28.  
  29.     List<IDxTypeDescriptor> types
  30.         = setting.DrawingDataExtractor.DiscoveredTypesAndProperties;
  31.  
  32.     List<string> selectedTypes = new List<string>();
  33.     List<string> selectedProps = new List<string>();
  34.     foreach (IDxTypeDescriptor td in types)
  35.     {
  36.         if (td.GlobalName.Equals("BlockReferenceTypeDescriptor.Test"))
  37.             selectedTypes.Add(td.GlobalName);
  38.  
  39.         foreach (IDxPropertyDescriptor pd in td.Properties)
  40.         {
  41.             if (pd.GlobalName.Equals("AcDxObjectTypeGlobalName") ||
  42.                 pd.GlobalName.Equals("AcDxObjectTypeName") ||
  43.                 pd.GlobalName.Equals("BlockReferenceAttribute.NAME") ||
  44.                 pd.GlobalName.Equals("BlockReferenceAttribute.PLACE"))
  45.             {
  46.                 if (!selectedProps.Contains(pd.GlobalName))
  47.                     selectedProps.Add(pd.GlobalName);
  48.             }
  49.         }
  50.     }
  51.  
  52.     setting.DrawingDataExtractor.Settings.ExtractFlags
  53.                     = ExtractFlags.Nested | ExtractFlags.Xref;
  54.  
  55.     setting.DrawingDataExtractor.Settings.SetSelectedTypesAndProperties
  56.                         (types, selectedTypes, selectedProps);
  57.  
  58.     setting.OutputSettings.DataCellStyle = "Data";
  59.     setting.OutputSettings.FileOutputType = AdoOutput.OutputType.xml;
  60.     setting.OutputSettings.HeaderCellStyle = "Header";
  61.     setting.OutputSettings.ManuallySetupTable = true;
  62.     setting.OutputSettings.OuputFlags = DxOuputFlags.Table;
  63.     setting.OutputSettings.TableStyleId = db.Tablestyle;
  64.     setting.OutputSettings.TableStyleName = "Standard";
  65.     setting.OutputSettings.TitleCellStyle = "Title";
  66.     setting.OutputSettings.UsePropertyNameAsColumnHeader = false;
  67.  
  68.     setting.Save(dxePath);
  69. }
  70.  
  71. // Создаём DataLink
  72. ObjectId dlId = ObjectId.Null;
  73. DataLinkManager dlm = db.DataLinkManager;
  74. using (DataLink dl = new DataLink())
  75. {
  76.     String dataLinkName = "MyDataLink2";
  77.     dlId = dlm.GetDataLink(dataLinkName);
  78.  
  79.     if(dlId.IsNull)
  80.     {
  81.         // Создаём связь
  82.         dl.ConnectionString = dxePath;
  83.         dl.ToolTip = "My Data Link";
  84.         dl.Name = dataLinkName;
  85.  
  86.         DataAdapter da
  87.             = DataAdapterManager.GetDataAdapter
  88.             ("Autodesk.AutoCAD.DataExtraction.DxDataLinkAdapter");
  89.  
  90.         if (da != null)
  91.             dl.DataAdapterId = da.DataAdapterId;
  92.         dlId = dlm.AddDataLink(dl);
  93.     }
  94. }
  95.  
  96. // Запрашиваем точку вставки таблицы
  97. PromptPointResult pr = ed.GetPoint("\nУкажите точку вставки таблицы: ");
  98. if (pr.Status != PromptStatus.OK)
  99.     return;
  100.  
  101. // Создаём таблицу
  102. ObjectId tableId = ObjectId.Null;
  103. using (Transaction tr = db.TransactionManager.StartTransaction())
  104. {
  105.     Table table = new Table();
  106.  
  107.     // Две строки и четыре колонки
  108.     table.SetSize(2, 4);
  109.  
  110.     table.Position = pr.Value;
  111.  
  112.     // Добавляем таблицу в чертеж
  113.     BlockTable bt = tr.GetObject(
  114.                                     db.BlockTableId,
  115.                                     OpenMode.ForWrite
  116.                                 ) as BlockTable;
  117.  
  118.     BlockTableRecord btr = tr.GetObject
  119.                             (
  120.                                 bt[BlockTableRecord.ModelSpace],
  121.                                 OpenMode.ForWrite
  122.                             ) as BlockTableRecord;
  123.  
  124.     tableId = btr.AppendEntity(table);
  125.     tr.AddNewlyCreatedDBObject(table, true);
  126.  
  127.     //table.Cells.SetDataLink(dlId, false);
  128.     table.SetDataLink(1, 0, dlId, true);
  129.  
  130.     // Генерируем изображение
  131.     table.GenerateLayout();
  132.  
  133.     tr.Commit();
  134. }

 

Загрузить MyBlock.dwg

 

Источник: http://adndevblog.typepad.com/autocad/2013/04/linking-attributes-and-table-using-dataextraction-api.html

Автор перевода: Александр Ривилис

Обсуждение: http://adn-cis.org/forum/index.php?topic=2877

Опубликовано 24.07.2015