AutoCAD/Civil 3D 學習筆記


Civil學習筆記

1.環境配置

1、添加引用:

Civil二次開發需要5個基本的AutoCAD的dll引用-acdbmgd.dll, acmgd.dll, accoremgd.dll, AecBaseMgd.dll, AeccDbMgd.dll。以后的開發的話可以根據需求來添加dll(需要下載Autodesk ObjectARX開發包,dll都在inc文件夾中)。

2、調試配置:

項目->屬性->調試

啟動操作->啟動外部程序->選擇Civil安裝路徑(包含acad.exe)

啟動選項->命令行參數->填寫如下:

/ld "C:\Program Files\AutoCAD Civil 3D 2013\AecBase.dbx"

/p "<<C3D_Imperial>>"

下面是關於AutoCAD啟動命令行參數詳解:

http://blog.sina.com.cn/s/blog_6848608101017v4w.html

其中,AecBase.dbx:dbx是AutoCAD數據庫擴展如下圖

image

<<C3D_Imperial>>:應該是Civil3D環境的配置信息,其中Imperial(英制)與它相對的還有Metric(公制)

命令參數填寫完后選擇工作目錄(Working directory),我的理解是dll在哪執行,例如, C:\Program Files\AutoCAD Civil 3D 2014\UserDataCache\

這個鏈接是關於工作目錄定義的解釋

http://www.cnblogs.com/fsjohnhuang/articles/2540440.html

http://bbs.csdn.net/topics/390509308

note:Civil3D中文版的UserDataCache目錄是

\Autodesk AutoCAD Civil 3D 2014\zh-CN\UserDataCache

3、加載開發的dll

打開Civil3D,在命令欄中輸入NETLOAD命令,這時會彈出個文件選擇框,接着選擇你開發dll的路徑點擊確認就可以了,然后在命令欄中輸入你開發的dll命令的方法名稱就會執行了。

4、調試開發的dll

打開VS,設置斷點按F5調試運行,因為上面調試的配置,所以Civil3D也會跟着啟動。Civil3D開發后執行上面3的步驟就可以了。

2. 在.NET中使用COM API

有些功能.NET API還沒有/完全實現,這時就需要用到COM API了

1、添加引用

找到Civil 3D安裝目錄找到下面的dll。

Autodesk.AEC.Interop.Base

Autodesk.AEC.Interop.UiBase

Autodesk.AutoCAD.Interop

Autodesk.AutoCAD.Interop.Common

Autodesk.AECC.Interop.<Civil方面的對象>

Autodesk.AECC.Interop.Ui< Civil方面的對象>

選擇上面的引用后,將引用的“復制本地(Copy Local)”屬性設為true

最后在項目中使用using語句引用就可以了。

注:為什么要把“復制本地”屬性設為true?因為引用的這些dll在運行的時候不需要的。還有Com的dll默認情況下“復制本地”屬性是不可選的。要讓它可選的話,修改“嵌入互操作類型”屬性為False就可以了(默認為true)。如果默認“嵌入互操作類型”的值,有可能會引發-無法嵌入互操作類型“……”的異常。解決方法就是“嵌入互操作類型”屬性設為False。網上找的資料:

http://www.cnblogs.com/pnljs/archive/2012/02/20/2359313.html

3. 自定義實體

現在還沒有提供.NET API自定義實體接口只能通過ObjectARX的方式來實現。ObjectARX用C++/CLI語言來開發。C++/CLI(Common Language Infrastructure)是C++在.NET平台上的擴展。C++/CLI即可以操作本地堆也可以操作托管堆。

注意:自定義實體只能做一些與實體有關的事兒,如果想執行CAD命令或與實體無關的操作請用ObjectARX C++編寫然后用P/Invoke在.NET中調用。否則會出現難以預料的問題。

4. 獲得/設置系統變量

AutoCAD

獲得Application. GetSystemVariable(string name) ,設置Application.SetSystemVariable(string name,object val) 。或這樣db.系統變量名稱=值

設置AutoCAD單位

Application.DocumentManager.MdiActiveDocument.Database.Insunits=UnitsValue.Feet;

5.AutoCAD Civil3D系統設定

SettingsDrawing—圖紙設定

AbbreviationsSettings---縮寫設定

