用.NET执行AutoCAD自带命令

看到网上很多文章说什么以前用其他语言时执行AutoCAD中自带的命令非常方便,而.Net使用时非常不方便。这样说也不算错,因为在AutoCAD 2015之前,.Net自带的执行命令的方法只有一种,而且还是异步执行的,非常鸡肋。
先总结一下现在.Net中可以使用的执行AutoCAD中的命令的5种方法:
1、托管类Document中的SendStringToExceute方法
2、COM类中Document的SendCommand方法
3、通过P/Invoke调用acedPostCommand方法
4、通过P/Invoke调用ads_queueexpr方法
5、托管类中的Editor的Command方法(从AutoCAD2015才开始支持)
这里我会详细介绍1,2两种方法,3,4可以参照Kean大神的文章:http://through-the-interface.typepad.com/through_the_interface/2006/08/calling_command.html。
第5种方法也非常简单,只不过要在AutoCAD 2015中才能使用,如果你用的是AutoCAD 2015那么恭喜你,你直接使用方法5就可以了,非常方便。具体我也不详述了。
第一种方法:
这种方法之所以说鸡肋是因为命令是异步执行的,也就是说SendStringToExecute只是将命令发送到AutoCAD中,不会等命令执行,而进行后面的步骤。直到C#代码执行完毕,AutoCAD才开始执行命令。(可以参照http://www.360doc.com/content/12/0909/14/8463843_235167127.shtml)
这当然在一些情况下也非常好用,但是不能满足我们的要求,有时我们希望命令同步执行,也就是说等待AutoCAD执行完“QSAVE”命令后才执行下一步。那么第二种方法就派上用场了。
代码也非常简单,但由于此方法是使用.NET COM互操作程序集能访问的COM Automation库的SendCommand方法,所以我们也要增加一些引用才行。
需要添加“AutoCAD”和“AXDBLib”两个COM引用,但我在添加引用时遇到如下问题:
http://tson.com/wp-content/uploads/2016/02/AutoCAD%E5%BC%95%E7%94%A8.png
那个AutoCAD 2010 Type Library就是AutoCAD的引用,添加上去就可以了,但是大家反映AXDBLib是AutoCAD/ObjectDBX Common 18.0这样一个COM库我的没有,这让我非常伤脑筋。
当然这个也可以通过文件添加,AutoCAD/ObjectDBX Common 18.0
你以为到这里就讲完了吗?你太天真了。
如果大家实践会发现,用上面第二种方法命令依旧是异步执行的。。。太悲剧了。事实时我们只要用命令做一些设置就可以让SendCommand异步执行。
上面一段代码就会先画圆再出现警告。
而这一段代码就会先警告再画圆。
好了,就到这里吧,我觉得这些就够用了。至于具体哪种方法好,大家自己在实际使用中自己体会吧。