Группы пользователей Autodesk


Описание функции gp:FindPointInList


Окончательная компоновка

 

Окончательная компоновка 
 

Описание функции gp:FindPointInList



Заголовок функции в исходном коде поясняет, как функция gp:FindPointInList преобразует информацию, с которой она работает. Как и предыдущая функция, Gp:FindMovedPoint, данная функция использует возможности LISP обрабатывать списки. При работе со списками часто встречается комбинация функций mapcar и lambda. На первый взгляд, это несколько запутанные функции, имена которых не отображают то, что они в действительности делают. Однако они являются самыми мощными средствами из всего набора функций AutoLISP. Ниже приведено краткое описание функций mapcar и lambda.

Функция mapcar применяет выражение ко всем элементам списка. Например, если имеется список целых чисел 1, 2, 3 и 4, функцию mapcar можно использовать для прибавления единицы (выражение 1+) ко всем элементам списка:

_$ (mapcar '1+ '(1 2 3 4))

(2 3 4 5)

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

В приведенном примере для каждого значения в списке '(1 2 3 4) была выполнена функция 1+. По сути дела, функция mapcar выполнила несколько операций, а затем собрала полученные значения в один список:

(1+ 1) -> 2

(1+ 2) -> 3

(1+ 3) -> 4

(1+ 4) -> 5

Приведем еще один пример использования mapcar, на этот раз для выполнения функции null с целью выявления в списке неверных значений:

_$ (mapcar 'null (list 1 (= 3 "3") nil "Steve"))

(nil T T nil)

В данном фрагменте кода выполняется следующее:

(null 1) -> nil

(null (= 3 "3") -> T

(null nil) -> T

(null "Steve") -> nil

Внутри функции mapcar можно использовать большинство из функций AutoLISP.
Допускается также применять пользовательские функции. Например, возьмем пользовательскую функцию с именем equals2:
_$ (defun equals2(num)(= num 2))
EQUALS2
_$ (mapcar 'equals2 '(1 2 3 4))
(nil T nil nil)
Однако, функцию equals2 можно и не описывать отдельно. В таких случаях может пригодиться функция lambda. Она служит для того, чтобы создавать функции «на ходу»; другими словами lambda описывает анонимные функции. Иногда lambda определяется как анонимная функция. Например, вместо описания функции equals2можно использовать выражение lambda для выполнения той же операции:
_$ (mapcar '(lambda (num) (= num 2)) '(1 2 3 4))
(nil T nil nil)
В данном фрагменте кода выполняется следующее:
(= 1 2) -> nil
(= 2 2) -> T
(= 3 2) -> nil
(= 4 2) -> nil
После этих пояснений работа функции gp:FindPointInList становится понятной. Снова обратимся к комментариям внутри исходного кода.
 

Содержание раздела