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


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

     }
}

我也是剛學,如有不對的地方,望大家及時指正,我將感激不盡!


免責聲明!

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



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