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

时间:2010-11-08 14:49:22

标签: .net vb.net autocad

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

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

实施例: 我有一个AcadBlockReference对象,我不想让BlockReference对象指向图形中的同一个对象。 我如何获得此对象或可能是ObjectID

2 个答案:

答案 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对象的HandleObjectID属性,看看是否可以将它们与.NET对象的ObjectId或{{1}匹配起来那个Handle的属性。