Как выполнить действие после инициализации документа

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

Как выполнить действие после инициализации документа

Сообщение VladimirK » 21 апр 2016 13:45

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

В справке по CAA есть пример "Customizing Product's Icons" (CAAProductStructure.edu, модули CAAPstProductIconInit.m, CAAPstProductIconImpl.m).
Там используется интерфейс CATInit, после открытия документа сборки отрабатывает метод класса.
Но это происходит только потому, что в сборку из примера внедрён объект CAAPstProductIconCont и происходит попытка получения интерфейса CATInit у объекта CAAPstProductIconCont. При открытии же обычных документов сборок этого не происходит.
На форуме есть топик viewtopic.php?f=140&t=3920.
Однако, я так и не разобрался, можно ли с помощью CATInit отследить момент инициализации обычного документа CATIA (CATProduct, CATPart, CATDrawing).
Если посмотреть файлы словарей CATIA *.dic (или через утилиту CAA V5 Object Browser), то видно, что объекты документов поддерживают интерфейс CATInit.
Ув. bit писал по поводу CATInit viewtopic.php?f=140&t=3920&p=23594&hilit=CATInit#p23894:
Если интерфейс уже определен на каком-то фичере, то переопределить его нельзя, по крайней мере легально. Попробуйте CATIUExitIO, должно помочь.

Я пробовал также использовать CATIUExitIO viewtopic.php?f=140&t=3857.
Однако это не подошло, т.к. отслеживаются события открытия/сохранения именно файлов, а не документов.
Например, при открытии файла, отрабатывает метод CATIUExitIO::OnOpen. Но в этот момент времени документ ещё не открылся в CATIA и не активировался Workbench. Т.е. получается, что OnOpen выполняется ДО открытия файла.
И не понятно как определить тот момент, когда загрузился именно открываемый документ, "инициализировался" и можно работать с его объектами.

В моём случае, нужно после открытия, инициализации документа CATProduct обработать входящие в него подсборки и детали.

Подскажите, пожалуйста, как это можно сделать.
VladimirK
Новичок
Новичок
 
Сообщения: 63
Зарегистрирован: 15 ноя 2011 21:44

Re: Как выполнить действие после инициализации документа

Сообщение Artem » 22 апр 2016 15:30

Если не найдешь "родные" средства -можно отступить в сторону - попробовать апийные settimer/killtimer (вполне вроде на плюсах доступные).
animae scrinium servitus
Аватара пользователя
Artem
Активный участник
Активный участник
 
Сообщения: 387
Зарегистрирован: 14 сен 2007 07:14

Re: Как выполнить действие после инициализации документа

Сообщение VladimirK » 23 апр 2016 15:56

Здравствуйте!
Артём, спасибо за SetTimer/KillTimer - тоже один из возможных вариантов.
Только хотелось бы использовать "родные" средства CAA RADE.
Я нашёл следующее решение:
Для обработки определённого документа (CATProduct, CATDrawing) использую возможности плагина (AddIn).
Т.е. работа с документом, например сборки, ведётся в модуле Assembly Design.
Поэтому создаю свой плагин для этого Workbench'а:
Код: Выделить всё
MyAssemblyDesignAddin.h:

class MyAssemblyDesignAddin : public CATBaseUnknown
{
   CATDeclareClass;
   public:

   MyAssemblyDesignAddin();
   virtual ~MyAssemblyDesignAddin();

   void CreateCommands();
   CATCmdContainer * CreateToolbars();
};

MyAssemblyDesignAddin.cpp:

#include <TIE_CATIAssyWorkBenchAddin.h>      // Assembly Design Workbench Addin
TIE_CATIAssyWorkBenchAddin(MyAssemblyDesignAddin);

MyAssemblyDesignAddin::MyAssemblyDesignAddin()
{
}

MyAssemblyDesignAddin::~MyAssemblyDesignAddin()
{
}

void MyAssemblyDesignAddin::CreateCommands()
{
   // Здесь создаём Command Header'ы команд (если нужно)
   // ...
   // Также здесь уже можно работать с документом сборки!
}

CATCmdContainer * MyAssemblyDesignAddin::CreateToolbars()
{
   // Здесь создаём панель инструментов pToolbar, меню и размещаем на них команды (если нужно)
   return pToolbar;
}

Опытным путём обнаружил, что метод CreateCommands() плагина вызывается каждый раз после активации Workbench'а документа. Даже если документ уже был открыт ранее и перейти в его Workbench из другого, то метод тоже выполнится.
Но главное, что в этот момент времени уже доступны данные документа, можно работать с входящими в него объектами! :YAHOO:
Например, если открыть сборку через File/Open, то метод CreateCommands() выполнится после открытия документа и активации Workbench'а. Из документации следует, что метод CreateCommands() как раз и служит для создания экземпляров классов заголовков команд. Думаю, логично, что после этого возможен вызов пользовательской команды, работающей с объектами документа.
Пока точно не могу сказать насколько это правильно с точки зрения архитектуры приложения.
Но на практике этот способ отлично работает! Проверено при работе с документами в Assembly Design, Part Design, Drafting.
VladimirK
Новичок
Новичок
 
Сообщения: 63
Зарегистрирован: 15 ноя 2011 21:44

Re: Как выполнить действие после инициализации документа

Сообщение Wireless_Fidelity » 23 апр 2016 19:22

Владимир, а что, если документ будет открыт не в отдельном окне, а загружен в составе изделия через контекстное меню Components-Add existing?

Кроме того, Product можно открывать в куче других воркбенчей, советую делать add-in для воркшопа (CATIPRDWorkshopAddin), он загружается в любом воркбенче для изделий.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: Как выполнить действие после инициализации документа

Сообщение VladimirK » 23 апр 2016 23:34

Здравствуйте!
Wireless_Fidelity, спасибо за совет, сделаю плагин для Workshop'а CATIPRDWorkshopAddin.
Тогда получится, что он будет загружаться во все модули для Product'а, например, Assembly Design, Piping Design.
Насчёт добавления в сборку другого документа через Components / Add existing я пока не думал.
Возможно, для этого придётся дополнительно отслеживать события у узлов дерева сборки - Product'ов или у связанных с ними узлов графа CATIGraphNode.
Спасибо Вам за помощь в очередной раз!
VladimirK
Новичок
Новичок
 
Сообщения: 63
Зарегистрирован: 15 ноя 2011 21:44


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

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

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

cron