Форум пользователей ПО АСКОН

Профессиональные вопросы => Программирование приложений => C# => Тема начата: q от 16.08.12, 08:44:44

Название: Как получить дополнительный интерфейс
Отправлено: q от 16.08.12, 08:44:44
Как правильно получить к дополнительный интерфейс на 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 и т.п.)?
Название: Re: Как получить дополнительный интерфейс
Отправлено: 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 документе.
Название: Re: Как получить дополнительный интерфейс
Отправлено: q от 16.08.12, 10:50:51
Цитата: 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?
Название: Re: Как получить дополнительный интерфейс
Отправлено: Sabahs от 16.08.12, 11:43:43
Нет не равен, от него получаю следующие интерфейсы и не только тот, что приведен ниже.

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

В этой библиотеке http://forum.ascon.ru/index.php/topic,20277.msg154381.html#msg154381 данный интерфейс используется очень интенсивно.
Название: Re: Как получить дополнительный интерфейс
Отправлено: q от 27.08.12, 01:40:52
А на C# у кого-нибудь получалось получить доступ к этим интерфейсам?
Название: Re: Как получить дополнительный интерфейс
Отправлено: 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
Название: Re: Как получить дополнительный интерфейс
Отправлено: q от 27.08.12, 20:37:11
Цитата: 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 при запуске программы?
Название: Re: Как получить дополнительный интерфейс
Отправлено: Sabahs от 27.08.12, 21:13:37
Работа интерфейса IKompasDocument2D1 (http://narod.ru/disk/60060669001.7a2db218914c2c89199a0d0cdeace8a7/Select%26IKompasDocument2D1.exe.html)
Название: Re: Как получить дополнительный интерфейс
Отправлено: q от 27.08.12, 21:36:42
Цитата: Sabahs от 27.08.12, 21:13:37
Работа интерфейса IKompasDocument2D1 (http://narod.ru/disk/60060669001.7a2db218914c2c89199a0d0cdeace8a7/Select%26IKompasDocument2D1.exe.html)

Да я не спорю. На Delphi все отрабатывает нормально. Меня интересует в первую очередь C#.
В принципе я нашел обходной путь накидал dll-обертку на C++. И вызываю нужные мне методы из нее.
Просто хотел уточнить, может есть более простой рабочий способ достать эти интерфейсы на C#.
Название: Re: Как получить дополнительный интерфейс
Отправлено: Freddy от 30.08.12, 23:32:33
Цитата: q от 27.08.12, 20:37:11
А Вам удается получить доступ к методам doc2d1 при запуске программы?

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

Не очень понял, что Вы понимаете под запускам программы. Я работаю с ним внутри аддина - он верно преобразуется.
Название: Re: Как получить дополнительный интерфейс
Отправлено: 333 от 03.09.12, 17:33:47
Возможно зарегистрирована более ранняя версия Компас где данного интерфейса не было
Попробуйте запустить kompas.exe -register