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#里的&操作符,可以指定用多个命令标志。

CommandFlags.NoBlockEditor)> _

Public Sub CheckForPickfirstSelection()

. . .

End Sub

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 function name,usually language specific 指定语言的本地函数名; - Help topic name that should be associated with the AutoLISP function AutoLISP函数关联的帮助主题名称

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.

本例代码定义一个名为displayFullName.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);

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强制返回为文本 -------------------------------- 数字类型的格式化 --------------------------------     固定格式参数:     General Number 普通数字,如可以用来去掉千位分隔号     format$("100,1
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办法, Format 或者FormatDateTime 竟然结果和系统设置的区域语言的日期和时间格式相关。意思是尽管你用诸如 Format(Now, "MM/dd/yyyy"),如果系统的设置格式区域语言的日期和时间格式分隔符是"-",那他还会显示为 MM-dd-yyyy     只有拼凑: <%response.write
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace My ‘全局错误处理,新的解决方案直接添加本ApplicationEvents.vb 到工程即可 ‘添加后还需要一个From用来显示错误。如果到这步还不会则需要先打好基础啦 ‘======================================================== ‘以下事件
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用的爽呀,这篇文章写与2011年,看来我以前没有认真去找这个方法呀。 https://blog.csdn.net/chzjxgd/article/details/6176325 金蝶K3 BOS的插件官方是用VB6编写的,如果  能用.Net下的语言工具开发BOS插件是一件很愉快的事情,其中缘由不言而喻,而本文则是个人首创,实现在了用V
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integer, y As Integer, subStr As String If MsgBox("确定要分列处理吗?请确定分列的数据会覆盖它后面的单元格!", _
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single) 2 Dim path As String, hash As String 3 For Each fil
  Imports MySql.Data.MySqlClient Public Class Form1 ‘ GLOBAL DECLARATIONS Dim conString As String = "Server=localhost;Database=net2;Uid=root;Pwd=123456;" Dim con As New MySqlConnection
‘導入命名空間 Imports ADODB Imports Microsoft.Office.Interop   Private Sub A1() Dim Sql As String Dim Cnn As New ADODB.Connection Dim Rs As New ADODB.Recordset Dim S As String   S = "Provider=OraOLEDB.Oracl
Imports System.IO Imports System.Threading Imports System.Diagnostics Public Class Form1 Dim A(254) As String    Function ping(ByVal IP As Integer) As String Dim IPAddress As String IPAddress = "10.0.
VB运行EXE程序,并等待其运行结束 参考:https://blog.csdn.net/useway/article/details/5494084 Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Pr
今天碰到一个问题,登陆的时候,如果不需要验证手机号为空,则不去验证手机号 因为登陆的时候所有的验证信息都存放在一个数组里 Dim CheckUserInfo() As String ={UserBirthday, SecEmail, UserMob, UserSex, RealNameFirst, RealName, CheckCardID, CheckCardType, Contactemail
在VB6.0中,数据访问接口有三种: 1、ActiveX数据对象(ADO) 2、远程数据对象(RDO) 3、数据访问对象(DAO) 1.使用ADO(ActiveX Data Objec,ActiveX数据对象)连接SQL Server 1)使用ADO控件连接 使用ADO控件的ConnectionString属性就可以连接SQL Server,该属性包含一个由分号分隔的argument=value语
注:大家如果没有VB6.0的安装文件,可自行百度一下下载,一般文件大小在200M左右的均为完整版的软件,可以使用。   特别提示:安装此软件的时候最好退出360杀毒软件(包括360安全卫士,电脑管家等,如果电脑上有这些软件的话),因为现如今的360杀毒软件直接会对VB6.0软件误报,这样的话就可能会在安装过程中被误报阻止而导致安装失败,或者是安装后缺乏很多必须的组件(其它的杀毒软件或安全卫士之类的
Private Sub Form_Load() Call conndb End Sub Private Function conndb() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim strCn, sql As String Dim db_host As String Dim db_user As String
  PPSM06S70:  Add  moddate  EDITSPRINTJOB:  MAX(TO_CHAR(ETRN.MODDATE, ‘yyyy/mm/dd/HH24:MI AM‘)) ACTUAL_SHIPDATE   4.Test Scenario (1) :Query SQL Test DN:8016578337 SELECT CTRN.TKCTID TRUCK_ID,        
  沒有出現CrystalReportViewer時,須安裝CRforVS_13_0. 新增1個數據集,新增1個數據表,添加二列,列名要和資料庫名一樣. 修改目標Framework 修改app.config, <startup >改成<startup useLegacyV2RuntimeActivationPolicy ="true">  CrystalReport1.rpt增加數據庫專家 在表單
Imports System.Threading Imports System Public Class Form1 Dim th1, th2 As Thread Public Sub Method1() Dim i As Integer For i = 1 To 100 If Me.Label1.BackColor =
Friend Const PROCESS_ALL_ACCESS = &H1F0FFF = 2035711 Friend Const PROCESS_VM_READ = &H10 Friend Const PROCESS_VM_WRITE = &H20 Friend Const PAGE_READONLY = &H2 Friend Const PAGE_READWRITE = &H4 Friend
以下代码随手写的 并没有大量测试 效率也有待提升 如果需要C#的请自行转换 Function SplitBytes(Data As Byte(), Delimiter As Byte()) As List(Of Byte()) Dim i = 0 Dim List As New List(Of Byte()) Dim bytes As New
Imports System.Data.SqlClient Public Class Form1 REM Public conn1 As SqlConnection = New SqlConnection("server=.; Integrated Security=False;Initial Catalog= mydatabase1; User ID= sa;password")