我之前只有一點VB的基礎,C語言也只是看過,學這個CAD二次開發,也是借工做之餘研究下,我到如今已經從事機械行業5年了,中國的工業設計環境區別太大,各行各業的技術現狀也不盡相同,但有一點是能夠確定的,那就是自動化,國外都在工業4.0了,咱們還在互聯網+,哎太out了,我也趕忙進修下,要不就淘汰了。因此我選擇了CAD二次開發,主要仍是跟專業接近,但願能越學越精吧,將來就讓將來的我去面對!數據庫
今天主要總結下直線的建立,要想能在CAD中生成直線或者其餘圖形,都必須遵循幾個步驟,那就是:函數
1.獲取當前圖形的數據庫;spa
獲取圖形數據庫主要有兩種發法:設計
(1)Database db = HostApplicationServices.WorkingDatabase;3d
(2)Document doc=Appplication.DocumentManager.MdiActiveDocument;code
Database db = acDoc.Database;對象
才鳥的這本書上主要是採用第一種方法,CAD二次開發人員手冊主要是採用第二種方法,我也採用的第一種,由於代碼少啊;blog
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(); //提交事務處理 } } } }
我也是剛學,若有不對的地方,望你們及時指正,我將感激涕零!