Создание фичера для Drafting

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

Создание фичера для Drafting

Сообщение VladimirK » 09 авг 2013 00:34

Здравствуйте!
Пишу на CAA RADE фичер CAADrwText для чертежа. Он реализует примитив для обозначения номера позиции в соответствии с ГОСТ (изображение во вложении).
Основные задачи - это сделать единый примитив, не распадающийся на составляющие при его перемещении по чертежу и вызов своего диалогового окна при клике мышью по фичеру.

Написал компоненты:
Add-In для Drafting; модуль генерации файла каталога фичера (*.CATfct);
класс, реализующий весь цикл команды (состояния, переходы между состояниями, обработчики);
класс диалогового окна;
класс, реализующий CATExtIEdit для запуска команды редактирования;
интерфейсы фичера, фабрики, классы с их реализацией;
класс, реализующий интерфейс CATIBuild.

StartUp фичера унаследовал от супертипа DrwText из каталога DraftCatalog.
У StartUp создал два атрибута:
MainText: tk_specobject, sp_IN (ведущий текст с полкой-выноской, CATISpecObject),
SlaveText: tk_list(tk_specobject), sp_NEUTRAL (ведомый текст - список объектов CATISpecObject).

При реализации класса фабрики каталог и фичер помещаю в контейнер вида, вид получаю так:
Код: Выделить всё
CATIView_var drwView;
// ... получение вида drwView
CATISpecObject_var spView = drwView;
CATIContainer_var cont = spView->GetFeatContainer();

Создаются инстансы CAADrwText, задаются значения атрибутов без ошибок (CATISpecObject, полученные с CATIDrwText).
Объекты CAADrwText сохраняются в чертеже, при проверке они находятся в контейнере (cont = spView->GetFeatContainer()), считываются значения атрибутов.

Пробовал также помещать каталог и фичер в контейнер DressUp'а:
Код: Выделить всё
CATIDrwDressUp_var dr = drwView->GetDressUp();
CATISpecObject_var spDr = dr;
CATIContainer_var cont = spDr->GetFeatContainer();


На данный момент проблема состоит в следующем:
хотя экземпляры фичера успешно создаются, но визуально на чертеже остаются отдельные составляющие (объекты текста CATIDrwText).
При клике мышью по-прежнему вызывается стандартное диалоговое окно правки текста, а не созданное мной.

