5.3.4.5. Фильтр для расширенных данных

Источник здесь. [перевод не проверен] [переводчик: bandero]

    Внешние приложения могут присоединять данные такие как текст, числовые значения, 3D-точки, расстояния, и имена слоев к объектам AutoCAD. Эти данные относятся к расширенным данным, или xdata. Вы можете фильтровать объекты содержащие расширенные данные от определенного приложения.

Выбор кругов содержащих xdata

    В следующем примере филтруются круги содержащие xdata добавленные приложением «MY_APP»:

Код VB.NET

1:  Imports Autodesk.AutoCAD.Runtime
   2:  Imports Autodesk.AutoCAD.ApplicationServices
   3:  Imports Autodesk.AutoCAD.DatabaseServices
   4:  Imports Autodesk.AutoCAD.EditorInput 
   5:   
   6:  <CommandMethod("FilterXdata")> _
   7:  Public Sub FilterXdata()
   8:    '' Получение редактора текущего документа
   9:    Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor 
  10:   
  11:    '' Создание массива из TypedValue для определения критериев фильтра
  12:    Dim acTypValAr(1) As TypedValue
  13:    acTypValAr.SetValue(New TypedValue(DxfCode.Start, "Circle"), 0)
  14:    acTypValAr.SetValue(New TypedValue(DxfCode.ExtendedDataRegAppName, _
  15:                                       "MY_APP"), 1)
  16:   
  17:    '' Назначение критериев фильтра объекту SelectionFilter
  18:    Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr) 
  19:   
  20:    '' Запрос выбора объектов на чертеже
  21:    Dim acSSPrompt As PromptSelectionResult
  22:    acSSPrompt = acDocEd.GetSelection(acSelFtr) 
  23:   
  24:    '' Если статус запроса ОК, объекты были выбраны
  25:    If acSSPrompt.Status = PromptStatus.OK Then
  26:        Dim acSSet As SelectionSet = acSSPrompt.Value
  27:        Application.ShowAlertDialog("Количество выбранных объектов: " & _
  28:                                    acSSet.Count.ToString())
  29:    Else
  30:        Application.ShowAlertDialog("Количество выбранных объектов: 0")
  31:    End If
  32:  End Sub

Код C#

1:  using Autodesk.AutoCAD.Runtime;
   2:  using Autodesk.AutoCAD.ApplicationServices;
   3:  using Autodesk.AutoCAD.DatabaseServices;
   4:  using Autodesk.AutoCAD.EditorInput; 
   5:   
   6:  [CommandMethod("FilterXdata")]
   7:  public static void FilterXdata()
   8:  {
   9:    // Get the current document editor
  10:    Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor; 
  11:   
  12:    // Создание массива из TypedValue для определения критериев фильтра
  13:    TypedValue[] acTypValAr = new TypedValue[2];
  14:    acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, "Circle"), 0);
  15:    acTypValAr.SetValue(new TypedValue((int)DxfCode.ExtendedDataRegAppName,
  16:                                       "MY_APP"), 1); 
  17:   
  18:    // Назначение критериев фильтра объекту SelectionFilter
  19:    SelectionFilter acSelFtr = new SelectionFilter(acTypValAr); 
  20:   
  21:    // Запрос выбора объектов на чертеже
  22:    PromptSelectionResult acSSPrompt;
  23:    acSSPrompt = acDocEd.GetSelection(acSelFtr); 
  24:   
  25:    // Если статус запроса ОК, объекты были выбраны
  26:    if (acSSPrompt.Status == PromptStatus.OK)
  27:    {
  28:        SelectionSet acSSet = acSSPrompt.Value;
  29:        Application.ShowAlertDialog("Количество выбранных объектов: " +
  30:                                    acSSet.Count.ToString());
  31:    }
  32:    else
  33:    {
  34:        Application.ShowAlertDialog("Количество выбранных объектов: 0");
  35:    }
  36:  }

Код VBA/ActiveX

   1:  Sub FilterXdata()
   2:      Dim sset As AcadSelectionSet
   3:      Dim FilterType(1) As Integer
   4:      Dim FilterData(1) As Variant
   5:      Set sset = ThisDrawing.SelectionSets.Add("SS1")
   6:      FilterType(0) = 0: FilterData(0) = "Circle"
   7:      FilterType(1) = 1001: FilterData(1) = "MY_APP"
   8:      sset.SelectOnScreen FilterType, FilterData
   9:   
  10:      MsgBox " Количество выбранных объектов: " & sset.Count 
  11:   
  12:      ' Удаление набора
  13:      sset.Delete
  14:  End Sub

Comments