C# 创建AutoLisp可以使用的函数方法
快速例子:
//引入了这个库
using Autodesk.AutoCAD.Runtime; // 使用了CommandClass特性类
using Autodesk.AutoCAD.DatabaseServices; // 使用了TypedValue|ResultBuffer
using Autodesk.AutoCAD.ApplicationServices.Core; // 使用了Application
//声明自定义特性,使用CommandClass特性类标记LispFunctions类为命令类
//这样CAD在加载插件后就能将此类下的方法进行命令注册
[assembly: CommandClass(typeof(LispFunctions))]
namespace MyPlugin.Command
{
public class LispFunctions
{
//注册一个测试函数
//在lisp中使用(TestCommand "hello" "world")进行调用
[LispFunction("TestCommand")]
public void TestCommand(ResultBuffer rbArgs)
{
//获取参数
TypedValue[] args = rbArgs.AsArray();
//判断参数个数
if (args.Length != 2)
{
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage("参数个数不正确");
return;
}
string hello = args[0].Value.ToString();
string world = args[1].Value.ToString();
Application.DocumentManager.MdiActiveDocument.Editor.WriteMessage($"{hello} {world}");
}
}
}
带返回值:
带返回值的方法,返回值也可以用ResultBuffer 进行包装
//在lisp中使用(TestCommand "天王盖地虎")进行调用
[LispFunction("TestCommand")]
public object TestCommand(ResultBuffer rbArgs)
{
//获取参数
var args = rbArgs.AsArray();
//判断参数个数
if (args.Length != 1)
{
CadApp.DocumentManager.MdiActiveDocument.Editor.WriteMessage("参数个数不正确");
throw new Exception(ErrorStatus.InvalidInput,"参数个数不正确");
}
var ask= args[0].Value.ToString();
var answer="听不懂你在说什么?";
if(ask=="天王盖地虎")
answer="宝塔镇河妖";
return new ResultBuffer(new TypedValue((int)DxfCode.Text, answer));
//return "宝塔镇河妖";
//return 12345;
//return 1.2;
//return true;
//return 1.2f; 类型转换无效
}
直接在Cad中执行会打印出返回值
((1 . "宝塔镇河妖"))
如果不使用ResultBuffer包装,直接返回字符串的话结果会是
"宝塔镇河妖"
但是只能直接返回string|int|double|bool等,复杂的数据必须TypedValue包装返回。
拓展:
ResultBuffer
转换为数组后类型为TypedValue[]
TypedValue
的初始化方法有两个参数 new TypedValue((int)DxfCode.Bool, true);
第一个参数为类型编号,可以使用DxfCode枚举类型。
License:
CC BY 4.0