24/07/2015
Связывание атрибутов блоков с использованием DataExtraction API
Команда ДАННЫЕИЗВЛ (_EATTEXT) в AutoCAD позволяет извлекать данные, такие как тексты и атрибуты блока и показывать их в таблице. Вот пример кода, который использует DataExtraction API и создаёт таблицу, связывая её с данными.Чтобы попробовать как он работает:
1) Скопируйте файл "MyBlock.dwg" в каталог "C:\Temp".
2) Запустите AutoCAD и откройте чертеж
3) Запустите команду и укажите точку, когда появится запрос о точке вставки таблицы.
4) Измените значение атрибута
5) Сделайте клик правой кнопкой мыши и выберите пункт меню "Обновление связей с данными таблицы" для обновления значений.
Код - C#: [Выделить]
- // Добавьте ссылку на AcDx.dll из подкаталога inc
- using Autodesk.AutoCAD.DataExtraction;
- Document doc = Application.DocumentManager.MdiActiveDocument;
- Editor ed = doc.Editor;
- Database db = doc.Database;
- // Скопируйте "MyBlock.dwg" в каталог C:\Temp для тестирования
- // DXE-файл создаётся на лету во время выполнения в
- // каталоге C:\Temp, если его там еще нет
- const string dxePath = @"C:\Temp\MyData.dxe";
- const string dwgFolder = @"C:\Temp\";
- const string dwgName = "MyBlock.dwg";
- if (System.IO.File.Exists(dxePath) == false)
- {
- // Создаём DXE-файл с информацией, которую мы хотим извлечь
- DxExtractionSettings setting = new DxExtractionSettings();
- IDxFileReference dxFileReference
- = new DxFileReference(dwgFolder, dwgFolder + dwgName);
- setting.DrawingDataExtractor.Settings.DrawingList.AddFile
- (dxFileReference);
- setting.DrawingDataExtractor.DiscoverTypesAndProperties
- (dwgFolder + dwgName);
- List<IDxTypeDescriptor> types
- = setting.DrawingDataExtractor.DiscoveredTypesAndProperties;
- List<string> selectedTypes = new List<string>();
- List<string> selectedProps = new List<string>();
- foreach (IDxTypeDescriptor td in types)
- {
- if (td.GlobalName.Equals("BlockReferenceTypeDescriptor.Test"))
- selectedTypes.Add(td.GlobalName);
- foreach (IDxPropertyDescriptor pd in td.Properties)
- {
- if (pd.GlobalName.Equals("AcDxObjectTypeGlobalName") ||
- pd.GlobalName.Equals("AcDxObjectTypeName") ||
- pd.GlobalName.Equals("BlockReferenceAttribute.NAME") ||
- pd.GlobalName.Equals("BlockReferenceAttribute.PLACE"))
- {
- if (!selectedProps.Contains(pd.GlobalName))
- selectedProps.Add(pd.GlobalName);
- }
- }
- }
- setting.DrawingDataExtractor.Settings.ExtractFlags
- = ExtractFlags.Nested | ExtractFlags.Xref;
- setting.DrawingDataExtractor.Settings.SetSelectedTypesAndProperties
- (types, selectedTypes, selectedProps);
- setting.OutputSettings.DataCellStyle = "Data";
- setting.OutputSettings.FileOutputType = AdoOutput.OutputType.xml;
- setting.OutputSettings.HeaderCellStyle = "Header";
- setting.OutputSettings.ManuallySetupTable = true;
- setting.OutputSettings.OuputFlags = DxOuputFlags.Table;
- setting.OutputSettings.TableStyleId = db.Tablestyle;
- setting.OutputSettings.TableStyleName = "Standard";
- setting.OutputSettings.TitleCellStyle = "Title";
- setting.OutputSettings.UsePropertyNameAsColumnHeader = false;
- setting.Save(dxePath);
- }
- // Создаём DataLink
- ObjectId dlId = ObjectId.Null;
- DataLinkManager dlm = db.DataLinkManager;
- using (DataLink dl = new DataLink())
- {
- String dataLinkName = "MyDataLink2";
- dlId = dlm.GetDataLink(dataLinkName);
- if(dlId.IsNull)
- {
- // Создаём связь
- dl.ConnectionString = dxePath;
- dl.ToolTip = "My Data Link";
- dl.Name = dataLinkName;
- DataAdapter da
- = DataAdapterManager.GetDataAdapter
- ("Autodesk.AutoCAD.DataExtraction.DxDataLinkAdapter");
- if (da != null)
- dl.DataAdapterId = da.DataAdapterId;
- dlId = dlm.AddDataLink(dl);
- }
- }
- // Запрашиваем точку вставки таблицы
- PromptPointResult pr = ed.GetPoint("\nУкажите точку вставки таблицы: ");
- if (pr.Status != PromptStatus.OK)
- return;
- // Создаём таблицу
- ObjectId tableId = ObjectId.Null;
- using (Transaction tr = db.TransactionManager.StartTransaction())
- {
- Table table = new Table();
- // Две строки и четыре колонки
- table.SetSize(2, 4);
- table.Position = pr.Value;
- // Добавляем таблицу в чертеж
- BlockTable bt = tr.GetObject(
- db.BlockTableId,
- OpenMode.ForWrite
- ) as BlockTable;
- BlockTableRecord btr = tr.GetObject
- (
- bt[BlockTableRecord.ModelSpace],
- OpenMode.ForWrite
- ) as BlockTableRecord;
- tableId = btr.AppendEntity(table);
- tr.AddNewlyCreatedDBObject(table, true);
- //table.Cells.SetDataLink(dlId, false);
- table.SetDataLink(1, 0, dlId, true);
- // Генерируем изображение
- table.GenerateLayout();
- tr.Commit();
- }
Автор перевода: Александр Ривилис
Обсуждение: http://adn-cis.org/forum/index.php?topic=2877
Опубликовано 24.07.2015