AutoLISP 関数を定義するときは、LispFunction 属性を使用します。LispFunction 属性では、定義する AutoLISP 関数のグローバル名として文字列値を使用する必要があります。LispFunction 構造体は、グローバル関数名と共に次の値を使用することができます。
次の例は、InsertDynamicBlock という AutoLISP 関数を定義する LispFunction 属性の作成を示しています。
<LispFunction("InsertDynamicBlock")> _ Public Sub InsertDynamicBlock(ByVal rbArgs As ResultBuffer) . . . End Sub
[LispFunction("DisplayFullName")] public static void DisplayFullName(ResultBuffer rbArgs) { . . . }
Foreach ループを使用して、AutoLISP 関数が ResultBuffer で返す値をステップ実行します。ResultBuffer は、TypedValue オブジェクトのコレクションです。TypedValue オブジェクトの TypeCode プロパティは、AutoLISP 関数に渡される各値の型を判断するために使用できます。Value プロパティは、TypedValue オブジェクトの値を返すために使用されます。
このコード例では、DisplayFullName という名前の AutoLISP 関数を定義します。.NET プロジェクトで定義されたメソッドは 1 つの値を受け入れますが、この AutoLISP 関数が正しい出力を生成するには 2 つの文字列値が必要です。
.NET プロジェクトを AutoCAD にロードし、コマンド プロンプトに次のように入力します。
(displayfullname "First" "Last")
AutoLISP 関数を実行すると、次の出力が表示されます。
Name: First Last
Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.ApplicationServices <LispFunction("DisplayFullName")> _ Public Sub DisplayFullName(ByVal rbArgs As ResultBuffer) If Not rbArgs = Nothing Then Dim strVal1 As String = "", strVal2 As String = "" Dim nCnt As Integer = 0 For Each rb As TypedValue In rbArgs If (rb.TypeCode = Autodesk.AutoCAD.Runtime.LispDataType.Text) Then Select Case nCnt Case 0 strVal1 = rb.Value.ToString() Case 1 strVal2 = rb.Value.ToString() End Select nCnt = nCnt + 1 End If Next Application.DocumentManager.MdiActiveDocument.Editor. _ WriteMessage(vbLf & "Name: " & strVal1 & " " & strVal2) End If End Sub
using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; [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); } }