我正在尝试重新排序AutoCAD块中的属性。每当我编辑现有的块或尝试创建一个新块时,显示属性的顺序就会被完全洗牌。
我尝试过'BATTMAN''ATTSYNC''BATTORDER'之类的AUTOCAD命令,但问题是我有一堆块,每块都有96-150个引脚(每个引脚都有一个属性引用)。因此,使用上述所有命令以升序排列所有属性真的很痛苦。
有关如何使用AUTOLISP / LISP / c#程序解决此问题的任何想法? 有没有办法使用标签名称重新排序?!
例如,我需要按升序从Pin1-Pin90重新排序块属性。
答案 0 :(得分: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());
}
}
这个问题对我来说已经足够好了,希望发布概念代码,但是如果你使用现有的代码来显示你付出的努力,那么通常你会发现你会获得更好的接收效果。使用的排序仅基于属性标记,因此如果需要进行额外的调整,您可能需要提出更具体的内容。
答案 1 :(得分:0)
您可以通过交换句柄来更改块中属性的顺序。请注意,这可能会产生副作用,因为外部应用程序可以将句柄用作唯一ID。克隆块并创建新属性也是如此。
此外,如果您ATTSYNC一个块,您将丢失附加到任何插入的任何xdata。