【问题标题】:Re-order AutoCAD Attributes重新排序 AutoCAD 属性
【发布时间】:2014-02-13 17:56:38
【问题描述】:

我正在尝试重新排序 AutoCAD 块中的属性。每次我编辑现有块或尝试创建新块时,属性显示的顺序都会完全打乱。

我已经尝试过诸如“BATTMAN”“ATTSYNC”“BATTORDER”之类的 AUTOCAD 命令,但问题是我有一堆块,每个块中有 96 个 -150 个引脚(每个引脚都有一个属性参考)。所以使用上面提到的所有命令来按升序排列所有属性真的很痛苦。

关于如何使用 AUTOLISP/LISP/c# 程序解决此问题的任何想法?! 有没有办法使用标签名称重新排序它们?!

例如,我需要将块属性从 Pin1-Pin90 以升序重新排序。

【问题讨论】:

  • 这在 C# 和 AutoLISP 中绝对是可能的。到目前为止,您尝试过什么?
  • 我尝试过使用 AutoLISP 但无法正确使用。而且我对这两种编码语言都很陌生。

标签: c# autocad autolisp


【解决方案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());
    }
}

这个问题足以让我想要发布概念代码,但通常你会发现,如果你带着现有的代码来到 Stack,你会得到更好的接收,显示你付出的努力。排序used 仅基于属性标签,因此如果需要额外的调整,您可能需要提出更具体的内容。

【讨论】:

    【解决方案2】:

    您可以通过交换句柄来更改块中属性的顺序。请注意,这可能会产生副作用,因为句柄可能会被外部应用程序用作唯一 ID。克隆块和创建新属性也是如此。

    此外,如果您 ATTSYNC 一个块,您将丢失任何附加到任何插入的 xdata。

    查看这篇文章了解更多详情:http://through-the-interface.typepad.com/through_the_interface/2010/07/swapping-autocad-block-attribute-order-using-net.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 2019-12-10
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多