渐变填充部分参考了才鸟的书里的代码,但是我改的也挺多的...
namespace JoinBox { public partial class CmdTest { /// <summary> /// 测试填充 /// </summary> [CommandMethod("CmdTest_hatch")] public void CmdTest_hatch() { var dm = Acap.DocumentManager; var doc = dm.MdiActiveDocument; var db = doc.Database; var ed = doc.Editor; ed.WriteMessage($"{Environment.NewLine}填充测试"); //这里是选择已有图元加入填充 int actionNum = 4; if ((actionNum & 1) == 1) { var psr = ed.GetSelection(); if (psr.Status != PromptStatus.OK) return; db.Action(tr => { new HatchInfo(psr.Value.GetObjectIds(), 100) .Mode1PreDefined("ANSI34") .Build(tr, db); }); } if ((actionNum & 2) == 2) { var psr = ed.GetSelection(); if (psr.Status != PromptStatus.OK) return; db.Action(tr => { new HatchInfo(psr.Value.GetObjectIds(), 100) .Mode2UserDefined() .Build(tr, db); }); } if ((actionNum & 4) == 4) { var psr = ed.GetSelection(); if (psr.Status != PromptStatus.OK) return; db.Action(tr => { new HatchInfo(psr.Value.GetObjectIds(), 100, Math.PI / 2) .Mode4Gradient(HatchInfo.HatchGradientName.Linear, Autodesk.AutoCAD.Colors.Color.FromRgb(0, 0, 0), Autodesk.AutoCAD.Colors.Color.FromRgb(152, 35, 100)) .Build(tr, db); }); } } } }
#if !HC2020 using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Colors; #else using GrxCAD.DatabaseServices; using GrxCAD.Geometry; using GrxCAD.Colors; #endif using System.Collections.Generic; using System; namespace JoinBox { /// <summary> /// 图案填充 /// </summary> public class HatchInfo { #region 枚举 /// <summary> /// 渐变色填充的图案名称 /// </summary> public enum HatchGradientName { /// <summary> /// 线状渐变 /// </summary> Linear, /// <summary> /// 圆柱状渐变 /// </summary> Cylinder, /// <summary> /// 反圆柱状渐变 /// </summary> Invcylinder, /// <summary> /// 球状渐变 /// </summary> Spherical, /// <summary> /// 反球状渐变 /// </summary> Invspherical, /// <summary> /// 半球状渐变 /// </summary> Hemisperical, /// <summary> /// 反半球状渐变 /// </summary> InvHemisperical, /// <summary> /// 抛物面状渐变 /// </summary> Curved, /// <summary> /// 反抛物面状渐变 /// </summary> Incurved } #endregion #region 成员 /// <summary> /// 边界id(最外面放第一) /// </summary> IEnumerable<ObjectId> _boundaryIds; /// <summary> /// 填充图元 /// </summary> Hatch _hatch; /// <summary> /// 填充的名字 /// </summary> string _hatchName; /// <summary> /// 填充模式类型(预定义/用户定义/自定义) /// </summary> HatchPatternType _patternTypeHatch; /// <summary> /// 渐变模式类型 /// </summary> GradientPatternType _patternTypeGradient; /// <summary> /// 比例/间距 /// </summary> double _hatchScale; /// <summary> /// 角度 /// </summary> double _hatchAngle; /// <summary> /// 关联边界 /// </summary> bool _boundaryAssociative = true; #endregion #region 构造 /// <summary> /// 图案填充 /// </summary> /// <param name="boundaryIds">边界</param> /// <param name="hatchScale">比例</param> /// <param name="hatchAngle">角度</param> /// <param name="hatchOrigin">填充原点</param> /// <param name="boundaryAssociative">关联边界</param> public HatchInfo(IEnumerable<ObjectId> boundaryIds, double hatchScale = 1, double hatchAngle = 0, bool boundaryAssociative = true, Point2d? hatchOrigin = null) { _boundaryIds = boundaryIds; _hatchScale = hatchScale; _hatchAngle = hatchAngle; _boundaryAssociative = boundaryAssociative; hatchOrigin ??= Point2d.Origin; _hatch = new Hatch(); _hatch.SetDatabaseDefaults(); _hatch.Origin = hatchOrigin.Value; //填充原点 _hatch.PatternScale = _hatchScale; //填充比例 _hatch.PatternAngle = _hatchAngle; //填充角度 } #endregion #region 方法 /// <summary> /// 模式1:预定义 /// </summary> public HatchInfo Mode1PreDefined(string name) { _hatchName = name; _patternTypeHatch = HatchPatternType.PreDefined; return this; } /// <summary> /// 模式2:用户定义 /// </summary> /// <param name="patternDouble">是否双向</param> public HatchInfo Mode2UserDefined(bool patternDouble = true) { _hatchName = "_USER"; _patternTypeHatch = HatchPatternType.UserDefined; _hatch.HatchObjectType = HatchObjectType.HatchObject; //对象类型(填充/渐变) _hatch.PatternDouble = patternDouble; //是否双向(必须写在 SetHatchPattern 之前) _hatch.PatternSpace = _hatchScale; //间距(必须写在 SetHatchPattern 之前) return this; } /// <summary> /// 模式3:自定义 /// </summary> /// <param name="name"></param> public HatchInfo Mode3UserDefined(string name) { _hatchName = name; _patternTypeHatch = HatchPatternType.CustomDefined; _hatch.HatchObjectType = HatchObjectType.HatchObject; //对象类型(填充/渐变) return this; } /// <summary> /// 模式4:渐变填充 /// </summary> /// <param name="name">渐变填充名称</param> /// <param name="colorStart">渐变色起始颜色</param> /// <param name="colorEnd">渐变色结束颜色</param> /// <param name="gradientShift">渐变移动</param> /// <param name="shadeTintValue">色调值</param> /// <param name="gradientOneColorMode">单色<see langword="true"/>双色<see langword="false"/></param> public HatchInfo Mode4Gradient(HatchGradientName name, Color colorStart, Color colorEnd, float gradientShift = 0, float shadeTintValue = 0, bool gradientOneColorMode = false) { //_hatchName = "SOLID"; //渐变的话,名字必然是它,但是不用写 _hatchName = name.ToString(); _patternTypeGradient = GradientPatternType.PreDefinedGradient;//.....................这里另一种模式缺少哦 _hatch.HatchObjectType = HatchObjectType.GradientObject; //对象类型(填充/渐变) //设置渐变色填充的起始和结束颜色 var gColor1 = new GradientColor(colorStart, 0); var gColor2 = new GradientColor(colorEnd, 1); _hatch.SetGradientColors(new GradientColor[] { gColor1, gColor2 }); _hatch.GradientShift = gradientShift; //渐变移动 _hatch.ShadeTintValue = shadeTintValue; //色调值 _hatch.GradientOneColorMode = gradientOneColorMode;//单色/双色 _hatch.GradientAngle = _hatchAngle; //渐变角 return this; } /// <summary> /// 构建 /// </summary> /// <param name="tr">事务</param> /// <param name="db">数据库</param> /// <param name="associative">关联边界</param> /// <returns></returns> public ObjectId Build(Transaction tr, Database db) { var id = tr.AddEntityToMsPs(db, _hatch); if (_hatch.HatchObjectType == HatchObjectType.GradientObject) _hatch.SetGradient(_patternTypeGradient, _hatchName); //渐变模式类型 else _hatch.SetHatchPattern(_patternTypeHatch, _hatchName); //填充模式类型 _hatch.Associative = _boundaryAssociative; //关联边界(不先添加数据库会出错) var obIds = new ObjectIdCollection(); //边界是闭合的,而且已经加入数据库 //填充闭合环类型.最外面 foreach (var border in _boundaryIds) { obIds.Clear(); obIds.Add(border); _hatch.AppendLoop(HatchLoopTypes.Default, obIds.Collection); } _hatch.EvaluateHatch(true); //计算填充并显示(若边界出错,这句会异常) obIds.Dispose(); return id; } /// <summary> /// 执行图元的属性修改 /// </summary> /// <param name="action">扔出填充实体</param> /// <returns></returns> public HatchInfo Action(Action<Hatch> action) { action(_hatch); return this; } #endregion } }