using (Transaction Trans = db.TransactionManager.StartTransaction()) {
Point3d center = new Point3d(50, 50, 0);
Circle entity = new Circle(center, Vector3d.ZAxis, 150); DBObjectCollection curveSegments = new DBObjectCollection(); DBObjectCollection regions = new DBObjectCollection(); curveSegments.Add(entity);
regions = Region.CreateFromCurves(curveSegments); Region newRegion = (Region)regions[0]; newRegion.SetDatabaseDefaults();
BlockTable bt = (BlockTable)Trans.GetObject( db.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)Trans.GetObject( bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite); btr.AppendEntity(newRegion);
Trans.AddNewlyCreatedDBObject(newRegion, true); Trans.Commit(); }
}
[CommandMethod(\)] public void CreateRegion() {
Document acDoc = Autodesk.AutoCAD.ApplicationServices. Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; //启动一个事物transaction
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) {
//以只读方式打开块表 BlockTable acBlkTbl;
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; //以写方式打开模型空间块表记录 BlockTableRecord acBlkTblRec; acBlkTblRec = acTrans.GetObject(
acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; Circle acCirc1 = new Circle(); acCirc1.SetDatabaseDefaults();
acCirc1.Center = new Point3d(4, 4, 0); acCirc1.Radius = 2;
Circle acCirc2 = new Circle(); acCirc2.SetDatabaseDefaults();
acCirc2.Center = new Point3d(4, 4, 0); acCirc2.Radius = 1;
30
//添加圆到对象数组中
DBObjectCollection acDBObjColl = new DBObjectCollection(); acDBObjColl.Add(acCirc1); acDBObjColl.Add(acCirc2); //根据每一个闭合环计算面域
DBObjectCollection myRegionColl = new DBObjectCollection(); myRegionColl = Region.CreateFromCurves(acDBObjColl); Region acRegion1 = myRegionColl[0] as Region; Region acRegion2 = myRegionColl[1] as Region;
// 从面域2减去面域1 Subtract region 1 from region 2 if (acRegion1.Area > acRegion2.Area) {
acRegion1.BooleanOperation(BooleanOperationType.BoolSubtract, acRegion2); acRegion2.Dispose(); // 添加最终的面域到数据库中
acBlkTblRec.AppendEntity(acRegion1);
acTrans.AddNewlyCreatedDBObject(acRegion1, true); } else {
acRegion2.BooleanOperation(BooleanOperationType.BoolSubtract, acRegion1); acRegion1.Dispose();
acBlkTblRec.AppendEntity(acRegion2);
acTrans.AddNewlyCreatedDBObject(acRegion2, true); }
// 不追加对象到数据库中直接从内存中销毁 acCirc1.Dispose(); acCirc2.Dispose(); // 保存新对象到数据库中 acTrans.Commit(); }
}
31
4.8 创建文字
1)创建单行文本
Autodesk.AutoCAD.DatabaseServices.DBText
[CommandMethod(\)] public void CreateDBText() {
Database db = HostApplicationServices.WorkingDatabase; DBText txt = new DBText();
txt.Position = new Point3d(20,20,0); txt.TextString = \二次开发\; ToModelSpace(txt,db);
}
2)创建多行文本
Autodesk.AutoCAD.DatabaseServices.MText
代码:
[CommandMethod(\)] public void CreateMText() {
Database db = HostApplicationServices.WorkingDatabase; MText txt = new MText(); ToModelSpace(txt,db); }
public static ObjectId ToModelSpace(Entity ent, Database db) {
ObjectId entId;
using (Transaction trans = db.TransactionManager.StartTransaction()) {
BlockTable bt = (BlockTable)trans.GetObject( db.BlockTableId, OpenMode.ForRead);
BlockTableRecord btr = (BlockTableRecord)trans.GetObject( bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
32
entId = btr.AppendEntity(ent);
trans.AddNewlyCreatedDBObject(ent, true); trans.Commit(); }
return entId; }
public enum ScripType {
Fraction, Italic, Tolerance }
public static string MakeScipt(string baseTextString,
string superScript,string subScript, ScripType scriptType, double scale) {
string[] scriptTypStrings = new string[] { \, \, \ }; return
string.Format( \,baseTextString, \,scale,superScript,scriptTypStrings[(int)scriptType],subScript, \); }
[CommandMethod(\)] public static void CreateMText2() {
// 获得当前文档和数据库
Document acDoc = Autodesk.AutoCAD.ApplicationServices. Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database;
using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) {
BlockTable acBlkTbl;//打开块表
acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; BlockTableRecord acBlkTblRec;// 打开模型空间块表记录 acBlkTblRec = acTrans.GetObject(
acBlkTbl[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // 创建多行文本对象
MText acMtext = new MText(); acMtext.SetDatabaseDefaults();
acMtext.Location = new Point3d(2, 2, 0); acMtext.Width = 4.5;
acMtext.Contents = \安制作!!!\; acBlkTblRec.AppendEntity(acMtext);
acTrans.AddNewlyCreatedDBObject(acMtext, true); acTrans.Commit(); }
33
}
4.9 创建填充
创建填充必须遵循的步骤:
? 创建一个空的填充对象 ? 指定填充对象所在的平面 ? 设置填充对象的关联性 ? 指定填充图案 ? 添加填充边界 ? 显示填充对象 ? 将其添加到模型空间
? 如果是关联性的填充,将填充对象与边界绑定
代码:
[CommandMethod(\)]//创建填充 public void AddHatch() {
Database db = HostApplicationServices.WorkingDatabase;
using (Transaction trans = db.TransactionManager.StartTransaction()) {
Circle circle = new Circle();
circle.Center = new Point3d(150, 150, 0);
circle.Radius = 200; BlockTable bt = (BlockTable) trans.GetObject(db.BlockTableId, OpenMode.ForRead); BlockTableRecord btr = (BlockTableRecord)trans.GetObject( bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite); btr.AppendEntity(circle);
trans.AddNewlyCreatedDBObject(circle, true);
ObjectIdCollection collection = new ObjectIdCollection(); collection.Add(circle.ObjectId); Hatch hatch = new Hatch();
34