我以前只有一點VB的基礎,C語言也只是看過,學這個CAD二次開發,也是借工作之余研究下,我到現在已經從事機械行業5年了,中國的工業設計環境區別太大,各行各業的技術現狀也不盡相同,但有一點是可以肯定的,那就是自動化,國外都在工業4.0了,我們還在互聯網+,哎太out了,我也趕緊進修下,要不就淘汰了。所以我選擇了CAD二次開發,主要還是跟專業接近,希望能越學越精吧,未來就讓未來的我去面對!
今天主要總結下直線的創建,要想能在CAD中生成直線或者其他圖形,都必須遵循幾個步驟,那就是:
1.獲取當前圖形的數據庫;
獲取圖形數據庫主要有兩種發法:
(1)Database db = HostApplicationServices.WorkingDatabase;
(2)Document doc=Appplication.DocumentManager.MdiActiveDocument;
Database db = acDoc.Database;
才鳥的這本書上主要是采用第一種方法,CAD二次開發人員手冊主要是采用第二種方法,我也采用的第一種,因為代碼少啊;
2.創建圖形對象;
創建所需要的圖形,就要用到構造函數或者是擴展函數,譬如圓形、圓弧等等;今天我就總結下直線的創建。在.NET中直線的構造函數有兩種形式,這兩種構造函數是.NET已經定義好了的,可以直接調用;他們分別是:
(1)public Line();
(2)public Line(Point3d pointer1,Point3d pointer2)
眾所周知,直線是有兩個點之間的連線構成的,那么要得到一條直線,就必須給出這條直線的兩個點,起始點和終止點;由上面的構造函數(Piont3d)可以看出,起始點和終止點需要通過三維坐標來創建,這個在.NET中也有他的構造函數(也可以通過代碼中的“查看定義”找到):
Public Point3d(double x,double y,double z);
那么定義一條直線就可以這樣寫代碼:
Line line=new Line(new Point3d(),new Point3d(200,0,0));
New表示要實例化一個對象,Point3d()表示原點,坐標為(0,0,0).
3.打開圖形數據庫圖表;
圖形數據中有很多類型的圖表,直線就是存在塊表下。要創建直線就必須先打開塊表,以只讀的方式打開塊表的代碼可以這樣寫:
BlockTable acBlkTbl;
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,OpenMode.ForRead) as BlockTable;
4.打開一個存儲圖形對象的塊表記錄;
一個塊表中可以有很多個塊表記錄,每個對象都有一個對應的塊表記錄;以寫的方式打開塊表記錄代碼可以這樣寫:
BlockTableRecord acBlkTblRec;
acBlkTblRec = cTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],OpenMode.ForWrite) as BlockTableRecord;
5.將該圖形添加到塊表記錄中;
acBlkTblRec.AppendEntity(acLine);
說實話我現在也不是很理解。
6.通知事務處理管理器,並提交事務處理,這樣就可以將創建的圖形顯示到CAD模型空間中了;在這我感覺步驟3也可以放到步驟4和5后面,我的代碼也有這樣寫的,但是也沒出現錯誤。
將圖形添加到事物管理器中的代碼這樣寫:
acTrans.AddNewlyCreatedDBObject(acLine, true);
最后就是提醒事物處理器,我完成了,你可以顯示了。
acTrans.Commit();
整體代碼:
using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using DotNetARX; namespace Lines { public class Lines { [CommandMethod("FirstLine")] public static void FirstLine() { //獲取當前活動圖形數據庫 Database db= HostApplicationServices.WorkingDatabase; Point3d startPoint=new Point3d(0, 100, 0); //直線起點 Point3d endPoint=new Point3d(100, 100, 0); //直線終點 Line line=new Line(startPoint, endPoint); //新建一直線對象 //定義一個指向當前數據庫的事務處理,以添加直線 using (Transaction trans=db.TransactionManager.StartTransaction()) { BlockTable bt=(BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead); //以讀方式打開塊表. //以寫方式打開模型空間塊表記錄. BlockTableRecord btr=(BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite); //將圖形對象的信息添加到塊表記錄中,並返回ObjectId對象. btr.AppendEntity(line); trans.AddNewlyCreatedDBObject(line, true); //把對象添加到事務處理中. trans.Commit(); //提交事務處理 } } } }
不過我經常是這樣寫:
using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using DotNetARX; namespace Lines { public class Lines { [CommandMethod("FirstLine")] public static void FirstLine() { //獲取當前活動圖形數據庫 Database db= HostApplicationServices.WorkingDatabase; //定義一個指向當前數據庫的事務處理,以添加直線 using (Transaction trans=db.TransactionManager.StartTransaction()) { BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId,OpenMode.ForRead) as BlockTable; //以讀方式打開塊表. //以寫方式打開模型空間塊表記錄. BlockTableRecord acBlkTblRec; acBlkTblRec=acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace],OpenMode.ForWrite) as BlockTableRecord; Point3d startPoint=new Point3d(0, 100, 0); //直線起點 Point3d endPoint=new Point3d(100, 100, 0); //直線終點 Line line=new Line(startPoint, endPoint); //新建一直線對象 //將圖形對象的信息添加到塊表記錄中,並返回ObjectId對象. acBlkTblRec.AppendEntity(line); trans.AddNewlyCreatedDBObject(line, true); //把對象添加到事務處理中. trans.Commit(); //提交事務處理 } } } }
我也是剛學,如有不對的地方,望大家及時指正,我將感激不盡!