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