Множественный выбор

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

Множественный выбор

Сообщение void » 20 май 2016 04:26

Коллеги, прошу помощи!

Функция, которая выбирает сначала геометрию(линию) на чертеже, а потом две точки.


Код: Выделить всё
void CAADrwDimDressupCmd::BuildGraph()

   _pObjectAgent1 = new CATIndicationAgent("GetFirstPoint");
   _pObjectAgent1->SetBehavior(CATDlgEngWithUndo); 


    _pObjectAgent = new CATPathElementAgent("_pObjectAgent A");
   _pObjectAgent ->SetBehavior( CATDlgEngWithPrevaluation |
                               CATDlgEngMultiAcquisition |
                               CATDlgEngWithCSO);


   _pObjectAgent ->AddElementType("IDMCircle2D");
   _pObjectAgent ->AddElementType("IDMLine2D");
   _pObjectAgent ->AddElementType("IDMCurve2D");
   _pObjectAgent ->AddElementType("IDMEllipse2D");
   _pObjectAgent ->AddElementType("IDMPoint2D");
   _pObjectAgent ->AddElementType("IDMPolyline2D");


   CATDialogState* pState1 = GetInitialState("Select any 2D geometry");
   pState1->AddDialogAgent(_pObjectAgent);

  CATDialogState *stGetPt1 = AddDialogState("Select First Point");
  stGetPt1->AddDialogAgent( _pObjectAgent1);

  CATDialogState *stGetPt2 = AddDialogState("Select Second Point");
  stGetPt2->AddDialogAgent( _pObjectAgent1);


     AddCSOClient(_pObjectAgent);
   

   AddTransition(pState1, stGetPt1, IsOutputSetCondition(_pObjectAgent),
                 Action((ActionMethod)&CAADrwDimDressupCmd::GetProduct, NULL, NULL));


   AddTransition(stGetPt1, stGetPt2, IsOutputSetCondition(_pObjectAgent1),
                 Action((ActionMethod)&CAADrwDimDressupCmd::GetPoint_1, NULL, NULL));


   AddTransition(stGetPt2, NULL, IsOutputSetCondition(_pObjectAgent1),
                 Action((ActionMethod)&CAADrwDimDressupCmd::GetPoint_2, NULL, NULL));


}



Как бы сделать так, чтобы геометрия выбиралась несколько раз, пока не будет выбрана точка?
Надо бы добавить что-то на подобии такого...
Но Катия падает.

Код: Выделить всё

   AddTransition(pState1, pState1, IsOutputSetCondition(_pObjectAgent),
                 Action((ActionMethod)&CAADrwDimDressupCmd::GetCheck1, NULL, NULL));

   AddTransition(pState1, pState1, IsLastModifiedAgentCondition(_pObjectAgent),
                 Action((ActionMethod)&CAADrwDimDressupCmd::GetCheck, NULL, NULL));



Традиционная благодарность за любой намек!
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

Re: Множественный выбор

Сообщение Wireless_Fidelity » 20 май 2016 20:09

Намек 1. Для агента можно настроить как фильтр по типам, так и добавить произвольную функцию фильтрации. Это позволит ограничить вфбор пользователя только точкой.
2. Агент запускать в отдельном state'e. Если по окончании работы агента (и переходе в следующий state) что-то не нравится, вызываем у агента Reset и принудительно возвращаемся в предыдущее состояние (SetState у команды, вроде), где агент снова начинает работу.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: Множественный выбор

Сообщение void » 21 май 2016 02:59

Коллега,

вот зацикливаю агента

Код: Выделить всё
   AddTransition(pState1, pState1, IsLastModifiedAgentCondition(_pObjectAgent),
   Action((ActionMethod)&CAADrwDimDressupCmd::GetCheck, NULL, NULL));

     AddTransition(pState1, stGetPt1, IsOutputSetCondition(_pObjectAgent),
     Action((ActionMethod)&CAADrwDimDressupCmd::GetProduct, NULL, NULL));


в функции зацикливание
Код: Выделить всё
boolean CAADrwDimDressupCmd::GetCheck(void *)
{
      _pObjectAgent -> InitializeAcquisition();
      return TRUE;
}


Действительно, идет множественный выбор 2d геометрии.
Но не понятен механизм выхода из него:
- зацикливание
- агент ждет выбора 2d геометрии

Выбора точки он не ждет. Как ему дать понять, что выбор точки - переходим в другое состояние?
Чтобы это
AddTransition(pState1, stGetPt1,..
начало работать?

Для выбора точки там другой агент _pObjectAgent1. Вроде первоначально так логичней было...



Насчет фильтра. Он кроме фильтрации по типу на что-нибудь влияет? Вроде этот агент CATIndicationAgent _pObjectAgent1 ждет только произвольную точку... А условий для ее координат пока никаких не задано. Может и без него можно?
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

Re: Множественный выбор

Сообщение Wireless_Fidelity » 21 май 2016 22:20

Сделайте два состояния:
- pSelectionState, в котором работает агент, и по выбору элемента происходит переход во второе состояние
- pValidationState, в котором проверяется выбранная геометрия и, при необходимости, агент выбора повторно инициализируется, а команда переходит в pSelectionState
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: Множественный выбор

Сообщение void » 23 май 2016 02:40

Уф, коллега, вроде получилось. Если pValidationState сразу двух агентов добавить (для линии и для точки). Посмотрим.
В любом случае, большое спасибо!
Но боюсь, что придется еще одну тему заводить...
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03

Re: Множественный выбор

Сообщение Wireless_Fidelity » 23 май 2016 09:09

Функция, которая выбирает сначала геометрию(линию) на чертеже, а потом две точки


Вообще, поскольку набор входных элементов заранее определён, проще (и куда нагляднее) сделать три состояния для выбора:
- pLineSelection
- pFirstPointSelection
- pSecondPointSelection
для каждого из которых завести агента.
Аватара пользователя
Wireless_Fidelity
Активный участник
Активный участник
 
Сообщения: 394
Зарегистрирован: 10 апр 2010 00:11

Re: Множественный выбор

Сообщение void » 24 май 2016 02:04

Насколько удалось понять\разобраться, достаточно двух агентов, т.к. два вида выбираемой геометрии. Один для линий, другой для точек. И трех состояний (ждем выбор линии, ждем выбор или линии, или точки, ждем выбор точки). Одно событие (напримр, pValidationState) должно одновременно ждать отклика двух агентов. Который сработал, в то состояние и переходим. Если агент линии, переходим\остаемся в том же состоянии. Если агент точки, переходим в состояние ожидающее точку...
Имхо, как-то так. Пока работает... А там не знаю.
void
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 24 май 2012 14:03


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

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

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

cron