和Visual Lisp 不同,C#要和CAD交互,需要建立交互环境。
不同的CAD版本,略有差异,本文以CAD 2013为例说明。
1. 添加引用
增加下面2个文件:acax19enu.tlb ,axdb19enu.til;
这两个文件在Autodesk Shared目录下:
添加引用:
2. 建立连接
将打开CAD命令放到try 和catch 中是非常必要的,要判断AutoCAD是否打开,如果没有打开,要打开。
点击查看代码
try
{
AcadApp = (AcadApplication)System.Runtime.InteropServices.Marshal.GetActiveObject("AutoCAD.Application.19");
}
catch
{
AcadApp = new AcadApplicationClass();
}
3. 执行CAD命令
插入一个块的买命令如下:
点击查看代码
AcadApp.ActiveDocument.Utility.Prompt("给定插入点:");
insertionPoint = (double[])AcadApp.ActiveDocument.Utility.GetPoint();
Function_CAD.InsertBlock(AcadApp, insertionPoint, "电机主回路-全抽屉"); //主回路
为了便于管理,所以相关的CAD功能都集成在一个文件中:Function_CAD;
public static void InsertBlock(AcadApplication AcadApp, double[] StartingXPoint, string BlockName)
{
AcadBlockReference blockObj;
MessageFilter.Register();
blockObj = AcadApp.ActiveDocument.ModelSpace.InsertBlock(StartingXPoint, BlockName, 1, 1, 1, 0);
MessageFilter.Revoke();
}
4. 需要注意的问题
如果CAD命令没有执行完或者同步出现问题,系统会出现以下错误:
将要执行的命令放到下面语句中间,可以很好的解决这个问题:
MessageFilter.Register();
需要执行的CAD命令
MessageFilter.Revoke();
点击查看代码
public static void Register()
{
IOleMessageFilter newFilter = new MessageFilter();
IOleMessageFilter oldFilter = null;
CoRegisterMessageFilter(newFilter, out oldFilter);
}
// Done with the filter, close it.
public static void Revoke()
{
IOleMessageFilter oldFilter = null;
CoRegisterMessageFilter(null, out oldFilter);
}
上述代码是微软的开源代码;
5. 执行结果
设置断点,监视执行:
在指定位置插入相应的块: