EaBIM一直以来积极响应国家“十二五”推进建筑业信息化的号召,对建筑领域的信息技术开展深入技术交流和探讨!致力于打造“BIM-建筑师-生态技术”三位一体综合资源交流共享平台,希望为BIM与可持续设计理念及技术的普及做出微小的贡献!!!

EaBIM

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 1077|回复: 15
打印 上一主题 下一主题

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

[复制链接]

1514

主题

7465

帖子

1万

积分

admin

Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10Rank: 10

积分
12404

社区QQ达人

跳转到指定楼层
楼主
发表于 2014-1-8 16:12:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 functionAutoLISP函数关联的帮助主题名称;
·
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);

}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 反对反对

相关帖子

工作时间:工作日的9:00-12:00/13:30-18:00,节假日不在线,请勿留言

28

主题

924

帖子

2115

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
2115
3F
发表于 2014-5-13 10:19:44 | 只看该作者
顶...... 楼下跟上.....

7

主题

865

帖子

1435

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1435
4F
发表于 2014-5-13 10:25:04 | 只看该作者
路过!!! 不发表意见……

4

主题

764

帖子

1270

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1270
7F
发表于 2014-5-22 15:37:53 | 只看该作者
路过!!! 不发表意见……

23

主题

538

帖子

1101

积分

BIM项目负责人

Rank: 5Rank: 5Rank: 5Rank: 5Rank: 5

积分
1101
8F
发表于 2014-5-22 15:46:48 | 只看该作者
(*^__^*) 嘻嘻……

11

主题

892

帖子

1455

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1455
11F
发表于 2014-6-11 18:13:24 | 只看该作者
顶...... 楼下跟上.....

6

主题

873

帖子

1347

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1347
13F
发表于 2014-6-13 14:14:03 | 只看该作者
(*^__^*) 嘻嘻……

15

主题

899

帖子

1462

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1462
14F
发表于 2014-6-13 14:20:09 | 只看该作者
顶......
楼下跟上.....

13

主题

840

帖子

1580

积分

BIM经理

Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6Rank: 6

积分
1580
15F
发表于 2014-6-13 14:29:45 | 只看该作者
路过!!!
不发表意见……
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|EaBIM网 ( 苏ICP备2020058923号-1  苏公网安备32011502011255号

GMT+8, 2024-11-23 13:39

Powered by Discuz! X3.2 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表