天天看點

C#之CAD二次開發(5) CAD圖形填充封裝

0.引言

我們首先來康康在CAD中填充建立的一個過程(圖有點吃藕,湊合看==)

C#之CAD二次開發(5) CAD圖形填充封裝

搞清楚這個以後,我們在把之前那張出鏡率很高的CAD類繼承關系圖拿出來

C#之CAD二次開發(5) CAD圖形填充封裝

可以看到的是Hatch(填充)類繼承于Entity

​我們F12來看看具體細節

C#之CAD二次開發(5) CAD圖形填充封裝

再來看看Hatch類中的一些方法和屬性

C#之CAD二次開發(5) CAD圖形填充封裝
C#之CAD二次開發(5) CAD圖形填充封裝

捋清楚大緻的架構後就可以開始了

1. 圖案填充封裝

先來看看如何進行圖案填充,然後再進行封裝

C#之CAD二次開發(5) CAD圖形填充封裝

2. 無顔色圖形填充方法封裝

這裡建立了一個HatchTools類用來封裝填充方法

無填充顔色的填充方法封裝

/// <summary>
        /// 圖案填充 無顔色
        /// </summary>
        /// <param name="db">圖形資料庫</param>
        /// <param name="patternName">圖案名稱</param>
        /// <param name="scale">填充比例</param>
        /// <param name="degree">旋轉角度</param>
        /// <param name="entid">邊界圖形的ObjectId</param>
        /// <returns></returns>
        public static ObjectId HatchEnity(this Database db, string patternName, double scale, double degree, ObjectId entid)
        {
            ObjectId hatchId = ObjectId.Null;
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                // 聲明一個圖案填充對象
                Hatch hatch = new Hatch();
                // 設定填充比例
                hatch.PatternScale = scale;
                // 設定填充類型和圖案名稱
                hatch.SetHatchPattern(HatchPatternType.PreDefined, "ANGLE");
                // 加入圖形資料庫
                BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
                BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                hatchId = btr.AppendEntity(hatch);
                trans.AddNewlyCreatedDBObject(hatch, true);

                // 設定填充角度
                hatch.PatternAngle = degree;
                // 設定關聯
                hatch.Associative = true;
                // 設定邊界圖形和填充方式

                ObjectIdCollection obIds = new ObjectIdCollection();
                obIds.Add(entid);
                hatch.AppendLoop(HatchLoopTypes.Outermost, obIds);
                // 計算填充并顯示
                hatch.EvaluateHatch(true);
                // 送出事務
                trans.Commit();
            }
            return hatchId;
        }
           

将填充圖案類型也進行封裝,填充的時候調用就行,封裝為struct類型

/// <summary>
        /// 填充圖案名稱
        /// </summary>
        public struct HatchPatternName
        {
            public static readonly string solid = "SOLID";
            public static readonly string angle = "ANGLE";
            public static readonly string ansi31 = "ANSI31";
            public static readonly string ansi32 = "ANSI32";
            public static readonly string ansi33 = "ANSI33";
            public static readonly string ansi34 = "ANSI34";
            public static readonly string ansi35 = "ANSI35";
            public static readonly string ansi36 = "ANSI36";
            public static readonly string ansi37 = "ANSI37";
            public static readonly string ansi38 = "ANSI38";
            public static readonly string arb816 = "AR-B816";
            public static readonly string arb816C = "AR-B816C";
            public static readonly string arb88 = "AR-B88";
            public static readonly string arbrelm = "AR-BRELM";
            public static readonly string arbrstd = "AR-BRSTD";
            public static readonly string arbconc = "AR-CONC";
        }
           

3. 帶填充顔色的填充方法封裝

/// <summary>
        /// 圖案填充 有填充顔色
        /// </summary>
        /// <param name="db">圖形資料庫</param>
        /// <param name="patternName">圖案名稱</param>
        /// <param name="scale">填充比例</param>
        /// <param name="degree">旋轉角度</param>
        /// <param name="bkColor">背景色</param>
        /// <param name="hatchColorIndex">填充圖案的顔色</param>
        /// <param name="entid">邊界圖形的ObjectId</param>
        /// <returns></returns>

        public static ObjectId HatchEnity(this Database db, string patternName, double scale, double degree, Color bkColor, int hatchColorIndex, ObjectId entid)
        {
            ObjectId hatchId = ObjectId.Null;
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                // 聲明一個圖案填充對象
                Hatch hatch = new Hatch();
                // 設定填充比例
                hatch.PatternScale = scale;
                // 設定背景色
                hatch.BackgroundColor = bkColor;
                // 設定填充圖案顔色
                hatch.ColorIndex = hatchColorIndex;
                // 設定填充類型和圖案名稱
                hatch.SetHatchPattern(HatchPatternType.PreDefined, "ANGLE");
                // 加入圖形資料庫
                BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
                BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                hatchId = btr.AppendEntity(hatch);
                trans.AddNewlyCreatedDBObject(hatch, true);

                // 設定填充角度
                hatch.PatternAngle = degree;
                // 設定關聯
                hatch.Associative = true;
                // 設定邊界圖形和填充方式


                ObjectIdCollection obIds = new ObjectIdCollection();
                obIds.Add(entid);
                hatch.AppendLoop(HatchLoopTypes.Outermost, obIds);
                // 計算填充并顯示
                hatch.EvaluateHatch(true);
                // 送出事務
                trans.Commit();
            }
            return hatchId;
        }
           

4. 多個圖形的填充

/// <summary>
        /// 圖案填充
        /// </summary>
        /// <param name="db">圖形資料庫</param>
        /// <param name="loopTypes"></param>
        /// <param name="patternName">圖案名稱</param>
        /// <param name="scale">填充比例</param>
        /// <param name="degree">旋轉角度</param>
        /// <param name="entid">邊界圖形的ObjectId</param>
        /// <returns></returns>
        public static ObjectId HatchEnity(this Database db, List<HatchLoopTypes> loopTypes, string patternName, double scale, double degree, params ObjectId[] entid) // 一個方法隻能傳遞一個可變參數 且需要放在最後
        {
            ObjectId hatchId = ObjectId.Null;
            using (Transaction trans = db.TransactionManager.StartTransaction())
            {
                // 聲明一個圖案填充對象
                Hatch hatch = new Hatch();
                // 設定填充比例
                hatch.PatternScale = scale;
                // 設定填充類型和圖案名稱
                hatch.SetHatchPattern(HatchPatternType.PreDefined, "ANGLE");
                // 加入圖形資料庫
                BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead);
                BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
                hatchId = btr.AppendEntity(hatch);
                trans.AddNewlyCreatedDBObject(hatch, true);

                // 設定填充角度
                hatch.PatternAngle = degree;
                // 設定關聯
                hatch.Associative = true;
                // 設定邊界圖形和填充方式


                ObjectIdCollection obIds = new ObjectIdCollection();
                // 依次添加圖形填充樣式
                for (int i = 0; i < entid.Length; i++)
                {
                    obIds.Clear();
                    obIds.Add(entid[i]);
                    hatch.AppendLoop(loopTypes[i], obIds);
                }


                // 計算填充并顯示
                hatch.EvaluateHatch(true);
                // 送出事務
                trans.Commit();
            }
            return hatc
           

5. 測試代碼

C#之CAD二次開發(5) CAD圖形填充封裝

實驗結果

C#之CAD二次開發(5) CAD圖形填充封裝

上述結果分别為測試代碼中的幾種填充方式

更多細節請關注公衆号:資料智能筆記

C#之CAD二次開發(5) CAD圖形填充封裝

釋出于 2020-03-21