5.3.4.3. Реализация сложной логики в списке условий своего фильтра

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

    Когда вы определяете множественный критерий выбора, AutoCAD предпологает, что выбранные объекты должны удовлетворять каждому критерию. Вы можете квалифицировать свои критерии другим способом. Для числовых элементов, вы можете определить относительные операции (например, радиус круга должен быть больше или равен 5). И для всех элементов вы можете определить логические операции (например, Text или MText).

    Используйте DXF код -4 или константу DxfCode.Operator для указания относительного оператора в фильтре выбора. Оператор это строковое выражение. Допустимые операторы показаны в следующей таблице.

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

Оператор

Пояснение

«*»

Всё подходит (всегда true)

«=»

Равно

«!=»

Не равно

«/=»

Не равно

«<>»

Не равно

«<»

Меньше

«<=»

Меньше или

«>»

Больше

«>=»

Больше или равно

«&»

Поразрядная И (только для чсловых групп)

«&=»

Поразрядная маска равно (только для чсловых групп)

    Логические операторы в фильтре выбора так же обозначаюся кодом группы -4 или константой DxfCode.Opeator, и строковым оператором, но операторы должны быть парными. Открывающему оператору предшествует символ меньше (<) , а за закрывающим оператором следуеь символ большье (>). В следующей таблице перечислены логические операторы допустимые в фильтрах наборов.

Логические, сгруппированные, операторы для списка фильтров в наборах

Открывающий оператор

Внутри

Закрывающий оператор

«<AND»

Один или более операндов

«AND>»

"<OR"

Один или более операндов

"OR>"

"<XOR"

Два операнда

"XOR>"

"<NOT"

Один операнд

"NOT>"

Выбор кругов (объектов Circle) с радиусом больше или равен 5

    В следующем примере выбираются круги с радиусом больше или равным 5.

Код 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("FilterRelational")> _
   7:  Public Sub FilterRelational()
   8:    '' Получение редактора текущего документа
   9:    Dim acDocEd As Editor = Application.DocumentManager.MdiActiveDocument.Editor 
  10:   
  11:    '' Создание массива из TypedValue для определения критериев фильтра
  12:    Dim acTypValAr(2) As TypedValue
  13:    acTypValAr.SetValue(New TypedValue(DxfCode.Start, "CIRCLE"), 0)
  14:    acTypValAr.SetValue(New TypedValue(DxfCode.Operator, ">="), 1)
  15:    acTypValAr.SetValue(New TypedValue(40, 5), 2) 
  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:   
  28:        Application.ShowAlertDialog("Количество выбранных объектов: " & _
  29:                                    acSSet.Count.ToString())
  30:    Else
  31:        Application.ShowAlertDialog("Количество выбранных объектов: 0")
  32:    End If
  33:  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("FilterRelational")]
   7:  public static void FilterRelational()
   8:  {
   9:    // Получение редактора текущего документа
  10:    Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor; 
  11:   
  12:    // Создание массива из TypedValue для определения критериев фильтра
  13:    TypedValue[] acTypValAr = new TypedValue[3];
  14:    acTypValAr.SetValue(new TypedValue((int)DxfCode.Start, "CIRCLE"), 0);
  15:    acTypValAr.SetValue(new TypedValue((int)DxfCode.Operator, ">="), 1);
  16:    acTypValAr.SetValue(new TypedValue(40, 5), 2); 
  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 FilterRelational()
   2:      Dim sset As AcadSelectionSet
   3:      Dim FilterType(2) As Integer
   4:      Dim FilterData(2) As Variant
   5:      Set sset = ThisDrawing.SelectionSets.Add("SS1")
   6:      FilterType(0) = 0: FilterData(0) = "Circle"
   7:      FilterType(1) = -4: FilterData(1) = ">="
   8:      FilterType(2) = 40: FilterData(2) = 5#
   9:      sset.SelectOnScreen FilterType, FilterData 
  10:   
  11:      MsgBox " Количество выбранных объектов: " & sset.Count 
  12:   
  13:      ' Удаление набора
  14:      sset.Delete
  15:  End Sub

Выбор любого Text или MText

    В следующем примере определяется, что любой Text или MText может быть выбран. 

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

Код VBA/ActiveX

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



Comments