Обработка Undo / Redo

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

Обработка Undo / Redo

Сообщение VladimirK » 22 авг 2016 11:57

Здравствуйте!
Разрабатываю с помощью CAA RADE команду, которая строит в модуле черчения примитивы.
Возникла необходимость обработки действий Undo/Redo для этой команды.
Если, например, построить примитивы с помощью созданной команды, потом удалить их и сделать Undo, то
CATIA восстанавливает эти удалённые ранее примитивы из своего "стека команд".
Мне нужно получить доступ к этим восстановленным примитивам чтобы перестроить их положение.

В документации CAA (User Interface / Wintop Commands) есть описание механизма Undo/Redo и пример (Managing Command Undo/Redo). Как я понял оттуда, существует:
1. Глобальное (Command) Undo/Redo - для отдельных команд, которые уже завершились;
2. Локальное (Input) Undo/Redo - для состояний команды, т.е. работающее в пределах команды, позволяющее отменить/повторить какой-то шаг команды.
Ещё в API нашёл интерфейс CATIOmbUndoRedoEvents, позволяющий подписаться на события Undo/Redo документа (GetUndoRedoNotification или GetBeforeUndoRedoNotification).

Скажите, пожалуйста, как правильно получить восстановленные командой Undo примитивы после удаления, чтобы потом перестроить их положение?
Может быть с помощью CATIOmbUndoRedoEvents можно из события получить какие объекты "участвуют" в Undo/Redo чтобы обработать их.
В примере же, как я понял, обработка глобального Undo/Redo выполняется в методах команды путём удаления или повторного создания примитива.
Спасибо.
VladimirK
Новичок
Новичок
 
Сообщения: 63
Зарегистрирован: 15 ноя 2011 21:44

Re: Обработка Undo / Redo

Сообщение VladimirK » 02 сен 2016 16:42

Здравствуйте!
Нашёл решение этой задачи.
С помощью интерфейса CATIOmbUndoRedoEvents подписался на события Undo/Redo документа CATDocument (CATIOmbUndoRedoEvents::GetUndoRedoNotification()).
Из обработчика получил уведомление CATSpecNotification и его методом GivePath() список объектов, которые модифицируются/удаляются/создаются в результате Undo/Redo.
Ну а дальше обработал нужные мне объекты в соответствии с алгоритмом.
Код: Выделить всё
// Сначала получили CATDocument *pDoc
// Далее добавляем Callback:
CATIOmbUndoRedoEvents_var spUndoRedoOnDoc = pDoc;
if (spUndoRedoOnDoc != NULL_var)
{
   CATCallback cb = pDoc->AddCallback(pDoc, spUndoRedoOnDoc->GetUndoRedoNotification(),
         (CATSubscriberMethod) &UndoRedoClass::OnUndoRedoEvents, NULL);
}

// Обработчик событий:
void UndoRedoClass::OnUndoRedoEvents(CATCallbackEvent iEvent, void* iFrom, CATNotification* iNotif, CATSubscriberData iData, CATCallback iCallback)
{
   if (iNotif->IsAKindOf(CATSpecNotification::ClassName()))
   {
      CATSpecNotification *pSpecNotif = (CATSpecNotification*) iNotif;
      if (pSpecNotif != NULL)
      {
         CATListValCATBaseUnknown_var *pList = pSpecNotif->GivePath();
         if (pList != NULL && pList->Size() > 0)
         {
            // Здесь обрабатываем объекты из списка
         }
      }
   }
}

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


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

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

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