前一段時(shí)間在做CAD二次開(kāi)發(fā)。不管是誠(chéng)懇地說(shuō)還是不誠(chéng)懇地說(shuō),做出來(lái)的東西都很坑爹,不值一提。現(xiàn)在那個(gè)任務(wù)已經(jīng)暫告一個(gè)段落了,所以寫(xiě)篇博客把值得總結(jié)得東西記錄下來(lái)。下面的兩個(gè)技巧都是困惑了很長(zhǎng)時(shí)間才解決的,應(yīng)當(dāng)略有一些價(jià)值。
第一個(gè)技巧是啟動(dòng)CAD的方法。CAD二次開(kāi)發(fā)的技術(shù)貌似有很多種,我不太熟悉所以不一一列舉。我是在
首先當(dāng)然是添加引用(如果沒(méi)有裝CAD的話(huà),第一步的第一步是先安裝CAD)。我這里添加的引用有三個(gè),分別是AutoCAD,AXDBLib,MPolygonComlib。我忘了是不是有哪一條可以刪除了?
然后using下面兩條
using
using
然后在窗體所在的命名空間里寫(xiě)這么一行
[ComImport,
#p#分頁(yè)標(biāo)題#e#然后在這個(gè)命名空間里寫(xiě)一個(gè)接口
public
然后在窗體類(lèi)里寫(xiě)上下面這些東西
[DllImport("ole32.dll")]
static extern int CoRegisterMessageFilter(IMessageFilter lpMessageFilter, out IMessageFilter lplpMessageFilter);#p#分頁(yè)標(biāo)題#e#
int IMessageFilter.HandleInComingCall(int dwCallType, IntPtr hTaskCaller, int dwTickCount, IntPtr lpInterfaceInfo)
{
}
int IMessageFilter.RetryRejectedCall(IntPtr hTaskCallee, int dwTickCount, int dwRejectType)
{
}
int IMessageFilter.MessagePending(IntPtr hTaskCallee, int dwTickCount, int dwPendingType)
{
}
然后在窗體的構(gòu)造函數(shù)里加上兩行,把構(gòu)造函數(shù)弄成下面這樣
public Form1()
{
}
#p#分頁(yè)標(biāo)題#e#以上內(nèi)容除了加引用以外我都不知道是干什么用的,不過(guò)經(jīng)過(guò)實(shí)驗(yàn)以上內(nèi)容缺了哪一行都不能啟動(dòng)CAD。
接下來(lái)的步驟就比較清晰了。
AcadApplication pCAD;
System.Type oType = System.Type.GetTypeFromProgID("AutoCAD.Application");
pCAD = System.Activator.CreateInstance(oType,true) as AcadApplication;
pCAD.Visible = true;
pCAD.Documents.Open("CAD文件的路徑",
CAD就成功啟動(dòng)了。
第二個(gè)技巧是用代碼往CAD里發(fā)送命令行。說(shuō)起來(lái)很慚愧,有很多操作,比如合并多段線(xiàn),我沒(méi)有找到相應(yīng)的接口。解決方法之一是讀取兩條多段線(xiàn)的坐標(biāo),新畫(huà)一條合并后的多段線(xiàn)并刪除兩個(gè)舊的多段線(xiàn),但是這個(gè)做法太惡心了。于是我找到了一個(gè)方法,用代碼往CAD里發(fā)送命令行。下面是一句合并多段線(xiàn)的代碼。
pCAD.ActiveDocument.SendCommand("pen(handent""
里面這個(gè)命令行等價(jià)于下面這個(gè)操作。
首先,在CAD里輸入命令pe,回車(chē),進(jìn)入多段線(xiàn)操作。
然后,如果是在CAD#p#分頁(yè)標(biāo)題#e#里直接操作的話(huà),這個(gè)時(shí)候應(yīng)該用鼠標(biāo)選擇一個(gè)實(shí)體。但是代碼不能實(shí)現(xiàn)這個(gè)操作,所以要用代碼指定一個(gè)實(shí)體。例如(handent"EX21")是指定了編號(hào)為EX21的實(shí)體。這個(gè)實(shí)體用代碼表示是"(handent""
然后,往CAD里輸入命令j,即選擇合并多段線(xiàn)命令。
然后再用代碼選中另外一個(gè)實(shí)體,比如"XE78"號(hào)實(shí)體。這相當(dāng)于在CAD中輸入(handent"XE78")并回車(chē)。
然后再回車(chē),合并兩條多段線(xiàn)。
輸入(command),回車(chē),退出多段線(xiàn)操作命令。在CAD中,這個(gè)操作可以通過(guò)點(diǎn)擊esc鍵實(shí)現(xiàn),但是用代碼的話(huà)只能輸入(command)并回車(chē)。
用代碼發(fā)送命令行跟直接往CAD里輸入命令行是一樣的,上面那句代碼執(zhí)行后CAD的命令行窗口里會(huì)顯示相應(yīng)的命令。上面這個(gè)例子說(shuō)明了命令行的構(gòu)造規(guī)則,其他命令可以按照這個(gè)規(guī)則構(gòu)造。同時(shí)這導(dǎo)致一個(gè)問(wèn)題,即代碼執(zhí)行完畢前千萬(wàn)不要點(diǎn)擊CAD窗口,否則點(diǎn)擊操作可能被視為一個(gè)選擇實(shí)體的操作,從而干擾命令行的執(zhí)行。例如,如果系統(tǒng)認(rèn)為點(diǎn)擊操作是在"pen"之后、"(handent""
致謝:肖澤云編著的《基于Visual
相關(guān)文章
- 2021-08-23精通AutoCAD三維設(shè)計(jì)與開(kāi)發(fā)PDF下載
- 2021-08-22AutoCAD 2013應(yīng)用與開(kāi)發(fā)系列中文版AutoCAD 2013室內(nèi)裝
- 2021-08-22AutoCAD 2013應(yīng)用與開(kāi)發(fā)系列中文版AutoCAD 2013機(jī)械圖
- 2021-08-19數(shù)字化成圖-最新AutoCAD地形圖測(cè)繪高級(jí)開(kāi)發(fā)PDF下載
- 2021-08-03Autodesk RevitStructure2012應(yīng)用寶典 [歐特克軟件(中
- 2021-08-02Autodesk RevitMEP2012應(yīng)用寶典 [歐特克軟件(中國(guó))有限
- 2021-08-02Autodesk Revit2013族達(dá)人速成 [歐特克軟件(中國(guó))有限公
- 2021-08-01Visual Basic與AutoCAD二次開(kāi)發(fā)PDF下載
- 2021-07-31Autodesk Revit2012族達(dá)人速成 [歐特克軟件(中國(guó))有限公
- 2021-07-18AutoCAD VBA開(kāi)發(fā)手冊(cè)PDF下載