AutoCAD .NET API基础(六) 定义命令和AutoLISP函数

Define Commands and AutoLISP Functions

定义命令和AutoLISP函数

Commands and AutoLISP® functions can be defined with the AutoCAD .NET API through the use of two attributes: CommandMethod and LispFunction. You place one of the two attributes before the method that should be called when the command or AutoLISP function is executed in AutoCAD.

可以通过AutoCAD .NET API编程接口的两个属性来定义命令和AutoLISP函数,这两个属性是:CommandMethodLispFunction。 只需将这两个属性之一放在AutoCAD命令或AutoLISP函数要调用的方法前即可。

Methods used for commands should not be defined with arguments. However, a method used to define an AutoLISP function should be defined with a single argument of the ResultBuffer object type.

用来定义命令的方法不能定义参数,相反,用来定义AutoLISP函数的方法必须定义一个ResultBuffer类型的参数。

Topics in this section本节主题

·         Command Definition 定义命令

·         AutoLISP Function Definition 定义AutoLISP函数

 

 

 

1Command Definition定义命令

When defining a command, you use the CommandMethod attribute. The CommandMethod attribute expects a string value to use as the global name of the command that is being defined. Along with a global command name, the CommandMethod attribute can accept the following values:

定义命令使用CommandMethod属性。CommandMethod属性需要一个字符串值作为要定义的命令的全局名字。除了全局命令名,CommandMethod属性还可以接受下列参数值:

·         Command Flags命令标志 - Defines the behavior of the command 定义命令的行为;

·         Group Name组名 - Command group name 命令编组名称;

·         Local Name本地名 - Local command name, usually language specific 指定语言的本地命令名称;

·         Help Topic Name帮助主题名 - Help topic name that should be displayed when F1 is pressed 按下F1键是将要显示的帮助主题名;

·         Context Menu Type Flags上下文菜单类型标志 - Defines the context menu behavior when the command is active定义命令处于活动状态时的上下文菜单行为;

·         Help File Name帮助文件名 - Help file that contains the help topic that should be displayed when the command is active and F1 is pressed帮助文件,含有命令活动状态下按下F1时要显示的帮助主题;

The following table lists the available flags that can be used to define the behavior of a command.

下表列出了定义命令行为用到的标志:

Enum Value

枚举值

Description

描述

ActionMacro

Command can be recorded as an action with the Action Recorder.

 可以用动作录制器录制命令动作;

DocReadLock

Document will be read locked when command is invoked.

命令执行时将被只读锁定;

Interruptible

The command may be interrupted when prompting for user input.

提示用户输入时可以中断命令;

Modal

Command cannot be invoked while another command is active.

别的命令运行时不能运行此命令;

NoActionRecording

Command cannot be recorded as action with the Action Recorder.

不能用动作录制器录制命令动作;

NoBlockEditor

Command cannot be used from the Block Editor.

不能从块编辑器使用该命令;

NoHistory

Command is not added to the repeat-last-command history list.

不能将命令添加到重复上一个命令历史列表;

NoPaperSpace

Command cannot be used from Paper space.

不能从图纸空间使用该命令;

NoTileMode

Command cannot be used when TILEMODE is set to 1.

TILEMODE1时不能使用该命令;

NoUndoMarker

Command does not support undo markers. This is intended for commands that do not modify the database, and therefore should not show up in the undo file.

命令不支持撤销标记。用于不修改数据库因而也就无需出现在撤销记录中的那些命令;

Redraw

When the pickfirst set or grip set are retrieved, they are not cleared.

 不清空取回的先选择后执行设置及对象捕捉设置;

Session

Command is executed in the context of the application rather than the current document context.

命令运行于应用程序上下文,而不是当前图形文档上下文;

Transparent

Command can be used while another command is active.

别的命令运行时可以运行此命令;

Undefined

Command can only be used via its Global Name.

只能通过全局名使用命令;

UsePickSet

When the pickfirst set is retrieved, it is cleared.

清空取回的先选择后执行设置;

Syntax to Define a Command 定义命令的语法

The following demonstrates the creation of a CommandMethod attribute that defines a command named CheckForPickfirstSelection. The attribute also uses the command flag UsePickSet to indicate that the command is allowed to use the objects that are selected before the command is started.

下面演示使用CommandMethod属性创建一个名为CheckForPickfirstSelection命令,该属性还用UsePickSet命令标志,表示允许该命令使用命令启动前已经选择的对象。

