首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要获取从AutoCAD Civil3D中的类创建的对象计数

需要获取从AutoCAD Civil3D中的类创建的对象计数
EN

Stack Overflow用户
提问于 2020-03-10 00:51:32
回答 1查看 83关注 0票数 0

它是针对AutoCAD开发工具包的,为AutoCAD开发了一个插件。我已经将一些DWG文件加载到图形中,并创建了加载的类的一些对象。创建这些对象时,我添加了一个扩展数据,其中包含有关BlockTableRecord的一些信息。现在,我需要删除已从图形中删除的对象的BlockTableRecords。保存文档时,我收到来自AutoCAD的回调。在此回调中,我尝试遍历所有块表记录,以查找包含我们的信息的记录。以及包含使用我的外接程序创建的信息的记录,我正在尝试查看从该记录项创建的对象的数量。如果不存在,我将删除块表记录,或者至少更新我们的封装外形。

在这里,我无法获得从一个特定的表记录创建的对象的计数。以下是我到目前为止所做的工作。

代码语言:javascript
复制
private static void CommandExecutionCallBack(object sender, CommandEventArgs e)
{
    string commando = e.GlobalCommandName.ToLower();
    if (commando.Contains("save"))
    {
        Document doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument;
        var documentManager = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager;
        Editor ed = doc.Editor;
        Database db = doc.Database;
        Autodesk.AutoCAD.DatabaseServices.TransactionManager tm = db.TransactionManager;
        using (Transaction myT = tm.StartTransaction())
        {
            BlockTable bt = (BlockTable)tm.GetObject(db.BlockTableId, OpenMode.ForRead, false);
            SymbolTableEnumerator enumerator = bt.GetEnumerator();
            while (enumerator.MoveNext())
            {
                BlockTableRecord btr = tm.GetObject(enumerator.Current, OpenMode.ForRead, false) as BlockTableRecord;
                ResultBuffer xdata = btr.GetXDataForApplication(REGAPP_NAME);
                if (null != xdata)
                {

                    //Here I am trying to fetch the objects that exist against the selected btr.
                    AcadApplication acApp = Autodesk.AutoCAD.ApplicationServices.Application.AcadApplication as AcadApplication;
                    AcadDocument thisDrawing = acApp.ActiveDocument;


                    thisDrawing.SendCommand("(command MAPSELECTCLASSIFIED " + btr.Name + ")" + Environment.NewLine);
                    AcadSelectionSet selectionSet = thisDrawing.PickfirstSelectionSet;

                    //I am always getting selectionSet.Count as zero.
                    MessageBox.Show(btr.Name + " -> SelectionSet Count: " + selectionSet.Count.ToString());
                }
                else
                {
                    //Will ignore this condition. The current btr is not created by our add-in
                }
            }
        }
    }
}

在这方面的任何帮助都将不胜感激。

我从AutoCAD论坛https://forums.autodesk.com/t5/net/how-to-find-and-export-object-classess-from-drawing/m-p/5814774#M45948得到了一些帮助。

问候你,乌马尔

EN

回答 1

Stack Overflow用户

发布于 2020-03-17 02:29:53

删除未引用的BlockTableRecord (或任何其他SymbolTableRecord)通常称为: Purge。数据库类提供了一个Purge()方法,可用于获取"purgeable“对象。

代码语言:javascript
复制
    private static ObjectIdCollection GetPurgeableBlocks(Database db)
    {
        var ids = new ObjectIdCollection();
        using (var tr = new OpenCloseTransaction())
        {
            var bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
            foreach (ObjectId id in bt)
            {
                var btr = (BlockTableRecord)tr.GetObject(id, OpenMode.ForRead);
                if (btr.GetXDataForApplication(REGAPP_NAME) != null)
                {
                    ids.Add(id);
                }
            }
            tr.Commit();
        }
        db.Purge(ids);
        return ids;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60605073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档