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

01/06/2020

Фильтр для выбора примитивов на разных слоях

Эта статья показывает простой способ для создания фильтра, который позволит выбрать примитив типа A на слое L и типа B на нескольких слоях L1, L2, L3…. И так далее.

Код - Auto/Visual LISP: [Выделить]
  1. (defun C:FCTest()
  2. (setq sel1 (ssget "_X" '(
  3.      (-4 . "<OR")
  4.          (-4 . "<AND")
  5.           (0 . "TEXT")
  6.           (8 . "Centro")
  7.          (-4 . "AND>")
  8.          (-4 . "<AND")
  9.           (0 . "LWPOLYLINE")
  10.             (-4 . "<OR")
  11.               (8 . "Secao_Projeto")
  12.               (8 . "Pontos_AcimaTolerancia")
  13.               (8 . "Pontos_AbaixoTolerancia")
  14.               (8 . "Pontos_ForaTolerancia")
  15.               (8 . "Pontos_NaTolerancia")
  16.             (-4 . "OR>")
  17.          (-4 . "AND>")
  18.      (-4 . "OR>"))
  19.     )
  20.  )
  21.  (sslength sel1)
  22. )


Код - C#: [Выделить]
  1. public static void FC() {
  2. // Получаем редактор текущего документа
  3. Editor acDocEd = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument.Editor;
  4.  // Создаём массив TypedValue удовлетворяющий критериям
  5.  // Все объекты удовлетворяющие критериям будут выбраны
  6.  TypedValue[] acTypValAr = {
  7.   new TypedValue((int) DxfCode.Operator, "<or"),
  8.   // Критерий 1
  9.   new TypedValue((int) DxfCode.Operator, "<and"),
  10.   new TypedValue((int) DxfCode.Start, "TEXT"),
  11.   new TypedValue((int) DxfCode.LayerName, "Centro"),
  12.   new TypedValue((int) DxfCode.Operator, "and>"),
  13.   // Критерий 2
  14.   new TypedValue((int) DxfCode.Operator, "<and"),
  15.   new TypedValue((int) DxfCode.Start, "LWPOLYLINE"),
  16.   new TypedValue((int) DxfCode.Operator, "<or"),
  17.   new TypedValue((int) DxfCode.LayerName, "Secao_Projeto"),
  18.   new TypedValue((int) DxfCode.LayerName, "Pontos_AcimaTolerancia"),
  19.   new TypedValue((int) DxfCode.LayerName, "Pontos_AbaixoTolerancia"),
  20.   new TypedValue((int) DxfCode.LayerName, "Pontos_ForaTolerancia"),
  21.   new TypedValue((int) DxfCode.LayerName, "Pontos_NaTolerancia"),
  22.   new TypedValue((int) DxfCode.Operator, "or>"),
  23.   new TypedValue((int) DxfCode.Operator, "and>"),
  24.   new TypedValue((int) DxfCode.Operator, "or>")
  25.  };
  26.  
  27.  // Создаём SelectionFilter
  28.  SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);
  29.  
  30.  // Запрашиваем удовлетворяющие критерию примитивы в чертеже
  31.  PromptSelectionResult acSSPrompt;
  32.  acSSPrompt = acDocEd.GetSelection(acSelFtr);
  33.  
  34.  // Если статус == OK, то примитивы выбраны
  35.  if (acSSPrompt.Status == PromptStatus.OK) {
  36.   SelectionSet acSSet = acSSPrompt.Value;
  37.  
  38.   Autodesk.AutoCAD.ApplicationServices.Core.Application.ShowAlertDialog("Число выбранных примитивов: " +
  39.    acSSet.Count.ToString());
  40.  } else {
  41.   Autodesk.AutoCAD.ApplicationServices.Core.Application.ShowAlertDialog("Примитивы не выбраны");
  42.  }
  43. }

 

Источник: https://adndevblog.typepad.com/autocad/2019/03/conditional-selection-filter-for-entities-on-multiple-layers.html

 

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