AutoCad 二次開發 .net 之相同塊的自動編號
- 2019 年 11 月 8 日
- 筆記
主要步驟:
一、獲取一個塊的id:

其中oId就是了。
二、通過次oId獲取塊引用blkRef:

三、通過它獲取所有相同的塊引用的id集合:

四、通過步驟三的集合得到所有的塊引用得到集合listBr:

五、遍歷listBr,創建DBText編號 ,確定DBText在圖中插入的位置,加入到集合listDBText:

在做第五步驟前,先要獲取TextStyleId:

最後通過擴展方法加入到模型空間:listDBText.ToSpace();
ToSpace方法截圖:

需要注意的地方:一定要是塊定義,在使用dbText.AlignmentPoint之前一定要寫排序方式這裡用的是:dbText.HorizontalMode = TextHorizontalMode.TextMid;
完整程式碼:

using System; using System.Collections.Generic; using System.Linq; using System.Text; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.Geometry; namespace MulitySortNum { public class SortNum { private Document doc = Application.DocumentManager.MdiActiveDocument; private Database db = Application.DocumentManager.MdiActiveDocument.Database; private Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; private string str = "LL"; public int index = 1; [CommandMethod("NumSort1")] public void NumSort1() { index = 1; var propEnt = new PromptEntityOptions("請選擇要編號的一個塊n"); var propRes = ed.GetEntity(propEnt); if (propRes.Status != PromptStatus.OK) { return; } var oId = propRes.ObjectId; ObjectIdCollection objIds = null; List<DBText> listDBText = new List<DBText>(); using (Transaction trans = db.TransactionManager.StartTransaction()) { var blkRef = trans.GetObject(oId, OpenMode.ForRead) as BlockReference; if (blkRef == null) { Application.ShowAlertDialog("請選擇塊定義"); return; } var recId = blkRef.BlockTableRecord; var blkTblRec = trans.GetObject(recId, OpenMode.ForRead) as BlockTableRecord; objIds = blkTblRec.GetBlockReferenceIds(true, false); var txtStlTbl = trans.GetObject(db.TextStyleTableId, OpenMode.ForRead) as TextStyleTable; var txtstyleId = txtStlTbl["Standard"]; List<BlockReference> listBr = new List<BlockReference>(); foreach (ObjectId objectId in objIds) { var blkTempRef = trans.GetObject(objectId, OpenMode.ForRead) as BlockReference; listBr.Add(blkTempRef); } listBr.OrderByDescending(b => b.Position.Y).ToList().ForEach(blkTempRef => { DBText dbText = new DBText(); dbText.TextString = str + "_" + index++; dbText.TextStyleId = txtstyleId; var pointMin = blkTempRef.Bounds.Value.MinPoint; var pointMax = blkTempRef.Bounds.Value.MaxPoint; dbText.HorizontalMode = TextHorizontalMode.TextMid; dbText.AlignmentPoint = pointMin + Vector3d.YAxis * 2 + Vector3d.XAxis * Math.Abs(pointMax.X - pointMin.X) / 2; listDBText.Add(dbText); }); trans.Commit(); } listDBText.ToSpace(); } } }
View Code