2014-02-13 92 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()); 
    } 
} 

的问题是不够好,我要的概念代码发布,但通常你会发现如果您使用现有的代码显示您所付出的努力,您会得到更好的接待。所使用的排序仅基于属性标记,因此如果需要额外的调整,您可能必须提供更具体的内容。