Как получить дополнительный интерфейс

Автор q, 16.08.12, 08:44:44

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

q

Как правильно получить к дополнительный интерфейс на C#. Пробовал простым приведением:
                    IKompasDocument cdw = api7.Documents.Open(@"D:\test.cdw");
                    IKompasDocument2D doc2D = (IKompasDocument2D)cdw;
                    IKompasDocument2D1 doc2D1 = (IKompasDocument2D1)doc2D;
Выдает ошибку:
Невозможно привести COM-объект типа "System.__ComObject" к интерфейсному типу "KompasAPI7.IKompasDocument2D1". Операция завершилась со сбоем, поскольку вызов QueryInterface COM-компонента для интерфейса с IID "{FB57F1C4-44FE-4C73-9B15-87241E8735B5}" возвратил следующую ошибку: Интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)).

Может у кого есть пример рабочего кода с дополнительными интерфейсами (IKompasDocument2D1, IDrawingObject1, IKompasDocument1 и т.п.)?

16.08.12, 08:49:31 #1 Последнее редактирование: 16.08.12, 09:07:16 от Sabahs
Один из способов на Delphi:

var
KompasApi:IApplication;
K7Doc2D:IKompasDocument2D;
K7Doc2D1:IKompasDocument2D1;

K7Doc2D:=KompasAPI.ActiveDocument as IKompasDocument2D;
if K7Doc2D<>nil then K7Doc2D1:=K7Doc2D as IKompasDocument2D1;
Единственное нужно проверить, что активный документ является 2D документом или эскизом открытым на редактирование в 3D документе.

q

Цитата: Sabahs от 16.08.12, 08:49:31
Один из способов на Delphi:

var
KompasApi:IApplication;
K7Doc2D:IKompasDocument2D;
K7Doc2D1:IKompasDocument2D1;

K7Doc2D:=KompasAPI.ActiveDocument as IKompasDocument2D;
if K7Doc2D<>nil then K7Doc2D1:=K7Doc2D as IKompasDocument2D1;
Единственное нужно проверить, что активный документ является 2D документом или эскизом открытым на редактирование в 3D документе.

А указатель на объект K7Doc2D1 не равен nil?

16.08.12, 11:43:43 #3 Последнее редактирование: 16.08.12, 12:27:30 от Sabahs
Нет не равен, от него получаю следующие интерфейсы и не только тот, что приведен ниже.

if K7Doc2D1<>nil then SelectionManager:=K7Doc2D1.SelectionManager;

В этой библиотеке http://forum.ascon.ru/index.php/topic,20277.msg154381.html#msg154381 данный интерфейс используется очень интенсивно.

q

А на C# у кого-нибудь получалось получить доступ к этим интерфейсам?

Freddy

Уже была такая тема http://forum.ascon.ru/index.php/topic,19669.msg121819.html#msg121819

IKompasDocument doc = ...;
IKompasDocument2D doc2d = doc as IKompasDocument2D;
IKompasDocument2D1 doc2d1 = doc2d as IKompasDocument2D1;


ну а doc - это один из документов IApplication.Documents

но лучше проверки добавить, что тот документ, который сейчас обрабатываете является 2D

q

Цитата: Freddy от 27.08.12, 19:28:19
Уже была такая тема http://forum.ascon.ru/index.php/topic,19669.msg121819.html#msg121819

IKompasDocument doc = ...;
IKompasDocument2D doc2d = doc as IKompasDocument2D;
IKompasDocument2D1 doc2d1 = doc2d as IKompasDocument2D1;


ну а doc - это один из документов IApplication.Documents

но лучше проверки добавить, что тот документ, который сейчас обрабатываете является 2D
У меня этот код возвращает нулевой указатель doc2d1:
IKompasDocument doc = (IKompasDocument)api7.Documents.Open(@"D:\test.cdw");
IKompasDocument2D doc2d = doc as IKompasDocument2D; //doc2d не равен null
IKompasDocument2D1 doc2d1 = doc2d as IKompasDocument2D1; //doc2d1 равен null
if (doc2d1 == null) MessageBox.Show("Преобразование не работает");

А Вам удается получить доступ к методам doc2d1 при запуске программы?


q

Цитата: Sabahs от 27.08.12, 21:13:37
Работа интерфейса IKompasDocument2D1

Да я не спорю. На Delphi все отрабатывает нормально. Меня интересует в первую очередь C#.
В принципе я нашел обходной путь накидал dll-обертку на C++. И вызываю нужные мне методы из нее.
Просто хотел уточнить, может есть более простой рабочий способ достать эти интерфейсы на C#.

Freddy

Цитата: q от 27.08.12, 20:37:11
А Вам удается получить доступ к методам doc2d1 при запуске программы?

да, у меня работает на 12 компасе. Это один их новых интерфейсов - возможно на той версии компаса, на которой Вы пробуете, он не реализован.

Не очень понял, что Вы понимаете под запускам программы. Я работаю с ним внутри аддина - он верно преобразуется.

333

Возможно зарегистрирована более ранняя версия Компас где данного интерфейса не было
Попробуйте запустить kompas.exe -register