Как получить .NET-объект из заданного COM-объекта в AutoCAD - PullRequest
2 голосов
/ 08 ноября 2010

У меня есть плагин для AutoCAD 2008, написанный на VB.NET.Этот плагин использует в основном интерфейс COM для доступа к объектам ACAD.

В настоящее время я переключаюсь с интерфейса COM на управляемый интерфейс и у меня возникает следующий вопрос: как получить соответствующий управляемый объект ACAD из данного COMACAD объект.

Пример: у меня есть объект AcadBlockReference, и я не хочу иметь объект BlockReference, который указывает на тот же объект на чертеже.Как мне получить этот объект или, может быть, его ObjectID?

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

Я часто использую библиотеку .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;
            }
        }
    }

EDIT У вас есть идентификатор объекта для этих предметов? Если это так, вы можете сделать что-то вроде этого:

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 голос
/ 09 ноября 2010

Возможно, вы захотите изучить свойства Handle или ObjectID объекта COM и посмотреть, сможете ли вы сопоставить их с ObjectId объекта .NET или свойством Handle этого ObjectId,

...