和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. 執行結果
設定斷點,監視執行:

在指定位置插入相應的塊:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/552529.html
標籤:其他
上一篇:namespace,pv 一直Terminating狀態處理
下一篇:返回列表
