CAD 二次開發----- 塊(一)


1、塊定義與塊參照兩個概念

        塊定義類似於模具,而塊參照類似於模具澆築出來的模型,在圖形中只需用塊定義來保存塊的實際幾何組成,而僅用插入點和比例因子來存儲塊定義,因為塊參照的幾何形狀與快參照完全一樣,僅大小不同,

  好處有:

         不需要存儲款塊參照中的實體,減小了圖形文件;

         只需要修改塊定義,塊參照會自動更新,減輕了修改和維護工作。

2 、實例代碼

 

創建一個塊並添加到數據庫中

/// <summary>
        /// 插入一個塊參照到CAD圖形中
        /// </summary>
        /// <param name="spaceId">模型空間Id</param>
        /// <param name="layer">要插入的圖層名</param>
        /// <param name="blockName">塊名</param>
        /// <param name="postion">插入點</param>
        /// <param name="scale">縮放比例</param>
        /// <param name="rotateAngle">旋轉角度</param>
        /// <returns></returns>
        public static ObjectId InsertBlockTableRecord(this ObjectId spaceId, string layer, string blockName, Point3d postion, Scale3d scale, double rotateAngle)
        {

            ObjectId blockRefId;//存儲要插入的塊參照的Id

            Database db = spaceId.Database;//獲取數據庫對象

            BlockTable bt = db.BlockTableId.GetObject(OpenMode.ForRead) as BlockTable;

            if (!bt.Has(blockName))

                return ObjectId.Null;//如果沒有blockName的塊,程序返回

            //以寫的方式打開空間
            BlockTableRecord space = spaceId.GetObject(OpenMode.ForWrite) as BlockTableRecord;
            //創建塊參照的插入點
            BlockReference br = new BlockReference(postion, bt[blockName]);
            br.ScaleFactors = scale;

            br.Layer = layer;

            br.Rotation = rotateAngle;
            blockRefId = space.AppendEntity(br);

            db.TransactionManager.AddNewlyCreatedDBObject(br, true);

            space.DowngradeOpen();

            return blockRefId;//返回添加的塊參照的ID 

        }
View Code

 

 

在CAD中插入一個塊參照

/// <summary>
        /// 創建一個塊,添加到數據庫中
        /// </summary>
        /// <param name="db"></param>
        /// <param name="blockName"></param>
        /// <param name="ents"></param>
        /// <returns></returns>
        public static ObjectId AddBlockTableRecord(this Database db, string blockName, List<Entity> ents)
        {
            BlockTable bt = (BlockTable)db.BlockTableId.GetObject(OpenMode.ForRead);

            if (!bt.Has(blockName))
            {
                BlockTableRecord btr = new BlockTableRecord();

                btr.Name = blockName;
                //將列表中的實體加入到新建的BlockTableRecord
                ents.ForEach(ent => btr.AppendEntity(ent));
               
                bt.UpgradeOpen();//切換塊為寫的狀態

                bt.Add(btr);

                db.TransactionManager.AddNewlyCreatedDBObject(btr, true);

                bt.DowngradeOpen();//切換塊為讀的狀態

            }

            return bt[blockName];
        }
View Code
 

  

 


免責聲明!

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



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