Подскажите пожалуйста, как сделать чтобы при манипуляциях мышью "подсвечивались" все объекты, составляющие фичер (в StatusBar'е тоже видно, что выделяется не "CAADrwText", а составляющий его стандартный текст). Почему не отрабатывает метод CATExtIEdit::Activate для запуска команды редактирования?
Может быть нужно создавать StartUp не напрямую c атрибутами tk_specobject (ссылками на объекты CATIDrwText), а на основе вложенных StartUp (и с атрибутами tk_list, tk_component), как в примере "CAAPstIntegrateNewFeatures Use Case"?
И нужно ли дополнительно реализовывать визуализацию фичера, т.е. создавать класс унаследованный от CATExtIVisu и реализовать метод CATRep *BuildRep()?

Буду рад любой помощи, спасибо.
Вложения
Image1.png
Image1.png (6.14 КБ) Просмотров: 6807
VladimirK
Новичок
Новичок
 
Сообщения: 63
Зарегистрирован: 15 ноя 2011 21:44

Re: Создание фичера для Drafting

Сообщение bit » 09 авг 2013 04:59

У Вас 3 фичера. 2 стандартных текста и Ваш собственный.
То, что стандартные тексты, хранятся в аттрибутах вашего фичера, не отменяет того факта , что это по прежнему полноценные фичеры, с полным набором интерфейсов.
Насколько я понимаю, Вам придется реализовывать все интерфейсы (Edit, Visu и т.д.)для вашего фичера "с нуля". Не думаю, что получится использовать напрямую что-то из существующих текстов.
Как вариант строить собственный CATRep на основании КОПИЙ CATRep-ов составляющих его стандартных текстов. Сами тексты при этом спрятять. Остальные интерфейсы в любом случае реализовыаать самостоятельно.

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

Re: Создание фичера для Drafting

Сообщение VladimirK » 10 авг 2013 20:57

Здравствуйте!

bit, спасибо Вам за ответ.
Получается, что в данном случае вообще не нужно наследовать фичер от супертипа DrwText.
Можно создать фичер и в качестве его атрибутов не задавать ссылки на существующие тексты (tk_specobject),
а описать Модель фичера простыми типами (tk_string для значений текста, tk_double для координат точек линий).
Потом при создании экземпляров фичера эти атрибуты будут записываться и считываться.

Тогда Вид фичера на чертеже будет определяться только благодаря реализации интерфейса CATI2DGeoVisu, в классе наследованном от CATExtIVisu.

Я написал класс, унаследованный от CATExtIVisu. В методе CATRep *BuildRep() реализовал визуализацию линий фичера с помощью объектов CAT2DLineRep. Фичер стал отображаться на чертеже, но при предварительном просмотре и на печати его нет.
Также создал класс, унаследованный от CATExtIVisProperties для возможности установки графических свойств линий, составляющих визуализацию фичера. После этого в окне свойств фичера появилась стандартная вкладка "Graphic", где можно выбрать тип, толщину, цвет линии. Но изменение этих свойств не приводит к визуальным изменениям фичера.

Как сделать чтобы фичер не просто отображался на чертеже, но и выводился на печать?
Если он не будет реализован на чертеже на основе каких-то базовых фичеров (текст, набор 2D-линий и т.п.), то как он будет отображаться на чертеже при выводе на печать. Может быть для этого нужно реализовать ещё какие-нибудь интерфейсы?

Спасибо за помощь.
VladimirK
Новичок
Новичок
 
Сообщения: 63
Зарегистрирован: 15 ноя 2011 21:44

Re: Создание фичера для Drafting

Сообщение bit » 13 авг 2013 20:27

Не знаю, что посоветовать.
Есть интерфейсы CATIPrintable и CATIPrintableDrafting. Но в чертеже они определены только у листа (Sheet).
У меня нет хороших идей, как сделать так, чтобы фичер выводился на печать стандартной командой.
Теоретически можно написать свою Print команду (CATPrintDialog + CATIPrintable обертку вокру Sheet), и заменить ею стандартную, но это не самая тривиальная задача.

Кстати, у собственных фичеров есть один недостаток: будут проблемы при передаче чертежей тому, у кого нет вашего приложения (каталог фичеров + Dll с имплементацией интерфейсов)
bit
Участник
Участник
 
Сообщения: 166
Images: 3
Зарегистрирован: 24 июл 2008 11:45
Откуда: Минск

Re: Создание фичера для Drafting

Сообщение VladimirK » 15 авг 2013 09:58

Здравствуйте.
Спасибо, по приведённому Вами интерфейсу CATIPrintable в энциклопедии нашёл пример.
В разделе 3D Visualization / Print есть статья и пример использования "Making Your Components Printable".
Как я понял оттуда, можно вывести на печать компонент, если построить на его основе изображение.
(на основе CAT2DBagRep можно построить изображение CATPrint2DRepImage).
Для этого нужно создать класс, унаследованный от класса CATPrintImage.
В этом классе реализовать метод Decode(), где с помощью методов класса CATPrintGenerator отрисовать геометрию из примитивов.
Затем в классе компонента реализовать интерфейс CATIPrintable и в его методе CreatePrintableImage() вернуть указатель на созданный экземпляр класса *CATPrintImage.
Но вот как потом сделать, чтобы это автоматически печаталось при выводе на печать чертежа (а не явно вызывалась команда печати как в примере), пока не знаю.

Вы правы насчёт фичера, если его реализовывать "с нуля", не на основе существующих аннотаций, то он даже не отображается на чертеже без каталога и dll. Подробно по этому вопросу нашёл в разделе документации Features / Transferring Documents Containing Client-Defined Features.

Поэтому хотел бы пойти по другому пути - не создавать фичер с нуля, а просто изменить существующий "Текст с полкой-выноской", дорисовать полки для номеров позиций.
Подобную реализацию нашёл в Вашем проекте "Символы сварки, разреза-сечения и генерация спецификации", viewtopic.php?f=213&t=1808 .
В модуле "Менеджер символов ЕСКД", тип символа Сварка "монтажный шов ЕСКД" дорисовывается к стандартному фичеру DrwWelding.
Эта дорисованная геометрия не доступна для выделения, но двигается вслед за символом сварки, выводится на печать.
После исследования файла словаря EPMEskdWeldingFW.dico видно, что это реализовано без создания нового фичера.
Предполагаю, что дополнительные линии это, возможно, CATI2DLine/CAT2DLineRep/CAT2DLineGP, которые двигаются за символом сварки благодаря реализации наблюдателя Оbserver.
Наверное в нём осуществляется "подписка" на изменение состояния символа сварки DrwWelding через CATInterfaceEvents.
Но как запускается Оbserver при повторном открытии чертежа, без явного запуска команды, не знаю.
Пока пытаюсь сделать что-то похожее, реализовать Observer, возможно получится запускать его при каком-то событии CATIA (через CATInit, CATIUExitIO).
С помощью какого интерфейса его можно запустить при обращении/инициализации к чертежу или тексту на чертеже?
Спасибо Вам за помощь.
VladimirK
Новичок
Новичок
 
Сообщения: 63
Зарегистрирован: 15 ноя 2011 21:44

Re: Создание фичера для Drafting

Сообщение bit » 15 авг 2013 18:46

У меня нет хороших идей как добавить свои фичеры в стандартный CATPrintImage для листа.

Я действительно поступил по другому. Используя несколько стандартных фичеров (как правило text и arrow) которые ведуть себя как один.
Observer следит за всеми возможными событиями : создание, удаление, изменение.

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


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

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

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