和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. 执行结果
设置断点,监视执行:

在指定位置插入相应的块:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |