2014-02-13 135 views
0

我正在嘗試重新排序AutoCAD塊中的屬性。每次我編輯一個現有的塊或嘗試創建一個新的塊時,顯示屬性的順序都會完全混洗。重新排序AutoCAD屬性

我已經嘗試過像'BATTMAN''ATTSYNC''BATTORDER'這樣的AUTOCAD命令,但問題是我有一堆每個都有96 -150個引腳的塊(每個引腳都有一個屬性引用)。所以使用上面提到的所有命令以升序排列所有屬性是非常痛苦的。

有關如何使用AUTOLISP/LISP/c#程序解決此問題的任何想法?! 有沒有辦法使用標籤名稱重新排序呢?!

例如,我需要按照升序從Pin1-Pin90重新排序塊屬性。

+0

這絕對是可行的C#和AutoLISP。你試過什麼了? –

+0

我嘗試過使用AutoLISP,但無法正確使用它。我對這兩種編碼語言都很陌生。 – Uday

回答

1

下面是一些代碼,TRAE Moore和我拍了拍了昨天下午在討論這個概念:

[CommandMethod("BlockAttributeSort")] 
public void BlockAttributeSort() 
{ 
    var acDb = HostApplicationServices.WorkingDatabase; 
    var acEd = AcApplication.DocumentManager.MdiActiveDocument.Editor; 

    try 
    { 
     using (var acTrans = acDb.TransactionManager.StartTransaction()) 
     { 
      var acBlockTable = (BlockTable)acTrans.GetObject(acDb.BlockTableId, OpenMode.ForRead); 
      foreach (ObjectId objId in acBlockTable) 
      { 
       var blockDef = objId.GetObject(OpenMode.ForRead) as BlockTableRecord; 
       if (!blockDef.HasAttributeDefinitions) 
        continue; 

       blockDef.UpgradeOpen(); 
       var attCollection = new List<AttributeDefinition>(); 
       foreach (var attId in blockDef) 
       { 
        var attDef = acTrans.GetObject(attId, OpenMode.ForWrite) as AttributeDefinition; 
        if (attDef == null) 
         continue; 

        attCollection.Add((AttributeDefinition)attDef.Clone()); 
        attDef.Erase(); 
       } 

       foreach (var att in attCollection.OrderBy(a => a.Tag)) 
       { 
        blockDef.AppendEntity(att); 
        acTrans.AddNewlyCreatedDBObject(att, true); 
       } 
      } 

      acTrans.Commit(); 
     } 
    } 
    catch (System.Exception ex) 
    { 
     Debug.WriteLine(ex.ToString()); 
     acEd.WriteMessage(ex.ToString()); 
    } 
} 

的問題是不夠好,我要的概念代碼發佈,但通常你會發現如果您使用現有的代碼顯示您所付出的努力,您會得到更好的接待。所使用的排序僅基於屬性標記,因此如果需要額外的調整,您可能必須提供更具體的內容。