Определение LISP-функций

При определении функции AutoLISP (LISP) используется атрибут LispFunction (полное имя Autodesk.AutoCAD.Runtime.LispFunctionAttribute). Атрибут LispFunction ожидает строковое значение для использования в качестве глобального имени определяемой функции AutoLISP. Наряду с глобальным именем функции структура LispFunction может принимать те же значения, что и CommandMethod (о нём см. статью раннее).

[LispFunction("DisplayFullName")]
public static void DisplayFullName(ResultBuffer rbArgs)
{
  //...
}

Вызов из-под LISP:

(displayfullname "First" "Last")

Получение значений, переданных в LISP-функцию

Используйте цикл foreach для перебора значений, возвращаемых в ResultBuffer функцией AutoLISP. ResultBuffer - это коллекция объектов TypedValue. Свойство TypeCode объекта TypedValue можно использовать для определения типа значения для каждого значения, переданного в функцию AutoLISP. Свойство Value используется для возврата значения объекта TypedValue. Поддерживаются следующие типы данных:

using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;

public class Loader
{
    [LispFunction("DisplayFullName")]
    public static void DisplayFullName(ResultBuffer rbArgs)
    {
        if (rbArgs != null)
        {
            string strVal1 = "";
            string strVal2 = "";
            int nCnt = 0;
            foreach (TypedValue rb in rbArgs)
            {
                if (rb.TypeCode == (int)Autodesk.AutoCAD.Runtime.LispDataType.Text)
                {
                    switch (nCnt)
                    {
                        case 0:
                            strVal1 = rb.Value.ToString();
                            break;
                        case 1:
                            strVal2 = rb.Value.ToString();
                            break;
                    }
                    nCnt = nCnt + 1;
                }
            }
            Application.DocumentManager.MdiActiveDocument.Editor.
               WriteMessage("\\nName: " + strVal1 + " " + strVal2);
        }
    }
}

Пример кода выше определяет LISP-функцию с именем DisplayFullName. В то время как в .NET-проекте метод принимает только одно значение (ResultBuffer), соответствующая функция в AutoLISP ожидает 2 строковых значения для получения правильного вывода в .NET (см. реализацию). Загрузите скомпилированную библиотеку классов в AutoCAD и затем обратитесь к команде из-под LISP:

(displayfullname "First" "Last")

Выводом в консоль будут следующие данные:

Name: First Last