ObjectLayerSettings--對象圖層設定

TransformationSettings--變換設定

UnitZoneSettings--單位和分帶設定

AmbientSettings--環境設定

6.AutoCAD .NET API執行COM方法

如果你想在AutoCAD .NET API執行ObjectARX C++中的方法(ads_queueexpr、acedPostCommand、acedCmd)的話就需要使用P/Invoke技術了。例如

[System.Security.SuppressUnmanagedCodeSecurity]
[DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "?acedPostCommand@@YAHPEB_W@Z")]
private static extern int acedPostCommand(string strExpr);

其中DllImport函數中第一個參數是dll/exe名稱,不同CAD版本的話這個名稱是不一樣的。反正2014用的是accore.dll,其他版是acad.exe。ps:我沒有仔細驗證過。
有的函數需要入口點也就是EntryPoint屬性,它的值可以通過dumpbin命令、Depends工具和LordPE工具來反匯編找到。下面附上完整的代碼
        [System.Security.SuppressUnmanagedCodeSecurity]
        [DllImport("accore.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode, EntryPoint = "?acedPostCommand@@YAHPEB_W@Z")]
        private static extern int acedPostCommand(string strExpr);
        public static void PostCommand(string cmdStr)
        {
            try {

                acedPostCommand(cmdStr);

            }
            catch (System.Exception ex) {

                Console.WriteLine(ex.Message);
            }
        }

7.Jig(即時繪圖)

8.放大/縮小當前視口或實體

9.過濾/查找實體

10.取消正在執行的命令(模擬ESC鍵)

11.在.NET中使用COM對象

var acadApp = (AcadApplication)Application.AcadApplication; 
var acadDoc = acadApp.ActiveDocument;
var acadDB = acadDoc.Database;
acadDoc.SendCommand("cmdName");

12.利用面域計算面積

13.更新當前文檔視口

很簡單利用Editor的UpdateScreen方法就可以了

 ed.UpdateScreen();

14.引線

cad中引線在數據庫中為Leader類,這里需要注意一點的是引線的坐標高度為0,具體原因后面補充。

 

*.坑

1、AutoCAD命令提示“未知命令**……”的原因:在Initialize方法內報出異常就會導致這種情況。O__O”…(或是少加了dll引用)

還有一種情況就是CommandClass特性位置寫錯了,它必須放在命名空間上面,否則在CAD 2010中就會出現“未知命令”的情況,CAD 2014沒有這種情況

2、Civil 3D 工具空間(Toolspace)不見了怎么辦?在命令行上輸入ShowTS。

3、使用netload命令加載程序集拋出“System.BadImageFormatException”異常解決方案。

http://www.cnblogs.com/sly-tongtong/p/3569321.html

4、ObjectARX的SDK里的acdbmgd.dll、acmgd.dll與安裝目錄下的acdbmgd.dll、acmgd.dll這兩組對應的dll是有區別的,一般調試時候用第一組,開發時候用第二組

5、.net framework版本號AutoCAD版本號是有對應關系的。比如,.net framework 3.5對應AutoCAD 2010做二次開發,如果對應錯了就會出現1中描述的情況。還有調試時有可能和Visual Studio版本號有關,我就遇到過這種情況,用VS 2012+AutoCAD 2010開發時加入斷點沒有反應,但VS換成2010的話就有反應了。╮(╯_╰)╭

6、關於VS 2012+AutoCAD 2010開發時加入斷點沒有反應的問題已經解決了,原來從VS 2010開始默認的調試器類型為托管4.0,而AutoCAD是用.net framework 3.5開發的。它默認的調試器類型為托管2.0。這就造成了加入斷點沒有反應的情況。解決方法:

http://www.cnblogs.com/junqilian/archive/2011/03/18/1988327.html

http://www.cnblogs.com/junqilian/archive/2011/03/18/1988327.html

7、自定義實體(C++)-關於彈出“未能找到***.dll或…………”提示框的問題

引起這個問題有許多原因,我遇到的是生成選項造成的,我用的是win7 64位系統,所以安裝Civil3D版本也是64位,但自定義實體項目的生成方式默認是32位,我也沒改所以在netload的時候就會報出那個提示框,只要把自定義實體項目的生成方式改成64位即可。

8、在使用netload加載dll時,命令行輸出一行異常的信息-“在………………”而且還沒完整輸出O__O”…。造成這個原因有可能是命令的名稱重復

9、用Editor捕獲到的東東不一定是你想要的,再操作之前一定要進行判斷。比如Armadillo項目的RCheckConnectivity命令

10、不要太過於相信CAD事件,開發文檔上說它不靠譜。

11、自定義AutoCAD實體出現下面錯誤的原因是ObjectArx安裝目錄改變或者不存在導致的。

錯誤信息

解決方案:找到自定實體項目的目錄下的Autodesk.arx-2014.props文件,打開並編輯ArxSdkDir節點的值,改為安裝ObjectArx的路徑。就OK了。

12.操蛋的弧線點

Polyline線用Explode方法打散后,子項弧線的起點和終點不一定和畫線時的起終點一樣,以下是測試數據:

--左到右
arc.StartPoint
{(7151.11257350689,2494.76600079297,200)}
    X: 7151.1125735068927
    Y: 2494.7660007929662
    Z: 200.0
arc.EndPoint
{(5218.90934925515,2527.31643705483,200)}
    X: 5218.9093492551474
    Y: 2527.3164370548329
    Z: 200.0
--下到上
arc.StartPoint
{(10482.6189523043,1834.73690787365,200)}
    X: 10482.6189523043
    Y: 1834.7369078736517
    Z: 200.0
arc.EndPoint
{(10482.6189523043,4351.74259295576,200)}
    X: 10482.6189523043
    Y: 4351.7425929557648
    Z: 200.0
--右到左
arc.StartPoint
{(16300.4106147591,1435.48772301059,600)}
    X: 16300.410614759079
    Y: 1435.4877230105917
    Z: 600.0
arc.EndPoint
{(14285.8917180871,1435.48772301059,600)}
    X: 14285.891718087136
    Y: 1435.4877230105913
    Z: 600.0
--上到下
arc.StartPoint
{(11770.9503677832,-1525.82060923224,400)}
    X: 11770.950367783196
    Y: -1525.8206092322357
    Z: 400.0
arc.EndPoint
{(11794.1975746998,681.662180525194,400)}
    X: 11794.197574699823
    Y: 681.662180525194
    Z: 400.0

可以看到有時候一致,有時候相反,這是非常操蛋的地方,用時謹記。

更新:貌似是起始角和終止角的問題,轉的圈圈太多。

13.外部程序啟動AutoCAD程序各種異常的錯誤

錯誤1-http://www.cnblogs.com/junqilian/archive/2011/08/21/2148630.html

如果按上面改正后還有錯誤那么原因有兩個:1是ProgID值與當前CAD系統版本號不一樣,2是打開多個CAD導致的

14.坑爹的SendCommand方法

用.net訪問com的SendCommand並用它發送命令,如果命令行中已經有文字的話,cad會一直等待直到命令行中的文字清空或命令執行,完成前面操作后才執行我們的SendCommand方法。坑爹啊,尤其是在外部啟動cad的時候,如果已經打開cad並且命令行有文字,那啟動程序會一直等待造成假死現象

15.安裝多款Autodesk產品注冊碼失敗的問題

平常我們都是用AutoCAD注冊機來激活Autodesk產品,但是如果操作不當就會出現激活不成功的顯現。出現這種現象的原因有:1、序列號重復,即兩款產品用的是同一個序列號。2、沒有斷網。

以上只是簡單的列舉了注冊失敗的原因。我們真正要解決的是激活失敗了怎么辦?有許多人卸載了再安裝試了好多次都不行最后重裝系統再安裝才好,這樣的話代價太大還浪費時間。本人親身經歷過這種情況,最后在網上找解決方法再結合實際操作找到了解決方案。下面就詳細道來:

1、打開“我的電腦”進入C盤找到\ProgramData\FLEXnet文件夾,把它刪除

2、卸載之前安裝過的Autodesk產品(這個比較費時間,但木辦法╮(╯_╰)╭)

3、清理注冊表(可以用360)

4、最好重啟電腦

5、開始重新安裝Autodesk產品(注意序列號不能再重復了),再用注冊機激活就可以了

以上本人親自操作過沒有問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM