Toolbar с помощью CAA C++. Как?

Программирование для CATIA.

Toolbar с помощью CAA C++. Как?

Сообщение rash » 02 авг 2012 13:07

Здравствуйте, народ!

Возникла проблемка с реализацией тулбара и отображением кнопки команды на нем.
Хочу разобраться с механизмом тулбаров и с использование TIE.
В общем... есть у меня:
MyFw - мой Framework
MyModCmd - модуль в котором реализуется простая команда типа "Создать линию" по 2-м точкам в модуле драфтинга. Кстати, класс в модуле создается визардом "CATIA Resource->Command" и наследуется от CATStateCommand как мне и нужно. Так же, стоит галочка для включения доп.файлов класса в мой воркшоп (MyModAdd)
  • CATMyCmd - класс команды
MyModAdd - модуль в котором реализуется сам тулбар, прицепляется команда и реализуются методы TIE.
  • CATMyApp - класс тулбара

Далее работаю только с классом CATMyApp:

1. В классе CATMyApp вставляю макрос для определения Command Header - MacDeclareHeader(CATMyCmdHeader)
В сгенерированном файле ресурсов CATMyCmdHeader.CATNlsопределяются строковые константы, например есть такая строка - CATMyCmdCmdHeader.MyMyAAA.Title="MyMyAAA title";
2. Далее в качестве TIE для драфтинга использую - #include "TIE_CATIDRWFRAMEAddin.h"
TIE_CATIDRWFRAMEAddin(CATMyAdd);

3. Редактирую параметры макроса CATImplementClass(CATMyAdd, DataExtension, CATBaseUnknown, CATMyAdd);
При этом в словаре MyFw.dico есть строка - CATMyAdd CATIDRWFRAMEAddin libMyModAdd

Делал все по примерам и по документации.

Так вот, дальше возникают вопросы:

1. Как выбирать подходящий TIE для реализации addin-ов в разные фреймворки? В энциклопедии есть где-нибудь их опиание, какой TIE для чего используется?

И второй вопрос побольше
2. В документации написано: Macro CATImplementClass (Class,Typeofclass,Basemeta,Impmeta) - где
Impmeta
The class for which Class is an extension.
Legal values:: it makes sense for extension classes only. Set it to the implementation class name for the three extension types, and to CATNull for an implementation

И из примера:
The name of the latetype, the fourth argument of the CATImplementClass macro, mustn't be the same as an existing C++ class name or an existing latetype name.

Для какого класса в данном случае класс CATMyApp является расширением? Для CATMyCmd?
И четвертый параметр не должен быть таким же, как существующий класс С++. Противоречие???

3. Заметил еще по примерам, что первый параметр в строке словаря MyFw.dico совпадает с последним параметром макроса CATImplementClass. Но по документации первый параметр в строке словаря - это имя класса компонента (т.е. CATMyCmd в моем случае). В таком случае он не может не совпадать с последним аргументом макроса. Опять противоречие, что последний аргумент макроса не должен иметь имя существующего класса :wacko3:

Как же все должно быть связано? :whiteflag:
rash
Новичок
Новичок
 
Сообщения: 17
Зарегистрирован: 23 июл 2012 05:53

Re: Toolbar с помощью CAA C++. Как?

Сообщение booSter » 07 авг 2012 13:48

День Добрый

Для начала немного теории :)
В дебри не полезу, но всё же

Суть TIE-класса (от английского слова обозначающего "дружбу не разлей вода") с одной стороны предоставить реализацию интерфейса через наследование классу интерфейса, с другой стороны передать вызов соответствующему методу в компоненте. В случае реализации нескольких интерфейсов в одном компоненте используется несколько TIE-ев (по одному на интерфейс).
Таким образом можно обойтись без множественного без множественного наследования С++ (которое, согласно документации на CAA-RADE, использовать запрещено).
Хидер-файлы для TIE-ев находятся в папках <CAA_Dir>/<Framework_Dir>/PublicGenerated/<OS_Dir> в файлах TIE_VvvIXxxYyyZzz и содержат определение макроса TIE_VvvIXxxYyyZzz параметром которого будет имя класса-компонента (пость будет MyComponentClass). В ходе компиляции макрос развернётся в определение и реализацию класса TIE_VvvIXxxYyyZzzMyComponentClass (собственно TIE).

