01/06/2020
Фильтр для выбора примитивов на разных слоях
Эта статья показывает простой способ для создания фильтра, который позволит выбрать примитив типа A на слое L и типа B на нескольких слоях L1, L2, L3…. И так далее.
Код - Auto/Visual LISP: [Выделить]
(defun C:FCTest()
(setq sel1 (ssget "_X" '(
(-4 . "<OR")
(-4 . "<AND")
(0 . "TEXT")
(8 . "Centro")
(-4 . "AND>")
(-4 . "<AND")
(0 . "LWPOLYLINE")
(-4 . "<OR")
(8 . "Secao_Projeto")
(8 . "Pontos_AcimaTolerancia")
(8 . "Pontos_AbaixoTolerancia")
(8 . "Pontos_ForaTolerancia")
(8 . "Pontos_NaTolerancia")
(-4 . "OR>")
(-4 . "AND>")
(-4 . "OR>"))
)
)
(sslength sel1)
)
Код - C#: [Выделить]
public static void FC() {
// Получаем редактор текущего документа
Editor acDocEd = Autodesk.AutoCAD.ApplicationServices.Core.Application.DocumentManager.MdiActiveDocument.Editor;
// Создаём массив TypedValue удовлетворяющий критериям
// Все объекты удовлетворяющие критериям будут выбраны
TypedValue[] acTypValAr = {
new TypedValue((int) DxfCode.Operator, "<or"),
// Критерий 1
new TypedValue((int) DxfCode.Operator, "<and"),
new TypedValue((int) DxfCode.Start, "TEXT"),
new TypedValue((int) DxfCode.LayerName, "Centro"),
new TypedValue((int) DxfCode.Operator, "and>"),
// Критерий 2
new TypedValue((int) DxfCode.Operator, "<and"),
new TypedValue((int) DxfCode.Start, "LWPOLYLINE"),
new TypedValue((int) DxfCode.Operator, "<or"),
new TypedValue((int) DxfCode.LayerName, "Secao_Projeto"),
new TypedValue((int) DxfCode.LayerName, "Pontos_AcimaTolerancia"),
new TypedValue((int) DxfCode.LayerName, "Pontos_AbaixoTolerancia"),
new TypedValue((int) DxfCode.LayerName, "Pontos_ForaTolerancia"),
new TypedValue((int) DxfCode.LayerName, "Pontos_NaTolerancia"),
new TypedValue((int) DxfCode.Operator, "or>"),
new TypedValue((int) DxfCode.Operator, "and>"),
new TypedValue((int) DxfCode.Operator, "or>")
};
// Создаём SelectionFilter
SelectionFilter acSelFtr = new SelectionFilter(acTypValAr);
// Запрашиваем удовлетворяющие критерию примитивы в чертеже
PromptSelectionResult acSSPrompt;
acSSPrompt = acDocEd.GetSelection(acSelFtr);
// Если статус == OK, то примитивы выбраны
if (acSSPrompt.Status == PromptStatus.OK) {
SelectionSet acSSet = acSSPrompt.Value;
Autodesk.AutoCAD.ApplicationServices.Core.Application.ShowAlertDialog("Число выбранных примитивов: " +
acSSet.Count.ToString());
} else {
Autodesk.AutoCAD.ApplicationServices.Core.Application.ShowAlertDialog("Примитивы не выбраны");
}
}
Источник: https://adndevblog.typepad.com/autocad/2019/03/conditional-selection-filter-for-entities-on-multiple-layers.html
Автор перевода: Александр Ривилис
Опубликовано 01.06.2020