.NET AutoCAD二次开发之路(五、填充篇)
图案填充的创建和其他实体,比如块、文字样式和标注样式有所不同,需区别对待,单大致的方法和步骤都基本相同,只有个别地方不同。要创建 Hatch 对象,首先使用该类的构造函数创建一个空的填充对象,然后对该对象的类型、样式、名称、填充角度以及边界等进行属性设置。步骤如下
1、 创建图案边界:
利用创建圆命令创建一个填充边界
Circle circle = New Circle(); circle.SetDatabaseDefaults();//用来把圆的颜色、图层、线型、打印样式、可见性等属性设为实体所在的数据库的默认值 circle.Center = new Point3d(3, 3, 0); circle.Radius = 1;
2、 创建图案填充对象:
Hactch hatch =New Hatch();
3、 设置Hatch对象的属性:
Hacth.PatternScale=0.5;
4、 设置填充的类型和填充图案名称:
hatch.SetDatabaseDefaults(); hatch.SetHatchPattern(HatchPatternType.PreDefined, "ANSI31");
HatchPatternType属性说明:
HatchPatternType.PreDefined
从 acad.pat 文件中定义的图案名中进行选择。
HatchPatternType.UserDefined
用当前线型定义直线图案。
HatchPatternType.CustomDefined
从 PAT 而不是 acad.pat 文件中选择图案名。
填充类型说明:
ANSI31:为金属剖面线
其他如下图
5、 设置关联:
hatch.Associative = true;
6、 添加填充边界:
acHatch.AppendLoop(HatchLoopTypes.Outermost, ids);//ids这里为ObjectID集
说明:添加的第一个边界必须是外边界,即用于定义图案填充最外面的边界。要添加外部边界,请使用添加环的类型为 HatchLoopTypes.Outermost 常量的 AppendLoop 方法,一旦外边界被定义,就可以继续添加另外的边界。添加内部边界请使用带 HatchLoopTypes.Default 常量的 AppendLoop 方法。
7、 计算并显示填充:
hatch.EvaluateHatch(true);
8、 提交事务处理:
trans.Commit();
完整代码:
1 using Autodesk.AutoCAD.Runtime; 2 3 using Autodesk.AutoCAD.ApplicationServices; 4 5 using Autodesk.AutoCAD.DatabaseServices; 6 7 using Autodesk.AutoCAD.Geometry; 8 9 10 11 [CommandMethod("AddHatch")] 12 13 public static void AddHatch() 14 15 { 16 17 // 获得当前文档和数据库 18 19 Document acDoc = Application.DocumentManager.MdiActiveDocument; 20 21 Database acCurDb = acDoc.Database; 22 23 24 25 // 启动一个事务 26 27 using (Transaction trans = acCurDb.TransactionManager.StartTransaction()) 28 29 { 30 31 // 以只读方式打开块表 32 33 BlockTable acBlkTbl; 34 35 acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, 36 37 OpenMode.ForRead) as BlockTable; 38 39 40 41 // 以写方式打开模型空间块表记录 42 43 BlockTableRecord acBlkTblRec; 44 45 acBlkTblRec = acTrans.GetObject(acBlkTbl[BlockTableRecord.ModelSpace], 46 47 OpenMode.ForWrite) as BlockTableRecord; 48 49 50 51 // 创建一个圆对象作为图案填充的封闭边界 52 53 Circle circle = new Circle();//初始化Circle类 54 55 circle.SetDatabaseDefaults();//默认参数 56 57 circle.Center = new Point3d();//圆心位置 58 59 circle.Radius = 1;//圆的半径 60 61 62 63 // 添加新的圆对象到块表记录和事务中 64 65 acBlkTblRec.AppendEntity(circle); 66 67 acTrans.AddNewlyCreatedDBObject(circle, true); 68 69 70 71 // 添加圆到一个 ObjectID 数组中去 72 73 ObjectIdCollection acObjIdColl = new ObjectIdCollection(); 74 75 acObjIdColl.Add(circle.ObjectId); 76 77 78 79 // 创建图案填充对象并添加到块表记录中 80 81 Hatch hatch = new Hatch(); 82 83 acBlkTblRec.AppendEntity(hatch); 84 85 acTrans.AddNewlyCreatedDBObject(hatch, true); 86 87 88 89 hatch.SetDatabaseDefaults(); 90 91 hatch.SetHatchPattern(HatchPatternType.PreDefined, "ANSI31");//ANSI31为金属剖面线 92 93 hatch.Associative = true; 94 95 hatch.AppendLoop(HatchLoopTypes.Outermost, acObjIdColl); 96 97 hatch.EvaluateHatch(true); 98 99 100 101 // 保存新对象到数据库中 102 103 trans.Commit(); 104 105 } 106 107 }