我正在尝试对 AutoCAD 块中的属性重新排序。每次我编辑现有块或尝试创建新块时,属性的显示顺序都会完全打乱。
我尝试过像“BATTMAN”“ATTSYNC”“BATTORDER”这样的AUTOCAD命令,但问题是我有一堆块,每个块都有96 -150个引脚(每个引脚都有一个属性引用)。因此,使用上述所有命令按升序排列所有属性确实很痛苦。
关于如何使用 AUTOLISP/LISP/c# 程序解决此问题有什么想法吗?! 有没有办法使用标签名称重新排序?
例如,我需要将块属性从 Pin1-Pin90 按升序重新排序。
这是我和 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());
}
}
这个问题足够好,让我想要发布概念代码,但通常你会发现,如果你带着显示你投入的努力的现有代码来到 Stack,你会得到更好的接受。使用的排序是仅基于属性标签,因此如果需要额外的调整,您可能必须想出更具体的东西。
您可以通过交换属性的句柄来更改块中属性的顺序。请注意,这可能会产生副作用,因为句柄可能会被外部应用程序用作唯一 ID。克隆块并创建新属性也是如此。
此外,如果您 ATTSYNC 一个块,您将丢失附加到任何插入的任何 xdata。
有关更多详细信息,请参阅此帖子:http://through-the-interface.typepad.com/through_the_interface/2010/07/swapping-autocad-block-attribute-order-using-net.html
对于纯 AutoLISP 解决方案,请参阅 https://nateholt.wordpress.com/2009/09/26/nates-simple-autolisp-lesson-006/