Auto CAD二次开发——图案填充(函数封装)
学如逆水行舟,不进则退。 愿自己不忘初心,坚持积累。感谢大家的支持。本篇博客主要是学习图案填充。上一节已经学习过了图案填充,这一篇对其进行封装,便于后续的调用,同时封装背景色和前景色函数。
目录
1、基础知识储备
2、核心代码以及封装函数调用
2.1 封装函数(无背景色和图案填充前景色)
2.2 调用函数(无背景色和图案填充前景色)
2.3 运行结果(无背景色和图案填充前景色)
2.4 封装函数(有背景色和图案填充前景色)
2.5 调用函数(有背景色和图案填充前景色)
2.6 运行结果(有背景色和图案填充前景色)
1、基础知识储备
参看帮助文档,Hatch也属于Entity。
填充图案类中补充颜色部分方法:
1、设置背景色
public Color BackgroundColor { get; set; }
2、设置填充图案的颜色
public virtual int ColorIndex { get; set; }
注意存在好多种设置颜色的方式:
以下是具体解释:
public static Color DwgIn(DwgFiler inputFiler);从 DWG 文件过滤器(DwgFiler)中读取颜色数据,用于从 DWG 格式文件中解析并创建颜色对象,通常在文件加载或序列化时使用。
public static Color DxfIn(DxfFiler inputFiler, int groupCodeOffset);从 DXF 文件过滤器(DxfFiler)中读取颜色数据,groupCodeOffset为组码偏移量,用于从 DXF 格式文件中解析颜色信息(DXF 文件通过 “组码 + 值” 存储数据)。
public static Color FromColor(System.Drawing.Color value);将 GDI + 的System.Drawing.Color(WindowsForms 常用颜色类型)转换为 CAD 的Color对象,实现跨框架颜色类型适配。
public static Color FromColor(System.Windows.Media.Color value);将 WPF 的System.Windows.Media.Color(WPF 框架常用颜色类型)转换为 CAD 的Color对象,适配 WPF 开发场景。
public static Color FromColorIndex(ColorMethod colorMethod, short colorIndex);通过颜色索引创建颜色,colorMethod指定颜色模式(如索引色、真彩色等),colorIndex为颜色表中的索引值(对应 CAD 中的索引色设置)。
public static Color FromDictionaryName(string name);从颜色字典中通过名称获取颜色,通常用于访问 CAD 中预定义的颜色字典(如标准颜色库)。
public static Color FromEntityColor(EntityColor eclr);将实体颜色(EntityColor,CAD 中实体对象的颜色属性类型)转换为Color对象,用于实体颜色的提取和处理。
public static Color FromNames(string colorName, string bookName);通过颜色名称和颜色簿(调色板)名称创建颜色,bookName指定调色板,colorName为该调色板中的具体颜色名。
public static Color FromRgb(byte red, byte green, byte blue);通过 RGB 三原色值(0-255 范围的字节值)创建颜色,直接指定红、绿、蓝分量,对应真彩色模式(最常用的颜色创建方式之一)。这些方法覆盖了从文件解析、跨框架转换、索引 / 名称 / RGB 值定义等多种颜色创建场景,方便在 CAD 开发中灵活处理颜色相关操作。后续会对颜色进行相关学习这次大概了解一下。
2、核心代码以及封装函数调用
2.1 封装函数(无背景色和图案填充前景色)
/// <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 = "ANSI37";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 arconc = "AR-CONC";}/// <summary>/// 图案填充/// </summary>/// <param name="db">图形数据库</param>/// <param name="tatchName">图案名称</param>/// <param name="cId">边界图形的ObjectId</param>/// <param name="tatchScale">填充比例</param>/// <param name="tatchType">填充类型</param>/// <param name="tatchAngle">旋转角度</param>/// <returns></returns>public static ObjectId TatchEntity(this Database db, string tatchName, ObjectId cId, double tatchScale = 5, HatchPatternType tatchType = HatchPatternType.PreDefined, double tatchAngle = 45){ObjectId hatchId = ObjectId.Null;using (Transaction trans = db.TransactionManager.StartTransaction()){ObjectIdCollection obIds = new ObjectIdCollection();obIds.Add(cId);//声明图案填充对象Hatch hatch = new Hatch();//设置填充比例hatch.PatternScale = tatchScale;//设置填充类型和图案名hatch.SetHatchPattern(tatchType, tatchName);//加入图形数据库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 = tatchAngle.DegreeToAngle();//设置关联hatch.Associative = true;//设置边界图形和填充方式hatch.AppendLoop(HatchLoopTypes.Outermost, obIds);//计算填充并显示hatch.EvaluateHatch(true);//提交事务trans.Commit();}return hatchId;}
2.2 调用函数(无背景色和图案填充前景色)
//图案填充
Database db = HostApplicationServices.WorkingDatabase;ObjectId cId = db.AddCircleModelSpace(new Point3d(100, 100, 0), 100);
db.TatchEntity(TatchTool.HatchPatternName.angle, cId);
2.3 运行结果(无背景色和图案填充前景色)

2.4 封装函数(有背景色和图案填充前景色)
/// <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 = "ANSI37";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 arconc = "AR-CONC";}/// <summary>/// 图案填充/// </summary>/// <param name="db">图形数据库</param>/// <param name="tatchName">图案名称</param>/// <param name="cId">边界图形的ObjectId</param>/// <param name="tatchScale">填充比例</param>/// <param name="tatchType">填充类型</param>/// <param name="tatchAngle">旋转角度</param>/// <returns></returns>public static ObjectId TatchEntity(this Database db, string tatchName, ObjectId cId, double tatchScale = 5, HatchPatternType tatchType = HatchPatternType.PreDefined, double tatchAngle = 45){ObjectId hatchId = ObjectId.Null;using (Transaction trans = db.TransactionManager.StartTransaction()){ObjectIdCollection obIds = new ObjectIdCollection();obIds.Add(cId);//声明图案填充对象Hatch hatch = new Hatch();//设置填充比例hatch.PatternScale = tatchScale;//设置填充类型和图案名hatch.SetHatchPattern(tatchType, tatchName);//加入图形数据库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 = tatchAngle.DegreeToAngle();//设置关联hatch.Associative = true;//设置边界图形和填充方式hatch.AppendLoop(HatchLoopTypes.Outermost, obIds);//计算填充并显示hatch.EvaluateHatch(true);//提交事务trans.Commit();}return hatchId;}
2.5 调用函数(有背景色和图案填充前景色)
//图案填充
Database db = HostApplicationServices.WorkingDatabase;ObjectId cId = db.AddCircleModelSpace(new Point3d(100, 100, 0), 100);
db.TatchEntity(TatchTool.HatchPatternName.angle, cId);ObjectId cId1 = db.AddCircleModelSpace(new Point3d(300, 300, 0), 100);
db.TatchEntity(TatchTool.HatchPatternName.angle, cId1,Color.FromColorIndex(ColorMethod.ByColor,2),1);
2.6 运行结果(有背景色和图案填充前景色)

