我有一个用VB.NET编写的AutoCAD 2008插件。该插件主要使用COM接口来访问ACAD对象。
我目前正在从COM界面切换到托管界面,并提出以下问题: 如何从给定的COM ACAD对象中获取匹配的托管ACAD对象。
实施例:
我有一个AcadBlockReference
对象,我不想让BlockReference
对象指向图形中的同一个对象。
我如何获得此对象或可能是ObjectID
?
答案 0 :(得分: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);
}
}
}
答案 1 :(得分:1)
您可能需要调查COM对象的Handle
或ObjectID
属性,看看是否可以将它们与.NET对象的ObjectId
或{{1}匹配起来那个Handle
的属性。