VB.NET

<CommandMethod("CheckForPickfirstSelection", CommandFlags.UsePickSet)> _

Public Sub CheckForPickfirstSelection()

 . . .

End Sub

C#

[CommandMethod("CheckForPickfirstSelection", CommandFlags.UsePickSet)]

public static void CheckForPickfirstSelection()

{

 . . .

}

You can specify the use of more than one flag by using the + operator in VB.NET and the & operator in C#.

VB.NET里的+操作符和C#里的&操作符,可以指定用多个命令标志。

VB.NET

<CommandMethod("CheckForPickfirstSelection", CommandFlags.UsePickSet + _

                                             CommandFlags.NoBlockEditor)> _

Public Sub CheckForPickfirstSelection()

 . . .

End Sub

C#

[CommandMethod("CheckForPickfirstSelection", CommandFlags.UsePickSet &

                                             CommandFlags.NoBlockEditor)]

public static void CheckForPickfirstSelection()

{

 . . .

}

 

 

2AutoLISP Function Definition 定义AutoLISP函数

When defining an AutoLISP function, you use the LispFunction attribute. The LispFunction attribute expects a string value to use as the global name of the AutoLISP function that is being defined. Along with a global function name, the LispFunction structure can accept the following values:

定义AutoLISP函数用LispFunction属性。LispFunction属性需要一个字符串值作为要定义的AutoLISP函数的全局名字。除了全局函数名,LispFunction结构还可接受下列值:

·         Local Name本地名 - Local function name, usually language specific 指定语言的本地函数名;

·         Help Topic Name帮助主题名 - Help topic name that should be associated with the AutoLISP function AutoLISP函数关联的帮助主题名称;

·         Help File Name帮助文件名 - Help file that contains the help topic that should be displayed when the command is active and F1 is pressed帮助文件,含有命令活动状态下按下F1时要显示的帮助主题;

Syntax to Define an AutoLISP Function 定义AutoLISP函数的语法

The following demonstrates the creation of a LispFunction attribute that defines an AutoLISP function named InsertDynamicBlock.

下面演示用LispFunction属性创建了一个名为InsertDynamicBlockAutoLISP函数。

VB.NET

<LispFunction("InsertDynamicBlock")> _

Public Sub InsertDynamicBlock(ByVal rbArgs As ResultBuffer)

 . . .

End Sub

C#

[LispFunction("InsertDynamicBlock ")]

public static void InsertDynamicBlock (ResultBuffer rbArgs)

{

 . . .

}

Retrieve Values Passed into an AutoLISP Function 检索传入AutoLISP函数的值

Use a Foreach loop to step through the values returned in the ResultBuffer by the AutoLISP function. A ResultBuffer is a collection of TypedValue objects. The TypeCode property of a TypedValue object can be used to determine the value type for each value passed into the AutoLISP function. The Value property is used to return the value of the TypedValue object.

使用Foreach循环遍历AutoLISP函数返回的ResultBuffer中的值。ResultBufferTypedValue(值类型)对象的集合。TypedValue对象的TypeCode属性用来确定传入AutoLISP函数的每个值的类型,Value属性则返回TypedValue对象的值。

To define an AutoLISP Function 定义一个AutoLISP函数

This example code defines an AutoLISP function named DisplayFullName. While the method defined in the .NET project accepts a single value, the AutoLISP function expects two string values to produce the correct output.

本例代码定义一个名为DisplayFullNameAutoLISP函数。.NET项目里定义的方法接受一个值,而所定义的AutoLISP函数需要两个字符串值来产生正确的输出结果。

Load the .NET project into AutoCAD and enter the following at the Command prompt:

.NET项目加载到AutoCAD,在命令提示行输入下列lisp指令:

(displayfullname "First" "Last")

The following is the output displayed after the AutoLISP function is executed:

下面是AutoLISP函数执行后显示的输出结果:

Name: First Last

VB.NET

Imports Autodesk.AutoCAD.Runtime

Imports Autodesk.AutoCAD.ApplicationServices

Imports Autodesk.AutoCAD.DatabaseServices;

 

<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

C#

using Autodesk.AutoCAD.Runtime;

using Autodesk.AutoCAD.ApplicationServices;

using Autodesk.AutoCAD.DatabaseServices;

 

 

[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);

  }

}

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值