B2_C# CAD-2

和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. 执行结果

设置断点,监视执行:


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

热门相关:斗神战帝   夫人,你马甲又掉了!   法医王妃不好当!   重生之至尊千金   朕是红颜祸水