.net - 如何从 AutoCAD 中给定的 COM 对象获取 .NET 对象

标签 .net vb.net autocad

我有一个用 VB.NET 编写的 AutoCAD 2008 插件。该插件主要使用 COM 接口(interface)来访问 ACAD 对象。

我目前正在从 COM 接口(interface)切换到托管接口(interface),并有以下问题: 如何从给定的 COM ACAD 对象获取匹配的托管 ACAD 对象。

示例: 我有一个 AcadBlockReference 对象,但我不想让 BlockReference 对象指向绘图中的同一对象。 我如何获取这个对象或者它的ObjectID

最佳答案

我经常使用 .NET 库来获取 block 引用,但是,我从未使用 COM 对象来获取 block 引用。以下方法是我所拥有的一种方法,它将接受 block 名称和位置,并返回 block 引用。我在这里对其进行了修改,以接受 AcadBlockReference,并使用它的 Name 属性在 BlockTable 中查找它。我没有测试这个,因为我没有时间,但我只是想把它扔在这里,希望它能帮助你前进。

抱歉,我的示例是用 C# 编写的,但用 VB.NET 重写应该很容易。

public BlockReference GetBlockReferenceFromCOM(AcadBlockReference comReference, Point3d location)
    {
        using (Database database = Application.DocumentManager.MdiActiveDocument.Database)
        {
            using (Transaction transaction = database.TransactionManager.StartTransaction())
            {
                BlockTable blockTable = transaction.GetObject(database.BlockTableId, OpenMode.ForRead) as BlockTable;
                BlockTableRecord acBlkTblRecNewDoc = (BlockTableRecord)transaction.GetObject(blockTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);

                BlockReference newBlockReference = new BlockReference(location, blockTable[comReference.Name]);

                transaction.Commit();

                return newBlockReference;
            }
        }
    }

编辑 您有这些元素的对象 ID 吗?如果是这样,你可以这样做:

public DBObject GetBlockReferenceFromCOM(ObjectId id)
    {
        using (Database database = Application.DocumentManager.MdiActiveDocument.Database)
        {
            using (Transaction transaction = database.TransactionManager.StartTransaction())
            {
                return transaction.GetObject(id, OpenMode.ForRead);
            }
        }
    } 

关于.net - 如何从 AutoCAD 中给定的 COM 对象获取 .NET 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4124896/

相关文章:

c# - 在 C# 中读取 .DXF/.DWG 文件

excel - Autocad 2017 提取 Xdata excel lisp

.net - Propertygrid UIEditor 通过键盘禁用值编辑

c# - 将本地化资源 .DLL 嵌入到 C# 中的可执行文件中?

c# - Lookupedit 按值选择,devexpress

c# - 使用 web.config 的角色管理提供程序?

.net - 为什么将0xFFFFFFFF分配给UInteger在VB.NET中产生错误?

vb.net - 如果已经在运行,则阻止应用程序启动

c# - 如何快速将非常大的文件呈现(不打开)到 UI 组件(TextBox)中

c# - 根据用户选择显示 block 信息的代码