3.6.2. Определение функций AutoLISP

Источник здесь. [перевод не проверен];[перевёл Андрей Бушман]

    Когда определяется функция AutoLISP, вы должны использовать атрибут LispFunction. Он ожидает строковое значение, используемое как глобальное имя функции AutoLISP, которая будет вами определена. Согласно глобальному имени функции, структура LispFunction может принимать следующие значения:
  • Local Name - Локальное имя функции, обычно специфичное для используемого языка.
  • Help Topic Name - Наименование раздела справки, с которой должна ассоциироваться функция AutoLISP.
  • Help File Name - Имя файла справки, содержащего раздел справки, который должен быть отображён при активной команде, если будет нажата клавиша F1.

Синтаксис определения функции AutoLISP

    Следующий код демонстрирует создание атрибута LispFunction, который определяет функцию AutoLISP под именем InsertDynamicBlock.

Код VB.NET

   1:  <LispFunction("InsertDynamicBlock")> _
   2:  Public Sub InsertDynamicBlock(ByVal rbArgs As ResultBuffer)
   3:   . . .
   4:  End Sub

Код C#

   1:  [LispFunction("DisplayFullName")]
   2:  public static void DisplayFullName(ResultBuffer rbArgs)
   3:  {
   4:   . . .
   5:  }

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

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

Определение функции AutoLISP

    Пример этого кода определяет функцию AutoLISP под именем DisplayFullName. В то время как метод определённый в проекте .Net принимает  в качестве аргумента единственное значение, функция AutoLISP, в свою очередь, ожидает два строковых значения, для корректного вывода данных.

    Загрузите .Net проект в AutoCAD и введите в командную строку следующую фразу:
(displayfullname "First" "Last")
    После выполнения функции AutoLISP будут выведены следующие данные:
Имя: First Last

Код VB.NET

   1:  Imports Autodesk.AutoCAD.Runtime
   2:  Imports Autodesk.AutoCAD.ApplicationServices 
   3:  <LispFunction("DisplayFullName")> _
   4:  Public Sub DisplayFullName(ByVal rbArgs As ResultBuffer)
   5:    If Not rbArgs = Nothing Then
   6:        Dim strVal1 As String = "", strVal2 As String = "" 
   7:        Dim nCnt As Integer = 0
   8:        For Each rb As TypedValue In rbArgs
   9:            If (rb.TypeCode = Autodesk.AutoCAD.Runtime.LispDataType.Text) Then
  10:                Select Case nCnt
  11:                    Case 0
  12:                        strVal1 = rb.Value.ToString()
  13:                    Case 1
  14:                        strVal2 = rb.Value.ToString()
  15:                End Select 
  16:                nCnt = nCnt + 1
  17:            End If
  18:        Next
  19:        Application.DocumentManager.MdiActiveDocument.Editor. _
  20:           WriteMessage(vbLf & "Имя: " & strVal1 & " " & strVal2)
  21:    End If
  22:  End Sub

Код C#

   1:  using Autodesk.AutoCAD.Runtime;
   2:  using Autodesk.AutoCAD.ApplicationServices;
   3:  [LispFunction("DisplayFullName")]
   4:  public static void DisplayFullName(ResultBuffer rbArgs)
   5:  {
   6:    if (rbArgs != null)
   7:    {
   8:        string strVal1 = "";
   9:        string strVal2 = ""; 
  10:        int nCnt = 0;
  11:        foreach (TypedValue rb in rbArgs)
  12:        {
  13:            if (rb.TypeCode == (int)Autodesk.AutoCAD.Runtime.LispDataType.Text)
  14:            {
  15:                switch(nCnt)
  16:                {
  17:                    case 0:
  18:                        strVal1 = rb.Value.ToString();
  19:                        break;
  20:                    case 1:
  21:                        strVal2 = rb.Value.ToString();
  22:                        break;
  23:                }
  24:                nCnt = nCnt + 1;
  25:            }
  26:        }
  27:        Application.DocumentManager.MdiActiveDocument.Editor.
  28:           WriteMessage("\nИмя: " + strVal1 + " " + strVal2);
  29:    }
  30:  }


Comments