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

搞清楚這個以後,我們在把之前那張出鏡率很高的CAD類繼承關系圖拿出來
可以看到的是Hatch(填充)類繼承于Entity
我們F12來看看具體細節
再來看看Hatch類中的一些方法和屬性
捋清楚大緻的架構後就可以開始了
1. 圖案填充封裝
先來看看如何進行圖案填充,然後再進行封裝
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. 測試代碼
實驗結果
上述結果分别為測試代碼中的幾種填充方式
更多細節請關注公衆号:資料智能筆記
釋出于 2020-03-21