.NET AutoCAD二次開發之路(2、直線篇)

我之前只有一點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(); //提交事務處理
            }
        }

     }
}

我也是剛學,若有不對的地方,望你們及時指正,我將感激涕零!

相關文章
相關標籤/搜索