文章

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