.NET AutoCAD二次开发之路(五、填充篇)

时间:2024-02-18 16:54:35

图案填充的创建和其他实体,比如块、文字样式和标注样式有所不同,需区别对待,单大致的方法和步骤都基本相同,只有个别地方不同。要创建 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 }