Макрос CATImplementClass разворачивается в реализацию нескольких стандартных методов из класса CATBaseUnknown, а так же в объявление статического экземпляра класса CATFillDictionary, который в ходе инициализации зарегистрирует компонент в объектном движке CATIA для правильной работы IUnknown::QueryInterface , ну и ещё нескольких вещей...
Последний же параметр (который макросом трактуется как строковый литерал) определяет ту сущность, экстеншин к которой мы создаём. Это может быть либо имя класса (как правило имплементации), либо имя типа CATIA-объекта (известного так-же как "фичер"/feature), либо имя так называемого "late type" как и в вашем случае. Сам "late type" используется как уникальная метка во внутреннем репозитории типов CATIA. Правил для его формирования нет. Я просто добавляю суффикс LT к имени класса компонента (во избежании путаницы).

Теперь ответы на вопросы:
  1. Все интерфейсы-аддыны наследуют к интерфейсу CATIWorkbenchAddin. Поиск по хидерам содержащим данный литерал и даст (с некоторым избытком) список всех возможных аддынов
  2. См выше... :)
  3. Таки да, это так
Сделаешь доброе дело за деньги - скажут спасибо,
Сделаешь бесплатно - сядут на шею...
©пёрто
Аватара пользователя
booSter
Moderator
 
Сообщения: 227
Images: 15
Зарегистрирован: 09 фев 2008 16:48
Откуда: Minsk

Re: Toolbar с помощью CAA C++. Как?

Сообщение rash » 09 авг 2012 05:59

booSter, огромное спасибо! Все более-менее встало на свои места...тулбар заработал :good2:
rash
Новичок
Новичок
 
Сообщения: 17
Зарегистрирован: 23 июл 2012 05:53

Re: Toolbar с помощью CAA C++. Как?

Сообщение rash » 10 авг 2012 13:02

Ещё вопрос (не отходя от кассы :-) ) касательно Addin-ов.

Addin, как я понимаю, работает в контексте некоторого воркбенча и обеспечивает вызов комманд, которые могут модифицировать содержание текущего (активного) документа, открытого в воркбенче (например CATDrawing). По пирмерам в энциклопедии мы сами создаем документ и получаем ссылки на все его внутренности (CATIDftDrawing, CATIDftSheet, CATIDftView), через которые спококйно можем получить фабрики для рисования (линий, кружков и т.п.).
Как в таком случае получить ссылки на текущий контекст(Drawing, sheet, view или вообще на текущий Doc) из Addin-а (точнее из команды), чтобы пользовать фабрики 2D-объектов?
rash
Новичок
Новичок
 
Сообщения: 17
Зарегистрирован: 23 июл 2012 05:53

Re: Toolbar с помощью CAA C++. Как?

Сообщение bit » 13 авг 2012 11:48

CATDocument* pDoc = NULL;

CATFrmEditor* pFrmEditor = CATFrmEditor::GetCurrentEditor();
if ( NULL != pFrmEditor )
{
pDoc = pFrmEditor->GetDocument();
}
bit
Участник
Участник
 
Сообщения: 166
Images: 3
Зарегистрирован: 24 июл 2008 11:45
Откуда: Минск

Re: Toolbar с помощью CAA C++. Как?

Сообщение rash » 13 авг 2012 12:49

А где об этом почитать поподробнее?
rash
Новичок
Новичок
 
Сообщения: 17
Зарегистрирован: 23 июл 2012 05:53

Re: Toolbar с помощью CAA C++. Как?

Сообщение bit » 13 авг 2012 14:24

Ответ банальный, в CAA Encyclopedia.
<CAAInstallPath>\CAADoc\Doc\online\CAACenV5Default.htm
+ примеры
<CAAInstallPath>\CAADoc\*.edu
У Дасо, наверно, есть учебники, но подозреваю, что для этого надо купить у них обучение
bit
Участник
Участник
 
Сообщения: 166
Images: 3
Зарегистрирован: 24 июл 2008 11:45
Откуда: Минск

Re: Toolbar с помощью CAA C++. Как?

Сообщение bit » 13 авг 2012 14:31

rash писал(а):Ещё вопрос (не отходя от кассы :-) ) касательно Addin-ов.

Addin, как я понимаю, работает в контексте некоторого воркбенча и обеспечивает вызов комманд, которые могут модифицировать содержание текущего (активного) документа, открытого в воркбенче (например CATDrawing).


Кстати не только активного, любого документа.
bit
Участник
Участник
 
Сообщения: 166
Images: 3
Зарегистрирован: 24 июл 2008 11:45
Откуда: Минск


Вернуться в CAA-RADE

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

cron