5.3.4.1. Использование фильтров выбора для определения выбора на основании правил

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

    Фильтры выбора составляются из пар аргументов в форме TypedValues. Первый аргумент TypedValue идентифицирует тип фильтра (например, объект), второй аргумент определяет значение, которую Вы фильтруете (например, круги). Тип фильтра это группы кодов DXF, которые определяет, какой фильтр использовать. Несколько самых применяемых типов фильтра перечислены ниже.

DXF коды популярных фильтров               

DXF код     Тип фильтра
 0 (или DxfCode.Start) Тип объекта (string). Например “Line”, “Circle”, “Arc” и т.д.
 2 (или DxfCode.BlockName) Имя блока (string). Имя блока вставленной ссылки.
 8 (или DxfCode.LayerName) Имя слоя (string). Например “Слой 0”.
 60 (или DxCode.Visinility)  Видимость объекта (integer). 0 – видимые, 1 – невидимые.
                                         62 (или DxfCode.Color) Номер цвета (integer).  Номер индекса значения в пределах от 0 до 256. Ноль означает ByBlock. 256 означает ByLayer. Отрицательное значение означает, что слой выключен.
 67 Указывает пространство Модели/Листа (integer). 0 или опущено = Модель, 1 = Листы.

    Полный список DXF групп кодов смотрите в разделе «Group Code Value Types» Справочника DXF Reference.

Определение одного критерия выбора для набора  

    В этом коде, пользователя просят выбрать объекты для включения их в набор, и отфильтровывают все объекты кроме кругов.

Код 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("FilterSelectionSet")> _
   7:  Public Sub FilterSelectionSet()
   8:   
   9:    ''Получение редактора текущего документа
  10:    Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor 
  11:   
  12:    '' Создание массива TypedValue для определение критериев фильтра
  13:    Dim acTypValAr(0) As TypedValue
  14:    acTypValAr.SetValue(New TypedValue(DxfCode.Start, "CIRCLE"), 0) 
  15:   
  16:    '' Назначение критериев фильтра объекту SelectionFilter
  17:    Dim acSelFtr As SelectionFilter = New SelectionFilter(acTypValAr) 
  18:   
  19:    '' Запрос выбора объектов на чертеже
  20:    Dim acSSPrompt As PromptSelectionResult
  21:    acSSPrompt = acDocEd.GetSelection(acSelFtr) 
  22:   
  23:    '' Если статус запрса OK, объекты выбраны
  24:    If acSSPrompt.Status = PromptStatus.OK Then
  25:        Dim acSSet As SelectionSet = acSSPrompt.Value 
  26:        Application.ShowAlertDialog("Количество выбранных объектов: " & _
  27:                                    acSSet.Count.ToString())
  28:    Else
  29:        Application.ShowAlertDialog("Количество выбранных объектов: 0")
  30:    End If
  31:  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("FilterSelectionSet")]
   7:  public static void FilterSelectionSet()
   8:  {
   9:    // ''Получение редактора текущего документа
  10:    Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor; 
  11:   
  12:    // Создание массива TypedValue для определение критериев фильтра
  13:    TypedValue[] acTypValAr = new TypedValue[1];
  14:    acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, "CIRCLE"), 0); 
  15:   
  16:    // Назначение критериев фильтра объекту SelectionFilter
  17:    SelectionFilter acSelFtr = new SelectionFilter(acTypValAr); 
  18:   
  19:    // Запрос выбора объектов на чертеже
  20:    PromptSelectionResult acSSPrompt;
  21:    acSSPrompt = acDocEd.GetSelection(acSelFtr); 
  22:   
  23:    // Если статус запрса OK, объекты выбраны
  24:    if (acSSPrompt.Status == PromptStatus.OK)
  25:    {
  26:        SelectionSet acSSet = acSSPrompt.Value;
  27:        Application.ShowAlertDialog("Количество выбранных объектов: " +
  28:                                    acSSet.Count.ToString());
  29:    }
  30:    else
  31:    {
  32:        Application.ShowAlertDialog("Количество выбранных объектов: 0");
  33:    }
  34:  }

Код VBA/ActiveX

   1:  Sub FilterSelectionSet()
   2:      ' Создание нового набора
   3:      Dim sset As AcadSelectionSet
   4:      Set sset = ThisDrawing.SelectionSets.Add("SS1") 
   5:   
   6:      ' Определение списка фильтров, только объекты Circle
   7:      ' должны быть выбраны
   8:      Dim FilterType(0) As Integer
   9:      Dim FilterData(0) As Variant
  10:      FilterType(0) = 0
  11:      FilterData(0) = "Circle" 
  12:   
  13:      ' Запрос пользователю выбрать объекты
  14:      '  и добавление их в набор
  15:      sset.SelectOnScreen FilterType, FilterData 
  16:   
  17:      MsgBox " Количество выбранных объектов: " & sset.Count 
  18:   
  19:      ' Удаление набора
  20:      sset.Delete
  21:  End Sub

Comments