我有一个用 VB.NET 编写的 AutoCAD 2008 插件。该插件主要使用 COM 接口来访问 ACAD 对象。
我目前正在从 COM 接口切换到托管接口,并且有以下问题:如何从给定的 COM ACAD 对象中获取匹配的托管 ACAD 对象。
示例:我有一个AcadBlockReference
对象,但我不想让该BlockReference
对象指向绘图中的同一对象。我如何得到这个对象或者它的ObjectID
?
我经常使用 .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);
}
}
}
您可能想调查 COM 对象的Handle
或ObjectID
属性,看看是否可以将它们与ObjectId
.NET 对象的 或 .NET 对象的Handle
属性相匹配ObjectId
。