天天看點

CAD關于塊表操作(com接口c#語言)

1. 得到所有圖塊

(1)下面代碼,周遊塊表的每條記錄,然後得到塊名,C#如下:

MxDrawDatabase databae = (MxDrawDatabase)axMxDrawX1.GetDatabase();
MxDrawBlockTable blkTab = databae.GetBlockTable();
MxDrawBlockTableIterator iter = blkTab.NewIterator();
for (; !iter.Done(); iter.Step())
{
    MxDrawBlockTableRecord blkRec = iter.GetRecord();
    MessageBox.Show(blkRec.Name);
 
}      

(2)判斷目前資料庫中,是有指定的塊名

MxDrawDatabase data = (MxDrawDatabase)axMxDrawX1.GetDatabase();
if (data.GetBlockTable().Has("BlkName"))
{
    // 已經插入.
}      

(3)周遊某名稱圖塊下所有實體

MxDrawDatabase database = (MxDrawDatabase)axMxDrawX1.GetDatabase();
      MxDrawBlockTableRecord blkRec = database.GetBlockTable().GetAt(sBlkName);
      MxDrawBlockTableRecordIterator iter = blkRec.NewIterator();
      if (iter == null)
          return;
      int iNum = 0;
      // 循環得到所有實體
      for (; !iter.Done(); iter.Step(true, false))
      {
          // 得到周遊器目前的實體
          MxDrawEntity ent = iter.GetEntity();
          MessageBox.Show(ent.ObjectName);
 
          iNum++;
      }
      MessageBox.Show(iNum.ToString());      

2.得到目前空間中所有實體

下面代碼示範如何得到目前塊表記錄,然後周遊塊表記錄,取到每個對象,判斷對象類型,然後得到對象的屬性資料。

private void GetAllEntity()
{
  
        MxDrawApplication app = new MxDrawApplication();
        MxDrawUtility mxUtility = new MxDrawUtility();
 
        // 得到目前圖紙空間
        MxDrawBlockTableRecord blkRec = app.WorkingDatabase().CurrentSpace();
 
        // 建立一個用于周遊目前圖紙空間的周遊器
        MxDrawBlockTableRecordIterator iter = blkRec.NewIterator();
        if (iter == null)
            return;
 
        // 所有實體的id數組。
        List<Int32> aryId = new List<Int32>();
 
        int iLineNum = 0;
        // 循環得到所有實體
 
        for (; !iter.Done(); iter.Step(true, false))
        {
            // 得到周遊器目前的實體
            MxDrawEntity ent = iter.GetEntity();
            if (ent == null)
                continue;
 
            // 得到實體的id
            aryId.Add(ent.ObjectID);
 
            if (ent is MxDrawLine)
            {
                // 目前實體是一個直線
                MxDrawLine line = (MxDrawLine)ent;
                iLineNum++;
            }
            else if (ent is MxDrawBlockReference)
            {
                // 目前實體是一個塊引用
                MxDrawBlockReference blkRef = (MxDrawBlockReference)ent;
                for (int j = 0; j < blkRef.AttributeCount; j++)
                {
                    // 得到塊引用中所有的屬性
                    MxDrawAttribute attrib = blkRef.AttributeItem(j);
                    mxUtility.Prompt("n Tag: " + attrib.Tag + "Text:" + attrib.TextString);
                }
 
            }
            // else if (ent is 其它類型)
            //{
            //  ... ....
            //}
        }
 
        String sT;
        sT = "發現" + aryId.Count + "個實體,其中有" + iLineNum + "個直線";
        MessageBox.Show(sT);
    
}      

3. 添加塊表記錄

(1)下面代碼,判斷塊表中是否有指定名稱的塊表記錄,如果沒有就增一個塊表記錄。

// sName 是新增加的塊名。
// blkOriginPoint 是圖塊的插入基點。
public bool AddBlockRrecord(String sName, MxDrawPoint blkOriginPoint)
{
    // 取目前資料庫.
    MxDrawDatabase curDatabase = (MxDrawDatabase)(axMxDrawX1.GetDatabase());
    // 得到塊表
    MxDrawBlockTable blkTable = curDatabase.GetBlockTable();
     
    // 判斷塊表是否已經有該名稱的塊名。
    if (blkTable.Has(sName))
    {
        MxDrawBlockTableRecord blkRec = blkTable.GetAt(sName, true);
        // 如果塊被删除,就反删除。
        blkRec.SetProp("unErase", null);
        return true;
    }
    // 新增一個塊表記錄.
    MxDrawBlockTableRecord blkNewRec = blkTable.Add(sName);
    if (blkNewRec == null)
        return false;
    // 設定塊表記錄的插入基點
    blkNewRec.Origin = blkOriginPoint;
    return true;
}      
MxDrawPoint pt = new MxDrawPoint();
 pt.x = 100;
 pt.y = 100;
 AddBlockRrecord("MyBlkName", pt);