2

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

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

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

4

2 回答 2

2

我经常使用 .NET 库来获取块引用,但是,我从未使用 COM 对象来获取块引用。下面的方法是我所拥有的,它接受块名称和位置,并返回块引用。我在此处对其进行了修改以接收 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);
            }
        }
    } 
于 2010-11-09T14:01:58.913 回答
1

您可能想调查 COM 对象的HandleObjectID属性,看看是否可以将它们与ObjectId.NET 对象的 或 .NET 对象的Handle属性相匹配ObjectId

于 2010-11-09T18:11:08.583 回答