我有一个用 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/